#!/usr/bin/python

import sys
from optparse import OptionParser

import Tartarus
from Tartarus.iface import SysDB, core

from Tartarus.client import initialize
comm, argv = initialize()

def main():
    name, opts = parse_cmdline()
    um = uM()
    gm = gM()
    u = um.getByName(name)
    if opts.fullname: u.fullName = opts.fullname
    if opts.shell: u.shell = opts.shell
    if opts.group:
        group = gm.getByName(opts.group)
        u.gid = group.gid
    um.modify(u)
    if opts.groups:
        gids_to_del = gm.getGroupsForUserId(u.uid)
        gids_to_add = [gm.getByName(g).gid for g in opts.groups.split(',')]
        gids_to_del.remove(u.gid)
        if len(gids_to_del): gm.delUserFromGroups(u.uid, gids_to_del)
        gm.addUserToGroups(u.uid, gids_to_add)
    if opts.add_to:
        gids = [gm.getByName(g).gid for g in opts.add_to.split(',')]
        gm.addUserToGroups(u.uid, gids)
    if opts.del_from:
        gids = [gm.getByName(g).gid for g in opts.del_from.split(',')]
        gm.delUserFromGroups(u.uid, gids)

def parse_cmdline():
    optp = OptionParser()
    opt = optp.add_option
    #opt('-c', dest='fullname', help='The new user\'s full name.')
    opt('-c', '-f', '--fullname',  help='The new user\'s full name.')
    opt('-g', '--group', help='Initial group name')
    opt('-G', '--groups', help='A list of supplementary group')
    opt('-s', '--shell', help='A name of user\'s login shell')
    opt('-a', '--add-to', help='Add user to group')
    opt('-d', '--del-from', help='Remove user from group')
    optp.set_defaults()
    opts, argv = optp.parse_args(sys.argv)
    if len(argv) != 2: raise RuntimeError('You should specify user name')
    return argv[1], opts

def uM():
    prx = comm.propertyToProxy('Tartarus.SysDB.UserManagerPrx')
    return SysDB.UserManagerPrx.checkedCast(prx)

def gM():
    prx = comm.propertyToProxy('Tartarus.SysDB.GroupManagerPrx')
    return SysDB.GroupManagerPrx.checkedCast(prx)

try:
    main()
#except core.DBError, e:
#    print '%s: %s' % (e.reason, e.response)
except core.Error, e:
    print e.reason
except SystemExit:
    pass
except:
    _, e, _ = sys.exc_info()
    print e

