dnssec-creatkey in perl geschrieben
authorasuess@dns.net.schlittermann.de
Tue, 27 Jul 2010 09:48:25 +0200
changeset 19 2c3bcb280768
parent 18 8715e7b706db
child 20 5b52190d8750
dnssec-creatkey in perl geschrieben
dnssec-creatkey
dnssec-sign
mkready
zone-ls
zone-mk
--- a/dnssec-creatkey	Thu Jul 22 12:44:14 2010 +0200
+++ b/dnssec-creatkey	Tue Jul 27 09:48:25 2010 +0200
@@ -1,104 +1,174 @@
-#!/bin/bash
-set -e
+#!/usr/bin/perl -w
+
+use strict;
 
-#import aus der dnstools.conf
-source dnstools.conf
-master_dir=$MASTER_DIR
-key_counter_end=$KEY_COUNTER_END
+my $master_dir="/etc/bind/master";	# verzeichnis fuer bind
+my $key_counter_end="2";		# ablauf des schluessels
+my @zones = `ls $master_dir`;	# alle verwalteten zonen
+my @change;			# liste abgelaufener zonen
+my @manu;			# liste manuell eingegebener zonen aus ARGV
+my @index;
+my $zone;
+my $keyname;
+
+# prueft ob eingaben in ARGV domains sind und gibt sie in die liste @manu
+foreach (@ARGV) {
+	chomp ($zone = `idn --quiet "$_"`);
 
+	if (-e "$master_dir/$zone") {
+		push (@manu, $zone);
+	} else {
+		print " $zone ist keine verwaltete zone \n ";
+	}
+}
+	
+# gibt alle zonen mit abgelaufenen keycounter in die liste @change
+foreach (@zones) {
+	chomp ($zone = $_);
+	my $key;
 
-# gibt alle zonen ohne zsk in die standard-ausgabe
-function test_zsk_new {
-	for zone in $master_dir/*
-	do
-		test -f $zone/${zone##*/}.signed || continue
-		test -f $zone/.index.zsk || echo ${zone##/*/}
-	done
+	if (-e "$master_dir/$zone/.keycounter") {
+
+		open (KEY, "$master_dir/$zone/.keycounter");
+		$key = <KEY>;
+		close (KEY);
+
+		if ($key_counter_end < $key) {
+			push (@change, $zone);
+		}
+	}
 }
 
+#erzeugt zsks
+foreach (@change, @manu) {
+	$zone = $_;
 
-# gibt alle zonen ohne ksk in die standard-ausgabe
-function test_ksk_new {
-	for zone in $master_dir/*
-	do
-		test -f $zone/${zone##*/}.signed || continue
-		test -f "$zone/.index.ksk" || echo ${zone##/*/}
-	done
+	chdir "$master_dir/$zone" or die "chdir nach / nicht moeglich: $1";
+	$keyname = `dnssec-keygen -a RSASHA1 -b 512 -n ZONE $zone`;
+
+	if (-e ".index.zsk") {
+		open (INDEX, ".index.zsk");
+		@index = <INDEX>;
+		close (INDEX);
+	} else {
+		@index = ();
+	}
+
+	push @index, $keyname;
+	if (@index > 2){
+		shift (@index);
+	}
+
+	open (INDEX, ">.index.zsk");
+	print INDEX @index;
+	close (INDEX);
+
+	chomp ($keyname);
+	print "$keyname (ZSK) erzeugt fuer $zone \n";
+
+	open (KC, ">.keycounter");
+	print KC "0";
+	close (KC);
 }
 
+#erzeugt ksks
+foreach (@manu) {
+	$zone = $_;
 
-# gibt alle zonen mitabgelaufenen keycounter in die standardausgabe
-function test_zsk_time {		# prueft den keycounter
-	for zone in $master_dir/*
-	do
-		test -f $zone/${zone##*/}.signed || continue
-		test -f $zone/keycounter || echo 0 > $zone/keycounter
-		key_counter=`< $zone/keycounter`
-	
-		if [ $key_counter_end -le $key_counter ]
-		then
-			echo ${zone##/*/} 
-		fi
-	done
+	chdir "$master_dir/$zone" or die "chdir nach / nicht moeglich: $1";
+	$keyname = `dnssec-keygen -a RSASHA1 -b 2048 -f KSK -n ZONE $zone`;
+
+	if (-e ".index.ksk") {
+		open (INDEX, ".index.ksk");
+		@index = <INDEX>;
+		close (INDEX);
+	} else {
+		@index = ();
+	}
+
+	push @index, $keyname;
+	if (@index > 2){
+		shift (@index);
+	}
+
+	open (INDEX, ">.index.ksk");
+	print INDEX @index;
+	close (INDEX);
+
+	chomp ($keyname);
+	print "$keyname (KSK) erzeugt fuer $zone \n";
 }
 
 
-#prueft die eingegebnen domains und erstellt eine liste
-for utf8domain in $@
-do
-        domain=$(idn --quiet "$utf8domain")
+# loescht alle unbenoetigten schluessel, fuegt die schluessel in
+# die zone-datei
+foreach (@change, @manu) {
+	$zone = $_;
+	my @old_zone_content = ();
+	my @new_zone_content = ();
+	my @keylist = ();
+	my $file = ();
 
-        if [ -d $master_dir/$domain ]
-        then
-                zsk_manuell="$zsk_manuell $domain"
-        else
-                echo $domain ist keine verwaltete Zone
-        fi
-done
+	open (INDEX, "$master_dir/$zone/.index.zsk");
+	@keylist = <INDEX>;
+	close (INDEX);
 
+	open (INDEX, "$master_dir/$zone/.index.ksk");
+	push @keylist, <INDEX>;
+	close (INDEX);
 
-# gibt die standard-ausgabe aus den funktionen in listen
-zsk_time=`test_zsk_time`
-zsk_new=`test_zsk_new`
-ksk_new=`test_ksk_new`
-
+	open (ZONE, "$master_dir/$zone/$zone");
+	@old_zone_content = <ZONE>;
+	close (ZONE);
 
-# erstellt zsks
-for NEW_ZSK_ZONE in $zsk_time $zsk_manuell
-do
-	cd $master_dir/$NEW_ZSK_ZONE
-	echo "erzeugt zsk fuer" $NEW_ZSK_ZONE
-	dnssec-keygen -a RSASHA1 -b 512 -n ZONE $NEW_ZSK_ZONE >> .index.zsk
-	INDEX_ZSK=$( tail -n2 .index.zsk )
-	echo $INDEX_ZSK | fmt -w1 > .index.zsk
+	# kuerzt die schluessel-bezeichnung aus der indexdatei auf die id um sie
+	# besser vergleichen zu koennen.
+	foreach (@keylist) {
+		chomp;
+		s#K.*\+.*\+(.*)#$1#;
+	}
+
+	# filtert alle schluessel aus der zonedatei
+	# old_zone_content ==> new_zone_content
+	foreach (@old_zone_content) {
+		unless (/IN\sDNSKEY/) {
+			push @new_zone_content, $_;
+		}
+	}
 
-	echo 0 > keycounter	
-done
-
+	# prueft alle schluesseldateien (ksk, zsk) ob sie in der jeweiligen
+	# indexdatei beschrieben sind. wenn nicht werden sie geloescht.
+	foreach (`ls $master_dir/$zone/K*[key,private]`){
+		chomp;
+		$file = $_;
+		my $rm_count = 1;
 
-# erstellt ksks
-for NEW_KSK_ZONE in $zsk_manuell
-do	
-	cd $master_dir/$NEW_KSK_ZONE
-	echo "erzeugt ksk fuer" $NEW_KSK_ZONE
-	dnssec-keygen -a RSASHA1 -b 2048 -f KSK -n ZONE $NEW_KSK_ZONE >> .index.ksk
-	INDEX_KSK=$( tail -n2 .index.ksk )
-	echo $INDEX_KSK | fmt -w1 > .index.ksk
-done
+		foreach (@keylist) {
 
+			if ($file =~ /$_/) {
+				$rm_count = 0;
 
-# fuegt die schluessel in die zone-datei
-for zone in $zsk_time $zsk_manuell
-do
-	cd $master_dir/$zone
-
-	#loescht alle Schluessel die nicht in der indexdatei stehen
-	rm $(ls K*[key,private] | grep -v "`cat .index.zsk`" | grep -v "`cat .index.ksk`") 2>/dev/null || true
+				# schluessel die in der indexdatei standen, werden an die
+				# zonedatei angehangen.
+				if ($file =~ /.*key/) {
+					open (KEYFILE, "$file");
+					push @new_zone_content, <KEYFILE>;
+					close (KEYFILE);
+					
+					last;
+				}
+			}
+		}
 
-	#erzeugt ein backup und entfernt alle schluessel aus der zonedatei
-	mv $zone .$zone
-	grep -v 'DNSKEY' .$zone >> $zone
+		#loescht alle unbenoetigten schluessel
+		if ($rm_count == 1) {
+			print `rm -f $file`;
+		}
+	}
 
-	#fuegt die existirenden schluessel in die zonedatei ein
-	cat K$zone.*key >> $zone
-done
+	open (ZONE, ">$master_dir/$zone/$zone");
+	print ZONE @new_zone_content;
+	close (ZONE);
+	
+	print "$master_dir/$zone/$zone wurde neu erstellt \n";
+}
--- a/dnssec-sign	Thu Jul 22 12:44:14 2010 +0200
+++ b/dnssec-sign	Tue Jul 27 09:48:25 2010 +0200
@@ -1,7 +1,7 @@
 #!/bin/bash
-source ./dnstools.conf
-master_dir=$MASTER_DIR
-
+#source ./dnstools.conf
+master_dir="/etc/bind/master"
+SIGN_ALERT_TIME="48"
 
 #prüft die eingegebnen domains
 for utf8domain in $@
@@ -45,9 +45,9 @@
 function new_sign {
 	for zone in $master_dir/*
 	do
-		if [ -f $zone/keycounter ]
+		if [ -f $zone/.keycounter ]
 		then
-			if [ `< $zone/keycounter` -le 0 ]
+			if [ `< $zone/.keycounter` -le 0 ]
 			then
 				echo $zone
 			fi
@@ -66,6 +66,6 @@
 do
 	cd $zone
 	domain=${zone##/*/}	
-	key_counter=`< keycounter`
-	dnssec-signzone $domain && echo $[ key_counter + 1 ] > keycounter
+	key_counter=`< .keycounter`
+	dnssec-signzone $domain && echo $[ key_counter + 1 ] > .keycounter
 done
--- a/mkready	Thu Jul 22 12:44:14 2010 +0200
+++ b/mkready	Tue Jul 27 09:48:25 2010 +0200
@@ -30,7 +30,7 @@
 				$_ = "$1$2.signed$3\n";
 			}
 
-		open (FILE, ">test");
+		open (FILE, ">$conf_file");
 		print FILE @c_content;
 		close (FILE);
 
@@ -40,7 +40,7 @@
 
 		open (FILE, $conf_file);
 		@c_content = <FILE>;
-		close (DATEI);
+		close (FILE);
 		
 		foreach (@c_content) {
 			if (m{(.*)($zone_file)\.signed(.*)}) {
--- a/zone-ls	Thu Jul 22 12:44:14 2010 +0200
+++ b/zone-ls	Tue Jul 27 09:48:25 2010 +0200
@@ -29,8 +29,8 @@
 	$info_ksk = @temp;
 
 	#prueft wie oft die schluessel zum signieren genutzt wurden
-	if (-e "$master_dir/$domain/keycounter") {
-		open(FILE, "$master_dir/$domain/keycounter");
+	if (-e "$master_dir/$domain/.keycounter") {
+		open(FILE, "$master_dir/$domain/.keycounter");
 		chomp ($info_kc = <FILE>);
 		close(FILE);
 	} else {
--- a/zone-mk	Thu Jul 22 12:44:14 2010 +0200
+++ b/zone-mk	Tue Jul 27 09:48:25 2010 +0200
@@ -33,7 +33,7 @@
 
 
 # legt fuer jede domain in @ARGV ein verzeichnis in $master_dir an.
-# schreibt aus den angegeben templates die dateien $zonefile und $config
+# schreibt aus den angegebenen templates die dateien $zonefile und $config
 # in die entsprechenden verzeichnisse.
 
 foreach (@ARGV) {