#!/usr/bin/perl # # Copyright (c) 2002 TAKANO Yuji # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # dhcpd4named.pl - dhcpd get IP for named of zone-file add. ###################################################################### # モジュール呼び出し ###################################################################### use DBI; ###################################################################### # 初期変数設定 ###################################################################### # 逆引きの登録をするかしないかの指定 (YES:登録する/NO:登録しない) my $RevZone = "YES"; # Cron で設定する時間間隔を "秒" で指定 my $CronTime = 300; # dhcpd のログを指定 /etc/syslog.conf に以下の様に指定すると便利 # !dhcpd # *.* /var/log/dhcpd.log my $DhcpdLog = '/var/log/dhcpd.log'; # dhcpd.log から拾ってくる文字列パタンの指定 my $LogPat = 'DHCPACK'; # DHCP で管理するドメインの指定 my $Domain = 'icmpv6.org'; # zone ファイルの TTL を指定 my $TTL = '3600'; # データベース情報 $Db = 'DBI:mysql:bind9:localhost'; $Dbuser = 'bind'; $Dbpasswd = 'bind'; # MySQL テーブル名(正引き) $Dbtbl_dom_tbl = 'icmpv6_org'; # MySQL テーブル名(逆引き) $Dbtbl_rev_tbl = '100_168_192_rev'; ###################################################################### # コマンドの実行 ###################################################################### my $Dbcon = ""; my $Dbcmd = ""; my @Dbstatus = ""; # 時間情報の取得 my $time = time - $CronTime; my $tmptime = localtime($time); my @tmp = split(" ",$tmptime); my $StartTime = "$tmp[1] $tmp[2] $tmp[3]"; #print "Get Log: $time - " . time . "\n"; $Dbcon = DBI -> connect($Db,$Dbuser,$Dbpasswd); # ログの読み込み open(LOG,"<$DhcpdLog"); while() { my @tmp = split; $Time = "$tmp[0] $tmp[1] $tmp[2]"; # 以前 cron が動作した時間後のログの抽出 if ($StartTime le $Time) { #print "Get Log: $StartTime - $Time\n"; while () { if (/${LogPat}.*\((.*).*\).*/) { # ログから IP アドレスとホスト名を抽出 my @tmp = split; my $IP = $tmp[7]; my ($HostName,@tmp) = split('\.',$1); $HostName =~ tr/[A-Z]/[a-z]/; # DB 更新処理呼び出し &DB_Write($HostName,$IP); } } } } exit 1; ###################################################################### # DB 書き込み処理 ###################################################################### sub DB_Write { my $HostName = shift; my $IP = shift; my @tmp = split('\.',$IP); my $RevIP = "$tmp[3].$tmp[2].$tmp[1].$tmp[0]"; if ($RevZone =~ /yes/i) { # 以前有った逆引きの削除 my $SQL = "DELETE FROM $Dbtbl_rev_tbl WHERE NAME = '$RevIP.in-addr.arpa'"; $Dbcmd = $Dbcon -> prepare($SQL); $Dbcmd -> execute() or &Pal_Error("DELETE 1 ERROR"); # 逆引きテーブルに追加 my $SQL = "INSERT INTO $Dbtbl_rev_tbl "; $SQL .= "VALUES ('$RevIP.in-addr.arpa','$TTL','PTR','${HostName}.${Domain}.')"; $Dbcmd = $Dbcon -> prepare($SQL); $Dbcmd -> execute() or &Pal_Error("INSERT 1 ERROR"); } # 以前有った正引きの削除 my $SQL = "DELETE FROM $Dbtbl_dom_tbl WHERE RDATA = '$IP'"; $Dbcmd = $Dbcon -> prepare($SQL); $Dbcmd -> execute() or &Pal_Error("DELETE 2 ERROR"); # 以前有った正引きの削除 my $SQL = "DELETE FROM $Dbtbl_dom_tbl WHERE NAME = '${HostName}.${Domain}'"; $Dbcmd = $Dbcon -> prepare($SQL); $Dbcmd -> execute() or &Pal_Error("DELETE 3 ERROR"); # 正引きテーブルに追加 my $SQL = "INSERT INTO $Dbtbl_dom_tbl "; $SQL .= "VALUES ('${HostName}.${Domain}','$TTL','A','$IP')"; $Dbcmd = $Dbcon -> prepare($SQL); $Dbcmd -> execute() or &Pal_Error("INSERT 2 ERROR"); return 0; } ### エラー出力 ### sub Pal_Error { print $_ . "\n\n"; exit 1; }