qmail-valid-addresses: Cope with missing files.
[qmail] / qmail-valid-addresses
CommitLineData
ca51b51d
MW
1#! /usr/bin/python
2
3import os
4import cdb
7651970e 5from errno import *
ca51b51d
MW
6
7def sort(l):
8 l = [] + l
9 l.sort()
10 return l
11class 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 ')')
21class userentry (struct):
22 pass
23
24os.chdir('/var/qmail')
25
26umap = {}
27udb = cdb.init('users/cdb')
28for 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
41del udb
42
43map = {}
44def 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] = '+'
57for 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 70me = open('control/me').readline()
ca51b51d 71
7651970e
MW
72try:
73 for dom in open('control/locals'):
74 if len(dom) and dom[-1] == '\n':
75 dom = dom[:-1]
76 map['@' + dom] = ''
77except IOError, exc:
78 if exc.errno != ENOENT:
79 raise
80 map['@' + me] = ''
81
82try:
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
88except IOError, exc:
89 if exc.errno != ENOENT:
90 raise
ca51b51d
MW
91
92for l in sort(map.keys()):
93 print '%s:%s' % (l, map[l])