freedombox Debian release 21.4.4

-----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCgAdFiEEfWrbdQ+RCFWJSEvmd8DHXntlCAgFAmDx0YUACgkQd8DHXntl
 CAhYfg//dsc8XKiMWm0iBzfqoRw1n+vKWb7F/pKlCQztgK+tsUJ6kp6PCHH2P0tA
 HRuqmAbn+bSNefE8YhZYu0UDwE2Vo6zmc/z59ysGqJKEv6KS2mj0Ag//Lvi2X+cG
 xBVCexgvfB1z5l21fgOXE51KdmriXfJkFrK4VpQSQAMuxbPxpO1AStK9u2/CCKGi
 7jmjlPpUTcA0AoF01bgYFVi1fIfSgpwrO27M4fMT5kTbS3iSxVjPfB97Jok7HBht
 W8IJ6LQCESoRyWHRSvv2N875HWpboV4oF9RaRiUtTKIlTfU3rQmZ7ByrBeGBghFr
 Wm2qXgmfdTKB2bik1cLWx2D9aYBgHLLyNUHqmv4qr2ExWy3RnfDiUDDein1tcnlh
 Amb35N/avQEV3gQnHMt0PetElOHdloFdOgepRW1e/clGL90SKJaoeMXg28trZaFv
 pixeC8aydoSHZqI+kzxbdKEXR/iH2tgj9JxZjdmSdRgl3SdbkYyUrGjLdRgmUpHp
 Y/WTgCkScuZ1/ysO0TCU7wytTqCncqmWwbvLVLKbkyHGBdwzNXOBwk6y52aVjEKc
 q6gqmOkiuXBbDOSq2VgGNk9y+tOmH160hpyl+qFR0mMt7JqxOiFhPb3m0mgppz0s
 bi2hc+cSiAMHFl+r+93u30UNVmV7jJ9XoTQE1H4Keutw0egcfBA=
 =AVVp
 -----END PGP SIGNATURE-----
gpgsig -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCgAdFiEEfWrbdQ+RCFWJSEvmd8DHXntlCAgFAmD8qzoACgkQd8DHXntl
 CAjpCxAAjIJC0VlhO0DQfSlmYZKXEfo3IhmADxO9BifM29CaMV6hBuqe2TskWsYF
 qHmKTpdQef+fUsbov3qOxAabWXUQVVBZmWWnp/OUR5Tf1YuMQM99wYWj/TdWXyoM
 tUK4137xijq4fTWe0mjCdG4HC8XOMG4uUlE3dR3nBLxa4m//o80UCresExfuW63z
 zj8blFXRsULIBYp5WL/+fyDjCq0pbYRQUWWErXECiTxevN5ToeGL0A0gzPSjEZ1o
 0iDy7WhkWvgSZb4H/V2DUxi2LnZorCv1RME4LPGaFlwzjH3jvJyr9laTdF2tbP4v
 j4Aur7c33mdetcjTAjtaTW2qeioii9qWstEFR/h2rN3nuVB9lSSFRdfwHo9mVK4Y
 aKWPvnTxitQueaKBBT3U8ILuQrimEIGKjAAs0oB69DsS7tD1Z2v6GuzzS/J26sa0
 4CmnCi1y1qY/BKH6v9TLbce6eADnWC6IL/ZvGTZHpw8mIkuTRS5mamDT5iWkNGGu
 gLbMSkFSTg+/xWdUL6IYHmwaCIIIdJUkyvjI+0K9M7tgZua9w8hGnS7RZoaf0jtx
 ml0EBOgvbco7QWLhAcZa+nRgIBzNdwqoMNMtqPSz9+3ihYfVsUqlK2zXG0xMWksa
 XBdczZetF98pyeXdEZWAHxfrLvo7Fzr6hBx7KaSBSHaSskhue5o=
 =fIO4
 -----END PGP SIGNATURE-----

Merge tag 'v21.4.4' into debian/buster-backports

freedombox Debian release 21.4.4

Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
This commit is contained in:
James Valleroy 2021-07-24 20:07:20 -04:00
commit 6bfefbe9b6
5 changed files with 80 additions and 19 deletions

View File

@ -18,9 +18,8 @@ import apt.cache
import apt_inst
import apt_pkg
from plinth import cfg
from plinth.action_utils import apt_hold, run_apt_command
LOCK_FILE = '/var/lib/dpkg/lock'
from plinth.action_utils import (apt_hold_freedombox, is_package_manager_busy,
run_apt_command)
logger = logging.getLogger(__name__)
@ -93,7 +92,7 @@ def subcommand_install(arguments):
extra_arguments += ['-o', 'Dpkg::Options::=--force-confmiss']
subprocess.run(['dpkg', '--configure', '-a'])
with apt_hold():
with apt_hold_freedombox():
run_apt_command(['--fix-broken', 'install'])
returncode = run_apt_command(['install'] + extra_arguments +
arguments.packages)
@ -115,12 +114,10 @@ def _assert_managed_packages(module, packages):
def subcommand_is_package_manager_busy(_):
"""Return whether package manager is busy.
This command uses the `lsof` command to check whether the dpkg lock file
is open which indicates that the package manager is busy"""
try:
subprocess.check_output(['lsof', LOCK_FILE])
except subprocess.CalledProcessError:
"""Check whether package manager is busy.
An exit code of zero indicates that package manager is busy."""
if not is_package_manager_busy():
sys.exit(-1)

View File

@ -14,9 +14,10 @@ import subprocess
import sys
import time
from plinth.action_utils import (apt_hold, debconf_set_selections,
run_apt_command, service_daemon_reload,
service_restart)
from plinth.action_utils import (apt_hold, apt_hold_flag, apt_hold_freedombox,
apt_unhold_freedombox, debconf_set_selections,
is_package_manager_busy, run_apt_command,
service_daemon_reload, service_restart)
from plinth.modules.apache.components import check_url
from plinth.modules.snapshot import (is_apt_snapshots_enabled, is_supported as
snapshot_is_supported, load_augeas as
@ -141,6 +142,12 @@ def _run():
"""Run unattended-upgrades"""
subprocess.run(['dpkg', '--configure', '-a'])
run_apt_command(['--fix-broken', 'install'])
# In case freedombox package was left in held state by an
# interrupted process, release it.
if apt_hold_flag.exists() and not is_package_manager_busy():
apt_unhold_freedombox()
subprocess.Popen(['systemctl', 'start', 'freedombox-manual-upgrade'],
stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL, close_fds=True,
@ -432,7 +439,7 @@ def _perform_dist_upgrade():
# Hold freedombox package during entire dist upgrade.
print('Holding freedombox package...', flush=True)
with apt_hold():
with apt_hold_freedombox():
print('Updating Apt cache...', flush=True)
run_apt_command(['update'])
@ -531,6 +538,11 @@ def subcommand_start_dist_upgrade(arguments):
Check if a new stable release is available, and start dist-upgrade process
if updates are enabled.
"""
# In case freedombox package was left in held state by an
# interrupted process, release it.
if apt_hold_flag.exists() and not is_package_manager_busy():
apt_unhold_freedombox()
upgrade_ready, reason = _check_dist_upgrade(arguments.test)
if upgrade_ready:
with open(DIST_UPGRADE_SERVICE_PATH, 'w') as service_file:

10
debian/changelog vendored
View File

@ -1,3 +1,13 @@
freedombox (21.4.4) unstable; urgency=medium
* action_utils: Separate function to hold freedombox package
* action_utils: Use flag to indicate freedombox package has been held
* upgrades: Check for held freedombox package in manual update
* upgrades: Check for held freedombox package daily
* action_utils: Don't print when unholding freedombox package
-- James Valleroy <jvalleroy@mailbox.org> Fri, 16 Jul 2021 09:07:51 -0400
freedombox (21.4.3~bpo10+1) buster-backports; urgency=medium
* Rebuild for buster-backports.

View File

@ -3,4 +3,4 @@
Package init file.
"""
__version__ = '21.4.3'
__version__ = '21.4.4'

View File

@ -5,6 +5,7 @@ Python action utility functions.
import logging
import os
import pathlib
import shutil
import subprocess
import tempfile
@ -15,6 +16,11 @@ logger = logging.getLogger(__name__)
UWSGI_ENABLED_PATH = '/etc/uwsgi/apps-enabled/{config_name}.ini'
UWSGI_AVAILABLE_PATH = '/etc/uwsgi/apps-available/{config_name}.ini'
# Flag on disk to indicate if freedombox package was held by
# plinth. This is a backup in case the process is interrupted and hold
# is not released.
apt_hold_flag = pathlib.Path('/var/lib/freedombox/package-held')
def is_systemd_running():
"""Return if we are running under systemd."""
@ -413,11 +419,8 @@ def run_apt_command(arguments):
@contextmanager
def apt_hold(packages=None, ignore_errors=False):
def apt_hold(packages, ignore_errors=False):
"""Prevent packages from being removed during apt operations."""
if not packages:
packages = ['freedombox']
current_hold = subprocess.check_output(['apt-mark', 'showhold'] + packages)
try:
yield current_hold or subprocess.run(['apt-mark', 'hold'] + packages,
@ -426,3 +429,42 @@ def apt_hold(packages=None, ignore_errors=False):
if not current_hold:
subprocess.run(['apt-mark', 'unhold'] + packages,
check=not ignore_errors)
@contextmanager
def apt_hold_freedombox():
"""Prevent freedombox package from being removed during apt operations."""
current_hold = subprocess.check_output(
['apt-mark', 'showhold', 'freedombox'])
try:
if current_hold:
# Package is already held, possibly by administrator.
yield current_hold
else:
# Set the flag.
apt_hold_flag.touch(mode=0o660)
yield subprocess.check_call(['apt-mark', 'hold', 'freedombox'])
finally:
# Was the package held, either in this process or a previous one?
if not current_hold or apt_hold_flag.exists():
apt_unhold_freedombox()
def apt_unhold_freedombox():
"""Remove any hold on freedombox package, and clear flag."""
subprocess.run(['apt-mark', 'unhold', 'freedombox'],
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
if apt_hold_flag.exists():
apt_hold_flag.unlink()
def is_package_manager_busy():
"""Return whether package manager is busy.
This command uses the `lsof` command to check whether the dpkg lock file
is open which indicates that the package manager is busy"""
LOCK_FILE = '/var/lib/dpkg/lock'
try:
subprocess.check_output(['lsof', LOCK_FILE])
return True
except subprocess.CalledProcessError:
return False