Check configurazione DBSPI – WinAll

da | Ott 26, 2010

Introduzione

Questo template si occupa di monitorare la CONFIGURAZIONE dei DBSPI ORACLE su Sistemi Operativi Microsoft (tutte le versioni) e di verificare se non siano rimasti dei template in disable a causa di spostamenti di risorse e quindi variazioni delle configurazioni dei DBSPI.

Questo controllo è necessario a causa della possibilità che si verifichino disallineamenti fra la configurazione dei DBSPI e quella reale in esecuzione sul cluster. Vengono quindi confrontati i parametri memorizzati nei files di configurazione dei DBSPI e le istanze attive sui nodi del cluster. E’ prevista segnalazione anche in situazioni in cui le istanze si trovino in situazioni anomale sul cluster. Tale segnalazione rimanda alla verifica dei valori forniti dal template specifico per stato del cluster

Script di riferimento
checkoradbspiwin.pl

Configurazione delle eccezioni

La configurazione dello script è prevista al fine di passare allo stesso la modalità di esecuzione e la lista delle istanze da verificare, ed è demandata ad un file esterno allo script.
La compilazione del suddetto file è molto semplice e si compone, appunto, di due parametri separati da punto e virgola “;”:
•<modalità di esecuzione>
•<lista delle istanze da verificare>

Campo: modalità di esecuzione

Può assumere due possibili valori:
•notify – esegue solo la notifica delle problematiche (ovviamente a mezzo opcmon)
•solve – ripara le incongruenze (non ancora implementato)

Campo: lista delle istanze da verificare

In questo campo vanno inserite le istanze da verificare, separate da virgola “,”

Esempio di file di configurazione

checkoradbspi.cfg:
# File creato in automatico perche’ non trovato
# Formato:
# <livello di intervento>;<nomi istanze database>
# Entrambi i CAMPI sono OBBLIGATORI, e vanno separati con un “;”
#
# <livello di intervento> = Due valori possibili:
#                            – notify (notifica l’eventuale disallineamento della configurazione)
#                            – solve (edita il file “Defaults” correggendo la configurazione)
# <nomi istanze database> = Indicare i nomi delle istanze di database da verificare separandoli con la virgola (“,”)
#
# ESEMPI di CONFIGURAZIONI VALIDE:
# notify;mia_istanza1,miaIstanza2,istanza_N
# solve;mia_istanza1,miaIstanza2,istanza_N
notify;CMEFP,DMFP,DMJP,ODSFP,ODSJP

Messaggi generati a console

Il template genera quattro tipologie di messaggio (ovviamente da intercettare in apposito monitor template):
•NORMAL per corretta configurazione dei DBSPI
•WARNING per situazione ripristinata automaticamente

•MAJOR per per cnfigurazione CLUSTER indefinita
•CRITICAL per disallineamenti nella configurazione

Operator Initiated: Esecuzione alternativa dello script

A fronte di segnalazioni con severity Major e Critical, è possibile eseguire un operazione dal menù Operator Initiated in modo da ottenere subito il dettaglio di quanto evidenziato dallo script durante la verifica. l’output viene prodotto nelle Annotations. In sostanza l’azione opratore invoca nuovamente lo script con il parametro -logonly:
perl_launcher.bat chekoradbspiwin.pl chekoradbspiwin -logonly

In tal modo lo script non invia “opcmon” ma procude output a schermo con il dettaglio della segnalazione.

Listato dello script in perl

# Script ver. 1.3 by Camassetta 18/05/2010 ore 13:45
# Effettua il check della configurazione dei DBSPI Oracle e SQL e delle policies DBSPI

# Le funzioni con prefisso bopc_ fanno parte di una libreria che esporta funzioni e variabili valorizzate
#—————————————————————————————————————————-
use Time::Local;
use POSIX qw(strftime);
use strict;

bopc_logopen(“checkconfdbspiwin.log”);
bopc_log(“\n:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n”);
bopc_log(“Invocazione: $0 @ARGV\n”); #    Per i logs

my $filename=”checkconfdbspiwin.cfg”;
my $fileconfig=”$bopc_lib::BOPC_CONFDIR/$filename”;

crea_fileconfig($fileconfig) unless (-e $fileconfig );

my $MonitorName=$ARGV[0];  #Nome Monitor Template
my $TypeOut=$ARGV[1]; # Se viene passato il parametro -logonly non esegue l’opcmon ma procude output a schermo

my $progname=$0;
bopc_usage(“Richiesto parametro TemplateName”) unless ($ARGV[0]);

my $dbspi_file=”c:/usr/OV/dbspi/defaults”;
if ( !(-e $dbspi_file) ) {
bopc_mywarn (“File di configurazione $dbspi_file non trovato. Impossibile procedere alla verifica della configurazione”);
bopc_exit($MonitorName,0,”MonitorExecution”,”Monitor RMA_checkconfdbspiwin eseguito correttamente”);
}

my $report_type=0;   # Serve a gestire il tipo di report (0 = tutto ok)
my $errors=0;   # Contatore degli errori

my $action;
my %DBSPI_Conf;
read_config ();
read_dbspifile ();

my $MyName;
get_ClusterNodes ();

get_cluster_status ();

config_compare ();

if ( ($errors > 0) and ($action=~/^solve$/) ) {      # Se ci sono errori ed e’ prevista la correzione automatica…
# solve_errors ();
1;
}

if ($report_type == 0 ) {
report0 ();
}
elsif ($report_type == 1 ) {
report1 ();
}
elsif ($report_type == 2 ) {
report2 ();
}
elsif ($report_type == 3 ) {
report3 ();
}

bopc_exit ($MonitorName,0,”MonitorExecution”,”Monitor $MonitorName eseguito correttamente”);

sub read_config {
open (CONF, “<$fileconfig”) or bopc_myerr (“Errore aprendo file di configurazione <$filename> :$!\n”,$filename);
while ( my $tmp=<CONF> ) {
chomp($tmp);
my $raw=bopc_trim($tmp);
$raw=~ s/^([^#]*)(.*)$/$1/ ; #skippo commenti
next if ($raw =~ /^\s*$/);   #skippo righe vuote
my @param=split/;/,$raw;
$action=bopc_trim($param[0]);
$tmp=bopc_trim($param[1]);
my @links=split/,/,$tmp;
my ($ClusterRes , $DBname);
foreach my $tmp (@links) {
my $link=bopc_trim($tmp);
if ($link=~/=/) {
@param=split/=/,$link;
$ClusterRes=bopc_trim($param[0]);
$DBname=bopc_trim($param[1]);
}
else {
$ClusterRes=$link;
$DBname=$link;
}
$DBSPI_Conf{$DBname}{Current}=”Unknown”;   # Inizializzo la Hash che conterrà la configurazione attualmente vista dai DBSPI
$DBSPI_Conf{$DBname}{Running}=”Unknown”;   # Inizializzo la Hash che conterrà la configurazione attualmente in running
$DBSPI_Conf{$DBname}{link}=$ClusterRes;
}
}
close (CONF);
# Verifico che il file di configurazione abbia la riga di conf
if (! $action) {
my $msg = “Il file di configurazione $filename e’ vuoto”;
bopc_opcmsg ( {severity => “Critical” , application => “$MonitorName” , object => “$filename” , msg_grp => “Admin” , msg_text => “$msg”} );
bopc_exit ($MonitorName,0,”MonitorExecution”,”Monitor RMA_checkconfdbspiwin eseguito correttamente”);
}
}

#=====================================================================================
# Legge i nomi dei nodi del cluster e quella macchina su cui sta girando questo script
#=====================================================================================
sub get_ClusterNodes {
# Leggo il nome del nodo su cui sto girando
my @ClusterNodes;
my $output1=hostname;
chomp ($output1);
$MyName=bopc_trim($output1);
if (!$MyName) {
bopc_mywarn (“Errore nel reperire nome host. Impossibile procedere alla verifica della configurazione”);
bopc_exit($MonitorName,0,””);
}

# Leggo i nomi dei nodi del cluster
my @output2=cluster node /stat;
my $flag=0;
while ($flag==0) {                    #scarto tutte le righe fino a ————-   compresa
my $tmp=shift(@output2);
#bopc_log(“Riga in elaborazione: $temp\n”);
chomp($tmp);
my $raw=bopc_trim($tmp);
if ($raw=~/^-.*$/) {
$flag=1;
}
else {
next;
}
}
foreach my $tmp (@output2) {
chomp($tmp);
my $raw=bopc_trim($tmp);
if ($raw=~/^(\S+)\s+(.*)$/) {
my $node=$1;
push @ClusterNodes, $node;
if ($MyName=~/^$node$/i) {   # Corrego un eventuale errore sul case (U o L) del nome nodo
$MyName=$node;
# bopc_log (“Il nome del server SQL e’: $MyName”);
}
}
else {
next;
}
}
}

#======================================================================
# Leggo il file Default contenente la configurazione corrente dei DBSPI
#======================================================================
sub read_dbspifile {
open (CONF, “<$dbspi_file”) or bopc_myerr (“Errore aprendo file di configurazione <$dbspi_file> :$!\n”,$filename);

while ( my $tmp=<CONF> ) {
chomp ($tmp);
my $raw = bopc_trim ($tmp);
$raw =~ s/^([^#]*)(.*)$/$1/ ; #skippo commenti
next if ($raw =~ /^\s*$/);   #skippo righe vuote
my @param=split/\s+/,$raw;
my $name=bopc_trim($param[0]);
my $status=bopc_trim($param[1]);
# bopc_log(“Defaults::: nome: $name – status: $status”);
my $matched=0;
foreach my $key (keys %DBSPI_Conf) {
my $nameTAG=$name;
my $keyTAG=$key;
$nameTAG=~s/\\/TAGslash/g;
$keyTAG=~s/\\/TAGslash/g;
if ($nameTAG=~/^$keyTAG$/) {
# bopc_log (“Ho matchato::: DEFname: $name – KEYhash: $key”);
$matched=1;
if ($status) {
$DBSPI_Conf{$name}{Current}=$status;
# bopc_log (“In DBSPI file DB $name e’ settato su $DBSPI_Conf{$name}{Current}”);
}
}
}
if ($matched==0) {
my $msg = “Riscontrata incongruenza tra il file di configurazione $filename “;
$msg .=   “ed il file \”defaults\” della configurazione dei DBSPI”;
bopc_opcmsg ( {severity => “Critical” , application => “$MonitorName” , object => “$filename” , msg_grp => “Admin” , msg_text => “$msg”} );
bopc_exit ($MonitorName,0,”MonitorExecution”,”Monitor $MonitorName eseguito correttamente”);
}
}
close (CONF);
}

#==========================================================
# Legge lo stato delle risorse associate ai DB sul cluster
# e lo inserisce nella Hash della configurazione in running
#==========================================================
sub get_cluster_status {
my @cluoutput=cluster res;
my $flag=0;
while ($flag==0) {                    #scarto tutte le righe fino a ————-   compresa
my $tmp=shift(@cluoutput);
#bopc_log(“Riga in elaborazione: $temp\n”);
chomp($tmp);
my $raw=bopc_trim($tmp);
if ($raw=~/^-.*$/) {
$flag=1;
}
else {
next;
}
}
foreach my $tmp (@cluoutput) {
chomp ($tmp);
my $raw=bopc_trim ($tmp);
foreach my $key (keys %DBSPI_Conf) {
# bopc_log (“Key DBSPI_Conf: $key – ClusterRes: $DBSPI_Conf{$key}{link}”);
# if ($raw=~/^$key(.*)\s+(\S+)\s+(\S+)$/i) {
$raw=~s/\(/TAGparAPERTA/g;
$raw=~s/\)/TAGparCHIUSA/g;
$DBSPI_Conf{$key}{link}=~s/\(/TAGparAPERTA/g;
$DBSPI_Conf{$key}{link}=~s/\)/TAGparCHIUSA/g;
if ($raw=~/^$DBSPI_Conf{$key}{link}(.*)\s+(\S+)\s+(\S+)$/i) {
my $node=$2;
my $status=$3;
if ( ($node=~/^($MyName)$/) and ($status=~/^(online)$/i) ) {
$status=”ON”;
}
elsif ($status=~/^(online)$/i) {
$status=”OFF”;
}
else {
$status=”Unknown”;
}
$DBSPI_Conf{$key}{Running}=$status;
}
}
}
}

#==============================
# Compara le due configurazioni
#==============================
sub config_compare {
my $SkipCheckTemplates = “FALSE”;
foreach my $key (keys %DBSPI_Conf) {
if ($DBSPI_Conf{$key}{Running} =~ /^(Unknown)$/) {
$report_type=1;
$SkipCheckTemplates = “TRUE”;
last;               # Mi fermo al primo che incontro: l’elenco completo verrà prodotto nel report
}
elsif ($DBSPI_Conf{$key}{Running} !~ /^$DBSPI_Conf{$key}{Current}$/) {
$errors++;
$report_type=2;
if ($action=~/^solve$/i) {
SolveError ();
$report_type=3;
last;
}
}
}
if ($SkipCheckTemplates =~ /^FALSE$/) {
CheckTemplates ();
}
}

sub SolveError {
my $filedefaults=”C:/usr/OV/dbspi/defaults”;
bopc_log (“Riconfiguro il file $filedefaults”);
open (DEFAULTS,”>$filedefaults”) or bopc_myerr (“Errore aprendo file di configurazione <$filedefaults> :$!\n”,$filedefaults);
foreach my $istance (keys %DBSPI_Conf) {
my $string=”$istance $DBSPI_Conf{$istance}{Running}”;
print DEFAULTS “$string\n”;
}
close (DEFAULTS);
}

#==================================================
# Verifica se ci sono policy dei dbspi disabilitate
#==================================================
sub CheckTemplates {
foreach my $key (keys %DBSPI_Conf) {               # Per ogni istanza
if ($DBSPI_Conf{$key}{Running} =~ /^ON$/) {        # non appena ne incontro una in stato ON
sleep (15); # aspetto 15 secondi
# verifico se le policy dei dbspi sono enabled
my $cmd = “ovpolicy -l”;
my @output = $cmd 2>&1;
if ($? == 0) {
foreach my $rawline (@output) {
chomp ($rawline);
my $line = bopc_trim($rawline);
if ($line =~ /^monitor\s+(\S+)\s+(\S+)\s+(\d+)$/) {
my $policyName=$1;
my $policyStatus=$2;
$policyName =~ s/\”//g;

if (  ($policyName =~ /^RMA_.+DBSPI.+$/)  and  ($policyStatus =~ /^enabled$/)  )     {
bopc_opcmon($MonitorName,0,$policyName, {msg => “Policy $policyName $policyStatus” , status => “$policyStatus” } );
}
elsif (  ($policyName =~ /^RMA_.+DBSPI.+$/)  and  ($policyStatus !~ /^enabled$/)  )     {
bopc_opcmon($MonitorName,4,$policyName, {msg => “Policy $policyName $policyStatus” , status => “$policyStatus” } );
}
}
}
last; # finisco qui
}
else {
bopc_mywarn (“Template Monitor: $MonitorName => Impossibile verificare stato policies”);
}
}
}
}

sub report0 {
my $obj=”DBSPI Conf Check”;
bopc_opcmon ($MonitorName,0,$obj, { msg => “La configurazione degli Oracle DBSPI e’ corretta” } );
# bopc_log (“La configurazione degli Oracle DBSPI e’ corretta”);
return;
}

sub report1 {
my $obj=”Claster Status”;
my $msg = “Possibili problemi sul cluster; cfr. valori RMA_checkcluster monitor template”;
my $OutMsg = $msg . “\n\nReport sullo stato delle istanze:”;
foreach my $key (keys %DBSPI_Conf) {
$OutMsg .= “\n        Istanza: $key — Stato: $DBSPI_Conf{$key}{Running}”;
}

if ($TypeOut=~/^(-logonly)$/i) {
print “$OutMsg”;
}
else {
# Invio opcmon
bopc_opcmon ($MonitorName,1,$obj, { msg => “$msg” } );
}
return;
}

sub report2 {
my $obj=”DBSPI Conf Check”;
my $msg = “Riscontrati disallineamenti tra la configurazione corrente dei DBSPI e quella in esecuzione sul CLUSTER”;
my $OutMsg = $msg . sprintf (“\n\n            %-24s | %-24s | %-24s”, “Nome Istanza DB” , “Configurazione CORRENTE” , “Configurazione CLUSTER”);
$OutMsg .= “\n            ———————— | ———————— | ————————“;
foreach my $key (keys %DBSPI_Conf) {
$OutMsg .= sprintf(“\n            %-24s | %-24s | %-21s”, $key, $DBSPI_Conf{$key}{Current}, $DBSPI_Conf{$key}{Running});
if ($DBSPI_Conf{$key}{Running} !~ /^$DBSPI_Conf{$key}{Current}$/) {
$OutMsg .= “<==”;
}
}

if ($TypeOut=~/^(-logonly)$/i) {
print “$OutMsg”;
}
else {
# Invio opcmon
bopc_opcmon ($MonitorName,2,$obj, { msg => “$msg” } );
}
return;
}

sub report3 {
my $obj=”DBSPI Conf Check”;
bopc_opcmon ($MonitorName,3,$obj, { msg => “La configurazione degli Oracle DBSPI e’ stata ripristinata a seguito di un disallineamento” } );
return;
}

#===========================
#Crea file di configurazione
#===========================
sub crea_fileconfig {
my $file=shift;
open (OUT,”>$file”) or bopc_myerr(“Errore aprendo file di configurazione <$file> :$!\n”,$filename);

bopc_mywarn(“File di configurazione non trovato lo creo io: $file”,$filename);

print OUT “# File creato in automatico perche’ non trovato \n”;
print OUT “# Formato:\n”;
print OUT “# <livello di intervento>;<associazioni nome risorsa cluster – nome DB>\n”;
print OUT “# Entrambi i CAMPI sono OBBLIGATORI, e vanno separati con un \”;\”\n#\n”;
print OUT “# <livello di intervento> = Due valori possibili:\n”;
print OUT “#                            – notify (notifica l’eventuale disallineamento della configurazione)\n”;
print OUT “#                            – solve (edita il file \”Defaults\” correggendo la configurazione)\n”;
print OUT “# <associazioni nome risorsa cluster – nome DB> = Indicare nome della risorsa cluster = nome DB (come indicato nel file \”defaults\”\n”;
print OUT “#                                                 Piu’ associazioni vanno separate da una virgola\n”;
print OUT “#                                                 Se l’associazione comprende solo una voce, viene inteso lo stesso nome per entrambi i membri\n#\n”;
print OUT “# ESEMPI di CONFIGURAZIONI VALIDE:\n”;
print OUT “# notify;risorsa_cluster_1=mia_istanza1,risorsa_cluster_2=miaIstanza2,istanza_N\n”;
print OUT “# solve;risorsa_cluster_1=mia_istanza1,risorsa_cluster_2=miaIstanza2,risorsa_cluster_3=istanza_N\n”;

bopc_log(“Creazione file di configurazione terminata\n”);

close OUT;
}

Scritto da Raffaele Chiatto

Sono Raffaele Chiatto, un appassionato di informatica a 360 gradi.
Tutto è iniziato nel 1996, quando ho scoperto il mondo dell'informatica grazie a Windows 95, e da quel momento non ho più smesso di esplorare e imparare.
Ogni giorno mi dedico con curiosità e passione a scoprire le nuove frontiere di questo settore in continua evoluzione.

Articoli Recenti

Veeam Backup

Monitoring

Friends

  • My English Lab  English School
  • ChrSystem   Infrastrutture IT
  • ACT For Cange  Mental Coach
  • Since 01  Kreative Graphics

Database

Networking

Autori

  • Raffaele Chiatto  Amministratore
  • Marco Valle  Autore Collaboratore

Related Post

0 commenti

Invia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Virtualizzazione

Linux

Microsoft

Apple

Backup

Database

Security

Automazione