#!/bin/bash

SYS_CONF="/etc/cloudflared.conf"
BOOT_CONF="/boot/cloudflared.conf"
CONF="/data/etc/cloudflared.conf"

LOG="/var/log/cloudflared.log"

PROG_COMPRESSED=/usr/libexec/cloudflared.xz
PROG=/var/lib/cloudflared

NETWATCH_CONF="/etc/netwatch.conf"

test -s ${PROG_COMPRESSED} || exit 0

test -s ${SYS_CONF} || test -s ${BOOT_CONF} || test -s ${CONF} || exit 0
test -s ${SYS_CONF} && source ${SYS_CONF}
test -s ${BOOT_CONF} && source ${BOOT_CONF}
test -s ${CONF} && source ${CONF}

test -n "${OS_VERSION}" || source /etc/init.d/base

source ${NETWATCH_CONF}


running() {
    killall -0 cloudflared &> /dev/null
}

watch() {
    sleep ${NET_WATCH_DELAY}
    
    count=0
    NET_WATCH_RETRIES=$((${NET_WATCH_RETRIES} - 1))
    while true; do
        sleep ${NET_WATCH_INTERVAL}
        if running; then
            count=0
        else
            if [[ ${count} -lt ${NET_WATCH_RETRIES} ]]; then
                logger -t cloudflared "dead"
                count=$((${count} + 1))
                continue
            else
                panic action cloudflared "service dead"
                break
            fi
        fi
    done
}

start() {
    msg_begin "Starting cloudflared"
    unxz -k -c "${PROG_COMPRESSED}" > "${PROG}"
    chmod +x "${PROG}"
    
    ${PROG} --loglevel info tunnel run --token ${CLOUDFLARED_TOKEN} ${CLOUDFLARED_TUNNEL} &>>${LOG} &
    test $? == 0 && msg_done || msg_fail
    
    if [[ "${LINK_WATCH}" == "true" ]]; then
        watch &
    fi
}

stop() {
    msg_begin "Stopping cloudflared"
    killall $(basename ${PROG}) &>/dev/null
    ps | grep $(basename ${PROG}) | grep -v $$ | grep -v grep | tr -s ' ' | sed -e 's/^\s//' | cut -d ' ' -f 1 | xargs -r kill
    msg_done
}

case "$1" in
    start)
        start
        ;;
        
    stop)
        stop
        ;;
        
    restart)
        stop
        start
        ;;
    
    *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
esac
