#!/bin/sh
# Version 00.00.12
# Startscript fuer CTI Karo Module:
# - Systemlinks auf Modem und PPP Schnittstellen
# - Zugriffsrechte werden ueberprueft
#
# help Linux Shell
# http://www.linux-praxis.de/linux1/shell2_5.html
# PATH=$PATH:/sbin:/bin:/usr/sbin/:/usr/bin

# immer Modem Port, aktuell fuer LTE Fibocom ttyUSB1
SERCOMMODEM_FIBO=/dev/ttyUSB1
#Karo Board Serielle fuer ppp ttyUSB2
SERCOMPPP=/dev/ttyUSB2

ERROR_LOG_FILE=firmwareupdate/logs/firmware_update.log

USERHOMEDIR=/home/cti
NETCOREAPPDIR=$USERHOMEDIR/netcoreapp
CONFIGPATH=$USERHOMEDIR/conf
SCRIPTPATH=$USERHOMEDIR/shellscripts
MOBILPATH=$USERHOMEDIR/mobilfunk
IDENTFILE=/home/cti/hw_data/*.Identity.xml
INSTALLOSDIR=$USERHOMEDIR/_update/os
INSTALLCADIR=$USERHOMEDIR/_update/ca

CONFIG_TC="${USERHOMEDIR}/hw_data/hw.config_tc"
CONFIG_ZT="${USERHOMEDIR}/hw_data/hw.config_zt"
CONFIG_ZTT="${USERHOMEDIR}/hw_data/hw.config_zt_t"
CONFIG_WERK="${USERHOMEDIR}/hw_data/hw.config_werk"
CONFIG_TIMIMOBILE="${USERHOMEDIR}/TimiMobile"

NGINX_CONF="${CONFIGPATH}/nginx_logrotate.conf"

VPN_PATH=${USERHOMEDIR}/vpn_config
VPN_CONF="${VPN_PATH}/ctivpn.conf"

DEVICETYP="undefiniert"
APPLIKATION_NAME=DCF.Devicecontroller.WebApp.dll
HWCONFIGFILE=
# ppp & Modem fuer Waehlverbindung /dev/PortPPP & /dev/ModemPort
DEV_PORT_MODEM=/dev/ModemPort
DEV_WLAN=/sys/class/net/wlan0
MOBILE_ENABLED=$USERHOMEDIR/mobilekomm

WLAN_DEBUG_ENABLED_FILE=/home/cti/wlan_debug_enable
# Fehlercodes
STATUS_ERR_PARAMETER=$((3))  #fehlender Parameter

#---------
CheckSript()
{
# Emulation nur zum testen
		if [ ! -e ${USERHOMEDIR}/_working ]; then
				echo -en "nonexistent -> ${USERHOMEDIR}/_working \n"
		else
			echo -en "systemlink vorhanden\n"
		fi
		OldFirmware=$( readlink /home/cti/netcoreapp )
		TARFILENAME=emu.tar
		echo -en "old: $OldFirmware \n"
		echo -en "emu: unlink ${USERHOMEDIR}/netcoreapp \n"
		echo -en "emu: ln -sf ${USERHOMEDIR}/${OldFirmware} ${USERHOMEDIR}/netcoreapp \n"
	# Tarfile loeschen
		echo -en "emu: rm -f /home/cti/firmwareupdate/${TARFILENAME} \n"
		echo -en "emu: chown -R zuko:users ${USERHOMEDIR}/netcoreapp \n"

}
#---------
UpdateOS()
{
   echo "Aktualisierung OS mit $1, $2 "
#   IMAGENAME=$2
#   if [ -z ${IMAGENAME} ] ; then
#      echo "kein Image angegeben nichts wird installiert "
#      return
#   fi

#Info   echo "das update_os.sh script liegt immer im Verzeichnis /home/cti/_update/os, dort muss auch das update_image abgelegt werden"
#Info   echo "Installation wird nur auf Kommando ausgefuehrt, kein Automatismus"
# NOTE: Wechsel in das Verzeichn is ist notwendig, sonst werden die Dateien nicht gefunden!
   # script kopieren & starten
   cp -f ${SCRIPTPATH}/update_os.sh  ${INSTALLOSDIR}/update_os.sh
   cd ${INSTALLOSDIR}
#Note  2>&1 - >Redirect error messages to standard output.
	exec_Cmd=`${INSTALLOSDIR}/update_os.sh $1 $2 2>&1 `
	result=$?
	if [ "$result" -eq "0" ] ; then
		echo -en "install ok - eigentlich never reached\n "
	else
		echo -en "fail \n---\n<$exec_Cmd> \n---\n Result: $result\n "
	fi
	exit $result

}
#---------
UpdateCA()
{
   # Verzeichnisse suchen & loeschen
   # find -type d sucht nur Verzeichnisse, mein Systemlink wird nicht veraendert
   DIRLIST_DEL=$(find /usr/share/ca-certificates/* -type d)
   for delDir in $DIRLIST_DEL; do
#      echo "del: <$delDir>"
      rm -r $delDir
   done
# ln -sf /home/cti/custom_ca /usr/share/ca-certificates/custom-ca
   cp -r ${INSTALLCADIR}/* /usr/share/ca-certificates/
   exec_Cmd=`${SCRIPTPATH}/update-ca-certificates.sh -v -f -d 2>&1 `
   result=$?
	if [ "$result" -eq "0" ] ; then
		echo -en "install ok \n"
	else
		echo -en "fail \n"
	fi
   echo -en "---\n<$exec_Cmd> \n---\n Result: $result\n "
	#cleanup
	rm -r ${INSTALLCADIR}/*
	exit $result

#   echo "Todo: Update ca-certificates"
#   cp -f ${SCRIPTPATH}/update-ca-certificates.sh  ${INSTALLCADIR}/update-ca-certificates.sh
#   cd ${INSTALLCADIR}

#	echo "Todo Kopiere die Certs nach /use/share"
#	exit 1
#	exec_Cmd=`${INSTALLCADIR}/update-ca-certificates.sh -v -f -d 2>&1 `
#	result=$?
#	if [ "$result" -eq "0" ] ; then
#		echo -en "install ok \n "
#	else
#		echo -en "fail \n---\n<$exec_Cmd> \n---\n Result: $result\n "
#	fi
#	exit $result

}
#---------
CheckTimiMobile()
{
#anpassung wenn Timi Mobile aktiviert ist, keine HW Einrichtung TCK und netzwerk.conf Wlan aktivieren
	if [ -e $CONFIG_TIMIMOBILE ] ; then
		touch $MOBILE_ENABLED

		if [ ! -f ${USERHOMEDIR}/stamp_configured ]; then
#hardware config erzeugen
			echo "# Einstellungen Timi Mobile, kein Display, kein Touch, kein otg, wie bei TC" > $CONFIG_TC
			echo "splashpos" >> $CONFIG_TC
			echo "touchpanel" >> $CONFIG_TC
			echo "video_mode" >> $CONFIG_TC
			echo "otg_mode none" >> $CONFIG_TC
			echo "bootdelay -- -2" >> $CONFIG_TC
			/home/cti/hw_data/hw_setup_cti -t TC
         touch ${USERHOMEDIR}/stamp_configured
         echo -en "Timi Mobile Hardware eingerichtet: $DEVICETYP\n" > ${USERHOMEDIR}/stamp_configured
         reboot
		fi
# namesserver eintragen
		if grep -Fq "8.8.8.8" ${CONFIGPATH}/nameserver.conf
			then
				echo -en "<8.8.8.8> bereits eingetragen \n"
			else
				echo -en "Parameter nicht gefunden, Eintrag erfolgt \n"
				echo "nameserver 8.8.8.8 # manual for ppp Timi Mobil" >> ${CONFIGPATH}/nameserver.conf
		fi
		if grep -Fxq "address 192.168.0.12" ${CONFIGPATH}/netzwerk.conf
			then
				echo -en "<address 192.168.0.12> bereits eingetragen \n"
			else
				echo -en "Parameter nicht gefunden, tausche netzwerk.conf \n"
				mv ${CONFIGPATH}/netzwerk.conf ${CONFIGPATH}/netzwerk.conf.save
				cp ${CONFIGPATH}/netzwerk_mobile.conf ${CONFIGPATH}/netzwerk.conf
				Network_Restart
			fi
#systemlink fuer ser2net
		ln -sf ${SCRIPTPATH}/ser2net /etc/init.d/S89ser2net
      chmod +x ${SCRIPTPATH}/ser2net
		chmod -x /etc/init.d/S50nginx
		if [ ! -d  $VPN_PATH ] ; then
			mkdir $VPN_PATH
		fi
		chown zuko:users $VPN_PATH
		sleep 2
#		echo -en " Timi Mobile aktiviert... \n"
		echo ""
		echo "-----------------------------------------------------------------------------------"
		echo " _____ _           _    ___  ___      _     _ _               _    _   _         _ "
		echo "|_   _(_)         (_)   |  \/  |     | |   (_) |             | |  | | (_)       | |"
		echo "  | |  _ _ __ ___  _    | .  . | ___ | |__  _| | ___     __ _| | _| |_ ___   _  | |"
		echo "  | | | | '_ \` _ \| |   | |\/| |/ _ \| '_ \| | |/ _ \   / _\` | |/ / __| \ \ / / | |"
		echo "  | | | | | | | | | |   | |  | | (_) | |_) | | |  __/  | (_| |   <| |_| |\ V /  |_|"
		echo "  \_/ |_|_| |_| |_|_|   \_|  |_/\___/|_.__/|_|_|\___|   \__,_|_|\_\\\\__|_| \_/   (_)"
		echo "-----------------------------------------------------------------------------------"
		echo "Aenderungen am System:"
		echo "------------------------"
		echo "IP Adresse: 192.168.0.12"
		echo "Nameserver: 8.8.8.8"
		echo "Hardware: TC Einrichtung"
		echo "nginx: deaktiviert"
		echo "------------------------"
		exit 0
	fi
}
#---------
GetWirelessHardware()
{
HW_WLAN=
HW_MODEM=

	if [ -e $DEV_WLAN ]; then
		HW_WLAN="wlan"
	fi
	if [  -e $DEV_PORT_MODEM ]; then
      if [ -e $DEV_WLAN ]; then
         HW_MODEM=", modem"
      else
         HW_MODEM="modem"
      fi
	fi
	echo "$HW_WLAN$HW_MODEM"
	return 0
#    Wlan oder vorhanden, Typ wird auf standart output gegeben, dies
# wird dnn von der app ausgewertet
}
#---------
CheckVPN()
{
#NOTE: vpn unabhaengig von pppd, kann ja auch per lan ins internet oder zum vpn server
	if [ -e $VPN_CONF ]; then
#wenn eine ctivpn.conf existiert, dann openvpn starten
      cd $VPN_PATH
		$SCRIPTPATH/vpn_start start "$VPN_CONF" &
	else
			logger -s "<$VPN_CONF> nicht vorhanden"
	fi
}
#---------
CheckMobileKomm()
{
# Mobilfunk Kommunkationstool wird immer gestartet
		echo "starte MobileKommTool"
		$MOBILPATH/MobileKommTool*.bin &

# Pruefen  Mobilfunk aktiviert und Modem (ppp Port) vorhanden ist, dann pppd starten
#das sollte das tool erledigen
#	if [ -e $MOBILE_ENABLED ]; then
#		if [ -e $SERCOMPPP ]; then
#			$SCRIPTPATH/pppd_start_sh start
#		fi
#	fi
}
#---------
disable_service()
{

string=$1
disableping=0
disableftp=0
disablessh=0
#parameter zum deaktivieren, wenn string mit ping,ssh,ftp dann ausschalten sonst an
#default alles an, dann deaktivierte Dienste die passende regel loeachen

	/usr/sbin/iptables-restore < $CONFIGPATH/iptables.conf
# suche im Parameterstring nach kompletten woertern (-w)
	echo $string | grep -w ping  > /dev/null  ; disableping=$? ; # echo "ping: $disableping"
	echo $string | grep -w ftp > /dev/null  ;  disableftp=$? ; # echo "ftp: $disableftp"
	echo $string | grep -w ssh > /dev/null  ;  disablessh=$? ; # echo "ssh: $disablessh"

	if [ "$disableping" -eq "0" ] ; then
#	echo "ping aus: "
	/usr/sbin/iptables -D OUTPUT -p icmp --icmp-type echo-reply  -j ACCEPT
	/usr/sbin/iptables -D INPUT -p icmp --icmp-type echo-request -j ACCEPT
	fi
	if [ "$disableftp" -eq "0" ] ; then
#	echo "ftp aus:  "
	/usr/sbin/iptables -D INPUT -p tcp -m tcp --dport 21 -j ACCEPT ; # echo $? $1 $2
	fi
	if [ "$disablessh" -eq "0" ] ; then
#	echo "ssh aus:  "
	/usr/sbin/iptables -D INPUT -p tcp -m tcp --dport 22 -j ACCEPT ; # echo $? $1 $2
	fi
# 	help/debug echo "got <$string> $disableping, $disableftp, $disablessh"
# 	MyErrorMessage=$( tar -x -f /home/cti/firmwareupdate/${TARFILENAME}  2>&1)
#	result=$?

}
#---------
CheckDeviceTyp()
{
	if [ -e $CONFIG_TC ] ; then
		DEVICETYP="TC"
	else
		echo -en "nonexistent -> $CONFIG_TC \n"
	fi
	if [ -e $CONFIG_ZT ] ; then
		DEVICETYP="ZT"
	else
		echo -en "nonexistent -> $CONFIG_ZT "
	fi
	if [ -e $CONFIG_ZTT ] ; then
		DEVICETYP="ZTT"
	else
		echo -en "nonexistent -> $CONFIG_ZTT "
	fi
	if [ -e $CONFIG_WERK ] ; then
		DEVICETYP="WERK"
	else
		echo -en "nonexistent -> $CONFIG_WERK "
	fi
	echo -en "current SysTyp=$DEVICETYP \n"
}
#---------
checkWebsite()
{
	logger -s "start check Website"
	if [ ! -e ${NETCOREAPPDIR}/appsettings.json ]; then
		logger -s "ignore check, Website not exists"
	else
		sleep 10
		COUNTER=0
		while [ $COUNTER -lt 25 ]; do
#				 wget --spider -T 90 http://localhost
			wget --spider -T 90 http://localhost:5000/About/GetIsAvailable
			if [ $? -eq 0 ] ; then
#				echo -en "Webserver online, done"
				COUNTER=50
			else
				let COUNTER=COUNTER+1
				sleep 2
#				TestPermission
				echo -en "Webserver offline, next try($COUNTER) \n"
				logger -s  "Webserver offline, next try($COUNTER)"
				sleep 1
			fi
		done
		if [ $COUNTER -eq 50 ] ; then
			logger -s "done Website is online"
		else
			logger -s "error Website is offline"
		fi
	fi
}
#---------
Set_HW_Typ()
{
	ParaTyp=nix
	if [ "$DEVICETYP" = "TC" ] ; then
		ParaTyp=tc
	fi
	if [ "$DEVICETYP" = "ZT" ] ; then
		ParaTyp=zt
		unlink ${USERHOMEDIR}/hw_test/Data/hw_test_main.qml  2>&1 >/dev/null
		ln -sf ${USERHOMEDIR}/hw_test/Data/hw_test_main_480x272.qml ${USERHOMEDIR}/hw_test/Data/hw_test_main.qml
	fi
	if [ "$DEVICETYP" = "ZTT" ] ; then
		ParaTyp=zt_t
		unlink ${USERHOMEDIR}/hw_test/Data/hw_test_main.qml  2>&1 >/dev/null
		ln -sf ${USERHOMEDIR}/hw_test/Data/hw_test_main_800x480.qml ${USERHOMEDIR}/hw_test/Data/hw_test_main.qml
#link zum main qml fuer Testprogramm
	fi
		if [ "$DEVICETYP" = "WERK" ] ; then
		ParaTyp=werk
   fi
	/home/cti/hw_data/hw_setup_cti -t $ParaTyp
	if [ $? = 0 ] ; then
		echo -en "Hardware eingerichtet: $DEVICETYP\n"
		if [ "$DEVICETYP" = "ZT" ] || [ "$DEVICETYP" = "ZTT"  ]; then
		# systemlink auf qmlcache!
			rm -Rf /.cache
			ln -sf /tmp /.cache
		fi
		touch ${USERHOMEDIR}/stamp_configured
		echo -en "Hardware eingerichtet: $DEVICETYP\n" > ${USERHOMEDIR}/stamp_configured
		reboot
		exit 0
	else
		logger -s "error set hardware config"
		echo "Fehler bei Einrichtung der Hardware <$DEVICETYP>" >> ${USERHOMEDIR}/${ERROR_LOG_FILE}
	fi
}
#---------

Check_FW_sig()
{ #
  # signatur pruefen
  #
  FIRMWARENAME=$1
  TARFILENAME=$FIRMWARENAME.tar
  echo "Teste: <$TARFILENAME> "
	MyCommand=`openssl base64 -d -in ${FIRMWARENAME}.signature -out /tmp/sign.sha256.bin 2>&1 `
	result=$?
  echo "result $result"
	if [ "$result" -ne "0" ] ; then
	  echo "error #11"
		return 11
	else
		echo "start verify..."
		MyCommand=`openssl dgst -sha256 -verify  ${USERHOMEDIR}/security/ctipublic.pem -signature /tmp/sign.sha256.bin ${TARFILENAME}`
		result=$?
	  echo "result $result"
		if [ "$result" -ne "0" ] ; then
			rm /tmp/sign.sha256.bin
		  echo "error #12"
			return 12
		fi
	fi
	rm /tmp/sign.sha256.bin
  echo "all done"
	return 0
}
#---------
cleanup_fw_folder()
{
	FILENAME=$1
	echo "removing all ${USERHOMEDIR}/firmwareupdate/*"
	ls -l ${USERHOMEDIR}/firmwareupdate/*
	rm -f ${USERHOMEDIR}/firmwareupdate/*

}
#---------
CheckFW_Update()
{
# Pruefen ob im Verzeichnis /home/cti/firmware ein tar liegt, dann dieses auspacken
# systemlink /home/cti/netcoreapp auf dieses Verzeichnis setzen & neu starten
#	/home/cti/firmwareupdate
	CurrDate=$(date)
	cd ${USERHOMEDIR}/firmwareupdate
	for TARFILENAME in `ls *.tar`
	do
    FIRMWARENAME=`basename $TARFILENAME .tar`
    echo -en "got: ${FIRMWARENAME} from ${TARFILENAME}\n"
    break;
	done
	if [ -z "$TARFILENAME" ]; then
      echo "keine Firmware vorhanden, nichts zu tun"
     return
  fi

	# test ob Firmware Version identisch, falls ja, nicht installieren
	if [ -e /home/cti/netcoreapp ]; then
		OldFirmware=`basename $(readlink /home/cti/netcoreapp)`
	else
		OldFirmware="dummy"
	fi
	if [ ${OldFirmware} ==  ${FIRMWARENAME} ]; then
		echo -en "${CurrDate}: Fehler Firmwareupdate <$FIRMWARENAME> bereits installiert\n" >> ${USERHOMEDIR}/${ERROR_LOG_FILE}
		echo -en "${CurrDate}: Fehler Firmwareupdate <$FIRMWARENAME> bereits installiert\n"
		cleanup_fw_folder ${FIRMWARENAME}
		return
	fi
# pruefe Signatur
	Check_FW_sig ${FIRMWARENAME}
	result=$?
	if [ "$result" -ne "0" ] ; then
		echo -en "check FW Error $result\n"
		if [ "$result" -eq "11" ] ; then
			echo "${CurrDate}: Fehler bei Firmwareupdate <${FIRMWARENAME}.signature konnte nicht binär imgewandelt werden>" >> ${USERHOMEDIR}/${ERROR_LOG_FILE}
			ShowSystemError /home/cti/system_images/_screen_error_272h.png "Fehler #1 Firmwareupdate Signatur wandeln"
		fi
		if [ "$result" -eq "12" ] ; then
			echo "${CurrDate}: Firmwareupdate Fehler <${TARFILENAME}.signature> ist für <${TARFILENAME}> nicht valid" >> ${USERHOMEDIR}/${ERROR_LOG_FILE}
			ShowSystemError /home/cti/system_images/_screen_error_272h.png "Fehler #2 Firmwareupdate Signatur invalid"
		fi
		cleanup_fw_folder ${FIRMWARENAME}
		exit
	fi
# Info, Help:
#	TARFILENAME=netcoreapp_V0.0.0.tar
#	FIRMWARENAME=netcoreapp_V0.0.0

#
# tar auspacken
#
	cd ${USERHOMEDIR}
	echo -en "tar -x -f /home/cti/firmwareupdate/${TARFILENAME}"
	MyErrorMessage=$( tar -x -f /home/cti/firmwareupdate/${TARFILENAME}  2>&1)
	result=$?
	if [ "$result" -eq "0" ] ; then
		echo -en "tar entpacken: ok \n"
	else
		echo -en "tar fail<$MyErrorMessage> $result\n "
#Fehlermeldung in log und Fehlerbild schreiben
		echo "${CurrDate}: Fehler bei Firmwareupdate <$MyErrorMessage>" >> ${USERHOMEDIR}/${ERROR_LOG_FILE}
		ShowSystemError /home/cti/system_images/_screen_error_272h.png "$MyErrorMessage"
	# restore old Firmware? & remove corrupt file?
	# -> Andre fragen, vor neuem Release!
		cleanup_fw_folder ${FIRMWARENAME}
		exit
	fi
	echo -en "${CurrDate}:Update: ${TARFILENAME} -> ${FIRMWARENAME}, ${CurrDate} \n" >> ${USERHOMEDIR}/${ERROR_LOG_FILE}
	sync
	# Datenverzeichnis kopieren data und custom, es muessen die alten Dateien beibehalten werden
	cp -Rf ${USERHOMEDIR}/netcoreapp/App_Data/ ${USERHOMEDIR}/${FIRMWARENAME}
	cp -Rf ${USERHOMEDIR}/netcoreapp/custom/ ${USERHOMEDIR}/${FIRMWARENAME}

	# setze systemlink ln -s {TARGET} [LINK/DIR}
	unlink ${USERHOMEDIR}/netcoreapp
	ln -sf ${USERHOMEDIR}/${FIRMWARENAME} ${USERHOMEDIR}/netcoreapp
	cleanup_fw_folder ${FIRMWARENAME}
	chown -R zuko:users ${USERHOMEDIR}/netcoreapp
}
#---------
start()
{
	logger -s "SystemStart"
	export ctihomedir=/home/cti
	export ctiappdir=/home/cti/netcoreapp
	export QT_QPA_PLATFORM=linuxfb
	export EDITOR=/usr/bin/nano
	/usr/sbin/iptables-restore < $CONFIGPATH/iptables.conf
	sysctl -w net.ipv4.conf.all.arp_ignore=1
	sysctl -w net.ipv4.conf.all.arp_announce=2
	chmod 777 /dev/dsp  || true
	chmod 777 /dev/mixer || true
	chmod 777 /dev/audio || true
	chmod -R 777 /dev/snd/ || true
	rmmod /lib/modules/4.13.0-karo/kernel/drivers/input/evbug.ko || true
# nach ersten Start User Directory auf zuko anpassen, steht auf Nutzer cti
	if [ ! -f ${USERHOMEDIR}/.firststart ]; then
		chown -R zuko:users ${USERHOMEDIR}
		touch ${USERHOMEDIR}/.firststart
	fi

# manueller Zeitsync bei systemstart
	logger -s "boot zeitsync"
	/etc/cron.hourly/ntp_update &


	CheckDeviceTyp
	CTICheckSystemLinks
	if [ -e $CONFIG_TIMIMOBILE ] ; then
      echo "Timi Mobile Einrichtung HW später!"
	else

      if [ "$DEVICETYP" = "undefiniert" ] ; then
         /home/cti/hw_data/hw_setup_cti -t hn
#		echo -en "undefiniert Hardware, nur Hostname -> exit \n"
         exit
      fi
      if [ ! -f ${USERHOMEDIR}/stamp_configured ]; then
            Set_HW_Typ
      fi
   fi
# Note Bootanimation ist nur beim ZT sinnvoll, TC hat ja keen Display. ;)
	if [ "$DEVICETYP" = "ZT" ] || [ "$DEVICETYP" = "ZTT"  ]; then
		if [ -e ${USERHOMEDIR}/boot_animation/show_bootlogo ]; then
			${USERHOMEDIR}/boot_animation/show_bootlogo $DEVICETYP &
			PID_BOOT_LOGO=$(pidof -s show_bootlogo)
		echo $PID_BOOT_LOGO >/var/run/show_bootlogo.pid
			fi

	fi

# alle conf und scriptverzeichnisse, die Rechte auf nur root setzen
	if [ ! -G $SCRIPTPATH ]  || [ ! -O $SCRIPTPATH ] ; then
		echo "User oder Gruppe nicht root Verzeichnis <$SCRIPTPATH>, Anpassung auf root:root " >>/home/cti/firstboot.log
		chown root:root -R $SCRIPTPATH
		chmod -R 711 $SCRIPTPATH
	fi
		if [ ! -G $USERHOMEDIR/security ]  || [ ! -O $USERHOMEDIR/security ] ; then
		echo "User oder Gruppe nicht root Verzeichnis <$USERHOMEDIR/security>, Anpassung auf root:root " >>/home/cti/firstboot.log
		chown root:root -R $USERHOMEDIR/security
		chmod -R 711 $USERHOMEDIR/security
	fi

	if [ ! -G $CONFIGPATH ]  || [ ! -O $CONFIGPATH ] ; then
		echo "User oder Gruppe nicht root Verzeichnis <$CONFIGPATH>, Anpassung auf root:root " >>/home/cti/firstboot.log
		chown root:root -R $CONFIGPATH
		chmod -R 644 $CONFIGPATH
	fi
	if [ ! -G $MOBILPATH ]  || [ ! -O $MOBILPATH ] ; then
		echo "User oder Gruppe nicht root Verzeichnis <$MOBILPATH>, Anpassung auf root:root " >>/home/cti/firstboot.log
		chown root:root -R $MOBILPATH
		chmod -R 711 $MOBILPATH
	fi
	CheckFW_Update
	CheckMobileKomm
	CheckVPN
	CheckTimiMobile

	# wenn keine Applikation vorhanden ist, dann Testprogramm starten
	if [ ! -e $NETCOREAPPDIR/dotnetcore_runtime ]; then
		if [ "$DEVICETYP" = "TC" ] ; then
			chmod 755 /home/cti/hw_test/Test_lib_tc
			echo "starte TestProgramm! /home/cti/hw_test/Test_lib_tc &"
			/home/cti/hw_test/Test_lib_tc &
			return
		fi
		if [ "$DEVICETYP" = "ZT" ] || [ "$DEVICETYP" = "ZTT"  ]; then
			if [ ! -f ${USERHOMEDIR}/run_emulation ]; then
				chmod 755 /home/cti/hw_test/Test_libTimi
				echo "starte TestProgramm! /home/cti/hw_test/Test_libTimi &"
				/home/cti/hw_test/Test_libTimi &
				return
			else
				chmod 755 /home/cti/hw_test/zt_emulation
				echo "starte TestProgramm! /home/cti/hw_test/zt_emulation &"
				/home/cti/hw_test/zt_emulation &
				return
			fi
		fi
	fi

	chown root:root -R $NETCOREAPPDIR

# regulaere Applikation und busueberwachung starten
	chmod 755 ${NETCOREAPPDIR}/dotnetcore_runtime/dotnet
	cd $NETCOREAPPDIR
	echo -en "Starte <${USERHOMEDIR}/dotnetcore_runtime/dotnet $NETCOREAPPDIR/$APPLIKATION_NAME &> \n"
	$NETCOREAPPDIR/dotnetcore_runtime/dotnet $NETCOREAPPDIR/$APPLIKATION_NAME &
	$SCRIPTPATH/check_buspoll start &


	checkWebsite
	}
#---------
stop()
{
	# DUMMY
	echo -en "stop application ... "
#	cd /home/cti/netcoreapp/dotnetcore_runtime
	cd $NETCOREAPPDIR/dotnetcore_runtime
	killall dotnet
#	unlink ${USERHOMEDIR}/_working
#	echo -en "unlink ${USERHOMEDIR}/_working …\n"
# 	cd /home/cti/system_config_files/
	cd $SCRIPTPATH/
	killall check_buspoll
	cd /home/cti/boot_animation/
	killall show_bootlogo
	cd /home/cti/hw_test/
	killall Test_libTimi
	rm -Rf /run/wd_cti

}
#---------
restart()
{
	echo -en "restart Application"
	stop
	start

}
#---------
neustart()
{
# NOTE: umount macht das System automatisch
	echo "reboot System"
	now=$(date)
	NAME=$(basename "$0")
	REASON="call reboot"
	echo "{\"source\":\"$NAME\",\"date\":\"$now\",\"reason\":\"$REASON\"}" > /home/cti/rebootinfo.json
	sleep 2
	reboot
}
#=====================
# Testen ob die Systemlinks auf die seriellen Schnittstellen existieren
# wenn nicht werden diese erzeugt
#=====================
CTICheckSystemLinks()
{
	if [ ! -e /dev/poll_bus_1 ]; then
#Debug/Test  echo "existiert nicht, erzeuge /dev/bus_poll1"
		logger -s "erzeuge /dev/bus_poll1"
#Karo Board
		ln -sf /dev/ttymxc1 /dev/poll_bus_1
	fi

	if [ ! -e /dev/poll_bus_2 ]; then
#Debug/Test  echo "existiert nicht, erzeuge /dev/bus_poll2"
		logger -s "erzeuge /dev/bus_poll2"
#Karo Board
		ln -sf /dev/ttymxc2 /dev/poll_bus_2
	fi

# immer Modem Port erstellen, aktuell fuer LTE Fibocom ttyUSB1
	if [ ! -e /dev/ModemPort ]; then
		logger -s "erzeuge /dev/ModemPort"
		ln -sf $SERCOMMODEM_FIBO /dev/ModemPort
	fi
	if [ ! -e /dev/PortPPP ]; then
		logger -s "erzeuge /dev/PortPPP"
		ln -sf $SERCOMPPP /dev/PortPPP
	fi

# Nginx conf fuer logrotate muss root gehoeren,
	if [ ! -G $NGINX_CONF ]  || [ ! -O $NGINX_CONF ] ; then
			echo "User oder Gruppe nicht root in Datei <$NGINX_CONF>, Anpassung auf root:root " >>/home/cti/firstboot.log
			chown root:root $NGINX_CONF
			chmod 644 $NGINX_CONF
	fi
# Teste ob Seriennummerdatei auf root steht, wenn nicht anpassung auf root und nur rechte auf root
	if [ -e $IDENTFILE ]; then
		if [ ! -G $IDENTFILE ]  || [ ! -O $IDENTFILE ] ; then
			echo "User oder Gruppe  nicht Root in Datei <$IDENTFILE>, passe an auf root:root!"  >>/home/cti/firstboot.log
			chown root:root  $IDENTFILE
			chmod 400 $IDENTFILE
		fi
	fi
# #systemlinks der libtc - TuerController
# 	if [ ! -e /usr/lib/libtc.so ]; then
# #				ln -sf ${USERHOMEDIR}/lib/libtc.so /usr/lib/libtc.so
# 		ln -sf ${NETCOREAPPDIR}/lib/libtc.so /usr/lib/libtc.so
# 	fi
# 	if [ ! -e /usr/lib/libtc ]; then
# #				ln -sf ${USERHOMEDIR}/lib/libtc.so /usr/lib/libtc
# 		ln -sf ${NETCOREAPPDIR}/lib/libtc.so /usr/lib/libtc
# 	fi
#
# #systemlinks der libzt.so - Zeiterfassungsterminal
# 	if [ ! -e /usr/lib/libzt.so ]; then
# #				ln -sf ${USERHOMEDIR}/lib/libzt.so /usr/lib/libzt.so
# 		ln -sf ${NETCOREAPPDIR}/lib/libzt.so /usr/lib/libzt.so
# 	fi
# 	if [ ! -e /usr/lib/libzt ]; then
# 		ln -sf ${NETCOREAPPDIR}/lib/libzt.so /usr/lib/libzt
# 	fi
# NOTE: workdir kann nicht benutzt werden, das muss reservierter Systemname sein, oder ich war zu bloede. ;)
	if [ ! -e /run/wd_cti ]; then
		mkdir /run/wd_cti
	fi
# help	mount --bind olddir newdir
	if [ ! -e ${USERHOMEDIR}/_working ]; then
		mkdir ${USERHOMEDIR}/_working
	fi
	if [ ! -e ${USERHOMEDIR}/system_logs ]; then
		mkdir ${USERHOMEDIR}/system_logs
	fi
	mount --bind /run/wd_cti ${USERHOMEDIR}/_working
	mount --bind /var/log/ /home/cti/system_logs/
#		chown -R zuko:users /run/wd_cti
#		if [ ! -e ${USERHOMEDIR}/_working ]; then
#			ln -sf /run/wd_cti ${USERHOMEDIR}/_working
#			chown -R zuko:users ${USERHOMEDIR}/_working
#		fi
#	fi
}
#---------------

#=====================

#=================================
# Zeit stellen mittels Zeitserver
#=================================
	Servertime()
	{
		if [ -n "$1" ]; then
			logger -s "Zeitsync mit $1"
			/usr/bin/ntpdate -b $1
			result=$?
			if [ $result -eq 0 ] ; then
				hwclock -uw
				exit $?
			else
				echo -en "Fehler bei ntpdate sync Aufruf"
				exit 4
			fi
		else
			echo -en "fehlender Zeitserver beim Zeit stellen\n"
			logger -s "fehlender Zeitserver beim Zeit stellen"
			exit ${STATUS_ERR_PARAMETER}
		fi

	}
#==================
# Zeit stellen manuell
#==================
	settime()
	{
		if [ -n "$1" ]; then
# Systemzeit stellen, wird per Webinterface aufgerufen, evtl. sollte es hier raus, wenn mono das kann...
			date -s $1
			result=$?
			if [ $result -eq 0 ] ; then
				# in RTC schreiben, da neue Zeit gestellt, u  -HWClock in utc
				hwclock -uw
				exit $?
			else
				echo -en "Fehler beim Zeit stellen: ($result)"
				logger -s "Fehler beim Zeit stellen: ($result)"
				exit 4
			fi
		else
			echo -en "fehlender Parameter beim Zeit stellen\n"
			logger -s "fehlender Parameter beim Zeit stellen"
			exit ${STATUS_ERR_PARAMETER}
		fi
	}
#==================
# Zeitzone umstellen
#==================
	settimezone()
	{
# Test ob nicht leer
		if [ -n "$1" ]; then
			if [ -e "$1" ]; then
#wenn Zeitzone existiert, umstellen
# Sample		ln -s -f /usr/share/zoneinfo/Europe/Berlin  /etc/localtime
			ln -s -f $1  /etc/localtime
			echo -en "Zeitzone umgestellt auf: <$1>\n"
			logger -s "Zeitzone umgestellt auf: <$1>"
			else
			echo -en "Fehler angegebene Zeitzone <$1> existiert nicht \n"
			logger -s "Fehler angegebene Zeitzone <$1> existiert nicht"
			exit 2
			fi
		else
			echo -en "fehlender Parameter beim Umstellen der Zeitzone \n"
			logger -s "fehlender Parameter beim Umstellen der Zeitzone"
			exit ${STATUS_ERR_PARAMETER}
		fi

	}
#==================
# Zeitzone auslesen
#==================
gettimezone()
{
	CURRZONE=$(readlink "/etc/localtime")
	echo "$CURRZONE"
}
#====================
# Netzwerk neu starten
#====================
Network_Restart()
{
# wlan interace down erzwingen:
	$SCRIPTPATH/network_helper.sh remove wlan0
# alle Prozesse udhcpdc anhalten, sonst verliert das System die fest eingestellte IP
	/usr/bin/killall udhcpc
	/etc/init.d/S40network restart

# vpn neu starten, NOTE: restart geht nicht wegen angabe der vpn config
		$SCRIPTPATH/vpn_start stop
		sleep 8
	if [ -e $VPN_CONF ]; then
      CheckVPN
#		$SCRIPTPATH/vpn_start start "$VPN_CONF"
	fi

}
#==================
# Bild anzeigen
#==================
Show_Image()
{
	kill -9 $(cat /var/run/show_bootlogo.pid)
	if [ -n "$1" ]; then
		echo -en "Zeige <$1> an.\n"
		fbv $1 &
	else
		echo -en "fehlender Parameter bei show_image\n"
	fi

}
#---------
# Bild mit Fehlermeldung anzeigen
#---------
ShowSystemError()
{
	arg1="$1"
	arg2="$2"
	CheckDeviceTyp
#https://ryanstutorials.net/bash-scripting-tutorial/bash-if-statements.php
	if [ -z "$1" ]; then
	# Nichts angegeben, ende
	logger -s "fehlender Parameter bei show_image  "
		exit ${STATUS_ERR_PARAMETER}
	else
		# https://www.instructables.com/id/Add-text-to-images-with-Linux-convert-command/
		# wenn $2 vorhanden, dann Text in das Bild einfuegen, sonst wird nichts eingefuegtfuegt
		if [ "$DEVICETYP" = "ZTT"  ]; then
			MyCommandLine="text 20,300 \"$arg2\" "
			MyCommand="convert -size 800x480 xc:blue -pointsize 32 -fill white -draw '$MyCommandLine ' -gravity north -draw \"image over 0,0 0,0 '$arg1'\"  /run/curr_error_image.png"
		else
			MyCommandLine="text 5,200 \"$arg2\" "
			MyCommand="convert -size 480x272 xc:blue -pointsize 20 -fill white -draw '$MyCommandLine ' -gravity north -draw \"image over 0,0 0,0 '$arg1'\"  /run/curr_error_image.png"
		fi
# String als Kommando ausfuehren
		eval "$MyCommand"
		if [ -e /var/run/show_bootlogo.pid ]; then
				kill -9 $(cat /var/run/show_bootlogo.pid) || true
		fi
		fbv /run/curr_error_image.png &
	fi
}

#==================
# Wlan Debug Modus an/aus
#==================
SetDebugWlan()
{
   if [ -z "$1" ] ; then
      exit ${STATUS_ERR_PARAMETER}
   fi
   if [ $1 -eq 1 ]; then
      touch $WLAN_DEBUG_ENABLED_FILE
   else
      rm $WLAN_DEBUG_ENABLED_FILE
   fi
}
#====================
# main case ...
#====================
case "$1" in
  start)
	start
	;;
  stop)
	stop
	;;
  restart|reload)
	restart
	;;
	reboot)
	neustart
	;;
	shutdown)
	now=$(date)
	NAME=$(basename "$0")
	REASON="call shutdown"
	echo "{\"source\":\"$NAME\",\"date\":\"$now\",\"reason\":\"$REASON\"}" > /home/cti/rebootinfo.json
	halt
	;;
	set_time)
	settime "$2"
	;;
#NOTE: 13.11.2015 Parameter muessen an die Funktion uebergeben werden
	set_timezone)
	settimezone "$2"
	;;
	get_timezone)
	gettimezone
	;;
	servertime)
	Servertime "$2"
	;;
	netzwerk_neustart)
	Network_Restart
	;;
	show_image)
	ShowSystemError "$2" "$3"
	;;
	disable_service)
	disable_service "$2"
	;;
	check_firmware)
	Check_FW_sig "$2"
	;;
	get_wireless_hw)
	GetWirelessHardware
	;;
	update_os)
	UpdateOS "$2" "$3" "$4"
	;;
	update_ca)
   UpdateCA
   ;;
   set_debugwlan)
   SetDebugWlan "$2"
   ;;
# nur Test
#	fw_update)
#	CheckFW_Update
	check)
	CheckSript
	;;
  *)
	echo "Usage: $0 { start | stop | reboot | shutdown |  set_time | get_timezone | set_timezone | servertime | netzwerk_neustart | show_image | disable_service | check_firmware | get_wireless_hw | update_os | update_ca | set_debugwlan}"
	exit 1
esac

exit $?

