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