#!/bin/sh
# $Id: openvpn-ctl,v 1.6 2018/03/19 09:22:02 friedman Exp $

usage()
{
    {
        echo "Usage: ${0##*/} [start|stop|restart|status] {target}"
        echo
        echo "If no target specified, uses splode or splode-proxy."
        echo "Target is ignored if not using systemd."
    } 1>&2
    exit 1
}

docmd()
{
    echo + "$@" 1>&2
    "$@"
}

sctl()
{
    action=$1
    target=$2

    file=/var/run/.check-openvpn
    name=${target#$svcname@}
    name=${name%.service}

    case $action:$target in
        *start:*splode* ) echo $name > $file ;;
          stop:*splode* ) rm -f        $file ;;
    esac

    docmd systemctl $action $target
}

mode_target()
{
    action=$1 target=$2
    sctl $action $target
}

mode_default()
{
    action=$1

    system_targets=nil
    targdir=/etc/systemd/system/openvpn.target.wants
    if [ -d $targdir ]; then
        for svc in $targdir/*; do
            svc=${svc#$targdir/}
            case $svc in
                $svcname@*.service )
                    system_targets=t
                    sctl $action $svc ;;
            esac
        done
    fi

    if [ $system_targets = nil ]; then
        get_splode_target
        sctl $action $target
    fi
}

get_splode_target()
{
    if egrep -q '0000(00|7F):2EA4' /proc/net/tcp ; then
        target=$svcname@splode-proxy.service
    else
        target=$svcname@splode.service
    fi
}

main()
{
    svcname=openvpn
    if [ -f /lib/systemd/system/openvpn-client@.service ]; then
        svcname=openvpn-client
    fi

    case $# in
        1 ) mode=default action=$1 ;;
        2 ) mode=target  action=$1 target=$svcname@$2.service ;;
        * ) usage ;;
    esac

    if [ -f /etc/init.d/openvpn ]; then
        docmd service openvpn $action
    else
        mode_$mode $action $target
    fi
}

main "$@"

# eof
