fixed markauto and setting config (Bug #29805), adding log (Bug #29239), checking signature (Bug #29797) Index: python/de.po =================================================================== --- python/de.po (Revision 37793) +++ python/de.po (Arbeitskopie) @@ -21,6 +21,10 @@ msgid "Deleting unneeded %s" msgstr "Deinstalliere unbenutztes Paket %s" +#: python/package_manager.py:482 +msgid "Untrusted origin" +msgstr "Nicht vertrauenswürdige Quelle" + #: python/package_manager.py:509 msgid "Failed to install" msgstr "Installation fehlgeschlagen" Index: python/package_manager.py =================================================================== --- python/package_manager.py (Revision 37793) +++ python/package_manager.py (Arbeitskopie) @@ -35,7 +35,6 @@ import os import time import subprocess -import tempfile from contextlib import contextmanager import apt_pkg @@ -55,6 +54,8 @@ CMD_DISABLE_EXEC = '/usr/share/univention-updater/disable-apache2-umc' CMD_ENABLE_EXEC = ['/usr/share/univention-updater/enable-apache2-umc', '--no-restart'] +PACKAGE_MANAGER_LOG = open('/var/log/univention/package_manager.log', 'ab') + class LockError(Exception): '''Lock error for the package manager. Not to be confused with LockFailedException (apt) @@ -88,6 +89,7 @@ if msg is None: return msg = '%s\n' % str(msg).strip() + PACKAGE_MANAGER_LOG.write(msg) for log in self.logfiles.values(): log.write(msg) @@ -185,8 +187,7 @@ def fork(self): # we better have a real file # when using low-level routines - tmp = tempfile.TemporaryFile() - msg_writer = MessageWriter(self.progress_state, tmp) + msg_writer = MessageWriter(self.progress_state, PACKAGE_MANAGER_LOG) p = os.fork() if p == 0: os.dup2(msg_writer.fileno(), sys.stdout.fileno()) @@ -273,6 +274,9 @@ finally: self.progress_state.logfiles.pop(logfile.name) + def log(self, msg): + self.progress_state.log(msg) + @contextmanager def locked(self, reset_status=False, set_finished=False): self.lock() @@ -309,11 +313,11 @@ self.unlock() def _set_apt_pkg_config(self, options): - revert_options = {} - for option_name, option_value in options.iteritems(): + revert_options = [] + for option_name, option_value in options: old_value = apt_pkg.config.get(option_name) apt_pkg.config[option_name] = option_value - revert_options[option_name] = old_value + revert_options.append((option_name, old_value)) return revert_options def add_hundred_percent(self): @@ -347,12 +351,13 @@ @contextmanager def brutal_noninteractive(self): with self.noninteractive(): - options = { - 'DPkg::Options::': '--force-overwrite', - 'DPkg::Options::': '--force-overwrite-dir', - 'APT::Get::Trivial-Only': 'no', - 'quiet': '1', - } + options = [ + ('DPkg::Options::', '--force-overwrite'), + ('DPkg::Options::', '--force-overwrite-dir'), + ('APT::Get::AllowUnauthenticated', '1'), + ('APT::Get::Trivial-Only', 'no'), + ('quiet', '1'), + ] revert_options = self._set_apt_pkg_config(options) try: yield @@ -364,12 +369,11 @@ ''' dont ever ask for user input ''' old_debian_frontend = os.environ.get('DEBIAN_FRONTEND') os.environ['DEBIAN_FRONTEND'] = 'noninteractive' - options = { - 'APT::Get::Assume-Yes': 'true', - 'APT::Get::force-yes': 'true', - 'APT::Get::AllowUnauthenticated': '1', - 'DPkg::Options::': '--force-confold', - } + options = [ + ('APT::Get::Assume-Yes', 'true'), + ('APT::Get::force-yes', 'true'), + ('DPkg::Options::', '--force-confold'), + ] revert_options = self._set_apt_pkg_config(options) try: yield @@ -440,6 +444,14 @@ for pkg in self.cache: yield pkg + def mark_auto(self, auto, *pkgs): + '''Immediately sets packages to automatically + installed (or not). Calls commit()!''' + for pkg in self.get_packages(pkgs): + pkg.mark_auto(auto) + self.commit() + self.reopen_cache() + def mark(self, install, remove, dry_run=False): '''Marks packages, returns all installed, removed or broken packages. @@ -464,6 +476,13 @@ for pkg in self.cache.get_changes(): if pkg.marked_install or pkg.marked_upgrade: to_be_installed.add(pkg.name) + if apt_pkg.config.get('APT::Get::AllowUnauthenticated') != '1': + authenticated = False + for origin in pkg.candidate.origins: + authenticated |= origin.trusted + if not authenticated: + self.progress_state.error('%s: %s' % (pkg.name, _('Untrusted origin'))) + broken.add(pkg.name) if pkg.marked_delete: to_be_removed.add(pkg.name) if pkg.is_inst_broken: