#!/bin/bash

SYS_CONF="/etc/ppp/default"
BOOT_CONF="/boot/ppp"
CONF="/data/etc/ppp"

PROG="/usr/sbin/pppd"
PROVIDER="mobile"

NETWATCH_CONF="/etc/netwatch.conf"

CONNMAN_CONF="/etc/connman/main.conf"


test -x ${PROG} || exit 0
test -s ${CONNMAN_CONF} && exit 0

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

prepare_conf ${CONF} ${SYS_CONF} ${BOOT_CONF}

test -e ${CONF}/modem || exit 0
test -e ${CONF}/apn || exit 0

source ${NETWATCH_CONF}

test "${OS_NETWORKLESS}" == "true" && exit 0


connected() {
    ifconfig | grep ${OS_PPP} &>/dev/null && return 0 || return 1
}

watch() {
    count=0
    while true; do
        sleep 5
        if connected; then
            count=0
        else
            if [[ ${count} -lt ${LINK_WATCH_TIMEOUT} ]]; then
                count=$((${count} + 5))
                logger -t ppp "disconnected"
            else
                panic action ppp "disconnected for ${LINK_WATCH_TIMEOUT} seconds"
            fi
        fi
    done
}

udev_trigger_add() {
    for ((i = 0; i < $1; i++)); do
        /sbin/udevadm trigger --type=devices --action=add
    done
}

start() {
    test -e ${CONF}/auth || touch ${CONF}/auth
    test -e ${CONF}/extra || touch ${CONF}/extra
    test -e ${CONF}/pin || touch ${CONF}/pin
    mknod /dev/ppp c 108 0 &>/dev/null

    msg_begin "Starting pppd"

    # wait for modem
    modem=$(head -n 1 ${CONF}/modem)
    if ! [[ -e /dev/${modem} ]]; then
        udev_trigger_add 4 &
    fi

    count=0
    while true; do
        if [[ -e /dev/${modem} ]] || [[ ${count} -gt ${LINK_WATCH_TIMEOUT} ]]; then
            break
        fi

        count=$((${count} + 1))
        sleep 1
    done

    if ! [[ -e /dev/${modem} ]]; then
        msg_fail "modem /dev/${modem} not present"
        return
    fi

    ${PROG} call ${PROVIDER}
    count=0
    while true; do
        sleep 1

        if connected; then
            break
        fi

        if [[ ${count} -gt ${LINK_WATCH_TIMEOUT} ]] || ! pidof $(basename ${PROG}) > /dev/null; then
            msg_fail
            return
        fi

        count=$((${count} + 1))
    done

    if [[ "${LINK_WATCH}" == "true" ]]; then
        watch &
    fi

    msg_done
}

stop() {
    msg_begin "Stopping pppd"
    killall -q $(basename ${PROG})
    ps | grep ppp | 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

exit $?

