]> mj.ucw.cz Git - nsc-5.git/blob - bin/convert
Added conversion script from DNS to NSC.
[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 == 1 || do {
14         print "Usage: convert [-v] <domain>\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->defnames(0);
23 $res->dnsrch(0);
24 $res->debug(0);
25
26 $verbose && print "; Fetching zone data for $domain\n";
27 @zone = $res->axfr($domain) or failed("Zone transfer failed");
28 foreach $r (@zone) {
29         if ($verbose) {
30                 $name = $r->string;
31                 print "; $name\n";
32         }
33         $type = $r->type;
34         $n = fix($r->name);
35         if ($type eq "A") {
36                 $have{$n} = 1;
37                 $ips{$n} = (defined $ips{$n} ? $ips{$n} : "") . ", " . $r->address;
38         } elsif ($type eq "SOA") {
39                 print "SOA($domain)\n";
40         } elsif ($type eq "MX") {
41                 $have{$n} = 1;
42                 $mx{$n} = ((defined $mx{$n}) ? $mx{$n} . ", " : "") . $r->preference . " " . fix($r->exchange);
43         } elsif ($type eq "CNAME") {
44                 $cn = fix($r->cname);
45                 $have{$cn} = 1;
46                 $cn{$cn} = ((defined $cn{$cn}) ? $cn{$cn} . ", " : "") . $n;
47         } elsif ($type eq "NS") {
48                 if ($n ne "@") {
49                         $sub{$n} = 1;
50                         $subd{$n} .= "NS(" . fix($r->nsdname) . ")\n";
51                 }
52         } else {
53                 print "; FIXME: ", $r->string, "\n";
54         }
55 }
56 go("@", 0);
57 delete $have{"@"};
58 foreach $n (sort keys %have) {
59         go($n, 1);
60 }
61 foreach $n (sort keys %sub) {
62         print "\nD($n)\n";
63         print $subd{$n};
64 }
65
66 exit 0;
67
68 sub go {
69         my $n = shift @_;
70         my $flag = shift @_;
71
72         if (defined $ips{$n}) { print "H($n$ips{$n})\n"; }
73         elsif ($flag) { print "HH($n)\n"; }
74         if (defined $mx{$n}) { print "MX($mx{$n})\n"; }
75         if (defined $cn{$n}) { print "CNAME($cn{$n})\n"; }
76 }
77
78 sub norm_name {
79         my $n = shift @_;
80         $n =~ s/\.$//;
81         $n =~ tr[A-Z][a-z];
82         return $n;
83 }
84
85 sub fix {
86         my $n = shift @_;
87         if ($n eq $domain) { return "@"; }
88         elsif ($n =~ /^(.*)\.$domain$/) { return $1; }
89         else { return "$n."; }
90 }