11 class struct (object):
12 def __init__(me
, **kw
):
13 me
.__dict__
.update(kw
)
15 return (type(me
).__name__
+
17 ', '.join(['%s = %r' %
(k
, me
.__dict__
[k
])
21 class userentry (struct
):
24 os
.chdir('/var/qmail')
27 udb
= cdb
.init('users/cdb')
29 if len(k
) == 0 or k
[0] != '!':
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])
44 def addlocal(u
, p
, l
, forcep
= False):
46 p
= os
.path
.join(u
.home
, p
)
47 if not os
.path
.exists(p
):
51 qm
= file(os
.path
.join(u
.home
, p
)).readline()
52 if len(qm
) > 1 and qm
[0:2] == '#!':
54 elif len(qm
) > 1 and qm
[0:2] == '#?':
60 def allfiles(pre
, dir):
61 for f
in os
.listdir(dir):
62 ff
= os
.path
.join(dir, f
)
64 for sub
in allfiles(f
, ff
):
66 elif os
.path
.isfile(ff
):
69 def qmfiles(pre
, dir):
70 for f
in os
.listdir(dir):
71 if not f
.startswith(pre
):
73 ff
= os
.path
.join(dir, f
)
75 for sub
in allfiles(f
, ff
):
77 elif os
.path
.isfile(ff
):
80 for k
in sort(umap
.keys()):
88 qm
= '.qmail' + u
.dash
+ u
.pre
92 for p
in qmfiles(qm
, u
.home
):
94 addlocal(u
, p
, u
.name
+ ext
)
98 addlocal(u
, qm
, u
.name
, u
.dash
== '')
102 me
= open('control/me').readline()
105 for dom
in open('control/locals'):
106 if len(dom
) and dom
[-1] == '\n':
110 if exc
.errno
!= ENOENT
:
115 for v
in open('control/virtualdomains'):
116 if len(v
) and v
[-1] == '\n':
118 (addr
, pre
) = v
.split(':', 2)
119 map['V' + addr
] = pre
121 if exc
.errno
!= ENOENT
:
124 for l
in sort(map.keys()):
125 print '%s:%s' %
(l
, map[l
])