#!/bin/bash
#################################################################
# Stat de disponibilite du WEB
# Cible : Open DNS / DNS Google
#
# Fichiers en sortie dans /var/www/html/log
# wan_last_down : contient le log de la derniere perte Internet
# wan_log       : status des pertes de connexion
# wan_router_status : etat courant du routeur
# wan_status    : log de la panne Internet courante
#                 ce fichier disparait en mode normal
#
# Mode operatoire
# On teste l'acces au WAN via un premier DNS. 
# Si celui-ci est OK : fin du test.
# Si le premier DNS reste muet on teste le second.
# Le WAN est considere comme inaccessible si les 2 DNS sont muets
#
# cree le : 31 Mai 2014
#         : 
#         : 
#         : 
#         : 
#
#################################################################

# Cibles WAN
TRGT_1="208.67.222.222"
TRGT_2="8.8.8.8"

# Adresse routeur
TRGT_3="192.168.1.254"

# Definition des fichiers cibles
  # WAN
WAN_LOG="/var/www/html/log/wan_log"
WAN_STA="/var/www/html/log/wan_status"

  # LAN
RTR_STA="/var/www/html/log/wan_router_status"

# Recuperation date
a_sec=$(date +%s)
a_dat=$(date -u +%Y-%m-%d/%H:%M)

# init des resultats
png_rslt_1=""
png_rslt_2=""
png_rslt_3=""

# init du fichier de log
touch $WAN_LOG
if [ ! -s $WAN_LOG ] ; then
  echo $a_sec" "$a_dat" Depart WAN monitoring" > $WAN_LOG
fi

# test routeur
# creer la premiere ligne si fichier vide ou absent
touch $RTR_STA
if [ ! -s $RTR_STA ] ; then
  echo $a_sec " "$a_dat" start ROUTER monitoring" > $RTR_STA
fi

# obtenir la derniere ligne du status routeur
last_line=$(tail -n 1 $RTR_STA)

# obtenir le status du routeur
png_rslt_3=$(ping -c 1 -W 1 $TRGT_3)
if [ $? = 1 ] ; then
# dans ce cas le routeur est injoignable
  echo $last_line | grep "injoignable" > /dev/null
  if [ $? -eq 1 ] ; then
    # le routeur est nouvellement injoignable, informer status file
    echo $a_sec" "$a_dat" Routeur injoignable" >> $RTR_STA
  fi
  # le routeur est injoignable, tests suivants inutiles
  exit

else
  # le routeur est joignable, quel etait son etat
  echo $last_line | grep "injoignable" > /dev/null
  if [ $? -eq 0 ] ; then
    # il est enfin joignable : informer status file
    echo $a_sec" "$a_dat" Routeur actif" >> $RTR_STA
  fi
fi

# le routeur est joignable dans le LAN
# WAN est-il actif ?
# tester acces OpenDNS sur 3 ping max
try=3

png_rslt_1=$(ping -c $try -W 1 $TRGT_1)
if [ $? = 1 ] ; then
  # pas de Open DNS 
  png_rslt_1="no OpenDNS"
  # si openDNS non joignable tester Google DNS
  png_rslt_2=$(ping -c $try -W 1 $TRGT_2)
  if [ $? = 1 ] ; then
    # pas de Google DNS
    png_rslt_2="no GoogDNS"
  else
    png_rslt_2=": Open DNS OK :"
  fi
else
  png_rslt_1=" Google DNS OK"
  png_rslt_2=" Open DNS   N/A"
fi

png_sta=$png_rslt_1" "$png_rslt_2
png_err=$a_sec" "$a_dat" "$png_sta

# ===============
# debug
#echo ":"$png_rslt_1":"$(stat -c %s $WAN_STA)
# ===============

# si la ligne contient au moins 1 OK le WAN est vivant
echo $png_err | grep "OK" > /dev/null
if [ $? -eq 0 ] ; then
  # cas du WAN vivant
  # quel etait l'etat anterieur
  head -n 1 $WAN_LOG | grep "active"> /dev/null
  if [ $? -eq 1 ] ; then
    # fin des erreurs WAN la ligne ne contient pas "active"
    # obtenir le down time
    last_down=$(head -n 1 $WAN_LOG | cut -d " " -f 1)
    let time_down=$a_sec-$last_down
    # preparer la ligne de status retour a la normale
    echo $a_sec" "$a_dat" Back to active after "$time_down" seconds" > /tmp/png_err_1
  else
    # le WAN est vivant et l'etait avant : on sort
    exit
  fi
else
  # cas du WAN HS
  # quel etait l'etat anterieur
  head -n 1 $WAN_LOG | grep "active"> /dev/null
  if [ $? -eq 0 ] ; then
    # debut des erreurs WAN
    # preparer la ligne de status debut panne WAN
    echo $a_sec" "$a_dat" Routeur actif / "$png_sta > /tmp/png_err_1
  else
    # le WAN est mort et l'etait avant : on sort
    exit
  fi
fi

# append info en tete de fichier de log
mv $WAN_LOG /tmp/png_err_log
cat /tmp/png_err_1 /tmp/png_err_log > $WAN_LOG
