1
2import gdbm
3import string
4import os
5import ufido
6
7ALIAS_TYPE_NORMAL = 1	# Traditional aliase
8ALIAS_TYPE_MAGIC  = 2	# "Magic" alias
9
10# TODO: These functions must generate an exception in case of errors
11def get_bool(str):
12	str = string.lower(str)
13	if str == 'yes' or str == 'true':
14		return 1
15	elif str == 'no' or str == 'false':
16		return 0
17	return None
18
19def get_size(str):
20	# TODO: support nice size formats like 64M, 10G
21	return str
22
23def get_alias(str, type):
24	args = string.split(str)
25	if len(args) < 2 or len(args) > 3:
26		return None
27	if len(args) == 3:
28		passwd = args[2]
29	else:
30		passwd = None
31	return Alias(args[0], args[1], passwd, type)
32
33class Alias:
34	""" Aliases implementation
35	"""
36	def __init__(self, name, filename, passwd, type):
37		""" Alias initialisation
38		"""
39		self.name = name
40		self.filename = filename
41		self.type = type
42
43	def get(self, passwd):
44		""" Get the list of files to send for this alias
45		"""
46		yield = []
47		if self.type == ALIAS_TYPE_NORMAL:
48			yield.append(self.filename)
49			return yield
50		elif self.type == ALIAS_TYPE_MAGIC:
51			# Prepare the environment (TODO)
52			putenv('PASSWORD', passwd)
53			putenv('ADDRESS', None)
54			putenv('PROTECTED', 'FALSE')
55			putenv('LISTED', 'FALSE')
56			# Execute magic program and process its output
57			try:
58				magic = popen(self.filename)
59				line = magic.readline()
60				while line:
61					line = magic.readline()
62					yield.append(string.strip(line))
63				if magic.close():
64					print "Magic return code is non-zero: ", self.filename
65					return None
66				return yield
67			except IOError:
68				print "Failed to run magic: ", self.filename
69		return None
70
71class Config:
72	def read_dir_list(self):
73		yield = []
74		fp = open(self.dir_list_file, 'r')
75		line = fp.readline()
76		while line:
77			line = string.strip(line)
78			if line != '':
79				yield.append(line)
80			line = fp.readline()
81		fp.close()
82		return yield
83
84	def read_alias_list(self):
85		yield = []
86		fp = open(self.alias_list_file, 'r')
87		line = fp.readline()
88		while line:
89			line = string.strip(line)
90			if line != '':
91				[name, filename] = string.split(line, None, 1)
92				yield.append(alias(name, filename))
93			line = fp.readline()
94		fp.close()
95		return yield
96
97	def read(self, name):
98		fp = open(name, 'r')
99		line = fp.readline()
100		while line:
101			line = string.strip(line)
102			args = string.split(line, None, 1)
103			if line[0:1] == '#' or len(line) == 0:
104				pass
105			elif len(args) != 2:
106				print "Invalid string in config: ", line
107			else:
108				key = string.lower(args[0])
109				val = args[1]
110				if key == 'dir-list-file':
111					self.dir_list_file = val
112				elif key == 'send-report':
113					self.send_report = get_bool(val)
114				elif key == 'limit-size-day':
115					self.limit_size_day = get_size(val)
116				elif key == 'limit-size-week':
117					self.limit_size_week = get_size(val)
118				elif key == 'limit-size-month':
119					self.limit_size_month = get_size(val)
120				elif key == 'spool-dir':
121					self.spool_dir = val
122				elif key == 'freq-alias':
123					self.freq_alias.append(get_alias(val, ALIAS_TYPE_NORMAL))
124				elif key == 'freq-magic':
125					self.freq_magic.append(get_alias(val, ALIAS_TYPE_MAGIC))
126				elif key == 'log-file':
127					self.log_file = val
128				elif key == 'local-address':
129					self.local_address.parse(var)
130				elif key == 'report-header':
131					self.report_header = val
132				elif key == 'report-footer':
133					self.report_footer = val
134				elif key == 'report-from':
135					self.report_from = val
136				elif key == 'report-subj':
137					self.report_subj = val
138				elif key == 'stat-dbase':
139					self.stat_dbase = val
140				else:
141					print "unknown config keyword:", key
142			line = fp.readline()
143		fp.close()
144
145	def __init__(self, name):
146		self.dir_list_file = ''
147		self.send_report = 0
148		self.limit_size_day = 0
149		self.limit_size_week = 0
150		self.limit_size_month = 0
151		self.spool_dir = ''
152		self.freq_policy = ''
153		self.freq_alias = []
154		self.freq_magic = []
155		self.log_file = ''
156		self.local_address = ufido.address()
157		self.report_header = ''
158		self.report_footer = ''
159		self.report_from = 'FREQ manager'
160		self.report_subj = 'FREQ report'
161		self.stat_dbase = None
162		self.read(name)
163
164