#!/bin/bash

### BEGIN INIT INFO
# Provides:		homegear
# Required-Start:	$network $remote_fs $syslog
# Required-Stop:	$network $remote_fs $syslog
# Default-Start:	2 3 4 5
# Default-Stop:		0 1 6
# Short-Description:	Start Homegear
### END INIT INFO

PATH=/sbin:/bin:/usr/sbin:/usr/bin

. /lib/lsb/init-functions

CONFIGPATH=/etc/homegear
DAEMON=/usr/bin/homegear
PIDPATH=/var/run/homegear
PIDFILE=$PIDPATH/homegear.pid
DBPATH=/var/lib/homegear
STATICPATH=/usr/share/homegear
LOGPATH=/var/log/homegear

test -x $DAEMON || exit 5

if [ -r /etc/default/homegear ]; then
        . /etc/default/homegear
fi

HOMEGEAR_OPTS="$HOMEGEAR_OPTS -d"

LOCKFILE=/var/lock/homegear

lock_homegear() {
        if [ -x /usr/bin/lockfile-create ]; then
                lockfile-create $LOCKFILE
                lockfile-touch $LOCKFILE &
                LOCKTOUCHPID="$!"
        fi
}

unlock_homegear() {
        if [ -x /usr/bin/lockfile-create ] ; then
                kill $LOCKTOUCHPID
                lockfile-remove $LOCKFILE
        fi
}

if [ ! -z $HOMEGEARUSER ] && [ ! -z $HOMEGEARGROUP ]; then
	RUNASUSER=$HOMEGEARUSER
	RUNASGROUP=$HOMEGEARGROUP

else
	RUNASUSER=homegear
	RUNASGROUP=homegear
fi

case $1 in
        start)
        		SPIPID=`ps -eo pid,cmd | grep -e "\[bcm2708_spi\.0\]" -e "\[spi0\]" | sed 's/^ *//g' | cut -d ' ' -f 1`
        		if [ ! -z "$SPIPID" ]; then
        			chrt -f -p 99 $SPIPID
        		fi

				if test ! -d $PIDPATH; then
					mkdir -p $PIDPATH
				fi
				chown -R $RUNASUSER:$RUNASGROUP $PIDPATH
				chmod -R 750 $PIDPATH

				if test ! -d $DBPATH; then
					mkdir -p $DBPATH
				fi
				chown -R $RUNASUSER:$RUNASGROUP $DBPATH
				chmod 750 $DBPATH
				chmod 640 $DBPATH/db.sql
				chmod 550 $DBPATH/scripts
				chown -R $RUNASUSER:$RUNASGROUP $STATICPATH
				chmod 550 $STATICPATH
				chmod 550 $STATICPATH/firmware
				chmod 440 $STATICPATH/firmware/*
				chmod 550 $STATICPATH/firmware/GetFirmwareUpdates*.sh
				chmod -R 550 $DBPATH/modules

				if test ! -d $LOGPATH; then
					mkdir -p $LOGPATH
				fi
				chown -R $RUNASUSER:$RUNASGROUP $LOGPATH
				chmod -R 750 $LOGPATH

                log_daemon_msg "Starting Homegear" "homegear"
                lock_homegear
                #Probably has no effect at all...
                ulimit -r 100
                start-stop-daemon --start --quiet --oknodo --pidfile $PIDFILE --startas $DAEMON -- -p $PIDFILE -u $RUNASUSER -g $RUNASGROUP $HOMEGEAR_OPTS
                status=$?
                unlock_homegear

                # {{{ Limit Homegear to core 2 and OpenHAB to core 3 on Raspberry Pi 2
                    isolcpus=`cat /boot/cmdline.txt | grep -c isolcpus`
                    if [ $isolcpus -eq 1 ] && [ $(nproc --all) -ge 4 ]; then
                        homegearPids=($(ps -ejH -1 | grep /usr/bin/homegear | grep -v grep | sed -e 's/^[[:space:]]*//' | cut -d ' ' -f 1))
                        for i in "${homegearPids[@]}"
                        do
                            taskset -acp 2 $i
                        done

                        openhabInstalled=`ls -l /etc | grep -c openhab`
                        if [ $openhabInstalled -eq 1 ]; then
                            openhabPid=0 && while [ $openhabPid -eq 0 ]; do sleep 1 && openhabPid=`ps -ejH -1 | grep "Dopenhab.configfile=/etc/openhab/configurations/openhab.cfg" | grep -v grep | sed -e 's/^[[:space:]]*//' | cut -d ' ' -f 1`; done && taskset -acp 3 $openhabPid &
                        fi
                    fi
                # }}}

                log_end_msg $status
                ;;
        stop)
                log_daemon_msg "Stopping Homegear" "homegear"
                if test -e $PIDFILE; then
                	PID=`cat $PIDFILE`
                	PROCESSCOUNT=`ps --pid $PID | grep -c homegear`
                	if [ $PROCESSCOUNT -ne 0 ]; then
                		start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE
                	fi
                	INDEX=0
                	while [ $PROCESSCOUNT -ne 0 ] && [ $INDEX -lt 5000 ]; do
                		sleep 0.01
                		PROCESSCOUNT=`ps --pid $PID | grep -c homegear`
                		if log_use_fancy_output; then
					        LOGLINE=`tail -n 20 $LOGPATH/homegear.log | grep -o ".[sS]hutdown. => .*$" | tail -n 1`
					        MESSAGE=`printf "%-70s" "${LOGLINE:14}"`
					        if [ ! -z "$LOGLINE" ]; then
				                $TPUT civis || true
				                $TPUT sc && \
				                $TPUT hpa 36 && \
				                CYAN=$( $TPUT setaf 6)
				                NORMAL=$( $TPUT op)
				                echo -ne "(${CYAN} $MESSAGE ${NORMAL})" || true
				                $TPUT rc || true
				                $TPUT cnorm || true
					        fi
						fi
                		INDEX=$((INDEX+1))
                	done
                	if log_use_fancy_output; then
		                $TPUT civis || true
		                $TPUT sc && \
		                $TPUT hpa 36 && \
		                CYAN=$( $TPUT setaf 6)
		                NORMAL=$( $TPUT op)
		                echo -ne "                                                                          " || true
		                $TPUT rc || true
		                $TPUT cnorm || true
					fi
                	if [ $PROCESSCOUNT -ne 0 ]; then
               			log_end_msg 1
               		else
               			log_end_msg 0
               		fi
                	rm -f $PIDFILE
                else
                	log_end_msg 1
                	echo "Can't stop homegear. There is no pid file."
                fi
                ;;
        restart|force-reload)
                $0 stop && sleep 2 && $0 start
                ;;
        try-restart)
                if $0 status >/dev/null; then
                        $0 restart
                else
                        exit 0
                fi
                ;;
        reload)
                log_daemon_msg "Reloading Homegear" "homegear"
                if start-stop-daemon --stop --signal 1 --quiet --oknodo --pidfile $PIDFILE; then
		            log_end_msg 0 || true
		        else
		            log_end_msg 1 || true
		        fi
                ;;
        status)
                status_of_proc $DAEMON "homegear"
                ;;
        *)
                echo "Usage: $0 {start|stop|restart|reload|force-reload|status}"
                exit 2
                ;;
esac
