C'est évidement quand on est absent qu'on a une coupure de courant.
Et c'est toujours quand le congélateur est plein...
J'ai donc un script sur le nas qui envoie un mail toute les 2 heures (heartbeat) à mon_nas@gmail.com via le même compte mail.
Un script google tourne sur cette adresse mail afin de traiter les mails venant du nas, de les archiver, mettre à jour un fichier de log et me prévenir par mail si le nas n'envoie pas de mail sous 2 heures (dans ce cas, mon voisin interviendra pour rétablir le courant).
Et c'est toujours quand le congélateur est plein...
J'ai donc un script sur le nas qui envoie un mail toute les 2 heures (heartbeat) à mon_nas@gmail.com via le même compte mail.
Un script google tourne sur cette adresse mail afin de traiter les mails venant du nas, de les archiver, mettre à jour un fichier de log et me prévenir par mail si le nas n'envoie pas de mail sous 2 heures (dans ce cas, mon voisin interviendra pour rétablir le courant).
Création du script sur votre nas
Création du script /ffp/bin/send-email-keepalive.sh :
#!/ffp/bin/shRendre exécutable ce script :
NAIL=/ffp/bin/esmtp
SUBJECT="[nas1] Keepalive"
FROM_ADDR="mon_nas@gmail.com"
TO_ADDR="mon_nas@gmail.com"
TMPFILE=`mktemp -t keepalive.XXXXXXXXXX`
date > /tmp/send-email-keepalive.out
echo "To: $TO_ADDR
Subject: $SUBJECT
From: $FROM_ADDR
I'm alive... cool...$TR_TIME_LOCALTIME" >$TMPFILE
$NAIL -tv $TO_ADDR < $TMPFILE >> /tmp/send-email-keepalive.out 2>&1
rm $TMPFILE
# chmod +x /ffp/bin/send-email-keepalive.sh
Mise à jour du cron au démarrage du nas
Création du script /ffp/start/crond.sh :
#!/ffp/bin/sh
# PROVIDE: crond
# REQUIRE: LOGIN
. /ffp/etc/ffp.subr
name="crond"
start_cmd="crond_start"
stop_cmd="crond_stop"
status_cmd="crond_status"
crond_start()
{
cronfile=/var/run/crond.pid
#get the pid, if it exists
if [ ! -f $cronfile ];then
crond -b -L /mnt/HD_a2/logs/cron.log
return
fi
thispid=`cat $cronfile`
if [ ! -d /proc/$thispid ];then
crond -b -L /mnt/HD_a2/logs/cron.log
return
else
echo "crond is already running"
fi
}
crond_stop()
{
cronfile=/var/run/crond.pid
#get the pid, if it exists
if [ ! -f $cronfile ];then
echo "crond is not running"
return
fi
thispid=`cat $cronfile`
if [ ! -d /proc/$thispid ];then
echo "crond is not running"
else
kill -9 $thispid
fi
}
crond_status()
{
cronfile=/var/run/crond.pid
#get the pid, if it exists
if [ ! -f $cronfile ];then
echo "crond is not running"
return
fi
thispid=`cat $cronfile`
if [ ! -d /proc/$thispid ];then
echo "crond is not running"
else
echo "crond is running normally"
fi
}
run_rc_command "$1"
Création du script /ffp/start/cronjobs.sh :
Ajoute une tache au cron pour envoyer un mail toutes les 2 heures.
Ajoute une tache au cron pour envoyer un mail toutes les 2 heures.
#!/ffp/bin/shRendre exécutable le script :
# PROVIDE: cronjobs
# REQUIRE: LOGIN
. /ffp/etc/ffp.subr
name="cronjobs"
start_cmd="cronjobs_start"
stop_cmd="cronjobs_stop"
status_cmd="cronjobs_status"
# si le cronjobs tourne sur un autre user que root :
cron_user=""
cronjobs_start()
{
# Report jobs log to an email address
echo "EMAIL=" > /tmp/cronjobs
echo "0 0-23/2 * * * /ffp/bin/send-email-keepalive.sh > /dev/null" >>/tmp/cronjobs
# Import jobs to service
crontab -u $cron_user /tmp/cronjobs
echo "setting the following cron jobs:"
cat /tmp/cronjobs
rm /tmp/cronjobs
}
cronjobs_stop(){
echo "" >>/tmp/cronjobs
crontab -u $cron_user /tmp/cronjobs
echo "removing all cron jobs"
rm /tmp/cronjobs
}
cronjobs_status()
{
echo "status not available"
}
run_rc_command "$1"
# chmod +x /ffp/start/crond.sh
# chmod +x /ffp/start/cronjobs.sh
Création du script Google apps
Ouvrir une session Drive sur mon_nas@gmail.com
Créer un spreadsheet (feuille de calcul).
Editer un script (Outils>Editeur de Script) et coller le script ci-dessous :
/** Search mail KeepAlive **/
function searchMailKeepalive() {
// get all threads keepalive in inbox
var dayBefore = new Date();
dayBefore.setDate(dayBefore.getDate()+2);
var dayAfter = new Date();
dayAfter.setDate(dayAfter.getDate()-1);
var NasThread = GmailApp.search('in:inbox from:(mon_nas@gmail.com) subject:"[nas1] Keepalive" before:' + Utilities.formatDate(dayBefore, "GMT+1", "yyyy/MM/dd") + ' after:' + Utilities.formatDate(dayAfter, "GMT+1", "yyyy/MM/dd"));
// if more message in a thread, archive and log all message
if (NasThread.length >= 1) {
// archive mail and log info
for (var i = 0; i < NasThread.length; i++) {
NasThread[i].markRead();
var label = GmailApp.getUserLabelByName("nas1");
NasThread[i].addLabel(label);
NasThread[i].moveToArchive();
var dateMail = Utilities.formatDate(NasThread[i].getLastMessageDate(), "GMT+1", "dd/MM/yyyy HH:mm");
var etatNas = "OK";
logInfo(dateMail, etatNas);
}
// Purge older mail
PurgeMail(label);
}
else {
// Envoie un mail d'avertissement sur votre compte mail moi@gmail.com MailApp.sendEmail("moi@gmail.com", "[nas1] **WARNING**", "Pas de mail du nas aujourd'hui... Etrange!");
logInfo("", "No mail.. Arg.");
}
};
function logInfo(dateMail, etatNas) {
// Log status script in the spreadsheet
var sheet = SpreadsheetApp.getActiveSheet();
var logdate = Utilities.formatDate(new Date(), "GMT+1", "dd/MM/yyyy HH:mm");
sheet.appendRow([logdate, dateMail, etatNas]);
}
function PurgeMail(Label) {
// Delete keepalive message older 15 days in 'Label'
var oneMonthBefore = new Date();
oneMonthBefore.setDate(oneMonthBefore.getDay() - 15);
var NasThread = GmailApp.search('in:' + Label.getName() + ' from:(monnas@gmail.com) subject:"[nas1] Keepalive" before:' + Utilities.formatDate(oneMonthBefore, "GMT+1", "yyyy/MM/dd"));
GmailApp.moveThreadsToTrash(NasThread);
}
Exécuter le script et valider les autorisations.
Paramétrage de l'exécution automatique (Ressources>Déclencheurs du script actuel)
searchMailKeepAlive - Time-driven - Hour timer - Every 2 hours
Voila, votre script se déclanchera toutes les 2 heurs mettra à jour le spreadsheet et vous enverra un mail en cas de non communication avec votre nas.
Comments
Post a Comment