| 
     1 #!/usr/bin/env python  | 
         | 
     2 # -*- coding: UTF-8 -*-  | 
         | 
     3 # Copyright 2007-2008 VEB IT  | 
         | 
     4 # See COPYING for distribution information.  | 
         | 
     5 # $Id$  | 
         | 
     6   | 
         | 
     7 """This is the vmm main script."""  | 
         | 
     8   | 
         | 
     9 __author__ = 'Pascal Volk <p.volk@veb-it.de>'  | 
         | 
    10 __version__ = 'rev '+'$Rev$'.split()[1]  | 
         | 
    11 __date__ = '$Date$'.split()[1]  | 
         | 
    12   | 
         | 
    13 import os  | 
         | 
    14 import sys  | 
         | 
    15 from getpass import getpass  | 
         | 
    16   | 
         | 
    17 #sys.path.insert(0, '/usr/local/lib/VirtualMailManager')  | 
         | 
    18   | 
         | 
    19 from VirtualMailManager.VirtualMailManager import VirtualMailManager  | 
         | 
    20 from VirtualMailManager.Config import VMMConfig  | 
         | 
    21 import VirtualMailManager.Exceptions as VMME  | 
         | 
    22 import VirtualMailManager.constants.EXIT as EXIT  | 
         | 
    23   | 
         | 
    24 def usage(excode=0, errMsg=None):  | 
         | 
    25     sys.stderr.write("""\ | 
         | 
    26 Usage: vmm OPTION OBJECT ARGS*  | 
         | 
    27   short long  | 
         | 
    28   option                object           args (* = optional)  | 
         | 
    29   | 
         | 
    30   da    domainadd       domain.tld       transport*  | 
         | 
    31   di    domaininfo      domain.tld       detailed*  | 
         | 
    32   dt    domaintransport domain.tld       transport  | 
         | 
    33   dd    domaindelete    domain.tld       delalias*|deluser*|delall*  | 
         | 
    34   ua    useradd         user@domain.tld  password*  | 
         | 
    35   ui    userinfo        user@domain.tld  du*  | 
         | 
    36   un    username        user@domain.tld  'Users Name'  | 
         | 
    37   up    userpassword    user@domain.tld  password*  | 
         | 
    38   u0    userdisable     user@domain.tld  | 
         | 
    39   u1    userenable      user@domain.tld  | 
         | 
    40   ud    userdelete      user@domain.tld  | 
         | 
    41   aa    aliasadd        alias@domain.tld user@domain.tld  | 
         | 
    42   ai    aliasinfo       alias@domain.tld  | 
         | 
    43   ad    aliasdelete     alias@domain.tld  | 
         | 
    44   cf    configure                        section*  | 
         | 
    45   h     help  | 
         | 
    46   v     version  | 
         | 
    47   | 
         | 
    48 """)  | 
         | 
    49     if not errMsg is None:  | 
         | 
    50         sys.stderr.write('Error: %s\n' % errMsg) | 
         | 
    51     sys.exit(excode)  | 
         | 
    52   | 
         | 
    53 def getVMM():  | 
         | 
    54     try:  | 
         | 
    55         vmm = VirtualMailManager()  | 
         | 
    56         return vmm  | 
         | 
    57     except VMME.MANotRootException, e:  | 
         | 
    58         sys.stderr.write(str(e))  | 
         | 
    59         sys.exit(EXIT.CONF_NOPERM)  | 
         | 
    60     except IOError, e:  | 
         | 
    61         sys.stderr.write(str(e))  | 
         | 
    62         sys.exit(EXIT.CONF_NOFILE)  | 
         | 
    63     except VMME.MAPermException, e:  | 
         | 
    64         sys.stderr.write(str(e))  | 
         | 
    65         sys.exit(EXIT.CONF_WRONGPERM)  | 
         | 
    66   | 
         | 
    67 def configure():  | 
         | 
    68     try:  | 
         | 
    69         if len(sys.argv) < 3:  | 
         | 
    70             vmm.configure()  | 
         | 
    71         else:  | 
         | 
    72             vmm.configure(sys.argv[2])  | 
         | 
    73     except (EOFError, KeyboardInterrupt):  | 
         | 
    74         sys.stderr.write('\nOuch!\n') | 
         | 
    75         sys.exit(EXIT.USER_INTERRUPT)  | 
         | 
    76     except VMME.VMMConfigException, e:  | 
         | 
    77         sys.stderr.write(str(e))  | 
         | 
    78         sys.exit(EXIT.CONF_ERROR)  | 
         | 
    79     sys.exit(0)  | 
         | 
    80   | 
         | 
    81 def _readpass():  | 
         | 
    82     clear0 = ''  | 
         | 
    83     clear1 = '1'  | 
         | 
    84     while clear0 != clear1:  | 
         | 
    85         while len(clear0) < 1:  | 
         | 
    86             clear0 = getpass(prompt='Enter new password: ')  | 
         | 
    87             if len(clear0) < 1:  | 
         | 
    88                 sys.stderr.write('Sorry, empty passwords are not permitted\n') | 
         | 
    89         clear1 = getpass(prompt='Retype new password: ')  | 
         | 
    90         if clear0 != clear1:  | 
         | 
    91             clear0 = ''  | 
         | 
    92             sys.stderr.write('Sorry, passwords do not match\n') | 
         | 
    93     return clear0  | 
         | 
    94   | 
         | 
    95 def _printInfo(info, title):  | 
         | 
    96     msg = title+' information'  | 
         | 
    97     print '%s\n%s' % (msg, '-'*len(msg))  | 
         | 
    98     for k,v in info.items():  | 
         | 
    99         print '\t%s: %s' % (k.title().ljust(15, '.'), v)  | 
         | 
   100     print  | 
         | 
   101   | 
         | 
   102 def _printUsers(users, title):  | 
         | 
   103     msg = 'Available '+title  | 
         | 
   104     print '%s\n%s' % (msg, '-'*len(msg))  | 
         | 
   105     if len(users) > 0:  | 
         | 
   106         for user in users:  | 
         | 
   107             print '\t%s' % user  | 
         | 
   108     else:  | 
         | 
   109         print '\tNone'  | 
         | 
   110     print  | 
         | 
   111   | 
         | 
   112 def _printAliases(alias, targets):  | 
         | 
   113     msg = 'Alias information'  | 
         | 
   114     print '%s\n%s' % (msg, '-'*len(msg))  | 
         | 
   115     print '\tMail for %s goes to:' % alias  | 
         | 
   116     if len(targets) > 0:  | 
         | 
   117         for target in targets:  | 
         | 
   118             print '\t     -> %s' % target  | 
         | 
   119     else:  | 
         | 
   120         print '\tNone'  | 
         | 
   121     print  | 
         | 
   122   | 
         | 
   123 def domain_add():  | 
         | 
   124     global argc  | 
         | 
   125     if argc < 3:  | 
         | 
   126         usage(EXIT.MISSING_ARGS, 'Missing domain name.')  | 
         | 
   127     elif argc < 4:  | 
         | 
   128         vmm.domain_add(sys.argv[2].lower())  | 
         | 
   129     else:  | 
         | 
   130         vmm.domain_add(sys.argv[2].lower(), sys.argv[3])  | 
         | 
   131   | 
         | 
   132 def domain_delete():  | 
         | 
   133     global argc  | 
         | 
   134     if argc < 3:  | 
         | 
   135         usage(EXIT.MISSING_ARGS, 'Missing domain name.')  | 
         | 
   136     elif argc < 4:  | 
         | 
   137         vmm.domain_delete(sys.argv[2].lower())  | 
         | 
   138     else:  | 
         | 
   139         vmm.domain_delete(sys.argv[2].lower(), sys.argv[3])  | 
         | 
   140   | 
         | 
   141 def domain_info():  | 
         | 
   142     global argc  | 
         | 
   143     if argc < 3:  | 
         | 
   144         usage(EXIT.MISSING_ARGS, 'Missing domain name.')  | 
         | 
   145     elif argc < 4:  | 
         | 
   146         _printInfo(vmm.domain_info(sys.argv[2].lower()), 'Domain')  | 
         | 
   147     else:  | 
         | 
   148         infos = vmm.domain_info(sys.argv[2].lower(), sys.argv[3])  | 
         | 
   149         _printInfo(infos[0], 'Domain')  | 
         | 
   150         _printUsers(infos[1], 'accounts')  | 
         | 
   151         _printUsers(infos[2], 'aliases')  | 
         | 
   152   | 
         | 
   153 def domain_transport():  | 
         | 
   154     global argc  | 
         | 
   155     if argc < 3:  | 
         | 
   156         usage(EXIT.MISSING_ARGS, 'Missing domain name and new transport.')  | 
         | 
   157     if argc < 4:  | 
         | 
   158         usage(EXIT.MISSING_ARGS, 'Missing new transport.')  | 
         | 
   159     else:  | 
         | 
   160         vmm.domain_transport(sys.argv[2].lower(), sys.argv[3])  | 
         | 
   161   | 
         | 
   162 def user_add():  | 
         | 
   163     global argc  | 
         | 
   164     if argc < 3:  | 
         | 
   165         usage(EXIT.MISSING_ARGS, 'Missing email address.')  | 
         | 
   166     elif argc < 4:  | 
         | 
   167         password = _readpass()  | 
         | 
   168     else:  | 
         | 
   169         password = sys.argv[3]  | 
         | 
   170     vmm.user_add(sys.argv[2].lower(), password)  | 
         | 
   171   | 
         | 
   172 def user_delete():  | 
         | 
   173     global argc  | 
         | 
   174     if argc < 3:  | 
         | 
   175         usage(EXIT.MISSING_ARGS, 'Missing email address.')  | 
         | 
   176     else:  | 
         | 
   177         vmm.user_delete(sys.argv[2].lower())  | 
         | 
   178   | 
         | 
   179 def user_info():  | 
         | 
   180     global argc  | 
         | 
   181     if argc < 3:  | 
         | 
   182         usage(EXIT.MISSING_ARGS, 'Missing email address.')  | 
         | 
   183     elif argc < 4:  | 
         | 
   184         _printInfo(vmm.user_info(sys.argv[2].lower()), 'Account')  | 
         | 
   185     else:  | 
         | 
   186         _printInfo(vmm.user_info(sys.argv[2].lower(), True), 'Account')  | 
         | 
   187   | 
         | 
   188 def user_name():  | 
         | 
   189     global argc  | 
         | 
   190     if argc < 4:  | 
         | 
   191         usage(EXIT.MISSING_ARGS, 'Missing email address an users name.')  | 
         | 
   192     else:  | 
         | 
   193         vmm.user_name(sys.argv[2].lower(), sys.argv[3])  | 
         | 
   194   | 
         | 
   195 def user_enable():  | 
         | 
   196     global argc  | 
         | 
   197     if argc < 3:  | 
         | 
   198         usage(EXIT.MISSING_ARGS, 'Missing email address.')  | 
         | 
   199     else:  | 
         | 
   200         vmm.user_enable(sys.argv[2].lower())  | 
         | 
   201   | 
         | 
   202 def user_disable():  | 
         | 
   203     global argc  | 
         | 
   204     if argc < 3:  | 
         | 
   205         usage(EXIT.MISSING_ARGS, 'Missing email address.')  | 
         | 
   206     else:  | 
         | 
   207         vmm.user_disable(sys.argv[2].lower())  | 
         | 
   208   | 
         | 
   209 def user_password():  | 
         | 
   210     global argc  | 
         | 
   211     if argc < 3:  | 
         | 
   212         usage(EXIT.MISSING_ARGS, 'Missing email address.')  | 
         | 
   213     elif argc < 4:  | 
         | 
   214         password = _readpass()  | 
         | 
   215     else:  | 
         | 
   216         password = sys.argv[3]  | 
         | 
   217     vmm.user_password(sys.argv[2].lower(), password)  | 
         | 
   218   | 
         | 
   219 def alias_add():  | 
         | 
   220     global argc  | 
         | 
   221     if argc < 4:  | 
         | 
   222         usage(EXIT.MISSING_ARGS, 'Missing alias address and destination.')  | 
         | 
   223     else:  | 
         | 
   224         vmm.alias_add(sys.argv[2].lower(), sys.argv[3])  | 
         | 
   225   | 
         | 
   226 def alias_info():  | 
         | 
   227     global argc  | 
         | 
   228     if argc < 3:  | 
         | 
   229         usage(EXIT.MISSING_ARGS, 'Missing alias address')  | 
         | 
   230     else:  | 
         | 
   231         _printAliases(sys.argv[2], vmm.alias_info(sys.argv[2].lower()))  | 
         | 
   232   | 
         | 
   233 def alias_delete():  | 
         | 
   234     global argc  | 
         | 
   235     if argc < 3:  | 
         | 
   236         usage(EXIT.MISSING_ARGS, 'Missing alias address')  | 
         | 
   237     else:  | 
         | 
   238         vmm.alias_delete(sys.argv[2].lower())  | 
         | 
   239   | 
         | 
   240 def showWarnings():  | 
         | 
   241     if vmm.hasWarnings():  | 
         | 
   242         print '\nWarnings:'  | 
         | 
   243         for w in vmm.getWarnings():  | 
         | 
   244             print " * ",w  | 
         | 
   245   | 
         | 
   246 #def main():  | 
         | 
   247 if __name__ == '__main__':  | 
         | 
   248     argc = len(sys.argv)  | 
         | 
   249     if argc < 2:  | 
         | 
   250         usage(EXIT.MISSING_ARGS) # -> exit  | 
         | 
   251     vmm = getVMM()  | 
         | 
   252     try:  | 
         | 
   253         if sys.argv[1] in ['cf',  'configure'] or not vmm.setupIsDone():  | 
         | 
   254             configure()  | 
         | 
   255     except VMME.VMMConfigException, e:  | 
         | 
   256         sys.stderr.write(str(e))  | 
         | 
   257         sys.exit(EXIT.CONF_ERROR)  | 
         | 
   258     except VMME.VMMException, e:  | 
         | 
   259         sys.stderr.write("\aERROR: %s\n" % e[0][0]) | 
         | 
   260         sys.exit(e[0][1])  | 
         | 
   261     try:  | 
         | 
   262         if sys.argv[1] in ['da', 'domainadd']:  | 
         | 
   263             domain_add()  | 
         | 
   264         elif sys.argv[1] in ['di', 'domaininfo']:  | 
         | 
   265             domain_info()  | 
         | 
   266         elif sys.argv[1] in ['dt', 'domaintransport']:  | 
         | 
   267             domain_transport()  | 
         | 
   268         elif sys.argv[1] in ['dd', 'domaindelete']:  | 
         | 
   269             domain_delete()  | 
         | 
   270         elif sys.argv[1] in ['ua', 'useradd']:  | 
         | 
   271             user_add()  | 
         | 
   272         elif sys.argv[1] in ['ui', 'userinfo']:  | 
         | 
   273             user_info()  | 
         | 
   274         elif sys.argv[1] in ['un', 'username']:  | 
         | 
   275             user_name()  | 
         | 
   276         elif sys.argv[1] in ['up', 'userpassword']:  | 
         | 
   277             user_password()  | 
         | 
   278         elif sys.argv[1] in ['u0', 'userdisable']:  | 
         | 
   279             user_disable()  | 
         | 
   280         elif sys.argv[1] in ['u1', 'userenable']:  | 
         | 
   281             user_enable()  | 
         | 
   282         elif sys.argv[1] in ['ud', 'userdelete']:  | 
         | 
   283             user_delete()  | 
         | 
   284         elif sys.argv[1] in ['aa', 'aliasadd']:  | 
         | 
   285             alias_add()  | 
         | 
   286         elif sys.argv[1] in ['ai', 'aliasinfo']:  | 
         | 
   287             alias_info()  | 
         | 
   288         elif sys.argv[1] in ['ad', 'aliasdelete']:  | 
         | 
   289             alias_delete()  | 
         | 
   290         elif sys.argv[1] in ['h', 'help']:  | 
         | 
   291             usage()  | 
         | 
   292         elif sys.argv[1] in ['v', 'version']:  | 
         | 
   293             print "%s: %s (Date: %s)\n" % (os.path.basename(sys.argv[0]),  | 
         | 
   294                     __version__, __date__)  | 
         | 
   295         else:  | 
         | 
   296             sys.stderr.write('Unknown option: "%s"\n' % sys.argv[1]) | 
         | 
   297             usage(EXIT.UNKNOWN_OPTION)  | 
         | 
   298         showWarnings()  | 
         | 
   299     except (EOFError, KeyboardInterrupt):  | 
         | 
   300         sys.stderr.write('\nOuch!\n') | 
         | 
   301         sys.exit(EXIT.USER_INTERRUPT)  | 
         | 
   302     except VMME.VMMException, e:  | 
         | 
   303         sys.stderr.write("\aERROR: %s\n" % e[0][0]) | 
         | 
   304         sys.exit(e[0][1])  |