Criando lista de domínios usando httpd.conf

0

Estou tentando criar um script bash que pode gerar um arquivo que contém uma lista completa de domínios - do arquivo de configuração do Apache - que um servidor da Web hospeda.

Na verdade, parece bem fácil. Pelo que vejo ServerName e ServerAlias são as diretivas chave, essas serão necessárias para gerar essa lista.

O que me confunde é a possibilidade de ter vários números de 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 gerar essa lista?

    
por compixtr 05.05.2014 / 17:16

3 respostas

2

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

    
por 05.05.2014 / 17:35
2

O módulo Perl Config::General pode 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";
        }
    }
}
    
por 05.05.2014 / 18:05
0

Este código é um pouco feio. Com a combinação de sed e awk , você pode usar o domínio de extração de ServerAlias linhas 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
    
por 05.05.2014 / 18:00