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