2

dnsmasq が提供する DNS ログに基づいて、一時ホスト ファイルを生成しようとしています。ほとんど動作していますが、CNAME に問題があります。これまでに達成したことを示します。

ログには、取得する必要がある 3 種類の応答があります。最も単純なものは、ログから抽出するのが非常に簡単です。

Jun 20 14:27:59 dnsmasq[2551]: reply stackoverflow.com is 64.34.119.12

これは、「64.34.119.12 stackoverflow.com」に出力できます。

grep reply /tmp/dnslog | grep -v 'NXDOMAIN\|NODATA' | awk '{print $8 " " $6}'

もう 1 つのタイプのログは CNAME に関するものです。ここに 1 つの例を示します。

Jun 20 14:42:11 dnsmasq[2551]: reply www.videolan.org is <CNAME>
Jun 20 14:42:11 dnsmasq[2551]: reply ganesh.videolan.org is 88.191.250.2

これは、「88.191.250.2 ganesh.videolan.org www.videolan.org」に出力できます。

grep reply /tmp/dnslog | grep -v 'NXDOMAIN\|NODATA' | awk '{print $8 "\t" $6}' | awk '/CNAME/ {name=$2; getline ; print $0 " " 'name'}'

ただし、この方法は、複数の CNAME がある次の種類のログでは機能しません。

Jun 20 15:00:42 dnsmasq[2551]: reply en.wikipedia.org is <CNAME>                        
Jun 20 15:00:42 dnsmasq[2551]: reply wikipedia-lb.wikimedia.org is <CNAME>              
Jun 20 15:00:42 dnsmasq[2551]: reply wikipedia-lb.esams.wikimedia.org is 91.198.174.225

前のコマンドにより、次の結果が得られます

<CNAME> wikipedia-lb.wikimedia.org      en.wikipedia.org

最初のコマンドと 2 番目のコマンドを併用すると、wikipedia-lb.esams.wikimedia.org は 91.198.174.225 に関連付けられますが、wikipedia-lb.wikimedia.org は wikipedia-lb.esams.wikimedia.org に関連付けられません。理想的な結果は次のようになります

91.198.174.225 wikipedia-lb.esams.wikimedia.org wikipedia-lb.wikimedia.org      en.wikipedia.org

この問題を解決するには、ファイルを逆方向​​に読み取る必要があると思いますが、これを行うと、次の行に追加するために awk の getline 部分が台無しになることはありませんか?

理想的には、両方のスクリプトを別々に実行するのではなく、両方のタイプのログを組み合わせてすべてを出力するコマンドにしたいと考えています。これを行うために awk コマンドを修正するのを手伝ってくれる人はいますか?

「grep reply /var/dnslog」のサンプルと、出力したいhostsファイルを以下に示します。現時点では二次的な問題が他にもあります。これらは、目的のホストの出力で強調表示されます。

Jun 20 15:28:21 dnsmasq[2551]: reply photos-a.ak.fbcdn.net is <CNAME>
Jun 20 15:28:21 dnsmasq[2551]: reply photos-a.ak.facebook.com.edgesuite.net is <CNAME>
Jun 20 15:28:21 dnsmasq[2551]: reply a995.dspmm1.akamai.net is 213.200.108.25
Jun 20 15:28:21 dnsmasq[2551]: reply a995.dspmm1.akamai.net is 213.200.108.48
Jun 20 15:28:21 dnsmasq[2551]: reply a995.dspmm1.akamai.net is 213.200.108.64
Jun 20 15:28:21 dnsmasq[2551]: reply a995.dspmm1.akamai.net is 213.200.108.9
Jun 20 15:28:21 dnsmasq[2551]: reply a995.dspmm1.akamai.net is 213.200.108.26
Jun 20 15:28:21 dnsmasq[2551]: reply a995.dspmm1.akamai.net is 213.200.108.51
Jun 20 15:28:21 dnsmasq[2551]: reply a995.dspmm1.akamai.net is 213.200.108.8
Jun 20 15:28:21 dnsmasq[2551]: reply a995.dspmm1.akamai.net is 213.200.108.50
Jun 20 15:28:21 dnsmasq[2551]: reply a995.dspmm1.akamai.net is 213.200.108.65
Jun 20 15:28:22 dnsmasq[2551]: reply stackoverflow.com is 64.34.119.12
Jun 20 15:29:41 dnsmasq[2551]: reply www.wikipedia.org is <CNAME>
Jun 20 15:29:41 dnsmasq[2551]: reply wikipedia-lb.wikimedia.org is <CNAME>
Jun 20 15:29:41 dnsmasq[2551]: reply wikipedia-lb.esams.wikimedia.org is 91.198.174.225
Jun 20 15:29:42 dnsmasq[2551]: reply en.wikipedia.org is <CNAME>
Jun 20 15:29:42 dnsmasq[2551]: reply wikipedia-lb.wikimedia.org is <CNAME>
Jun 20 15:29:42 dnsmasq[2551]: reply wikipedia-lb.esams.wikimedia.org is 91.198.174.225
Jun 20 15:29:42 dnsmasq[2551]: reply ja.wikipedia.org is <CNAME>
Jun 20 15:29:42 dnsmasq[2551]: reply wikipedia-lb.wikimedia.org is <CNAME>
Jun 20 15:29:42 dnsmasq[2551]: reply wikipedia-lb.esams.wikimedia.org is 91.198.174.225

ホストファイル

213.200.108.26  a995.dspmm1.akamai.net photos-a.ak.facebook.com.edgesuite.net photos-a.ak.fbcdn.net 
##ideally select 1 host at random from multiple of a995.dspmm1.akamai.net, although list may be randomised already so 1st will suffice##
64.34.119.12    stackoverflow.com
91.198.174.225  wikipedia-lb.esams.wikimedia.org wikipedia-lb.wikimedia.org www.wikipedia.org
91.198.174.225  wikipedia-lb.esams.wikimedia.org wikipedia-lb.wikimedia.org en.wikipedia.org
91.198.174.225  wikipedia-lb.esams.wikimedia.org wikipedia-lb.wikimedia.org ja.wikipedia.org 
##Ideally, detect these similarities for wikipedia and convert the 3 lines into this;##
91.198.174.225  wikipedia-lb.esams.wikimedia.org wikipedia-lb.wikimedia.org www.wikipedia.org en.wikipedia.org ja.wikipedia.org

ファイルを低帯域幅で待ち時間の長いリンクで配布できるようにすることを目的としているため、ファイルはできるだけ小さくする必要があります。このファイルを長期間使用すると多くの問題が発生することは承知しています。このファイルは短期間のみ有効になるように構成しました。指摘された問題を解決できる方がいらっしゃいましたら、よろしくお願いいたします。また、限られた範囲の UNIX アプリケーションを利用できます。上記がawkで達成できれば、それが望ましいでしょう。前もって感謝します!

4

2 に答える 2

0

を使用して呼び出しawk -f parse.awk dnsmasq.logます。

/reply/ { 
    host = $6;
    ip = $8;

    names[length(names)+1] = host;

    if (ip !~ /CNAME/) {
    # assign all names up to now the same IP
    # This will overwrite any previous IP assignment as well
    for (i in names) IPs[names[i]] = ip;
    delete names;
    }
}

END {
    # collate hostnames for a particular IP
    for (host in IPs) hosts[IPs[host]] = hosts[IPs[host]]" "host;
    for (IP in hosts) print IP hosts[IP];
}
于 2012-09-06T14:08:01.387 に答える
0

awkで使用sort

..|awk '{if($8 ~ /<CNAME>/){load=load" "$6}else{print $8" "load" "$6;load=""}}'
  | sort -u -k2
于 2012-06-20T15:27:55.210 に答える