#!/usr/bin/python -tt
#
# addvirt
# --------
# This script adds a virtual domain to a QVCS system.
#
# Copyright (c) 2001-2002 by Konstantin Riabitsev <icon@duke.edu>
# Licensed under the GNU GPL. For full terms see http://www.gnu.org/
#
# $Id: addvirt,v 1.4 2003/06/24 16:35:16 graf25 Exp $
#
# @author Konstantin Riabitsev <icon@duke.edu> ($Author: graf25 $)
# @version $Date: 2003/06/24 16:35:16 $
#

import sys
import os
import re
import pwd
import getpass
import qvcs

DGID = "dom"
DHOME = "/home/dom"
SKEL = "/etc/qvcs-skel"

def _usage():
    print 'Usage: addvirt domainname'
    print '    Adds a virtual domain to the system.'
    sys.exit(1)

def _mkuname(domain):
    if re.compile('^\d').search(domain):
        domain = '_%s' % domain
    uname = domain.replace('.', '_')
    return uname
    
def _main(args):
    if len(args) < 1:
        print "Missing domain name"
        _usage()
    if len(args) > 1:
        print "Too many arguments"
        _usage()
    domain = args[0]
    try:
        if domain.index('-') == 0: _usage()
    except ValueError: pass

    if qvcs.domain_exists(domain):
        print 'ERROR: domain %s already exists.' % domain
        sys.exit(1)
        
    uname = _mkuname(domain)
    print "Creating domain %s" % domain
    try:
        while not uname or pwd.getpwnam(uname):
            print 'Username %s already exists.' % uname
            uname = raw_input('Please provide another: ')
    except KeyError: pass
    print "Will use '%s' for domain user" % uname
    while 1:
        passwd = getpass.getpass('Please provide domain password: ')
        confirm = getpass.getpass('One more time: ')
        if passwd != confirm:
            print 'No match. Try again.'
        else: break
    ##
    # The good stuff.
    #
    cmd = '/usr/bin/openssl passwd -1 -stdin'
    (fin, fout) = os.popen2(cmd)
    fin.write(passwd)
    fin.close()
    encpass = fout.read()
    fout.close()
    encpass = encpass.strip()
    print 'Creating new domain user "%s"' % uname
    comment = 'Domain user for %s' % domain
    home = os.path.join(DHOME, domain)
    shell = '/sbin/nologin'
    cmd = ("/usr/sbin/useradd -g %s -d %s -s %s -c '%s' -m -k %s -p '%s' %s"
           % (DGID, home, shell, comment, SKEL, encpass, uname))
    ret = os.system(cmd)
    if ret:
        print "ERROR: User creation failed. Please check the error message"
        print "and try again."
        sys.exit(1)
    qvcs.add_domain(domain, uname)
    print "Domain created successfully. You will need to restart qmail."
    sys.exit(0)

if __name__ == '__main__':
    ##
    # Check for root
    #
    _main(sys.argv[1:])
    if os.geteuid() == 0: _main(sys.argv[1:])
    else:
        print 'Please run me as root.'
        sys.exit(1)
