:: /Python
: python-module-CFG
Gear Bugs and FR Repocop
python-CFG-0.0.9/ 0000755 0000000 0000000 00000000000 10727607702 0013444 5 ustar 00root root 0000000 0000000 python-CFG-0.0.9/CFG/ 0000755 0000000 0000000 00000000000 10727607702 0014043 5 ustar 00root root 0000000 0000000 python-CFG-0.0.9/CFG/Application.py 0000644 0000000 0000000 00000016202 10727607702 0016661 0 ustar 00root root 0000000 0000000 """
======================================================
Проект: Универсальный конфигуратор
Модуль: Приложение-прототип
Автор: Андрей Орлов
Версия: ${Id: }
------------------------------------------------------
Дата: Mon Nov 19 21:09:12 MSK 2001
======================================================
"""
import sys
import os
import string
import Parser
import CFG
from Exceptions import *
class Application :
""" Универсальный конфигуратор / Приложение-прототип : Простое
приложение -- загружаем конфигурацию из файла в домашнем каталоге и
перекрываем ее командной строкой.
Резервируются следующие ключи :
--verbose - увеличивает счетчик болтливости;
--verbose-stderr- болтовня херачится на stderr, не stdout
--debug - запуск в отладочном режиме;
--help - выводит помощь;
--dump - выводит дамп конфига;
--dump_level - тип дампа конфига;
--exit - выход сразу после загрузки конфигов;
В конфигурации определяется ключик "verbose" & "debug", управляющие
отображением.
"""
def __init__(self,prefix=None,cfg={},cfg_names = ('/etc/','~/.','.')) :
if not prefix :
self.prefix = os.path.splitext(os.path.basename(sys.argv[0]))[0]
else :
self.prefix = prefix
self.cfg = cfg
self.cfg.application = self
self.cfg_names = cfg_names
def verbose(self,fmt,level=1,*argv) :
if len(argv)==1 and type(argv[0]) == type({}) : argv = argv[0]
if level<=self.cfg['verbose-level'] :
std = sys.stdout
if self.cfg['verbose-stderr'] :
std = sys.stderr
std.write( '?V - %s - ' % self.prefix + fmt % argv + "\n")
std.flush()
def warning(self,fmt,level=0,*argv) :
if len(argv)==1 and type(argv[0]) == type({}) : argv = argv[0]
if level<=self.cfg['verbose-level'] :
std = sys.stderr
std.write( '?W - %s - ' % self.prefix + fmt % argv + "\n")
std.flush()
def fatal(self,fmt,level=0,exit=1,*argv) :
if len(argv)==1 and type(argv[0]) == type({}) : argv = argv[0]
if level<=self.cfg['verbose-level'] :
std = sys.stderr
std.write( '?F - %s - ' % self.prefix + fmt % argv + "\n")
std.flush()
sys.exit(1)
def configure(self) :
try :
if 0 == len(filter(lambda x : '--cfg_load'==x[0:len('--cfg_load')],sys.argv[1:])) :
for prefix in self.cfg_names :
try :
fn = os.path.expanduser(string.join((prefix,self.prefix,'rc'),""))
f = open(fn)
except IOError :
continue
self.cfg = self.cfg.duplicate(realm=fn)
Parser.ParseFile(self.cfg,f)
f.close()
self.cfg = self.cfg.duplicate(realm='Environment')
Parser.ParseEnv(self.cfg,self.prefix + '_')
self.cfg = self.cfg.duplicate(realm='Options')
Parser.ParseOpt(self.cfg)
except ConfigError,msg :
self.fatal("%s",0,0,msg)
return 1
def init(self) :
return 1
def main(self,args=None) :
return self.exec_seq(args)
def exec_seq(self,args=None) :
if not args : args = self.cfg.arguments
for item in args :
s = 'arg_'+item
if hasattr(self,s) :
apply(getattr(self,s),(),{})
else :
self.fatal('Неизвестная команда %s',0,1,item)
return 1
def exec_cmd(self,args=None) :
if not args : args = self.cfg.arguments
try :
cmd = 'arg_%s' % args[0]
except IndexError :
self.fatal('Не указано ни одной команды')
if hasattr(self,cmd) :
d = {}
as = []
for item in args[1:] :
try :
a,v = string.split(item,'=',1)
d[a] = v
except :
as.append(item)
try :
return apply(getattr(self,cmd),as,d)
except TypeError,msg :
if self.cfg['debug'] :
raise
self.fatal('Неверный ситаксис команды %s : %s',0,1,args[0],msg)
else :
self.fatal('Неизвестная команда "%s"' % args[0])
def finit(self) :
self.verbose('END Of Application named %s',1,self.prefix)
return 1
def run(self) :
if self.configure() :
if self.cfg.has_key('debug') and self.cfg['debug'] :
self.verbose('Запуск с отладкой')
res = self.init() and self.main() and self.finit()
else :
try :
res = self.init()
except SystemExit :
raise
except KeyboardInterrupt :
self.fatal('Инициализация прервана')
except :
self.fatal('Ошибка во время инициализации')
if res is not None :
try :
try :
res = self.main()
except SystemExit :
raise
except KeyboardInterrupt :
self.fatal('Выполнение прервано')
except :
self.fatal('Ошибка во время выполнения')
finally :
try :
self.finit()
except SystemExit :
raise
except KeyboardInterrupt :
self.fatal('Завершение прервано')
except :
self.fatal('Ошибка во время завершения')
return res
def prnt(self) :
if type(self.cfg) is type({}) :
print '=' * 72
k = self.cfg.keys()
k.sort()
for item in k :
if type(self.cfg[item]) is type('') :
s = '"%s"' % self.cfg[item]
else :
s = str(self.cfg[item])
print "%-40s%-40s" % ("%s = " % item,str(s))
print '=' * 72
else :
self.cfg.prnt()