raino以外に使いたい人は居ないかもしれない。DNSレコード大量追加時に使用する。

仕様

1: 引数で -f が指定されていた場合、ファイル"/home/user/dnsrr"を一行ずつ読み込み、IPアドレスが存在する行に対して以下を実行
  • IPアドレスを抽出
  • ホスト名を抽出
  • 正引きデータを作成&表示
2: 引数で -r が指定されていた場合、ファイル"/home/user/dnsrr"を一行ずつ読み込み、IPアドレスが存在する行に対して以下を実行
  • IPアドレスの第4オクテットを抽出
  • ホスト名を抽出、FQDN作成
  • 逆引きデータを作成&表示
3: 引数で -c が指定されていた場合、ファイル"/home/user/dnsrr"を一行ずつ読み込み、IPアドレスが存在する行に対して以下を実行
  • IPアドレスを抽出
  • digで逆引きを実行
  • 結果表示(引けなかった場合は"xxx.xxx.xxx.xxx is no match!!"を表示)
  • 1行目からファイル"dnsrr"を再び読み込み、IPアドレスが存在する行に対して以下を実行
  • ホスト名を抽出、FQDN作成
  • digで正引きを実行
  • 結果表示(引けなかった場合は"xxx is no match!!"を表示)
4: 引数が "-f" "-r" "-c" 以外 or 指定されていない場合は 1 & 2 を実行

補足:生成される正&逆引きファイルはTab=半角スペース×8の場合は見栄え良く整形されます。

使い方

1: ホームディレクトリ(/home/user)配下にファイル名"dnsrr"でhost名、IPアドレスを記述
2: seiseikun -c を実行し、登録内容に重複がないか調べる
3: seiseikun -f を実行し、正引きファイルを表示 クリップボードにコピーするなりして正引きゾーンファイルに貼り付け、シリアルを上書きする
4: seiseikun -r を実行し、逆引きファイルを表示 クリップボードにコピーするなりして逆引きゾーンファイルに貼り付け、シリアルを上書きする
5: named再起動、/var/adm/messaegsチェック
6: seiseikun -c を実行し、登録内容のチェックをする

#手順3
,4補足:
ゾーンファイルをviエディタで開いた後、RRを追加したい箇所に空行を入れカーソルをそこに合わせた状態で、コマンドモードに移行し !!seiseikun {-f|-r} と打ってやると超簡単。

#! /usr/bin/perl
# seiseikun
use strict;
use warnings;

my $DATE = `date +%Y%m%d`;
my $MATCHIP = '(?:::(?:f{4}:)?)?*1';
my $MATCHHOST = '[0-9a-zA-Z\-]+.?[0-9a-zA-Z\-]+|[0-9a-zA-Z\-]?\.?[0-9a-zA-Z\-]+';

if ( @ARGV == 0 ) {
 $ARGV[0] = 0;
}

open( DNSRR, "/home/user/dnsrr" );

if ( $ARGV[0] eq "-f" ) {
 &ffile;
} elsif ( $ARGV[0] eq "-r" ) {
 &rfile;
} elsif ( $ARGV[0] eq "-c" ){
 print "\nreverse lookup start\n\n";
 while (<DNSRR>) {
  chomp;
  if (/.*$MATCHIP.*/) {
   s/($MATCHIP)//;
   my $IP = $1;
   my $DIG = `/usr/sbin/dig -x $IP ptr|grep 'IN PTR'`;
   if ($DIG) {
    print $DIG;
   } else {
    print "########$IP is no match!!########\n";
   }
  }
 }

 close( DNSRR );
 open( DNSRR, "/home/user/dnsrr" );
 print "\nforward lookup start\n\n";

 while (<DNSRR>) {
  chomp;
  if (/.*$MATCHIP.*/) {
   s/($MATCHIP)//;
   /($MATCHHOST)/;
   my $HOST = $1;
   $HOST .= "\.example\.com\.";
   my $DIG = `/usr/sbin/dig $HOST a|grep $HOST|grep 'IN A'`;
   if ($DIG) {
    print $DIG;
   } else {
    print "########$HOST is no match!!########\n";
   }
  }
 }
} else {
 &ffile;
 close( DNSRR );
 open(DNSRR, "/home/user/dnsrr" );
 &rfile;
}

close( DNSRR );

sub ffile {
 while (<DNSRR>) {
  chomp;
  if (/.*$MATCHIP.*/) {
   s/($MATCHIP)//;
   my $IP = $1;
   /($MATCHHOST)/;
   my $HOST = $1;
   if (length( $HOST ) <= 7) {
    print "$HOST\t\t\tIN\tA\t$IP\t\;$DATE";
   } elsif (length( $HOST ) <= 15) {
    print "$HOST\t\tIN\tA\t$IP\t\;$DATE";
   } else {
    print "$HOST\tIN\tA\t$IP\t\;$DATE";
   }
  }
 }
}

sub rfile {
 while (<DNSRR>) {
  chomp;
  if (/.*$MATCHIP.*/) {
   s/($MATCHIP)//;
   my $IP = $1;
   my @OCTET = split /\./,$IP;
   s/\s?//g;
   /($MATCHHOST)/;
   my $HOST = $1;
   $HOST .= "\.example\.com\.";
   if (length( $HOST ) <= 23) {
    print "$OCTET[3]\tIN\tPTR\t$HOST\t\t\t\t\t\;$DATE";
   } elsif (length( $HOST ) <= 31) {
    print "$OCTET[3]\tIN\tPTR\t$HOST\t\t\t\t\;$DATE";
   } elsif (length( $HOST ) <= 39) {
    print "$OCTET[3]\tIN\tPTR\t$HOST\t\t\t\;$DATE";
   } elsif (length( $HOST ) <= 47) {
    print "$OCTET[3]\tIN\tPTR\t$HOST\t\t\;$DATE";
   } else {
    print "$OCTET[3]\tIN\tPTR\t$HOST\t\;$DATE";
   }
  }
 }
}
最終更新:2007年02月21日 15:49

*1 ?:0*(?:2[0-4]\d|25[0-5]|[01]?\d\d|\d)\.){3}0*(?:2[0-4]\d|25[0-5]|[01]?\d\d|\d