#! /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 v3.1 message broker
# Description: 
#  This is a message broker that supports version 3.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
