|
1 #! /usr/bin/perl |
|
2 |
|
3 use v5.10; |
|
4 use strict; |
|
5 use warnings; |
|
6 use Pod::Usage; |
|
7 use File::Basename; |
|
8 use Time::Local; |
|
9 use Getopt::Long; |
|
10 use if $ENV{DEBUG} => "Smart::Comments"; |
|
11 use DNStools::Config qw(get_config); |
|
12 |
|
13 my %cf; |
|
14 my $opt_expiry = undef; |
|
15 |
|
16 MAIN: { |
|
17 my %info; # will hold the information we collected |
|
18 |
|
19 GetOptions( |
|
20 "e|expiry" => \$opt_expiry, |
|
21 "h|help" => sub { pod2usage(-exit => 0, -verbose => 1) }, |
|
22 "m|man" => sub { |
|
23 pod2usage( |
|
24 -exit => 0, |
|
25 -verbose => 2, |
|
26 # "system('perldoc -V &>/dev/null')" appears shorter, but may not |
|
27 # do what you expect ( it still returns 0 on debian squeeze with |
|
28 # dash as system shell even if cannot find the command in $PATH) |
|
29 -noperldoc => system('perldoc -V >/dev/null 2>&1') |
|
30 ); |
|
31 }, |
|
32 ) or pod2usage; |
|
33 |
|
34 %cf = get_config(); |
|
35 die "$cf{master_dir}: $!\n" if not -d $cf{master_dir}; |
|
36 |
|
37 foreach my $dir (grep { -d } glob "$cf{master_dir}/*") { |
|
38 |
|
39 my $zone = basename($dir); |
|
40 $info{$zone} = { status => "OK" }; |
|
41 |
|
42 if (not -f "$dir/.index.zsk") { |
|
43 $info{$zone}{zsk} = 0; |
|
44 $info{$zone}{ksk} = 0; |
|
45 $info{$zone}{kc} = 0; |
|
46 $info{$zone}{end} = "-"; |
|
47 $info{$zone}{expiry} = undef; |
|
48 next; |
|
49 } |
|
50 |
|
51 # prueft wie viele zsks genutzt werden |
|
52 { |
|
53 open(my ($fh), $_ = "<$dir/.index.zsk") |
|
54 or die "Can't open $_: $!\n"; |
|
55 () = <$fh>; |
|
56 $info{$zone}{zsk} = $. |
|
57 } |
|
58 |
|
59 # prueft wie viele ksks genutzt werden |
|
60 { |
|
61 open(my ($fh), $_ = "<$dir/.index.ksk") |
|
62 or die "Can't open $_: $!\n"; |
|
63 () = <$fh>; |
|
64 $info{$zone}{ksk} = $. |
|
65 } |
|
66 |
|
67 # prueft wie oft die schluessel zum signieren genutzt wurden |
|
68 { |
|
69 open(my ($fh), $_ = "<$dir/.keycounter") |
|
70 or die "Can't open $_: $!\n"; |
|
71 chomp($info{$zone}{kc} = <$fh>); |
|
72 } |
|
73 |
|
74 # prueft das ablaufdatum |
|
75 if (!-f "$dir/$zone.signed") { |
|
76 $info{$zone}{end} = "-"; |
|
77 next; |
|
78 } |
|
79 |
|
80 open(my ($fh), $_ = "<$dir/$zone.signed") or die "Can't open $_: $!\n"; |
|
81 while (<$fh>) { |
|
82 next if not /RSIG\s+SOA\s.*\s |
|
83 (?<year>\d\d\d\d) |
|
84 (?<mon>\d\d) |
|
85 (?<day>\d\d) |
|
86 (?<hour>\d\d) |
|
87 (?<min>\d\d)\d+\s\(/ix; |
|
88 $info{$zone}{end} = "$+{day}.$+{mon}.$+{year} $+{hour}:$+{min}"; |
|
89 $info{$zone}{expiry} = |
|
90 timelocal(0, $+{min}, $+{hour}, $+{day}, $+{mon} - 1, $+{year}); |
|
91 } |
|
92 } |
|
93 |
|
94 { # output |
|
95 |
|
96 my $sort_by = |
|
97 $opt_expiry |
|
98 ? sub { ($info{$a}{expiry} // 2**64) <=> ($info{$b}{expiry} // 2**64) } |
|
99 : sub { $a cmp $b }; |
|
100 |
|
101 my $format_h = "%-35s %-8s %1s/%1s %3s %7s\n"; |
|
102 my $format_l = "%-35s %-8s %1d/%1d %5d %19s\n"; |
|
103 |
|
104 printf $format_h => qw(Domain Status ZSK KSK Used Sig-end); |
|
105 |
|
106 foreach my $zone (sort $sort_by keys %info) { |
|
107 printf $format_l => $zone, |
|
108 @{ $info{$zone} }{qw(status zsk ksk kc end)}; |
|
109 } |
|
110 } |
|
111 } |
|
112 |
|
113 __END__ |
|
114 |
|
115 =head1 NAME |
|
116 |
|
117 zone-ls -- lists all zones |
|
118 |
|
119 =head1 SYNOPSIS |
|
120 |
|
121 zone-ls [-e|--expiry] |
|
122 |
|
123 =head1 DESCRIPTION |
|
124 |
|
125 This B<zone-ls> lists all zones under control of our dnstools suite. The output is ordered by domain name. |
|
126 |
|
127 =head1 OPTIONS |
|
128 |
|
129 =over |
|
130 |
|
131 =item B<-e>|B<--expiry> |
|
132 |
|
133 Order the output by expiry date. The sooner the key expires, the more top the |
|
134 domain is listed. |
|
135 |
|
136 =back |
|
137 |
|
138 Additionally the common B<-h>|B<--help>|B<-m>|B<--man> options, which should be |
|
139 self explanatory. |
|
140 |
|
141 =head1 AUTHORS |
|
142 |
|
143 L<andre.suess@pipkin.cc> |
|
144 |
|
145 =cut |
|
146 |
|
147 # vim:ts=4 sw=4 ai si aw: |