#!/bin/bash

SYS_CONF="/etc/openvpn"
BOOT_CONF="/boot/openvpn"
CONF="/data/etc/openvpn"

LOG="/var/log/openvpn.log"
PROG="/usr/sbin/openvpn"

NETWATCH_CONF="/etc/netwatch.conf"


test -x ${PROG} || exit 0

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

source ${NETWATCH_CONF}

CLIENT_CONF=$(select_conf ${CONF}/client.conf ${BOOT_CONF}/client.conf ${SYS_CONF}/client.conf)

test -n "${CLIENT_CONF}" || exit 0

CONF=$(dirname ${CLIENT_CONF})


running() {
    (killall -0 openvpn && ip link show tun0) &> /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 openvpn "dead"
                count=$((${count} + 1))
                continue
            else
                panic action openvpn "service dead"
                break
            fi
        fi
    done
}

start() {
    msg_begin "Starting openvpn"
    modprobe tun &>/dev/null

    test -x ${CONF}/prepare-conf.sh && ${CONF}/prepare-conf.sh ${CONF}
    ${PROG} --config ${CONF}/client.conf --cd ${CONF} &>>/var/log/openvpn.log &
    test $? == 0 && msg_done || msg_fail
    
    if [[ "${LINK_WATCH}" == "true" ]]; then
        watch &
    fi
}

stop() {
    msg_begin "Stopping openvpn"
    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
