#!/bin/bash

### BEGIN INIT INFO
# Provides:          influxdb
# Required-Start:    $local_fs
# Required-Stop:     $local_fs
# Should-Start:
# Should-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start/Stop the influxdb database
### END INIT INFO

# Check if influxdb is enabled in OMD. If not terminate.
. etc/omd/site.conf
if [ "$CONFIG_INFLUXDB" != "on" ] ; then
    exit 5
fi

NAME=influxdb
DAEMON="$OMD_ROOT/version/bin/influxd"
PIDFILE="$OMD_ROOT/tmp/run/influxdb.pid"
LOGFILE="$OMD_ROOT/var/log/influxdb.log"
OPTIONS="run -config $OMD_ROOT/etc/influxdb/influxdb.conf -pidfile $PIDFILE"

#### Logindata:
# Admin:
USER="omdadmin"
PASS="omd"
# Grafana(only read):
GRAFANA_USER="grafana"
GRAFANA_PASS="grafana"
####
ADDRESS=$(echo $CONFIG_INFLUXDB_HTTP_TCP_PORT | perl -lne 'print $1 if /([a-zA-Z0-9\.\-]+)?:([0-9]+)/')
PORT=$(echo $CONFIG_INFLUXDB_HTTP_TCP_PORT | perl -lne 'print $2 if /([a-zA-Z0-9\.\-]+)?:([0-9]+)/')
if [ "x$PORT" = "x" ]; then
ADDRESS=127.0.0.1
PORT=$CONFIG_INFLUXDB_HTTP_TCP_PORT
fi
CONNECT="-host $ADDRESS -port $PORT"
INFLUXD_PROTO="http"
CHECK_INFLUXDB_OPTIONS=""
if [ "x$CONFIG_INFLUXDB_MODE" = "xssl" ]; then
    INFLUXD_PROTO="https"
    CONNECT="$CONNECT -ssl -unsafeSsl"
    CHECK_INFLUXDB_OPTIONS="--unsafessl"
fi

# create state dir
mkdir -p $OMD_ROOT/tmp/run \
         $OMD_ROOT/var/influxdb/db \
         $OMD_ROOT/var/influxdb/raft

get_status() {
        pid=$( cat $PIDFILE 2>/dev/null )
        if [ -n "$pid" ]; then
            if ps -p $pid > /dev/null 2>&1 ; then
                echo "$NAME is running with pid $pid"
                return 0;
            fi
        fi
        echo "$NAME is not running"
        return 1;
}

stop_influxdb() {
    pid=$( cat $PIDFILE 2>/dev/null )
    if [ -z "$pid" ]; then
        echo ". Not running."
    else
        ps -p $pid > /dev/null 2>&1 && kill $pid
        for x in $(seq 50); do
            printf "."
            ps -p $pid > /dev/null 2>&1 || break
            if [ $x -gt 3 ]; then
                ps -p $pid > /dev/null 2>&1 && kill $pid
            fi
            sleep 0.2;
        done
        if ! ps -p $pid > /dev/null 2>&1 ; then
            echo "OK"
            exit 0;
        else
            echo "failed"
            exit 1;
        fi
    fi
}

case "$1" in
    start)
        printf '%s' "Starting $NAME..."
        if get_status > /dev/null ; then
            echo "failed"
            echo "$NAME already running"
            exit 0;
        fi

        # remove memory limits which cause startup problems
        ulimit -m unlimited >/dev/null 2>&1
        ulimit -v unlimited >/dev/null 2>&1

        # influx uses lots memory when hitting open files limit
        ulimit -n $(ulimit -Hn) >/dev/null 2>&1

        nohup $DAEMON $OPTIONS >>$LOGFILE 2>&1 &
        if [ $? -eq 0 ]; then
            for x in $(seq 60); do
                $OMD_ROOT/lib/monitoring-plugins/check_influxdb m ping --address $INFLUXD_PROTO://$ADDRESS:$PORT $CHECK_INFLUXDB_OPTIONS > /dev/null && break;
                printf "."
                sleep 1
            done
            if get_status > /dev/null ; then
                # set admin user
                echo "CREATE USER $USER WITH PASSWORD '$PASS' WITH ALL PRIVILEGES" | influx $CONNECT -username $USER -password $PASS >/dev/null
                # set grafana user
                echo "CREATE USER $GRAFANA_USER WITH PASSWORD '$GRAFANA_PASS'" | influx $CONNECT -username $USER -password $PASS >/dev/null
                echo "CREATE DATABASE nagflux" | influx $CONNECT -username $USER -password $PASS >/dev/null
                echo "GRANT READ ON nagflux TO $GRAFANA_USER" | influx $CONNECT -username $USER -password $PASS >/dev/null
                # on the first start it takes a few seconds until the _internal database exists
                if ! test -d $OMD_ROOT/var/influxdb/data/_internal/; then
                    echo -n "first run, waiting for initial _internal database"
                    for x in $(seq 30); do
                        [ $(echo "SHOW DATABASES" | influx $CONNECT -username $USER -password $PASS | grep -c _internal) -eq 1 ] && break;
                        printf "."
                        sleep 1
                    done
                fi
                echo "GRANT READ ON _internal TO $GRAFANA_USER" | influx $CONNECT -username $USER -password $PASS >/dev/null
                # check for default retention policy
                echo 'SHOW RETENTION POLICIES ON nagflux' | influx $CONNECT -username $USER -password $PASS 2>/dev/null | grep -q '^autogen.*true'
                if [ $? -eq 0 ]; then
                        # autogen only exists on some databases; let's keep the data within this bucket
                        # until https://github.com/influxdata/influxdb/issues/8351 is implemented 
                        # which makes it possible to rename autogen to default
                        echo 'ALTER RETENTION POLICY "autogen" ON "nagflux" DURATION '${CONFIG_INFLUXDB_RETENTION}w' DEFAULT' | influx $CONNECT -username $USER -password $PASS >/dev/null
                else
                        echo 'SHOW RETENTION POLICIES ON nagflux' | influx $CONNECT -username $USER -password $PASS 2>/dev/null | grep -q ^default
                        if [ $? -ne 0 ]; then
                                echo 'CREATE RETENTION POLICY "default" ON "nagflux" DURATION '${CONFIG_INFLUXDB_RETENTION}w' REPLICATION 1 DEFAULT' | influx $CONNECT -username $USER -password $PASS >/dev/null
                        else
                                echo 'ALTER RETENTION POLICY "default" ON "nagflux" DURATION '${CONFIG_INFLUXDB_RETENTION}w' DEFAULT' | influx $CONNECT -username $USER -password $PASS >/dev/null
                        fi
                fi
                echo "OK"        
                exit 0;
            else
                echo "FAILED"
                exit 1;
            fi
        else
            echo "failed"
            exit 1;
        fi
        ;;
    stop)
        printf '%s' "Stopping $NAME..."
        pid=$( cat $PIDFILE 2>/dev/null )
        if [ -z "$pid" ]; then
            echo ". Not running."
        else
            stop_influxdb;
        fi
        ;;
    reload|force-reload)
        printf '%s' "Reloading $NAME configuration files..."
        pid=$( cat $PIDFILE 2>/dev/null )
        if [ -n "$pid" ]; then
            kill -HUP $pid
            exit 0
        else
            echo "$NAME is not running"
            exit 1;
        fi
    ;;
    status)
        get_status;
        exit $?;
    ;;
    restart)
        $0 stop && sleep 1
        $0 start
        exit $?
        ;;
  check)
    ;;
    *)
        echo "Usage: $NAME {start|stop|kill|status|restart}"
        exit 1
        ;;
esac

exit 0
