mirror of
https://github.com/YunoHost/yunohost.git
synced 2024-09-03 20:06:10 +02:00
Merge pull request #652 from YunoHost/assert-dpkg-is-not-broken-before-app-install
[enh] Assert dpkg is not broken before app install
This commit is contained in:
commit
b274a701fe
4 changed files with 29 additions and 0 deletions
|
@ -153,6 +153,7 @@
|
||||||
"diagnosis_monitor_network_error": "Can't monitor network: {error}",
|
"diagnosis_monitor_network_error": "Can't monitor network: {error}",
|
||||||
"diagnosis_monitor_system_error": "Can't monitor system: {error}",
|
"diagnosis_monitor_system_error": "Can't monitor system: {error}",
|
||||||
"diagnosis_no_apps": "No installed application",
|
"diagnosis_no_apps": "No installed application",
|
||||||
|
"dpkg_is_broken": "You cannot do this right now because dpkg/apt (the system package managers) seems to be in a broken state... You can try to solve this issue by connecting through SSH and running `sudo dpkg --configure -a`.",
|
||||||
"dnsmasq_isnt_installed": "dnsmasq does not seem to be installed, please run 'apt-get remove bind9 && apt-get install dnsmasq'",
|
"dnsmasq_isnt_installed": "dnsmasq does not seem to be installed, please run 'apt-get remove bind9 && apt-get install dnsmasq'",
|
||||||
"domain_cannot_remove_main": "Cannot remove main domain. Set a new main domain first",
|
"domain_cannot_remove_main": "Cannot remove main domain. Set a new main domain first",
|
||||||
"domain_cert_gen_failed": "Unable to generate certificate",
|
"domain_cert_gen_failed": "Unable to generate certificate",
|
||||||
|
@ -470,6 +471,7 @@
|
||||||
"ssowat_persistent_conf_write_error": "Error while saving SSOwat persistent configuration: {error:s}. Edit /etc/ssowat/conf.json.persistent file to fix the JSON syntax",
|
"ssowat_persistent_conf_write_error": "Error while saving SSOwat persistent configuration: {error:s}. Edit /etc/ssowat/conf.json.persistent file to fix the JSON syntax",
|
||||||
"system_upgraded": "The system has been upgraded",
|
"system_upgraded": "The system has been upgraded",
|
||||||
"system_username_exists": "Username already exists in the system users",
|
"system_username_exists": "Username already exists in the system users",
|
||||||
|
"this_action_broke_dpkg": "This action broke dpkg/apt (the system package managers)... You can try to solve this issue by connecting through SSH and running `sudo dpkg --configure -a`.",
|
||||||
"unbackup_app": "App '{app:s}' will not be saved",
|
"unbackup_app": "App '{app:s}' will not be saved",
|
||||||
"unexpected_error": "An unexpected error occured: {error}",
|
"unexpected_error": "An unexpected error occured: {error}",
|
||||||
"unit_unknown": "Unknown unit '{unit:s}'",
|
"unit_unknown": "Unknown unit '{unit:s}'",
|
||||||
|
|
|
@ -567,6 +567,9 @@ def app_upgrade(auth, app=[], url=None, file=None):
|
||||||
url -- Git url to fetch for upgrade
|
url -- Git url to fetch for upgrade
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
if packages.dpkg_is_broken():
|
||||||
|
raise YunohostError("dpkg_is_broken")
|
||||||
|
|
||||||
from yunohost.hook import hook_add, hook_remove, hook_exec, hook_callback
|
from yunohost.hook import hook_add, hook_remove, hook_exec, hook_callback
|
||||||
|
|
||||||
# Retrieve interface
|
# Retrieve interface
|
||||||
|
@ -711,6 +714,9 @@ def app_install(operation_logger, auth, app, label=None, args=None, no_remove_on
|
||||||
no_remove_on_failure -- Debug option to avoid removing the app on a failed installation
|
no_remove_on_failure -- Debug option to avoid removing the app on a failed installation
|
||||||
force -- Do not ask for confirmation when installing experimental / low-quality apps
|
force -- Do not ask for confirmation when installing experimental / low-quality apps
|
||||||
"""
|
"""
|
||||||
|
if packages.dpkg_is_broken():
|
||||||
|
raise YunohostError("dpkg_is_broken")
|
||||||
|
|
||||||
from yunohost.hook import hook_add, hook_remove, hook_exec, hook_callback
|
from yunohost.hook import hook_add, hook_remove, hook_exec, hook_callback
|
||||||
from yunohost.log import OperationLogger
|
from yunohost.log import OperationLogger
|
||||||
|
|
||||||
|
@ -882,6 +888,9 @@ def app_install(operation_logger, auth, app, label=None, args=None, no_remove_on
|
||||||
|
|
||||||
app_ssowatconf(auth)
|
app_ssowatconf(auth)
|
||||||
|
|
||||||
|
if packages.dpkg_is_broken():
|
||||||
|
logger.error(m18n.n("this_action_broke_dpkg"))
|
||||||
|
|
||||||
if install_retcode == -1:
|
if install_retcode == -1:
|
||||||
msg = m18n.n('operation_interrupted') + " " + error_msg
|
msg = m18n.n('operation_interrupted') + " " + error_msg
|
||||||
raise YunohostError(msg, raw_msg=True)
|
raise YunohostError(msg, raw_msg=True)
|
||||||
|
@ -966,6 +975,9 @@ def app_remove(operation_logger, auth, app):
|
||||||
hook_remove(app)
|
hook_remove(app)
|
||||||
app_ssowatconf(auth)
|
app_ssowatconf(auth)
|
||||||
|
|
||||||
|
if packages.dpkg_is_broken():
|
||||||
|
raise YunohostError("this_action_broke_dpkg")
|
||||||
|
|
||||||
|
|
||||||
def app_addaccess(auth, apps, users=[]):
|
def app_addaccess(auth, apps, users=[]):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -524,6 +524,10 @@ def tools_upgrade(operation_logger, auth, ignore_apps=False, ignore_packages=Fal
|
||||||
ignore_packages -- Ignore APT packages upgrade
|
ignore_packages -- Ignore APT packages upgrade
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
from yunohost.utils import packages
|
||||||
|
if packages.dpkg_is_broken():
|
||||||
|
raise YunohostError("dpkg_is_broken")
|
||||||
|
|
||||||
failure = False
|
failure = False
|
||||||
|
|
||||||
# Retrieve interface
|
# Retrieve interface
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
|
|
||||||
"""
|
"""
|
||||||
import re
|
import re
|
||||||
|
import os
|
||||||
import logging
|
import logging
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
|
|
||||||
|
@ -470,3 +471,13 @@ def ynh_packages_version(*args, **kwargs):
|
||||||
'yunohost', 'yunohost-admin', 'moulinette', 'ssowat',
|
'yunohost', 'yunohost-admin', 'moulinette', 'ssowat',
|
||||||
with_repo=True
|
with_repo=True
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def dpkg_is_broken():
|
||||||
|
# If dpkg is broken, /var/lib/dpkg/updates
|
||||||
|
# will contains files like 0001, 0002, ...
|
||||||
|
# ref: https://sources.debian.org/src/apt/1.4.9/apt-pkg/deb/debsystem.cc/#L141-L174
|
||||||
|
if not os.path.isdir("/var/lib/dpkg/updates/"):
|
||||||
|
return False
|
||||||
|
return any(re.match("^[0-9]+$", f)
|
||||||
|
for f in os.listdir("/var/lib/dpkg/updates/"))
|
||||||
|
|
Loading…
Add table
Reference in a new issue