Merge branch 'mdw/addrcheck'
[qmail] / qmail-valid-addresses
diff --git a/qmail-valid-addresses b/qmail-valid-addresses
new file mode 100644 (file)
index 0000000..d43cf85
--- /dev/null
@@ -0,0 +1,98 @@
+#! /usr/bin/python
+
+import os
+import cdb
+from errno import *
+
+def sort(l):
+  l = [] + l
+  l.sort()
+  return l
+class struct (object):
+  def __init__(me, **kw):
+    me.__dict__.update(kw)
+  def __repr__(me):
+    return (type(me).__name__ +
+            '(' +
+            ', '.join(['%s = %r' % (k, me.__dict__[k])
+                       for k in me.__dict__
+                       if k[0] != '_']) +
+            ')')
+class userentry (struct):
+  pass
+
+os.chdir('/var/qmail')
+
+umap = {}
+udb = cdb.init('users/cdb')
+for k in udb.keys():
+  if len(k) == 0 or k[0] != '!':
+    continue
+  v = udb[k].split('\0')
+  u = userentry(user = v[0], uid = int(v[1]), gid = int(v[2]), home = v[3],
+                dash = v[4], pre = v[5])
+  if k[-1] == '\0':
+    u.name = k[1:-1]
+    u.wild = 0
+  else:
+    u.name = k[1:]
+    u.wild = 1
+  umap[u.name] = u
+del udb
+
+map = {}
+def addlocal(u, p, l, forcep = False):
+  l = 'L' + l
+  if not os.path.exists(p):
+    if forcep:
+      map[l] = '+'
+    return
+  f = open(p)
+  top = f.readline()
+  f.close()
+  if len(top) > 1 and top[0:2] == '#!':
+    map[l] = '-'
+  elif len(top) > 1 and top[0:2] == '#?':
+    name = u.name
+    if name[-1] == '-':
+      name = name[:-1]
+    map[l] = '?' + name
+  else:
+    map[l] = '+'
+for k in sort(umap.keys()):
+  u = umap[k]
+  qm = '.qmail' + u.dash + u.pre
+  qmlen = len(qm)
+  if u.wild:
+    for p in os.listdir(u.home):
+      if not p.startswith(qm):
+        continue
+      ext = p[qmlen:]
+      addlocal(u, os.path.join(u.home, p), u.name + ext)
+  else:
+    addlocal(u, os.path.join(u.home, qm), u.name, u.dash == '')
+
+me = open('control/me').readline()
+
+try:
+  for dom in open('control/locals'):
+    if len(dom) and dom[-1] == '\n':
+      dom = dom[:-1]
+    map['@' + dom] = ''
+except IOError, exc:
+  if exc.errno != ENOENT:
+    raise
+  map['@' + me] = ''
+
+try:
+  for v in open('control/virtualdomains'):
+    if len(v) and v[-1] == '\n':
+      v = v[:-1]
+    (addr, pre) = v.split(':', 2)
+    map['V' + addr] = pre
+except IOError, exc:
+  if exc.errno != ENOENT:
+    raise
+
+for l in sort(map.keys()):
+  print '%s:%s' % (l, map[l])