#!/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 hardware os
 
  --help   This page.
  --f      Force the addition of the record overriding warnings.

  host     The fully qualified DNS name or IP address you want to add
           the HINFO record for.
  hardware The hardware in question.  Make sure to quote as needed.
  os       The OS the machine is running.  Make sure to quote as needed.

NOTE: HINFO records can be a security hole.  They can give hackers info they
      need to break into a system.  Use HINFO records sparingly.
 
EndOfHelp
    
    exit;

} # End if - help

$name = $ARGV[0];

if (! $name) {

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

} else {

    $name = &zone_or_subnet ($name);

}

$hw = $ARGV[1];

if (! $hw) {

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

}

$os = $ARGV[2];

if (! $os) {

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

}

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 HINFO for $host 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, 'HINFO', '', ''), @file);

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

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

	$output .= "$rec";

    }

    $output .= "\nUse the --f option to add new HINFO record.\n";

} else {

    $record = &build_record ($host, 'HINFO', '"'.$hw.'"', '"'.$os.'"');
    ($result, @file) = &add_record ($record, @file);

    if ($result eq 'ADDED') {

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

	$output = "\nDuplicate Record: $host already has an identical HINFO RR in $zone\n";

    } else {

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

    }

}

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

print "$output\n";

exit;

