diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2017-12-07 22:17:26 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2017-12-07 22:17:26 +0200 |
commit | 80da2c28a644a0640b8d167e31f28b43fc56a682 (patch) | |
tree | c1c7545065d3a81c93613b51483b50641fd84aaf /lib/Apache/Config/Preproc/ifmodule.pm | |
parent | 31a64151b3f675322eb8eadb8bae9887e0f82941 (diff) | |
download | acpp-80da2c28a644a0640b8d167e31f28b43fc56a682.tar.gz acpp-80da2c28a644a0640b8d167e31f28b43fc56a682.tar.bz2 |
Provide a way to pass arguments to the phase constructors
* Makefile.PL: Lower the required Perl version. Update prerequisites
* lib/Apache/Config/Preproc.pm (new): Get rid of -server_root.
Don't save filename along with options.
(server_root): Remove.
(_preproc): Handle optional arguments in the module list.
(_preproc_section): Don't pass $self to expand. It should have
been saved by new, if the need be.
* lib/Apache/Config/Preproc/compact.pm (new): Update.
* lib/Apache/Config/Preproc/ifmodule.pm (new): Update.
New arguments: preloaded => [ list of loaded modules ], and
probe => $val.
* lib/Apache/Config/Preproc/include.pm (new): Optional argument
server_root.
(expand): Change signature.
* lib/Apache/Config/Preproc/macro.pm (new, expand): Change signature.
Diffstat (limited to 'lib/Apache/Config/Preproc/ifmodule.pm')
-rw-r--r-- | lib/Apache/Config/Preproc/ifmodule.pm | 180 |
1 files changed, 175 insertions, 5 deletions
diff --git a/lib/Apache/Config/Preproc/ifmodule.pm b/lib/Apache/Config/Preproc/ifmodule.pm index 033d20e..10cce3b 100644 --- a/lib/Apache/Config/Preproc/ifmodule.pm +++ b/lib/Apache/Config/Preproc/ifmodule.pm @@ -1,17 +1,46 @@ package Apache::Config::Preproc::ifmodule; use strict; use warnings; +use Carp; +use IPC::Open3; sub new { - bless {}, shift + my $class = shift; + my $conf = shift; + my $self = bless { conf => $conf }, $class; + local %_ = @_; + my $v; + if ($v = delete $_{preloaded}) { + croak "preloaded must be an arrayref" unless ref($v) eq 'ARRAY'; + @{$self->{preloaded}}{@$v} = @$v; + } + if ($v = delete $_{probe}) { + if (ref($v) eq 'ARRAY') { + $self->probe(@$v); + } else { + $self->probe; + } + } + return $self; +} + +sub conf { shift->{conf} } + +sub preloaded { + my $self = shift; + my $id = shift; + if (my $v = shift) { + $self->{preloaded}{$id} = $v; + } + return $self->{preloaded}{$id}; } sub expand { - my ($self, $tree, $d, $repl) = @_; + my ($self, $d, $repl) = @_; if ($d->type eq 'section' && lc($d->name) eq 'ifmodule') { my $id = $d->value; my $negate = $id =~ s/^!//; - my $res = $self->module_loaded($tree, $id); + my $res = $self->module_loaded($id); if ($negate) { $res = !$res; } @@ -24,10 +53,151 @@ sub expand { } sub module_loaded { - my ($self, $tree, $id) = @_; + my ($self, $id) = @_; + return 1 if $self->preloaded($id); return grep { (split /\s+/, $_->value)[0] eq $id - } $tree->directive('loadmodule'); + } $self->conf->directive('loadmodule'); +} + +# FIXME: This list is largely speculative; check Apache sources +my %modlist = ( + 'mod_authn_file.c' => 'authn_file_module', + 'mod_authn_dbm.c' => 'authn_dbm_module', + 'mod_authn_anon.c' => 'authn_anon_module', + 'mod_authn_dbd.c' => 'authn_dbd_module', + 'mod_authn_socache.c' => 'authn_socache_module', + 'mod_authn_core.c' => 'authn_core_module', + 'mod_authz_host.c' => 'authz_host_module', + 'mod_authz_groupfile.c' => 'authz_groupfile_module', + 'mod_authz_user.c' => 'authz_user_module', + 'mod_authz_dbm.c' => 'authz_dbm_module', + 'mod_authz_owner.c' => 'authz_owner_module', + 'mod_authz_dbd.c' => 'authz_dbd_module', + 'mod_authz_core.c' => 'authz_core_module', + 'mod_authnz_ldap.c' => 'authnz_ldap_module', + 'mod_access_compat.c' => 'access_compat_module', + 'mod_auth_basic.c' => 'auth_basic_module', + 'mod_auth_form.c' => 'auth_form_module', + 'mod_auth_digest.c' => 'auth_digest_module', + 'mod_allowmethods.c' => 'allowmethods_module', + 'mod_file_cache.c' => 'file_cache_module', + 'mod_cache.c' => 'cache_module', + 'mod_cache_disk.c' => 'cache_disk_module', + 'mod_socache_shmcb.c' => 'socache_shmcb_module', + 'mod_socache_dbm.c' => 'socache_dbm_module', + 'mod_socache_memcache.c' => 'socache_memcache_module', + 'mod_watchdog.c' => 'watchdog_module', + 'mod_dbd.c' => 'dbd_module', + 'mod_dumpio.c' => 'dumpio_module', + 'mod_echo.c' => 'echo_module', + 'mod_buffer.c' => 'buffer_module', + 'mod_data.c' => 'data_module', + 'mod_ratelimit.c' => 'ratelimit_module', + 'mod_reqtimeout.c' => 'reqtimeout_module', + 'mod_ext_filter.c' => 'ext_filter_module', + 'mod_request.c' => 'request_module', + 'mod_include.c' => 'include_module', + 'mod_filter.c' => 'filter_module', + 'mod_reflector.c' => 'reflector_module', + 'mod_substitute.c' => 'substitute_module', + 'mod_sed.c' => 'sed_module', + 'mod_charset_lite.c' => 'charset_lite_module', + 'mod_deflate.c' => 'deflate_module', + 'mod_xml2enc.c' => 'xml2enc_module', + 'mod_proxy_html.c' => 'proxy_html_module', + 'mod_mime.c' => 'mime_module', + 'mod_ldap.c' => 'ldap_module', + 'mod_log_config.c' => 'log_config_module', + 'mod_log_debug.c' => 'log_debug_module', + 'mod_log_forensic.c' => 'log_forensic_module', + 'mod_logio.c' => 'logio_module', + 'mod_env.c' => 'env_module', + 'mod_mime_magic.c' => 'mime_magic_module', + 'mod_expires.c' => 'expires_module', + 'mod_headers.c' => 'headers_module', + 'mod_usertrack.c' => 'usertrack_module', + 'mod_unique_id.c' => 'unique_id_module', + 'mod_setenvif.c' => 'setenvif_module', + 'mod_version.c' => 'version_module', + 'mod_remoteip.c' => 'remoteip_module', + 'mod_proxy.c' => 'proxy_module', + 'mod_proxy_connect.c' => 'proxy_connect_module', + 'mod_proxy_ftp.c' => 'proxy_ftp_module', + 'mod_proxy_http.c' => 'proxy_http_module', + 'mod_proxy_fcgi.c' => 'proxy_fcgi_module', + 'mod_proxy_scgi.c' => 'proxy_scgi_module', + 'mod_proxy_fdpass.c' => 'proxy_fdpass_module', + 'mod_proxy_ajp.c' => 'proxy_ajp_module', + 'mod_proxy_balancer.c' => 'proxy_balancer_module', + 'mod_proxy_express.c' => 'proxy_express_module', + 'mod_session.c' => 'session_module', + 'mod_session_cookie.c' => 'session_cookie_module', + 'mod_session_dbd.c' => 'session_dbd_module', + 'mod_slotmem_shm.c' => 'slotmem_shm_module', + 'mod_slotmem_plain.c' => 'slotmem_plain_module', + 'mod_ssl.c' => 'ssl_module', + 'mod_dialup.c' => 'dialup_module', + 'mod_lbmethod_byrequests.c' => 'lbmethod_byrequests_module', + 'mod_lbmethod_bytraffic.c' => 'lbmethod_bytraffic_module', + 'mod_lbmethod_bybusyness.c' => 'lbmethod_bybusyness_module', + 'mod_lbmethod_heartbeat.c' => 'lbmethod_heartbeat_module', + 'event.c' => 'mpm_event_module', + 'prefork.c' => 'mpm_prefork_module', + 'mod_unixd.c' => 'unixd_module', + 'mod_heartbeat.c' => 'heartbeat_module', + 'mod_heartmonitor.c' => 'heartmonitor_module', + 'mod_dav.c' => 'dav_module', + 'mod_status.c' => 'status_module', + 'mod_autoindex.c' => 'autoindex_module', + 'mod_asis.c' => 'asis_module', + 'mod_info.c' => 'info_module', + 'mod_cgid.c' => 'cgid_module', + 'mod_cgi.c' => 'cgi_module', + 'mod_vhost_alias.c' => 'vhost_alias_module', + 'mod_negotiation.c' => 'negotiation_module', + 'mod_dir.c' => 'dir_module', + 'mod_actions.c' => 'actions_module', + 'mod_speling.c' => 'speling_module', + 'mod_userdir.c' => 'userdir_module', + 'mod_alias.c' => 'alias_module', + 'mod_rewrite.c' => 'rewrite_module', + 'mod_dav.c' => 'dav_module', + 'mod_dav_fs.c' => 'dav_fs_module', + 'mod_dav_lock.c' => 'dav_lock_module', + 'mod_dav_svn.c' => 'dav_svn_module', + 'mod_authz_svn.c' => 'authz_svn_module', + 'mod_fcgid.c' => 'fcgid_module', + 'mod_dav_svn.c' => 'dav_svn_module', + 'mod_authz_svn.c' => 'authz_svn_module' +); + +sub probe { + my ($self, @servlist) = @_; + unless (@servlist) { + @servlist = qw(/usr/sbin/httpd /usr/sbin/apache2); + } + + open(my $nullout, '>', File::Spec->devnull); + open(my $nullin, '<', File::Spec->devnull); + foreach my $serv (@servlist) { + use Symbol 'gensym'; + my $fd = gensym; + eval { + if (my $pid = open3($nullin, $fd, $nullout, $serv, '-l')) { + while (<$fd>) { + chomp; + if (/^\s*(\S+\.c)$/ && exists($modlist{$1})) { + $self->preloaded($modlist{$1}, $1); + } + } + } + }; + close $fd; + last unless ($@) + } + close $nullin; + close $nullout; } 1; |