apc smart ups script snmp bash

APC azienda leader nella fabbricazione di gruppo di continuità permette
via snmp il monitoraggio del device.
Alcune delle informazioni più importanti che si possono ottenere sono:

– lo stato delle batterie [Normal|Low]
– il tempo trascorso in modalità batteria
– il tempo massimo in modalità batteria
– la capacità in % delle batterie
– il rilevamento delle batterie da sostituire
– la temperatura delle batterie
– la temperature ambientale

Utilizzando delle semplici istruzioni snmp, due righe di bash e un canale (un demone…)
per interfacciarsi ad un gateway sms possiamo farci inviare dei messaggi sms in caso di problemi, oppure semplicemente ricevere ad intervalli regolari una mail informativa sullo stato.

Avendo ad esempio un condizionatore “casalingo” il gruppo di continuità può venirci incontro
offrendoci la possibilità materiale di ottenere la temperatura della nostra server farm.

NB: sono in commercio sensori per il rilevamento di umidità.

Installato snmp e scaricato il file MIB (Management Information Base) sotto /usr/share/snmp/mibs/powernetX.X.X.mib bisogna configurare il demone sul dispositivo ups.
Per farlo consultate il manuale del produttore.

Nell’esempio il dispositivo avrà indirizzo IP 192.168.30.11 e la community read “public”

Possiamo iniziare il polling dello stato con uno script


#!/bin/sh
echo "---------------------------------";
snmpget -OsQ -m "/usr/share/snmp/mibs/powernetX.X.X.mib" \
-v1 -c public 192.168.30.11 \
upsBasicBatteryStatus.0 \
upsBasicBatteryTimeOnBattery.0 \
upsAdvBatteryCapacity.0 \
upsAdvBatteryTemperature.0 \
upsAdvBatteryRunTimeRemaining.0 \
upsAdvBatteryReplaceIndicator.0 \
iemStatusProbeCurrentTemp.1
echo "---------------------------------";
echo;
exit 0

che produrrà un output molto chiaro

tex:~$ /usr/local/bin/upsinfo
---------------------------------
upsBasicBatteryStatus.0 = batteryNormal
upsBasicBatteryTimeOnBattery.0 = 0:0:00:00.00
upsAdvBatteryCapacity.0 = 100
upsAdvBatteryTemperature.0 = 29
upsAdvBatteryRunTimeRemaining.0 = 0:3:58:00.00
upsAdvBatteryReplaceIndicator.0 = noBatteryNeedsReplacing
iemStatusProbeCurrentTemp.1 = 24
---------------------------------

Per controllare lo stato della temperatura esterna (per creare grafici con mrtg, farsi inviare sms di allarme, ecc…) basterà inserire nello script:


CURTEM=`snmpget -Oqv -m "/usr/share/snmp/mibs/powernetX.X.X.mib" -v1 -c public 192.168.30.11 iemStatusProbeCurrentTemp.1`

e confrontare/salvare il valore di CURTEM.

Posted in Bash at September 24th, 2007. No Comments.

vpopmail clean old maildir last authentication

Solitamente i clienti pressano per l’attivazione di una casella email, ma non si preoccupano minimamente di segnalare al gestore la disattivazione.

I metodi per recuperare la lista delle caselle in disuso sono molteplici (vpopmail permette anche la disattivazione automatica dopo un tot di tempo), io preferisco estrapolare la data dell’ultimo accesso e parsarsi un comodo fie formattato.

Il comando che genera il file


for i in `vpopbull -nV`;do echo -n "$i " ; vuserinfo $i |grep "last auth:" ; done

l’output è il seguente

[email protected] last auth: Never logged in
[email protected] last auth: Wed Sep 19 11:20:32 2007
[email protected] last auth: Never logged in
[email protected] last auth: Wed Sep 19 10:49:43 2007
[email protected] last auth: Never logged in
[email protected] last auth: Tue Jun 6 16:52:25 2006

e con poche combinazioni di bash si riesce ad esempio a risalire agli utenti “mai loggati” o a quelli “loggati l’anno scorso”.

Posted in Bash at September 19th, 2007. 2 Comments.

clamav-daemon check script

Negli ultimi tempi su una macchina molto stressata ho disabilitato l’opzione di freshclam che imponeva il reload delle signature a clamd, commentandola

#NotifyClamd /etc/clamav/clamd.conf

Ho inoltre abbassato il tempo dell’opzione SelfCheck di clamd a 1800.

Il problema era molto grave perchè i processi clamd sparivano senza lasciare traccia (solo il logging di grsec mi segnalava il segmentation fault) mentre il socket rimaneva aperto, facendo andare in “palla” pure simscan.

Non sono riuscito a risolvere in maniera pulitissima e prima di cantare vittoria ho preparato uno script che controlla esistenza di pid, processi, socket e nel peggiore dei casi si occupa di fare un restart di clamd

Il codice per contare il numero dei processi (anche spamassassin gira sotto clamav)

ssh texilee.it ps --User=clamav u| grep /usr/sbin/clamd |wc -l

Dopodichè se tutti i test di “vita” falliscono forzo il restart del demone.

Se qualcuno ha lo stesso problema (magari..) o vuole cimentarsi nel debugging mi può rispondere sul blog o via mail o qui

Posted in Bash, Linux at September 18th, 2007. No Comments.

expect rsync file vanished exit code 24

rsync in presenza di file “scomparsi” (in inglese vanished) ritorna un exit code 24

$ man rsync
24 Partial transfer due to vanished source files

Ci sono gà abbastanza flame sulla questione (ma anche simpatici wrapper che ritornano 0 anche in caso di questo tipo di errore) e non ci entro.

Se viene utilizzato expect (e/o altri linguaggi ) il problema è che l’esecuzione dell’istruzione successiva non viene effettuata ma termina.

Se il problema si manifesta durante l’ultima istruzione non sussiste, ma se lo scirpt dovesse eseguire più rsync di directory potenzialmente contenenti file “temporanei” (mail web proxy server in primis) il backup non sarebbe riutilizzabile.

Ecco un semplice modo per ovviare al problema, consapevoli che non tutti i file sono stati correttamente trasferiti. La prima parte presenta il backup di /etc che non dovrebbe subire questo fenomeno, e il backup di /var/www , direcotry potenzialmente ad alto contenuto “volatile”

#!/usr/bin/expect

log_user 1
exec rsync -e ssh -v -P -R -u -a --blocking-io --numeric-ids --delete --ignore-errors [email protected]:/etc /var/backups/www.texilee.it
puts "www.texilee.it:/etc OK"
puts ""

set err_code [catch {exec rsync -e ssh -v -P -R -u -a --blocking-io --numeric-ids --delete --ignore-errors [email protected]:/var/www /var/backups/www.texilee.it}]
if {1==$err_code} {
puts "www.texilee.it:/var/www OK error code 24"
} else {
puts "www.texilee.it:/var/www OK"
}

Posted in Linux at September 18th, 2007. No Comments.