httpd.conf を使用してドメインのリストを作成する

httpd.conf を使用してドメインのリストを作成する

私は、Web サーバーがホストするドメインの完全なリスト (Apache の構成ファイルから) を含むファイルを生成できる bash スクリプトを作成しようとしています。

実際には非常に簡単そうです。私の見るところ、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>

2番目のエントリー。

<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 独自のツールを使用する必要があります。その 1 つは次のとおりです。apache2ctl status

答え2

PerlモジュールConfig::GeneralApache 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、行からドメインを抽出して、1行に1つのドメインを持つ複数の行に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

関連情報