Creando una lista de dominios usando httpd.conf

Creando una lista de dominios usando httpd.conf

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::Generalpuede 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 sedy awk, puede utilizar extraer dominio de ServerAliaslí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

información relacionada