#!/bin/sh
#==================================
# Script par Fredlime
# English Translation by Ikeke
#==================================
# Variables courantes du programme
#
model=`/bin/get_key_value /etc/synoinfo.conf upnpmodelname`
heure=`date +%Hh%M`
jour=`date +%d-%m-%Y`
script=`ps | grep $$ | grep -v grep | sed -e 's/^..*sh //' | awk '{print $1}'`
echo $script
#
#=====================================
# Creation du fichier de configuration
# si il n'existe pas => /etc/tps.conf
#=====================================
#
if test -f /etc/tps.conf
then
config="no"
else
config="yes"
printf "#\n# Script configuration of "$script"\n#\n" > /etc/tps.conf
#
 if test -f /opt/bin/esmtp
 then
 echo "tps-mail=\"yes\"" >> /etc/tps.conf
 else
 echo "tps-mail=\"no\"" >> /etc/tps.conf
 fi
#
 if test -f /opt/bin/rrdtool
 then
 echo "tps-graph=\"yes\"" >> /etc/tps.conf
 else
 echo "tps-graph=\"no\"" >> /etc/tps.conf
 fi
 if test -d /volume1/web
 then
 echo "tps-image=\"/volume1/web\"" >> /etc/tps.conf
 else
 echo "tps-image=\"/tmp\"" >> /etc/tps.conf
 fi
#
printf "#\ntps-temps=\"5\"\n#\n# Variables courantes\n#\ntps-jour=\""$jour"\"\n#\n" >> /etc/tps.conf
#
> /etc/tps.log
fi
#===================================
# Menu de configuration du script
# Cas ou on lance 'tps config'
# ou si premiere execution su script
#===================================
#
if test "$1" = "config" -o "$config" = "yes" -o "$1" = "info"
then
#-----------------------------
# recup des valeurs par defaut
#-----------------------------
tpsmail=`/bin/get_key_value /etc/tps.conf tps-mail`
tpsgraph=`/bin/get_key_value /etc/tps.conf tps-graph`
tpsimage=`/bin/get_key_value /etc/tps.conf tps-image`
tpstemps=`/bin/get_key_value /etc/tps.conf tps-temps`
jourlog=`/bin/get_key_value /etc/tps.conf tps-jour`
#
smtp=`/bin/get_key_value /etc/synoinfo.conf eventsmtp`
mail=`/bin/get_key_value /etc/synoinfo.conf eventmail1`
user=`/bin/get_key_value /etc/synoinfo.conf eventuser`
pass=`/bin/get_key_value /etc/synoinfo.conf eventpass`
#
#
 if test "$1" = "info"
 then
 status=`cat /etc/crontab | grep $script | sed -e "s/^.*root sh //"`
  if test "$status" = "$script"
  then
  status="Enabled"
  else
  status="Disabled"
  fi
 clear
 echo "##################################################################"
 echo " How to use the SCRIPT and informations about parameters to use "
 echo ""
 echo $script" config => Script configuration"
 echo $script" stop   => Disable this script"
 echo $script" start  => Enable this script"
 echo $script" info   => Script status"
 echo $script" mail   => Immediatly send an email"
 echo $script"        => Generate a temperature statement in database"
 echo ""
 echo "Send email => "$tpsmail
 echo "      MAIL => "$mail
 echo "      SMTP => "$smtp
 echo "      USER => "$user" useful with some I.S.P"
 echo "      PASS => "$pass" useful with some I.S.P"
 echo ""
 echo "Graph creation  => "$tpsgraph
 echo "Image folder    => "$tpsimage
 echo ""
 echo "Time interval  = "$tpstemps" minutes"
 echo "Current day    = "$jourlog
 echo "Script status  = "$status
 echo ""
 echo ""
 exit
 fi
#
 if test -f /opt/bin/esmtp
 then
 echo
 printf "Send eMail yes/no : ("$tpsmail") \c" ; read q
  if test "$q" != ""
  then
  tpsmail=$q
  cat /etc/tps.conf | sed -e 's/tps-mail="..*"/tps-mail="'$tpsmail'"/' > /etc/tps.conf
  fi
 echo
 echo "Email address => "$mail
 echo "Smtp Server   => "$smtp
 echo "Login         => "$user
 echo "Password      => "$pass
 fi
#
 if test -f /opt/bin/rrdtool
 then
 printf "\nGraphical function yes/no : ("$tpsgraph") \c" ; read q
  if test "$q" != ""
  then
  tpsgraph=$q
  fi
  if test "$tpsgraph" = "yes"
  then
   while test "$ok" != "ok"
   do
   printf "\nImage Folder, by default => "$tpsimage" :  \c" ; read q
    if test "$q" != ""
    then
    tpsimage=$q
    fi
    if test -d $tpsimage
    then
    ok="ok"
    else
    echo ""
    echo "Error, entered path to store the "
    echo "graph file doesn't exist !!"
    echo ""
    fi
   done
  fi
 cat /etc/tps.conf | sed -e 's/tps-graph="..*"/tps-graph="'$tpsgraph'"/' > /etc/tps.conf
 tpsimage="tps-image=\""`echo $tpsimage | sed -e "s/\//slash/g"`
 cat /etc/tps.conf | sed -e 's/tps-image="..*/'$tpsimage'"/' | sed -e "s/slash/\//g" > /etc/tps.conf
 fi
#
#
echo
printf "\nTime between each statements (minutes) : ("$tpstemps") \c" ; read q
 if test "$q" != ""
 then
 tpstemps=$q
 cat /etc/tps.conf | sed -e 's/tps-temps="..*"/tps-temps="'$tpstemps'"/' > /etc/tps.conf
 fi
fi
#================================
# Cas ou on lance le script avec 
# 'config' ou 'stop' ou 'start'
#================================
#
if test "$1" = "stop" -o "$1" = "start" -o "$config" = "yes"
then
/bin/killall crond
echo "Script halted"
#------------------------------------------------------
# Supression des lignes qui lancent le script dans
# le fichier /etc/rc.local => particularite du CS-406
# le fichier /etc/crontab  => particularite des SYNO
#------------------------------------------------------
 if test "$model" = "CS-406"
 then
 /bin/cat /etc/rc.local | grep -v $script > /etc/rc.local
 fi
/bin/cat /etc/crontab | grep -v $script > /etc/crontab
#-------------------------------
# Cas ou on lance le script avec
# 'config' ou 'start'
#-------------------------------
 if test "$1" = "start" -o "$config" = "yes"
 then
 echo "Script is starting !!"
 tpstemps=`/bin/get_key_value /etc/tps.conf tps-temps`
  if test "$model" = "CS-406"
  then
  echo "killall crond # "$script >> /etc/rc.local
  echo "echo \"*/"$tpstemps" * * * * root sh "$script"\" >> /etc/crontab" >> /etc/rc.local
  echo "/usr/sbin/crond # "$script  >> /etc/rc.local
  fi
 echo "*/"$tpstemps" * * * * root sh "$script  >> /etc/crontab
 fi
#--------------------
# On sort du script
# et on relance crond
#--------------------
/usr/sbin/crond
exit
fi
#=================================================================================================
# Releve la temperature des disques
#=================================================================================================
#
cd /dev
nbrdisk=0
for bo in `/bin/ls hd?`
do
t=`/opt/sbin/smartctl -A $bo | grep "Temperature_Celsius" | awk '{print $10}'`
 if test "$t" != ""
 then
 h=`/opt/sbin/smartctl -A $bo | grep "Power_On_Hours" | awk '{print $10}'`
 nbrdisk=`expr $nbrdisk + 1`
 temp=$temp" "$t
 dure=$dure" disk"$nbrdisk"= "$h"   "
 fi
done
temp=`echo $temp | sed -e "s/^ //"`
Tmax=`echo $temp | awk '{print $1"\n"$2"\n"$3"\n"$4}' | sort | tail -1`
Tmin=`echo $temp | awk '{print $1"\n"$2"\n"$3"\n"$4}' | grep -v "^$" | sort -r | tail -1`
delta=`expr $Tmax - $Tmin`
Tmoy=`echo $temp | awk '{print ($1+$2+$3+$4)/'$nbrdisk' }'`
#
#=====================
# Traitement graphique
#=====================
tpsgraph=`/bin/get_key_value /etc/tps.conf tps-graph`
if test "$tpsgraph" = "yes"
then
tpsimage=`/bin/get_key_value /etc/tps.conf tps-image`"/tps-"`hostname`".png"
tempsrdd=`/opt/bin/rrdtool info /etc/tps.rrd 2> /dev/null | grep -i step | awk '{print $3 / 60}'`
tpstemps=`/bin/get_key_value /etc/tps.conf tps-temps`
#
#-------------------------------
# Test si la base existe avec
# le  temps des releves, sinon
# creation de la base de donnees
#-------------------------------
 if test "$tpstemps" = "$tempsrdd"
 then
 /opt/bin/rrdtool update /etc/tps.rrd N:$Tmoy:$delta
 printf "Creation of the Temperature Graph \c"
#
#---------------------------------------------
# Generation du Graphique special Cube Station
# avec 1 ou plusieurs disques
#---------------------------------------------
  if test "$model" = "CS-406"
  then
#
/opt/bin/rrdtool graph $tpsimage -w 500 -h 100 \
--title `hostname`" => SYNOLOGY "$model" on "$jour"  "$heure  \
--vertical-label "Degrees C" \
--x-grid MINUTE:15:HOUR:1:HOUR:2:0:%Hh00  \
--imgformat PNG  \
--color MGRID#337fbf   \
--color FRAME#808080   \
--color ARROW#FF0099   \
DEF:disque=/etc/tps.rrd:disque:AVERAGE \
DEF:deltad=/etc/tps.rrd:deltad:AVERAGE \
VDEF:max=disque,MAXIMUM  \
LINE2:max#ff0000  \
CDEF:flaming1=disque,40,*,100,/  \
CDEF:flaming2=disque,5,*,100,/   \
AREA:flaming1#ffff5f   \
STACK:flaming2#fffc51  \
STACK:flaming2#fffc51  \
STACK:flaming2#fff046  \
STACK:flaming2#ffe95f  \
STACK:flaming2#ffd237  \
STACK:flaming2#ffc832  \
STACK:flaming2#ffbe2d  \
STACK:flaming2#ffaa23  \
STACK:flaming2#ff9619  \
STACK:flaming2#ff841e  \
STACK:flaming2#ff841e  \
STACK:flaming2#ff6600:"Disks Temperatures"  \
GPRINT:disque:MAX:"Maxi %2.0lf"  \
GPRINT:disque:MIN:"Mini %2.0lf"  \
GPRINT:disque:AVERAGE:"Aver. %2.1lf"  \
GPRINT:deltad:AVERAGE:"Max Diff. %2.1lf"  \
GPRINT:disque:LAST:"Last measure %2.0lf"  \
COMMENT:"\n"  \
COMMENT:"                                  ---------------------------- \n"  \
COMMENT:"     Time Counter $dure"
#
#
#---------------------------------------------
# Generation du Graphique pour les autres SYNO
# avec 1 disque uniquement
#---------------------------------------------
  else
  dure=`echo $dure | awk '{print $2}'`
  /opt/bin/rrdtool graph $tpsimage -w 500 -h 100 \
  --title `hostname`" => SYNOLOGY "$model" on "$jour"  "$heure  \
  --vertical-label "Degrees C" \
  --x-grid MINUTE:15:HOUR:1:HOUR:2:0:%Hh00  \
  --imgformat PNG  \
  --color MGRID#337fbf   \
  --color FRAME#808080   \
  --color ARROW#FF0099   \
  DEF:disque=/etc/tps.rrd:disque:AVERAGE \
  VDEF:max=disque,MAXIMUM  \
  LINE2:max#ff0000  \
  CDEF:flaming1=disque,40,*,100,/  \
  CDEF:flaming2=disque,5,*,100,/   \
  AREA:flaming1#ffff5f   \
  STACK:flaming2#fffc51  \
  STACK:flaming2#fffc51  \
  STACK:flaming2#fff046  \
  STACK:flaming2#ffe95f  \
  STACK:flaming2#ffd237  \
  STACK:flaming2#ffc832  \
  STACK:flaming2#ffbe2d  \
  STACK:flaming2#ffaa23  \
  STACK:flaming2#ff9619  \
  STACK:flaming2#ff841e  \
  STACK:flaming2#ff841e  \
  STACK:flaming2#ff6600:"Disk Temperature"  \
  GPRINT:disque:MAX:"Maxi %2.0lf"  \
  GPRINT:disque:MIN:"Mini %2.0lf"  \
  GPRINT:disque:AVERAGE:"Aver. %2.2lf"  \
  GPRINT:disque:LAST:"Last measure %2.0lf ("$dure" hours)"
#  
  fi
#
 else
 echo "Initialization of rrdtool database"
 step=`expr $tpstemps \* 60`
 inte=`expr $step \* 2`
/opt/bin/rrdtool create /etc/tps.rrd -s $step \
DS:disque:GAUGE:$inte:U:U  \
DS:deltad:GAUGE:$inte:U:U  \
RRA:AVERAGE:0.5:1:288
 fi
fi
#
#=====================
# Traitement par Mail
#=====================
#
tpsmail=`/bin/get_key_value /etc/tps.conf tps-mail`
if test "$tpsmail" = "yes"
then
#
jourlog=`/bin/get_key_value /etc/tps.conf tps-jour`
tpstemps=`/bin/get_key_value /etc/tps.conf tps-temps`
#
 if test -f /etc/tps.log
 then
#
# test si le jour a change ou bien
# si on a lance le script avec l'option mail
#
  if test "$jourlog" != "$jour" -o "$1" = "mail"
  then
  echo "Preparing email..."
#-----------------------------------------------
# Dans ce cas, on prepare le mail et on l'envoie
#-----------------------------------------------
/bin/cat /etc/tps.log | sed -e 's/ Delta.*//' | awk -F= '{print $2}' > /tmp/tps-moy.log
/bin/cat /etc/tps.log | sed -e 's/ Disks.*//' | awk -F= '{print $3}' > /tmp/tps-del.log
/bin/cat /etc/tps.log | sed -e 's/Ave.*Disks=//' | sed -e 's/ //g' | sed -e "s/[0-9][0-9]h/~&/" > /tmp/tps-disk0.log
#
   if test "$model" = "CS-406"
   then
   tab="4"
   else
   tab="6"
   fi
  col="1"
  printf "Temperatures list of day "$jourlog" \n \n" > /tmp/tps-disk.log
   for bo in `/bin/cat /tmp/tps-disk0.log`
   do
    if test "$col" != "$tab"
    then
    printf " "$bo"  \c"  >> /tmp/tps-disk.log
    else
    echo " "$bo >> /tmp/tps-disk.log
    col="0"
    fi
   col=`expr $col + 1`
   done
#
# Extraction des infos email, nom et domaine
#
smtp=`/bin/get_key_value /etc/synoinfo.conf eventsmtp`
mail=`/bin/get_key_value /etc/synoinfo.conf eventmail1`
user=`/bin/get_key_value /etc/synoinfo.conf eventuser`
pass=`/bin/get_key_value /etc/synoinfo.conf eventpass`
smtp=`/bin/get_key_value /etc/synoinfo.conf eventsmtp`
echo "hostname = "$smtp":25" > /opt/etc/esmtprc
echo "username = \""$user"\"" >> /opt/etc/esmtprc
echo "password = \""$pass"\"" >> /opt/etc/esmtprc
echo "mda = \"/opt/bin/procmail -d %T\"" >> /opt/etc/esmtprc
#
#-----------------------------
# Prepa entete du fichier mail
#-----------------------------
echo "FROM:SYNO "`hostname`"<"$mail">" > /tmp/ficmail
echo "TO:"`echo $mail | awk -F@ '{print $1}'`"<"$mail">" >> /tmp/ficmail
echo "SUBJECT: Disk diagnostic of "$jourlog >> /tmp/ficmail
echo "X-Priority: 1"  >> /tmp/ficmail
echo "" >> /tmp/ficmail
#---------------------------------
# Infos SMART + Modele des disques
#---------------------------------
  cd /dev
  disque=0
  > /tmp/tps-smart
  > /tmp/tps-disk
# pour le CS-406
   if test "$model" = "CS-406"
   then
    for bo in `/bin/ls hd?`
    do
    ph=`/opt/sbin/smartctl -A $bo | grep "Power_On_Hours" | awk '{ print $10 }'`
     if test "$ph" != ""
     then
     disque=`expr $disque + 1`
     pc=`/opt/sbin/smartctl -A $bo | grep "Power_Cycle_Count" | awk '{ print $10 }'`
     echo "S.M.A.R.T values of DISQK number : "$disque" (/dev/"$bo")" >> /tmp/tps-smart
     echo " " >> /tmp/tps-smart
     /opt/sbin/smartctl -i $bo | grep -i "^[MDSU]" | grep -vi "smart" >> /tmp/tps-smart
     echo " " >> /tmp/tps-smart
     /opt/sbin/smartctl -A $bo | grep -i "ID#" >> /tmp/tps-smart
     /opt/sbin/smartctl -A $bo | grep -i "^ *[0-9][0-9]* ..* 0x0" >> /tmp/tps-smart
     echo "------------------------------------------------------------------------------------------------"  >> /tmp/tps-smart
     echo " " >> /tmp/tps-smart
     echo "Disk n"$disque" : "$ph" hours / "$pc" starts." >> /tmp/tps-disk
     fi
    done
   echo "Information of "`hostname`" with "$disque" disk(s) on "$jourlog >> /tmp/ficmail
# pour les autres syno
   else
   ph=`/opt/sbin/smartctl -A /dev/hda | grep "Power_On_Hours" | awk '{ print $10 }'`
   pc=`/opt/sbin/smartctl -A /dev/hda | grep "Power_Cycle_Count" | awk '{ print $10 }'`
   printf "S.M.A.R.T values of the DISK \n \n" >> /tmp/tps-smart
   /opt/sbin/smartctl -i /dev/hda | grep -i "^[MDSU]" | grep -vi "smart" >> /tmp/tps-smart
   echo " " >> /tmp/tps-smart
   /opt/sbin/smartctl -A /dev/hda | grep -i "ID#" >> /tmp/tps-smart
   /opt/sbin/smartctl -A /dev/hda | grep -i "^ *[0-9][0-9]* ..* 0x0" >> /tmp/tps-smart
   echo "------------------------------------------------------------------------------------------------"  >> /tmp/tps-smart
   echo " " >> /tmp/tps-smart
   echo "Internal hard disk  : "$ph" hours / "$pc" starts." >> /tmp/tps-disk
   echo "Information of "`hostname`" on "$jourlog >> /tmp/ficmail
   fi
  echo " " >> /tmp/ficmail
  /bin/cat /tmp/tps-disk >> /tmp/ficmail
  echo " " >> /tmp/ficmail
#----------------------
# Infos sur les volumes
#----------------------
  cd /
  > /tmp/tps-volume
   for bo in `/bin/ls | grep volume`
   do
   echo `df -h $bo | grep $bo | awk '{print "Disk Usage.      : "$2" - "$5" , "$4" available on "$6}'` >> /tmp/tps-volume
   done
#----------------------------------------------------------------
# Temperature moyenne, mini, maxi, Heure les plus chaudes du jour
# Ecriture des infos
#----------------------------------------------------------------
  nbr=`wc -l /tmp/tps-moy.log | awk '{print $1}'`
  h=`echo $nbr | awk '{ print $1 / 60 * '$tpstemps'}' | awk -F. '{print $1}'`
  m=`echo $nbr | awk '{ print (( $1 / 60 * '$tpstemps' ) - '$h') * 60 }' | awk -F. '{print $1}'`
  Tmax=`cat /tmp/tps-moy.log | sort | tail -1`
  Tmin=`cat /tmp/tps-moy.log | sort -r | tail -1`
  HTmax=`cat /etc/tps.log | grep "Moyenne=$Tmax" | sed -e 's/^..* //'`
  echo "Uptime              : "$h" hour(s) "$m" minute(s)" >> /tmp/ficmail
#
# pour le CS-406
#
   if test "$model" = "CS-406"
   then
   Delt=`cat /tmp/tps-del.log | sort | tail -1`
    for bou in `/bin/cat /tmp/tps-moy.log`
    do
    t=`echo $bou | awk -F. '{print $1}'`
    echo $t >> /tmp/tps.$t
    done
   echo "Min Average Temp. : "$Tmin"" >> /tmp/ficmail
   echo "Max Average Temp. : "$Tmax"" >> /tmp/ficmail
   echo "Max Diff./Disk    : "$Delt"" >> /tmp/ficmail
#
# pour les autres
#
   else
   Tmoy=0
    for bou in `/bin/cat /tmp/tps-moy.log`
    do
    t=`echo $bou | awk -F. '{print $1}'`
    Tmoy=`expr $Tmoy + $t`
    echo $t >> /tmp/tps.$t
    done
   Tmoy=`echo $Tmoy | awk '{print $1 * 100 / '$nbr'}' | awk -F. '{print $1 / 100}'`
   echo "Lowest Temperature  : "$Tmin"" >> /tmp/ficmail
   echo "Highest Temperature : "$Tmax"" >> /tmp/ficmail
   echo "Average Temperature : "$Tmoy"" >> /tmp/ficmail
   fi
#
  echo " " >> /tmp/ficmail
  echo "Hottest ++ Hours    : "$HTmax >> /tmp/ficmail
  echo " " >> /tmp/ficmail
  /bin/cat /tmp/tps-volume >> /tmp/ficmail
#-----------------------------------
# Tri du fichier de releve du jour
# et Stat temperature en % du temps
#-----------------------------------
#
  echo " " >> /tmp/ficmail
  echo "==== Distribution of reported temperature ====" >> /tmp/ficmail
  echo " " >> /tmp/ficmail
   for bou in `/bin/ls /tmp/tps.*`
   do
   t=`echo $bou | awk -F. '{ print $2 }'`
   p=`wc -l $bou | awk '{print $1 * 10000 / '$nbr'}' | awk -F. '{print $1 / 100}'`
   nbcar=`echo $p | awk -F. '{print $1}' | wc -c | awk '{print $1 - 1}'`
   virgu=`echo $p | awk -F. '{print $2}' | wc -c | awk '{print $1 - 1}'`
    if test "$virgu" = "0"
    then
    p=$p".00"
    fi
    if test "$nbcar" = "1"
    then
    echo $t" ~~>  " $p"% " >> /tmp/ficmail
    else
    echo $t" ~~> " $p"% " >> /tmp/ficmail
    fi
   done
#
  echo " " >> /tmp/ficmail
  echo "=====================================================" >> /tmp/ficmail
  echo " " >> /tmp/ficmail
  /bin/cat /tmp/tps-smart >> /tmp/ficmail
#
  /bin/cat /tmp/tps-disk.log | sed -e "s/~/ ~ /g" >> /tmp/ficmail
#
# Envoie du Mail avec test si connection OK
# sinon on sauvegarde le mail
#
connect=`ping -c 1 $smtp  2> /dev/null | grep -i "0% packet loss"`
#
   if test "$connect" != ""
   then
   echo "Sending email to "$mail
   /opt/bin/esmtp $mail < /tmp/ficmail
#
# envoie mail en retard
#
    for bou in `/bin/ls /etc/tps.mail* 2> /dev/null`
    do
    /opt/bin/esmtp $mail < $bou
    echo "Sending delayed email" $bou
    rm -f $bou
    done
#
# Sauvegarde du mail si pas de connexion
#
   else
   echo "Sending email to "$mail" impossible / delayed"
   mv /tmp/ficmail /etc/tps.mail$jourlog
   fi
#
# Nettoyage
#
  rm -f /tmp/ficmail /tmp/tps*
#
# Initialisation des donnees temperatures
# et mise a jour de la date courante.
#
   if test "$jourlog" != "$jour"
   then
   echo "Updating Temperature statements"
   cat /etc/tps.conf | sed -e 's/tps-jour="..*"/tps-jour="'$jour'"/' > /tmp/tps.conf
   mv /tmp/tps.conf /etc
   > /etc/tps.log
   fi
#
# Ecriture des donnees si le jour courant = base de donnee
#
  else
  echo "Average="$Tmoy" Delta="$delta" Disks="$temp" "$heure >> /etc/tps.log
  fi
 else
#
# cas ou le fichier de donnees temperatures
# n'existe pas
#
 cat /etc/tps.conf | sed -e 's/tps-jour="..*"/tps-jour="'$jour'"/' > /tmp/tps.conf
 mv /tmp/tps.conf /etc
 > /etc/tps.log
 fi
fi
