]> mj.ucw.cz Git - nsc-5.git/blob - bin/convert
Miscellaneous fixes.
[nsc-5.git] / bin / convert
1 #!/usr/bin/perl -w
2 #
3 #       Convert -- A Tool for Conversion of Zone Files to NSC Format
4 #
5 #       (c) 1999 Martin Mares <mj@ucw.cz>
6 #
7
8 use lib "/home/mj/perl/lib/site_perl";
9
10 use Getopt::Std;
11 use Net::DNS::Resolver;
12
13 getopts('v', \%opts) && @ARGV == 2 || do {
14         print "Usage: convert [-v] <domain> <server>\n";
15         exit 1;
16 };
17 $domain = norm_name($ARGV[0]);
18
19 $verbose = $opts{"v"};
20
21 $res = new Net::DNS::Resolver;
22 $res->nameservers($ARGV[1]);
23 $res->defnames(0);
24 $res->dnsrch(0);
25 $res->debug(0);
26
27 $verbose && print "; Fetching zone data for $domain\n";
28 @zone = $res->axfr($domain) or die("Zone transfer failed");
29 foreach $r (@zone) {
30         if ($verbose) {
31                 $name = $r->string;
32                 print "; $name\n";
33         }
34         $type = $r->type;
35         $n = fix($r->name);
36         if ($type eq "A") {
37                 $have{$n} = 1;
38                 $ips{$n} = (defined $ips{$n} ? $ips{$n} : "") . ", " . $r->address;
39         } elsif ($type eq "SOA") {
40                 print "SOA($domain)\n";
41         } elsif ($type eq "MX") {
42                 $have{$n} = 1;
43                 $mx{$n} = ((defined $mx{$n}) ? $mx{$n} . ", " : "") . $r->preference . " " . fix($r->exchange);
44         } elsif ($type eq "CNAME") {
45                 $cn = fix($r->cname);
46                 $have{$cn} = 1;
47                 $cn{$cn} = ((defined $cn{$cn}) ? $cn{$cn} . ", " : "") . $n;
48         } elsif ($type eq "NS") {
49                 if ($n ne "@") {
50                         $sub{$n} = 1;
51                         $subd{$n} .= "NS(" . fix($r->nsdname) . ")\n";
52                 }
53         } else {
54                 print "; FIXME: ", $r->string, "\n";
55         }
56 }
57 go("@", 0);
58 delete $have{"@"};
59 foreach $n (sort keys %have) {
60         go($n, 1);
61 }
62 foreach $n (sort keys %sub) {
63         print "\nD($n)\n";
64         print $subd{$n};
65 }
66
67 exit 0;
68
69 sub go {
70         my $n = shift @_;
71         my $flag = shift @_;
72
73         if (defined $ips{$n}) { print "H($n$ips{$n})\n"; }
74         elsif ($flag) { print "HH($n)\n"; }
75         if (defined $mx{$n}) { print "MX($mx{$n})\n"; }
76         if (defined $cn{$n}) { print "CNAME($cn{$n})\n"; }
77 }
78
79 sub norm_name {
80         my $n = shift @_;
81         $n =~ s/\.$//;
82         $n =~ tr[A-Z][a-z];
83         return $n;
84 }
85
86 sub fix {
87         my $n = shift @_;
88         if ($n eq $domain) { return "@"; }
89         elsif ($n =~ /^(.*)\.$domain$/) { return $1; }
90         else { return "$n."; }
91 }