* 'VirtualMailManager/VirtualMailManager.py'
- Implemented:
+ VirtualMailManager.domain_alias_add()
+ VirtualMailManager.domain_alias_delete()
* 'VirtualMailManager/Domain.py'
- Implemented:
+ Domain._aliasExists()
+ Domain.saveAlias()
+ deleteAlias()
- Fixed Domain._exists(); returns only True when the domain exists
AND it's the primary domain
- Fixed table order in Domain.delete()
* 'vmm'
- _printList() added ace2idna support for alias domains
- Implemented:
+ domain_alias_add()
+ domain_alias_delete()
#!/usr/bin/env python# -*- coding: UTF-8 -*-# Copyright 2007-2008 VEB IT# See COPYING for distribution information.# $Id$"""This is the vmm main script."""fromVirtualMailManager.constants.VERSIONimportVERSION__author__='Pascal Volk <p.volk@veb-it.de>'__version__=VERSION__revision__='rev '+'$Rev$'.split()[1]__date__='$Date$'.split()[1]importosimportsysimportgettextfromVirtualMailManager.VirtualMailManagerimportVirtualMailManagerfromVirtualMailManager.ConfigimportVMMConfigimportVirtualMailManager.ExceptionsasVMMEimportVirtualMailManager.constants.EXITasEXITimportVirtualMailManager.constants.ERRORasERR__prog__=os.path.basename(sys.argv[0])gettext.bindtextdomain(__prog__,'/usr/local/share/locale')gettext.textdomain(__prog__)_=gettext.gettextdefusage(excode=0,errMsg=None):sys.stderr.write(_("""\Usage: %s SUBCOMMAND OBJECT ARGS* short long subcommand object args (* = optional)\n\n""")%__prog__)sys.stderr.write("""\ 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 dad domainaliasdelete aliasdomain.tld 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* ut usertransport user@domain.tld transport u0 userdisable user@domain.tld smtp*|pop3*|imap*|managesieve*|all* u1 userenable user@domain.tld smtp*|pop3*|imap*|managesieve*|all* ud userdelete user@domain.tld aa aliasadd alias@domain.tld user@domain.tld ai aliasinfo alias@domain.tld ad aliasdelete alias@domain.tld user@domain.tld* gu getuser userid ld listdomains pattern* cf configure section* h help v version""")ifnoterrMsgisNone:sys.stderr.write('%s: %s\n'%(_('Error'),errMsg))sys.exit(excode)defgetVMM():try:vmm=VirtualMailManager()returnvmmexcept(VMME.VMMException,VMME.VMMNotRootException,VMME.VMMPermException,VMME.VMMConfigException),e:sys.stderr.write("%s: %s\n"%(_('Error'),e[0][0]))sys.exit(e[0][1])defconfigure():try:iflen(sys.argv)<3:vmm.configure()else:vmm.configure(sys.argv[2])except(EOFError,KeyboardInterrupt):sys.stderr.write('\n%s!\n'%_('Ouch'))sys.exit(EXIT.USER_INTERRUPT)exceptVMME.VMMConfigException,e:sys.stderr.write(str(e))sys.exit(ERR.CONF_ERROR)sys.exit(0)def_getOrder():order=()ifsys.argv[1]in['di','domaininfo']:order=(('domainname',0),('gid',1),('transport',0),('domaindir',0),('aliasdomains',0),('accounts',0),('aliases',0))elifsys.argv[1]in['ui','userinfo']:ifargc==4orvmm.cfgGetBoolean('maildir','diskusage'):order=(('address',0),('name',0),('uid',1),('gid',1),('transport',0),('maildir',0),('disk usage',0),('smtp',1),('pop3',1),('imap',1),('managesieve',1))else:order=(('address',0),('name',0),('uid',1),('gid',1),('transport',0),('maildir',0),('smtp',1),('pop3',1),('imap',1),('managesieve',1))elifsys.argv[1]in['gu','getuser']:order=(('uid',1),('gid',1),('address',0))returnorderdef_printInfo(info,title):msg='%s%s'%(title,_('information'))print'%s\n%s'%(msg,'-'*len(msg))fork,uin_getOrder():ifu:print'\t%s: %s'%(k.upper().ljust(15,'.'),info[k])else:print'\t%s: %s'%(k.title().ljust(15,'.'),info[k])printdef_printList(alist,title):msg='%s%s'%(_('Available'),title)print'%s\n%s'%(msg,'-'*len(msg))iflen(alist)>0:iftitle!=_('alias domains'):forvalinalist:print'\t%s'%valelse:fordominalist:ifnotdom.startswith('xn--'):print'\t%s'%domelse:print'\t%s (%s)'%(dom,vmm.ace2idna(dom))else:print_('\tNone')printdef_printAliases(alias,targets):msg=_('Alias information')print'%s\n%s'%(msg,'-'*len(msg))print_('\tMail for %s goes to:')%aliasiflen(targets)>0:fortargetintargets:print'\t -> %s'%targetelse:print_('\tNone')printdef_formatDom(domain,main=True):ifdomain.startswith('xn--'):domain='%s (%s)'%(domain,vmm.ace2idna(domain))ifmain:return'\t[+] %s'%domainelse:return'\t[-] %s'%domaindef_printDomList(dids,domains):ifargc<3:msg=_('Available domains')else:msg=_('Matching domains')print'%s\n%s'%(msg,'-'*len(msg))ifnotlen(domains):print_('\tNone')else:foridindids:ifdomains[id][0]isnotNone:print_formatDom(domains[id][0])iflen(domains[id])>1:foraliasindomains[id][1:]:print_formatDom(alias,main=False)printdefdomain_add():ifargc<3:usage(EXIT.MISSING_ARGS,_('Missing domain name.'))elifargc<4:vmm.domain_add(sys.argv[2].lower())else:vmm.domain_add(sys.argv[2].lower(),sys.argv[3])defdomain_delete():ifargc<3:usage(EXIT.MISSING_ARGS,_('Missing domain name.'))elifargc<4:vmm.domain_delete(sys.argv[2].lower())else:vmm.domain_delete(sys.argv[2].lower(),sys.argv[3])defdomain_info():ifargc<3:usage(EXIT.MISSING_ARGS,_('Missing domain name.'))elifargc<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'))_printList(infos[1],_('alias domains'))_printList(infos[2],_('accounts'))_printList(infos[3],_('aliases'))defdomain_transport():ifargc<3:usage(EXIT.MISSING_ARGS,_('Missing domain name and new transport.'))ifargc<4:usage(EXIT.MISSING_ARGS,_('Missing new transport.'))elifargc<5:vmm.domain_transport(sys.argv[2].lower(),sys.argv[3])else:vmm.domain_transport(sys.argv[2].lower(),sys.argv[3],sys.argv[4])defdomain_alias_add():ifargc<3:usage(EXIT.MISSING_ARGS,_('Missing alias domain name and target domain name.'))elifargc<4:usage(EXIT.MISSING_ARGS,_('Missing target domain name.'))else:vmm.domain_alias_add(sys.argv[2].lower(),sys.argv[3].lower())defdomain_alias_delete():ifargc<3:usage(EXIT.MISSING_ARGS,_('Missing alias domain name.'))else:vmm.domain_alias_delete(sys.argv[2].lower())defuser_add():ifargc<3:usage(EXIT.MISSING_ARGS,_('Missing e-mail address.'))elifargc<4:password=Noneelse:password=sys.argv[3]vmm.user_add(sys.argv[2].lower(),password)defuser_delete():ifargc<3:usage(EXIT.MISSING_ARGS,_('Missing e-mail address.'))else:vmm.user_delete(sys.argv[2].lower())defuser_info():ifargc<3:usage(EXIT.MISSING_ARGS,_('Missing e-mail address.'))elifargc<4:_printInfo(vmm.user_info(sys.argv[2].lower()),'Account')else:_printInfo(vmm.user_info(sys.argv[2].lower(),True),'Account')defuser_name():ifargc<3:usage(EXIT.MISSING_ARGS,_('Missing e-mail address and users name.'))ifargc<4:usage(EXIT.MISSING_ARGS,_('Missing users name.'))else:vmm.user_name(sys.argv[2].lower(),sys.argv[3])defuser_transport():ifargc<3:usage(EXIT.MISSING_ARGS,_('Missing e-mail address and transport.'))ifargc<4:usage(EXIT.MISSING_ARGS,_('Missing transport.'))else:vmm.user_transport(sys.argv[2].lower(),sys.argv[3])defuser_enable():ifargc<3:usage(EXIT.MISSING_ARGS,_('Missing e-mail address.'))elifargc<4:vmm.user_enable(sys.argv[2].lower())else:vmm.user_enable(sys.argv[2].lower(),sys.argv[3].lower())defuser_disable():ifargc<3:usage(EXIT.MISSING_ARGS,_('Missing e-mail address.'))elifargc<4:vmm.user_disable(sys.argv[2].lower())else:vmm.user_disable(sys.argv[2].lower(),sys.argv[3].lower())defuser_password():ifargc<3:usage(EXIT.MISSING_ARGS,_('Missing e-mail address.'))elifargc<4:password=Noneelse:password=sys.argv[3]vmm.user_password(sys.argv[2].lower(),password)defalias_add():ifargc<4:usage(EXIT.MISSING_ARGS,_('Missing alias address and destination.'))else:vmm.alias_add(sys.argv[2].lower(),sys.argv[3])defalias_info():ifargc<3:usage(EXIT.MISSING_ARGS,_('Missing alias address'))else:_printAliases(sys.argv[2],vmm.alias_info(sys.argv[2].lower()))defalias_delete():ifargc<3:usage(EXIT.MISSING_ARGS,_('Missing alias address'))elifargc<4:vmm.alias_delete(sys.argv[2].lower())else:vmm.alias_delete(sys.argv[2].lower(),sys.argv[3].lower())defuser_byID():ifargc<3:usage(EXIT.MISSING_ARGS,_('Missing userid'))else:_printInfo(vmm.user_byID(sys.argv[2]),'Account')defdomain_list():ifargc<3:order,doms=vmm.domain_list()else:order,doms=vmm.domain_list(sys.argv[2].lower())_printDomList(order,doms)defshowWarnings():ifvmm.hasWarnings():print_('\nWarnings:')forwinvmm.getWarnings():print" * ",w#def main():if__name__=='__main__':argc=len(sys.argv)ifargc<2:usage(EXIT.MISSING_ARGS)vmm=getVMM()try:ifsys.argv[1]in['cf','configure']ornotvmm.setupIsDone():configure()exceptVMME.VMMConfigException,e:sys.stderr.write(str(e))sys.exit(ERR.CONF_ERROR)exceptVMME.VMMException,e:sys.stderr.write("%s: %s\n"%(_('Error'),e[0][0]))sys.exit(e[0][1])try:ifsys.argv[1]in['da','domainadd']:domain_add()elifsys.argv[1]in['di','domaininfo']:domain_info()elifsys.argv[1]in['dt','domaintransport']:domain_transport()elifsys.argv[1]in['dd','domaindelete']:domain_delete()elifsys.argv[1]in['daa','domainaliasadd']:domain_alias_add()elifsys.argv[1]in['dad','domainaliasdelete']:domain_alias_delete()elifsys.argv[1]in['ua','useradd']:user_add()elifsys.argv[1]in['ui','userinfo']:user_info()elifsys.argv[1]in['un','username']:user_name()elifsys.argv[1]in['up','userpassword']:user_password()elifsys.argv[1]in['ut','usertransport']:user_transport()elifsys.argv[1]in['u0','userdisable']:user_disable()elifsys.argv[1]in['u1','userenable']:user_enable()elifsys.argv[1]in['ud','userdelete']:user_delete()elifsys.argv[1]in['aa','aliasadd']:alias_add()elifsys.argv[1]in['ai','aliasinfo']:alias_info()elifsys.argv[1]in['ad','aliasdelete']:alias_delete()elifsys.argv[1]in['gu','getuser']:user_byID()elifsys.argv[1]in['ld','listdomains']:domain_list()elifsys.argv[1]in['h','help']:usage()elifsys.argv[1]in['v','version']:print"%s, version %s (%s from %s)\n"%(__prog__,__version__,__revision__,__date__)else:usage(EXIT.UNKNOWN_COMMAND,"%s: '%s'"%(_('Unknown subcommand'),sys.argv[1]))showWarnings()except(EOFError,KeyboardInterrupt):sys.stderr.write('\n%s!\n'%_('Ouch'))sys.exit(EXIT.USER_INTERRUPT)exceptVMME.VMMException,e:sys.stderr.write("%s: %s\n"%(_('Error'),e[0][0]))sys.exit(e[0][1])