Criando lista de domínios usando httpd.conf

Criando lista de domínios usando httpd.conf

Estou tentando criar um script bash que possa gerar um arquivo que contenha uma lista completa de domínios - do arquivo de configuração do Apache - que um servidor web hospeda.

Na verdade, parece bastante fácil. Pelo que vejo ServerName e ServerAlias ​​são as principais diretivas que serão necessárias para gerar esta lista.

O que me confunde é a possibilidade de ter vários Aliases.

Um exemplo de entrada.

<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>

Uma 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>

Qual seria a melhor abordagem no bash para a geração desta lista?

Responder1

Eu acho que você está indo na direção errada sobre isso. Em vez de um script de shell que analisa os arquivos do VirtualHost (que, aliás, podem estar em qualquer lugar), você deve usar as próprias ferramentas do Apache para fazer isso. Um deles éapache2ctl status.

Responder2

O módulo PerlConfig::Generalpode analisar arquivos conf do Apache, então você pode fazer

#!/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";
        }
    }
}

Responder3

Este código é um pouco feio. Com a combinação sede awk, você pode extrair domínio de ServerAliaslinhas em várias linhas com um domínio por linha

# 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

informação relacionada