From: Martin Mares Date: Tue, 4 May 1999 08:07:43 +0000 (+0000) Subject: Added conversion script from DNS to NSC. X-Git-Tag: v5.1~76 X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=632fb91154467dccf9dfb48b2beb31e97ef48aa0;p=nsc-5.git Added conversion script from DNS to NSC. --- diff --git a/bin/convert b/bin/convert new file mode 100755 index 0000000..fb9d853 --- /dev/null +++ b/bin/convert @@ -0,0 +1,90 @@ +#!/usr/bin/perl -w +# +# Convert -- A Tool for Conversion of Zone Files to NSC Format +# +# (c) 1999 Martin Mares +# + +use lib "/home/mj/perl/lib/site_perl"; + +use Getopt::Std; +use Net::DNS::Resolver; + +getopts('v', \%opts) && @ARGV == 1 || do { + print "Usage: convert [-v] \n"; + exit 1; +}; +$domain = norm_name($ARGV[0]); + +$verbose = $opts{"v"}; + +$res = new Net::DNS::Resolver; +$res->defnames(0); +$res->dnsrch(0); +$res->debug(0); + +$verbose && print "; Fetching zone data for $domain\n"; +@zone = $res->axfr($domain) or failed("Zone transfer failed"); +foreach $r (@zone) { + if ($verbose) { + $name = $r->string; + print "; $name\n"; + } + $type = $r->type; + $n = fix($r->name); + if ($type eq "A") { + $have{$n} = 1; + $ips{$n} = (defined $ips{$n} ? $ips{$n} : "") . ", " . $r->address; + } elsif ($type eq "SOA") { + print "SOA($domain)\n"; + } elsif ($type eq "MX") { + $have{$n} = 1; + $mx{$n} = ((defined $mx{$n}) ? $mx{$n} . ", " : "") . $r->preference . " " . fix($r->exchange); + } elsif ($type eq "CNAME") { + $cn = fix($r->cname); + $have{$cn} = 1; + $cn{$cn} = ((defined $cn{$cn}) ? $cn{$cn} . ", " : "") . $n; + } elsif ($type eq "NS") { + if ($n ne "@") { + $sub{$n} = 1; + $subd{$n} .= "NS(" . fix($r->nsdname) . ")\n"; + } + } else { + print "; FIXME: ", $r->string, "\n"; + } +} +go("@", 0); +delete $have{"@"}; +foreach $n (sort keys %have) { + go($n, 1); +} +foreach $n (sort keys %sub) { + print "\nD($n)\n"; + print $subd{$n}; +} + +exit 0; + +sub go { + my $n = shift @_; + my $flag = shift @_; + + if (defined $ips{$n}) { print "H($n$ips{$n})\n"; } + elsif ($flag) { print "HH($n)\n"; } + if (defined $mx{$n}) { print "MX($mx{$n})\n"; } + if (defined $cn{$n}) { print "CNAME($cn{$n})\n"; } +} + +sub norm_name { + my $n = shift @_; + $n =~ s/\.$//; + $n =~ tr[A-Z][a-z]; + return $n; +} + +sub fix { + my $n = shift @_; + if ($n eq $domain) { return "@"; } + elsif ($n =~ /^(.*)\.$domain$/) { return $1; } + else { return "$n."; } +}