Add UI for deleting packages and modules

This commit is contained in:
Jamie Cameron
2025-04-08 20:12:38 -07:00
parent 18bd46fe93
commit 3e1b07f823
3 changed files with 75 additions and 15 deletions

View File

@@ -27,18 +27,34 @@ foreach my $name (@d) {
push(@delpkgs, $pkg);
}
# Actually do the deletion
&ui_print_unbuffered_header(undef, $text{'dpkgs_title'}, "");
foreach my $pkg (@delpkgs) {
print &text('dpkgs_doing', "<tt>$pkg->{'name'}</tt>",
$pkg->{'phpver'}),"<br>\n";
$err = &delete_php_base_package($pkg);
if ($err) {
print &text('dpkgs_failed', $err),"<p>\n";
if (!$in{'confirm'}) {
# Find the packages first
print &ui_form_start("delete_pkgs.cgi");
foreach my $d (@d) {
print &ui_hidden("d", $d);
}
else {
print $text{'dpkgs_done'},"<p>\n";
my @alldel;
foreach my $pkg (@delpkgs) {
push(@alldel, &list_all_php_version_packages($pkg));
}
print &text('dpkgs_rusure',
join(" ", map { "<tt>$_</tt>" } @alldel)),"<p>\n";
print &ui_form_end([ [ 'confirm', $text{'pkgs_delete'} ] ]);
}
else {
# Actually do the deletion
foreach my $pkg (@delpkgs) {
print &text('dpkgs_doing', "<tt>$pkg->{'name'}</tt>",
$pkg->{'phpver'}),"<br>\n";
$err = &delete_php_base_package($pkg);
if ($err) {
print &text('dpkgs_failed', $err),"<p>\n";
}
else {
print $text{'dpkgs_done'},"<p>\n";
}
}
}

View File

@@ -234,11 +234,12 @@ 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_doing=Uninstalling package $1 and modules 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
dpkgs_rusure=Are you sure you want to remove the selected PHP packages : $1
__norefs=1

View File

@@ -913,6 +913,26 @@ for(my $i=0; $i<$n; $i++) {
return sort { &compare_version_numbers($a->{'ver'}, $b->{'ver'}) } @rv;
}
# list_all_php_module_packages(base-package)
# Returns all install packages for PHP extensions of a given base package
sub list_all_php_module_packages
{
my ($base) = @_;
$base =~ s/(-php|-runtime)$//;
my @rv;
&foreign_require("software");
my $n = &software::list_packages();
for(my $i=0; $i<$n; $i++) {
my $name = $software::packages{$i,'name'};
next if ($name !~ /^\Q$base\E-/);
push(@rv, { 'name' => $software::packages{$i,'name'},
'system' => $software::packages{$i,'system'},
'ver' => $software::packages{$i,'version'},
});
}
return @rv;
}
# list_available_php_packages()
# Returns a list of hash refs, one per PHP version available, with the
# following keys :
@@ -959,17 +979,40 @@ foreach my $d (&virtual_server::list_domains()) {
return \%vmap;
}
# list_all_php_version_packages(&base-pkg)
# Returns all package names for installed packages related to one PHP package,
# such as those for extensions
sub list_all_php_version_packages
{
my ($pkg) = @_;
&foreign_require("software");
my @rv = map { $_->{'name'} }
&list_all_php_module_packages($pkg->{'name'});
my $base = $pkg->{'name'};
$base =~ s/-php$//;
my @poss = ( @modpkgs, $base."-php", $base."-runtime", $base );
foreach my $p (@poss) {
my @info = &software::package_info($p, $pkg->{'ver'});
next if (!@info);
push(@rv, $p);
}
return @rv;
}
# 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);
foreach my $p (&list_all_php_version_packages($pkg)) {
my @info = &software::package_info($p);
next if (!@info);
my $err = &software::delete_package($p, { 'nodeps' => 1 });
if ($err) {
return &html_strip($err);
}
}
return $err;
return undef;
}
1;