#!/usr/bin/perl

open (STDERR, ">&STDOUT");
select ((select(STDOUT), $| = 1)[0]); # Synchronize STDOUT
select ((select(STDERR), $| = 1)[0]); # with STDERR

($dns_lib = $0) =~ s:(^|/)[^/]*$::;
($script=$0) =~ s:^.*/([^/]*)$:$1:;	# Get the simple name of this script.

push (@INC, $dns_lib);

require 5.0;
require 'dns_lib.perl';

use Getopt::Long;
$Getopt::Long::autoabbrev=1;    # Allow keyword abbreviations (to uniqueness).
$Getopt::Long::getopt_compat=1; # Allow both "--foo=bar" and "+foo=bar" style.
#$Getopt::Long::option_start='(--|-|\+)';       # [Use the defaults]
#$Getopt::Long::order=$Getopt::Long::REQUIRE_ORDER; # Options can't intermingle
$Getopt::Long::order=$Getopt::Long::PERMUTE;    # or options may intermingle.
$Getopt::Long::ignorecase=1;    # Don't consider case in options.
$Getopt::Long::debug=0;         ### Debug ###

$opt_help = ($#ARGV < 0);

&GetOptions ('help', 'f') || die "\nTry: $script --help for more information.\n\n";

if ($opt_help) { 
 
    print <<"EndOfHelp";
Usage: $script [OPTION] host ip
 
  --help   This page.
  --f      Force the addition of the record overriding warnings.

  host     The fully qualified DNS name of the host you want to add.
  ip       The IP address of the host you want to add.
 
EndOfHelp
    
    exit;

} # End if - help

$name = $ARGV[0];

if (! $name) {

    die "\nError.  Try: $script --help for more information.\n\n";

} else {

    $name = &verify_name ($name);

}

$ip = $ARGV[1];

if (! $ip) {

    die "\nError.  Try: $script --help for more information.\n\n";

} else {

    $ip = &verify_ip ($ip);
    $ip = &reverse_ip ($ip) if m/\.in-addr\.arpa\.?$/;

}

if ((($x = &verify_zone ($name)) eq 'PRIMARY') || ($x eq 'SEC_W_GLUE')) {

    $host = '@';
    $zone = $name;

} else {

    ($host, $zone) = split ('\.', $name, 2);
    die "Error: Cannot add $host [$ip] to $zone -- no .primary file, use new_primary.\n" unless (($x = &verify_zone ($zone)) eq 'PRIMARY') || ($x eq 'SEC_W_GLUE');

}

&rcs_co ($zone, '.primary');
@file = &read_file ($zone, '.primary');
@recs = &find_record (&build_record ($host, 'A', '', ''), @file);
@crecs = &find_record (&build_record ($host, 'CNAME', '', ''), @file);

if ($#crecs >= 0) {

    $output = "\nExisting CNAME Record: $name already has the following CNAME record:\n\n";
    
    foreach $rec (@crecs) {

	$output .= "$rec";

    }

    $output .= "\nThe CNAME will have to be removed before an A record can be added.\n";

} elsif (($#recs >= 0) && (! defined ($opt_f))) {

    $output = "\nExisting A Record: $name already has the following A records:\n\n";
    
    foreach $rec (@recs) {

	$output .= "$rec";

    }

    $output .= "\nUse the --f option to add new A record for multihomed host.\n";

} else {

    $record = &build_record ($host, 'A', $ip, '');
    ($result, @file) = &add_record ($record, @file);

    if ($result eq 'ADDED') {

	&write_file ($zone, '.primary', @file);
	$output = "\nRecord Added: $host [$ip] added to $zone\n";
	$change = 1;
	
    } elsif ($result eq 'DUPLICATE') {

	$output = "\nDuplicate Record: $host [$ip] is already in $zone\n";

    } else {

	$output = "\nError: This isn't supposed to happen...\n";

    }

}

&rcs_ci ($zone, '.primary', "Script $script: added A record for $host [$ip]", $change);

print "$output\n";

exit;

