On 3/23/18 12:21 PM, Fabian Grünbichler wrote: > since this happens quite regularly when users accidentally install > conflicting packages. >
works good! But touching $check_file once makes it stay permanent, rendering the hook useless for the next time. E:g., when I have a messed up system and need/want to allow removing proxmox-ve and installing it again to get out of the mess. So maybe either remove the file actively if it's there and proxmox-ve gets removed, or place the file in /run, so that a reboot cleans it indirectly. I like the former more, but no heavy opinions here... :) > 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 <[email protected]> > --- > 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/ > _______________________________________________ pve-devel mailing list [email protected] https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
