#!/usr/bin/python2
# -*- coding: utf-8 -*-
#Wrapper script to manage USERNAME accounts + web security
# myth_USERNAME_all -c add -u USERNAME
# myth_USERNAME_all -c delete -u USERNAME
# myth_USERNAME_all -c pass  -u USERNAME -p pass
# myth_USERNAME_all -c web  -u USERNAME -p pass

import pexpect, sys, time
import os, re, getopt
import mv_common




def chroot_check():
    if  not INIT_CHECK :
        return False
    cmd = '''ps -p 1 -o comm='''
    init = mv_common.runcmd_output(cmd).strip()
    if init == "runit":
        return False
    else:
        return True


def store_commands(full_call):
    file_name = "/root/myth_user_call.out"
    try:
        f = open(file_name,'a')
    except:
        print "%s could not be opened" % file_name
        sys.exit(1)
    f.write(full_call)
    f.write("\n")
    f.close()
    try:
        os.chmod(600,file_name)
    except:
        pass


def add_user(username,full_call):
    if chroot_check() :
        print "calling myth_call_user in chroot to add user"
        store_commands(full_call)
    else:
        print "Adding user %s" %username
        cmd = '''useradd -m -s /bin/bash %s -G audio,video,optical,storage,users''' %username
        mv_common.runcmd(cmd)
        cmd = ''' usermod -a -G mythtv %s ''' %username


def del_user(username,full_call):
    if chroot_check() :
        print "calling myth_call_user in chroot to del user"
        store_commands(full_call)
    else:
        print "Removing  user %s" %username
        cmd = '''userdel  %s ''' %username
        mv_common.runcmd(cmd)


def pass_change(username,password,full_call) :
    if chroot_check() :
        print "calling myth_call_user in chroot to change password"
        store_commands(full_call)
    else:
        print "changing password for %s" %username
        passwd = pexpect.spawn("/usr/bin/passwd %s" % username)

        for repeat in (1, 2):
                passwd.expect("password: ")
                passwd.sendline(password)
                time.sleep(0.1)

def web_security(username,password) :
    file_name = "/etc/lighttpd/lighttpd.user"
    file_contents = ''
    if  os.path.exists(file_name):
        try:
            f = open(file_name,'r')
            file_contents = f.readlines()
        except:
            print " couldn't read %s" % file_name
    try:
        f = open(file_name,'w')
    except:
        print "%s could not be opened for writing" % file_name
        return

    for line in file_contents:
        if not re.search(username, line):
            f.write(line)
    line = "%s:%s" %(username, password)
    f.write(line)
    f.write("\n")
    f.close()


def usage ():
    print "Valid options are:"
    print "  -c (add|delete|pass|web)"
    print "  -u  USERNAME"
    print "  -p  password"
    sys.exit(0)

def main(argv):
    global INIT_CHECK
    full_call = ""
    INIT_CHECK = True
    try:
        opts,  args = getopt.getopt(argv,  'c:u:p:ih' )
    except getopt.GetoptError, why:
        print why
        usage()
        print "exception happened"
        sys.exit(2)

    for opt,  arg in opts:
        if opt in ("-h",  "--help"):
            usage()
            sys.exit(0)
        elif opt in ("-c") :
            module = arg
            full_call += ''' -c %s ''' %re.escape(arg)
        elif opt in ("-u") :
            username = arg
            full_call += ''' -u %s ''' %re.escape(arg)
        elif opt in ("-p") :
            password = arg
            full_call += ''' -p %s ''' %re.escape(arg)
        elif opt in ("-i") :
            INIT_CHECK = False
            full_call += ''' -i '''
    try:
        username
    except:
        usage()

    if module == "add":
        add_user(username,full_call)
    elif module == "delete":
        del_user(username,full_call)
    elif module == "pass":
        try:
            password
        except:
            print "needs a password"
            usage()
        pass_change(username,password,full_call)
    elif module == "web":
        web_security(username,password)
    else:
        usage()

if __name__ == "__main__":
   main(sys.argv[1:])