# $Header: emdl_discovery.pl 05-may-2003.12:34:08 vsekuboy Exp $
#
# emdl_discovery.pl
#
# Copyright (c) 2002, 2003, Oracle Corporation. All rights reserved.
#
# NAME
# emdl_discovery.pl - Standby discovery script for emdlite targets
#
# DESCRIPTION
# Discovers and configures Host and DB targets. This script is a
# standby discovery script to configure targets.xml for emdlite
#
# NOTES
#
# MODIFIED (MM/DD/YY)
# vsekuboy 05/05/03 - Replaced uname with ^O
# vsekuboy 04/29/03 - oratab location for platforms is /etc/oratab
# xxu 06/25/02 - remove /usr/local/bin/perl
# dmshah 01/27/02 - Merged dmshah_fix_emdlctl
# dmshah 01/27/02 - Creation
#
nmep_generateTargetsXML();
sub nmep_generateTargetsXML
{
nmep_getEnvironment (); # obtain env. values like HOSTNAME and EMDROOT
nmep_openTargetFile(); # open file descriptor to $EMDROOT/sysman/emd/targets.xml
nmep_printStartTag (); # Print the start tag
nmep_getHostEntry(); # Print the host target
nmep_getDatabaseEntries(); # Get and Print the db Targets
nmep_printEndTag(); # Close the end tag
nmep_closeTargetFile(); # Close the file
}
sub nmep_getEnvironment
{
use Env qw(HOSTNAME EMDROOT);
}
sub nmep_openTargetFile
{
my $target_file="$EMDROOT/sysman/emd/targets.xml";
unless( open TARGET,"> $target_file")
{
die "Cannot create $target_file. $!";
}
}
sub nmep_closeTargetFile
{
close TARGET;
}
sub nmep_selectTargetFile
{
select TARGET;
}
sub nmep_selectStdout
{
select STDOUT;
}
sub nmep_printStartTag
{
nmep_selectTargetFile();
print"\n";
}
sub nmep_printEndTag
{
print"\n";
}
sub nmep_getHostEntry
{
print" \n";
print" \n";
}
sub nmep_getDatabaseEntries
{
my (@db_entries, @valid_db, @credentials, $sid, $oracleHome,$remain, $total_db, $vdb);
@db_entries = nmep_getOratabEntries();
# Get the length of the db list. Note that the subscript starts from 0 and
# hence needs to be accounted in the "for" clause.
$total_db = @db_entries - 1;
# Weed out any db entries with unviable SID (like * etc ...)
for $i( 0..$total_db)
{
($sid, $oracleHome , $remain) = split(/:/ , $db_entries[$i] , 3);
$sid =~ s/\s*$//;
if($sid ne "*")
{
#print" Pushing data : $db_entries[$i] \n";
push @valid_db,$db_entries[$i];
}
}
$total_db = @valid_db + 0;
if( $total_db > 0 )
{
nmep_selectStdout();
print" \n Discovered $total_db databases. In order to monitor them \n" ;
print" please enter database credentials at the prompt for each \n\n";
nmep_selectTargetFile();
}
foreach $entry (@valid_db)
{
($sid, $oracleHome , $remain) = split(/:/ , $entry , 3);
#sid is already stripped of leading white space.
#remove leading and trailing white space.
$sid =~ s/\s*$//;
$oracleHome =~ s/^\s*//;
$oracleHome =~ s/\s*$//;
if ( (length($sid) > 0 ) && (length($oracleHome) > 0 ) )
{
@credentials = nmep_getDBCredentials( $sid, $oracleHome );
if((length($credentials[0]) > 0) && (length($credentials[1]) > 0) && (length($credentials[1]) > 0))
{
#nmep_printXml($sid,$oracleHome);
print " \n";
print " \n";
print " \n";
print " \n";
print " \n";
print " \n";
print " \n";
print " \n";
}
}
}
}
# Function getDBCredentials
# For a given SID and OracleHome, prompts the User to enter the
# username and password and port on which the db listens and returns
# an array of credentials and port.
sub nmep_getDBCredentials
{
my( @credentials, $username, $password, $port );
nmep_selectStdout();
print" Press to skip monitoring \n";
print" Please enter credentials and port to monitor $_[0] at $_[1] \n";
print" Username : ";
chomp($username = );
print" Password : ";
chomp($password = );
print" Port : ";
chomp($port = );
print"\n";
nmep_selectTargetFile();
push @credentials,$username;
push @credentials,$password;
push @credentials,$port;
return @credentials;
}
#Get the oratab file entries
# A typical oratab entry is of the form
# orcl:/private1/oracle/804orcl:N
#
# Returns list of the form
# { Sid1:Oracle_home1 Sid2:Oracle_home2 ... SidN:Oracle_homeN }
sub nmep_getOratabEntries
{
my (@entries,$oratabFile,$Oratab,$oraLine);
$oratabFile = nmep_getOratabFile();
if ( $oratabFile ne "" ) {
if ( open(Oratab, $oratabFile) ) {
while ($oraLine=) {
chomp($oraLine);
#strip all leading white space characters.
$oraLine =~ s/^\s*//;
if( ($oraLine =~ /^\#/ ) || ( length($oraLine) <= 0 ) ) {
#print "discarding \"$oraLine\" ,since it is a comment \n"
next;
}
#print STDERR "$oraLine\n";
#TODO , check if it is a new sid
push @entries,$oraLine;
}
close(Oratab);
}
}
return @entries;
}
sub nmep_getOratabFile {
my $uname=$^O;
if ( $uname eq "solaris" ) {
return "/var/opt/oracle/oratab";
}
else {
return "/etc/oratab";
}
}