#!/bin/bash
#  Skript zur SMS-Alarmierung
#  Daniel Mllegger 2006
#  Dieses Skript darf frei verwendet oder verndert werden.
#  Fr Funktion oder Fehlerfreiheit kann ich keinerlei Garantien bernehmen
#  Viel Spa beim Alarmieren!
#  Dieses Skript bentigt CURL
#  Falls sich jemand bei sms77 registrieren mchte, wre es sehr fein dies ber diesen Link zu tun:
#
#       http://www.sms77.de/?ref=dmu
#
#  Vielen Dank, Daniel aka duese
#  Stand 21.3.2006

#  Verwendung des Skripts: "smsalarm aktion ["text"]"
#	Mgliche Parameter fr aktion :
#		alarm:	Das Skript alarmiert normal
#		probe:	Es wird nicht alarmiert, sondern nur ein "Trockendurchlauf" gemacht und die
#				Log-Meldungen wie normal ins Logfile geschrieben. 
#				(Gleicher Effekt wie wenn $0.probe existiert.)
#		debug:	Wie probe aber die Logmeldungen werden nicht ins Logfile geschrieben, 
#				sondern am Bildschirm ausgegen.
#		text:	Wird kein Text angegeben wird der Standardtext gesendet ($ALARMTEXT)
#			Wird ein Text in Anfhrungszeichen (wichtig) angegeben wird dieser mit
#				Ergnzungen (siehe weiter unten) gesendet.


# ALARMTEXT:    Der Text der in der SMS enthalten ist:
# USERSFILE:    In dieser Datei stehen die zu alarmierenden Handynummern je eine am Anfang einer Zeile.
#                       Dahinter durch ein Leerzeichen getrennt knnen Namen oder Kommentar stehen.
# USERSFILETAG: Diese Datei enthlt die zu alarmierenden Tel.-Nummern der Taggruppe
#                       (wie USERSFILE, eine je Zeile)
# BEGINTIME, ENDTIME:   Die Taggruppe wird nur in der Zeit von BEGINTIME - ENDTIME benachrichtigt
#                               (Format hh:mm)
# LOGFILE:      Logdatei
# LOCKFILE:     Wenn diese Datei existiert, wird das Skript nicht ausgfhrt und nur eine Logmeldung ausgeben.
#                       Damit werden Mehrfachalarmierungen (z.B. durch mehrere Schleifen) vermieden.
# SLEEPTIME:    Nach der Alarmierung wird noch so viele Sekunden gewartet und dann erst das Lockfile gelscht.
# STATUSUSER:   An diese Nummer wird als letztes eine SMS-verschickt mit STATUSTEXT, Startzeit, Datum,
#                       Endzeit der Alarmierung, Anzahl erfolgreicher SMS/Anzahl User/Anzahl der Versuche
#                       insgesamt, ob die Taggruppe benachrichtigt wurde, (BEGINTIME - ENDTIME)
#                       und der Kontostand vor Versand der Statussms.
# STATUSPROVIDER:       ber diesen Provider wird die Statussms verschickt (mglich: sms77, ibss)
# SMSPROVIDER:  Hier wird angegeben, ber welchen Provider die SMS verschickt werden sollen.
#                       Mgliche Werte sms77 und/oder ibss. Es knnen auch beide (mehrfach) durch
#                       Leerzeichen getrennt angegeben werden. Im Falle von "sms77 ibss" werden erst fr
#                       alle Nummern bis zu fnf Versuche gemacht die SMS ber sms77 zu verschicken.
#                       Sollte dies fr eine oder mehrer Nummern fehlschlagen, werden noch bis zu
#                       fnf Versuche je Nummer mit ibss unternommen.

SMSPROVIDER="sms77"
STATUSUSER=01795205780
STATUSPROVIDER=sms77
STARTDATE=`date +"%X %d.%m.%Y"`
ALARMTEXT="FFW xyzg SMS Benachrichtigung Testphase. Ein Alarm ist eingegangen. Alle Angaben ohne Gewhr "$STARTDATE
STATUSTEXT="FFW xyz Status: $STARTDATE"

# Falls als zweiter Parameter ein Text angegeben wird, wird dieser mit den nachstehenden Ergnzungen
#	gesendet.
if [ "$2" != "" ] ; then ALARMTEXT="FFW Rehling: "$2" $STARTDATE Alle Angaben Ohne Gewhr" ; fi

USERSFILE=$0.users
USERSFILETAG=$0.users.tag
BEGINTIME=6:00
ENDTIME=20:00
LOGFILE=$0.log
LOCKFILE=$0.lock
SLEEPTIME=60

# SMS77USER:		Username bei sms77
# SMS77PASS:	 	Passwort bei sms77
# SMS77TYPE:		Typ der SMS. Mglich: basicplus, quality, standard, festnetz, flash
# SMS77FROM:		Absender der SMS
# SMS77URL:		URL des http-Gateway von sms77


SMS77USER=user
SMS77PASS=passwort
SMS77TYPE=quality 
SMS77FROM=FFWxyz	
SMS77URL="http://www.sms77.net/gateway/"

# IBSSUSER:     Username bei ib-systems.de
# IBSSPASS:     Passwort bei ib-systems.de
# IBSSTYPE:     Typ der ib-systems-SMS. Mglich: 1, 2, 3, 4
# IBSSFROM:     Absender der SMS von ib-systems
# IBSSURL:      URL des http-Gateways von ib-systems.de

IBSSUSER=user
IBSSPASS=passwort
IBSSFROM=017XXXXXXXX
IBSSTYPE=2
IBSSURL="http://gateway.ib-systems.de"



##### Berechnung ob Taggruppe alarmiert wird #####
BEGINTIMESTAMP=`date -d "today $BEGINTIME" +%s`
ENDTIMESTAMP=`date -d "today $ENDTIME" +%s`
EXECTIMESTAMP=`date -d now +%s`
EXECTIME=`date +%H`

ALARMTAG=0
TAG="Taggruppe: nein"
if [ $EXECTIMESTAMP -ge $BEGINTIMESTAMP -a $EXECTIMESTAMP -lt $ENDTIMESTAMP ] ; then ALARMTAG=1; TAG="Taggruppe: ja" ; fi

#Fr Logfile
WHAT="[sms]  "

# Wenn DISABLESMS=" -d debug=1" gesetzt ist, werden bei sms77 keine SMS verschickt,
# sondern nur am Server angefragt, ob die Syntax i. O. ist

DISABLESMS=" -d debug=1"
DISABLEIBSS=1
if [ "$DISABLESMS" = " -d debug=1"  ] ;  then WHAT=[nosms]; fi
if [ "$1" = "alarm" ] ;	then WHAT=[alarm]; 	DISABLESMS="" ; 	   DISABLEIBSS=0 ; fi
if [ "$1" = "debug" ] ;	then WHAT=[debug]; 	DISABLESMS=" -d debug=1" ; DISABLEIBSS=1; fi
if [ "$1" = "probe" ] ;	then WHAT=[probe]; 	DISABLESMS=" -d debug=1" ; DISABLEIBSS=1; fi
if [ -e $0.probe ] ;  	then WHAT=[probe]; 	DISABLESMS=" -d debug=1" ; DISABLEIBSS=1; fi


if [ ! -e $LOCKFILE ]
then    {
	touch $LOCKFILE
	WRITETOLOG="`date +"%Y%m%d %X"` $WHAT ***************** Start der SMS Alarmierung ********************" ; if [ "$1" != "debug" ]; then echo "$WRITETOLOG" >> $LOGFILE; else echo "$WRITETOLOG"; fi; 
	WRITETOLOG="`date +"%Y%m%d %X"` $WHAT *** bermittelte Nachricht: ---$ALARMTEXT--- ***" ;  if [ "$1" != "debug" ]; then echo "$WRITETOLOG" >> $LOGFILE; else echo "$WRITETOLOG"; fi; 
	if [ $ALARMTAG = 1 ]; then WRITETOLOG="`date +"%Y%m%d %X"` $WHAT *** Tag Gruppe $USERSFILETAG ($BEGINTIME - $ENDTIME Uhr) wird alarmiert ***" ;  if [ "$1" != "debug" ]; then echo "$WRITETOLOG" >> $LOGFILE; else echo "$WRITETOLOG"; fi; fi;
	if [ $ALARMTAG != 1 ]; then WRITETOLOG="`date +"%Y%m%d %X"` $WHAT *** Tag Gruppe $USERSFILETAG ($BEGINTIME - $ENDTIME Uhr) wird nicht alarmiert ***" ;  if [ "$1" != "debug" ]; then echo "$WRITETOLOG" >> $LOGFILE; else echo "$WRITETOLOG"; fi; fi;

	##### Zu alarmierende Tel.-Nummern einlesen #####
	USERSTOALARM=`cat $USERSFILE |awk '{ print $1}'`
	if [ $ALARMTAG = "1" ] ; then USERSTOALARM="$USERSTOALARM `cat $USERSFILETAG |awk '{ print $1}'`"; fi
	
	USERSNOTALARMED=""
	NOOFUSERS=0
	NOOFALARMEDUSERS=0
	NOOFTRYS=0
	
	for NUMBER in $USERSTOALARM; do	NOOFUSERS=$[$NOOFUSERS + 1]; done

	for PROVIDER in $SMSPROVIDER
	do

		for TRY in `seq 5`
		do
			USERSNOTALARMED=""
			for NUMBER in $USERSTOALARM
			do
				TEXT=$ALARMTEXT
				case $PROVIDER in
					sms77)
						DATA="-d u=$SMS77USER -d p=$SMS77PASS -d to=$NUMBER -d from=$SMS77FROM -d text=${TEXT//" "/%20} -d type=$SMS77TYPE$DISABLESMS"
						RESULT="---"
						RESULT=$(curl -m 5 --silent --get $DATA --url $SMS77URL);
						LOGFROM=$SMS77FROM
						LOGTYPE=$SMS77TYPE
					;;
					ibss)
						DATA="-d id=$IBSSUSER -d pw=$IBSSPASS -d empfaenger=$NUMBER -d absender=$IBSSFROM -d text=${TEXT//" "/%20} -d type=$IBSSTYPE"
						RESULT="---"
						if [ $DISABLEIBSS = 0 ]; then RESULT=$(curl -m 5 --silent --get $DATA --url $IBSSURL); fi
						LOGFROM=$IBSSFROM
						LOGTYPE=$IBSSTYPE
					;;
				esac
				if [ "$RESULT" != "100" ]; 
					then USERSNOTALARMED="$USERSNOTALARMED $NUMBER"; 
					else NOOFALARMEDUSERS=$[$NOOFALARMEDUSERS +1];
				fi
				WRITETOLOG="`date +"%Y%m%d %X"` $WHAT $TRY $PROVIDER $RESULT $NUMBER Abs: $LOGFROM Type: $LOGTYPE"; if [ "$1" != "debug" ]; then echo "$WRITETOLOG" >> $LOGFILE; else echo "$WRITETOLOG"; fi; 
				NOOFTRYS=$[$NOOFTRYS + 1]
			done
			USERSTOALARM=$USERSNOTALARMED
			if [ "$USERSTOALARM" != "" ]; then sleep 1; fi
		done
	done

	##### Guthaben bei sms77 auslesen #####
	ACCOUNTDATA="-d u=$SMS77USER -d p=$SMS77PASS"
	SMS77GUTHABEN=-na-
	SMS77GUTHABEN=$(curl -m 5 --silent --get $ACCOUNTDATA --url $SMS77URL/balance.php);
	WRITETOLOG="`date +"%Y%m%d %X"` $WHAT *** sms77-Konto: $SMS77USER Restguthaben: $SMS77GUTHABEN ***"; if [ "$1" != "debug" ]; then echo "$WRITETOLOG" >> $LOGFILE; else echo "$WRITETOLOG"; fi; 

	##### Guthaben bei ibss auslesen #####
	ACCOUNTDATA="-d transaction=get_balance -d id=$IBSSUSER -d pw=$IBSSPASS"
	IBSSGUTHABEN=-na-
	IBSSGUTHABEN=$(curl -m 5 --silent --get $ACCOUNTDATA --url $IBSSURL);
	IBSSGUTHABEN=`echo $IBSSGUTHABEN|awk '{print substr($1,9,5)}'`
	WRITETOLOG="`date +"%Y%m%d %X"` $WHAT *** ibss-Konto: $IBSSUSER Restguthaben: $IBSSGUTHABEN ***"; if [ "$1" != "debug" ]; then echo "$WRITETOLOG" >> $LOGFILE; else echo "$WRITETOLOG"; fi; 


	##### StatusSMS schicken #####
	TO=$STATUSUSER
	TRY=X
	if [ -e /home/alarm/smstrigger.sender ]; then SENDER=`cat /home/alarm/smstrigger.sender`; rm /home/alarm/smstrigger.sender > /dev/null 2>&1; fi
	TEXT="$STATUSTEXT `date +"%X"` $NOOFALARMEDUSERS/$NOOFUSERS/$NOOFTRYS $TAG ($BEGINTIME-$ENDTIME Uhr) sms77: $SMS77USER $SMS77GUTHABEN ibss: $IBSSUSER $IBSSGUTHABEN $SENDER"

	case $STATUSPROVIDER in
		sms77)
			##### StatusSMS via sms77 #####
			DATA="-d u=$SMS77USER -d p=$SMS77PASS -d to=$TO -d from=$SMS77FROM -d text=${TEXT//" "/%20} -d type=$SMS77TYPE$DISABLESMS"
			RESULT=""
			RESULT=$(curl -m 5 --silent --get $DATA --url $SMS77URL);
			LOGFROM=$SMS77FROM
			LOGTYPE=$SMS77TYPE
		;;
		ibss)
			##### StatusSMS via ibss #####
			DATA="-d id=$IBSSUSER -d pw=$IBSSPASS -d empfaenger=$TO -d absender=$IBSSFROM -d text=${TEXT//" "/%20} -d type=$IBSSTYPE"
			RESULT="---"
			if [ $DISABLEIBSS = 0 ]; then RESULT=$(curl -m 5 --silent --get $DATA --url $IBSSURL); fi
			LOGFROM=$IBSSFROM
			LOGTYPE=$IBSSTYPE
		;;
	esac

	WRITETOLOG="`date +"%Y%m%d %X"` $WHAT $TRY $STATUSPROVIDER $RESULT $TO Abs: $LOGFROM Type: $LOGTYPE ---$TEXT---"; if [ "$1" != "debug" ]; then echo "$WRITETOLOG" >> $LOGFILE; else echo "$WRITETOLOG"; fi; 


	##### Warten / Verhindern von Mehrfachalarmierungen #####	
	NOWAIT=""
	if [ "$1" = "debug" ] ; then NOWAIT="ist deaktiviert"  ; fi
	WRITETOLOG="`date +"%Y%m%d %X"` $WHAT *** $SLEEPTIME Sekunden warten $NOWAIT ***";  if [ "$1" != "debug" ]; then echo "$WRITETOLOG" >> $LOGFILE; else echo "$WRITETOLOG"; fi; 
	if [ "$1" != "debug" ] ; then sleep $SLEEPTIME ; fi
	
	##### Aufrumen #####
        rm $LOCKFILE > /dev/null 2>&1
	WRITETOLOG="`date +"%Y%m%d %X"` $WHAT ***************** Ende der SMS Alarmierung  ********************"; if [ "$1" != "debug" ]; then echo "$WRITETOLOG" >> $LOGFILE; else echo "$WRITETOLOG"; fi; 

        };
else 	{
	WRITETOLOG="`date +"%Y%m%d %X"` $WHAT $0 abgebrochen ($LOCKFILE existiert)"; if [ "$1" != "debug" ]; then echo "$WRITETOLOG" >> $LOGFILE; else echo "$WRITETOLOG"; fi; 
	};
fi

