Newsgroup: it.comp.lang.perl
Titolo: Perl e Mysql

Salve a tutti, sto lavorando su uno script che controlla lo stato di 
alcune porte di uno switch e se sono spente le registra in un campo di 
una tabella.
Ora vorrei mettere il numero dei giorni in cui quella data porta è 
rimasta nello stato down, tenendo conto che lo script lo lancio ogni 
mattina.
La lista delle porte in stato down, la ottengo da un'altro script che mi 
salva le info in un file tipo:
GigabitEthernet9/33        unassigned      YES unset  down 
     down
GigabitEthernet9/34        unassigned      YES unset  down 
     down
Qualche suggerimento? Ovvimante se le porte tornano UP (magari dopo 2 
giorni), le devo eliminare dal database.
Grazie

 mattina.
Ogni mattina lanci lo script:
Per ogni porta:
1. se non e` gia` nella tabella, la inserisci con la data
   corrente
2. se e` UP ed e` nella tabella, la togli
In ogni istante puoi consultare la tabella e usare la data
per calcolare il numero di giorni da quando la porta e` 
rimasta 'down'. Il vantaggio e` che la logica dello script
si mantiene semplice, e puoi far fare a MySQL le operazioni
sulle date che servono per conoscere il numero di giorni
ecc ecc...
S.
-- 
Stefano Rodighiero      |  
http://www.stefanorodighiero.net
mailto:
lar...@perl.it
   |  Italian Perl Mongers: 
http://www.perl.it

Senti maaa... ho scritto questo codice.
Tramite i comandi snmp (standard) interrogo lo switch ed ottengo 
l'informazione.
Probabilmente devi rivedere il parsing in base allo switch (questo 
ottimizzato in base ai miei).
Il codice l'ho scritto io, puoi riciclartelo come credi.
sub process_netsw
{
        local $netsw = $_[0];
        local %ar_desc;
        local %ar_status;
        local %ar_time;
        local $line;
        local $vkey;
        open(MYDESC, "snmpwalk -t 10 -v 1 -c public $netsw 'IF-MIB::ifDescr' 
|" );
        while(<MYDESC>)
        {
                my($line) = $_;
                chomp($line);
                if($line =~ /Ethernet|RMON Port/)
                {
                        if ($line =~ /^IF-MIB::ifDescr\.([0-9]+) = STRING: 
(.*) *$/)
                        {
                                $ar_desc{$1} = $2;
                        }
                }
        }
        close(MYDESC);
        open(MYSTATUS, "snmpwalk -t 10 -v 1 -c public $netsw 
'IF-MIB::ifOperStatus' |" );
        while(<MYSTATUS>)
        {
                my($line) = $_;
                chomp($line);
                if ($line =~ /^IF-MIB::ifOperStatus\.([0-9]+) = INTEGER: 
(up|down)\([12]\) *$/ && exists($ar_desc{$1}))
                {
                        $ar_status{$1}=$2;
                }
        }
        close(MYSTATUS);
        open(MYTIME, "snmpwalk -t 10 -v 1 -c public $netsw 
'IF-MIB::ifLastChange' |" );
        while(<MYTIME>)
        {
                my($line) = $_;
                chomp($line);
                if ($line =~ /^IF-MIB::ifLastChange\.([0-9]+) = Timeticks: 
\([^)]+\)( [0-9]+ days,)* ([0-9]{1,2}:[0-9]{2}:[0-9]{2}.[0-9]{2}) *$/ && 
exists($a
r_desc{$1}) && exists($ar_status{$1}))
                {
                        $line=$2;
                        $vkey=$1;
                        if ($line =~ /^ (.*) days,$/)
                        {
                                $line="$1";
                        }
                        else
                        {
                                $line = "0";
                        }
                        $ar_time{$vkey}=$line;
                }
        }
        close(MYTIME);
        foreach $vkey ( sort keys %ar_time )
        {
                print 
"$netsw;$ar_desc{$vkey};$ar_status{$vkey};$ar_time{$vkey}\n";
        }
}