mirror of
https://github.com/freedombox/FreedomBox.git
synced 2026-04-29 10:10:19 +00:00
apt: Run apt-get -f install before other commands
Run `apt-get --fix-broken install` before installing package or manual update. This will attempt to correct broken dependencies. Tests: - Install a package without its dependencies using `dpkg -i`. - Both app install and manual update successfully recover from this situation. Signed-off-by: James Valleroy <jvalleroy@mailbox.org> Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
This commit is contained in:
parent
bf53fd8b17
commit
5424e1e23f
@ -19,6 +19,7 @@ import apt.cache
|
|||||||
import apt_inst
|
import apt_inst
|
||||||
import apt_pkg
|
import apt_pkg
|
||||||
from plinth import cfg
|
from plinth import cfg
|
||||||
|
from plinth.action_utils import run_apt_command
|
||||||
|
|
||||||
LOCK_FILE = '/var/lib/dpkg/lock'
|
LOCK_FILE = '/var/lib/dpkg/lock'
|
||||||
|
|
||||||
@ -68,29 +69,9 @@ def _apt_hold():
|
|||||||
subprocess.run(['apt-mark', 'unhold', 'freedombox'], check=True)
|
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.
|
|
||||||
command = [
|
|
||||||
'apt-get', '--assume-yes', '--quiet=2', '--option', 'APT::Status-Fd=3'
|
|
||||||
] + arguments
|
|
||||||
|
|
||||||
# Duplicate stdout to file descriptor 3 for this process.
|
|
||||||
os.dup2(1, 3)
|
|
||||||
|
|
||||||
# Pass on file descriptor 3 instead of closing it. Close stdout
|
|
||||||
# so that regular output is ignored.
|
|
||||||
env = os.environ.copy()
|
|
||||||
env['DEBIAN_FRONTEND'] = 'noninteractive'
|
|
||||||
process = subprocess.run(command, stdin=subprocess.DEVNULL,
|
|
||||||
stdout=subprocess.DEVNULL, close_fds=False,
|
|
||||||
env=env)
|
|
||||||
return process.returncode
|
|
||||||
|
|
||||||
|
|
||||||
def subcommand_update(arguments):
|
def subcommand_update(arguments):
|
||||||
"""Update apt package lists."""
|
"""Update apt package lists."""
|
||||||
sys.exit(_run_apt_command(['update']))
|
sys.exit(run_apt_command(['update']))
|
||||||
|
|
||||||
|
|
||||||
def subcommand_install(arguments):
|
def subcommand_install(arguments):
|
||||||
@ -114,8 +95,9 @@ def subcommand_install(arguments):
|
|||||||
extra_arguments += ['-o', 'Dpkg::Options::=--force-confnew']
|
extra_arguments += ['-o', 'Dpkg::Options::=--force-confnew']
|
||||||
|
|
||||||
with _apt_hold():
|
with _apt_hold():
|
||||||
returncode = _run_apt_command(['install'] + extra_arguments +
|
run_apt_command(['--fix-broken', 'install'])
|
||||||
arguments.packages)
|
returncode = run_apt_command(['install'] + extra_arguments +
|
||||||
|
arguments.packages)
|
||||||
|
|
||||||
sys.exit(returncode)
|
sys.exit(returncode)
|
||||||
|
|
||||||
|
|||||||
@ -11,6 +11,7 @@ import re
|
|||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
from plinth.action_utils import run_apt_command
|
||||||
from plinth.modules.apache.components import check_url
|
from plinth.modules.apache.components import check_url
|
||||||
|
|
||||||
AUTO_CONF_FILE = '/etc/apt/apt.conf.d/20auto-upgrades'
|
AUTO_CONF_FILE = '/etc/apt/apt.conf.d/20auto-upgrades'
|
||||||
@ -83,6 +84,7 @@ def parse_arguments():
|
|||||||
|
|
||||||
def subcommand_run(_):
|
def subcommand_run(_):
|
||||||
"""Run unattended-upgrades"""
|
"""Run unattended-upgrades"""
|
||||||
|
run_apt_command(['--fix-broken', 'install'])
|
||||||
try:
|
try:
|
||||||
subprocess.Popen(['systemctl', 'start', 'freedombox-manual-upgrade'],
|
subprocess.Popen(['systemctl', 'start', 'freedombox-manual-upgrade'],
|
||||||
stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL,
|
stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL,
|
||||||
|
|||||||
@ -197,6 +197,7 @@ def webserver_disable(name, kind='config', apply_changes=True):
|
|||||||
|
|
||||||
class WebserverChange(object):
|
class WebserverChange(object):
|
||||||
"""Context to restart/reload Apache after configuration changes."""
|
"""Context to restart/reload Apache after configuration changes."""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
"""Initialize the context object state."""
|
"""Initialize the context object state."""
|
||||||
self.actions_required = set()
|
self.actions_required = set()
|
||||||
@ -388,3 +389,23 @@ def is_disk_image():
|
|||||||
- Installing packages on a Debian machine using apt.
|
- Installing packages on a Debian machine using apt.
|
||||||
"""
|
"""
|
||||||
return os.path.exists('/var/lib/freedombox/is-freedombox-disk-image')
|
return os.path.exists('/var/lib/freedombox/is-freedombox-disk-image')
|
||||||
|
|
||||||
|
|
||||||
|
def run_apt_command(arguments):
|
||||||
|
"""Run apt-get with provided arguments."""
|
||||||
|
# Ask apt-get to output its progress to file descriptor 3.
|
||||||
|
command = [
|
||||||
|
'apt-get', '--assume-yes', '--quiet=2', '--option', 'APT::Status-Fd=3'
|
||||||
|
] + arguments
|
||||||
|
|
||||||
|
# Duplicate stdout to file descriptor 3 for this process.
|
||||||
|
os.dup2(1, 3)
|
||||||
|
|
||||||
|
# Pass on file descriptor 3 instead of closing it. Close stdout
|
||||||
|
# so that regular output is ignored.
|
||||||
|
env = os.environ.copy()
|
||||||
|
env['DEBIAN_FRONTEND'] = 'noninteractive'
|
||||||
|
process = subprocess.run(command, stdin=subprocess.DEVNULL,
|
||||||
|
stdout=subprocess.DEVNULL, close_fds=False,
|
||||||
|
env=env)
|
||||||
|
return process.returncode
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user