vmm
changeset 48 0d5f58f8b8f5
parent 47 191d5a5adc4a
child 49 9bd033177377
--- a/vmm	Mon Aug 18 01:56:31 2008 +0000
+++ b/vmm	Tue Aug 19 02:40:43 2008 +0000
@@ -17,6 +17,7 @@
 import os
 import sys
 import gettext
+from time import strftime, strptime
 
 from VirtualMailManager.VirtualMailManager import VirtualMailManager
 from VirtualMailManager.Config import VMMConfig
@@ -24,16 +25,11 @@
 import VirtualMailManager.constants.EXIT as EXIT
 import VirtualMailManager.constants.ERROR as ERR
 
-locale.setlocale(locale.LC_ALL, '')
-ENCODING = locale.nl_langinfo(locale.CODESET)
-__prog__ = os.path.basename(sys.argv[0])
-
-gettext.install(__prog__, '/usr/local/share/locale', unicode=1)
 
 def w_err(code, *args):
     for arg in args:
         sys.stderr.write(arg.encode(ENCODING, 'replace'))
-    sys.stderr.write('\n')
+        sys.stderr.write('\n')
     sys.exit(code)
 
 def w_std(*args):
@@ -42,17 +38,19 @@
         sys.stdout.write('\n')
 
 def usage(excode=0, errMsg=None):
-    sys.stderr.write(_("""\
+    u_head = _("""\
 Usage: %s SUBCOMMAND OBJECT ARGS*
   short long
-  subcommand               object            args (* = optional)\n\n""")%
-  __prog__)
-    sys.stderr.write("""\
+  subcommand               object            args (* = optional)\n""")\
+          % __prog__
+
+    u_body = """\
   da    domainadd          domain.tld        transport*
   di    domaininfo         domain.tld        detailed*
   dt    domaintransport    domain.tld        transport force*
   dd    domaindelete       domain.tld        delalias*|deluser*|delall*
   daa   domainaliasadd     aliasdomain.tld   domain.tld
+  dai   domainaliasinfo    aliasdomain.tld
   dad   domainaliasdelete  aliasdomain.tld
   ua    useradd            user@domain.tld   password*
   ui    userinfo           user@domain.tld   du*
@@ -70,35 +68,23 @@
   cf    configure                            section*
   h     help
   v     version
+"""
+    if excode > 0:
+        if errMsg is None:
+            w_err(excode, u_head, u_body)
+        else:
+            w_err(excode, u_head, u_body, '%s: %s\n' % (_('Error'), errMsg))
+    else:
+        w_std(u_head, u_body)
+        sys.exit(excode)
 
-""")
-    if not errMsg is None:
-        sys.stderr.write('%s: %s\n' % (_('Error'), errMsg))
-    sys.exit(excode)
-
-def getVMM():
+def get_vmm():
     try:
         vmm = VirtualMailManager()
         return vmm
     except (VMME.VMMException, VMME.VMMNotRootException, VMME.VMMPermException,
             VMME.VMMConfigException), e:
-        w_err(e[0][1], "%s: %s\n" % (_('Error'),e[0][0]))
-
-def configure():
-    try:
-        if len(argv) < 3:
-            vmm.configure()
-        else:
-            vmm.configure(argv[2])
-    except (EOFError, KeyboardInterrupt):
-        #sys.stderr.write('\n%s!\n' % _('Ouch'))
-        #sys.exit(EXIT.USER_INTERRUPT)
-        w_err(EXIT.USER_INTERRUPT, '\n%s!\n' % _('Ouch'))
-    except VMME.VMMConfigException, e:
-        #sys.stderr.write(str(e))
-        #sys.exit(ERR.CONF_ERROR)
-        w_err(ERR.CONF_ERROR, str(e))
-    sys.exit(0)
+        w_err(e.code(), "%s: %s\n" % (_('Error'), e.msg()))
 
 def _getOrder():
     order = ()
@@ -121,14 +107,11 @@
 
 def _printInfo(info, title):
     msg = '%s %s' % (title, _('information'))
-    #print '%s\n%s' % (msg, '-'*len(msg))
     w_std ('%s\n%s' % (msg, '-'*len(msg)))
     for k,u in _getOrder():
         if u:
-            #print '\t%s: %s' % (k.upper().ljust(15, '.'), info[k])
             w_std('\t%s: %s' % (k.upper().ljust(15, '.'), info[k]))
         else:
-            #print '\t%s: %s' % (k.title().ljust(15, '.'), info[k])
             w_std('\t%s: %s' % (k.title().ljust(15, '.'), info[k]))
     print
 
@@ -185,9 +168,15 @@
                     print _formatDom(alias, main=False)
     print
 
+def configure():
+    if need_setup or len(argv) < 3:
+        vmm.configure()
+    else:
+        vmm.configure(argv[2])
+
 def domain_add():
     if argc < 3:
-        usage(EXIT.MISSING_ARGS, _('Missing domain name.'))
+        usage(EXIT.MISSING_ARGS, _(u'Missing domain name.'))
     elif argc < 4:
         vmm.domain_add(argv[2].lower())
     else:
@@ -195,7 +184,7 @@
 
 def domain_delete():
     if argc < 3:
-        usage(EXIT.MISSING_ARGS, _('Missing domain name.'))
+        usage(EXIT.MISSING_ARGS, _(u'Missing domain name.'))
     elif argc < 4:
         vmm.domain_delete(argv[2].lower())
     else:
@@ -203,7 +192,7 @@
 
 def domain_info():
     if argc < 3:
-        usage(EXIT.MISSING_ARGS, _('Missing domain name.'))
+        usage(EXIT.MISSING_ARGS, _(u'Missing domain name.'))
     elif argc < 4:
         _printInfo(vmm.domain_info(argv[2].lower()), _('Domain'))
     else:
@@ -215,9 +204,9 @@
 
 def domain_transport():
     if argc < 3:
-        usage(EXIT.MISSING_ARGS, _('Missing domain name and new transport.'))
+        usage(EXIT.MISSING_ARGS, _(u'Missing domain name and new transport.'))
     if argc < 4:
-        usage(EXIT.MISSING_ARGS, _('Missing new transport.'))
+        usage(EXIT.MISSING_ARGS, _(u'Missing new transport.'))
     elif argc < 5:
         vmm.domain_transport(argv[2].lower(), argv[3])
     else:
@@ -226,21 +215,28 @@
 def domain_alias_add():
     if argc < 3:
         usage(EXIT.MISSING_ARGS,
-                _('Missing alias domain name and target domain name.'))
+                _(u'Missing alias domain name and target domain name.'))
     elif argc < 4:
-        usage(EXIT.MISSING_ARGS, _('Missing target domain name.'))
+        usage(EXIT.MISSING_ARGS, _(u'Missing target domain name.'))
     else:
         vmm.domain_alias_add(argv[2].lower(), argv[3].lower())
 
+def domain_alias_info():
+    raise NotImplementedError('Sorry not implemented yet. ;-)')
+    if argc < 3:
+        usage(EXIT.MISSING_ARGS, _(u'Missing alias domain name.'))
+    else:
+        vmm.domain_alias_delete(argv[2].lower())
+
 def domain_alias_delete():
     if argc < 3:
-        usage(EXIT.MISSING_ARGS, _('Missing alias domain name.'))
+        usage(EXIT.MISSING_ARGS, _(u'Missing alias domain name.'))
     else:
         vmm.domain_alias_delete(argv[2].lower())
 
 def user_add():
     if argc < 3:
-        usage(EXIT.MISSING_ARGS, _('Missing e-mail address.'))
+        usage(EXIT.MISSING_ARGS, _(u'Missing e-mail address.'))
     elif argc < 4:
         password = None
     else:
@@ -249,13 +245,13 @@
 
 def user_delete():
     if argc < 3:
-        usage(EXIT.MISSING_ARGS, _('Missing e-mail address.'))
+        usage(EXIT.MISSING_ARGS, _(u'Missing e-mail address.'))
     else:
         vmm.user_delete(argv[2].lower())
 
 def user_info():
     if argc < 3:
-        usage(EXIT.MISSING_ARGS, _('Missing e-mail address.'))
+        usage(EXIT.MISSING_ARGS, _(u'Missing e-mail address.'))
     elif argc < 4:
         _printInfo(vmm.user_info(argv[2].lower()), 'Account')
     else:
@@ -263,7 +259,7 @@
 
 def user_name():
     if argc < 3:
-        usage(EXIT.MISSING_ARGS, _('Missing e-mail address and users name.'))
+        usage(EXIT.MISSING_ARGS, _(u'Missing e-mail address and users name.'))
     if argc < 4:
         usage(EXIT.MISSING_ARGS, _('Missing users name.'))
     else:
@@ -271,15 +267,15 @@
 
 def user_transport():
     if argc < 3:
-        usage(EXIT.MISSING_ARGS, _('Missing e-mail address and transport.'))
+        usage(EXIT.MISSING_ARGS, _(u'Missing e-mail address and transport.'))
     if argc <4:
-        usage(EXIT.MISSING_ARGS, _('Missing transport.'))
+        usage(EXIT.MISSING_ARGS, _(u'Missing transport.'))
     else:
         vmm.user_transport(argv[2].lower(), argv[3])
 
 def user_enable():
     if argc < 3:
-        usage(EXIT.MISSING_ARGS, _('Missing e-mail address.'))
+        usage(EXIT.MISSING_ARGS, _(u'Missing e-mail address.'))
     elif argc < 4:
         vmm.user_enable(argv[2].lower())
     else:
@@ -287,7 +283,7 @@
 
 def user_disable():
     if argc < 3:
-        usage(EXIT.MISSING_ARGS, _('Missing e-mail address.'))
+        usage(EXIT.MISSING_ARGS, _(u'Missing e-mail address.'))
     elif argc < 4:
         vmm.user_disable(argv[2].lower())
     else:
@@ -295,7 +291,7 @@
 
 def user_password():
     if argc < 3:
-        usage(EXIT.MISSING_ARGS, _('Missing e-mail address.'))
+        usage(EXIT.MISSING_ARGS, _(u'Missing e-mail address.'))
     elif argc < 4:
         password = None
     else:
@@ -304,19 +300,19 @@
 
 def alias_add():
     if argc < 4:
-        usage(EXIT.MISSING_ARGS, _('Missing alias address and destination.'))
+        usage(EXIT.MISSING_ARGS, _(u'Missing alias address and destination.'))
     else:
         vmm.alias_add(argv[2].lower(), argv[3])
 
 def alias_info():
     if argc < 3:
-        usage(EXIT.MISSING_ARGS, _('Missing alias address'))
+        usage(EXIT.MISSING_ARGS, _(u'Missing alias address'))
     else:
         _printAliases(argv[2], vmm.alias_info(argv[2].lower()))
 
 def alias_delete():
     if argc < 3:
-        usage(EXIT.MISSING_ARGS, _('Missing alias address'))
+        usage(EXIT.MISSING_ARGS, _(u'Missing alias address'))
     elif argc < 4:
         vmm.alias_delete(argv[2].lower())
     else:
@@ -324,9 +320,9 @@
 
 def user_byID():
     if argc < 3:
-        usage(EXIT.MISSING_ARGS, _('Missing userid'))
+        usage(EXIT.MISSING_ARGS, _(u'Missing userid'))
     else:
-        _printInfo(vmm.user_byID(argv[2]), 'Account')
+        _printInfo(vmm.user_byID(argv[2]), u'Account')
 
 def domain_list():
     if argc < 3:
@@ -335,32 +331,35 @@
         order, doms = vmm.domain_list(argv[2].lower())
     _printDomList(order, doms)
 
-def showWarnings():
+def show_warnings():
     if vmm.hasWarnings():
         print _(u'Warnings:')
         for w in vmm.getWarnings():
             print " * ",w
 
+def show_version():
+    w_std("%s, %s %s (%s %s %s)\n" % (__prog__, _('version'), __version__,
+            __revision__, _('from'), strftime(locale.nl_langinfo(locale.D_FMT),
+                strptime(__date__, '%Y-%m-%d'))))
+
 #def main():
 if __name__ == '__main__':
+    __prog__ = os.path.basename(sys.argv[0])
+    locale.setlocale(locale.LC_ALL, '')
+    ENCODING = locale.nl_langinfo(locale.CODESET)
+    gettext.install(__prog__, '/usr/local/share/locale', unicode=1)
+    argv = [unicode(arg, ENCODING) for arg in sys.argv]
     argc = len(sys.argv)
-    argv = [unicode(arg, ENCODING) for arg in sys.argv]
+
     if argc < 2:
         usage(EXIT.MISSING_ARGS)
-    vmm = getVMM()
+
+    vmm = get_vmm()
     try:
-        if argv[1] in ['cf',  'configure'] or not vmm.setupIsDone():
+        need_setup = not vmm.setupIsDone()
+        if   argv[1] in ['cf', 'configure'] or need_setup:
             configure()
-    except VMME.VMMConfigException, e:
-        #sys.stderr.write(str(e))
-        #sys.exit(ERR.CONF_ERROR)
-        w_err(ERR.CONF_ERROR, str(e))
-    except VMME.VMMException, e:
-        #sys.stderr.write("%s: %s\n" % (_('Error'), e[0][0]))
-        #sys.exit(e[0][1])
-        w_err(e[0][1], "%s: %s\n" % (_('Error'), e[0][0]))
-    try:
-        if argv[1] in ['da', 'domainadd']:
+        elif argv[1] in ['da', 'domainadd']:
             domain_add()
         elif argv[1] in ['di', 'domaininfo']:
             domain_info()
@@ -370,6 +369,8 @@
             domain_delete()
         elif argv[1] in ['daa', 'domainaliasadd']:
             domain_alias_add()
+        elif argv[1] in ['dai', 'domainaliasinfo']:
+            domain_alias_info()
         elif argv[1] in ['dad', 'domainaliasdelete']:
             domain_alias_delete()
         elif argv[1] in ['ua', 'useradd']:
@@ -401,13 +402,12 @@
         elif argv[1] in ['h', 'help']:
             usage()
         elif argv[1] in ['v', 'version']:
-            print "%s, version %s (%s from %s)\n" % (__prog__, __version__,
-                    __revision__, __date__)
+            show_version()
         else:
             usage(EXIT.UNKNOWN_COMMAND,
-                    "%s: '%s'" % (_(u'Unknown subcommand'), argv[1]))
-        showWarnings()
+                    u"%s: »%s«" % (_('Unknown subcommand'), argv[1]))
+        show_warnings()
     except (EOFError, KeyboardInterrupt):
-        w_err(EXIT.USER_INTERRUPT, '\n%s!\n' % _('Ouch'))
-    except VMME.VMMException, e:
-        w_err(e[0][1], "%s: %s" % (_('Error'), e[0][0]))
+        w_err(EXIT.USER_INTERRUPT, '\n%s!\n' % _(u'Ouch'))
+    except (VMME.VMMConfigException, VMME.VMMException), e:
+        w_err(e.code(), "%s: %s" % (_(u'Error'), e.msg()))