Newsgroup: it.comp.os.linux.sys
Titolo: Catturare eventi del kernel

Ho la seguente necessita'
Ho su un server, una scheda raid lsi logic sas 1064e, che con il suo
bel driver funziona benissimo, tanto che non ho nessuna intenzione di
usare il raid software.
Ho solo un problemino. Il software di monitoraggio a corredo, utilizza
sistemi di popup su interfaccia grafica.
Essendo il server messo in uno stanzino, senza monitor, questo sistema
non mi sta bene. Vorrei invece far partire una email quando il raid
risulta degraded.
Quando smonto un disco in syslog vedo chiaramente che il kernel si
accorge di cio' che avviene:
Jun  5 13:56:51 linuxsrvr kernel: mptbase: ioc0: RAID STATUS CHANGE
for VolumeID 1
Jun  5 13:56:51 linuxsrvr kernel: mptbase: ioc0:   volume is now
degraded, enabled, resync in progress
etc....
cosi' come si accorge quando rimetto il disco buono
Jun  5 16:24:14 linuxsrvr kernel: mptbase: ioc0: RAID STATUS CHANGE
for PhysDisk 0 id=9
Jun  5 16:24:14 linuxsrvr kernel: mptbase: ioc0:   PhysDisk is now
online
Jun  5 16:24:14 linuxsrvr kernel: mptbase: ioc0: RAID STATUS CHANGE
for VolumeID 1
Jun  5 16:24:14 linuxsrvr kernel: mptbase: ioc0:   volume is now
optimal, enabled, resync in progress
Jun  5 16:24:14 linuxsrvr kernel: mptbase: ioc0: RAID STATUS CHANGE
for VolumeID 1
Jun  5 16:24:14 linuxsrvr kernel: mptbase: ioc0:   volume is now
optimal, enabled
etc....
Con quale sistema posso catturare questi signal e far scattare un
evento, in modo che cosi' riesco a mandare una email di allerta?
Grazie.

 e' una figata, lo so :o)
Usare le feature di syslog-ng mi sembra più efficiente.

 e' una figata, lo so :o)
Molto fantasioso..... ma poi mi serve qualcosa per far scattare
l'evento telnet localhost 1234 .... siamo punto a capo



Guarda un esempio di file di configurazione di syslog-ng:
http://www.campin.net/syslog-ng.conf
Prendi spunto dalle righe seguenti, ad esempio:
destination mail-alert-perl { program("/usr/local/bin/syslog-mail-perl"); };
filter f_ssh_login_attempt { 
	program("sshd.*") 
	and match("(Failed|Accepted)") 
	and not match("Accepted (hostbased|publickey) for (root|zoneaxfr) from (10.4.3.1)"); 
};
log { 
	source(src); 
	filter(f_ssh_login_attempt); 
	destination(mail-alert-perl); 
};

 minimal.
Ho risolto facendomi uno script che controlal i log, fa delle
considerazioni, a manda un warning a video nel caso il raid e' stato
compromesso.
La shell l'ho messa nel .profile degli utenti, cosi' non possono non
notarlo.
E' stata dura pero'.... ho dovuto fare tutta una considerazione sulle
date e gli orari... se vi interessa lo posto, ma vi avverto che e' un
casino da capire:-)
anzi.... lo posto va:
#!/bin/bash
#Script per controllo RAID da syslogd
#Davide D'Amico 2008
#Definizione dei vari traps che ritrona il drivere del LSI Logic SAS
1064E
#MRMON105 Rebuild iniziato
#MRMON100 Rebuild completato
#MRMON112 Disco rimosso
#MRMON091 Disco inserito
#MRMON114 Cambio stato disco fisico
#MRMON081 Cambio stato volume
#Se nei log non risulata mai un cambio stato del RAID lascio
perdere...
if [ `grep MRMON081 /var/log/messages* |grep "Previous = Optimal
Current  Degraded" |wc -l` -gt 0 ];then
#Estrapolazione date degli ultimi traps rilevati dai log
#I vari _support sono una fase intermedia.
#Infatti devo prima fare un sort per la prima parte (la data)
#Poi tra le entry con la data piu' alta, faccio il sort della seconda
parte
#che sarebbe l'orario. Se cosi' non facessi
#il sort non riuscirebbe a svolgere il proprio compito nel giusto modo
#dato che uan stringa che contine mese in lettere, giorno in numero
#e orario in numeri, non puo' essere sortato in modo esato.
data_ultimo_112_support=`grep MRMON112 /var/log/messages* |cut -d ':' -
f2,3,4 |cut -d ' ' -f1,2,3,4 |cut -c 1-6 |sort |head -1`
data_ultimo_112=`grep MRMON112 /var/log/messages* |cut -d ":" -f2,3,4 |
cut -d " " -f1,2,3,4 |cut -c 1-15 |grep "$data_ultimo_112_support" |
sort -r |head -1`
data_ultimo_091_support=`grep MRMON091 /var/log/messages* |cut -d ':' -
f2,3,4 |cut -d ' ' -f1,2,3,4 |cut -c 1-6 |sort |head -1`
data_ultimo_091=`grep MRMON091 /var/log/messages* |cut -d ":" -f2,3,4 |
cut -d " " -f1,2,3,4 |cut -c 1-15 |grep "$data_ultimo_091_support" |
sort -r |head -1`
data_ultimo_114_support=`grep MRMON114 /var/log/messages* |cut -d ':' -
f2,3,4 |cut -d ' ' -f1,2,3,4 |cut -c 1-6 |sort |head -1`
data_ultimo_114=`grep MRMON114 /var/log/messages* |cut -d ":" -f2,3,4 |
cut -d " " -f1,2,3,4 |cut -c 1-15 |grep "$data_ultimo_114_support" |
sort -r |head -1`
data_ultimo_105_support=`grep MRMON105 /var/log/messages* |cut -d ':' -
f2,3,4 |cut -d ' ' -f1,2,3,4 |cut -c 1-6 |sort |head -1`
data_ultimo_105=`grep MRMON105 /var/log/messages* |cut -d ":" -f2,3,4 |
cut -d " " -f1,2,3,4 |cut -c 1-15 |grep "$data_ultimo_105_support" |
sort -r |head -1`
data_ultimo_100_support=`grep MRMON100 /var/log/messages* |cut -d ':' -
f2,3,4 |cut -d ' ' -f1,2,3,4 |cut -c 1-6 |sort |head -1`
data_ultimo_100=`grep MRMON100 /var/log/messages* |cut -d ":" -f2,3,4 |
cut -d " " -f1,2,3,4 |cut -c 1-15 |grep "$data_ultimo_100_support" |
sort -r |head -1`
data_ultimo_081_ok_support=`grep MRMON081 /var/log/messages* |cut -d
':' -f2,3,4 |cut -d ' ' -f1,2,3,4 |cut -c 1-6 |sort |head -1`
data_ultimo_081_ok=`grep MRMON081 /var/log/messages* |grep "Previous =
Degraded Current  Optimal" |cut -d ":" -f2,3,4 |cut -d " " -f1,2,3,4 |
cut -c 1-15 |grep "$data_ultimo_081_ok_support" |sort -r |head -1`
data_ultimo_081_ko_support=`grep MRMON081 /var/log/messages* |cut -d
':' -f2,3,4 |cut -d ' ' -f1,2,3,4 |cut -c 1-6 |sort |head -1`
data_ultimo_081_ko=`grep MRMON081 /var/log/messages* |grep "Previous =
Optimal Current  Degraded" |cut -d ":" -f2,3,4 |cut -d " " -f1,2,3,4 |
cut -c 1-15 |grep "$data_ultimo_081_ko_support" |sort -r |head -1`
data_ultimo_114_ok_support=`grep MRMON114 /var/log/messages* |cut -d
':' -f2,3,4 |cut -d ' ' -f1,2,3,4 |cut -c 1-6 |sort |head -1`
data_ultimo_114_ok=`grep MRMON114 /var/log/messages* |grep "Previous =
FailedCurrent = Rebuild" |cut -d ":" -f2,3,4 |cut -d " " -f1,2,3,4 |
cut -c 1-15 |grep "$data_ultimo_114_ok_support" |sort -r |head -1`
#Trasformazione date in numeri per i calcoli
data_ultimo_112_num=`date --date  "$data_ultimo_112" '+%Y%m%d%H%M%S'`
data_ultimo_091_num=`date --date  "$data_ultimo_091" '+%Y%m%d%H%M%S'`
data_ultimo_114_num=`date --date  "$data_ultimo_114" '+%Y%m%d%H%M%S'`
data_ultimo_105_num=`date --date  "$data_ultimo_105" '+%Y%m%d%H%M%S'`
data_ultimo_100_num=`date --date  "$data_ultimo_100" '+%Y%m%d%H%M%S'`
data_ultimo_081_ok_num=`date --date  "$data_ultimo_081_ok" '+%Y%m%d%H%M
%S'`
data_ultimo_081_ko_num=`date --date  "$data_ultimo_081_ko" '+%Y%m%d%H%M
%S'`
data_ultimo_114_ok_num=`date --date  "$data_ultimo_114_ok" '+%Y%m%d%H%M
%S'`
#Messaggistica
echo "L'ultima volta che e' stato rimosso un disco era il" `date --
date "$data_ultimo_112" '+%d/%m/%Y'` "alle ore" `date --date
"$data_ultimo_112" '+%T'` >/tmp/raid.txt
echo "L'ultima volta che e' stato reinserito un disco era il" `date --
date "$data_ultimo_091" '+%d/%m/%Y'` "alle ore" `date --date
"$data_ultimo_091" '+%T'` >>/tmp/raid.txt
echo "L'ultima volta che e' iniziato un rebuild era il" `date --date
"$data_ultimo_105" '+%d/%m/%Y'` "alle ore" `date --date
"$data_ultimo_105" '+%T'` >>/tmp/raid.txt
echo "L'ultima volta che un rebuild e' terminato era il" `date --date
"$data_ultimo_100" '+%d/%m/%Y'` "alle ore" `date --date
"$data_ultimo_100" '+%T'` >>/tmp/raid.txt
echo "L'ultima volta che c'e' stato un cambio di stato da Optimal a
Degraded era il" `date --date "$data_ultimo_081_ko" '+%d/%m/%Y'` "alle
ore" `date --date  "$data_ultimo_081_ko" '+%T'` >>/tmp/raid.txt
echo "L'ultima volta che c'e' stato un cambio di stato da Degraded a
Optimal era il" `date --date "$data_ultimo_081_ok" '+%d/%m/%Y'` "alle
ore" `date --date  "$data_ultimo_081_ok" '+%T'` >>/tmp/raid.txt
echo "L'ultima volta che c'e' stato un cambio di stato da Failed a
Rebuild era il" `date --date "$data_ultimo_114_ok" '+%d/%m/%Y'` "alle
ore" `date --date  "$data_ultimo_114_ok" '+%T'` >>/tmp/raid.txt
#Tests per controllare lo stato del RAID
if [ $data_ultimo_081_ok_num -gt $data_ultimo_081_ko_num ];then
	#In questo caso nei log, ho ricavato che l'ultimo trap per change
state =>Optimal, e' piu' recente del change state =>Degraded
	#Quindi il RAID e' a posto
	echo "Il RAID e' in stato ottimale." >>/tmp/raid.txt
else
	if [ $data_ultimo_114_ok_num -gt $data_ultimo_081_ko_num ];then
		#In questo caso dopo l'ultimo change state =>Degraded, non c'e'
stato ancora un change state =>Optimal
		#Tuttavia, vedo che c'e' un trap per il change state => Rebuild con
una data piu' recente dell'ultimo change state =>Degraded
		#Quindi mando un warning, ma rassicuro gli utenti che e' in fase di
rebuild
		echo "Il RAID e' in fase di ricostruzione...."
		echo "Premere un tasto per continuare....";read a
	else
		#Qui invece son dolori, perche' dopo la data in cui compare un
change state =>Degraded
		#non c'e' n'e' un change state =>Rebuild ne un change state
=>Optimal
		#quindi attenzione....
		echo "Controllare immediatamnete dischi. RAID compormesso!"
		echo "Premere un tasto per continuare....";read a
	fi
fi
else
echo "Nei log non vi e' traccia di RAID in degraded mode" >>/tmp/
raid.txt
fi

 Il fatto di metterlo nel .profile, IMHO non e' assolutamente un trigger.
Se non mi interessasse l'opinione degli altri non scriverei sul ng!
Sono d'accordo su tutto, solo che ad un certo punto ho ritenuto che in
effetti di un trigger potrei non aver bisogno.
il .profile e' quello della entry per il software di contabilità
dell'azienda, che viene aperta da decine di persone durante tutto il
giorno, ed un warning in fase di login non e' proprio possibile
ignorarlo, qualcuno mi telefona sicuramente in caso di raid degradato!
Ero tentato di sostituire il syslog con syslog-ng, come suggeriva
wiplash, ma poi mi e' venuta voglia di scrivere qualche riga.... ^__^
Ciao e grazie.

 errore.
Sacrosanta verita'! Infatti se leggi bene lo script che ho postato:
f [ $data_ultimo_081_ok_num -gt $data_ultimo_081_ko_num ];then
        echo "Il RAID e' in stato ottimale." >>/tmp/raid.txt
else
        if [ $data_ultimo_114_ok_num -gt
$data_ultimo_081_ko_num ];then
                echo "Il RAID e' in fase di ricostruzione...."
                echo "Premere un tasto per continuare....";read a
....
Come puoi vedere se e' tutto ok non succede nulla, il read a c'e' solo
se qualcosa non va. Cmq si, ho anche agginto una email tanto che mi ci
trovavo.
Ciao e grazie.

 wiplash, ma poi mi e' venuta voglia di scrivere qualche riga.... ^__^
Vista la versatilita`, io avrei sostituito syslog con syslog-ng a
prescindere (anzi, a dirla tutta, lo faccio :) )
Enrico