dnssec-creatkey
changeset 26 0342c09abf97
parent 25 c02caf4e0eb6
child 27 d5337081ed02
equal deleted inserted replaced
25:c02caf4e0eb6 26:0342c09abf97
    27         $config{$cname} = $ccont;
    27         $config{$cname} = $ccont;
    28 }
    28 }
    29 close (CONFIG);
    29 close (CONFIG);
    30 
    30 
    31 
    31 
    32 my $master_dir= $config{master_dir};
    32 my $master_dir = $config{master_dir};
    33 my $key_counter_end=$config{key_counter_end};
    33 my $key_counter_end = $config{key_counter_end};
    34 my @change;
    34 my @change;
    35 my @manu;
    35 my @manu;
    36 my @index;
    36 my @index;
    37 my $zone;
    37 my $zone;
    38 my $keyname;
    38 my $keyname;
    39 
    39 
    40 # prueft ob eingaben in ARGV domains sind und gibt sie in die liste @manu
    40 # prueft ob eingaben in ARGV domains sind und gibt sie in die liste @manu
    41 for (@ARGV) {
    41 for (@ARGV) {
    42 	chomp (my $zone = `idn --quiet "$_"`);
    42 	chomp (my $zone = `idn --quiet "$_"`);
    43 
    43 
    44 	if (-e "$master_dir/$zone") {
    44 	if (-d "$master_dir/$zone") {
    45 		push (@manu, $zone);
    45 		push (@manu, $zone);
    46 	} else {
    46 	}
    47 		print " $zone ist keine verwaltete zone \n ";
    47 	else {
       
    48 		print " $zone not exist\n ";
    48 	}
    49 	}
    49 }
    50 }
    50 	
    51 	
    51 # gibt alle zonen mit abgelaufenen keycounter in die liste @change
    52 # gibt alle zonen mit abgelaufenen keycounter in die liste @change
    52 for (<$master_dir/*>) {
    53 while (<$master_dir/*>) {
    53 	chomp ($zone = $_);
    54 	chomp ($zone = $_);
    54 	my $key;
    55 	my $key;
    55 
    56 
    56 	if (-e "$zone/.keycounter") {
    57 	unless (-f "$zone/.keycounter") {
    57 
    58 		next
    58 		open (KEY, "$zone/.keycounter");
    59 	}
    59 		$key = <KEY>;
    60 
    60 		close (KEY);
    61 	open (KEY, "$zone/.keycounter") or die "$zone/.keycounter: $!\n";
    61 
    62 	$key = <KEY>;
    62 		if ($key_counter_end < $key) {
    63 	close (KEY);
    63 			$zone =~ s#($master_dir/)(.*)#$2#;
    64 
    64 			push (@change, $zone);
    65 	if ($key_counter_end <= $key) {
    65 		}
    66 		$zone =~ s#($master_dir/)(.*)#$2#;
       
    67 		push (@change, $zone);
    66 	}
    68 	}
    67 }
    69 }
    68 
    70 
    69 #erzeugt zsks
    71 #erzeugt zsks
    70 for (@change, @manu) {
    72 for (@change, @manu) {
    71 	$zone = $_;
    73 	$zone = $_;
    72 
    74 
    73 	chdir "$master_dir/$zone" or die "chdir nach / nicht moeglich: $1";
    75 	chdir "$master_dir/$zone" or die "$master_dir/$zone: $!\n";
    74 	$keyname = `dnssec-keygen -a RSASHA1 -b 512 -n ZONE $zone`;
    76 	$keyname = `dnssec-keygen -a RSASHA1 -b 512 -n ZONE $zone`;
    75 
    77 
    76 	if (-e ".index.zsk") {
    78 	unless (-f ".index.zsk") {
    77 		open (INDEX, ".index.zsk");
    79 		@index = ();
       
    80 	}
       
    81 	else {
       
    82 		open (INDEX, ".index.zsk") or die "$master_dir/$zone/.index.zsk: $!\n";
    78 		@index = <INDEX>;
    83 		@index = <INDEX>;
    79 		close (INDEX);
    84 		close (INDEX);
    80 	} else {
       
    81 		@index = ();
       
    82 	}
    85 	}
    83 
    86 
    84 	push @index, $keyname;
    87 	push @index, $keyname;
    85 	if (@index > 2){
    88 	if (@index > 2){
    86 		shift (@index);
    89 		shift (@index);
    87 	}
    90 	}
    88 
    91 
    89 	open (INDEX, ">.index.zsk");
    92 	open (INDEX, ">.index.zsk") or die "$master_dir/$zone/.index.zsk: $!\n";
    90 	print INDEX @index;
    93 	print INDEX @index;
    91 	close (INDEX);
    94 	close (INDEX);
    92 
    95 
    93 	chomp ($keyname);
    96 	chomp ($keyname);
    94 	print "$keyname (ZSK) erzeugt fuer $zone \n";
    97 	print "$keyname (ZSK) erzeugt fuer $zone \n";
    95 
    98 
    96 	open (KC, ">.keycounter");
    99 	open (KC, ">.keycounter") or die "$master_dir/$zone/keycounter: $!\n";
    97 	print KC "0";
   100 	print KC "0";
    98 	close (KC);
   101 	close (KC);
    99 }
   102 }
   100 
   103 
   101 #erzeugt ksks
   104 #erzeugt ksks
   102 for (@manu) {
   105 for (@manu) {
   103 	$zone = $_;
   106 	$zone = $_;
   104 
   107 
   105 	chdir "$master_dir/$zone" or die "chdir nach / nicht moeglich: $1";
   108 	chdir "$master_dir/$zone" or die "$master_dir/$zone: $!\n";
   106 	$keyname = `dnssec-keygen -a RSASHA1 -b 2048 -f KSK -n ZONE $zone`;
   109 	$keyname = `dnssec-keygen -a RSASHA1 -b 2048 -f KSK -n ZONE $zone`;
   107 
   110 
   108 	if (-e ".index.ksk") {
   111 	unless (-f ".index.ksk") {
   109 		open (INDEX, ".index.ksk");
   112 		@index = ();
       
   113 	} else {
       
   114 		open (INDEX, ".index.ksk") or die "$master_dir/$zone/.index.ksk: $!\n";
   110 		@index = <INDEX>;
   115 		@index = <INDEX>;
   111 		close (INDEX);
   116 		close (INDEX);
   112 	} else {
       
   113 		@index = ();
       
   114 	}
   117 	}
   115 
   118 
   116 	push @index, $keyname;
   119 	push @index, $keyname;
   117 	if (@index > 2){
   120 	if (@index > 2){
   118 		shift (@index);
   121 		shift (@index);
   119 	}
   122 	}
   120 
   123 
   121 	open (INDEX, ">.index.ksk");
   124 	open (INDEX, ">.index.ksk") or die "$master_dir/$zone/.index.ksk: $!\n";
   122 	print INDEX @index;
   125 	print INDEX @index;
   123 	close (INDEX);
   126 	close (INDEX);
   124 
   127 
   125 	chomp ($keyname);
   128 	chomp ($keyname);
   126 	print "$keyname (KSK) erzeugt fuer $zone \n";
   129 	print "$keyname (KSK) erzeugt fuer $zone \n";
   134 	my @old_zone_content = ();
   137 	my @old_zone_content = ();
   135 	my @new_zone_content = ();
   138 	my @new_zone_content = ();
   136 	my @keylist = ();
   139 	my @keylist = ();
   137 	my $file = ();
   140 	my $file = ();
   138 
   141 
   139 	open (INDEX, "$master_dir/$zone/.index.zsk");
   142 
       
   143 	open (INDEX, "<$master_dir/$zone/.index.zsk") or die "$master_dir/$zone/.index.zsk: $!\n";
   140 	@keylist = <INDEX>;
   144 	@keylist = <INDEX>;
   141 	close (INDEX);
   145 	close (INDEX);
   142 
   146 
   143 	open (INDEX, "$master_dir/$zone/.index.ksk");
   147 	open (INDEX, "<$master_dir/$zone/.index.ksk") or die "$master_dir/$zone/.index.ksk: $!\n";
   144 	push @keylist, <INDEX>;
   148 	push @keylist, <INDEX>;
   145 	close (INDEX);
   149 	close (INDEX);
   146 
   150 
   147 	open (ZONE, "$master_dir/$zone/$zone");
   151 	open (ZONE, "<$master_dir/$zone/$zone") or die "$master_dir/$zone/$zone: $!\n";
   148 	@old_zone_content = <ZONE>;
   152 	@old_zone_content = <ZONE>;
   149 	close (ZONE);
   153 	close (ZONE);
   150 
   154 
   151 	# kuerzt die schluessel-bezeichnung aus der indexdatei auf die id um sie
   155 	# kuerzt die schluessel-bezeichnung aus der indexdatei auf die id um sie
   152 	# besser vergleichen zu koennen.
   156 	# besser vergleichen zu koennen.
   153 	foreach (@keylist) {
   157 	for (@keylist) {
   154 		chomp;
   158 		chomp;
   155 		s#K.*\+.*\+(.*)#$1#;
   159 		s#K.*\+.*\+(.*)#$1#;
   156 	}
   160 	}
   157 
   161 
   158 	# filtert alle schluessel aus der zonedatei
   162 	# filtert alle schluessel aus der zonedatei
   159 	# old_zone_content ==> new_zone_content
   163 	# old_zone_content ==> new_zone_content
   160 	foreach (@old_zone_content) {
   164 	for (@old_zone_content) {
   161 		unless (/IN\sDNSKEY/) {
   165 		unless (/IN\sDNSKEY/) {
   162 			push @new_zone_content, $_;
   166 			push @new_zone_content, $_;
   163 		}
   167 		}
   164 	}
   168 	}
   165 
   169 
   166 	# prueft alle schluesseldateien (ksk, zsk) ob sie in der jeweiligen
   170 	# prueft alle schluesseldateien (ksk, zsk) ob sie in der jeweiligen
   167 	# indexdatei beschrieben sind. wenn nicht werden sie geloescht.
   171 	# indexdatei beschrieben sind. wenn nicht werden sie geloescht.
   168 	foreach (`ls $master_dir/$zone/K*[key,private]`){
   172 	for (`ls $master_dir/$zone/K*[key,private]`){
   169 		chomp;
   173 		chomp;
   170 		$file = $_;
   174 		$file = $_;
   171 		my $rm_count = 1;
   175 		my $rm_count = 1;
   172 
   176 
   173 		foreach (@keylist) {
   177 		for (@keylist) {
   174 
   178 
   175 			if ($file =~ /$_/) {
   179 			if ($file =~ /$_/) {
   176 				$rm_count = 0;
   180 				$rm_count = 0;
   177 
   181 
   178 				# schluessel die in der indexdatei standen, werden an die
   182 				# schluessel die in der indexdatei standen, werden an die
   179 				# zonedatei angehangen.
   183 				# zonedatei angehangen.
   180 				if ($file =~ /.*key/) {
   184 				if ($file =~ /.*key/) {
   181 					open (KEYFILE, "$file");
   185 					open (KEYFILE, "<$file") or next "$file: $!\n";
   182 					push @new_zone_content, <KEYFILE>;
   186 					push @new_zone_content, <KEYFILE>;
   183 					close (KEYFILE);
   187 					close (KEYFILE);
   184 					
   188 					
   185 					last;
   189 					last;
   186 				}
   190 				}
   187 			}
   191 			}
   188 		}
   192 		}
   189 
   193 
   190 		#loescht alle unbenoetigten schluessel
   194 		#loescht alle unbenoetigten schluessel
   191 		if ($rm_count == 1) {
   195 		if ($rm_count == 1) {
   192 			print `rm -f $file`;
   196 			unlink "$file";
   193 		}
   197 		}
   194 	}
   198 	}
   195 
   199 
   196 	open (ZONE, ">$master_dir/$zone/$zone");
   200 
       
   201 	open (ZONE, ">$master_dir/$zone/$zone") or die "$master_dir/$zone/$zone: $!\n";
   197 	print ZONE @new_zone_content;
   202 	print ZONE @new_zone_content;
   198 	close (ZONE);
   203 	close (ZONE);
   199 	
   204 	
   200 	print "$master_dir/$zone/$zone wurde neu erstellt \n";
   205 	print "$master_dir/$zone/$zone wurde neu erstellt \n";
   201 }
   206 }