#!/usr/bin/perl # $Id: dnsImport,v 1.5 2002/10/23 19:57:03 jeffb Exp $ # Copyright 2002 Sun Microsystems Inc. All rights reserved. # I have only tested this with RaQ4 DNS records file # # for best viewing in vi use the following # set tabstop=4 # set shiftwidth=4 use strict; use lib "/usr/cmu/perl"; use Global; require cmuCCE; my $build = Global::getBuild(); if($build ne "RaQ550") { print "This can only be run on a RaQ550\n"; exit 1; } my $records_file; if(@ARGV) { $records_file = $ARGV[0]; if(! -f $records_file) { print "Cannot find records file: $records_file\n"; print "usage: $0: [records file]\n"; exit 1; } } else { print "usage: $0: [records file]\n"; exit 1; } use vars qw($cce); my $cce = new cmuCCE; $cce->connectuds(); my @records = read_records($records_file); foreach my $rec (@records) { chomp $rec; my @line = split(/ /, $rec); if($line[0] eq 'a') { add_A(@line); } elsif($line[0] eq 'mx') { add_MX(@line); } elsif($line[0] eq 'cname') { add_CNAME(@line); } elsif($line[0] eq 'ptr') { add_PTR(@line); } elsif($line[0] eq 'soa') { mod_SOA(@line); } elsif($line[0] eq 'axs') { add_AXS(@line); } elsif($line[0] eq 'forwarder0') { add_FORWARD(@line); } elsif($line[0] eq 'forwarder1') { add_FORWARD(@line); } elsif($line[0] eq 'secondary') { add_SECONDARY(@line); } else { print "Can't import record type: ", $line[0], "\t"; print "Skipping....\n"; } } commit_changes(); $cce->bye("bye-bye miss american pie"); exit 0; sub add_A { my @record = @_; my $hash = {}; $hash->{type} = 'A'; if($record[1] eq '-') { $hash->{hostname} = ''; } else { $hash->{hostname} = $record[1]; } $hash->{domainname} = $record[2]; $hash->{ipaddr} = $record[3]; my ($ok, $bad, @info) = $cce->create('DnsRecord', $hash); if($ok == 0) { $cce->printReturn($ok, $bad, @info); } else { print "A record ", $hash->{hostname}, " ", $hash->{domainname}, " => ", $hash->{ipaddr}, " has been created sucessfully\n"; } } sub add_MX { my @record = @_; my $hash = {}; $hash->{type} = 'MX'; if($record[1] eq '-') { $hash->{hostname} = ''; } else { $hash->{hostname} = $record[1]; } $hash->{domainname} = $record[2]; $hash->{mail_server_priority} = lc($record[3]); $hash->{mail_server_name} = $record[4]; my ($ok, $bad, @info) = $cce->create('DnsRecord', $hash); if($ok == 0) { $cce->printReturn($ok, $bad, @info); } else { print "MX record ", $hash->{hostname}, " ", $hash->{domainname}, " => ", $hash->{mail_server_name}, " with priority ", $hash->{mail_server_priority}, " has been created sucessfully\n"; } } sub add_CNAME { my @record = @_; my $hash = {}; $hash->{type} = 'CNAME'; if($record[1] eq '-') { $hash->{hostname} = ''; } else { $hash->{hostname} = $record[1]; } $hash->{domainname} = $record[2]; if($record[3] eq '-') { $hash->{alias_hostname} = ''; } else { $hash->{alias_hostname} = $record[3]; } $hash->{alias_domainname} = $record[4]; my ($ok, $bad, @info) = $cce->create('DnsRecord', $hash); if($ok == 0) { $cce->printReturn($ok, $bad, @info); } else { print "CNAME record ", $hash->{hostname}, " ", $hash->{domainname}, " => ", $hash->{alias_hostname}, " ", $hash->{alias_domainname}, " has been created sucessfully\n"; } } sub add_PTR { my @record = @_; my $hash = {}; $hash->{type} = 'PTR'; if($record[1] eq '-') { $hash->{hostname} = ''; } else { $hash->{hostname} = $record[1]; } $hash->{domainname} = $record[2]; $hash->{ipaddr} = $record[3]; $hash->{netmask} = get_netmask(); my ($ok, $bad, @info) = $cce->create('DnsRecord', $hash); if($ok == 0) { $cce->printReturn($ok, $bad, @info); } else { print "PTR record ", $hash->{ipaddr}, " => ", $hash->{hostname}, " ", $hash->{domainname}, " has been created sucessfully\n"; } } sub mod_SOA { my @record = @_; my $hash = {}; my $base = $record[2]; my $oid; if($base eq '-') { print "I don't know what do this record: ", @record, "\n"; return; } elsif ($base =~ /(\d+\.\d+\.\d+\.\d+)(\/\d+)/) { $base = $1; ($oid) = $cce->find('DnsSOA', { ipaddr => $base }); } else { ($oid) = $cce->find('DnsSOA', { domainname => $base }); } if(!$oid) { print "Cannot find DNS SOA record for $base\n"; return; } my @soa = split(/:/, $record[3]); $hash->{primary_dns} = $soa[0]; if(defined $soa[1]) { $hash->{secondary_dns} = $cce->array_to_scalar(split(/\+/,$soa[1])); } $hash->{domain_admin} = $soa[2]; $hash->{refresh} = $soa[3]; $hash->{retry} = $soa[4]; $hash->{expire} = $soa[5]; $hash->{ttl} = $soa[6]; my ($ok, $bad, @info) = $cce->set($oid, '', $hash); if($ok == 0) { $cce->printReturn($ok, $bad, @info); } else { print "SOA record ", $base, " has been modified sucessfully\n"; } } sub add_AXS { my @record = @_; my $hash = {}; $hash->{zone_xfer_ipaddr} = $cce->array_to_scalar(split(/::/, $record[3])); my ($oid) = $cce->find('System'); if(!$oid) { print "Could not find System OID, you got some serious problems\n"; return; } my ($ok, $bad, @info) = $cce->set($oid, 'DNS', $hash); if($ok == 0) { $cce->printReturn($ok, $bad, @info); } else { print "AXS record has been modified sucessfully\n"; } } sub add_FORWARD { my @record = @_; my $hash = {}; my ($oid) = $cce->find('System'); if(!$oid) { print "Could not find System OID, you got some serious problems\n"; return; } my ($ok, $obj) = $cce->get($oid, 'DNS'); if($ok == 0) { print "Cound not get DNS namespace in system object\n"; return; } if($obj->{forwarders}) { $hash->{forwarders} = $obj->{forwarders}.$record[3].'&'; } else { $hash->{forwarders} = '&'.$record[3].'&'; } my ($bad, @info); ($ok, $bad, @info) = $cce->set($oid, 'DNS', $hash); if($ok == 0) { $cce->printReturn($ok, $bad, @info); } else { print "Forwarders record has been modified sucessfully\n"; } } sub add_SECONDARY { my @record = @_; my $hash = {}; if($record[2] =~ /\d+\.\d+\.\d+\.\d+/) { $hash->{ipaddr} = $record[2]; $hash->{netmask} = get_netmask(); } else { $hash->{domain} = $record[2]; } $hash->{masters} = $record[3]; my ($ok, $bad, @info) = $cce->create('DnsSlaveZone', $hash); if($ok == 0) { $cce->printReturn($ok, $bad, @info); } else { print "Secondary record ", $hash->{domain}, $hash->{ipaddr}, " => ", $hash->{masters}, " has been created sucessfully\n"; } } sub read_records { my $records = shift; if(!open(FH, "<$records")) { print "Could open records file: $records\n"; exit 1; } my @data = ; close(FH); return @data; } sub get_netmask { my $netmask = `ifconfig eth0 | grep "inet addr" | cut -f 4 -d":" | cut -f 1 -d" "`; chomp($netmask); return $netmask; } sub commit_changes { my $time = time(); my ($oid) = $cce->find('System'); if(!$oid) { print "Could not find System OID, cannot commit changes\n"; return; } $cce->set($oid, 'DNS', { commit => $time }); $cce->commit(); }