1"""
2Config access class
4@contact: Debian FTPMaster <ftpmaster@debian.org>
5@copyright: 2008 Mark Hymers <mhy@debian.org>
6@license: GNU General Public License version 2 or later
7"""
9# This program is free software; you can redistribute it and/or modify
10# it under the terms of the GNU General Public License as published by
11# the Free Software Foundation; either version 2 of the License, or
12# (at your option) any later version.
14# This program is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17# GNU General Public License for more details.
19# You should have received a copy of the GNU General Public License
20# along with this program; if not, write to the Free Software
21# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23################################################################################
25# <NCommander> mhy, how about "Now with 20% more monty python references"
27################################################################################
29import getpass
30import grp
31import os
32import apt_pkg
33import socket
35################################################################################
37default_config = "/etc/dak/dak.conf" #: default dak config, defines host properties
39# suppress some deprecation warnings in squeeze related to apt_pkg
40# module
41import warnings
42warnings.filterwarnings('ignore', ".*apt_pkg.* is deprecated.*", DeprecationWarning)
44################################################################################
47def which_conf_file() -> str:
48 return os.getenv("DAK_CONFIG", default_config)
51class Config:
52 """
53 A Config object is a singleton containing
54 information about the DAK configuration
55 """
57 __shared_state = {}
59 def __init__(self, *args, **kwargs):
60 self.__dict__ = self.__shared_state
62 if not getattr(self, 'initialised', False):
63 self.initialised = True
64 self._readconf()
65 self._setup_routines()
67 def _readconf(self):
68 apt_pkg.init()
70 self.Cnf = apt_pkg.Configuration()
72 apt_pkg.read_config_file_isc(self.Cnf, which_conf_file())
74 # Check whether our dak.conf was the real one or
75 # just a pointer to our main one
76 fqdn = socket.getfqdn()
77 conffile = self.Cnf.get("Config::" + fqdn + "::DakConfig")
78 if conffile: 78 ↛ 79line 78 didn't jump to line 79, because the condition on line 78 was never true
79 apt_pkg.read_config_file_isc(self.Cnf, conffile)
81 # Read group-specific options
82 if 'ByGroup' in self.Cnf: 82 ↛ 83line 82 didn't jump to line 83, because the condition on line 82 was never true
83 bygroup = self.Cnf.subtree('ByGroup')
84 groups = set([os.getgid()])
85 groups.update(os.getgroups())
87 for group in bygroup.list():
88 gid = grp.getgrnam(group).gr_gid
89 if gid in groups:
90 if bygroup.get(group):
91 apt_pkg.read_config_file_isc(self.Cnf, bygroup[group])
92 break
94 # Read user-specific options
95 byuser_config_path = self.Cnf.get(f"ByUser::{getpass.getuser()}", "")
96 if byuser_config_path: 96 ↛ 97line 96 didn't jump to line 97, because the condition on line 96 was never true
97 apt_pkg.read_config_file_isc(self.Cnf, byuser_config_path)
99 if 'Include' in self.Cnf: 99 ↛ 100line 99 didn't jump to line 100, because the condition on line 99 was never true
100 for filename in self.Cnf.value_list('Include'):
101 apt_pkg.read_config_file_isc(self.Cnf, filename)
103 # Rebind some functions
104 # TODO: Clean this up
105 self.get = self.Cnf.get
106 self.subtree = self.Cnf.subtree
107 self.value_list = self.Cnf.value_list
108 self.find = self.Cnf.find
109 self.find_b = self.Cnf.find_b
110 self.find_i = self.Cnf.find_i
112 def __contains__(self, name):
113 return name in self.Cnf
115 def __getitem__(self, name):
116 return self.Cnf[name]
118 def __setitem__(self, name, value):
119 self.Cnf[name] = value
121 @staticmethod
122 def get_db_value(name, default=None, rettype=None):
123 from daklib.dbconn import DBConfig, DBConn, NoResultFound
124 try:
125 res = DBConn().session().query(DBConfig).filter(DBConfig.name == name).one()
126 except NoResultFound:
127 return default
129 if rettype: 129 ↛ 132line 129 didn't jump to line 132, because the condition on line 129 was never false
130 return rettype(res.value)
131 else:
132 return res.value
134 def _setup_routines(self):
135 """
136 This routine is the canonical list of which fields need to exist in
137 the config table. If your dak instance is to work, we suggest reading it
139 Of course, what the values do is another matter
140 """
141 for field in [('db_revision', None, int),
142 ('defaultsuitename', 'unstable', str),
143 ('use_extfiles', None, int)
144 ]:
145 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))
146 setattr(Config, '%s' % field[0], property(fget=getattr(self, 'get_%s' % field[0])))
148 def get_defaultsuite(self):
149 from daklib.dbconn import get_suite
150 suitename = self.defaultsuitename
151 if not suitename:
152 return None
153 else:
154 return get_suite(suitename)
156 defaultsuite = property(get_defaultsuite)