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 = {} | |
44 | def addlocal(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) > 0 and top[0] == '!': | |
54 | map[l] = '-' | |
55 | else: | |
56 | map[l] = '+' | |
57 | for k in sort(umap.keys()): | |
58 | u = umap[k] | |
59 | qm = '.qmail' + u.dash + u.pre | |
60 | qmlen = len(qm) | |
61 | if u.wild: | |
62 | for p in os.listdir(u.home): | |
63 | if not p.startswith(qm): | |
64 | continue | |
65 | ext = p[qmlen:] | |
66 | addlocal(os.path.join(u.home, p), u.name + ext) | |
67 | else: | |
68 | addlocal(os.path.join(u.home, qm), u.name, u.dash == '') | |
69 | ||
7651970e | 70 | me = open('control/me').readline() |
ca51b51d | 71 | |
7651970e MW |
72 | try: |
73 | for dom in open('control/locals'): | |
74 | if len(dom) and dom[-1] == '\n': | |
75 | dom = dom[:-1] | |
76 | map['@' + dom] = '' | |
77 | except IOError, exc: | |
78 | if exc.errno != ENOENT: | |
79 | raise | |
80 | map['@' + me] = '' | |
81 | ||
82 | try: | |
83 | for v in open('control/virtualdomains'): | |
84 | if len(v) and v[-1] == '\n': | |
85 | v = v[:-1] | |
86 | (addr, pre) = v.split(':', 2) | |
87 | map['V' + addr] = pre | |
88 | except IOError, exc: | |
89 | if exc.errno != ENOENT: | |
90 | raise | |
ca51b51d MW |
91 | |
92 | for l in sort(map.keys()): | |
93 | print '%s:%s' % (l, map[l]) |