--- a/dnssec-keytool.pl Wed Dec 29 22:10:40 2010 +0100
+++ b/dnssec-keytool.pl Wed Dec 29 22:11:21 2010 +0100
@@ -3,18 +3,42 @@
use warnings;
use strict;
use FindBin;
+use File::Temp;
+
+sub read_conf;
+sub read_argv($);
+sub rm_keys(@);
+sub creat_zsk(@);
+
+MAIN: {
+ my @zone;
+ my $do;
+
+ my %conf = read_conf();
+ ($do, @zone) = read_argv($conf{master_dir});
+
+ # completed the program, if not a valid zones was handed over
+ unless (@zone) { exit; }
+
+ if ($do eq "rm") { rm_keys($conf{master_dir}, @zone); exit; }
+# if ($do eq "ck") { &ck_zone; }
+ if ($do eq "ksk") { creat_ksk($conf{master_dir}, @zone); }
+
+ creat_zsk($conf{master_dir}, @zone);
+# &post_creat;
+}
sub read_conf {
# read configuration
- my @configs = ("$FindBin::Bin/dnstools.conf", "/etc/dnstools.conf");
- our %config;
+ my @conffile = ("etc/dnstools.conf", "$FindBin::Bin/dnstools.conf");
+ my %return;
- for (grep { -f } @configs) {
- open(CONFIG, $_) or die "Can't open $_: $!\n";
+ for (grep { -f } @conffile) {
+ open(CONFIG, "<", $_) or die "Can't open $_: $!\n";
}
unless (seek(CONFIG, 0, 0)) {
- die "Can't open config (searched: @configs)\n";
+ die "Can't open config (searched: @conffile)\n";
}
while (<CONFIG>) {
chomp;
@@ -24,18 +48,20 @@
next unless length;
my ($cname, $ccont) = split(/\s*=\s*/, $_, 2);
- $config{$cname} = $ccont;
+ $return{$cname} = $ccont;
}
close(CONFIG);
+ return %return;
}
-sub read_argv {
+sub read_argv ($) {
# evaluate argv or print the help
+ my $master_dir = $_[0];
+
my $arg = shift @ARGV;
my $zone;
- our $do;
- our @zones;
- our $master_dir;
+ my $do; # return
+ my @zone; # return
if (!defined $arg) {
print " usage: dnssec-keytool <option> zone\n";
@@ -61,21 +87,20 @@
for (@ARGV) {
chomp($zone = `idn --quiet "$_"`);
if (-e "$master_dir/$zone/$zone") {
- push @zones, $zone;
+ push @zone, $zone;
}
}
+ return ($do, @zone);
}
-sub rm_keys {
+sub rm_keys (@) {
# deletes all the keys were handed over -rm in argv
- our @zones;
- our $master_dir;
- my $zone;
+ my ($master_dir, @zone) = @_;
my @new_zone_content;
my @old_zone_content;
- for (@zones) {
- $zone = $_;
+ for (@zone) {
+ my $zone = $_;
my $zpf = "$master_dir/$zone";
my $ep = 0;
@@ -118,27 +143,25 @@
push @new_zone_content, $_;
}
}
-
- open(ZONE, ">$zpf/$zone") or die "$zpf/$zone: $!\n";
- print ZONE @new_zone_content;
- close(ZONE);
+
+ my $fh = File::Temp->new(DIR => "$zpf")
+ or die "Can't create tmpdir: $!\n";
+ print $fh join "" => @new_zone_content, "";
+ rename($fh->filename => "$zpf/$zone")
+ or die "Can't rename " . $fh->filename . " to $zpf/$zone: $!\n";
}
}
sub creat_ksk {
- our @zones;
- our $master_dir;
+ my ($master_dir, @zone) = @_;
my @index;
- my $zone;
my $keyname;
- my $zpf;
- for (@zones) {
- $zone = $_;
- $zpf = "$master_dir/$zone";
+ for (@zone) {
+ my $zone = $_;
+ my $zpf = "$master_dir/$zone";
- chdir "$zpf" or die "$zpf: $!\n";
- $keyname = `dnssec-keygen -a RSASHA1 -b 2048 -f KSK -n ZONE $zone`;
+ $keyname = `cd $zpf && dnssec-keygen -a RSASHA1 -b 2048 -f KSK -n ZONE $zone`;
unless (-f ".index.ksk") { @index = (); }
else {
@@ -162,20 +185,16 @@
}
}
-sub creat_zsk {
- our @zones;
- our $master_dir;
+sub creat_zsk (@) {
+ my ($master_dir, @zone) = @_;
my @index;
- my $zone;
my $keyname;
- my $zpf;
- for (@zones) {
- $zone = $_;
- $zpf = "$master_dir/$zone";
+ for (@zone) {
+ my $zone = $_;
+ my $zpf = "$master_dir/$zone";
- chdir "$zpf" or die "$zpf: $!\n";
- $keyname = `dnssec-keygen -a RSASHA1 -b 512 -n ZONE $zone`;
+ $keyname = `cd $zpf && dnssec-keygen -a RSASHA1 -b 512 -n ZONE $zone`;
unless (-f ".index.zsk") { @index = (); }
else {
@@ -324,30 +343,6 @@
close(ZONEFILE);
}
-&read_conf;
-
-our %config;
-our $do; # statements from argv
-our @zones; # list of zones from argv
-our $master_dir = $config{master_dir};
-our $bind_dir = $config{bind_dir};
-our $conf_dir = $config{zone_conf_dir};
-our $sign_alert_time = $config{sign_alert_time};
-our $indexzone = $config{indexzone};
-our $key_counter_end = $config{key_counter_end};
-our $ablauf_zeit = $config{abl_zeit};
-
-&read_argv;
-
-# completed the program, if not a valid zones was handed over
-unless (@zones) { exit; }
-
-if ($do eq "rm") { &rm_keys; exit; }
-if ($do eq "ck") { &ck_zone; }
-if ($do eq "ksk") { &creat_ksk; }
-
-&creat_zsk;
-&post_creat;
__END__