# HG changeset patch # User Heiko Schlittermann # Date 1295738474 -3600 # Node ID 6d624831079fd01f972fc49ab76797c9ac52e87b # Parent dc8741bbad33a10f1316ab989df5244dc70d6a4c zone-mk works now diff -r dc8741bbad33 -r 6d624831079f Build.PL --- a/Build.PL Sat Jan 22 00:05:44 2011 +0100 +++ b/Build.PL Sun Jan 23 00:21:14 2011 +0100 @@ -10,9 +10,13 @@ dist_version => "0.1", create_license => 1, license => "gpl", - requires => { perl => "5.10.0", }, - build_requires => { "Pod::Coverage" => 0, }, - script_files => [glob "bin/*"], # avoid .swp files + requires => { + perl => "5.10.0", + "Net::LibIDN" => "0", + "Template" => "0" + }, + build_requires => { "Pod::Coverage" => 0, "Test::Command" => "0.08" }, + script_files => [glob "bin/*"], # avoid .swp files ); $build->create_build_script; diff -r dc8741bbad33 -r 6d624831079f bin/zone-mk --- 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] ... + +=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 creates a new DNS zone file and the config snipped. - print "$domain ($_) for $customer \n"; +=head1 OPTIONS - my @tempzone = ; - for (@tempzone) { - s##$start#; - s##$domain#; - s#