Senza andare troppo nel difficile, dovevo fare un'applicazioncina piccina picciò che doveva girare su di un NAS di categoria economica, il Qnap TS-212, anche solo per togliersi i dubbi sul funzionamento assieme al Capitano. Visto che non era mio, ma della ditta dove lavoro, mi sono astenuto dal fare modifiche pesanti, tipo l'installazione di una ubiqua - io la installerei anche nello sciacquone del bagno tanto mi ci trovo bene - Debian, ma sono rimasto al so originale. Le mie esigenze non sono tantissime, certo: posto che delle camere ip vi piazzano delle foto ogni tot secondi, devo solo fare in modo di rinominarle (le camere non lo fanno) ed evitare che se ne accumulino tera e tera. Occorre stare un pò attenti alle prestazioni: non è che installato sopra ci sia chissà quale processore. E ancora: essendo necessario che tutto scorra senza intervento manuale ne controlli, volevo che il programma venisse eseguito all'avvio, nessun intervento dell'operatore, e tanto meno da parte mia con ssl o Putty. Ma, nonostante che avessi seguito con cieca dedizione le guide del sito ufficiale, a volte veniva eseguito, a volte no. Quindi, per sicurezza, anche per gli schianti, l'ho messo pure in cron: ovviamente, viene rilanciato solo se non sta scorrendo... ma lasciatemi nel dubbio, credo che il tutto potesse essere più semplice.
Anzi tutto, dove le mettiamo? Le camere piazzano le immagini (bmp) in una directory condivisa, in una struttura tipo
- directorycondivisa
---- seriecamere
---------- ok
---------- ko
mettendole in ok e ko (servono per dei controlli dimensionali). Il NAS non è un mostro di potenza, e allora ho deciso di usare prima bash e python, poi, stressato dalle procedure del Qnap, solo in bash. Esisteranno due file, capgo e caprun. Capgo è quello che gestisce tutto, appoggiandosi ad inotifywait (è presente nel pacchetto inotify-tools). CapRun viene lanciato ogni 10 minuti, e se non trova CapGo in esecuzione, lo esegue (potrebbe essere crashato, ricordate chi l'ha scritto).
#!/bin/sh
# capgo
function procfile {
mydir=`dirname "$1"`
myfile=`basename "$1"`
extension=${myfile##*.}
mould=${mydir##$percorso}
mould=`echo $mould | tr "/" "-"`
newname=`date +"%Y%m%d-%H%M%S-%N"`"-$mould."$extension
deleteolds "$mydir"
#
if [ -f "$1" ]; then
mv "$1" "$mydir"/"$newname"
fi
}
#
function deleteolds {
maxfiles=100
roundfiles=20
gofiles=$(($maxfiles + $roundfiles))
fcount=`ls -1 $1 | wc -l`
if [ $fcount -gt $gofiles ]; then
ls -t "$1" | tail -n$roundfiles | while read line; do delfile "$1"/"$line"; done
fi
}
#
function delfile {
if [ -f "$1" ]; then
rm "$1"
fi
}
# -------------------------------------------------------------------------
percorso="/share/camere/"
cd "$percorso"
inotifywait -m -r --format '%w%f' -e close_write "$percorso" | while read line
do
if [ -f "$line" ]; then
procfile "$line"
fi
done
Il NAS mi ha stressato alla grande con gli autorun, le installazioni e i pacchetti aggiuntivi, Optware e ipkg, quindi, come dicevo, eseguo con cron il controllo dell'esecuzione del programma. Qui uso ps per controllare la situazione dell'altro eseguibile. Nota: gli square bracket dopo il grep, in questo caso, non sarebbero necessari, ma sarebbero utili nel caso volessi visionare eseguendolo lo stesso script, in autocontrollo!
#!/bin/sh
s=`ps aux | grep "[c]apgo"`
size=${#s}
if [ $size -gt 0 ]; then
echo "CapGo e' gia' in esecuzione"
exit 0
fi
echo "Eseguo CapGo..."
/usr/bin/capgo &
Non capendo comunque molto di come funzionano questi modelli di NAS, in ogni caso, mi sembra che ci sia un'aleatorietà non da poco in quello che facciamo, com'è possibile che un programma a volte venga eseguito e a volte no? E certo, dovrei leggere meglio i manuali :-)