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::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";
}
}
}
Responder3
Este código é um pouco feio. Com a combinação sed
e awk
, você pode extrair domínio 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