diff options
-rw-r--r-- | Changes | 10 | ||||
-rw-r--r-- | MANIFEST.SKIP | 1 | ||||
-rw-r--r-- | Makefile.PL | 4 | ||||
-rw-r--r-- | lib/Apache/Defaults.pm | 72 |
4 files changed, 65 insertions, 22 deletions
@@ -1,3 +1,9 @@ +1.03 2021-02-12 + - Change bugtracker address. +1.02 2019-08-25 + - Make sure constructor never croaks if on_error is set to 'return' + Improve diagnostics. +1.01 2018-07-17 + - Prefer apachectl over invoking httpd directly. 1.00 2018-02-24 - -* Initial release. + - Initial release. diff --git a/MANIFEST.SKIP b/MANIFEST.SKIP index 58696be..3fb78f0 100644 --- a/MANIFEST.SKIP +++ b/MANIFEST.SKIP @@ -22,6 +22,7 @@ \bpm_to_blib\.ts$ \bpm_to_blib$ \bblibdirs\.ts$ # 6.18 through 6.25 generated this +\bMANIFEST\.SKIP$ # Avoid Module::Build generated and utility files. \bBuild$ diff --git a/Makefile.PL b/Makefile.PL index 9918d74..7cdd45a 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -27,6 +27,10 @@ WriteMakefile(NAME => 'Apache::Defaults', url => 'git://git.gnu.org.ua/apache-defaults.git', web => 'http://git.gnu.org.ua/cgit/apache-defaults.git' }, + bugtracker => { + web => 'https://puszcza.gnu.org.ua/bugs/?group=apache-defaults', + mailto => 'gray+apache-defaults@gnu.org.ua' + } }, provides => Module::Metadata->provides(version => '1.4', dir => 'lib') diff --git a/lib/Apache/Defaults.pm b/lib/Apache/Defaults.pm index 70d5385..0978456 100644 --- a/lib/Apache/Defaults.pm +++ b/lib/Apache/Defaults.pm @@ -9,7 +9,7 @@ use Text::ParseWords; use Symbol 'gensym'; use Carp; -our $VERSION = '1.00'; +our $VERSION = '1.03'; sub new { my $class = shift; @@ -31,7 +31,7 @@ sub new { @servlist = ( $v ); } } else { - @servlist = qw(/usr/sbin/httpd /usr/sbin/apache2); + @servlist = qw(/usr/sbin/apachectl /usr/sbin/httpd /usr/sbin/apache2); } if (my @select = grep { -x $_->[0] } @@ -44,23 +44,54 @@ sub new { croak "No suitable httpd binary found"; } - if ($v = delete $_{environ}) { - my $env = Shell::GetEnv->new('sh', ". $v", - { startup => 0 }); - if ($env->status) { + my $envfile = delete $_{environ}; + croak "unrecognized arguments" if keys(%_); + + if ($envfile) { + unless (-f $envfile) { + if ($self->{on_error} eq 'return') { + $self->{status} = 127; + $self->{error} = "environment file $envfile does not exist"; + return $self; + } else { + croak "environment file $envfile does not exist"; + } + } + unless (-r $envfile) { + if ($self->{on_error} eq 'return') { + $self->{status} = 127; + $self->{error} = "environment file $envfile is not readable"; + return $self; + } else { + croak "environment file $envfile is not readable"; + } + } + + my $env = eval { + Shell::GetEnv->new('sh', ". $envfile", { startup => 0 }); + }; + if ($@) { + if ($self->{on_error} eq 'return') { + $self->{status} = 127; + $self->{error} = $@; + return $self; + } else { + croak $@; + } + } elsif ($env->status) { if ($self->{on_error} eq 'return') { $self->{status} = $env->status; $self->{error} = "Failed to inherit environment"; + return $self; } else { croak sprintf("Got status %d trying to inherit environment", $env->status); } - } - $self->{environ} = $env->envs; + } else { + $self->{environ} = $env->envs; + } } - croak "unrecognized arguments" if keys(%_); - $self->_get_version_info unless $self->status; $self->_get_module_info unless $self->status; @@ -74,7 +105,6 @@ sub environ { shift->{environ} } sub probe { my ($self, $cb, @opt) = @_; - open(my $nullout, '>', File::Spec->devnull); open(my $nullin, '<', File::Spec->devnull); my $out = gensym; @@ -382,24 +412,26 @@ command line can also be used, e.g.: The default used in the absense of this attribute is: - [ '/usr/sbin/httpd', '/usr/sbin/apache2' ] + [ '/usr/sbin/apachectl', '/usr/sbin/httpd', '/usr/sbin/apache2' ] +The use of B<apachectl> is preferred over directly invoking B<httpd> daemon, +because the apache configuration file might contain referenmces to environment +variables defined elsewhere, which will cause B<httpd> to fail. B<apachectl> +takes care of this by including the file with variable definitions prior to +calling B<httpd>. See also C<environ>, below. + =item C<environ> Name of the shell script that sets the environment for B<httpd> invocation. - -If invoked with the B<-V> option, B<httpd> attempts to read its configuration -file and will fail if the latter contains references to the environment -variables defined elsewhere. This is quite common in Debian-based -distributions, which define the environment variables in file -F</etc/apache2/envvars>. To avoid such failures, use the C<environ> attribute, -e.g.: +Usually, this is the same script that is sourced by B<apachectl> prior to +passing control over to B<httpd>. This option provides another solution to +the environment problem mentioned above. E.g.: $x = new Apache::Defaults(environ => /etc/apache2/envvars) =item C<on_error> -Controls the error handling. Allowed values are C<croak> and C<return>. +Controls error handling. Allowed values are C<croak> and C<return>. If the value is C<croak> (the default), the method will I<croak> if an error occurs. If set to C<return>, the constructor will return a valid object. The B<httpd> exit status and diagnostics emitted to the stderr |