################################################## # SPYCE - Python-based HTML Scripting # Copyright (c) 2002 Rimon Barr. # # Refer to spyce.py # CVS: $Id: spyceConfig.py 31144 2012-07-15 15:38:56Z buzz $ ################################################## import sys, os, string, ConfigParser import spyceException ################################################## # Constants # SPYCE_CONCURRENCY_SINGLE = 0 SPYCE_CONCURRENCY_FORK = 1 SPYCE_CONCURRENCY_THREAD = 2 SPYCE_CONFIG_LOCATIONS = [ '/etc', ] SPYCE_CONFIG_FILENAME = 'spyce.conf' SPYCE_HOME = None ################################################## # determine HOME (installation) directory # if SPYCE_HOME == None: try: SPYCE_HOME = os.path.abspath(os.path.dirname(sys.modules['spyceConfig'].__file__)) except: for p in sys.path: path = os.path.join(p, 'spyceConfig.py') if os.path.exists(path): SPYCE_HOME = os.path.abspath(p) break if not SPYCE_HOME: raise 'unable to determine Spyce home directory' ################################################## # Server configuration object # class spyceConfig: def __init__(self, file=None, overide_path=None, overide_import=None, overide_error=None, overide_pageerror=None, overide_globals=None, overide_debug=None, default_concurrency=None, # no concurrency overide_concurrency=None, overide_cache=None, default_www_root='.', # serve from current directory overide_www_root=None, default_www_port=80, # default HTTP overide_www_port=None, default_www_handler={ 'spy': 'spyce', None: 'dump', }, default_www_mime = [os.path.join(SPYCE_HOME,'spyce.mime')], ): self.file = file self._procesed = 0 # config parameters self.spyce_config = None # spyce configuration dictionary self.spyce_path = None # spyce module search path self.spyce_import = None # python modules loaded at startup self.spyce_error = None # spyce engine-level error handler self.spyce_pageerror = None # spyce page-level error handler self.spyce_globals = {} # spyce engine globals dictionary self.spyce_debug = None # spyce engine debug flag self.spyce_concurrency = None # concurrency model self.spyce_www_root = None # root directory for spyce web server self.spyce_www_port = None # port used by spyce web server self.spyce_www_mime = None # files with Apache-like mime type listings self.spyce_www_handler = None # assign handlers by extension # store overides and defaults self.overide_path = overide_path self.overide_import = overide_import self.overide_error = overide_error self.overide_pageerror = overide_pageerror self.overide_globals = overide_globals self.overide_debug = overide_debug self.overide_concurrency = overide_concurrency self.default_concurrency = default_concurrency self.overide_cache = overide_cache self.default_www_root = default_www_root self.overide_www_root = overide_www_root self.default_www_port = default_www_port self.overide_www_port = overide_www_port self.default_www_handler = default_www_handler self.default_www_mime = default_www_mime def process(self): # process (order matters here!) self.processConfigFile() self.processSpycePath() self.processSpyceDebug() self.processSpyceGlobals() self.processSpyceImport() self.processSpyceError() self.processSpyceConcurrency() self.processSpyceCache() self.processSpyceWWW() # accessors def getSpyceHome(self): return SPYCE_HOME def getSpycePath(self): return self.spyce_path def getSpyceImport(self): return self.spyce_import def getSpyceError(self): return self.spyce_error def getSpycePageError(self): return self.spyce_pageerror def getSpyceGlobals(self): return self.spyce_globals def getSpyceDebug(self): return self.spyce_debug def getSpyceConcurrency(self): return self.spyce_concurrency def getSpyceCache(self): return self.spyce_cache def getSpyceWWWRoot(self): return self.spyce_www_root def getSpyceWWWPort(self): return self.spyce_www_port def getSpyceWWWHandler(self): return self.spyce_www_handler def getSpyceWWWMime(self): return self.spyce_www_mime def __repr__(self): return \ '''path: %(path)s import: %(import)s error: %(error)s globals: %(globals)s debug: %(debug)s concurrency: %(concurrency)s cache: %(cache)s www root: %(wwwroot)s www port: %(wwwport)s www mime: %(wwwmime)s www handler: %(wwwhandler)s ''' % { 'path': self.spyce_path, 'import': self.spyce_import, 'error': self.spyce_error, 'pageerror': self.spyce_pageerror, 'globals': self.spyce_globals, 'debug': self.spyce_debug, 'concurrency': self.spyce_concurrency, 'cache': self.spyce_cache, 'wwwroot': self.spyce_www_root, 'wwwport': self.spyce_www_port, 'wwwmime': self.spyce_www_mime, 'wwwhandler': self.spyce_www_handler, } # configuration processing def processConfigFile(self): # config file self.spyce_config = {} if not self.file: self.file = self.findConfigFile() if self.file: if not os.path.exists(self.file): raise spyceException.spyceNotFound(self.file) if not os.access(self.file, os.R_OK): raise spyceException.spyceForbidden(self.file) self.spyce_config = self.parseConfigFile() def processSpycePath(self, mod_path=None): def processSpycePathString(str, self=self): dpath = filter(None, map(string.strip, string.split(str, os.pathsep))) for i in range(len(dpath)): dpath[i] = os.path.abspath(dpath[i]) self.spyce_path = self.spyce_path + dpath sys.path = sys.path + dpath def filterPath(path): path2 = [] for p in path: if p not in path2: path2.append(p) return path2 self.spyce_path = [ os.path.join(SPYCE_HOME, 'modules'), os.path.join(SPYCE_HOME, 'tags'), ] if mod_path: processSpycePathString(mod_path) if self.spyce_config.has_key('path') and not self.overide_path: processSpycePathString(self.spyce_config['path']) if self.overide_path: processSpycePathString(overide_path) else: if (self.spyce_config and not self.spyce_config.has_key('path')) and os.environ.has_key('SPYCE_PATH'): processSpycePathString(os.environ['SPYCE_PATH']) self.spyce_path = filterPath(self.spyce_path) sys.path = filterPath(sys.path) def processSpyceImport(self): self.spyce_import = [] if self.spyce_config.has_key('import'): new_import = filter(None, map(string.strip, string.split(self.spyce_config['import'], ','))) self.spyce_import = self.spyce_import + new_import if self.overide_import: new_import = filter(None, map(string.strip, string.split(self.overide_import, ','))) self.spyce_import = self.spyce_import + new_import for i in self.spyce_import: exec('import %s'%i) def processSpyceError(self): # server-level self.spyce_error = 'error:serverHandler' if self.spyce_config.has_key('error'): self.spyce_error = self.spyce_config['error'] if self.overide_error: self.spyce_error = self.overide_error self.spyce_error = string.split(self.spyce_error, ':') if len(self.spyce_error)==1: raise 'invalid error handler specification (file:function)' # page-level self.spyce_pageerror = 'string:error:defaultErrorTemplate' if self.spyce_config.has_key('pageerror'): self.spyce_pageerror = self.spyce_config['pageerror'] if self.overide_pageerror: self.spyce_pageerror = self.overide_pageerror self.spyce_pageerror = string.split(self.spyce_pageerror, ':') if (len(self.spyce_pageerror)<2 or self.spyce_pageerror[0] not in ('string', 'file')): raise 'invalid pageerror handler specification ("string":module:variable, or ("file":file)' def processSpyceGlobals(self): self.spyce_globals.clear () if self.spyce_config.has_key('globals'): for k in self.spyce_config['globals'].keys(): self.spyce_globals[k] = self.spyce_config['globals'][k] if self.overide_globals: for k in self.overide_globals.keys(): self.spyce_globals[k] = self.overide_globals[k] for k in self.spyce_globals.keys(): self.spyce_globals[k] = eval(self.spyce_globals[k]) def processSpyceDebug(self): self.spyce_debug = 0 if self.spyce_config.has_key('debug'): self.spyce_debug = string.strip(string.lower(self.spyce_config['debug'])) not in ('0', 'false', 'no') if self.overide_debug: self.spyce_debug = 1 def processSpyceConcurrency(self): self.spyce_concurrency = SPYCE_CONCURRENCY_SINGLE if self.default_concurrency!=None: self.spyce_concurrency = self.default_concurrency if self.spyce_config.has_key('concurrency'): self.spyce_concurrency = string.lower(self.spyce_config['concurrency']) if self.spyce_concurrency in ('thread', 'threading'): self.spyce_concurrency = SPYCE_CONCURRENCY_THREAD elif self.spyce_concurrency in ('fork', 'forking'): self.spyce_concurrency = SPYCE_CONCURRENCY_FORK else: self.spyce_concurrency = SPYCE_CONCURRENCY_SINGLE if self.overide_concurrency!=None: self.spyce_concurrency = self.overide_concurrency def processSpyceCache(self): cache = 'memory' if self.spyce_config.has_key('cache'): cache = self.spyce_config['cache'] cache = string.split(cache, ':') self.spyce_cache = string.strip(string.lower(cache[0])), string.join(cache[1:], ':') def processSpyceWWW(self): # root self.spyce_www_root = self.default_www_root if self.spyce_config.has_key('www_root'): self.spyce_www_root = self.spyce_config['www_root'] if self.overide_www_root!=None: self.spyce_www_root = self.overide_www_root # port self.spyce_www_port = self.default_www_port if self.spyce_config.has_key('www_port'): self.spyce_www_port = int(self.spyce_config['www_port']) if self.overide_www_port!=None: self.spyce_www_port = int(self.overide_www_port) # mime self.spyce_www_mime = self.default_www_mime if self.spyce_config.has_key('www_mime'): mime = self.spyce_config['www_mime'] mime = map(string.strip, string.split(mime, ',')) self.spyce_www_mime = self.spyce_www_mime + mime # handler self.spyce_www_handler = self.default_www_handler if self.spyce_config.has_key('www_handler'): handler = self.spyce_config['www_handler'] for k in handler.keys(): self.spyce_www_handler[k] = handler[k] # helpers def findConfigFile(self): locations = [SPYCE_HOME] + SPYCE_CONFIG_LOCATIONS for l in locations: p = os.path.join(l, SPYCE_CONFIG_FILENAME) if os.path.exists(p): return p def parseConfigFile(self): # initial defaults path = None load = None error = None pageerror = None globals = None debug = None concurrency = None cache = None www_root = None www_port = None www_mime = None www_handler = {} cfg = ConfigParser.ConfigParser() # parse cfg.read(self.file) if cfg.has_section('spyce'): if 'path' in cfg.options('spyce'): path = cfg.get('spyce', 'path') if 'import' in cfg.options('spyce'): load = cfg.get('spyce', 'import') if 'error' in cfg.options('spyce'): error = cfg.get('spyce', 'error') if 'pageerror' in cfg.options('spyce'): pageerror = cfg.get('spyce', 'pageerror') if 'debug' in cfg.options('spyce'): debug = cfg.get('spyce', 'debug') if 'concurrency' in cfg.options('spyce'): concurrency = cfg.get('spyce', 'concurrency') if 'cache' in cfg.options('spyce'): cache = cfg.get('spyce', 'cache') if cfg.has_section('globals'): globals = {} for o in cfg.options('globals'): if o=='__name__': continue globals[o] = cfg.get('globals', o) if cfg.has_section('www'): for o in cfg.options('www'): if o=='__name__': continue if o=='root': www_root = cfg.get('www', o) continue if o=='port': www_port = cfg.get('www', o) continue if o=='mime': www_mime = cfg.get('www', o) continue if o[:len('ext_')]=='ext_': ext = o[len('ext_'):] if not ext: ext = None www_handler[ext] = cfg.get('www', o) # results config = {} if path!=None: config['path'] = path if load!=None: config['import'] = load if error!=None: config['error'] = error if pageerror!=None: config['pageerror'] = pageerror if globals!=None: config['globals'] = globals if debug!=None: config['debug'] = debug if concurrency!=None: config['concurrency'] = concurrency if cache!=None: config['cache'] = cache if www_root!=None: config['www_root'] = www_root if www_port!=None: config['www_port'] = www_port if www_mime!=None: config['www_mime'] = www_mime if www_handler!={}: config['www_handler'] = www_handler return config