DNS Monitoring Database API

package DNS;

require "SQL.pl";

$ENV{'SYBASE'} = "/usr/local/sybase";

my $data_source = "dbi:Sybase:server=DNS;database=DNS";
my $database_username = "dns";
my $database_password = "dnspass";

# Initialize DBI
#
sub BEGIN
{
 use DBI;
}

# Log in to database
#
sub Login
{
 &login($data_source,$database_username,$database_password);
}

# Log out of database
#
sub Logout
{
 &logout;
}

# Add a hostname
#
sub AddHost
{
 my($package,$hostname) = @_;

 # Insert the information into the Hosts table.
 my $sql = "insert Hosts (Name) values ('$hostname')";
 my $HNID = &sql_identity($sql);

 # Return the new ID.
 return $HNID;
}
 
# Add an IP address
#
sub AddIP
{
 my($package,$IP) = @_;

 $IP = $package->ip_to_int($IP);

 # Insert the information into the Hosts table.
 my $sql = "insert IPs (IP) values ('$IP')";
 my $IPID = &sql_identity($sql);

 # Return the new ID.
 return $IPID;
}
 
# Map a hostname and IP address together
#
sub Map
{
 my($package,$host,$IP) = @_;

 my $HNID = $package->GetHNID($host);
 my $IPID = $package->GetIPID($package->ip_to_int($IP));

 my $MAP = $package->GetMap($HNID,$IPID);
 if($MAP)
 {
  # This one's already here - just update the LastSeen date.
  my $sql = "update Mappings set LastSeen = getdate() where ID = $MAP";
  return &sql_update($sql);
 }
 else
 {
  # New entry - insert data.
  my $sql = "
	insert Mappings (HNID,IPID,LastSeen)
	values($HNID,$IPID,getdate())";
  return &sql_identity($sql);
 }
}

# Get a mapping
#
sub GetMap
{
 my($package,$HNID,$IPID) = @_;

 my $sql = "select ID from Mappings where HNID = $HNID and IPID = $IPID";
 return &sql_select($sql);
}

# Get hostname from HNID
#
sub GetHostName
{
 my ($package,$HNID) = @_;

 my $sql = "select Name from Hosts where ID = $HNID";
 return &sql_select($sql);
}

# Get HNID from hostname
#
sub GetHNID
{
 my($package,$host) = @_;

 my $sql = "select ID from Hosts where Name = '$host'";
 return &sql_select($sql);
}

# Get IP from IPID
#
sub GetIP
{
 my($package,$IPID) = @_;

 my $sql = "select IP from IPs where ID = $IPID";
 my $IP = &sql_select($sql);
 return $package->int_to_ip($IP);
}

# Get IPID from IP
#
sub GetIPID
{
 my($package,$IP) = @_;

 $IP = $package->ip_to_int($IP);
 my $sql = "select ID from IPs where IP = $IP";
 return &sql_select($sql);
}

# Get all IPs for a given hostname
#
sub GetIPsForHost
{
 my($package,$host) = @_;

 my $HNID = $package->GetHNID($host);

 my $sql = "select IPID from Mappings where HNID = $HNID";
 my @IPIDs = &sql_select($sql);

 my @IPs = ();
 foreach my $IPID (@IPIDs)
 {
  push(@IPs,$package->GetIP($IPID));
 }
 return @IPs;
}

# Convert an IP address from an int to a dotted quad
# Assumes network byte order.
#
sub int_to_ip
{
 my($package,$IP) = @_;

 return join(".", unpack("C4", pack ("N", $IP)));
}

# Convert an IP address from a dotted quad to an int
# Assumes network byte order.
#
sub ip_to_int
{
 my($package,$IP) = @_;

 return unpack("N", pack("C4", split/\./, $IP));
}