vmm
changeset 0 bb0aa2102206
child 1 d08cda9d7c1a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vmm	Sun Jan 06 18:22:10 2008 +0000
@@ -0,0 +1,304 @@
+#!/usr/bin/env python
+# -*- coding: UTF-8 -*-
+# Copyright 2007-2008 VEB IT
+# See COPYING for distribution information.
+# $Id$
+
+"""This is the vmm main script."""
+
+__author__ = 'Pascal Volk <p.volk@veb-it.de>'
+__version__ = 'rev '+'$Rev$'.split()[1]
+__date__ = '$Date$'.split()[1]
+
+import os
+import sys
+from getpass import getpass
+
+#sys.path.insert(0, '/usr/local/lib/VirtualMailManager')
+
+from VirtualMailManager.VirtualMailManager import VirtualMailManager
+from VirtualMailManager.Config import VMMConfig
+import VirtualMailManager.Exceptions as VMME
+import VirtualMailManager.constants.EXIT as EXIT
+
+def usage(excode=0, errMsg=None):
+    sys.stderr.write("""\
+Usage: vmm OPTION OBJECT ARGS*
+  short long
+  option                object           args (* = optional)
+
+  da    domainadd       domain.tld       transport*
+  di    domaininfo      domain.tld       detailed*
+  dt    domaintransport domain.tld       transport
+  dd    domaindelete    domain.tld       delalias*|deluser*|delall*
+  ua    useradd         user@domain.tld  password*
+  ui    userinfo        user@domain.tld  du*
+  un    username        user@domain.tld  'Users Name'
+  up    userpassword    user@domain.tld  password*
+  u0    userdisable     user@domain.tld
+  u1    userenable      user@domain.tld
+  ud    userdelete      user@domain.tld
+  aa    aliasadd        alias@domain.tld user@domain.tld
+  ai    aliasinfo       alias@domain.tld
+  ad    aliasdelete     alias@domain.tld
+  cf    configure                        section*
+  h     help
+  v     version
+
+""")
+    if not errMsg is None:
+        sys.stderr.write('Error: %s\n' % errMsg)
+    sys.exit(excode)
+
+def getVMM():
+    try:
+        vmm = VirtualMailManager()
+        return vmm
+    except VMME.MANotRootException, e:
+        sys.stderr.write(str(e))
+        sys.exit(EXIT.CONF_NOPERM)
+    except IOError, e:
+        sys.stderr.write(str(e))
+        sys.exit(EXIT.CONF_NOFILE)
+    except VMME.MAPermException, e:
+        sys.stderr.write(str(e))
+        sys.exit(EXIT.CONF_WRONGPERM)
+
+def configure():
+    try:
+        if len(sys.argv) < 3:
+            vmm.configure()
+        else:
+            vmm.configure(sys.argv[2])
+    except (EOFError, KeyboardInterrupt):
+        sys.stderr.write('\nOuch!\n')
+        sys.exit(EXIT.USER_INTERRUPT)
+    except VMME.VMMConfigException, e:
+        sys.stderr.write(str(e))
+        sys.exit(EXIT.CONF_ERROR)
+    sys.exit(0)
+
+def _readpass():
+    clear0 = ''
+    clear1 = '1'
+    while clear0 != clear1:
+        while len(clear0) < 1:
+            clear0 = getpass(prompt='Enter new password: ')
+            if len(clear0) < 1:
+                sys.stderr.write('Sorry, empty passwords are not permitted\n')
+        clear1 = getpass(prompt='Retype new password: ')
+        if clear0 != clear1:
+            clear0 = ''
+            sys.stderr.write('Sorry, passwords do not match\n')
+    return clear0
+
+def _printInfo(info, title):
+    msg = title+' information'
+    print '%s\n%s' % (msg, '-'*len(msg))
+    for k,v in info.items():
+        print '\t%s: %s' % (k.title().ljust(15, '.'), v)
+    print
+
+def _printUsers(users, title):
+    msg = 'Available '+title
+    print '%s\n%s' % (msg, '-'*len(msg))
+    if len(users) > 0:
+        for user in users:
+            print '\t%s' % user
+    else:
+        print '\tNone'
+    print
+
+def _printAliases(alias, targets):
+    msg = 'Alias information'
+    print '%s\n%s' % (msg, '-'*len(msg))
+    print '\tMail for %s goes to:' % alias
+    if len(targets) > 0:
+        for target in targets:
+            print '\t     -> %s' % target
+    else:
+        print '\tNone'
+    print
+
+def domain_add():
+    global argc
+    if argc < 3:
+        usage(EXIT.MISSING_ARGS, 'Missing domain name.')
+    elif argc < 4:
+        vmm.domain_add(sys.argv[2].lower())
+    else:
+        vmm.domain_add(sys.argv[2].lower(), sys.argv[3])
+
+def domain_delete():
+    global argc
+    if argc < 3:
+        usage(EXIT.MISSING_ARGS, 'Missing domain name.')
+    elif argc < 4:
+        vmm.domain_delete(sys.argv[2].lower())
+    else:
+        vmm.domain_delete(sys.argv[2].lower(), sys.argv[3])
+
+def domain_info():
+    global argc
+    if argc < 3:
+        usage(EXIT.MISSING_ARGS, 'Missing domain name.')
+    elif argc < 4:
+        _printInfo(vmm.domain_info(sys.argv[2].lower()), 'Domain')
+    else:
+        infos = vmm.domain_info(sys.argv[2].lower(), sys.argv[3])
+        _printInfo(infos[0], 'Domain')
+        _printUsers(infos[1], 'accounts')
+        _printUsers(infos[2], 'aliases')
+
+def domain_transport():
+    global argc
+    if argc < 3:
+        usage(EXIT.MISSING_ARGS, 'Missing domain name and new transport.')
+    if argc < 4:
+        usage(EXIT.MISSING_ARGS, 'Missing new transport.')
+    else:
+        vmm.domain_transport(sys.argv[2].lower(), sys.argv[3])
+
+def user_add():
+    global argc
+    if argc < 3:
+        usage(EXIT.MISSING_ARGS, 'Missing email address.')
+    elif argc < 4:
+        password = _readpass()
+    else:
+        password = sys.argv[3]
+    vmm.user_add(sys.argv[2].lower(), password)
+
+def user_delete():
+    global argc
+    if argc < 3:
+        usage(EXIT.MISSING_ARGS, 'Missing email address.')
+    else:
+        vmm.user_delete(sys.argv[2].lower())
+
+def user_info():
+    global argc
+    if argc < 3:
+        usage(EXIT.MISSING_ARGS, 'Missing email address.')
+    elif argc < 4:
+        _printInfo(vmm.user_info(sys.argv[2].lower()), 'Account')
+    else:
+        _printInfo(vmm.user_info(sys.argv[2].lower(), True), 'Account')
+
+def user_name():
+    global argc
+    if argc < 4:
+        usage(EXIT.MISSING_ARGS, 'Missing email address an users name.')
+    else:
+        vmm.user_name(sys.argv[2].lower(), sys.argv[3])
+
+def user_enable():
+    global argc
+    if argc < 3:
+        usage(EXIT.MISSING_ARGS, 'Missing email address.')
+    else:
+        vmm.user_enable(sys.argv[2].lower())
+
+def user_disable():
+    global argc
+    if argc < 3:
+        usage(EXIT.MISSING_ARGS, 'Missing email address.')
+    else:
+        vmm.user_disable(sys.argv[2].lower())
+
+def user_password():
+    global argc
+    if argc < 3:
+        usage(EXIT.MISSING_ARGS, 'Missing email address.')
+    elif argc < 4:
+        password = _readpass()
+    else:
+        password = sys.argv[3]
+    vmm.user_password(sys.argv[2].lower(), password)
+
+def alias_add():
+    global argc
+    if argc < 4:
+        usage(EXIT.MISSING_ARGS, 'Missing alias address and destination.')
+    else:
+        vmm.alias_add(sys.argv[2].lower(), sys.argv[3])
+
+def alias_info():
+    global argc
+    if argc < 3:
+        usage(EXIT.MISSING_ARGS, 'Missing alias address')
+    else:
+        _printAliases(sys.argv[2], vmm.alias_info(sys.argv[2].lower()))
+
+def alias_delete():
+    global argc
+    if argc < 3:
+        usage(EXIT.MISSING_ARGS, 'Missing alias address')
+    else:
+        vmm.alias_delete(sys.argv[2].lower())
+
+def showWarnings():
+    if vmm.hasWarnings():
+        print '\nWarnings:'
+        for w in vmm.getWarnings():
+            print " * ",w
+
+#def main():
+if __name__ == '__main__':
+    argc = len(sys.argv)
+    if argc < 2:
+        usage(EXIT.MISSING_ARGS) # -> exit
+    vmm = getVMM()
+    try:
+        if sys.argv[1] in ['cf',  'configure'] or not vmm.setupIsDone():
+            configure()
+    except VMME.VMMConfigException, e:
+        sys.stderr.write(str(e))
+        sys.exit(EXIT.CONF_ERROR)
+    except VMME.VMMException, e:
+        sys.stderr.write("\aERROR: %s\n" % e[0][0])
+        sys.exit(e[0][1])
+    try:
+        if sys.argv[1] in ['da', 'domainadd']:
+            domain_add()
+        elif sys.argv[1] in ['di', 'domaininfo']:
+            domain_info()
+        elif sys.argv[1] in ['dt', 'domaintransport']:
+            domain_transport()
+        elif sys.argv[1] in ['dd', 'domaindelete']:
+            domain_delete()
+        elif sys.argv[1] in ['ua', 'useradd']:
+            user_add()
+        elif sys.argv[1] in ['ui', 'userinfo']:
+            user_info()
+        elif sys.argv[1] in ['un', 'username']:
+            user_name()
+        elif sys.argv[1] in ['up', 'userpassword']:
+            user_password()
+        elif sys.argv[1] in ['u0', 'userdisable']:
+            user_disable()
+        elif sys.argv[1] in ['u1', 'userenable']:
+            user_enable()
+        elif sys.argv[1] in ['ud', 'userdelete']:
+            user_delete()
+        elif sys.argv[1] in ['aa', 'aliasadd']:
+            alias_add()
+        elif sys.argv[1] in ['ai', 'aliasinfo']:
+            alias_info()
+        elif sys.argv[1] in ['ad', 'aliasdelete']:
+            alias_delete()
+        elif sys.argv[1] in ['h', 'help']:
+            usage()
+        elif sys.argv[1] in ['v', 'version']:
+            print "%s: %s (Date: %s)\n" % (os.path.basename(sys.argv[0]),
+                    __version__, __date__)
+        else:
+            sys.stderr.write('Unknown option: "%s"\n' % sys.argv[1])
+            usage(EXIT.UNKNOWN_OPTION)
+        showWarnings()
+    except (EOFError, KeyboardInterrupt):
+        sys.stderr.write('\nOuch!\n')
+        sys.exit(EXIT.USER_INTERRUPT)
+    except VMME.VMMException, e:
+        sys.stderr.write("\aERROR: %s\n" % e[0][0])
+        sys.exit(e[0][1])