From 10c6ee13da6e721eb8892fd33d5731b502d5daa8 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Sat, 7 Mar 2020 10:46:34 -0500 Subject: [PATCH] packages: Mark freedombox package as held during package installs In case the package to be installed (or its dependencies) conflicts with freedombox (or its dependencies), this will fail the installation rather than removing the freedombox package. Closes #1790. Signed-off-by: James Valleroy Reviewed-by: Sunil Mohan Adapa --- actions/packages | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/actions/packages b/actions/packages index ac609c74e..06c578aa0 100755 --- a/actions/packages +++ b/actions/packages @@ -11,6 +11,7 @@ import os import subprocess import sys from collections import defaultdict +from contextlib import contextmanager from importlib import import_module import apt.cache @@ -54,6 +55,15 @@ def parse_arguments(): return parser.parse_args() +@contextmanager +def _apt_hold(): + """Do not allow freedombox package to be removed during package install.""" + try: + yield subprocess.run(['apt-mark', 'hold', 'freedombox'], check=True) + finally: + subprocess.run(['apt-mark', 'unhold', 'freedombox'], check=True) + + def _run_apt_command(arguments): """Run apt-get with provided arguments.""" # Ask apt-get to output its progress to file descriptor 3. @@ -71,12 +81,12 @@ def _run_apt_command(arguments): process = subprocess.run(command, stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, close_fds=False, env=env) - sys.exit(process.returncode) + return process.returncode def subcommand_update(arguments): """Update apt package lists.""" - _run_apt_command(['update']) + sys.exit(_run_apt_command(['update'])) def subcommand_install(arguments): @@ -99,7 +109,11 @@ def subcommand_install(arguments): elif arguments.force_configuration == 'new': extra_arguments += ['-o', 'Dpkg::Options::=--force-confnew'] - _run_apt_command(['install'] + extra_arguments + arguments.packages) + with _apt_hold(): + returncode = _run_apt_command(['install'] + extra_arguments + + arguments.packages) + + sys.exit(returncode) def _assert_managed_packages(module, packages):