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 |