Source code for daklib.config

"""
Config access class

@contact: Debian FTPMaster <ftpmaster@debian.org>
@copyright: 2008  Mark Hymers <mhy@debian.org>
@license: GNU General Public License version 2 or later
"""

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

################################################################################

# <NCommander> mhy, how about "Now with 20% more monty python references"

################################################################################

import getpass
import grp
import os
import apt_pkg
import socket

################################################################################

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)

################################################################################


[docs]def which_conf_file() -> str: return os.getenv("DAK_CONFIG", default_config)
[docs]class Config: """ A Config object is a singleton containing information about the DAK configuration """ __shared_state = {} def __init__(self, *args, **kwargs): self.__dict__ = self.__shared_state if not getattr(self, 'initialised', False): self.initialised = True self._readconf() self._setup_routines()
[docs] def _readconf(self): apt_pkg.init() self.Cnf = apt_pkg.Configuration() 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 fqdn = socket.getfqdn() conffile = self.Cnf.get("Config::" + fqdn + "::DakConfig") if 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 # Read user-specific options byuser_config_path = self.Cnf.get(f"ByUser::{getpass.getuser()}", "") if byuser_config_path: apt_pkg.read_config_file_isc(self.Cnf, byuser_config_path) if 'Include' in self.Cnf: for filename in self.Cnf.value_list('Include'): apt_pkg.read_config_file_isc(self.Cnf, filename) # Rebind some functions # TODO: Clean this up self.get = self.Cnf.get 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 __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
[docs] @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
[docs] 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), ('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])))
[docs] 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)