dnssec-sign
changeset 20 5b52190d8750
parent 19 2c3bcb280768
child 21 6715f8f9d04c
equal deleted inserted replaced
19:2c3bcb280768 20:5b52190d8750
     1 #!/bin/bash
     1 #!/usr/bin/perl -w
     2 #source ./dnstools.conf
       
     3 master_dir="/etc/bind/master"
       
     4 SIGN_ALERT_TIME="48"
       
     5 
     2 
     6 #prüft die eingegebnen domains
     3 use strict;
     7 for utf8domain in $@
       
     8 do
       
     9 	domain=$(idn --quiet "$utf8domain")	
       
    10 
     4 
    11 	if [ -d $master_dir/$domain ]
     5 my $master_dir="/etc/bind/master" ;
    12 	then
     6 my $sign_alert_time="48";		# zeitraum zwischen signierung und ablauf in h
    13 		zone_aenderung="$zone_aenderung $master_dir/$domain"
     7 my $zone;
    14 	else
     8 my (@manu, @auto);
    15 		echo $domain ist keine verwaltete Zone
     9 my @zone_sig_content;
    16 	fi
    10 my $sig_date;
    17 done
    11 my $kc;
    18 
    12 
    19 
    13 # prueft zonen aus ARGV und fuegt sie in die liste @manu ein
    20 #gibt zonen mit abgelaufener signatur in die standardausgabe
    14 foreach (@ARGV) {
    21 function time_out {
    15 	chomp ($zone = `idn --quiet $_`);
    22 	unowtime=`date +%s`
    16 	if (-e "$master_dir/$zone") {
    23 	alerttime=`date -d @$[unowtime - $[ 3600 * $SIGN_ALERT_TIME  ] ] +%Y%m%d%H`
    17 		push @manu, $zone;
    24 
    18 	} else {
    25 	for zone in $master_dir/*
    19 		print "$zone ist keine verwaltete zone \n";
    26 	do	
    20 	}
    27 		domain=${zone##/*/}
       
    28 		if [ -f $zone/$domain.signed ]
       
    29 		then
       
    30 			endtime=`cat $zone/$domain.signed | egrep 'DNSKEY' | egrep '[0-9]{14}' | head -n1 | cut -d" " -f5 | cut -c 1-10`
       
    31 		fi
       
    32 
       
    33 		if [ $endtime ]
       
    34 		then
       
    35 			if [ $alerttime -ge $endtime ]
       
    36 			then
       
    37 				echo $zone
       
    38 			fi
       
    39 		fi
       
    40 	done
       
    41 }
    21 }
    42 
    22 
       
    23 # feststellen des aktuellen zeitpunktes, zuzueglich der $sign_alert_time
       
    24 # die ausgabe $time ist im selben format wie in der signed-datei und kann
       
    25 # verglichen werden.
       
    26 chomp (my $unixtime=`date +%s`);
       
    27 $unixtime = $unixtime + (3600 * $sign_alert_time);
       
    28 my $time = `date -d \@$unixtime +%Y%m%d%H`;
    43 
    29 
    44 #gibt zonen mit schluessel aber ohne signatur in die standardausgabe
    30 # vergleicht fuer alle zonen im ordner $master_dir mit einer
    45 function new_sign {
    31 # <zone>.signed-datei den zeitpunkt in $time mit dem ablaufdatum der
    46 	for zone in $master_dir/*
    32 # signatur, welcher aus der datei <zone>.signed ausgelesen wird.
    47 	do
    33 foreach (`ls $master_dir`) {
    48 		if [ -f $zone/.keycounter ]
    34 	chomp ($zone = $_);
    49 		then
    35 
    50 			if [ `< $zone/.keycounter` -le 0 ]
    36 	if (-e "$master_dir/$zone/$zone.signed") {
    51 			then
    37 
    52 				echo $zone
    38 		open (ZONE, "$master_dir/$zone/$zone.signed");
    53 			fi
    39 		@zone_sig_content = <ZONE>;
    54 		fi
    40 		close (ZONE);
    55 	done
    41 
       
    42 		foreach (@zone_sig_content) {
       
    43 			if (m#SOA.*[0-9]{14}#) {
       
    44 				s#.*([0-9]{10})([0-9]{4}).*#$1#;
       
    45 				if ($_ < $time) {
       
    46 					push @auto, $zone;
       
    47 				}
       
    48 			}
       
    49 		}
       
    50 	}
    56 }
    51 }
    57 
    52 
       
    53 #gibt zonen mit schluessel aber ohne signatur in die liste @auto
       
    54 foreach (`ls $master_dir`) {
       
    55 	chomp ($zone = $_);
    58 
    56 
    59 #uebergibt die ausgabe der funktionen in listen
    57 	if (-e "$master_dir/$zone/.keycounter") {
    60 zone_new_sign=`new_sign`
       
    61 zone_time_out=`time_out`
       
    62 
    58 
       
    59 		open (KC, "$master_dir/$zone/.keycounter" );
       
    60 		$kc = <KC>;
       
    61 		close (KC);
    63 
    62 
    64 # signiert alle zonen aus den listen
    63 		if ( $kc < 1) {	
    65 for zone in $zone_aenderung $zone_new_sign $zone_time_out
    64 			push @auto, $zone;
    66 do
    65 		}
    67 	cd $zone
    66 	}
    68 	domain=${zone##/*/}	
    67 }
    69 	key_counter=`< .keycounter`
    68 
    70 	dnssec-signzone $domain && echo $[ key_counter + 1 ] > .keycounter
    69 # signiert alle zonen in @auto und @manu und erhoeht den wert in
    71 done
    70 # der keycounter-datei
       
    71 foreach (@auto, @manu) {
       
    72 	$zone = $_ ;
       
    73 
       
    74 	chdir "$master_dir/$zone";
       
    75 
       
    76 	if (`dnssec-signzone $zone 2>/dev/null`) {
       
    77 		print "$zone neu signiert \n";
       
    78 
       
    79 		open (KC, "$master_dir/$zone/.keycounter" );
       
    80 		$kc = <KC>;
       
    81 		close (KC);
       
    82 		$kc += 1;
       
    83 		open (KC, ">$master_dir/$zone/.keycounter" );
       
    84 		print KC $kc;
       
    85 		close (KC);
       
    86 
       
    87 	} else {
       
    88 		print "$zone konnte nicht signiert werden \n";
       
    89 	}
       
    90 }
       
    91