| Viewing file:  phpini-lib.pl (6.08 KB)      -rwxr-xr-x Select action/file-type:
 
  (+) |  (+) |  (+) | Code (+) | Session (+) |  (+) | SDB (+) |  (+) |  (+) |  (+) |  (+) |  (+) | 
 
# Functions for managing the PHP configuration file
 BEGIN { push(@INC, ".."); };
 use WebminCore;
 &init_config();
 %access = &get_module_acl();
 
 # get_config([file])
 # Returns an array ref of PHP configuration directives from some file
 sub get_config
 {
 local ($file) = @_;
 $file ||= &get_default_php_ini();
 if (!defined($get_config_cache{$file})) {
 local @rv = ( );
 local $lnum = 0;
 local $section;
 open(CONFIG, $file) || return undef;
 while(<CONFIG>) {
 s/\r|\n//g;
 s/\s+$//;
 local $uq;
 if (/^(;?)\s*(\S+)\s*=\s*"(.*)"/ ||
 /^(;?)\s*(\S+)\s*=\s*'(.*)'/ ||
 ($uq = ($_ =~ /^(;?)\s*(\S+)\s*=\s*(.*)/))) {
 # Found a variable
 push(@rv, { 'name' => $2,
 'value' => $3,
 'enabled' => !$1,
 'line' => $lnum,
 'file' => $file,
 'section' => $section,
 });
 if ($uq) {
 # Remove any comments
 $rv[$#rv]->{'value'} =~ s/\s+;.*$//;
 }
 }
 elsif (/^\[(.*)\]/) {
 # A new section
 $section = $1;
 }
 $lnum++;
 }
 close(CONFIG);
 $get_config_cache{$file} = \@rv;
 }
 return $get_config_cache{$file};
 }
 
 # find(name, &config, [disabled-mode])
 sub find
 {
 local ($name, $conf, $mode) = @_;
 local @rv = grep { lc($_->{'name'}) eq lc($name) &&
 ($mode == 0 && $_->{'enabled'} ||
 $mode == 1 && !$_->{'enabled'} ||
 $mode == 2) } @$conf;
 return wantarray ? @rv : $rv[0];
 }
 
 sub find_value
 {
 local @rv = map { $_->{'value'} } &find(@_);
 return $rv[0];
 }
 
 # save_directive(&config, name, [value], [newsection], [neverquote])
 # Updates a single entry in the PHP config file
 sub save_directive
 {
 local ($conf, $name, $value, $newsection, $noquote) = @_;
 $newsection ||= "PHP";
 local $old = &find($name, $conf, 0);
 local $cmt = &find($name, $conf, 1);
 local $lref;
 local $newline = $name." = ".
 ($value !~ /\s/ || $noquote ? $value :
 $value =~ /"/ ? "'$value'" : "\"$value\"");
 if (defined($value) && $old) {
 # Update existing value
 $lref = &read_file_lines($old->{'file'});
 $lref->[$old->{'line'}] = $newline;
 $old->{'value'} = $value;
 }
 elsif (defined($value) && !$old && $cmt) {
 # Update existing commented value
 $lref = &read_file_lines($cmt->{'file'});
 $lref->[$cmt->{'line'}] = $newline;
 $cmt->{'value'} = $value;
 $cmt->{'enabled'} = 1;
 }
 elsif (defined($value) && !$old && !$cmt) {
 # Add a new value, at the end of the section
 local $last;
 foreach my $c (@$conf) {
 if ($c->{'section'} eq $newsection) {
 $last = $c;
 }
 }
 if ($last) {
 # Found last value in the section - add after it
 $lref = &read_file_lines($last->{'file'});
 splice(@$lref, $last->{'line'}+1, 0, $newline);
 &renumber($conf, $last->{'line'}, 1);
 push(@$conf, { 'name' => $name,
 'value' => $value,
 'enabled' => 1,
 'file' => $last->{'file'},
 'line' => $last->{'line'}+1,
 'section' => $newsection,
 });
 }
 else {
 &error("Could not find any values in section $newsection");
 }
 }
 elsif (!defined($value) && $old && $cmt) {
 # Totally remove a value
 $lref = &read_file_lines($old->{'file'});
 splice(@$lref, $old->{'line'}, 1);
 @$conf = grep { $_ ne $old } @$conf;
 &renumber($conf, $old->{'line'}, -1);
 }
 elsif (!defined($value) && $old && !$cmt) {
 # Turn a value into a comment
 $lref = &read_file_lines($old->{'file'});
 $old->{'enabled'} = 0;
 $lref->[$old->{'line'}] = "; ".$lref->[$old->{'line'}];
 }
 }
 
 sub renumber
 {
 local ($conf, $line, $oset) = @_;
 foreach my $c (@$conf) {
 $c->{'line'} += $oset if ($c->{'line'} > $line);
 }
 }
 
 # can_php_config(file)
 # Returns 1 if some config file can be edited
 sub can_php_config
 {
 local ($file) = @_;
 return &indexof($file, map { $_->[0] } &list_php_configs()) >= 0 ||
 $access{'anyfile'};
 }
 
 # get_default_php_ini()
 # Returns the first php.ini that exists
 sub get_default_php_ini
 {
 local @inis = split(/\t+/, $config{'php_ini'});
 foreach my $ai (@inis) {
 local ($f, $d) = split(/=/, $ai);
 return $f if (-r $f);
 }
 if (-r $config{'alt_php_ini'} && @inis) {
 # Fall back to default file
 local ($f) = split(/=/, $inis[0]);
 ©_source_dest($config{'alt_php_ini'}, $f);
 return $f;
 }
 return undef;
 }
 
 # list_php_configs()
 # Returns a list of allowed config files and descriptions
 sub list_php_configs
 {
 local @rv;
 &get_default_php_ini();        # Force copy of sample ini file
 if ($access{'global'}) {
 foreach my $ai (split(/\t+/, $config{'php_ini'})) {
 local ($f, $d) = split(/=/, $ai);
 push(@rv, [ $f, $d || $text{'file_global'} ]);
 }
 }
 foreach my $ai (split(/\t+/, $access{'php_inis'})) {
 local ($f, $d) = split(/=/, $ai);
 push(@rv, [ $f, $d || $f ]);
 }
 return @rv;
 }
 
 # onoff_radio(name)
 # Returns a field for editing a binary configuration value
 sub onoff_radio
 {
 local ($name) = @_;
 local $v = &find_value($name, $conf);
 return &ui_radio($name, lc($v) eq "on" || lc($v) eq "true" ||
 lc($v) eq "yes" || $v eq "1" ? "On" : $v ? "Off" : "",
 [ !$v ? ( [ "", $text{'default'} ] ) : ( ),
 [ "On", $text{'yes'} ],
 [ "Off", $text{'no'} ] ]);
 }
 
 # graceful_apache_restart()
 # Signal a graceful Apache restart, to pick up new php.ini settings
 sub graceful_apache_restart
 {
 if (&foreign_installed("apache")) {
 &foreign_require("apache", "apache-lib.pl");
 if (&apache::is_apache_running() &&
 $apache::httpd_modules{'core'} >= 2 &&
 &has_command($apache::config{'apachectl_path'})) {
 &clean_environment();
 &system_logged("$apache::config{'apachectl_path'} graceful >/dev/null 2>&1");
 &reset_environment();
 }
 }
 }
 
 # get_config_as_user([file])
 # Like get_config, but reads with permissions of the ACL user
 sub get_config_as_user
 {
 local ($file) = @_;
 if ($access{'user'} && $access{'user'} ne 'root' && $< == 0) {
 local $rv = &eval_as_unix_user(
 $access{'user'}, sub { &get_config($file) });
 if ((!$rv || !@$rv) && $!) {
 &error(&text('file_eread', &html_escape($file), $!));
 }
 return $rv;
 }
 else {
 return &get_config($file);
 }
 }
 
 # flush_file_lines_as_user(file)
 # Writes out a file as the Unix user configured in this module's ACL
 sub flush_file_lines_as_user
 {
 local ($file) = @_;
 if ($access{'user'} && $access{'user'} ne 'root' && $< == 0) {
 &eval_as_unix_user($access{'user'},
 sub { &flush_file_lines($file) });
 }
 else {
 &flush_file_lines($file);
 }
 }
 
 1;
 
 
 |