Commit | Line | Data |
---|---|---|
ca51b51d MW |
1 | #! /usr/bin/python |
2 | ||
3 | import os | |
4 | import cdb | |
7651970e | 5 | from errno import * |
ca51b51d MW |
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 = {} | |
0a045fc1 | 44 | def addlocal(u, p, l, forcep = False): |
ca51b51d MW |
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() | |
0a045fc1 | 53 | if len(top) > 1 and top[0:2] == '#!': |
ca51b51d | 54 | map[l] = '-' |
0a045fc1 MW |
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 | |
ca51b51d MW |
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:] | |
0a045fc1 | 71 | addlocal(u, os.path.join(u.home, p), u.name + ext) |
ca51b51d | 72 | else: |
0a045fc1 | 73 | addlocal(u, os.path.join(u.home, qm), u.name, u.dash == '') |
ca51b51d | 74 | |
7651970e | 75 | me = open('control/me').readline() |
ca51b51d | 76 | |
7651970e MW |
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 | |
ca51b51d MW |
96 | |
97 | for l in sort(map.keys()): | |
98 | print '%s:%s' % (l, map[l]) |