--- a/dnssec-sign Tue Jul 27 09:48:25 2010 +0200
+++ b/dnssec-sign Wed Jul 28 14:14:47 2010 +0200
@@ -1,71 +1,91 @@
-#!/bin/bash
-#source ./dnstools.conf
-master_dir="/etc/bind/master"
-SIGN_ALERT_TIME="48"
+#!/usr/bin/perl -w
-#prüft die eingegebnen domains
-for utf8domain in $@
-do
- domain=$(idn --quiet "$utf8domain")
-
- if [ -d $master_dir/$domain ]
- then
- zone_aenderung="$zone_aenderung $master_dir/$domain"
- else
- echo $domain ist keine verwaltete Zone
- fi
-done
-
+use strict;
-#gibt zonen mit abgelaufener signatur in die standardausgabe
-function time_out {
- unowtime=`date +%s`
- alerttime=`date -d @$[unowtime - $[ 3600 * $SIGN_ALERT_TIME ] ] +%Y%m%d%H`
+my $master_dir="/etc/bind/master" ;
+my $sign_alert_time="48"; # zeitraum zwischen signierung und ablauf in h
+my $zone;
+my (@manu, @auto);
+my @zone_sig_content;
+my $sig_date;
+my $kc;
- for zone in $master_dir/*
- do
- domain=${zone##/*/}
- if [ -f $zone/$domain.signed ]
- then
- endtime=`cat $zone/$domain.signed | egrep 'DNSKEY' | egrep '[0-9]{14}' | head -n1 | cut -d" " -f5 | cut -c 1-10`
- fi
-
- if [ $endtime ]
- then
- if [ $alerttime -ge $endtime ]
- then
- echo $zone
- fi
- fi
- done
+# prueft zonen aus ARGV und fuegt sie in die liste @manu ein
+foreach (@ARGV) {
+ chomp ($zone = `idn --quiet $_`);
+ if (-e "$master_dir/$zone") {
+ push @manu, $zone;
+ } else {
+ print "$zone ist keine verwaltete zone \n";
+ }
}
+# feststellen des aktuellen zeitpunktes, zuzueglich der $sign_alert_time
+# die ausgabe $time ist im selben format wie in der signed-datei und kann
+# verglichen werden.
+chomp (my $unixtime=`date +%s`);
+$unixtime = $unixtime + (3600 * $sign_alert_time);
+my $time = `date -d \@$unixtime +%Y%m%d%H`;
-#gibt zonen mit schluessel aber ohne signatur in die standardausgabe
-function new_sign {
- for zone in $master_dir/*
- do
- if [ -f $zone/.keycounter ]
- then
- if [ `< $zone/.keycounter` -le 0 ]
- then
- echo $zone
- fi
- fi
- done
+# vergleicht fuer alle zonen im ordner $master_dir mit einer
+# <zone>.signed-datei den zeitpunkt in $time mit dem ablaufdatum der
+# signatur, welcher aus der datei <zone>.signed ausgelesen wird.
+foreach (`ls $master_dir`) {
+ chomp ($zone = $_);
+
+ if (-e "$master_dir/$zone/$zone.signed") {
+
+ open (ZONE, "$master_dir/$zone/$zone.signed");
+ @zone_sig_content = <ZONE>;
+ close (ZONE);
+
+ foreach (@zone_sig_content) {
+ if (m#SOA.*[0-9]{14}#) {
+ s#.*([0-9]{10})([0-9]{4}).*#$1#;
+ if ($_ < $time) {
+ push @auto, $zone;
+ }
+ }
+ }
+ }
}
+#gibt zonen mit schluessel aber ohne signatur in die liste @auto
+foreach (`ls $master_dir`) {
+ chomp ($zone = $_);
-#uebergibt die ausgabe der funktionen in listen
-zone_new_sign=`new_sign`
-zone_time_out=`time_out`
+ if (-e "$master_dir/$zone/.keycounter") {
+
+ open (KC, "$master_dir/$zone/.keycounter" );
+ $kc = <KC>;
+ close (KC);
+ if ( $kc < 1) {
+ push @auto, $zone;
+ }
+ }
+}
-# signiert alle zonen aus den listen
-for zone in $zone_aenderung $zone_new_sign $zone_time_out
-do
- cd $zone
- domain=${zone##/*/}
- key_counter=`< .keycounter`
- dnssec-signzone $domain && echo $[ key_counter + 1 ] > .keycounter
-done
+# signiert alle zonen in @auto und @manu und erhoeht den wert in
+# der keycounter-datei
+foreach (@auto, @manu) {
+ $zone = $_ ;
+
+ chdir "$master_dir/$zone";
+
+ if (`dnssec-signzone $zone 2>/dev/null`) {
+ print "$zone neu signiert \n";
+
+ open (KC, "$master_dir/$zone/.keycounter" );
+ $kc = <KC>;
+ close (KC);
+ $kc += 1;
+ open (KC, ">$master_dir/$zone/.keycounter" );
+ print KC $kc;
+ close (KC);
+
+ } else {
+ print "$zone konnte nicht signiert werden \n";
+ }
+}
+