diff options
-rw-r--r-- | debian/changelog | 6 | ||||
-rw-r--r-- | debian/control | 2 | ||||
-rw-r--r-- | schemas/packages.xsd | 1 | ||||
-rw-r--r-- | src/lib/Bcfg2/Client/Tools/Debconf.py | 2 | ||||
-rw-r--r-- | src/lib/Bcfg2/DBSettings.py | 6 | ||||
-rw-r--r-- | src/lib/Bcfg2/Server/Core.py | 46 | ||||
-rw-r--r-- | src/lib/Bcfg2/Server/Plugins/Bundler.py | 4 | ||||
-rw-r--r-- | src/lib/Bcfg2/Server/SSLServer.py | 6 |
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 |