Создание списка доменов с помощью httpd.conf

Создание списка доменов с помощью httpd.conf

Я пытаюсь создать bash-скрипт, который может сгенерировать файл, содержащий полный список доменов (из файла конфигурации Apache), размещенных на веб-сервере.

На самом деле это кажется довольно простым. Насколько я вижу, ServerName и ServerAlias ​​— это ключевые директивы, которые понадобятся для генерации этого списка.

Меня смущает возможность наличия нескольких псевдонимов.

Пример записи.

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

Вторая запись.

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

Какой подход в bash будет наилучшим для генерации этого списка?

решение1

Я думаю, что вы идете не тем путем. Вместо скрипта оболочки, который анализирует файлы VirtualHost (которые, кстати, могут быть где угодно), вам следует использовать собственные инструменты Apache для этого. Один из них —apache2ctl status.

решение2

Модуль PerlConfig::Generalможет анализировать файлы Apache conf, так что вы можете сделать

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

решение3

Этот код немного уродлив. С помощью объединения sedи awkможно использовать извлечение домена из ServerAliasстрок в несколько строк с одним доменом на строку

# 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

Связанный контент