Gimli[2BV!2B]
04-09-2008, 00:45
Trasformare casella e-mail in scatola nera per un piccolo server domestico.
In questa discussione proverò a condividere l'insieme di script e demoni che utilizzo per tenere sotto controllo un pc acceso 24/7, fornitore di vari servizi nella mia rete domestica.
Certamente questo non è l'unico modo, né il più semplice, per realizzare una cosa di questo tipo.
Soprattutto riguardo i punti 1 e 3 (i più corposi) so che esistono strumenti che permettono di monitorare sensori e sistema e millemila altre cose. Ma tutto era partito senza un disegno preciso, quindi, ad un certo punto, mi è nata la necessità di avere mail con questi dati e le ho create.
Per molto tempo sono stato indeciso sull'utilità di postare tutto questo; diciamo che se non altro saprò dove andare a cercare se mi scorderò qualche dettaglio!
Obiettivi
Monitoraggio hardware
Monitoraggio dei log + storico di tutti i boot (del sistema e degli apparati di rete che lo permettono)
Quantificazione del traffico di rete
Monitoraggio hard disk
Backup (protetto) delle porzioni fondamentali del sistema
Archiviazione in una risorsa internet gratuita e di semplice fruizione
Sincronizzazione DNS grazie a FreeDNS (http://freedns.afraid.org/)
Programmi utilizzati
Monitoraggio hardware.
Acquisizione dati: lm-sensors (http://www.lm-sensors.org/) + sensord (http://www.lm-sensors.org/wiki/man/sensord)
Archiviazione: RRDtool (http://oss.oetiker.ch/rrdtool/)
Rappresentazione dati: grafici quotidiani
.
Monitoraggio dei log.
Demone di logging: syslog-ng (http://www.balabit.com/network-security/syslog-ng/)
Analisi log ed invio e-mail: logcheck (http://logcheck.org/)
.
Quantificazione del traffico di rete.
Logging: script ad-hoc + cron (http://it.wikipedia.org/wiki/Cron)
Archiviazione: di nuovo RRDtool (http://oss.oetiker.ch/rrdtool/)
Rappresentazione dati: grafici quotidiani
.
Monitoraggio hard disk.
Monitoraggio S.M.A.R.T. (http://en.wikipedia.org/wiki/S.M.A.R.T.): smartd (http://smartmontools.sourceforge.net/man/smartd.8.html)
Logging: script ad-hoc + cron (http://it.wikipedia.org/wiki/Cron)
Archiviazione: di nuovo RRDtool (http://oss.oetiker.ch/rrdtool/)
Rappresentazione dati: grafici quotidiani
.
Backup (protetto) delle porzioni fondamentali del sistema.
Realizzato per mezzo di uno scrip ad-hoc + cron
Compressione: bzip2 (http://www.bzip.org/)
Codifica: pgp (http://it.wikipedia.org/wiki/Pretty_Good_Privacy) con password
.
Archiviazione in una risorsa internet gratuita e di semplice fruizione.
Archiviazione: gmail (http://mail.google.com/)
Invio dati: exim4 (http://www.exim.org/)
.
Sincronizzazione DNS
Aggiornamento indirizzo: inadyn (http://linux.die.net/man/8/inadyn) più uno script ad-hoc.
[1] Monitoraggio hardware.
Si potrà realizzare questo punto se l'hardware che si vuole analizzare è ufficialmente supportato: lm-sensors supported devices (http://www.lm-sensors.org/wiki/Devices).
Se l'hardware non è esplicitamente elencato si può comunque tentare il primo passo.
A. Individuazione e taratura dei sensori.
Installazione ed utlizzo di lm-sensors. (http://guide.debianizzati.org/index.php/I2c_e_lm-sensors)
In alcuni casi i valori ottenuti col comando sensors risulteranno un po' strani o fuoriscala, in tal caso è utile modificare la sezione del file /etc/sensors3.conf relativa al vostro chip dei sensori (man sensors.conf per dettagli, oltre all'ottima introduzione presente nel file stesso).
B. Installazione e configurazione sensord.
Ora si può installare il pacchetto sensord.
Il file di configurazione del demone è /etc/default/sensord.
Questo è la configurazione che ho scelto:
RRD_FILE=/var/log/sensord.rrd
RRD_INTERVAL=2m
RRD_LOADAVG=yes
Per poter procedere agevolmente ho rinnovato il sistema di logging ufficiale della mia distribuzione (Debian), rimuovendo sysklogd e klogd, rimpiazzandoli con il più versatile e moderno syslog-ng.
Effettuata la sostituzione ho disabilitato il logging standard di sensord (che stamperebbe le letture dei sensori nei log ad ogni invocazione), lasciando solo il file round-robin.
Se in seguito ad un aggiornamento il file rrd presentasse canali scambiati o mancanti è usualmente sufficiente fermare il servizio sensord, rimuovere il vecchio rrd (magari facendo un backup temporaneo) e riavviare il servizio. Il servizio genererà un nuovo file risistemando la situazione.
Per disabilitare il logging è necessario editare il file /etc/syslog-ng/syslog-ng.conf commentando le seguenti sezioni:
# sensord
#destination sensord { file("/var/log/sensord"); };
# ~-~-~-~
# sensord filter
#filter f_sensord {
# facility(local4);
#};
# ~-~-~-~
# sensord
#log {
# source(s_all);
# filter(f_sensord);
# destination(sensord);
#};
Assicuriamoci dell'avvio automatico di sensord controllando in rcconf (o con il vostro strumento preferito per il controllo degli script init).
C. Creazione dei grafici.
A questo punto abbiamo un file che memorizza circolarmente i dati dei sensori ogni due minuti con uno storico di una settimana.
Per ottenere dei grafici dai dati memorizzati possiamo utilizzare i versatili rrdtools:
# Esempio 2 voltaggi + carico CPU delle ultime 24 ore
rrdtool graph daily-voltages.png --imginfo '<IMG SRC=/sensord/%s WIDTH=%lu HEIGHT=%lu>' \
-a PNG -h 800 -w 800 -v 'Voltaggio (V)' \
-t 'Voltaggi Phoenix' -x 'HOUR:1:HOUR:3:HOUR:3:0:%b %d %H:00' \
-s -1d -l 0 -u 13 -r --slope-mode \
DEF:in0=/var/log/sensord.rrd:in0:AVERAGE \
DEF:in1=/var/log/sensord.rrd:in1:AVERAGE \
DEF:loadavg=/var/log/sensord.rrd:loadavg:AVERAGE \
LINE2:in0#1C0674:"+3.3V" \
LINE2:in1#2A961C:"Vtt1.2V" \
LINE2:loadavg#F52F1D:"loadavg" > /dev/null
Consultare man rrdgraph per comprendere le opzioni iniziali.
Per avere grafici con leggibilità ottimale è necessario assicurarsi di avere installati i font Dejavu (http://dejavu-fonts.org/wiki/index.php?title=Main_Page), disponibili pacchettizzati nelle principali distribuzioni.
Ciò che riguarda i nostri dati sono i DEF ed i LINE
DEF: pescano i "canali" dell'rrd, che hanno gli stessi nomi visti in /etc/sensors3.conf (in0, in1, ecc...); da notare loadavg, che è il carico della CPU il cui monitoraggio è stato abilitato in /etc/default/sensord (RRD_LOADAVG=yes).
LINE: il numero che segue immediatamente indica lo spessore della linea (2), poi vi è il canale (in0), quindi il colore in notazione html (#1C0674), per finire l'etichetta per la legenda ("+3.3V").
Torna all'indice.
[2] Monitoraggio dei log.
Per questa funzione mi sono affidato al semplice logcheck.
Una volta installato verrà eseguito automaticamente ogni ora, riportando su di una casella di posta selezionata tutte le linee dei log principali che sono estranee ad un normale funzionamento della macchina.
In caso di boot o reboot viene recapitato un messaggio differente, contenente l'intero dmesg/kernel.log, con titolo "Reboot: MACCHINA data ora".
Il file di configurazione principale è /etc/logcheck/logcheck.conf; ecco le mie scelte:
REPORTLEVEL="server"
SENDMAILTO="MIA_MAIL@gmail.com"
MAILASATTACH=0
**PUNTO FONDAMENTALE**
Per poter ricevere le mail inviate da exim al nostro account Gmail (quindi tutte le mail citate in questa discussione) sarà necessario seguire questa guida. (http://wiki.debian.org/GmailAndExim4)
Personalmente, utilizzando una buona quantità di demoni, ho avuto la necessità di modificare i filtri regexp di logcheck per ridurne la verbosità. Per quanto riguarda il filtraggio "server", si trovano nella cartella /etc/logcheck/ignore.d.server/.
Si tratta di espressioni regolari che corrispondono alle linee da ignorare.
APPENDICE
Trasformare syslog-ng in un server di logging di rete, su cui dirigere anche i log del modem (che naturalmente deve supportare la funzione di logging remoto/remote logging).
Aggiunte da fare al file /etc/syslog-ng/syslog-ng.conf (###### evidenzia la sezione modificata):
######
# sources
# all known message sources
source s_modem {
udp(ip(192.168.1.1) port(514));
};
######
# destinations
# file in cui dirigere i messaggi del modem
destination df_modem { file("/var/log/modem.log"); };
######
# logs
# collegamento tra sorgente e file
log {
source(s_modem);
destination(df_modem);
};
Abilitiamo quindi la rotazione del nuovo log creando un file /etc/logrotate.d/modem dal contenuto
/var/log/modem.log {
rotate 7
daily
compress
delaycompress
copytruncate
missingok
notifempty
}
Per finire diciamo a logcheck di monitorare anche questo file aggiungendo questa riga ad /etc/logcheck/logcheck.logfiles:
/var/log/modem.log
In caso di attivazione di logcheck è consigliabile controllare che il modem, soprattutto in fase di connessione, non spifferi dati sensibili; se accadesse si può pensare di lasciar perdere la cosa, oppure aggiungere opportuni filtri a logcheck (in /etc/logcheck/ignore.d.CLASSE_MONITORAGGIO).
Torna all'indice.
[3] Quantificazione del traffico di rete.
Questa è una buona guida su cui mi sono basato. (http://martybugs.net/linux/rrdtool/traffic.cgi)
Questo punto è simile al primo, ma occorre crearlo da zero.
Nella guida è stato utilizzato script Perl che ho preferito frammentare nelle unità funzionali e trasformarlo in script bash.
Si devono inizializzare i file rrd (notare DERIVE, cioè interpretare i dati alle variazioni):
#!/bin/bash
ETHS=$(/sbin/ifconfig | sed '/^eth\([[:digit:]]\{1,3\}\).*/!d ; s/\(\s\).*/\1/')
for ETH in $ETHS; do
rrdtool create /var/log/$ETH.rrd \
DS:in:DERIVE:600:0:12500000 \
DS:out:DERIVE:600:0:12500000 \
RRA:AVERAGE:0.5:1:576 \
RRA:AVERAGE:0.5:6:672 \
RRA:AVERAGE:0.5:24:732 \
RRA:AVERAGE:0.5:144:1460
done
Si deve quindi creare uno script di aggiornamento che da in pasto all'rrd il numero di byte transitati per l'interfaccia dalla sua attivazione:
#!/bin/sh
ETHS=$(/sbin/ifconfig | sed '/^eth\([[:digit:]]\{1,3\}\).*/!d ; s/\(\s\).*/\1/')
for ETH in $ETHS; do
IN=`/sbin/ifconfig $ETH |grep bytes|cut -d":" -f2|cut -d" " -f1`
OUT=`/sbin/ifconfig $ETH |grep bytes|cut -d":" -f3|cut -d" " -f1`
rrdtool update /var/log/$ETH.rrd -t in:out N:$IN:$OUT
done(Questi dati saranno poi interpretati tramite differenziale come impostato alla creazione del file, così otterremo la velocità media)
Dopodiché di deve inserire in cron lo script di aggiornamento (crontab -e); personalmente ho considerato un aggiornamento ogni 5 min. sufficiente (*/5).
Per finire si possono creare i grafici in maniera simile a come già illustrato (ma in modo più adeguato per le grandezze rappresentate):#!/bin/sh
ETHS=$(/sbin/ifconfig | sed '/^eth\([[:digit:]]\{1,3\}\).*/!d ; s/\(\s\).*/\1/')
for ETH in $ETHS; do
rrdtool graph $ETH.png --imginfo '<IMG SRC=/sensord/%s WIDTH=%lu HEIGHT=%lu>' \
-a PNG -h 80 -w 800 -v 'Bytes/sec' \
-t "Traffico $ETH" -x 'HOUR:1:HOUR:3:HOUR:3:0:%b %d %H:00' \
-s -1d --slope-mode \
DEF:in=/var/log/$ETH.rrd:in:AVERAGE \
DEF:out=/var/log/$ETH.rrd:out:AVERAGE \
CDEF:out_neg=out,-1,* \
VDEF:inmax=in,MAXIMUM \
VDEF:inavg=in,AVERAGE \
VDEF:outmax=out,MAXIMUM \
VDEF:outavg=out,AVERAGE \
AREA:in#32CD32:Incoming \
LINE1:in#336600 \
GPRINT:inmax:"Max\: %5.1lf %S" \
GPRINT:inavg:"Avg\: %5.1lf %S\\n" \
AREA:out_neg#4169E1:Outgoing \
LINE1:out_neg#0033CC \
GPRINT:outmax:"Max\: %5.1lf %S" \
GPRINT:outavg:"Avg\: %5.1lf %S"
done
Questo script è più avanzato; contiene:
CDEF out_neg calcolato con notazione polacca inversa
VDEF inavg, ..., outmax con cui vengono calcolati massimo e media sul periodo grazie alle funzioni MAXIMUM e AVERAGE
AREA che disegna un grafico pieno, non la linea del precedemte esempio
GPRINT che stampa una stringa tra i valori della legenda, usata per scrivere max e avg
Torna all'indice.
[4] Monitoraggio hard disk.
Utilizzando il demone smartd si possono tenere sotto osservazione i valori S.M.A.R.T. dei dischi fissi.
Solitamente ci si accorge che un disco ha qualche problema quando inizia a bloccare la macchina o "dimenticare" dati: utilizzando smartd si può venire a conoscenza di valori preoccupanti non appena questi compaiono.
Il file di configurazione è /etc/smartd.conf; questi sono i valori che ho utilizzato:
/dev/sda -d sat -n standby -H -I 194 -C 197 -U 198 -W 3,45,49 -m MIA_MAIL@gmail.com
Punto molto simile al precedente per quanto riguarda la raccolta dei dati.
Inizializzare i file rrd:
#!/bin/bash
for HDD in /dev/sd[[:alpha:]]; do
rrdtool create /var/log/$(basename "$HDD").rrd -s 300 \
DS:temp:GAUGE:600:0:100 \
RRA:AVERAGE:0.5:1:576 \
RRA:AVERAGE:0.5:6:672 \
RRA:AVERAGE:0.5:24:732 \
RRA:AVERAGE:0.5:144:1460
done
Script di aggiornamento che legge la temperatura dal sensore dei dischi:
#!/bin/sh
HDDTEMP="/usr/sbin/hddtemp"
for DEV in /dev/sd[[:alpha:]]; do
HDD=$(basename "$DEV")
rrdtool update /var/log/"$HDD".rrd -t temp N:$($HDDTEMP -n "$DEV")
done
Inserire in cron lo script di aggiornamento (crontab -e); anche in questo caso ho considerato un aggiornamento ogni 5 min. sufficiente (*/5).
Non ho creato un grafico specifico per i dischi, ma ho aggiunto il valore al grafico delle temperature degli altri sensori.
Invio di tutti i grafici.
#!/bin/sh
TEMP_DIR="/tmp"
DIR_CREATED=0
MAIL_TO="MIA_MAIL@gmail.com"
# Per circa mezz'ora resta in attesa della connessione
I=0
while ! ping -c 4 -w 5 -q www.google.it >/dev/null 2>&1 ; do
if [ $I -eq 9 ] ; then
echo "Connessione non disponibile: creazione grafici terminata."
exit 1
fi
sleep 120
I=$(($I+1))
done
if [ ! -d "$TEMP_DIR" ] ; then
if ! mkdir -p -- "$TEMP_DIR" ; then
echo "Creazione cartella temporanea fallita!"
exit 1
fi
DIR_CREATED=1
fi
echo -n "Plotting Graphs: voltages, "
# Dati voltaggi + carico CPU delle ultime 24 ore
rrdtool graph "$TEMP_DIR/daily-voltages.png" --imginfo '<IMG SRC=/sensord/%s WIDTH=%lu HEIGHT=%lu>' \
-a PNG -h 800 -w 800 -v 'Voltaggio (V)' \
-t 'Voltaggi Phoenix' -x 'HOUR:1:HOUR:3:HOUR:3:0:%b %d %H:00' \
-s -1d -l 0 -u 13 -r --slope-mode \
DEF:in0=/var/log/sensord.rrd:in0:AVERAGE \
DEF:in1=/var/log/sensord.rrd:in1:AVERAGE \
DEF:in2=/var/log/sensord.rrd:in2:AVERAGE \
DEF:in3=/var/log/sensord.rrd:in3:AVERAGE \
DEF:in4=/var/log/sensord.rrd:in4:AVERAGE \
DEF:in5=/var/log/sensord.rrd:in5:AVERAGE \
DEF:in6=/var/log/sensord.rrd:in6:AVERAGE \
DEF:in7=/var/log/sensord.rrd:in7:AVERAGE \
DEF:in8=/var/log/sensord.rrd:in8:AVERAGE \
DEF:loadavg=/var/log/sensord.rrd:loadavg:AVERAGE \
LINE2:in0#1C0674:"+3.3V" \
LINE2:in1#2A961C:"Vtt1.2V" \
LINE2:in2#5C93CE:"Vddr2" \
LINE2:in3#59F80F:"Vchip" \
LINE2:in4#424036:"+5V" \
LINE2:in5#B16C63:"+12V" \
LINE2:in6#442F18:"Vcc1.5V" \
LINE2:in7#790654:"Vcore" \
LINE2:in8#FBA71A:"5VSB" \
LINE2:loadavg#F52F1D:"loadavg" > /dev/null
FILES="$TEMP_DIR/daily-voltages.png"
echo -n "temperatures, "
# Dati temperature + carico CPU delle ultime 24 ore
rrdtool graph "$TEMP_DIR/daily-temperatures.png" --imginfo '<IMG SRC=/sensord/%s WIDTH=%lu HEIGHT=%lu>' \
-a PNG -h 400 -w 800 -v 'Temperatura (C)' \
-t 'Temperature Phoenix' -x 'HOUR:1:HOUR:3:HOUR:3:0:%b %d %H:00' \
-s -1d -l 10 --slope-mode \
DEF:temp2=/var/log/sensord.rrd:temp2:AVERAGE \
DEF:temp1_0=/var/log/sensord.rrd:temp1_0:AVERAGE \
DEF:temp_sda=/var/log/sda.rrd:temp:AVERAGE \
DEF:loadavg=/var/log/sensord.rrd:loadavg:AVERAGE \
CDEF:10_x_loadAvg=loadavg,10,* \
LINE2:temp2#7b23c6:"system" \
LINE2:temp1_0#D01717:"CPU" \
LINE2:temp_sda#790654:"Hard disk" \
LINE2:10_x_loadAvg#F52F1D:"10_x_loadAvg" > /dev/null
FILES="$FILES,$TEMP_DIR/daily-temperatures.png"
echo -n "fan speed, "
# Velocita' rotazione ventola nelle ultime 24 ore
rrdtool graph "$TEMP_DIR/daily-fan.png" --imginfo '<IMG SRC=/sensord/%s WIDTH=%lu HEIGHT=%lu>' \
-a PNG -h 400 -w 800 -v 'RPM' \
-t 'Ventola Phoenix' -x 'HOUR:1:HOUR:3:HOUR:3:0:%b %d %H:00' \
-s -1d -l 700 --slope-mode \
DEF:fan1=/var/log/sensord.rrd:fan1:AVERAGE \
LINE2:fan1#F52F1D:"Sys Fan" > /dev/null
FILES="$FILES,$TEMP_DIR/daily-fan.png"
echo -n "ethernet interfaces"
ETHS=$(/sbin/ifconfig | sed '/^eth\([[:digit:]]\{1,3\}\).*/!d ; s/\(\s\).*/\1/')
if [ ! -z "$ETHS" ] ; then
echo -n " ( "
for ETH in $ETHS; do
rrdtool graph "$TEMP_DIR/$ETH.png" --imginfo '<IMG SRC=/sensord/%s WIDTH=%lu HEIGHT=%lu>' \
-a PNG -h 80 -w 800 -v 'bytes/sec' \
-t "Traffico $ETH" -x 'HOUR:1:HOUR:3:HOUR:3:0:%b %d %H:00' \
-s -1d --slope-mode \
DEF:in=/var/log/$ETH.rrd:in:AVERAGE \
DEF:out=/var/log/$ETH.rrd:out:AVERAGE \
CDEF:out_neg=out,-1,* \
VDEF:inmax=in,MAXIMUM \
VDEF:inavg=in,AVERAGE \
VDEF:outmax=out,MAXIMUM \
VDEF:outavg=out,AVERAGE \
AREA:in#32CD32:"Incoming" \
LINE1:in#336600 \
GPRINT:inmax:"Max\: %5.1lf %S" \
GPRINT:inavg:"Avg\: %5.1lf %S\\n" \
AREA:out_neg#4169E1:"Outgoing" \
LINE1:out_neg#0033CC \
GPRINT:outmax:"Max\: %5.1lf %S" \
GPRINT:outavg:"Avg\: %5.1lf %S" > /dev/null
FILES="$FILES,$TEMP_DIR/$ETH.png"
echo -n "$ETH "
done
echo -n ")"
fi
echo "."
echo -n "Invio mail a $MAIL_TO..."
uptime | biabam $FILES -s "Phoenix sensors statistics `date`" $MAIL_TO
echo "Done."
echo -n "Rimozione "
if [ $DIR_CREATED -eq 1 ] ; then
if [ -d "$TEMP_DIR" ] ; then
echo -n "$TEMP_DIR"
rm -r -- "$TEMP_DIR"
echo "."
exit 0
else
echo "cartella \"$TEMP_DIR\" FALLITA!"
echo -n "Rimozione "
fi
fi
echo "file:"
FILES_ARR=$(echo "$FILES" | tr "," "\n")
for file in $FILES_ARR ; do
if [ -f "$file" ] ; then
echo "\"$file\""
rm -- "$file"
fi
done
exit 0
Questo script viene lanciato da un cronjob ogni mezzanotte.
Report mensile. Assicurarsi di avere sufficienti dati:rrdtool info /var/log/sensord.rrd | grep rows
rra[0].rows = 20160
Nel mio caso devono essere 21600 (30 campionamenti/h * 24 h * 30 gg):
rrdtool resize /var/log/sensord.rrd 0 GROW 1440
mv resize.rrd /var/log/sensord.rrd
Porzione script mensile con evidenziato parametro fondamentale:# Dati voltaggi + carico CPU
GRAFICO_TITOLO="Voltaggi $HOSTNAME_CAPITAL - $(date +%Y-%m-%d\ %H.%M.%S)"
FILE="$TEMP_DIR/monthly-voltages_$DATE.png"
rrdtool graph "$FILE" --imginfo '<IMG SRC=/sensord/%s WIDTH=%lu HEIGHT=%lu>' \
-a PNG -h 800 -w 800 -v 'Voltaggio (V)' \
-t "$GRAFICO_TITOLO" \
-s -1m -l 0 -u 13 -r --slope-mode -y 0.1:10 -L 1 \
DEF:in0=/var/log/sensord.rrd:in0:AVERAGE \
DEF:in1=/var/log/sensord.rrd:in1:AVERAGE \
DEF:in2=/var/log/sensord.rrd:in2:AVERAGE \
DEF:in3=/var/log/sensord.rrd:in3:AVERAGE \
DEF:in4=/var/log/sensord.rrd:in4:AVERAGE \
DEF:in5=/var/log/sensord.rrd:in5:AVERAGE \
DEF:in6=/var/log/sensord.rrd:in6:AVERAGE \
DEF:cpu0_vid=/var/log/sensord.rrd:cpu0_vid:AVERAGE \
DEF:in8=/var/log/sensord.rrd:in8:AVERAGE \
DEF:loadavg=/var/log/sensord.rrd:loadavg:AVERAGE \
LINE2:in0#1C0674:"+3.3V" \
LINE2:in1#2A961C:"Vtt1.2V" \
LINE2:in2#5C93CE:"Vddr2" \
LINE2:in3#59F80F:"Vchip" \
LINE2:in4#424036:"+5V" \
LINE2:in5#B16C63:"+12V" \
LINE2:in6#442F18:"Vcc1.5V" \
LINE2:cpu0_vid#790654:"CPU_vid" \
LINE2:in8#FBA71A:"5VSB" \
LINE2:loadavg#F52F1D:"loadavg" > /dev/null
Torna all'indice.
[5] Backup (protetto) delle porzioni fondamentali del sistema.
Obiettivo: salvare la minima quantità di dati sufficiente per ricreare un sistema gemello del "backuppato" in tempi brevi.
Mia ipotesi di soluzione: salvare TUTTA /etc, il config del kernel in uso ed un elenco dei pacchetti installati.
Svolgimento:
#!/bin/sh
PASSWORD="Password!"
HOSTNAME=`hostname`
HOSTNAME_CAPITAL=`printf %c $HOSTNAME | tr [:lower:] [:upper:]`${HOSTNAME#`printf %c $HOSTNAME`}
TEMP_DIR="/tmp"
FILES=""
DIR_CREATED=0
RETURN=0
MAIL_TO=MIA_MAIL@gmail.com
# Per due ore spera che la connessione funzioni...
I=0
while ! ping -c 4 -w 5 -q www.google.it >/dev/null 2>&1 ; do
if [ $I = 20 ] ; then
echo "Connessione non disponibile: backup annullato."
exit 1
fi
sleep 340
I=$(($I+1))
done
if [ ! -d "$TEMP_DIR" ] ; then
if ! mkdir -p -- "$TEMP_DIR" ; then
echo "Creazione cartella temporanea fallita!"
exit 1
fi
DIR_CREATED=1
fi
echo -n "Elenco dei pacchetti installati"
PACKAGES="packages-snapshot-`date +%Y-%m-%d_%H.%M.%S`"
if dpkg --get-selections > "$TEMP_DIR/$PACKAGES" ; then
FILES="$TEMP_DIR/$PACKAGES"
echo "."
else
PACKAGES=""
echo " Errore!"
fi
echo -n "Lista delle partizioni"
PARTITIONS="fdisk_-l"
if /sbin/fdisk -l > "$TEMP_DIR/$PARTITIONS" ; then
FILES="$FILES $TEMP_DIR/$PARTITIONS"
echo "."
else
PARTITIONS=""
echo " Errore!"
fi
# bz2
FILE="$TEMP_DIR/$HOSTNAME.tar.bz2"
if [ -d "$TEMP_DIR" ] ; then
cd "$TEMP_DIR"
fi
tar -cjf "$FILE" \
"$PACKAGES" \
"$PARTITIONS" \
--preserve-permissions /etc \
--preserve-permissions /boot/config-`uname -r` \
--preserve-permissions /boot/grub/menu.lst \
--preserve-permissions /var/spool/cron/crontabs \
>/dev/null 2>&1
if [ $? -eq 0 ] ; then
FILES="$FILES $FILE"
echo "."
else
echo " Errore creando il tar!"
RETURN=1
fi
if [ $RETURN -eq 0 ] ; then
echo -n "gpg"
FILE="$TEMP_DIR/$HOSTNAME.tar.bz2"
if gpg -q --yes -c --passphrase "$PASSWORD" "$FILE" ; then
echo " Done!"
echo -n "Invio mail a $MAIL_TO... "
FILE="$FILE.gpg"
FILES="$FILES $FILE"
date | biabam "$FILE" -s "$HOSTNAME_CAPITAL backup `date`" "$MAIL_TO"
echo "done."
else
echo " Errore creando il gpg!"
RETURN=1
fi
fi
echo -n "Rimozione "
if [ $DIR_CREATED -eq 1 ] ; then
if [ -d "$TEMP_DIR" ] ; then
echo -n "$TEMP_DIR"
rm -r -- "$TEMP_DIR"
echo "."
exit 0
else
echo "cartella \"$TEMP_DIR\" FALLITA!"
echo -n "Rimozione "
fi
fi
echo "file:"
FILES_ARR=$(echo "$FILES" | tr "," "\n")
for file in $FILES_ARR ; do
if [ -f "$file" ] ; then
echo "\"$file\""
rm -- "$file"
fi
done
exit $RETURNQuesto script viene lanciato da cron una volta alla settimana.
Torna all'indice.
[6] Archiviazione in una risorsa internet gratuita e di semplice fruizione.
Il passaggio chiave di questo punto riguarda la modifica della configurazione di exim4 come smarthost per Gmail, come già evidenziato precedentemente, seguendo questa guida. (http://wiki.debian.org/GmailAndExim4)
Personalmente non ho idea di come sia il rapporto di exim4 con altri servizi e-mail.
Naturalmente ci sono alcuni aspetti da tenere in considerazione, principalmente:
Protezione/privacy: i dati del sistema sono protetti pgp (mi sono accontentato della password, ma niente nega di usare una chiave), in mesi di utilizzo non ho trovato dati sensibili nei log inviati usualmente da logcheck, inoltre gmail è abbastanza sicura ed in continuo miglioramento.
La password della mail sarà scritta in chiaro in un file sul vostro computer, per questo ho impostato Exim come smarthost della mia mail secondaria (quella per gli esperimenti...), inviandole però alla mia mail primaria, la cui password non sarà scritta da nessuna parte.
Spazio disponibile: mentre sto scrivendo, dopo circa 3 anni col sistema a pieno regime (più altri 6 mesi parziali), ho occupato ~600 mega sui 10 giga disponibili.
Ordine: grazie alle etichette di Gmail ed alla standardizzazione dei messaggi è possibile smistarli ed archiviarli senza problemi.
Le mie semplici etichette sono:
Phoenix: filtro "from: (logcheck system account)"
Phoenix backup: filtro "from:root subject: (Phoenix backup)"
Phoenix sensors: filtro "from:root subject: (Phoenix sensors)"
Come suggerito da omerook (http://hwupgrade.it/forum/showpost.php?p=37964860&postcount=14) è anche possibile fare in modo che GMail ci avvisi offline, tramite SMS (http://www.navigaweb.net/2012/04/ricevere-le-mail-gmail-via-sms-sul.html), dell'arrivo di qualche email importante.
Tra le mail descritte in questa discussione penserei soprattutto agli allarmi di smartd sulla salute dei dischi.
Torna all'indice.
[7] Sincronizzazione DNS.
Prima di tutto: perché FreeDNS (http://freedns.afraid.org/)? Perché i domini disponibili su DynDNS fanno schifo... resta che altri fornitori di strumenti DNS non necessitano di un piccolo hack come FreeDNS per aggiornare il record.
Bene, ricordate la questione del logging centralizzato per la rete (appendice punto [2])? Ho pensato di utilizzarlo per capire quando è necessario contattare i server per aggiornare il record DNS.
Una modifica ad /etc/syslog-ng/syslog-ng.conf ed ho creato un log "volatile"######
# destinations
# file in cui dirigere i messaggi del modem
destination df_modem_volatile { file("/var/log/modem.volatile"); };
destination df_modem { file("/var/log/modem.log"); };
######
# logs
# collegamento tra sorgente e file
log {
source(s_modem);
destination(df_modem_volatile);
};
log {
source(s_modem);
destination(df_modem);
};
Volatile sta ad indicare che, non appena comparirà una riga magica nel log, verrà lanciato inadyn ed il log verrà svuotato, grazie a questo semplice script, lanciato da Cron ogni 5 minuti:#!/bin/sh
# il grep dev'essere adattato all'output del modem quando annuncia la connessione
if [ -s /var/log/modem.volatile ]; then
if grep -q "Connection Successfully Established" /var/log/modem.volatile; then
if ping -c 4 -w 5 -q www.google.it >/dev/null 2>&1 ; then
# il log esiste, il modem ha registrato una connessione e la connessione è ancora attiva
/usr/bin/inadyn --input_file /etc/inadyn.conf
# svuota il log
> /var/log/modem.volatile
fi
else
> /var/log/modem.volatile
fi
fi
exit 0L'input file per inadyn, /etc/inadyn.conf, contiene questa riga:--iterations 1 --dyndns_system default@freedns.afraid.org -a INDIRIZZO.DA.AGGIORNARE,AXfGt3hydtyXVD57SEg5csWEqwc8ujM4MkOwMg==La stringa incomprensibile alla fine non è altro che un hash di password ed url da aggiornare, ricavabile in questa pagina (http://freedns.afraid.org/dynamic/) (una volta registrati e configurato almeno un sottodominio (http://freedns.afraid.org/subdomain/)).
Si tratta del parametro php visibile nel link Direct URL che si trova in fondo al riquadro centrale a sinistra.
Torna all'indice.
Conclusioni.
Tutto questo a cosa serve?
Permette di avere un backup minimale in caso di disastri (ancora non...).
Si viene a conoscenza della nascita di eventuali problemi grazie alle mail sui log (Chi è quel pirla che ha cercato di loggarsi con la password ****?! Ah, io...).
La salute dell'hardware è sotto controllo grazie ai sensori (la 12V è meno stabile...).
In caso di traffico di rete anomalo se ne viene a conoscenza grazie ad una veloce occhiata ai grafici quotidiani (il vicino scrocca la wireless!).
Si può conservare uno storico della vita del pc (blackout, ventole che rallentano).
Il modem ha perso la portante e si è riconnesso.
E altro...
Scherzi a parte ho avuto modo di apprezzare i miei sforzi.
Bene, se avete critiche, offese, suggerimenti, scrivete pure!
In questa discussione proverò a condividere l'insieme di script e demoni che utilizzo per tenere sotto controllo un pc acceso 24/7, fornitore di vari servizi nella mia rete domestica.
Certamente questo non è l'unico modo, né il più semplice, per realizzare una cosa di questo tipo.
Soprattutto riguardo i punti 1 e 3 (i più corposi) so che esistono strumenti che permettono di monitorare sensori e sistema e millemila altre cose. Ma tutto era partito senza un disegno preciso, quindi, ad un certo punto, mi è nata la necessità di avere mail con questi dati e le ho create.
Per molto tempo sono stato indeciso sull'utilità di postare tutto questo; diciamo che se non altro saprò dove andare a cercare se mi scorderò qualche dettaglio!
Obiettivi
Monitoraggio hardware
Monitoraggio dei log + storico di tutti i boot (del sistema e degli apparati di rete che lo permettono)
Quantificazione del traffico di rete
Monitoraggio hard disk
Backup (protetto) delle porzioni fondamentali del sistema
Archiviazione in una risorsa internet gratuita e di semplice fruizione
Sincronizzazione DNS grazie a FreeDNS (http://freedns.afraid.org/)
Programmi utilizzati
Monitoraggio hardware.
Acquisizione dati: lm-sensors (http://www.lm-sensors.org/) + sensord (http://www.lm-sensors.org/wiki/man/sensord)
Archiviazione: RRDtool (http://oss.oetiker.ch/rrdtool/)
Rappresentazione dati: grafici quotidiani
.
Monitoraggio dei log.
Demone di logging: syslog-ng (http://www.balabit.com/network-security/syslog-ng/)
Analisi log ed invio e-mail: logcheck (http://logcheck.org/)
.
Quantificazione del traffico di rete.
Logging: script ad-hoc + cron (http://it.wikipedia.org/wiki/Cron)
Archiviazione: di nuovo RRDtool (http://oss.oetiker.ch/rrdtool/)
Rappresentazione dati: grafici quotidiani
.
Monitoraggio hard disk.
Monitoraggio S.M.A.R.T. (http://en.wikipedia.org/wiki/S.M.A.R.T.): smartd (http://smartmontools.sourceforge.net/man/smartd.8.html)
Logging: script ad-hoc + cron (http://it.wikipedia.org/wiki/Cron)
Archiviazione: di nuovo RRDtool (http://oss.oetiker.ch/rrdtool/)
Rappresentazione dati: grafici quotidiani
.
Backup (protetto) delle porzioni fondamentali del sistema.
Realizzato per mezzo di uno scrip ad-hoc + cron
Compressione: bzip2 (http://www.bzip.org/)
Codifica: pgp (http://it.wikipedia.org/wiki/Pretty_Good_Privacy) con password
.
Archiviazione in una risorsa internet gratuita e di semplice fruizione.
Archiviazione: gmail (http://mail.google.com/)
Invio dati: exim4 (http://www.exim.org/)
.
Sincronizzazione DNS
Aggiornamento indirizzo: inadyn (http://linux.die.net/man/8/inadyn) più uno script ad-hoc.
[1] Monitoraggio hardware.
Si potrà realizzare questo punto se l'hardware che si vuole analizzare è ufficialmente supportato: lm-sensors supported devices (http://www.lm-sensors.org/wiki/Devices).
Se l'hardware non è esplicitamente elencato si può comunque tentare il primo passo.
A. Individuazione e taratura dei sensori.
Installazione ed utlizzo di lm-sensors. (http://guide.debianizzati.org/index.php/I2c_e_lm-sensors)
In alcuni casi i valori ottenuti col comando sensors risulteranno un po' strani o fuoriscala, in tal caso è utile modificare la sezione del file /etc/sensors3.conf relativa al vostro chip dei sensori (man sensors.conf per dettagli, oltre all'ottima introduzione presente nel file stesso).
B. Installazione e configurazione sensord.
Ora si può installare il pacchetto sensord.
Il file di configurazione del demone è /etc/default/sensord.
Questo è la configurazione che ho scelto:
RRD_FILE=/var/log/sensord.rrd
RRD_INTERVAL=2m
RRD_LOADAVG=yes
Per poter procedere agevolmente ho rinnovato il sistema di logging ufficiale della mia distribuzione (Debian), rimuovendo sysklogd e klogd, rimpiazzandoli con il più versatile e moderno syslog-ng.
Effettuata la sostituzione ho disabilitato il logging standard di sensord (che stamperebbe le letture dei sensori nei log ad ogni invocazione), lasciando solo il file round-robin.
Se in seguito ad un aggiornamento il file rrd presentasse canali scambiati o mancanti è usualmente sufficiente fermare il servizio sensord, rimuovere il vecchio rrd (magari facendo un backup temporaneo) e riavviare il servizio. Il servizio genererà un nuovo file risistemando la situazione.
Per disabilitare il logging è necessario editare il file /etc/syslog-ng/syslog-ng.conf commentando le seguenti sezioni:
# sensord
#destination sensord { file("/var/log/sensord"); };
# ~-~-~-~
# sensord filter
#filter f_sensord {
# facility(local4);
#};
# ~-~-~-~
# sensord
#log {
# source(s_all);
# filter(f_sensord);
# destination(sensord);
#};
Assicuriamoci dell'avvio automatico di sensord controllando in rcconf (o con il vostro strumento preferito per il controllo degli script init).
C. Creazione dei grafici.
A questo punto abbiamo un file che memorizza circolarmente i dati dei sensori ogni due minuti con uno storico di una settimana.
Per ottenere dei grafici dai dati memorizzati possiamo utilizzare i versatili rrdtools:
# Esempio 2 voltaggi + carico CPU delle ultime 24 ore
rrdtool graph daily-voltages.png --imginfo '<IMG SRC=/sensord/%s WIDTH=%lu HEIGHT=%lu>' \
-a PNG -h 800 -w 800 -v 'Voltaggio (V)' \
-t 'Voltaggi Phoenix' -x 'HOUR:1:HOUR:3:HOUR:3:0:%b %d %H:00' \
-s -1d -l 0 -u 13 -r --slope-mode \
DEF:in0=/var/log/sensord.rrd:in0:AVERAGE \
DEF:in1=/var/log/sensord.rrd:in1:AVERAGE \
DEF:loadavg=/var/log/sensord.rrd:loadavg:AVERAGE \
LINE2:in0#1C0674:"+3.3V" \
LINE2:in1#2A961C:"Vtt1.2V" \
LINE2:loadavg#F52F1D:"loadavg" > /dev/null
Consultare man rrdgraph per comprendere le opzioni iniziali.
Per avere grafici con leggibilità ottimale è necessario assicurarsi di avere installati i font Dejavu (http://dejavu-fonts.org/wiki/index.php?title=Main_Page), disponibili pacchettizzati nelle principali distribuzioni.
Ciò che riguarda i nostri dati sono i DEF ed i LINE
DEF: pescano i "canali" dell'rrd, che hanno gli stessi nomi visti in /etc/sensors3.conf (in0, in1, ecc...); da notare loadavg, che è il carico della CPU il cui monitoraggio è stato abilitato in /etc/default/sensord (RRD_LOADAVG=yes).
LINE: il numero che segue immediatamente indica lo spessore della linea (2), poi vi è il canale (in0), quindi il colore in notazione html (#1C0674), per finire l'etichetta per la legenda ("+3.3V").
Torna all'indice.
[2] Monitoraggio dei log.
Per questa funzione mi sono affidato al semplice logcheck.
Una volta installato verrà eseguito automaticamente ogni ora, riportando su di una casella di posta selezionata tutte le linee dei log principali che sono estranee ad un normale funzionamento della macchina.
In caso di boot o reboot viene recapitato un messaggio differente, contenente l'intero dmesg/kernel.log, con titolo "Reboot: MACCHINA data ora".
Il file di configurazione principale è /etc/logcheck/logcheck.conf; ecco le mie scelte:
REPORTLEVEL="server"
SENDMAILTO="MIA_MAIL@gmail.com"
MAILASATTACH=0
**PUNTO FONDAMENTALE**
Per poter ricevere le mail inviate da exim al nostro account Gmail (quindi tutte le mail citate in questa discussione) sarà necessario seguire questa guida. (http://wiki.debian.org/GmailAndExim4)
Personalmente, utilizzando una buona quantità di demoni, ho avuto la necessità di modificare i filtri regexp di logcheck per ridurne la verbosità. Per quanto riguarda il filtraggio "server", si trovano nella cartella /etc/logcheck/ignore.d.server/.
Si tratta di espressioni regolari che corrispondono alle linee da ignorare.
APPENDICE
Trasformare syslog-ng in un server di logging di rete, su cui dirigere anche i log del modem (che naturalmente deve supportare la funzione di logging remoto/remote logging).
Aggiunte da fare al file /etc/syslog-ng/syslog-ng.conf (###### evidenzia la sezione modificata):
######
# sources
# all known message sources
source s_modem {
udp(ip(192.168.1.1) port(514));
};
######
# destinations
# file in cui dirigere i messaggi del modem
destination df_modem { file("/var/log/modem.log"); };
######
# logs
# collegamento tra sorgente e file
log {
source(s_modem);
destination(df_modem);
};
Abilitiamo quindi la rotazione del nuovo log creando un file /etc/logrotate.d/modem dal contenuto
/var/log/modem.log {
rotate 7
daily
compress
delaycompress
copytruncate
missingok
notifempty
}
Per finire diciamo a logcheck di monitorare anche questo file aggiungendo questa riga ad /etc/logcheck/logcheck.logfiles:
/var/log/modem.log
In caso di attivazione di logcheck è consigliabile controllare che il modem, soprattutto in fase di connessione, non spifferi dati sensibili; se accadesse si può pensare di lasciar perdere la cosa, oppure aggiungere opportuni filtri a logcheck (in /etc/logcheck/ignore.d.CLASSE_MONITORAGGIO).
Torna all'indice.
[3] Quantificazione del traffico di rete.
Questa è una buona guida su cui mi sono basato. (http://martybugs.net/linux/rrdtool/traffic.cgi)
Questo punto è simile al primo, ma occorre crearlo da zero.
Nella guida è stato utilizzato script Perl che ho preferito frammentare nelle unità funzionali e trasformarlo in script bash.
Si devono inizializzare i file rrd (notare DERIVE, cioè interpretare i dati alle variazioni):
#!/bin/bash
ETHS=$(/sbin/ifconfig | sed '/^eth\([[:digit:]]\{1,3\}\).*/!d ; s/\(\s\).*/\1/')
for ETH in $ETHS; do
rrdtool create /var/log/$ETH.rrd \
DS:in:DERIVE:600:0:12500000 \
DS:out:DERIVE:600:0:12500000 \
RRA:AVERAGE:0.5:1:576 \
RRA:AVERAGE:0.5:6:672 \
RRA:AVERAGE:0.5:24:732 \
RRA:AVERAGE:0.5:144:1460
done
Si deve quindi creare uno script di aggiornamento che da in pasto all'rrd il numero di byte transitati per l'interfaccia dalla sua attivazione:
#!/bin/sh
ETHS=$(/sbin/ifconfig | sed '/^eth\([[:digit:]]\{1,3\}\).*/!d ; s/\(\s\).*/\1/')
for ETH in $ETHS; do
IN=`/sbin/ifconfig $ETH |grep bytes|cut -d":" -f2|cut -d" " -f1`
OUT=`/sbin/ifconfig $ETH |grep bytes|cut -d":" -f3|cut -d" " -f1`
rrdtool update /var/log/$ETH.rrd -t in:out N:$IN:$OUT
done(Questi dati saranno poi interpretati tramite differenziale come impostato alla creazione del file, così otterremo la velocità media)
Dopodiché di deve inserire in cron lo script di aggiornamento (crontab -e); personalmente ho considerato un aggiornamento ogni 5 min. sufficiente (*/5).
Per finire si possono creare i grafici in maniera simile a come già illustrato (ma in modo più adeguato per le grandezze rappresentate):#!/bin/sh
ETHS=$(/sbin/ifconfig | sed '/^eth\([[:digit:]]\{1,3\}\).*/!d ; s/\(\s\).*/\1/')
for ETH in $ETHS; do
rrdtool graph $ETH.png --imginfo '<IMG SRC=/sensord/%s WIDTH=%lu HEIGHT=%lu>' \
-a PNG -h 80 -w 800 -v 'Bytes/sec' \
-t "Traffico $ETH" -x 'HOUR:1:HOUR:3:HOUR:3:0:%b %d %H:00' \
-s -1d --slope-mode \
DEF:in=/var/log/$ETH.rrd:in:AVERAGE \
DEF:out=/var/log/$ETH.rrd:out:AVERAGE \
CDEF:out_neg=out,-1,* \
VDEF:inmax=in,MAXIMUM \
VDEF:inavg=in,AVERAGE \
VDEF:outmax=out,MAXIMUM \
VDEF:outavg=out,AVERAGE \
AREA:in#32CD32:Incoming \
LINE1:in#336600 \
GPRINT:inmax:"Max\: %5.1lf %S" \
GPRINT:inavg:"Avg\: %5.1lf %S\\n" \
AREA:out_neg#4169E1:Outgoing \
LINE1:out_neg#0033CC \
GPRINT:outmax:"Max\: %5.1lf %S" \
GPRINT:outavg:"Avg\: %5.1lf %S"
done
Questo script è più avanzato; contiene:
CDEF out_neg calcolato con notazione polacca inversa
VDEF inavg, ..., outmax con cui vengono calcolati massimo e media sul periodo grazie alle funzioni MAXIMUM e AVERAGE
AREA che disegna un grafico pieno, non la linea del precedemte esempio
GPRINT che stampa una stringa tra i valori della legenda, usata per scrivere max e avg
Torna all'indice.
[4] Monitoraggio hard disk.
Utilizzando il demone smartd si possono tenere sotto osservazione i valori S.M.A.R.T. dei dischi fissi.
Solitamente ci si accorge che un disco ha qualche problema quando inizia a bloccare la macchina o "dimenticare" dati: utilizzando smartd si può venire a conoscenza di valori preoccupanti non appena questi compaiono.
Il file di configurazione è /etc/smartd.conf; questi sono i valori che ho utilizzato:
/dev/sda -d sat -n standby -H -I 194 -C 197 -U 198 -W 3,45,49 -m MIA_MAIL@gmail.com
Punto molto simile al precedente per quanto riguarda la raccolta dei dati.
Inizializzare i file rrd:
#!/bin/bash
for HDD in /dev/sd[[:alpha:]]; do
rrdtool create /var/log/$(basename "$HDD").rrd -s 300 \
DS:temp:GAUGE:600:0:100 \
RRA:AVERAGE:0.5:1:576 \
RRA:AVERAGE:0.5:6:672 \
RRA:AVERAGE:0.5:24:732 \
RRA:AVERAGE:0.5:144:1460
done
Script di aggiornamento che legge la temperatura dal sensore dei dischi:
#!/bin/sh
HDDTEMP="/usr/sbin/hddtemp"
for DEV in /dev/sd[[:alpha:]]; do
HDD=$(basename "$DEV")
rrdtool update /var/log/"$HDD".rrd -t temp N:$($HDDTEMP -n "$DEV")
done
Inserire in cron lo script di aggiornamento (crontab -e); anche in questo caso ho considerato un aggiornamento ogni 5 min. sufficiente (*/5).
Non ho creato un grafico specifico per i dischi, ma ho aggiunto il valore al grafico delle temperature degli altri sensori.
Invio di tutti i grafici.
#!/bin/sh
TEMP_DIR="/tmp"
DIR_CREATED=0
MAIL_TO="MIA_MAIL@gmail.com"
# Per circa mezz'ora resta in attesa della connessione
I=0
while ! ping -c 4 -w 5 -q www.google.it >/dev/null 2>&1 ; do
if [ $I -eq 9 ] ; then
echo "Connessione non disponibile: creazione grafici terminata."
exit 1
fi
sleep 120
I=$(($I+1))
done
if [ ! -d "$TEMP_DIR" ] ; then
if ! mkdir -p -- "$TEMP_DIR" ; then
echo "Creazione cartella temporanea fallita!"
exit 1
fi
DIR_CREATED=1
fi
echo -n "Plotting Graphs: voltages, "
# Dati voltaggi + carico CPU delle ultime 24 ore
rrdtool graph "$TEMP_DIR/daily-voltages.png" --imginfo '<IMG SRC=/sensord/%s WIDTH=%lu HEIGHT=%lu>' \
-a PNG -h 800 -w 800 -v 'Voltaggio (V)' \
-t 'Voltaggi Phoenix' -x 'HOUR:1:HOUR:3:HOUR:3:0:%b %d %H:00' \
-s -1d -l 0 -u 13 -r --slope-mode \
DEF:in0=/var/log/sensord.rrd:in0:AVERAGE \
DEF:in1=/var/log/sensord.rrd:in1:AVERAGE \
DEF:in2=/var/log/sensord.rrd:in2:AVERAGE \
DEF:in3=/var/log/sensord.rrd:in3:AVERAGE \
DEF:in4=/var/log/sensord.rrd:in4:AVERAGE \
DEF:in5=/var/log/sensord.rrd:in5:AVERAGE \
DEF:in6=/var/log/sensord.rrd:in6:AVERAGE \
DEF:in7=/var/log/sensord.rrd:in7:AVERAGE \
DEF:in8=/var/log/sensord.rrd:in8:AVERAGE \
DEF:loadavg=/var/log/sensord.rrd:loadavg:AVERAGE \
LINE2:in0#1C0674:"+3.3V" \
LINE2:in1#2A961C:"Vtt1.2V" \
LINE2:in2#5C93CE:"Vddr2" \
LINE2:in3#59F80F:"Vchip" \
LINE2:in4#424036:"+5V" \
LINE2:in5#B16C63:"+12V" \
LINE2:in6#442F18:"Vcc1.5V" \
LINE2:in7#790654:"Vcore" \
LINE2:in8#FBA71A:"5VSB" \
LINE2:loadavg#F52F1D:"loadavg" > /dev/null
FILES="$TEMP_DIR/daily-voltages.png"
echo -n "temperatures, "
# Dati temperature + carico CPU delle ultime 24 ore
rrdtool graph "$TEMP_DIR/daily-temperatures.png" --imginfo '<IMG SRC=/sensord/%s WIDTH=%lu HEIGHT=%lu>' \
-a PNG -h 400 -w 800 -v 'Temperatura (C)' \
-t 'Temperature Phoenix' -x 'HOUR:1:HOUR:3:HOUR:3:0:%b %d %H:00' \
-s -1d -l 10 --slope-mode \
DEF:temp2=/var/log/sensord.rrd:temp2:AVERAGE \
DEF:temp1_0=/var/log/sensord.rrd:temp1_0:AVERAGE \
DEF:temp_sda=/var/log/sda.rrd:temp:AVERAGE \
DEF:loadavg=/var/log/sensord.rrd:loadavg:AVERAGE \
CDEF:10_x_loadAvg=loadavg,10,* \
LINE2:temp2#7b23c6:"system" \
LINE2:temp1_0#D01717:"CPU" \
LINE2:temp_sda#790654:"Hard disk" \
LINE2:10_x_loadAvg#F52F1D:"10_x_loadAvg" > /dev/null
FILES="$FILES,$TEMP_DIR/daily-temperatures.png"
echo -n "fan speed, "
# Velocita' rotazione ventola nelle ultime 24 ore
rrdtool graph "$TEMP_DIR/daily-fan.png" --imginfo '<IMG SRC=/sensord/%s WIDTH=%lu HEIGHT=%lu>' \
-a PNG -h 400 -w 800 -v 'RPM' \
-t 'Ventola Phoenix' -x 'HOUR:1:HOUR:3:HOUR:3:0:%b %d %H:00' \
-s -1d -l 700 --slope-mode \
DEF:fan1=/var/log/sensord.rrd:fan1:AVERAGE \
LINE2:fan1#F52F1D:"Sys Fan" > /dev/null
FILES="$FILES,$TEMP_DIR/daily-fan.png"
echo -n "ethernet interfaces"
ETHS=$(/sbin/ifconfig | sed '/^eth\([[:digit:]]\{1,3\}\).*/!d ; s/\(\s\).*/\1/')
if [ ! -z "$ETHS" ] ; then
echo -n " ( "
for ETH in $ETHS; do
rrdtool graph "$TEMP_DIR/$ETH.png" --imginfo '<IMG SRC=/sensord/%s WIDTH=%lu HEIGHT=%lu>' \
-a PNG -h 80 -w 800 -v 'bytes/sec' \
-t "Traffico $ETH" -x 'HOUR:1:HOUR:3:HOUR:3:0:%b %d %H:00' \
-s -1d --slope-mode \
DEF:in=/var/log/$ETH.rrd:in:AVERAGE \
DEF:out=/var/log/$ETH.rrd:out:AVERAGE \
CDEF:out_neg=out,-1,* \
VDEF:inmax=in,MAXIMUM \
VDEF:inavg=in,AVERAGE \
VDEF:outmax=out,MAXIMUM \
VDEF:outavg=out,AVERAGE \
AREA:in#32CD32:"Incoming" \
LINE1:in#336600 \
GPRINT:inmax:"Max\: %5.1lf %S" \
GPRINT:inavg:"Avg\: %5.1lf %S\\n" \
AREA:out_neg#4169E1:"Outgoing" \
LINE1:out_neg#0033CC \
GPRINT:outmax:"Max\: %5.1lf %S" \
GPRINT:outavg:"Avg\: %5.1lf %S" > /dev/null
FILES="$FILES,$TEMP_DIR/$ETH.png"
echo -n "$ETH "
done
echo -n ")"
fi
echo "."
echo -n "Invio mail a $MAIL_TO..."
uptime | biabam $FILES -s "Phoenix sensors statistics `date`" $MAIL_TO
echo "Done."
echo -n "Rimozione "
if [ $DIR_CREATED -eq 1 ] ; then
if [ -d "$TEMP_DIR" ] ; then
echo -n "$TEMP_DIR"
rm -r -- "$TEMP_DIR"
echo "."
exit 0
else
echo "cartella \"$TEMP_DIR\" FALLITA!"
echo -n "Rimozione "
fi
fi
echo "file:"
FILES_ARR=$(echo "$FILES" | tr "," "\n")
for file in $FILES_ARR ; do
if [ -f "$file" ] ; then
echo "\"$file\""
rm -- "$file"
fi
done
exit 0
Questo script viene lanciato da un cronjob ogni mezzanotte.
Report mensile. Assicurarsi di avere sufficienti dati:rrdtool info /var/log/sensord.rrd | grep rows
rra[0].rows = 20160
Nel mio caso devono essere 21600 (30 campionamenti/h * 24 h * 30 gg):
rrdtool resize /var/log/sensord.rrd 0 GROW 1440
mv resize.rrd /var/log/sensord.rrd
Porzione script mensile con evidenziato parametro fondamentale:# Dati voltaggi + carico CPU
GRAFICO_TITOLO="Voltaggi $HOSTNAME_CAPITAL - $(date +%Y-%m-%d\ %H.%M.%S)"
FILE="$TEMP_DIR/monthly-voltages_$DATE.png"
rrdtool graph "$FILE" --imginfo '<IMG SRC=/sensord/%s WIDTH=%lu HEIGHT=%lu>' \
-a PNG -h 800 -w 800 -v 'Voltaggio (V)' \
-t "$GRAFICO_TITOLO" \
-s -1m -l 0 -u 13 -r --slope-mode -y 0.1:10 -L 1 \
DEF:in0=/var/log/sensord.rrd:in0:AVERAGE \
DEF:in1=/var/log/sensord.rrd:in1:AVERAGE \
DEF:in2=/var/log/sensord.rrd:in2:AVERAGE \
DEF:in3=/var/log/sensord.rrd:in3:AVERAGE \
DEF:in4=/var/log/sensord.rrd:in4:AVERAGE \
DEF:in5=/var/log/sensord.rrd:in5:AVERAGE \
DEF:in6=/var/log/sensord.rrd:in6:AVERAGE \
DEF:cpu0_vid=/var/log/sensord.rrd:cpu0_vid:AVERAGE \
DEF:in8=/var/log/sensord.rrd:in8:AVERAGE \
DEF:loadavg=/var/log/sensord.rrd:loadavg:AVERAGE \
LINE2:in0#1C0674:"+3.3V" \
LINE2:in1#2A961C:"Vtt1.2V" \
LINE2:in2#5C93CE:"Vddr2" \
LINE2:in3#59F80F:"Vchip" \
LINE2:in4#424036:"+5V" \
LINE2:in5#B16C63:"+12V" \
LINE2:in6#442F18:"Vcc1.5V" \
LINE2:cpu0_vid#790654:"CPU_vid" \
LINE2:in8#FBA71A:"5VSB" \
LINE2:loadavg#F52F1D:"loadavg" > /dev/null
Torna all'indice.
[5] Backup (protetto) delle porzioni fondamentali del sistema.
Obiettivo: salvare la minima quantità di dati sufficiente per ricreare un sistema gemello del "backuppato" in tempi brevi.
Mia ipotesi di soluzione: salvare TUTTA /etc, il config del kernel in uso ed un elenco dei pacchetti installati.
Svolgimento:
#!/bin/sh
PASSWORD="Password!"
HOSTNAME=`hostname`
HOSTNAME_CAPITAL=`printf %c $HOSTNAME | tr [:lower:] [:upper:]`${HOSTNAME#`printf %c $HOSTNAME`}
TEMP_DIR="/tmp"
FILES=""
DIR_CREATED=0
RETURN=0
MAIL_TO=MIA_MAIL@gmail.com
# Per due ore spera che la connessione funzioni...
I=0
while ! ping -c 4 -w 5 -q www.google.it >/dev/null 2>&1 ; do
if [ $I = 20 ] ; then
echo "Connessione non disponibile: backup annullato."
exit 1
fi
sleep 340
I=$(($I+1))
done
if [ ! -d "$TEMP_DIR" ] ; then
if ! mkdir -p -- "$TEMP_DIR" ; then
echo "Creazione cartella temporanea fallita!"
exit 1
fi
DIR_CREATED=1
fi
echo -n "Elenco dei pacchetti installati"
PACKAGES="packages-snapshot-`date +%Y-%m-%d_%H.%M.%S`"
if dpkg --get-selections > "$TEMP_DIR/$PACKAGES" ; then
FILES="$TEMP_DIR/$PACKAGES"
echo "."
else
PACKAGES=""
echo " Errore!"
fi
echo -n "Lista delle partizioni"
PARTITIONS="fdisk_-l"
if /sbin/fdisk -l > "$TEMP_DIR/$PARTITIONS" ; then
FILES="$FILES $TEMP_DIR/$PARTITIONS"
echo "."
else
PARTITIONS=""
echo " Errore!"
fi
# bz2
FILE="$TEMP_DIR/$HOSTNAME.tar.bz2"
if [ -d "$TEMP_DIR" ] ; then
cd "$TEMP_DIR"
fi
tar -cjf "$FILE" \
"$PACKAGES" \
"$PARTITIONS" \
--preserve-permissions /etc \
--preserve-permissions /boot/config-`uname -r` \
--preserve-permissions /boot/grub/menu.lst \
--preserve-permissions /var/spool/cron/crontabs \
>/dev/null 2>&1
if [ $? -eq 0 ] ; then
FILES="$FILES $FILE"
echo "."
else
echo " Errore creando il tar!"
RETURN=1
fi
if [ $RETURN -eq 0 ] ; then
echo -n "gpg"
FILE="$TEMP_DIR/$HOSTNAME.tar.bz2"
if gpg -q --yes -c --passphrase "$PASSWORD" "$FILE" ; then
echo " Done!"
echo -n "Invio mail a $MAIL_TO... "
FILE="$FILE.gpg"
FILES="$FILES $FILE"
date | biabam "$FILE" -s "$HOSTNAME_CAPITAL backup `date`" "$MAIL_TO"
echo "done."
else
echo " Errore creando il gpg!"
RETURN=1
fi
fi
echo -n "Rimozione "
if [ $DIR_CREATED -eq 1 ] ; then
if [ -d "$TEMP_DIR" ] ; then
echo -n "$TEMP_DIR"
rm -r -- "$TEMP_DIR"
echo "."
exit 0
else
echo "cartella \"$TEMP_DIR\" FALLITA!"
echo -n "Rimozione "
fi
fi
echo "file:"
FILES_ARR=$(echo "$FILES" | tr "," "\n")
for file in $FILES_ARR ; do
if [ -f "$file" ] ; then
echo "\"$file\""
rm -- "$file"
fi
done
exit $RETURNQuesto script viene lanciato da cron una volta alla settimana.
Torna all'indice.
[6] Archiviazione in una risorsa internet gratuita e di semplice fruizione.
Il passaggio chiave di questo punto riguarda la modifica della configurazione di exim4 come smarthost per Gmail, come già evidenziato precedentemente, seguendo questa guida. (http://wiki.debian.org/GmailAndExim4)
Personalmente non ho idea di come sia il rapporto di exim4 con altri servizi e-mail.
Naturalmente ci sono alcuni aspetti da tenere in considerazione, principalmente:
Protezione/privacy: i dati del sistema sono protetti pgp (mi sono accontentato della password, ma niente nega di usare una chiave), in mesi di utilizzo non ho trovato dati sensibili nei log inviati usualmente da logcheck, inoltre gmail è abbastanza sicura ed in continuo miglioramento.
La password della mail sarà scritta in chiaro in un file sul vostro computer, per questo ho impostato Exim come smarthost della mia mail secondaria (quella per gli esperimenti...), inviandole però alla mia mail primaria, la cui password non sarà scritta da nessuna parte.
Spazio disponibile: mentre sto scrivendo, dopo circa 3 anni col sistema a pieno regime (più altri 6 mesi parziali), ho occupato ~600 mega sui 10 giga disponibili.
Ordine: grazie alle etichette di Gmail ed alla standardizzazione dei messaggi è possibile smistarli ed archiviarli senza problemi.
Le mie semplici etichette sono:
Phoenix: filtro "from: (logcheck system account)"
Phoenix backup: filtro "from:root subject: (Phoenix backup)"
Phoenix sensors: filtro "from:root subject: (Phoenix sensors)"
Come suggerito da omerook (http://hwupgrade.it/forum/showpost.php?p=37964860&postcount=14) è anche possibile fare in modo che GMail ci avvisi offline, tramite SMS (http://www.navigaweb.net/2012/04/ricevere-le-mail-gmail-via-sms-sul.html), dell'arrivo di qualche email importante.
Tra le mail descritte in questa discussione penserei soprattutto agli allarmi di smartd sulla salute dei dischi.
Torna all'indice.
[7] Sincronizzazione DNS.
Prima di tutto: perché FreeDNS (http://freedns.afraid.org/)? Perché i domini disponibili su DynDNS fanno schifo... resta che altri fornitori di strumenti DNS non necessitano di un piccolo hack come FreeDNS per aggiornare il record.
Bene, ricordate la questione del logging centralizzato per la rete (appendice punto [2])? Ho pensato di utilizzarlo per capire quando è necessario contattare i server per aggiornare il record DNS.
Una modifica ad /etc/syslog-ng/syslog-ng.conf ed ho creato un log "volatile"######
# destinations
# file in cui dirigere i messaggi del modem
destination df_modem_volatile { file("/var/log/modem.volatile"); };
destination df_modem { file("/var/log/modem.log"); };
######
# logs
# collegamento tra sorgente e file
log {
source(s_modem);
destination(df_modem_volatile);
};
log {
source(s_modem);
destination(df_modem);
};
Volatile sta ad indicare che, non appena comparirà una riga magica nel log, verrà lanciato inadyn ed il log verrà svuotato, grazie a questo semplice script, lanciato da Cron ogni 5 minuti:#!/bin/sh
# il grep dev'essere adattato all'output del modem quando annuncia la connessione
if [ -s /var/log/modem.volatile ]; then
if grep -q "Connection Successfully Established" /var/log/modem.volatile; then
if ping -c 4 -w 5 -q www.google.it >/dev/null 2>&1 ; then
# il log esiste, il modem ha registrato una connessione e la connessione è ancora attiva
/usr/bin/inadyn --input_file /etc/inadyn.conf
# svuota il log
> /var/log/modem.volatile
fi
else
> /var/log/modem.volatile
fi
fi
exit 0L'input file per inadyn, /etc/inadyn.conf, contiene questa riga:--iterations 1 --dyndns_system default@freedns.afraid.org -a INDIRIZZO.DA.AGGIORNARE,AXfGt3hydtyXVD57SEg5csWEqwc8ujM4MkOwMg==La stringa incomprensibile alla fine non è altro che un hash di password ed url da aggiornare, ricavabile in questa pagina (http://freedns.afraid.org/dynamic/) (una volta registrati e configurato almeno un sottodominio (http://freedns.afraid.org/subdomain/)).
Si tratta del parametro php visibile nel link Direct URL che si trova in fondo al riquadro centrale a sinistra.
Torna all'indice.
Conclusioni.
Tutto questo a cosa serve?
Permette di avere un backup minimale in caso di disastri (ancora non...).
Si viene a conoscenza della nascita di eventuali problemi grazie alle mail sui log (Chi è quel pirla che ha cercato di loggarsi con la password ****?! Ah, io...).
La salute dell'hardware è sotto controllo grazie ai sensori (la 12V è meno stabile...).
In caso di traffico di rete anomalo se ne viene a conoscenza grazie ad una veloce occhiata ai grafici quotidiani (il vicino scrocca la wireless!).
Si può conservare uno storico della vita del pc (blackout, ventole che rallentano).
Il modem ha perso la portante e si è riconnesso.
E altro...
Scherzi a parte ho avuto modo di apprezzare i miei sforzi.
Bene, se avete critiche, offese, suggerimenti, scrivete pure!