Mon nas est-il en vie?

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).

Création du script sur votre nas

Création du script /ffp/bin/send-email-keepalive.sh :
#!/ffp/bin/sh

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
Rendre exécutable ce script :
# 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.
#!/ffp/bin/sh
# 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"
Rendre exécutable le script :
# 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