From 5132916e5b10a5cd6e97e74d0028215981f5eb80 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Fabian=20Gr=C3=BCnbichler?= Date: Tue, 3 Apr 2018 09:18:08 +0200 Subject: [PATCH] add APT hook to prevent proxmox-ve removal MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit since this happens quite regularly when users accidentally install conflicting packages. sample output: $ apt remove pve-qemu-kvm Reading package lists... Done Building dependency tree Reading state information... Done The following packages were automatically installed and are no longer required: libxml-libxml-perl proxmox-widget-toolkit pve-edk2-firmware pve-i18n pve-xtermjs Use 'apt autoremove' to remove them. The following packages will be REMOVED: proxmox-ve pve-container pve-ha-manager pve-ha-manager-dbgsym pve-manager pve-qemu-kvm qemu-server spiceterm 0 upgraded, 0 newly installed, 8 to remove and 0 not upgraded. After this operation, 37.6 MB disk space will be freed. Do you want to continue? [Y/n] y W: (pve-apt-hook) !! WARNING !! W: (pve-apt-hook) You are attempting to remove the meta-package 'proxmox-ve'! W: (pve-apt-hook) W: (pve-apt-hook) If you really you want to permanently remove 'proxmox-ve' from your system, run the following command W: (pve-apt-hook) touch '/please-remove-proxmox-ve' W: (pve-apt-hook) and repeat your apt-get/apt invocation. W: (pve-apt-hook) W: (pve-apt-hook) If you are unsure why 'proxmox-ve' would be removed, please verify W: (pve-apt-hook) - your APT repository settings W: (pve-apt-hook) - that you are using 'apt-get dist-upgrade' or 'apt full-upgrade' to upgrade your system E: Sub-process /usr/share/proxmox-ve/pve-apt-hook returned an error code (1) E: Failure running script /usr/share/proxmox-ve/pve-apt-hook Signed-off-by: Fabian Grünbichler --- debian/apthook/10pveapthook | 4 ++ debian/apthook/pve-apt-hook | 73 +++++++++++++++++++++++++++++++++++++ debian/proxmox-ve.install | 2 + 3 files changed, 79 insertions(+) create mode 100644 debian/apthook/10pveapthook create mode 100755 debian/apthook/pve-apt-hook diff --git a/debian/apthook/10pveapthook b/debian/apthook/10pveapthook new file mode 100644 index 0000000..b7ae649 --- /dev/null +++ b/debian/apthook/10pveapthook @@ -0,0 +1,4 @@ +DPkg::Pre-Install-Pkgs { "/usr/share/proxmox-ve/pve-apt-hook"; }; +DPkg::Tools::Options::/usr/share/proxmox-ve/pve-apt-hook ""; +DPkg::Tools::Options::/usr/share/proxmox-ve/pve-apt-hook::Version "2"; +DPkg::Tools::Options::/usr/share/proxmox-ve/pve-apt-hook::InfoFD "20"; diff --git a/debian/apthook/pve-apt-hook b/debian/apthook/pve-apt-hook new file mode 100755 index 0000000..f925090 --- /dev/null +++ b/debian/apthook/pve-apt-hook @@ -0,0 +1,73 @@ +#!/usr/bin/perl + +use strict; +use warnings; + +use File::Basename; + +my $fd = $ENV{APT_HOOK_INFO_FD}; +my $check_file = '/please-remove-proxmox-ve'; +my $check_package = 'proxmox-ve'; +my $hook_name = basename($0); + +my $log = sub { + my ($line) = @_; + print "W: ($hook_name) $line"; +}; + +if (!defined $fd || $fd == 0) { + $log->("APT_HOOK_INFO_FD not correctly defined, skipping apt-pve-hook checks\n"); + exit 0; +} + +open(my $fh, "<&=${fd}") or die "E: could not open APT_HOOK_INFO_FD (${fd}) - $!\n"; + +my $cleanup = sub { + my ($rc) = @_; + + close($fh); + exit $rc; +}; + +chomp (my $ver = <$fh>); +if ($ver ne "VERSION 2") { + $log->("apt-pve-hook misconfigured, expecting hook protocol version 2\n"); + $cleanup->(0); +} + +my $blank; +while (my $line = <$fh>) { + chomp $line; + + if (!defined($blank)) { + $blank = 1 if !$line; + next; + } + + my ($pkg, $old, $dir, $new, $action) = (split / /, $line, 5); + if (!defined($action)) { + $log->("apt-pve-hook encountered unexpected line: $line\n"); + next; + } + + if ($pkg eq 'proxmox-ve' && $action eq '**REMOVE**') { + if (-e $check_file) { + $log->("'$check_file' exists, proceeding with removal of package '${check_package}'\n"); + unlink $check_file; + } else { + $log->("!! WARNING !!\n"); + $log->("You are attempting to remove the meta-package '${check_package}'!\n"); + $log->("\n"); + $log->("If you really you want to permanently remove '${check_package}' from your system, run the following command\n"); + $log->("\ttouch '${check_file}'\n"); + $log->("and repeat your apt-get/apt invocation.\n"); + $log->("\n"); + $log->("If you are unsure why '$check_package' would be removed, please verify\n"); + $log->("\t- your APT repository settings\n"); + $log->("\t- that you are using 'apt-get dist-upgrade' or 'apt full-upgrade' to upgrade your system\n"); + $cleanup->(1); + } + } +} + +$cleanup->(0); diff --git a/debian/proxmox-ve.install b/debian/proxmox-ve.install index 6ac09f5..13d16c4 100644 --- a/debian/proxmox-ve.install +++ b/debian/proxmox-ve.install @@ -1 +1,3 @@ debian/proxmox-ve-release-5.x.gpg etc/apt/trusted.gpg.d/ +debian/apthook/10pveapthook etc/apt/apt.conf.d/ +debian/apthook/pve-apt-hook usr/share/proxmox-ve/ -- 2.39.2