diff -r 2c3bcb280768 -r 5b52190d8750 dnssec-sign --- 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 +# .signed-datei den zeitpunkt in $time mit dem ablaufdatum der +# signatur, welcher aus der datei .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 = ; + 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 = ; + 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 = ; + close (KC); + $kc += 1; + open (KC, ">$master_dir/$zone/.keycounter" ); + print KC $kc; + close (KC); + + } else { + print "$zone konnte nicht signiert werden \n"; + } +} +