# HG changeset patch # User asuess@dns.net.schlittermann.de # Date 1280216905 -7200 # Node ID 2c3bcb28076803019a46007f06a72a4891c1e790 # Parent 8715e7b706db551b179f0e900bc06c6ad47254fb dnssec-creatkey in perl geschrieben diff -r 8715e7b706db -r 2c3bcb280768 dnssec-creatkey --- 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 = ; + 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 = ; + 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 = ; + 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 = ; + close (INDEX); + open (INDEX, "$master_dir/$zone/.index.ksk"); + push @keylist, ; + 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 = ; + 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, ; + 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"; +} diff -r 8715e7b706db -r 2c3bcb280768 dnssec-sign --- 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 diff -r 8715e7b706db -r 2c3bcb280768 mkready --- 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 = ; - close (DATEI); + close (FILE); foreach (@c_content) { if (m{(.*)($zone_file)\.signed(.*)}) { diff -r 8715e7b706db -r 2c3bcb280768 zone-ls --- 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 = ); close(FILE); } else { diff -r 8715e7b706db -r 2c3bcb280768 zone-mk --- 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) {