#!/usr/bin/env python

#       Licensed to the Apache Software Foundation (ASF) under one
#       or more contributor license agreements.  See the NOTICE file
#       distributed with this work for additional information
#       regarding copyright ownership.  The ASF licenses this file
#       to you under the Apache License, Version 2.0 (the
#       "License"); you may not use this file except in compliance
#       with the License.  You may obtain a copy of the License at
#
#         http://www.apache.org/licenses/LICENSE-2.0
#
#       Unless required by applicable law or agreed to in writing,
#       software distributed under the License is distributed on an
#       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
#       KIND, either express or implied.  See the License for the
#       specific language governing permissions and limitations
#       under the License.

import os
import sys
import pwd
import grp

def main():
    command = sys.argv[1]
    uname = sys.argv[2]
    eval(command)(uname, *sys.argv[3:])

def init(uname):
    home = os.path.join('/home', uname)
    ssh = os.path.join(home, '.ssh')
    os.mkdir(home)
    os.mkdir(ssh)
    u = pwd.getpwnam(uname)
    g = grp.getgrnam('scm')
    os.chmod(home, 0700)
    os.chmod(ssh, 0700)
    os.chown(home, u.pw_uid, g.gr_gid)
    os.chown(ssh, u.pw_uid, g.gr_gid)

def upload(uname, pubkey):
    keyfile = os.path.join('/home', uname, '.ssh', 'authorized_keys')
    u = pwd.getpwnam(uname)
    g = grp.getgrnam('scm')
    with open(keyfile, 'w') as fp:
        fp.write(pubkey)
    os.chown(keyfile, u.pw_uid, g.gr_gid)
    os.chmod(keyfile, 0600)

if __name__ == '__main__':
    main()
