#! /bin/sh

# Based on the Debian initscript for mosquitto

### BEGIN INIT INFO
# Provides:         mosquitto
# Required-Start:   $remote_fs $syslog
# Required-Stop:    $remote_fs $syslog
# Default-Start:    2 3 4 5
# Default-Stop:     0 1 6
# Short-Description:    mosquitto MQTT message broker
# Description: 
#  This is a message broker that supports version 3.1/3.1.1 of the MQ Telemetry
#  Transport (MQTT) protocol.
#  
#  MQTT provides a method of carrying out messaging using a publish/subscribe
#  model. It is lightweight, both in terms of bandwidth usage and ease of
#  implementation. This makes it particularly useful at the edge of the network
#  where a sensor or other simple device may be implemented using an arduino for
#  example.
### END INIT INFO

set -e

PIDFILE=@LOCALSTATEDIR@/run/mosquitto.pid
DAEMON=@SBINDIR@/mosquitto

# start and stop the mosquitto MQTT message broker

test -x ${DAEMON} || exit 0

umask 022

. @SYSCONFDIR@/init.d/functions

export PATH="${PATH:+$PATH:}@SBINDIR@:@BASE_SBINDIR@"

case "$1" in
    start)
        echo "Starting Mosquitto message broker" "mosquitto"
        if start-stop-daemon --start --quiet --oknodo --background  --make-pidfile --pidfile ${PIDFILE} --exec ${DAEMON} ; then
            exit 0
        else
            exit 1
        fi
        ;;
    stop)
        echo "Stopping Mosquitto message broker" "mosquitto"
        if start-stop-daemon --stop --quiet --oknodo --pidfile ${PIDFILE}; then
            rm -f ${PIDFILE}
            exit 0
        else
            exit 1
        fi
        ;;


    reload|force-reload)
        if [ -f ${PIDFILE} ] ; then
            echo "Reloading configuration for mosquitto"
            pid=`cat ${PIDFILE}`
            kill -HUP $pid
        else
            echo "mosquitto does not seem to be running"
        fi
        ;;

    restart)
        echo "Restarting Mosquitto message broker" "mosquitto"
        if start-stop-daemon --stop --quiet --oknodo --retry 30 --pidfile ${PIDFILE}; then
            rm -f ${PIDFILE}
        fi
        if start-stop-daemon --start --quiet --oknodo --background --make-pidfile --pidfile ${PIDFILE} --exec ${DAEMON} -- -c @SYSCONFDIR@/mosquitto/mosquitto.conf ; then
            exit 0
        else
            exit 1
        fi
        ;;

    status)
        status ${DAEMON} && exit 0 || exit $?
        ;;

    *)
        echo "Usage: $0 {start|stop|reload|force-reload|restart|status}"
        exit 1
esac

exit 0
