Я пытаюсь создать 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