| 1 | #! /usr/bin/python |
| 2 | |
| 3 | import os |
| 4 | import cdb |
| 5 | from errno import * |
| 6 | |
| 7 | def sort(l): |
| 8 | l = [] + l |
| 9 | l.sort() |
| 10 | return l |
| 11 | class struct (object): |
| 12 | def __init__(me, **kw): |
| 13 | me.__dict__.update(kw) |
| 14 | def __repr__(me): |
| 15 | return (type(me).__name__ + |
| 16 | '(' + |
| 17 | ', '.join(['%s = %r' % (k, me.__dict__[k]) |
| 18 | for k in me.__dict__ |
| 19 | if k[0] != '_']) + |
| 20 | ')') |
| 21 | class userentry (struct): |
| 22 | pass |
| 23 | |
| 24 | os.chdir('/var/qmail') |
| 25 | |
| 26 | umap = {} |
| 27 | udb = cdb.init('users/cdb') |
| 28 | for k in udb.keys(): |
| 29 | if len(k) == 0 or k[0] != '!': |
| 30 | continue |
| 31 | v = udb[k].split('\0') |
| 32 | u = userentry(user = v[0], uid = int(v[1]), gid = int(v[2]), home = v[3], |
| 33 | dash = v[4], pre = v[5]) |
| 34 | if k[-1] == '\0': |
| 35 | u.name = k[1:-1] |
| 36 | u.wild = 0 |
| 37 | else: |
| 38 | u.name = k[1:] |
| 39 | u.wild = 1 |
| 40 | umap[u.name] = u |
| 41 | del udb |
| 42 | |
| 43 | map = {} |
| 44 | def addlocal(u, p, l, forcep = False): |
| 45 | l = 'L' + l |
| 46 | if not os.path.exists(p): |
| 47 | if forcep: |
| 48 | map[l] = '+' |
| 49 | return |
| 50 | f = open(p) |
| 51 | top = f.readline() |
| 52 | f.close() |
| 53 | if len(top) > 1 and top[0:2] == '#!': |
| 54 | map[l] = '-' |
| 55 | elif len(top) > 1 and top[0:2] == '#?': |
| 56 | name = u.name |
| 57 | if name[-1] == '-': |
| 58 | name = name[:-1] |
| 59 | map[l] = '?' + name |
| 60 | else: |
| 61 | map[l] = '+' |
| 62 | for k in sort(umap.keys()): |
| 63 | u = umap[k] |
| 64 | qm = '.qmail' + u.dash + u.pre |
| 65 | qmlen = len(qm) |
| 66 | if u.wild: |
| 67 | for p in os.listdir(u.home): |
| 68 | if not p.startswith(qm): |
| 69 | continue |
| 70 | ext = p[qmlen:] |
| 71 | addlocal(u, os.path.join(u.home, p), u.name + ext) |
| 72 | else: |
| 73 | addlocal(u, os.path.join(u.home, qm), u.name, u.dash == '') |
| 74 | |
| 75 | me = open('control/me').readline() |
| 76 | |
| 77 | try: |
| 78 | for dom in open('control/locals'): |
| 79 | if len(dom) and dom[-1] == '\n': |
| 80 | dom = dom[:-1] |
| 81 | map['@' + dom] = '' |
| 82 | except IOError, exc: |
| 83 | if exc.errno != ENOENT: |
| 84 | raise |
| 85 | map['@' + me] = '' |
| 86 | |
| 87 | try: |
| 88 | for v in open('control/virtualdomains'): |
| 89 | if len(v) and v[-1] == '\n': |
| 90 | v = v[:-1] |
| 91 | (addr, pre) = v.split(':', 2) |
| 92 | map['V' + addr] = pre |
| 93 | except IOError, exc: |
| 94 | if exc.errno != ENOENT: |
| 95 | raise |
| 96 | |
| 97 | for l in sort(map.keys()): |
| 98 | print '%s:%s' % (l, map[l]) |