################################################################################
+import grp
+import os
import apt_pkg
import socket
-from singleton import Singleton
-
################################################################################
-default_config = "/etc/dak/dak.conf"
+default_config = "/etc/dak/dak.conf" #: default dak config, defines host properties
+
+# suppress some deprecation warnings in squeeze related to apt_pkg
+# module
+import warnings
+warnings.filterwarnings('ignore', ".*apt_pkg.* is deprecated.*", DeprecationWarning)
+
+################################################################################
-def which_conf_file(Cnf):
- res = socket.gethostbyaddr(socket.gethostname())
- if Cnf.get("Config::" + res[0] + "::DakConfig"):
- return Cnf["Config::" + res[0] + "::DakConfig"]
- else:
- return default_config
+def which_conf_file():
+ return os.getenv("DAK_CONFIG", default_config)
-class Config(Singleton):
+class Config(object):
"""
A Config object is a singleton containing
information about the DAK configuration
"""
+
+ __shared_state = {}
+
def __init__(self, *args, **kwargs):
- super(Config, self).__init__(*args, **kwargs)
+ self.__dict__ = self.__shared_state
+
+ if not getattr(self, 'initialised', False):
+ self.initialised = True
+ self._readconf()
+ self._setup_routines()
def _readconf(self):
apt_pkg.init()
- self.Cnf = apt_pkg.newConfiguration()
+ self.Cnf = apt_pkg.Configuration()
- apt_pkg.ReadConfigFileISC(self.Cnf, default_config)
+ apt_pkg.read_config_file_isc(self.Cnf, which_conf_file())
# Check whether our dak.conf was the real one or
# just a pointer to our main one
res = socket.gethostbyaddr(socket.gethostname())
conffile = self.Cnf.get("Config::" + res[0] + "::DakConfig")
if conffile:
- apt_pkg.ReadConfigFileISC(self.Cnf, conffile)
+ apt_pkg.read_config_file_isc(self.Cnf, conffile)
+
+ # Read group-specific options
+ if 'ByGroup' in self.Cnf:
+ bygroup = self.Cnf.subtree('ByGroup')
+ groups = set([os.getgid()])
+ groups.update(os.getgroups())
+
+ for group in bygroup.list():
+ gid = grp.getgrnam(group).gr_gid
+ if gid in groups:
+ if bygroup.get(group):
+ apt_pkg.read_config_file_isc(self.Cnf, bygroup[group])
+ break
# Rebind some functions
# TODO: Clean this up
self.get = self.Cnf.get
- self.SubTree = self.Cnf.SubTree
- self.ValueList = self.Cnf.ValueList
- self.Find = self.Cnf.Find
- self.FindB = self.Cnf.FindB
-
- def _startup(self, *args, **kwargs):
- self._readconf()
+ self.subtree = self.Cnf.subtree
+ self.value_list = self.Cnf.value_list
+ self.find = self.Cnf.find
+ self.find_b = self.Cnf.find_b
+ self.find_i = self.Cnf.find_i
def has_key(self, name):
- return self.Cnf.has_key(name)
+ return name in self.Cnf
+
+ def __contains__(self, name):
+ return name in self.Cnf
def __getitem__(self, name):
return self.Cnf[name]
+ def __setitem__(self, name, value):
+ self.Cnf[name] = value
+
+ @staticmethod
+ def get_db_value(name, default=None, rettype=None):
+ from daklib.dbconn import DBConfig, DBConn, NoResultFound
+ try:
+ res = DBConn().session().query(DBConfig).filter(DBConfig.name == name).one()
+ except NoResultFound:
+ return default
+
+ if rettype:
+ return rettype(res.value)
+ else:
+ return res.value
+
+ def _setup_routines(self):
+ """
+ This routine is the canonical list of which fields need to exist in
+ the config table. If your dak instance is to work, we suggest reading it
+
+ Of course, what the values do is another matter
+ """
+ for field in [('db_revision', None, int),
+ ('defaultsuitename', 'unstable', str),
+ ('exportpath', '', str),
+ ('use_extfiles', None, int)
+ ]:
+ setattr(self, 'get_%s' % field[0], lambda s=None, x=field[0], y=field[1], z=field[2]: self.get_db_value(x, y, z))
+ setattr(Config, '%s' % field[0], property(fget=getattr(self, 'get_%s' % field[0])))
+
+ def get_defaultsuite(self):
+ from daklib.dbconn import get_suite
+ suitename = self.defaultsuitename
+ if not suitename:
+ return None
+ else:
+ return get_suite(suitename)
+
+ defaultsuite = property(get_defaultsuite)