diff -r b4ffcea3275b -r 92ea410806fe server/serverconfig.py --- a/server/serverconfig.py Fri Jun 12 16:31:32 2009 +0200 +++ b/server/serverconfig.py Fri Jun 12 16:33:19 2009 +0200 @@ -10,14 +10,50 @@ import os from os.path import join, exists -from logilab.common.configuration import Method +from logilab.common.configuration import Method, Configuration, \ + ini_format_section from logilab.common.decorators import wproperty, cached, clear_cache from cubicweb import CW_SOFTWARE_ROOT, RegistryNotFound -from cubicweb.toolsutils import env_path, read_config +from cubicweb.toolsutils import env_path, read_config, restrict_perms_to_user from cubicweb.cwconfig import CubicWebConfiguration, merge_options +def generate_sources_file(sourcesfile, sourcescfg, keys=None): + """serialize repository'sources configuration into a INI like file + + the `keys` parameter may be used to sort sections + """ + if keys is None: + keys = sourcescfg.keys() + else: + for key in sourcescfg: + if not key in keys: + keys.append(key) + stream = open(sourcesfile, 'w') + for uri in keys: + sconfig = sourcescfg[uri] + if isinstance(sconfig, dict): + # get a Configuration object + _sconfig = Configuration(options=SOURCE_TYPES[sconfig['adapter']].options) + for attr, val in sconfig.items(): + if attr == 'uri': + continue + if attr == 'adapter': + _sconfig.adapter = val + else: + _sconfig.set_option(attr, val) + sconfig = _sconfig + optsbysect = list(sconfig.options_by_section()) + assert len(optsbysect) == 1, 'all options for a source should be in the same group' + ini_format_section(stream, uri, optsbysect[0][1]) + if hasattr(sconfig, 'adapter'): + print >> stream + print >> stream, '# adapter for this source (YOU SHOULD NOT CHANGE THIS)' + print >> stream, 'adapter=%s' % sconfig.adapter + print >> stream + + class ServerConfiguration(CubicWebConfiguration): """standalone RQL server""" name = 'repository' @@ -188,16 +224,24 @@ # restricted user, this user usually don't have access to the sources # configuration file (#16102) @cached + def read_sources_file(self): + return read_config(self.sources_file()) + def sources(self): """return a dictionnaries containing sources definitions indexed by sources'uri """ - allsources = read_config(self.sources_file()) + allsources = self.read_sources_file() if self._enabled_sources is None: return allsources return dict((uri, config) for uri, config in allsources.items() if uri in self._enabled_sources or uri == 'admin') + def write_sources_file(self, sourcescfg): + sourcesfile = self.sources_file() + generate_sources_file(sourcesfile, sourcescfg, ['admin', 'system']) + restrict_perms_to_user(sourcesfile) + def pyro_enabled(self): """pyro is always enabled in standalone repository configuration""" return True