* 'VirtualMailManager/VirtualMailManager.py'
authorPascal Volk <neverseen@users.sourceforge.net>
Sun, 25 May 2008 03:42:42 +0000
changeset 35 22cc616aef61
parent 34 6d74e20c5b3b
child 36 8a9ce20d2569
* 'VirtualMailManager/VirtualMailManager.py' - renamed: * __idn2ascii() -> idn2ascii() * __ace2idna() -> ace2idna() - implemented domain_list() - some small code cleanups * 'VirtualMailManager/Domain.py' - implemented search() * 'vmm' - implemented domain_list() - some small code cleanups * 'po/vmm.pot' * 'po/de.po' - updated
ChangeLog
VirtualMailManager/Domain.py
VirtualMailManager/VirtualMailManager.py
VirtualMailManager/constants/VERSION.py
po/de.po
po/vmm.pot
vmm
--- a/ChangeLog	Sun May 18 04:51:12 2008 +0000
+++ b/ChangeLog	Sun May 25 03:42:42 2008 +0000
@@ -1,4 +1,18 @@
 === 0.0.0 ===
+2008-05-25  Pascal Volk  <neverseen@users.sourceforge.net>
+
+	* VirtualMailManager/VirtualMailManager.py (VirtualMailManager):
+		Renamed:
+		  __idn2ascii() -> idn2ascii()
+		  __ace2idna()  -> ace2idna()
+		Implemented domain_list()
+		some small code cleanups
+	* vmm:
+		Implemented domain_list()
+		some small code cleanups
+	* VirtualMailManager/Domain.py:
+		Implemented search()
+
 2008-05-13  Pascal Volk  <neverseen@users.sourceforge.net>
 
 	* VirtualMailManager/Alias.py, VirtualMailManager/MailLocation.py,
--- a/VirtualMailManager/Domain.py	Sun May 18 04:51:12 2008 +0000
+++ b/VirtualMailManager/Domain.py	Sun May 25 03:42:42 2008 +0000
@@ -244,3 +244,18 @@
             for alias in addresses:
                 aliases.append(alias[0])
         return aliases
+
+def search(dbh, pattern=None, like=False):
+    sql = 'SELECT domainname FROM domains'
+    if pattern is None:
+        pass
+    elif like:
+        sql += " WHERE domainname LIKE '%s'" % pattern
+    else:
+        sql += " WHERE domainname = '%s'" % pattern
+    sql += ' ORDER BY domainname'
+    dbc = dbh.cursor()
+    dbc.execute(sql)
+    domains = dbc.fetchall()
+    dbc.close()
+    return domains
--- a/VirtualMailManager/VirtualMailManager.py	Sun May 18 04:51:12 2008 +0000
+++ b/VirtualMailManager/VirtualMailManager.py	Sun May 25 03:42:42 2008 +0000
@@ -33,10 +33,9 @@
 SALTCHARS = './0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
 RE_ASCII_CHARS = """^[\x20-\x7E]*$"""
 RE_DOMAIN = """^(?:[a-z0-9-]{1,63}\.){1,}[a-z]{2,6}$"""
+RE_DOMAIN_SRCH = """^[a-z0-9-\.]+$"""
 RE_LOCALPART = """[^\w!#$%&'\*\+-\.\/=?^_`{\|}~]"""
 RE_MAILLOCATION = """^[\w]{1,20}$"""
-re.compile(RE_ASCII_CHARS)
-re.compile(RE_DOMAIN)
 
 ENCODING_IN = sys.getfilesystemencoding()
 ENCODING_OUT = sys.stdout.encoding or sys.getfilesystemencoding()
@@ -117,7 +116,7 @@
     def __dbConnect(self):
         """Creates a pyPgSQL.PgSQL.connection instance."""
         try:
-            self.__dbh =  PgSQL.connect(
+            self.__dbh = PgSQL.connect(
                     database=self.__Cfg.get('database', 'name'),
                     user=self.__Cfg.get('database', 'user'),
                     host=self.__Cfg.get('database', 'host'),
@@ -144,7 +143,7 @@
                 localpart, ERR.LOCALPART_INVALID))
         return localpart
 
-    def __idn2ascii(self, domainname):
+    def idn2ascii(self, domainname):
         """Converts an idn domainname in punycode.
         
         Keyword arguments:
@@ -157,7 +156,7 @@
             tmp.append(ToASCII(unicode(label, ENCODING_IN)))
         return '.'.join(tmp)
 
-    def __ace2idna(self, domainname):
+    def ace2idna(self, domainname):
         """Convertis a domainname from ACE according to IDNA
         
         Keyword arguments:
@@ -176,11 +175,13 @@
         Keyword arguments:
         domainname -- the domain name that should be validated
         """
+        re.compile(RE_ASCII_CHARS)
         if not re.match(RE_ASCII_CHARS, domainname):
-            domainname = self.__idn2ascii(domainname)
+            domainname = self.idn2ascii(domainname)
         if len(domainname) > 255:
             raise VMMException((_('The domain name is too long.'),
                 ERR.DOMAIN_TOO_LONG))
+        re.compile(RE_DOMAIN)
         if not re.match(RE_DOMAIN, domainname):
             raise VMMException((_('The domain name is invalid.'),
                 ERR.DOMAIN_INVALID))
@@ -454,7 +455,7 @@
         dominfo = dom.getInfo()
         if dominfo['domainname'].startswith('xn--'):
             dominfo['domainname'] += ' (%s)'\
-                % self.__ace2idna(dominfo['domainname'])
+                % self.ace2idna(dominfo['domainname'])
         if dominfo['aliases'] is None:
             dominfo['aliases'] = 0
         if detailed is None:
@@ -465,6 +466,28 @@
             raise VMMDomainException(('%s: »%s«' % (_('Invalid argument'),
                 detailed),  ERR.INVALID_OPTION))
 
+    def domain_list(self, pattern=None):
+        from Domain import search
+        like = False
+        if pattern is not None:
+            if pattern.startswith('%') or pattern.endswith('%'):
+                like = True
+                if pattern.startswith('%') and pattern.endswith('%'):
+                    domain = pattern[1:-1]
+                elif pattern.startswith('%'):
+                    domain = pattern[1:]
+                elif pattern.endswith('%'):
+                    domain = pattern[:-1]
+                re.compile(RE_DOMAIN_SRCH)
+                if not re.match(RE_DOMAIN_SRCH, domain):
+                    raise VMMException((
+                    _(u'The pattern »%s« contains invalid characters.') %
+                    pattern, ERR.DOMAIN_INVALID))
+            else:
+                pattern = self.__chkDomainname(pattern)
+        self.__dbConnect()
+        return search(self.__dbh, pattern=pattern, like=like)
+
     def user_add(self, emailaddress, password):
         acc = self.__getAccount(emailaddress, password)
         acc.save(self.__Cfg.get('maildir', 'folder'),
--- a/VirtualMailManager/constants/VERSION.py	Sun May 18 04:51:12 2008 +0000
+++ b/VirtualMailManager/constants/VERSION.py	Sun May 25 03:42:42 2008 +0000
@@ -4,4 +4,4 @@
 # See COPYING for distribution information.
 # $Id$
 
-VERSION = '0.4'
+VERSION = '0.5'
--- a/po/de.po	Sun May 18 04:51:12 2008 +0000
+++ b/po/de.po	Sun May 25 03:42:42 2008 +0000
@@ -5,8 +5,8 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: vmm 0.4\n"
-"POT-Creation-Date: 2008-05-18 06:21+CEST\n"
-"PO-Revision-Date: 2008-05-18 05:53+0200\n"
+"POT-Creation-Date: 2008-05-25 04:58+CEST\n"
+"PO-Revision-Date: 2008-05-25 05:00+0200\n"
 "Last-Translator: Pascal Volk <p.volk@veb-it.de>\n"
 "Language-Team: German\n"
 "MIME-Version: 1.0\n"
@@ -31,7 +31,7 @@
 #: VirtualMailManager/Account.py:180 VirtualMailManager/Account.py:208
 #: VirtualMailManager/Account.py:227
 msgid "Account doesn't exists"
-msgstr "Der Account existiert nicht."
+msgstr "Der Account existiert nicht"
 
 #: VirtualMailManager/Account.py:148
 msgid "Account already exists."
@@ -47,7 +47,7 @@
 
 #: VirtualMailManager/Alias.py:31
 msgid "Address and destination are identical."
-msgstr "Alias- und Ziel-Adresse sind identisch.."
+msgstr "Alias- und Ziel-Adresse sind identisch."
 
 #: VirtualMailManager/Alias.py:44
 msgid "There is already an account with address »%s«"
@@ -67,11 +67,11 @@
 
 #: VirtualMailManager/Config.py:101
 msgid "missing section: %s\n"
-msgstr "Fehlende Sektion: %s\n"
+msgstr "Fehlender Bereich: %s\n"
 
 #: VirtualMailManager/Config.py:103
 msgid "missing options in section %s:\n"
-msgstr "Fehlende Optionen in Sektion %s:\n"
+msgstr "Fehlende Optionen im Bereich %s:\n"
 
 #: VirtualMailManager/Config.py:119
 msgid "Argument 'sections' is not a list."
@@ -79,7 +79,7 @@
 
 #: VirtualMailManager/Config.py:132
 msgid "* Config section: %s"
-msgstr "* Konfigurations Sektion: »%s«"
+msgstr "* Konfigurations Bereich: »%s«"
 
 #: VirtualMailManager/Config.py:134
 msgid "Enter new value for %s [%s]: "
@@ -130,7 +130,7 @@
 msgid "Unknown tid specified."
 msgstr "Unbekannte tid angegeben."
 
-#: VirtualMailManager/VirtualMailManager.py:55
+#: VirtualMailManager/VirtualMailManager.py:54
 msgid ""
 "fix permissions for '%s'\n"
 "`chmod 0600 %s` would be great."
@@ -138,7 +138,7 @@
 "Bitte Zugriffsrechte für '%s' anpassen\n"
 "`chmod 0600 %s` wäre großartig"
 
-#: VirtualMailManager/VirtualMailManager.py:62
+#: VirtualMailManager/VirtualMailManager.py:61
 msgid ""
 "You are not root.\n"
 "\tGood bye!\n"
@@ -146,27 +146,27 @@
 "Sie sind nicht root\n"
 "\tAuf Wiedersehen\n"
 
-#: VirtualMailManager/VirtualMailManager.py:76
+#: VirtualMailManager/VirtualMailManager.py:75
 msgid "The file »%s« does not exists."
 msgstr "Die Datei »%s« existiert nicht."
 
-#: VirtualMailManager/VirtualMailManager.py:98
+#: VirtualMailManager/VirtualMailManager.py:97
 msgid "%s is not a directory"
 msgstr "%s ist kein Verzeichnis"
 
-#: VirtualMailManager/VirtualMailManager.py:102
+#: VirtualMailManager/VirtualMailManager.py:101
 msgid "%s doesn't exists."
 msgstr "%s existiert nicht."
 
-#: VirtualMailManager/VirtualMailManager.py:105
+#: VirtualMailManager/VirtualMailManager.py:104
 msgid "%s is not executable."
 msgstr "%s ist nicht ausführbar."
 
-#: VirtualMailManager/VirtualMailManager.py:139
+#: VirtualMailManager/VirtualMailManager.py:138
 msgid "The local part is too long"
 msgstr "Der local-part ist zu lang"
 
-#: VirtualMailManager/VirtualMailManager.py:143
+#: VirtualMailManager/VirtualMailManager.py:142
 msgid "The local part »%s« contains invalid characters."
 msgstr "Der local-part »%s« enthält ungültige Zeichen."
 
@@ -174,57 +174,61 @@
 msgid "The domain name is too long."
 msgstr "Der Domain-Name ist zu lang."
 
-#: VirtualMailManager/VirtualMailManager.py:185
+#: VirtualMailManager/VirtualMailManager.py:186
 msgid "The domain name is invalid."
 msgstr "Der Domain-Name ist ungültig."
 
-#: VirtualMailManager/VirtualMailManager.py:193
+#: VirtualMailManager/VirtualMailManager.py:194
 msgid "Missing '@' sign in e-mail address »%s«."
 msgstr "In der E-Mail-Adresse »%s« fehlt das '@'-Zeichen."
 
-#: VirtualMailManager/VirtualMailManager.py:196
+#: VirtualMailManager/VirtualMailManager.py:197
 msgid "»%s« looks not like an e-mail address."
 msgstr "»%s« sieht nicht wie eine E-Mail-Adresse aus."
 
-#: VirtualMailManager/VirtualMailManager.py:291
+#: VirtualMailManager/VirtualMailManager.py:292
 msgid "FATAL: \"..\" in maildir path detected."
 msgstr "FATAL: \"..\" im Pfad zum Maildir entdeckt."
 
-#: VirtualMailManager/VirtualMailManager.py:299
+#: VirtualMailManager/VirtualMailManager.py:300
 msgid "FATAL: owner/group mismatch in maildir detected"
 msgstr "FATAL: Maildir gehört dem/der falschen Benutzer/Gruppe."
 
-#: VirtualMailManager/VirtualMailManager.py:309
+#: VirtualMailManager/VirtualMailManager.py:310
 msgid "FATAL: \"..\" in domain directory path detected."
 msgstr "FATAL: \"..\" im Pfad zum Domain-Verzeichnis entdeckt."
 
-#: VirtualMailManager/VirtualMailManager.py:315
+#: VirtualMailManager/VirtualMailManager.py:316
 msgid "FATAL: group mismatch in domain directory detected"
 msgstr "FATAL: Domain-Verzeichnis gehört der falschen Gruppe"
 
-#: VirtualMailManager/VirtualMailManager.py:393
+#: VirtualMailManager/VirtualMailManager.py:394
 msgid ""
 "Configurtion error: \"%s\"\n"
 "(in section \"connfig\", option \"done\")'\n"
 "see also: vmm.cfg(5)\n"
 msgstr ""
 "Konfigurations Fehler: \"%s\"\n"
-"(in Sektion \"connfig\", Option \"done\")'\n"
+"(im Bereich \"connfig\", Option \"done\")'\n"
 "Siehe auch: vmm.cfg(5)\n"
 
-#: VirtualMailManager/VirtualMailManager.py:412
+#: VirtualMailManager/VirtualMailManager.py:413
 msgid "Invalid section: »%s«"
-msgstr "Ungültiges Sektion: »%s«"
+msgstr "Ungültiger Bereich: »%s«"
 
-#: VirtualMailManager/VirtualMailManager.py:426
-#: VirtualMailManager/VirtualMailManager.py:436
+#: VirtualMailManager/VirtualMailManager.py:427
+#: VirtualMailManager/VirtualMailManager.py:437
 msgid "Invalid argument: »%s«"
 msgstr "Ungültiges Argument: »%s«"
 
-#: VirtualMailManager/VirtualMailManager.py:465
+#: VirtualMailManager/VirtualMailManager.py:466
 msgid "Invalid argument"
 msgstr "Ungültiges Argument"
 
+#: VirtualMailManager/VirtualMailManager.py:484
+msgid "The pattern »%s« contains invalid characters."
+msgstr "Das Muster »%s« enthält ungültige Zeichen."
+
 #: vmm:34
 msgid ""
 "Usage: %s SUBCOMMAND OBJECT ARGS*\n"
@@ -237,95 +241,103 @@
 "  Unterbefehl           Objekt           args (* = optional)\n"
 "\n"
 
-#: vmm:61 vmm:70 vmm:315 vmm:363
+#: vmm:62 vmm:71 vmm:321 vmm:371
 msgid "Error"
 msgstr "Fehler"
 
-#: vmm:80 vmm:360
+#: vmm:81 vmm:368
 msgid "Ouch"
 msgstr "Autsch"
 
-#: vmm:92
+#: vmm:93
 msgid "Enter new password: "
 msgstr "Neues Passwort eingeben: "
 
-#: vmm:95
+#: vmm:96
 msgid "Sorry, empty passwords are not permitted"
 msgstr "Entschuldigung, leere Passwörter sind nicht zulässig"
 
-#: vmm:96
+#: vmm:97
 msgid "Retype new password: "
 msgstr "Neues Passwort wiederholen: "
 
-#: vmm:99
+#: vmm:100
 msgid "Sorry, passwords do not match"
 msgstr "Entschuldigung, die Passwörter stimmen nicht überein"
 
-#: vmm:123
+#: vmm:122
 msgid "information"
 msgstr "Informationen"
 
-#: vmm:133
+#: vmm:132
 msgid "Available"
 msgstr "Verfügbare"
 
-#: vmm:139 vmm:150
+#: vmm:138 vmm:149 vmm:159
 msgid "\tNone"
 msgstr "\tKeine"
 
-#: vmm:143
+#: vmm:142
 msgid "Alias information"
 msgstr "Alias Informationen"
 
-#: vmm:145
+#: vmm:144
 msgid "\tMail for %s goes to:"
 msgstr "\tE-Mails für %s gehen an:"
 
-#: vmm:156 vmm:165 vmm:174
+#: vmm:154
+msgid "Available domains"
+msgstr "Verfügbare Domains"
+
+#: vmm:156
+msgid "Matching domains"
+msgstr "Übereinstimmende Domains"
+
+#: vmm:171 vmm:179 vmm:187
 msgid "Missing domain name."
 msgstr "Kein Domain-Name angegeben."
 
-#: vmm:180
+#: vmm:193
 msgid "accounts"
 msgstr "Accounts"
 
-#: vmm:181
+#: vmm:194
 msgid "aliases"
 msgstr "Aliase"
 
-#: vmm:186
+#: vmm:198
 msgid "Missing domain name and new transport."
 msgstr "Domain-Name und neuer Transport fehlen."
 
-#: vmm:188
+#: vmm:200
 msgid "Missing new transport."
 msgstr "Neuer Transport fehlt."
 
-#: vmm:197 vmm:207 vmm:214 vmm:241 vmm:250 vmm:259
+#: vmm:208 vmm:217 vmm:223 vmm:247 vmm:255 vmm:263
 msgid "Missing e-mail address."
 msgstr "E-Mail-Adresse fehlt."
 
-#: vmm:223
+#: vmm:231
 msgid "Missing e-mail address and users name."
 msgstr "E-Mail-Adresse und der Name des Benutzers fehlen."
 
-#: vmm:225
+#: vmm:233
 msgid "Missing users name."
 msgstr "Name des Benutzers fehlt."
 
-#: vmm:232
+#: vmm:239
 msgid "Missing e-mail address and transport."
 msgstr "E-Mail-Adresse und Transport fehlen."
 
-#: vmm:234
+#: vmm:241
 msgid "Missing transport."
 msgstr "Transport fehlt."
 
-#: vmm:269
+#: vmm:272
 msgid "Missing alias address and destination."
 msgstr "Alias- und Ziel-Adresse fehlen."
 
-#: vmm:276 vmm:283
+#: vmm:278 vmm:284
 msgid "Missing alias address"
 msgstr "Alias-Adresse fehlt."
 
@@ -333,7 +345,7 @@
 msgid "Missing userid"
 msgstr "Keine UID angegeben."
 
-#: vmm:298
+#: vmm:304
 msgid ""
 "\n"
 "Warnings:"
@@ -341,6 +353,6 @@
 "\n"
 "Warnungen:"
 
-#: vmm:357
+#: vmm:365
 msgid "Unknown subcommand"
 msgstr "Unbekannter Unterbefehl"
--- a/po/vmm.pot	Sun May 18 04:51:12 2008 +0000
+++ b/po/vmm.pot	Sun May 25 03:42:42 2008 +0000
@@ -5,7 +5,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2008-05-18 06:21+CEST\n"
+"POT-Creation-Date: 2008-05-25 04:58+CEST\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -132,39 +132,39 @@
 msgid "Unknown tid specified."
 msgstr ""
 
-#: VirtualMailManager/VirtualMailManager.py:55
+#: VirtualMailManager/VirtualMailManager.py:54
 msgid ""
 "fix permissions for '%s'\n"
 "`chmod 0600 %s` would be great."
 msgstr ""
 
-#: VirtualMailManager/VirtualMailManager.py:62
+#: VirtualMailManager/VirtualMailManager.py:61
 msgid ""
 "You are not root.\n"
 "\tGood bye!\n"
 msgstr ""
 
-#: VirtualMailManager/VirtualMailManager.py:76
+#: VirtualMailManager/VirtualMailManager.py:75
 msgid "The file \302\273%s\302\253 does not exists."
 msgstr ""
 
-#: VirtualMailManager/VirtualMailManager.py:98
+#: VirtualMailManager/VirtualMailManager.py:97
 msgid "%s is not a directory"
 msgstr ""
 
-#: VirtualMailManager/VirtualMailManager.py:102
+#: VirtualMailManager/VirtualMailManager.py:101
 msgid "%s doesn't exists."
 msgstr ""
 
-#: VirtualMailManager/VirtualMailManager.py:105
+#: VirtualMailManager/VirtualMailManager.py:104
 msgid "%s is not executable."
 msgstr ""
 
-#: VirtualMailManager/VirtualMailManager.py:139
+#: VirtualMailManager/VirtualMailManager.py:138
 msgid "The local part is too long"
 msgstr ""
 
-#: VirtualMailManager/VirtualMailManager.py:143
+#: VirtualMailManager/VirtualMailManager.py:142
 msgid "The local part \302\273%s\302\253 contains invalid characters."
 msgstr ""
 
@@ -172,54 +172,58 @@
 msgid "The domain name is too long."
 msgstr ""
 
-#: VirtualMailManager/VirtualMailManager.py:185
+#: VirtualMailManager/VirtualMailManager.py:186
 msgid "The domain name is invalid."
 msgstr ""
 
-#: VirtualMailManager/VirtualMailManager.py:193
+#: VirtualMailManager/VirtualMailManager.py:194
 msgid "Missing '@' sign in e-mail address \302\273%s\302\253."
 msgstr ""
 
-#: VirtualMailManager/VirtualMailManager.py:196
+#: VirtualMailManager/VirtualMailManager.py:197
 msgid "\302\273%s\302\253 looks not like an e-mail address."
 msgstr ""
 
-#: VirtualMailManager/VirtualMailManager.py:291
+#: VirtualMailManager/VirtualMailManager.py:292
 msgid "FATAL: \"..\" in maildir path detected."
 msgstr ""
 
-#: VirtualMailManager/VirtualMailManager.py:299
+#: VirtualMailManager/VirtualMailManager.py:300
 msgid "FATAL: owner/group mismatch in maildir detected"
 msgstr ""
 
-#: VirtualMailManager/VirtualMailManager.py:309
+#: VirtualMailManager/VirtualMailManager.py:310
 msgid "FATAL: \"..\" in domain directory path detected."
 msgstr ""
 
-#: VirtualMailManager/VirtualMailManager.py:315
+#: VirtualMailManager/VirtualMailManager.py:316
 msgid "FATAL: group mismatch in domain directory detected"
 msgstr ""
 
-#: VirtualMailManager/VirtualMailManager.py:393
+#: VirtualMailManager/VirtualMailManager.py:394
 msgid ""
 "Configurtion error: \"%s\"\n"
 "(in section \"connfig\", option \"done\")'\n"
 "see also: vmm.cfg(5)\n"
 msgstr ""
 
-#: VirtualMailManager/VirtualMailManager.py:412
+#: VirtualMailManager/VirtualMailManager.py:413
 msgid "Invalid section: \302\273%s\302\253"
 msgstr ""
 
-#: VirtualMailManager/VirtualMailManager.py:426
-#: VirtualMailManager/VirtualMailManager.py:436
+#: VirtualMailManager/VirtualMailManager.py:427
+#: VirtualMailManager/VirtualMailManager.py:437
 msgid "Invalid argument: \302\273%s\302\253"
 msgstr ""
 
-#: VirtualMailManager/VirtualMailManager.py:465
+#: VirtualMailManager/VirtualMailManager.py:466
 msgid "Invalid argument"
 msgstr ""
 
+#: VirtualMailManager/VirtualMailManager.py:484
+msgid "The pattern \302\273%s\302\253 contains invalid characters."
+msgstr ""
+
 #: vmm:34
 msgid ""
 "Usage: %s SUBCOMMAND OBJECT ARGS*\n"
@@ -228,95 +232,103 @@
 "\n"
 msgstr ""
 
-#: vmm:61 vmm:70 vmm:315 vmm:363
+#: vmm:62 vmm:71 vmm:321 vmm:371
 msgid "Error"
 msgstr ""
 
-#: vmm:80 vmm:360
+#: vmm:81 vmm:368
 msgid "Ouch"
 msgstr ""
 
-#: vmm:92
+#: vmm:93
 msgid "Enter new password: "
 msgstr ""
 
-#: vmm:95
+#: vmm:96
 msgid "Sorry, empty passwords are not permitted"
 msgstr ""
 
-#: vmm:96
+#: vmm:97
 msgid "Retype new password: "
 msgstr ""
 
-#: vmm:99
+#: vmm:100
 msgid "Sorry, passwords do not match"
 msgstr ""
 
-#: vmm:123
+#: vmm:122
 msgid "information"
 msgstr ""
 
-#: vmm:133
+#: vmm:132
 msgid "Available"
 msgstr ""
 
-#: vmm:139 vmm:150
+#: vmm:138 vmm:149 vmm:159
 msgid "\tNone"
 msgstr ""
 
-#: vmm:143
+#: vmm:142
 msgid "Alias information"
 msgstr ""
 
-#: vmm:145
+#: vmm:144
 msgid "\tMail for %s goes to:"
 msgstr ""
 
-#: vmm:156 vmm:165 vmm:174
+#: vmm:154
+msgid "Available domains"
+msgstr ""
+
+#: vmm:156
+msgid "Matching domains"
+msgstr ""
+
+#: vmm:171 vmm:179 vmm:187
 msgid "Missing domain name."
 msgstr ""
 
-#: vmm:180
+#: vmm:193
 msgid "accounts"
 msgstr ""
 
-#: vmm:181
+#: vmm:194
 msgid "aliases"
 msgstr ""
 
-#: vmm:186
+#: vmm:198
 msgid "Missing domain name and new transport."
 msgstr ""
 
-#: vmm:188
+#: vmm:200
 msgid "Missing new transport."
 msgstr ""
 
-#: vmm:197 vmm:207 vmm:214 vmm:241 vmm:250 vmm:259
+#: vmm:208 vmm:217 vmm:223 vmm:247 vmm:255 vmm:263
 msgid "Missing e-mail address."
 msgstr ""
 
-#: vmm:223
+#: vmm:231
 msgid "Missing e-mail address and users name."
 msgstr ""
 
-#: vmm:225
+#: vmm:233
 msgid "Missing users name."
 msgstr ""
 
-#: vmm:232
+#: vmm:239
 msgid "Missing e-mail address and transport."
 msgstr ""
 
-#: vmm:234
+#: vmm:241
 msgid "Missing transport."
 msgstr ""
 
-#: vmm:269
+#: vmm:272
 msgid "Missing alias address and destination."
 msgstr ""
 
-#: vmm:276 vmm:283
+#: vmm:278 vmm:284
 msgid "Missing alias address"
 msgstr ""
 
@@ -324,13 +336,13 @@
 msgid "Missing userid"
 msgstr ""
 
-#: vmm:298
+#: vmm:304
 msgid ""
 "\n"
 "Warnings:"
 msgstr ""
 
-#: vmm:357
+#: vmm:365
 msgid "Unknown subcommand"
 msgstr ""
 
--- a/vmm	Sun May 18 04:51:12 2008 +0000
+++ b/vmm	Sun May 25 03:42:42 2008 +0000
@@ -52,6 +52,7 @@
   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
@@ -100,7 +101,6 @@
     return clear0
 
 def _getOrder():
-    global argc
     order = ()
     if sys.argv[1] in ['di', 'domaininfo']:
         order = (('domainname', 0), ('gid', 1), ('transport', 0),
@@ -118,7 +118,6 @@
         order = (('uid', 1), ('gid', 1), ('address', 0))
     return order
 
-
 def _printInfo(info, title):
     msg = '%s %s' % (title, _('information'))
     print '%s\n%s' % (msg, '-'*len(msg))
@@ -150,8 +149,24 @@
         print _('\tNone')
     print
 
+def _printDomList(domains):
+    if argc < 3:
+        msg = _('Available domains')
+    else:
+        msg = _('Matching domains')
+    print '%s\n%s' % (msg, '-'*len(msg))
+    if not len(domains):
+        print _('\tNone')
+    else:
+        for domain in domains:
+            d = domain[0]
+            if not d.startswith('xn--'):
+                print '\t%s' % d
+            else:
+                print "\t%s (%s)" % (d, vmm.ace2idna(d))
+    print
+
 def domain_add():
-    global argc
     if argc < 3:
         usage(EXIT.MISSING_ARGS, _('Missing domain name.'))
     elif argc < 4:
@@ -160,7 +175,6 @@
         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:
@@ -169,7 +183,6 @@
         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:
@@ -181,7 +194,6 @@
         _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:
@@ -192,7 +204,6 @@
         vmm.domain_transport(sys.argv[2].lower(), sys.argv[3], sys.argv[4])
 
 def user_add():
-    global argc
     if argc < 3:
         usage(EXIT.MISSING_ARGS, _('Missing e-mail address.'))
     elif argc < 4:
@@ -202,14 +213,12 @@
     vmm.user_add(sys.argv[2].lower(), password)
 
 def user_delete():
-    global argc
     if argc < 3:
         usage(EXIT.MISSING_ARGS, _('Missing e-mail address.'))
     else:
         vmm.user_delete(sys.argv[2].lower())
 
 def user_info():
-    global argc
     if argc < 3:
         usage(EXIT.MISSING_ARGS, _('Missing e-mail address.'))
     elif argc < 4:
@@ -218,7 +227,6 @@
         _printInfo(vmm.user_info(sys.argv[2].lower(), True), 'Account')
 
 def user_name():
-    global argc
     if argc < 3:
         usage(EXIT.MISSING_ARGS, _('Missing e-mail address and users name.'))
     if argc < 4:
@@ -227,7 +235,6 @@
         vmm.user_name(sys.argv[2].lower(), sys.argv[3])
 
 def user_transport():
-    global argc
     if argc < 3:
         usage(EXIT.MISSING_ARGS, _('Missing e-mail address and transport.'))
     if argc <4:
@@ -236,7 +243,6 @@
         vmm.user_transport(sys.argv[2].lower(), sys.argv[3])
 
 def user_enable():
-    global argc
     if argc < 3:
         usage(EXIT.MISSING_ARGS, _('Missing e-mail address.'))
     elif argc < 4:
@@ -245,7 +251,6 @@
         vmm.user_enable(sys.argv[2].lower(), sys.argv[3].lower())
 
 def user_disable():
-    global argc
     if argc < 3:
         usage(EXIT.MISSING_ARGS, _('Missing e-mail address.'))
     elif argc < 4:
@@ -254,7 +259,6 @@
         vmm.user_disable(sys.argv[2].lower(), sys.argv[3].lower())
 
 def user_password():
-    global argc
     if argc < 3:
         usage(EXIT.MISSING_ARGS, _('Missing e-mail address.'))
     elif argc < 4:
@@ -264,21 +268,18 @@
     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'))
     elif argc < 4:
@@ -287,12 +288,17 @@
         vmm.alias_delete(sys.argv[2].lower(), sys.argv[3].lower())
 
 def user_byID():
-    global argc
     if argc < 3:
         usage(EXIT.MISSING_ARGS, _('Missing userid'))
     else:
         _printInfo(vmm.user_byID(sys.argv[2]), 'Account')
 
+def domain_list():
+    if argc < 3:
+        _printDomList(vmm.domain_list())
+    else:
+        _printDomList(vmm.domain_list(sys.argv[2].lower()))
+
 def showWarnings():
     if vmm.hasWarnings():
         print _('\nWarnings:')
@@ -347,6 +353,8 @@
             alias_delete()
         elif sys.argv[1] in ['gu', 'getuser']:
             user_byID()
+        elif sys.argv[1] in ['ld', 'listdomains']:
+            domain_list()
         elif sys.argv[1] in ['h', 'help']:
             usage()
         elif sys.argv[1] in ['v', 'version']: