#! /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])