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