From aa55e33b7e1aa1966cc848274aa7924670e6d2ba Mon Sep 17 00:00:00 2001 From: Jamie Cameron Date: Tue, 1 Apr 2025 22:24:33 -0700 Subject: [PATCH] Work on page to show PHP versions --- phpini/index.cgi | 10 +++++++++ phpini/lang/en | 14 +++++++++++++ phpini/list_pkgs.cgi | 50 ++++++++++++++++++++++++++++++++++++++++++++ phpini/phpini-lib.pl | 41 ++++++++++++++++++++++++++++++++++++ 4 files changed, 115 insertions(+) create mode 100644 phpini/list_pkgs.cgi diff --git a/phpini/index.cgi b/phpini/index.cgi index d283cbd6b..1d38bf387 100755 --- a/phpini/index.cgi +++ b/phpini/index.cgi @@ -61,6 +61,16 @@ else { print &ui_form_end(); } + # Show button to install PHP versions + if ($access{'global'} && &foreign_available("software")) { + print &ui_hr(); + print &ui_buttons_start(); + print &ui_buttons_row("list_pkgs.cgi", + $text{'index_pkgs'}, + $text{'index_pkgsdesc'}); + print &ui_buttons_end(); + } + &ui_print_footer("/", $text{'index'}); } diff --git a/phpini/lang/en b/phpini/lang/en index 82639368f..eabe0ae13 100644 --- a/phpini/lang/en +++ b/phpini/lang/en @@ -9,6 +9,8 @@ index_edit=Manage index_manual=Edit Manually index_anyfile=Edit other PHP configuration file index_return=configuration files +index_pkgs=Manage PHP Packages +index_pkgsdesc=Install and remove PHP versions from your system's software package repository, so that they can be configured here any used in Virtualmin. file_global=Global PHP configuration file_eread=Failed to read $1 : $2 @@ -214,4 +216,16 @@ acl_user=Read and write files as user opt_default=Default Value: $1 opt_default_unknown=Unknown +pkgs_title=PHP Packages +pkgs_name=Package name +pkgs_ver=Package version +pkgs_phpver=PHP version +pkgs_users=Used by +pkgs_delete=Delete Selected Packages +pkgs_none=No PHP packages were found on your system! +pkgs_ecannot=You are not allowed to manage PHP packages! +pkgs_ecannot2=Software packages cannot be managed on this system +pkgs_nousers=No domains +pkgs_ucount=$1 domains + __norefs=1 diff --git a/phpini/list_pkgs.cgi b/phpini/list_pkgs.cgi new file mode 100644 index 000000000..bc8806bf3 --- /dev/null +++ b/phpini/list_pkgs.cgi @@ -0,0 +1,50 @@ +#!/usr/local/bin/perl +# Show all installed PHP versions + +require './phpini-lib.pl'; +$access{'global'} || &error($text{'pkgs_ecannot'}); +&foreign_available("software") || &error($text{'pkgs_ecannot2'}); + +&ui_print_header(undef, $text{'pkgs_title'}, ""); + +my @pkgs = &list_php_base_packages(); +if (@pkgs) { + my %vmap; + if (&foreign_check("virtual-server")) { + # Get the domain to PHP version map + &foreign_require("virtual-server"); + foreach my $d (&virtual_server::list_domains()) { + my $v = $d->{'php_fpm_version'} || + $d->{'php_version'}; + if ($v) { + $vmap{$v} ||= [ ]; + push(@{$vmap{$v}}, $d); + } + } + } + my @tds = ( "width=5" ); + print &ui_form_start("delete_pkgs.cgi", "post"); + print &ui_columns_start([ "", $text{'pkgs_name'}, + $text{'pkgs_ver'}, + $text{'pkgs_phpver'}, + $text{'pkgs_users'} ], \@tds); + foreach my $pkg (@pkgs) { + my $ulist = $vmap{$pkg->{'shortver'}}; + my $users = !$ulist || !@$ulist ? $text{'pkgs_nousers'} : + @$ulist > 5 ? &text('pkgs_ucount',scalar(@$ulist)) : + join(", ", map { "$_->{'dom'}" } @$ulist); + print &ui_checked_columns_row([ + $pkg->{'name'}, + $pkg->{'ver'}, + $pkg->{'phpver'}, + $users, + ], \@tds, "d", $pkg->{'name'}); + } + print &ui_columns_end(); + print &ui_form_end([ [ undef, $text{'pkgs_delete'} ] ]); + } +else { + print "$text{'pkgs_none'}

\n"; + } + +&ui_print_footer("", $text{'index_return'}); diff --git a/phpini/phpini-lib.pl b/phpini/phpini-lib.pl index 433d0b862..0035f1f66 100755 --- a/phpini/phpini-lib.pl +++ b/phpini/phpini-lib.pl @@ -866,5 +866,46 @@ else { return @poss; } +# list_php_base_packages() +# Returns a list of hash refs, one per PHP version installed, with the following keys +# name - Package name +# system - Package system +# ver - Package version +# phpver - PHP version +sub list_php_base_packages +{ +&foreign_require("software"); +my $n = &software::list_packages(); +my @rv; +for(my $i=0; $i<$n; $i++) { + my $name = $software::packages{$i,'name'}; + next if ($name !~ /^php(\d*)$/); + my $suffix = $1; + my $phpver = $software::packages{$i,'version'}; + $phpver =~ s/\-.*$//; + my $bin; + foreach my $b ($name, $name."-cgi", "php-".$phpver) { + if ($bin = &has_command($b)) { + last; + } + } + if ($bin) { + my $out = &backquote_command("$bin -v 2>&1"); + if ($out =~ /(^|\n)PHP\s+([\d\.]+)/) { + $phpver = $2; + } + } + my $shortver = $phpver; + $shortver =~ s/^(\d+\.\d+).*$/$1/; + push(@rv, { 'name' => $software::packages{$i,'name'}, + 'system' => $software::packages{$i,'system'}, + 'ver' => $software::packages{$i,'version'}, + 'shortver' => $shortver, + 'phpver' => $phpver, + 'binary' => $bin, }); + } +return sort { &compare_version_numbers($a->{'ver'}, $b->{'ver'}) } @rv; +} + 1;