diff --git a/phpini/edit_dirs.cgi b/phpini/edit_dirs.cgi index 848610172..4efc99545 100755 --- a/phpini/edit_dirs.cgi +++ b/phpini/edit_dirs.cgi @@ -27,6 +27,12 @@ print &ui_table_row($text{'dirs_ext'}, 60, $text{'default'})." ". &file_chooser_button("ext", 1)); +# Enabled extensions +my @exts = map { $_->{'value'} } &find("extension", $conf); +my @avail = &list_available_extensions($conf, $in{'file'}); +print &ui_table_row($text{'dirs_exts'}, + &ui_select("exts", \@exts, \@avail, 10, 1, 1)); + # Can accept uploads? print &ui_table_row($text{'dirs_upload'}, &onoff_radio("file_uploads")); diff --git a/phpini/lang/en b/phpini/lang/en index f893c9108..56204c7bb 100644 --- a/phpini/lang/en +++ b/phpini/lang/en @@ -39,6 +39,7 @@ dirs_header=PHP script and extension directory settings dirs_include=Search directories for includes dirs_below=Listed below.. dirs_ext=Directory for extensions +dirs_exts=Extensions to load dirs_upload=Allow file uploads? dirs_utmp=Temporary directory for uploaded files dirs_err=Failed to save directory settings diff --git a/phpini/phpini-lib.pl b/phpini/phpini-lib.pl index 8fab057fa..821da586a 100755 --- a/phpini/phpini-lib.pl +++ b/phpini/phpini-lib.pl @@ -224,11 +224,13 @@ return undef; } # list_php_configs() -# Returns a list of allowed config files and descriptions +# Returns a list of allowed config files, descriptions and PHP commands sub list_php_configs { local @rv; &get_default_php_ini(); # Force copy of sample ini file + +# Add system-wide INI files if ($access{'global'}) { foreach my $ai (split(/\t+/, $config{'php_ini'})) { local ($f, $d) = split(/=/, $ai); @@ -239,6 +241,8 @@ if ($access{'global'}) { } } } + +# Add INI files from ACL foreach my $ai (split(/\t+/, $access{'php_inis'})) { local ($f, $d) = split(/=/, $ai); foreach my $fp (split(/,/, $f)) { @@ -247,12 +251,16 @@ foreach my $ai (split(/\t+/, $access{'php_inis'})) { } } } + +# Convert dirs to files foreach my $i (@rv) { if (-d $i->[0] && -r "$i->[0]/php.ini") { $i->[0] = "$i->[0]/php.ini"; } } -if ($access{'global'} && &foreign_installed("virtual-server")) { + +# Add PHP INI files from Virtualmin +if ($access{'global'} && &foreign_check("virtual-server")) { &foreign_require("virtual-server"); foreach my $v (&virtual_server::list_available_php_versions()) { if ($v->[0]) { @@ -261,6 +269,26 @@ if ($access{'global'} && &foreign_installed("virtual-server")) { } } } + +# Merge in paths to PHP if we can get them +if (&foreign_check("virtual-server")) { + &foreign_require("virtual-server"); + my %vmap = map { $_->[0], $_ } + &virtual_server::list_available_php_versions(); + foreach my $rv (@rv) { + if ($rv->[0] =~ /etc\/php(\S+)\/php.ini/ && $vmap{$1}) { + $rv->[2] = $vmap{$1}->[1]; + $rv->[2] =~ s/-cgi//; + } + } + } +foreach my $rv (@rv) { + if ($rv->[0] =~ /php(\d+)/) { + $rv->[2] ||= &has_command("php$1"); + } + $rv->[2] ||= &has_command("php"); + } + my %done; return grep { !$done{$_->[0]}++ } @rv; } @@ -398,5 +426,31 @@ else { } } +# list_available_extensions(&conf, file) +# Returns a list of all available PHP extension modules +sub list_available_extensions +{ +my ($conf, $file) = @_; +my $dir = &find_value("extension_dir", $conf); +if (!$dir) { + # Figure it out from the PHP command + my ($conf) = grep { $_->[0] eq $file } &list_php_configs(); + if ($conf && $conf->[2]) { + my $out = &backquote_command("$conf->[2] -i 2>/dev/null \s+(\S+)/) { + $dir = $1; + } + } + } +if ($dir) { + # Get all the extensions + opendir(DIR, $dir); + my @exts = grep { /\.so$/ } readdir(DIR); + closedir(DIR); + return @exts; + } +return (); +} + 1; diff --git a/phpini/save_dirs.cgi b/phpini/save_dirs.cgi index c60dda0d4..d66cf73b8 100755 --- a/phpini/save_dirs.cgi +++ b/phpini/save_dirs.cgi @@ -22,6 +22,8 @@ else { $in{'ext_def'} || $in{'ext'} =~ /\S/ || &error($text{'dirs_eext'}); &save_directive($conf, "extension_dir", $in{'ext_def'} ? undef : $in{'ext'}); +&save_directive($conf, "extension", [ split(/\0/, $in{'exts'}) ]); + &save_directive($conf, "file_uploads", $in{'file_uploads'} || undef); $in{'utmp_def'} || -d $in{'utmp'} || &error($text{'dirs_eutmp'});