Estoy intentando crear un script bash que pueda generar un archivo que contenga una lista completa de dominios (del archivo de configuración de Apache) que aloja un servidor web.
En realidad parece bastante fácil. Por lo que veo, ServerName y ServerAlias son las directivas clave que serán necesarias para generar esta lista.
Lo que me confunde es la posibilidad de tener varios alias.
Una entrada de ejemplo.
<VirtualHost IP_ADDR:PORT>
ServerName domain-1.tld
ServerAlias www.domain-1.tld
DocumentRoot /home/domain-1.tld/public_html
ServerAdmin [email protected]
UseCanonicalName Off
CustomLog /usr/local/apache/domlogs/domain-1.tld combined
CustomLog /usr/local/apache/domlogs/domain-1.tld-bytes_log "%{%s}t %I .\n%{%s}t %O ."
</VirtualHost>
Una segunda entrada.
<VirtualHost IP_ADDR:PORT>
ServerName domain-2.tld
ServerAlias www.domain-2.tld some-other-domain.tld another-domain.tld
DocumentRoot /home/domain-2.tld/public_html
ServerAdmin [email protected]
UseCanonicalName Off
CustomLog /usr/local/apache/domlogs/domain-2.tld combined
CustomLog /usr/local/apache/domlogs/domain-2.tld-bytes_log "%{%s}t %I .\n%{%s}t %O ."
</VirtualHost>
¿Cuál sería el mejor enfoque en bash para generar esta lista?
Respuesta1
Creo que estás yendo por el camino equivocado. En lugar de un script de shell que analice los archivos de VirtualHost (que, por cierto, puede estar en cualquier lugar), debe usar las herramientas propias de Apache para hacer esto. Uno de ellos esapache2ctl status
.
Respuesta2
El módulo PerlConfig::General
puede analizar archivos de configuración de Apache, por lo que podría hacerlo
#!/usr/bin/perl
use strict;
use warnings;
use Config::General;
my %conf = Config::General->new('/path/to/config.conf')->getall();
for my $ip_port (keys %{$conf{VirtualHost}}) {
for my $vh (@{$conf{VirtualHost}{$ip_port}}) {
if (exists $vh->{ServerName} and exists $vh->{ServerAlias}) {
my $aliases = ref $vh->{ServerAlias} eq 'ARRAY'
? join(",", @{$vh->{ServerAlias}})
: $vh->{ServerAlias};
print $ip_port, "\t", $vh->{ServerName}, "\t", $aliases, "\n";
}
}
}
Respuesta3
Este código es un poco feo. Al combinar sed
y awk
, puede utilizar extraer dominio de ServerAlias
líneas en varias líneas con un dominio por línea
# echo ' ServerAlias www.domain-2.tld some-other-domain.tld another-domain.tld' | awk '{print substr($0, index($0, $2))}' | sed -e 's/\s\+/\n/g'
www.domain-2.tld
some-other-domain.tld
another-domain.tld