sbin/zone-mk
changeset 131 d8fa60488868
parent 119 5a9a085650ea
child 150 3db363880766
equal deleted inserted replaced
130:5578cb7933c1 131:d8fa60488868
       
     1 #!/usr/bin/perl 
       
     2 
       
     3 use 5.010;
       
     4 use warnings;
       
     5 use strict;
       
     6 use Pod::Usage;
       
     7 use if $ENV{DEBUG} => "Smart::Comments";
       
     8 use Cwd qw(abs_path);
       
     9 use File::Path;
       
    10 use File::Basename;
       
    11 use Getopt::Long;
       
    12 use Net::LibIDN qw(:all);
       
    13 use DNStools::Config qw(get_config);
       
    14 use Template;
       
    15 
       
    16 my $CHARSET = "UTF-8";
       
    17 
       
    18 my $opt_force = 0;
       
    19 
       
    20 MAIN: {
       
    21 
       
    22     my %cf = get_config;
       
    23 
       
    24     GetOptions(
       
    25         "f|force" => \$opt_force,
       
    26         "h|help"  => sub { pod2usage(-verbose => 1, -exit => 0) },
       
    27         "m|man"   => sub {
       
    28             pod2usage(
       
    29                 -verbose   => 2,
       
    30                 # "system('perldoc -V &>/dev/null')" appears shorter, but may not
       
    31                 # do what you expect ( it still returns 0 on debian squeeze with
       
    32                 # dash as system shell even if cannot find the command in $PATH)
       
    33                 -noperldoc => system('perldoc -V >/dev/null 2>&1'),
       
    34                 -exit      => 0
       
    35             );
       
    36         },
       
    37       )
       
    38       and @ARGV >= 2
       
    39       or pod2usage;
       
    40 
       
    41     my $customer = shift;
       
    42 
       
    43     die "$cf{master_dir}: $!"    if not -d -r -x $cf{master_dir};
       
    44     die "$cf{zone_conf_dir}: $!" if not -d -r -x $cf{zone_conf_dir};
       
    45 
       
    46     # legt fuer jede Zone in @ARGV ein verzeichnis in $master_dir an.
       
    47     # schreibt aus den angegebenen templates die dateien $zonefile und $config
       
    48     # in die entsprechenden verzeichnisse.
       
    49     for my $utf8zone (@ARGV) {
       
    50 
       
    51         my $zone     = idn_to_ascii($utf8zone, $CHARSET);
       
    52         my $zonefile   = "$cf{master_dir}/$zone/$zone";
       
    53         my $configfile = "$cf{zone_conf_dir}/$zone";
       
    54         my $now        = time;
       
    55 
       
    56         mkpath dirname $zonefile;
       
    57 
       
    58         if (-f $zonefile and not $opt_force) {
       
    59             say "skipping $utf8zone: zone file '$zonefile' exists.";
       
    60             next;
       
    61         }
       
    62 
       
    63         if (-f $configfile and not $opt_force) {
       
    64             say "skipping $utf8zone: config file '$configfile' exists.";
       
    65             next;
       
    66         }
       
    67 
       
    68         say "zone $utf8zone ($zone) for $customer.";
       
    69 
       
    70         my %vars = (
       
    71             zone     => $zone,
       
    72             utf8zone => $utf8zone,
       
    73             now        => $now,
       
    74             zonefile   => abs_path($zonefile),
       
    75             customer   => $customer,
       
    76             hostmaster => $cf{hostmaster},
       
    77             primary    => $cf{primary},
       
    78             secondary  => $cf{secondary},
       
    79         );
       
    80 
       
    81         $vars{hostmaster} =~ s/@/./g;
       
    82 
       
    83         my $tt = Template->new(INCLUDE_PATH => $cf{template_dir})
       
    84           or die "$Template::ERROR\n";
       
    85 
       
    86         $tt->process("named.zone",   \%vars, $zonefile)   || die $tt->error;
       
    87         $tt->process("named.config", \%vars, $configfile) || die $tt->error;
       
    88 
       
    89     }
       
    90 
       
    91 }
       
    92 
       
    93 __END__
       
    94 
       
    95 =head1 NAME
       
    96 
       
    97     zone-mk - create a new zone
       
    98 
       
    99 =head1 SYNOPSIS
       
   100 
       
   101     zone-mk [-f|--force] <customer-id> <zone>...
       
   102 
       
   103 =head1 DESCRIPTION
       
   104 
       
   105 B<zone-mk> creates a new DNS zone file and the config snippet. Nothing
       
   106 else (especially no DNSSEC, and no bind integration) is done.
       
   107 
       
   108 =head1 OPTIONS
       
   109 
       
   110 =over
       
   111 
       
   112 =item B<-f>|B<--force>
       
   113 
       
   114 Create zone file and config even if they exist. (default: off)
       
   115 
       
   116 =item B<-h>|B<--help>
       
   117 
       
   118 =item B<-m>|B<--man>
       
   119 
       
   120 =back
       
   121 
       
   122 =head1 FILES
       
   123 
       
   124 The F<dnstools.conf> is used.
       
   125 
       
   126 =cut