summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--debian/changelog6
-rw-r--r--debian/control2
-rw-r--r--schemas/packages.xsd1
-rw-r--r--src/lib/Bcfg2/Client/Tools/Debconf.py2
-rw-r--r--src/lib/Bcfg2/DBSettings.py6
-rw-r--r--src/lib/Bcfg2/Server/Core.py46
-rw-r--r--src/lib/Bcfg2/Server/Plugins/Bundler.py4
-rw-r--r--src/lib/Bcfg2/Server/SSLServer.py6
8 files changed, 43 insertions, 30 deletions
diff --git a/debian/changelog b/debian/changelog
index 39aff8a0f..7089b1114 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+bcfg2 (1.4.0pre2-0.1+spline8) bookworm; urgency=medium
+
+ * Add various python3 compatibility fixes
+
+ -- Jonah BrĂ¼chert <jbb@kaidan.im> Wed, 14 Aug 2024 03:13:25 +0200
+
bcfg2 (1.4.0pre2-0.1+spline7) bookworm; urgency=medium
* Build with python3
diff --git a/debian/control b/debian/control
index 04dc3c6df..ec76a34f4 100644
--- a/debian/control
+++ b/debian/control
@@ -45,7 +45,7 @@ Description: Configuration management server
Package: bcfg2-web
Architecture: all
-Depends: ${python3:Depends}, ${misc:Depends}, bcfg2-server (= ${binary:Version}), python3-django (>= 1.3)
+Depends: ${python3:Depends}, ${misc:Depends}, bcfg2-server (= ${binary:Version}), python3-django (>= 1.3), python3-psycopg2
Suggests: python3-mysqldb, python3-psycopg2, python3-sqlite, libapache2-mod-wsgi
Description: Configuration management web interface
Bcfg2 is a configuration management system that generates configuration sets
diff --git a/schemas/packages.xsd b/schemas/packages.xsd
index 4a9881a8f..a2e8c999d 100644
--- a/schemas/packages.xsd
+++ b/schemas/packages.xsd
@@ -19,6 +19,7 @@
<xsd:enumeration value="pac"/>
<xsd:enumeration value="pkgng"/>
<xsd:enumeration value="dummy"/>
+ <xsd:enumeration value="pyapt"/>
</xsd:restriction>
</xsd:simpleType>
diff --git a/src/lib/Bcfg2/Client/Tools/Debconf.py b/src/lib/Bcfg2/Client/Tools/Debconf.py
index 106e9adbb..a6d37dc05 100644
--- a/src/lib/Bcfg2/Client/Tools/Debconf.py
+++ b/src/lib/Bcfg2/Client/Tools/Debconf.py
@@ -121,7 +121,7 @@ class Debconf(Bcfg2.Client.Tools.Tool):
values = self.cmd.run(['/usr/bin/debconf-show'] + owners)
for line in values.stdout.splitlines():
if len(line) > 2 and line[0] == '*':
- (name, current_value) = line[2:].split(':', 2)
+ (name, current_value) = line[2:].split(':', 1)
if name not in specified and name not in extra:
extra[name] = Bcfg2.Client.XML.Element(
'Conf', name=name, type='debconf',
diff --git a/src/lib/Bcfg2/DBSettings.py b/src/lib/Bcfg2/DBSettings.py
index 5d2df6078..7b99d790d 100644
--- a/src/lib/Bcfg2/DBSettings.py
+++ b/src/lib/Bcfg2/DBSettings.py
@@ -125,7 +125,8 @@ def finalize_django_config(opts=None, silent=False):
HOST=opts.db_host,
PORT=opts.db_port,
OPTIONS=opts.db_opts,
- SCHEMA=opts.db_schema))
+ SCHEMA=opts.db_schema,
+ CONN_MAX_AGE=0))
if (hasattr(opts, "reporting_db_engine") and
opts.reporting_db_engine is not None):
@@ -137,7 +138,8 @@ def finalize_django_config(opts=None, silent=False):
HOST=opts.reporting_db_host,
PORT=opts.reporting_db_port,
OPTIONS=opts.reporting_db_opts,
- SCHEMA=opts.reporting_db_schema)
+ SCHEMA=opts.reporting_db_schema,
+ CONN_MAX_AGE=0)
settings['TIME_ZONE'] = opts.time_zone
diff --git a/src/lib/Bcfg2/Server/Core.py b/src/lib/Bcfg2/Server/Core.py
index 035d4663a..4ebe007d0 100644
--- a/src/lib/Bcfg2/Server/Core.py
+++ b/src/lib/Bcfg2/Server/Core.py
@@ -82,13 +82,12 @@ def close_db_connection(func):
@wraps(func)
def inner(self, *args, **kwargs):
""" The decorated function """
- rv = func(self, *args, **kwargs)
- if self._database_available: # pylint: disable=W0212
+ if self._database_available:
self.logger.debug("%s: Closing database connection" %
threading.current_thread().getName())
+ django.db.close_old_connections()
- for connection in django.db.connections.all():
- connection.close()
+ rv = func(self, *args, **kwargs)
return rv
return inner
@@ -193,10 +192,10 @@ class Core(object):
#: object used by the core to monitor for Bcfg2 data
#: changes.
self.fam = Bcfg2.Server.FileMonitor.get_fam()
- except IOError:
+ except IOError as e:
msg = "Failed to instantiate fam driver %s" % \
Bcfg2.Options.setup.filemonitor
- self.logger.error(msg, exc_info=1)
+ self.logger.error(msg, exc_info=e)
raise CoreInitError(msg)
#: Path to bcfg2.conf
@@ -278,6 +277,9 @@ class Core(object):
self.logger.error("Updating database %s failed: %s" %
(Bcfg2.Options.setup.db_name,
sys.exc_info()[1]))
+ else:
+ self.logger.warning("Missing Django, the database can "
+ "not be used.")
def __str__(self):
return self.__class__.__name__
@@ -426,9 +428,9 @@ class Core(object):
self.plugin_blacklist[plugin.name] = cplugs
try:
self.plugins[plugin.name] = plugin(self)
- except PluginInitError:
+ except PluginInitError as e:
self.logger.error("Failed to instantiate plugin %s" % plugin,
- exc_info=1)
+ exc_info=e)
except OSError:
err = sys.exc_info()[1]
self.logger.error("Failed to add a file monitor while "
@@ -523,9 +525,9 @@ class Core(object):
self.logger.error("Plugin %s structure validation failed: %s" %
(plugin.name, err))
raise
- except:
+ except Exception as e:
self.logger.error("Plugin %s: unexpected structure validation "
- "failure" % plugin.name, exc_info=1)
+ "failure" % plugin.name, exc_info=e)
@track_statistics()
def validate_goals(self, metadata, data):
@@ -549,9 +551,9 @@ class Core(object):
self.logger.error("Plugin %s goal validation failed: %s" %
(plugin.name, err.message))
raise
- except:
+ except Exception as e:
self.logger.error("Plugin %s: unexpected goal validation "
- "failure" % plugin.name, exc_info=1)
+ "failure" % plugin.name, exc_info=e)
@track_statistics()
def GetStructures(self, metadata):
@@ -591,8 +593,8 @@ class Core(object):
try:
self.BindStructure(astruct, metadata)
config.append(astruct)
- except:
- self.logger.error("error in BindStructure", exc_info=1)
+ except Exception as e:
+ self.logger.error("error in BindStructure", exc_info=e)
@track_statistics()
def BindStructure(self, structure, metadata):
@@ -612,7 +614,7 @@ class Core(object):
continue
try:
self.Bind(entry, metadata)
- except:
+ except Exception as e:
exc = sys.exc_info()[1]
if 'failure' not in entry.attrib:
entry.set('failure', 'bind error: %s' % exc)
@@ -621,7 +623,7 @@ class Core(object):
else:
msg = "Unexpected failure binding entry"
self.logger.error("%s %s:%s: %s" %
- (msg, entry.tag, entry.get('name'), exc))
+ (msg, entry.tag, entry.get('name'), exc), exc_info=e)
def Bind(self, entry, metadata):
""" Bind a single entry using the appropriate generator.
@@ -698,8 +700,8 @@ class Core(object):
try:
structures = self.GetStructures(meta)
- except:
- self.logger.error("Error in GetStructures", exc_info=1)
+ except Exception as e:
+ self.logger.error("Error in GetStructures", exc_info=e)
return lxml.etree.Element("error", type='structure error')
self.validate_structures(meta, structures)
@@ -822,9 +824,9 @@ class Core(object):
for plugin in self.plugins_by_type(Decision):
try:
result.extend(plugin.GetDecisions(metadata, mode))
- except:
+ except Exception as e:
self.logger.error("Plugin: %s failed to generate decision list"
- % plugin.name, exc_info=1)
+ % plugin.name, exc_info=e)
return result
@track_statistics()
@@ -966,10 +968,10 @@ class Core(object):
for plugin in self.plugins_by_type(Statistics):
try:
plugin.process_statistics(meta, statistics)
- except:
+ except Exception as e:
self.logger.error("Plugin %s failed to process stats from "
"%s" % (plugin.name, meta.hostname),
- exc_info=1)
+ exc_info=e)
self.logger.info("Client %s reported state %s" % (client_name,
state.get('state')))
diff --git a/src/lib/Bcfg2/Server/Plugins/Bundler.py b/src/lib/Bcfg2/Server/Plugins/Bundler.py
index bbdf62866..3e0007d8a 100644
--- a/src/lib/Bcfg2/Server/Plugins/Bundler.py
+++ b/src/lib/Bcfg2/Server/Plugins/Bundler.py
@@ -92,9 +92,9 @@ class Bundler(Plugin,
self.logger.error("Bundler: Failed to render templated bundle "
"%s: %s" % (bundlename, err))
continue
- except:
+ except Exception as e:
self.logger.error("Bundler: Unexpected bundler error for %s" %
- bundlename, exc_info=1)
+ bundlename, exc_info=e)
continue
if data.get("independent", "false").lower() == "true":
diff --git a/src/lib/Bcfg2/Server/SSLServer.py b/src/lib/Bcfg2/Server/SSLServer.py
index e4a6c8da8..6bd20e4a5 100644
--- a/src/lib/Bcfg2/Server/SSLServer.py
+++ b/src/lib/Bcfg2/Server/SSLServer.py
@@ -201,6 +201,8 @@ class XMLRPCRequestHandler(SimpleXMLRPCServer.SimpleXMLRPCRequestHandler):
def authenticate(self):
try:
header = self.headers['Authorization']
+ if not header:
+ raise KeyError
except KeyError:
self.logger.error("No authentication data presented")
return False
@@ -234,8 +236,8 @@ class XMLRPCRequestHandler(SimpleXMLRPCServer.SimpleXMLRPCRequestHandler):
self.logger.error("Authentication Failure")
self.send_error(401, self.responses[401][0])
return False
- except: # pylint: disable=W0702
- self.logger.error("Unexpected Authentication Failure", exc_info=1)
+ except Exception as e: # pylint: disable=W0702
+ self.logger.error("Unexpected Authentication Failure", exc_info=e)
self.send_error(401, self.responses[401][0])
return False
return True