From 3a9980f96e6fe23b8de35556d16984d34e853b2a Mon Sep 17 00:00:00 2001 From: Sergey Poznyakoff Date: Mon, 13 Jan 2020 15:44:18 +0200 Subject: Fix apache layout detection * lib/App/Acmeman/Apache/Layout.pm (new): Split into two constructors: new and detect. Always pass the server parameter to the Apache::Defaults constructor. (App::Acmeman::Apache::Layout::auto): Remove. * lib/App/Acmeman/Source/Apache.pm (new): Use Layout->detect, instead of new. (server_root): Return server_root from the layout, unless it was set explicitly. --- lib/App/Acmeman/Apache/Layout.pm | 100 +++++++++++++++++---------------------- lib/App/Acmeman/Source/Apache.pm | 8 ++-- 2 files changed, 47 insertions(+), 61 deletions(-) diff --git a/lib/App/Acmeman/Apache/Layout.pm b/lib/App/Acmeman/Apache/Layout.pm index 1f2027c..5c6d191 100644 --- a/lib/App/Acmeman/Apache/Layout.pm +++ b/lib/App/Acmeman/Apache/Layout.pm @@ -6,6 +6,8 @@ use Carp; use File::Basename; use feature 'state'; use App::Acmeman::Log qw(:all); +use Apache::Defaults; +use Carp; sub _find_httpd { my $httpd; @@ -44,65 +46,60 @@ sub modules { @$loaders; } -# new(NAME) -# new() sub new { - my $class = shift; - - if (@_ == 0) { - # Autodetect - debug(3, "detecting Apache configuration layout"); - my $ap = new Apache::Defaults(server => $class->_find_httpd, - on_error => 'return'); - if ($ap->status) { - croak "unable to get Apache defaults: " . $ap->error; - } - - foreach my $mod ($class->modules) { - debug(3, "trying layout module $mod"); - my $obj; - eval { - $obj = $mod->new($ap); - }; - if ($obj) { - return $obj; - } - if ($@) { - debug(3, "layout module failed: $@"); - } - } + my ($class, $ap, %args) = @_; - if ($ap) { - return new App::Acmeman::Apache::Layout::auto($ap); - } + unless ($ap->isa('Apache::Defaults')) { + croak "unrecognized argument"; + } - croak "unrecognized Apache layout"; + my $self = bless { _defaults => $ap }, $class; + foreach my $kw (qw(layout_name incdir restart_command)) { + if (defined(my $v = delete $args{$kw})) { + $self->{$kw} = $v; + } } - my ($name, %args) = @_; - if (ref($name) eq '') { - my $mod = "$class::$name"; - my $obj; - eval { - require $mod; - }; + return $self; +} + +sub detect { + my $class = shift; + my $server = $class->_find_httpd; + + if (my $name = shift) { + my $mod = "${class}::$name"; + eval "require $mod"; croak "undefined Apache layout $name" if ($@); - return $mod->new; + my $self = $mod->new(new Apache::Defaults(server => $server), @_); + if (!$self) { + croak "can't use layout $name"; + } + return $self; } - - unless ($name->isa('Apache::Defaults')) { - croak "unrecognized argument"; + + # Autodetect + debug(3, "detecting Apache configuration layout" + .(defined($server) ? " (using httpd binary $server)" : '')); + my $ap = new Apache::Defaults(server => $server, on_error => 'return'); + if ($ap->status) { + croak "unable to get Apache defaults: " . $ap->error; } - my $self = bless { _defaults => $name }, $class; - foreach my $kw (qw(layout_name incdir restart_command)) { - if (defined(my $v = delete $args{$kw})) { - $self->{$kw} = $v; + foreach my $mod ($class->modules) { + debug(3, "trying layout module $mod"); + my $obj; + eval { $obj = $mod->new($ap) }; + if ($obj) { + return $obj; + } + if ($@) { + debug(3, "layout module failed: $@"); } } - return $self; -} + return new App::Acmeman::Apache::Layout($ap, layout_name => 'auto'); +} sub apache { shift->{_defaults} } @@ -181,14 +178,5 @@ sub restart_command { sub pre_setup {} sub post_setup {} - -package App::Acmeman::Apache::Layout::auto; -my @ISA = qw(App::Acmeman::Apache::Layout); -use App::Acmeman::Log qw(:all); - -sub new { - my ($class, $ap) = @_; - return $class->SUPER::new($ap); -} 1; diff --git a/lib/App/Acmeman/Source/Apache.pm b/lib/App/Acmeman/Source/Apache.pm index 29fe24a..a9a6195 100644 --- a/lib/App/Acmeman/Source/Apache.pm +++ b/lib/App/Acmeman/Source/Apache.pm @@ -19,10 +19,8 @@ sub new { my $server_root; GetOptionsFromArray(\@_, 'server-root=s' => \$server_root); - my $self = bless { _layout => new App::Acmeman::Apache::Layout(@_) }, $class; - unless ($server_root) { - $server_root = Apache::Defaults->new->server_root; - } + my $layout = detect App::Acmeman::Apache::Layout(@_); + my $self = bless { _layout => $layout }, $class; $self->server_root($server_root) if $server_root; return $self; } @@ -132,7 +130,7 @@ sub server_root { croak "too many arguments" if $@; $self->{_server_root} = $v; } - return $self->{_server_root}; + return $self->{_server_root} || $self->layout->apache->server_root; } sub mkpath { -- cgit v1.2.1