dnssec-sign
changeset 20 5b52190d8750
parent 19 2c3bcb280768
child 21 6715f8f9d04c
--- 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";
+	}
+}
+