Jeff,
Here's a perl-code example that I wrote awhile back. It runs on either
NetView AIX or NT. It does what you want. If you don't want temp-files
lying around... always use the "once" cache flag.
To use it (for your example) type...
get_nv_field_info.pl yourNode "TopM Interface List" once
For generic usage:
get_nv_field_info.pl -h
It should work for just about any field.
Regards,
Gary Boyles
----------------------------------------------------------------------------
--
#!/usr/bin/perl
############################################################################
##
# Procedure: get_nv_field_info.pl
#
#
# Description:
# ===========
# Get specific field-information from the ovw database (via ovobjprint)
#
# This program uses the idea of a cache-file with ovobjprint. It runs
# ovobjprint, and then saves the info to a file (c:\temp or /tmp). It
# will then read follow-on information from the file, until you tell it
# to read new info, or until the file is 20 minutes old.
#
# Inputs:
# =======
# 1) Node-Name 2) Field-To-Get 3) cache-flag (new,use,delete,once)
#
# Modifications:
#
# Date Who Reason
# =========== ===
======================================================
############################################################################
##
$True = "1"; # Perl standard for true/false
$False = "0";
$prgName = 'get_nv_field_info';
$prgVer = 'V1.0-01';
#print "\n$prgName $prgVer \n\n";
#++++++++++
# Initialize Variables
############################################################################
##
@rtnList = (); # Used for subroutine returns
$thisNode = ""; # Current Node
$thisField = ""; # NetView Field
#++++++++++
# Get arguments
############################################################################
##
$thisNode = $ARGV[0]; # Node Name
$thisField = $ARGV[1]; # NetView Field
$cacheFlag = $ARGV[2]; # Cache Flag
if ( "$cacheFlag" ne "use" &&
"$cacheFlag" ne "delete" &&
"$cacheFlag" ne "once" &&
"$cacheFlag" ne "new" ) { $cacheFlag = "use"; }
#++++++++++
# Print out usage message
############################################################################
##
if ( $ARGV[0] eq "-h" || $ARGV[0] eq "" || $ARGV[0] eq "help")
{
print "\n$prgName $prgVer \n\n";
print "Usage: $prgFile Node Field-Info \n\n";
print "Usage: $prgFile gxx.nobody.com isIPRouter [cacheFlag]\n";
print "Usage: $prgFile gxx.nobody.com sysLocation \n";
print "Usage: $prgFile gxx.nobody.com sysLocation new \n\n";
print "Cache Flag Options = new, use, once, delete \n";
print "Cache Flag Default = use \n\n";
exit(1);
}
#++++++++++
# Get ovobjprint information
############################################################################
##
($errStat, @rtnList) = &get_NV_field_info("$thisNode","$thisField",
$cacheFlag);
foreach $aLine (@rtnList)
{
print "$aLine\n";
}
exit(0);
############################################################################
##
# Subroutine: get_NV_field_info
#
# Input: 1) Node 2) Field-To-Get 3) Cache-Flag:
# new - get new info and don't delete after use
# once - get new info then delete after use
# use - get info from cache (if cache is present)
# delete - just delete the cache (don't do anything
else)
#
# Outputs: Status + String containing field info
#
# Description:
# Get the information from the ovw database for a field (for any object)
############################################################################
##
sub get_NV_field_info
{
my ($the_OS) = $ENV{"OS"};
my ($nv_drive) = $ENV{"NV_DRIVE"};
my ($uniqueKey) = $$;
my ($First_Line_Flag) = "$True";
my ($errStat) = "$False";
my (@rtnList) = ();
my ($cacheFile);
my ($fileName) = "";
my ($inLine) = "";
my ($xChar) = "";
my ($xLine) = "";
my ($create_time) = 0;
my ($now_time) = 0;
my (@nodeTbl) = ();
my (@pLine) = ();
my (@aLine) = ();
my ($f_ptr) = 0;
my ($c_ptr) = 0;
my ($l_ctr) = 0;
my ($fieldFlag) = "";
my ($the_Node) = "$_[0]"; # Node-name
my ($the_Field) = "$_[1]"; # OVW-field to get
my ($cacheFlag) = "$_[2]"; # Info from
cache...new/once/use/delete
if ($cacheFlag eq "" ) { $cacheFlag = "use"; }
#++++++++++
# Configure OS-dependent stuff
#########################################################
if ("$prgName" eq "") { $prgName = "Get_NV_Field_Info"; }
$fileName = "Get_NV_field_info.$the_Node";
#++++++++++
# Setup path & command-names
############################################################################
###
if ( "$the_OS" eq "Windows_NT" )
{
$ovObj_cmd = "$nv_drive"."\\usr\\OV\\bin\\ovobjprint -s";
$cacheFile = "C:"."\\temp\\"."$fileName";
}
else
{
$ovObj_cmd = "/usr/OV/bin/ovobjprint -s";
$cacheFile = "/tmp/"."$fileName";
}
#++++++++++
# What are we supposed to do:
# 1) Just delete the file-cache for that node.
# 2) Read from the cache (if it exists)
# If it doesn't exist... read info into cache-file
# IF its over 15 minutes old -- re-build it.
# 3) Just get new info and put it into the cache
#########################################################
if ( $cacheFlag eq "delete" )
{
unlink($cacheFile);
return ("$True","Cache_File_Deleted");
}
elsif ($cacheFlag eq "use" )
{
if (-e $cacheFile) # Cache-file exists
{
@rtnList = stat($cacheFile);
$create_time = $rtnList[10];
$now_time = time;
if ( ($now_time - $create_time) > 1200 ) # But if its old -- reload
it
{
unlink($cacheFile);
$errStat = `$ovObj_cmd $the_Node > $cacheFile`;
}
}
else # Cache-file doesn't exist
{
$errStat = `$ovObj_cmd $the_Node > $cacheFile`; # So create it
}
}
else # Here we're requesting new
one
{
$errStat = `$ovObj_cmd $the_Node > $cacheFile`;
}
#++++++++++
# Extract the specific field-info from the cache-file
#########################################################
open (IN_LIST, "$cacheFile"); # Open temp-file
$fieldFlag = "$False";
$l_ctr = 0;
while (<IN_LIST>) # Process entire file... looking for
field-info
{
$l_ctr++; # Keep track of number of lines
chop;
~s/^\s*//; # Remove leading spaces (needed for perl4)
$inLine = "$_";
@pLine = split(/\s+/,"$inLine");
if ( $fieldFlag eq "$True" ) # Get by FIELD... then search for field-info
{
$aLine[0] = "$_"; # Get the line of text
$f_ptr = index ("$aLine[0]", "$the_Field");
if ( $f_ptr != -1 ) # Exit loop if this is THE line.
{
$c_ptr = 1;
while (<IN_LIST>)
{
chop;
~s/^\s*//; # Remove leading spaces
if (substr("$_",0,1) eq "\"") # Check for double-quote
{
push (@aLine, "$_"); # so push it onto our list.
}
else
{
last;
}
}
last;
} # Field-flag if
} # Field-flag if
else # Loop until FIELD keyword is hit
{
if ( "$pLine[0]" eq "FIELD" ) { $fieldFlag = "$True"; }
}
}
close (IN_LIST); # Close temp-file
#++++++++++
# If object-info is incomplete -- exit with error
#########################################################
if ($l_ctr < 4)
{
unlink($cacheFile);
return("$False","$False");
}
#++++++++++
# Delete cache after use (if asked to)
#########################################################
if ( $cacheFlag eq "once" ) { unlink ($cacheFile); }
#++++++++++
# Process the field-info
#########################################################
@rtnList = (); # Init return-array again
if ( $f_ptr != -1 ) # If its a valid-field... get the info
{
$f_ptr = $f_ptr + length ( "$the_Field") + 1; # Get past field-tag
$aLine[0] = substr ( "$aLine[0]", $f_ptr ); # Get info (with leading
spaces)
foreach $xField (@aLine)
{
$_ = $xField;
tr/\"/ /; # Convert double-quotes to white-space char
~s/^\t*//; # Remove leading tabs
~s/^\s*//; # Remove leading spaces
s/\s*$//; # Remove trailing spaces
@pLine = split(/\s+/,"$_"); # Parse into components (perl4 format)
push (@rtnList, "@pLine"); # Push field-info onto list
}
}
else
{
push (@rtnList, ""); # Push null-info onto list
}
return ( "$True", @rtnList ); # Return field-info
}
1;
|