[pve-devel] [PATCH] add APT hook to prevent proxmox-ve removal
Fabian Grünbichler
f.gruenbichler at proxmox.com
Fri Mar 23 12:21:34 CET 2018
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 <f.gruenbichler at proxmox.com>
---
debian/apthook/10pveapthook | 4 +++
debian/apthook/pve-apt-hook | 72 +++++++++++++++++++++++++++++++++++++++++++++
debian/proxmox-ve.install | 2 ++
3 files changed, 78 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..c09ab73
--- /dev/null
+++ b/debian/apthook/pve-apt-hook
@@ -0,0 +1,72 @@
+#!/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");
+ } 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.14.2
More information about the pve-devel
mailing list