--- /dev/null
+#! /usr/bin/python
+
+import os
+import cdb
+
+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(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) > 0 and top[0] == '!':
+ map[l] = '-'
+ 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(os.path.join(u.home, p), u.name + ext)
+ else:
+ addlocal(os.path.join(u.home, qm), u.name, u.dash == '')
+
+for dom in open('control/locals'):
+ if len(dom) and dom[-1] == '\n':
+ dom = dom[:-1]
+ map['@' + dom] = ''
+
+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
+
+for l in sort(map.keys()):
+ print '%s:%s' % (l, map[l])