From 18bd46fe93ecc740499439b3ae3cb41cb9054ce0 Mon Sep 17 00:00:00 2001 From: Jamie Cameron Date: Sun, 6 Apr 2025 18:58:58 -0700 Subject: [PATCH] Work on support for removing packages --- phpini/delete_pkgs.cgi | 45 ++++++++++++++++++++++++++++++++++++++++++ phpini/lang/en | 10 ++++++++++ phpini/list_pkgs.cgi | 2 +- phpini/phpini-lib.pl | 23 +++++++++++++++++---- 4 files changed, 75 insertions(+), 5 deletions(-) create mode 100644 phpini/delete_pkgs.cgi diff --git a/phpini/delete_pkgs.cgi b/phpini/delete_pkgs.cgi new file mode 100644 index 000000000..36bbae3af --- /dev/null +++ b/phpini/delete_pkgs.cgi @@ -0,0 +1,45 @@ +#!/usr/local/bin/perl +# Remove some PHP versions + +require './phpini-lib.pl'; +&error_setup($text{'dpkgs_err'}); +$access{'global'} || &error($text{'pkgs_ecannot'}); +&foreign_available("software") || &error($text{'pkgs_ecannot2'}); +&ReadParse(); + +my @d = split(/\0/, $in{'d'}); +@d || &error($text{'dpkgs_enone'}); +my $vmap = &get_virtualmin_php_map(); + +# Find all packages and check that they can be safely removed +my @pkgs = &list_php_base_packages(); +my @delpkgs; +foreach my $name (@d) { + ($pkg) = grep { $_->{'name'} eq $name } @pkgs; + $pkg || &error($text{'dpkgs_eexists'}); + if ($vmap) { + $ulist = $vmap->{$pkg->{'shortver'}}; + if ($ulist && @$ulist) { + &error(&text('dpkg_eusers', $pkg->{'phpver'}, + scalar(@$ulist))); + } + } + push(@delpkgs, $pkg); + } + +# Actually do the deletion +&ui_print_unbuffered_header(undef, $text{'dpkgs_title'}, ""); + +foreach my $pkg (@delpkgs) { + print &text('dpkgs_doing', "$pkg->{'name'}", + $pkg->{'phpver'}),"
\n"; + $err = &delete_php_base_package($pkg); + if ($err) { + print &text('dpkgs_failed', $err),"

\n"; + } + else { + print $text{'dpkgs_done'},"

\n"; + } + } + +&ui_print_footer("list_pkgs.cgi", $text{'pkgs_return'}); diff --git a/phpini/lang/en b/phpini/lang/en index 5643bd5d0..7b81116f4 100644 --- a/phpini/lang/en +++ b/phpini/lang/en @@ -230,5 +230,15 @@ pkgs_nousers=No domains pkgs_ucount=$1 domains pkgs_newver=PHP package to install: pkgs_install=Install Now +pkgs_return=PHP packages + +dpkgs_err=Failed to delete PHP packages +dpkgs_title=Deleting PHP Packages +dpkgs_doing=Uninstalling package $1 for PHP version $2 .. +dpkgs_failed=.. failed : $1 +dpkgs_done=.. uninstalled successfully +dpkgs_enone=No packages selected +dpkgs_eexists=Package does not exist! +dpkg_eusers=Package for PHP version $1 cannot be uninstalled, as it is still being used by $2 domains __norefs=1 diff --git a/phpini/list_pkgs.cgi b/phpini/list_pkgs.cgi index db161d469..0a8738315 100644 --- a/phpini/list_pkgs.cgi +++ b/phpini/list_pkgs.cgi @@ -54,7 +54,7 @@ if (&foreign_installed("package-updates")) { print "$text{'pkgs_newver'}\n"; print &ui_select("u", undef, [ map { [ $_->{'name'}, - $_->{'name'}." (".$_->{'version'}.")" ] } @newpkgs ]); + $_->{'name'}." (".$_->{'ver'}.")" ] } @newpkgs ]); print &ui_hidden( "redir", &get_webprefix()."/$module_name/list_pkgs.cgi"); print &ui_hidden("redirdesc", $text{'pkgs_title'}); diff --git a/phpini/phpini-lib.pl b/phpini/phpini-lib.pl index a9b012717..1e37c8b95 100755 --- a/phpini/phpini-lib.pl +++ b/phpini/phpini-lib.pl @@ -878,9 +878,10 @@ sub list_php_base_packages &foreign_require("software"); my $n = &software::list_packages(); my @rv; +my %done; for(my $i=0; $i<$n; $i++) { my $name = $software::packages{$i,'name'}; - next if ($name !~ /^php(\d*)$/); + next if ($name !~ /^php(\d*)(-php)?$/); my $suffix = $1; my $phpver = $software::packages{$i,'version'}; $phpver =~ s/\-.*$//; @@ -901,6 +902,7 @@ for(my $i=0; $i<$n; $i++) { if ($shortver =~ /^5\./) { $shortver = "5"; } + next if ($done{$phpver}++); push(@rv, { 'name' => $software::packages{$i,'name'}, 'system' => $software::packages{$i,'system'}, 'ver' => $software::packages{$i,'version'}, @@ -930,7 +932,7 @@ foreach my $pkg (&package_updates::list_available()) { $shortver = "5"; } push(@rv, { 'name' => $pkg->{'name'}, - 'version' => $pkg->{'version'}, + 'ver' => $pkg->{'version'}, 'shortver' => $shortver, 'phpver' => $phpver, }); @@ -947,8 +949,8 @@ my %vmap; &foreign_check("virtual-server") || return undef; &foreign_require("virtual-server"); foreach my $d (&virtual_server::list_domains()) { - my $v = $d->{'php_fpm_version'} || - $d->{'php_version'}; + my $v = $d->{'php_mode'} eq 'fpm' ? $d->{'php_fpm_version'} + : $d->{'php_version'}; if ($v) { $vmap{$v} ||= [ ]; push(@{$vmap{$v}}, $d); @@ -957,5 +959,18 @@ foreach my $d (&virtual_server::list_domains()) { return \%vmap; } +# delete_php_base_package(&package) +# Delete a PHP package, and return undef on success or an error on failure +sub delete_php_base_package +{ +my ($pkg) = @_; +&foreign_require("software"); +my $err = &software::delete_package($pkg->{'name'}, { }, $pkg->{'ver'}); +if ($err) { + $err = &html_strip($err); + } +return $err; +} + 1;