--- /dev/null
+#! /usr/bin/python
+
+import os
+import cdb
+from errno import *
+
+def sort(l):
+ l = [] + l
+ l.sort()
+ return l
+class struct (object):
+ def __init__(me, **kw):
+ me.__dict__.update(kw)
+ def __repr__(me):
+ return (type(me).__name__ +
+ '(' +
+ ', '.join(['%s = %r' % (k, me.__dict__[k])
+ for k in me.__dict__
+ if k[0] != '_']) +
+ ')')
+class userentry (struct):
+ pass
+
+os.chdir('/var/qmail')
+
+umap = {}
+udb = cdb.init('users/cdb')
+for k in udb.keys():
+ if len(k) == 0 or k[0] != '!':
+ continue
+ v = udb[k].split('\0')
+ u = userentry(user = v[0], uid = int(v[1]), gid = int(v[2]), home = v[3],
+ dash = v[4], pre = v[5])
+ if k[-1] == '\0':
+ u.name = k[1:-1]
+ u.wild = 0
+ else:
+ u.name = k[1:]
+ u.wild = 1
+ umap[u.name] = u
+del udb
+
+map = {}
+def addlocal(u, p, l, forcep = False):
+ l = 'L' + l
+ if not os.path.exists(p):
+ if forcep:
+ map[l] = '+'
+ return
+ f = open(p)
+ top = f.readline()
+ f.close()
+ if len(top) > 1 and top[0:2] == '#!':
+ map[l] = '-'
+ elif len(top) > 1 and top[0:2] == '#?':
+ name = u.name
+ if name[-1] == '-':
+ name = name[:-1]
+ map[l] = '?' + name
+ else:
+ map[l] = '+'
+for k in sort(umap.keys()):
+ u = umap[k]
+ qm = '.qmail' + u.dash + u.pre
+ qmlen = len(qm)
+ if u.wild:
+ for p in os.listdir(u.home):
+ if not p.startswith(qm):
+ continue
+ ext = p[qmlen:]
+ addlocal(u, os.path.join(u.home, p), u.name + ext)
+ else:
+ addlocal(u, os.path.join(u.home, qm), u.name, u.dash == '')
+
+me = open('control/me').readline()
+
+try:
+ for dom in open('control/locals'):
+ if len(dom) and dom[-1] == '\n':
+ dom = dom[:-1]
+ map['@' + dom] = ''
+except IOError, exc:
+ if exc.errno != ENOENT:
+ raise
+ map['@' + me] = ''
+
+try:
+ for v in open('control/virtualdomains'):
+ if len(v) and v[-1] == '\n':
+ v = v[:-1]
+ (addr, pre) = v.split(':', 2)
+ map['V' + addr] = pre
+except IOError, exc:
+ if exc.errno != ENOENT:
+ raise
+
+for l in sort(map.keys()):
+ print '%s:%s' % (l, map[l])