--- a/bin/zone-mk Sat Jan 22 00:05:44 2011 +0100
+++ b/bin/zone-mk Sun Jan 23 00:21:14 2011 +0100
@@ -1,119 +1,120 @@
#!/usr/bin/perl
+use 5.010;
use warnings;
use strict;
-use FindBin;
+use Pod::Usage;
+use if $ENV{DEBUG} => "Smart::Comments";
+use Cwd qw(abs_path);
+use File::Path qw(make_path);
+use File::Basename;
+use Getopt::Long;
+use Net::LibIDN qw(:all);
use DNStools::Config qw(get_config);
-
-my %config;
+use Template;
-if (@ARGV < 2) {
- print "usage: zone-mk kundennummer domain ... \n";
- exit 1;
-}
+my $CHARSET = "UTF-8";
+
+my $opt_force = 0;
+
+MAIN: {
+
+ my %cf = get_config;
-# oeffnet Konfigurations- und Templatefiles - relativ oder absolut
-my @templc = (
- "$FindBin::Bin/templates/named.config",
- "/etc/dnstools/templates/named.config"
-);
-my @templz =
- ("$FindBin::Bin/templates/named.zone", "/etc/dnstools/templates/named.zone");
+ GetOptions(
+ "f|force" => \$opt_force,
+ "h|help" => sub { pod2usage(-verbose => 1, -exit => 0) },
+ "m|man" => sub {
+ pod2usage(
+ -verbose => 2,
+ -noperldoc => system("perldoc -V &>/dev/null"),
+ -exit => 0
+ );
+ },
+ )
+ and @ARGV >= 2
+ or pod2usage;
-for (grep { -f } @templc) {
- open(TEMPCONF, $_) or die "Can't open $_: $!\n";
-}
-unless (seek(TEMPCONF, 0, 0)) {
- die "Can't open template (searched: @templc)\n";
-}
+ my $customer = shift;
+
+ die "$cf{master_dir}: $!" if not -d -r -x $cf{master_dir};
+ die "$cf{zone_conf_dir}: $!" if not -d -r -x $cf{zone_conf_dir};
-for (grep { -f } @templz) {
- open(TEMPZONE, $_) or die "Can't open $_: $!\n";
-}
-unless (seek(TEMPZONE, 0, 0)) {
- die "Can't open template (searched: @templz)\n";
-}
+ # legt fuer jede domain in @ARGV ein verzeichnis in $master_dir an.
+ # schreibt aus den angegebenen templates die dateien $zonefile und $config
+ # in die entsprechenden verzeichnisse.
+ for my $utf8domain (@ARGV) {
+
+ my $domain = idn_to_ascii($utf8domain, $CHARSET);
+ my $zonefile = "$cf{master_dir}/$domain/$domain";
+ my $configfile = "$cf{zone_conf_dir}/$domain";
+ my $now = time;
+ make_path dirname $zonefile;
-%config = get_config();
+ if (-f $zonefile and not $opt_force) {
+ say "skipping $utf8domain: zone file '$zonefile' exists.";
+ next;
+ }
+
+ if (-f $configfile and not $opt_force) {
+ say "skipping $utf8domain: config file '$configfile' exists.";
+ next;
+ }
-my $primary = $config{primary};
-my $secondary = $config{secondary};
-my $zone_conf_dir = $config{zone_conf_dir};
-my $master_dir = $config{master_dir};
-my $customer = shift @ARGV;
-chomp(my $primary_ip = `dig +short $primary`);
-chomp(my $secondary_ip = `dig +short $secondary`);
-chomp(my $this_host = `hostname -f`);
-chomp(my $this_ip = `hostname -i`);
-chomp(my $this_domain = `hostname -d`);
-chomp(my $time = `date +%Y%m%d00`);
-chomp(my $start = `date -I`);
-my $hostmaster = "hostmaster.$this_domain";
+ say "domain $utf8domain ($domain) for $customer.";
-unless (-d $master_dir and -r $master_dir) {
- die "$master_dir: $!\n";
+ my %vars = (
+ domain => $domain,
+ utf8domain => $utf8domain,
+ now => $now,
+ zonefile => abs_path($zonefile),
+ customer => $customer,
+ hostmaster => $cf{hostmaster},
+ primary => $cf{primary},
+ secondary => $cf{secondary},
+ );
+
+ my $tt = Template->new(INCLUDE_PATH => $cf{template_dir})
+ or die "$Template::ERROR\n";
+
+ $tt->process("named.zone", \%vars, $zonefile) || die $tt->error;
+ $tt->process("named.config", \%vars, $configfile) || die $tt->error;
+
+ }
+
}
-unless (-d $zone_conf_dir and -r $zone_conf_dir) {
- die "$master_dir: $!\n";
-}
+__END__
+
+=head1 NAME
-# legt fuer jede domain in @ARGV ein verzeichnis in $master_dir an.
-# schreibt aus den angegebenen templates die dateien $zonefile und $config
-# in die entsprechenden verzeichnisse.
-for (@ARGV) {
+ zone-mk - create a new zone
- chomp(my $domain = `idn --quiet "$_"`);
- my $zonefile = "$master_dir/$domain/$domain";
- my $config = "$zone_conf_dir/$domain";
- my $utf8domain = "$_";
+=head1 SYNOPSIS
- unless (-d "$master_dir/$domain") {
- `mkdir $master_dir/$domain`;
- }
+ zone-mk [-f|--force] <customer-id> <domain>...
+
+=head1 DESCRIPTION
- if (-f $zonefile) {
- $zonefile =~ s#/.*/##;
- print "$zonefile exists. Skipping $domain\n";
- next;
- }
- if (-f $config) {
- $config =~ s#/.*/##;
- print "$config exists. Skipping $domain\n";
- next;
- }
+B<zone-mk> creates a new DNS zone file and the config snipped.
- print "$domain ($_) for $customer \n";
+=head1 OPTIONS
- my @tempzone = <TEMPZONE>;
- for (@tempzone) {
- s#<start>#$start#;
- s#<domain>#$domain#;
- s#<time>#$time#;
- s#<primary>#$primary#;
- s#<secondary>#$secondary#;
- s#<hostmaster>#$hostmaster#;
- s#<customer>#$customer#;
- s#<utf8domain>#$utf8domain#;
- }
+=over
+
+=item B<-f>|B<--force>
- open(ZONEOUT, ">$zonefile");
- print ZONEOUT @tempzone;
- close(ZONEOUT);
+Crate zone file and config even if they exist. (default: off)
+
+=item B<-h>|B<--help>
- my @tempconf = <TEMPCONF>;
- for (@tempconf) {
- s#<domain>#$domain#;
- s#<start>#$start#;
- s#<customer>#$customer#;
- s#<utf8domain>#$utf8domain#;
- s#<file>#$master_dir/$domain/$domain#;
- s#<primary_ip>#$primary_ip#;
- s#<secondary_ip>#$secondary_ip#;
- }
+=item B<-m>|B<--man>
+
+=back
- open(CONFOUT, ">$config");
- print CONFOUT @tempconf;
- close(CONFOUT);
-}
+=head1 FILES
+
+The F<dnstools.conf> is used.
+
+=cut