You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
bforce/contrib/u-srif/lib/uconfig.py

164 lines
4.0 KiB
Python

import gdbm
import string
import os
import ufido
ALIAS_TYPE_NORMAL = 1 # Traditional aliase
ALIAS_TYPE_MAGIC = 2 # "Magic" alias
# TODO: These functions must generate an exception in case of errors
def get_bool(str):
str = string.lower(str)
if str == 'yes' or str == 'true':
return 1
elif str == 'no' or str == 'false':
return 0
return None
def get_size(str):
# TODO: support nice size formats like 64M, 10G
return str
def get_alias(str, type):
args = string.split(str)
if len(args) < 2 or len(args) > 3:
return None
if len(args) == 3:
passwd = args[2]
else:
passwd = None
return Alias(args[0], args[1], passwd, type)
class Alias:
""" Aliases implementation
"""
def __init__(self, name, filename, passwd, type):
""" Alias initialisation
"""
self.name = name
self.filename = filename
self.type = type
def get(self, passwd):
""" Get the list of files to send for this alias
"""
yield = []
if self.type == ALIAS_TYPE_NORMAL:
yield.append(self.filename)
return yield
elif self.type == ALIAS_TYPE_MAGIC:
# Prepare the environment (TODO)
putenv('PASSWORD', passwd)
putenv('ADDRESS', None)
putenv('PROTECTED', 'FALSE')
putenv('LISTED', 'FALSE')
# Execute magic program and process its output
try:
magic = popen(self.filename)
line = magic.readline()
while line:
line = magic.readline()
yield.append(string.strip(line))
if magic.close():
print "Magic return code is non-zero: ", self.filename
return None
return yield
except IOError:
print "Failed to run magic: ", self.filename
return None
class Config:
def read_dir_list(self):
yield = []
fp = open(self.dir_list_file, 'r')
line = fp.readline()
while line:
line = string.strip(line)
if line != '':
yield.append(line)
line = fp.readline()
fp.close()
return yield
def read_alias_list(self):
yield = []
fp = open(self.alias_list_file, 'r')
line = fp.readline()
while line:
line = string.strip(line)
if line != '':
[name, filename] = string.split(line, None, 1)
yield.append(alias(name, filename))
line = fp.readline()
fp.close()
return yield
def read(self, name):
fp = open(name, 'r')
line = fp.readline()
while line:
line = string.strip(line)
args = string.split(line, None, 1)
if line[0:1] == '#' or len(line) == 0:
pass
elif len(args) != 2:
print "Invalid string in config: ", line
else:
key = string.lower(args[0])
val = args[1]
if key == 'dir-list-file':
self.dir_list_file = val
elif key == 'send-report':
self.send_report = get_bool(val)
elif key == 'limit-size-day':
self.limit_size_day = get_size(val)
elif key == 'limit-size-week':
self.limit_size_week = get_size(val)
elif key == 'limit-size-month':
self.limit_size_month = get_size(val)
elif key == 'spool-dir':
self.spool_dir = val
elif key == 'freq-alias':
self.freq_alias.append(get_alias(val, ALIAS_TYPE_NORMAL))
elif key == 'freq-magic':
self.freq_magic.append(get_alias(val, ALIAS_TYPE_MAGIC))
elif key == 'log-file':
self.log_file = val
elif key == 'local-address':
self.local_address.parse(var)
elif key == 'report-header':
self.report_header = val
elif key == 'report-footer':
self.report_footer = val
elif key == 'report-from':
self.report_from = val
elif key == 'report-subj':
self.report_subj = val
elif key == 'stat-dbase':
self.stat_dbase = val
else:
print "unknown config keyword:", key
line = fp.readline()
fp.close()
def __init__(self, name):
self.dir_list_file = ''
self.send_report = 0
self.limit_size_day = 0
self.limit_size_week = 0
self.limit_size_month = 0
self.spool_dir = ''
self.freq_policy = ''
self.freq_alias = []
self.freq_magic = []
self.log_file = ''
self.local_address = ufido.address()
self.report_header = ''
self.report_footer = ''
self.report_from = 'FREQ manager'
self.report_subj = 'FREQ report'
self.stat_dbase = None
self.read(name)