#!/bin/sh

FSC='/etc/swanctl/swanctl.conf'
FIC='/etc/ipsec.conf'
FRC='/etc/racoon/racoon.conf'

Phase1UP() {
    if [ -e "${FIC}" ] || [ -e "${FSC}" ]; then
        swanctl --list-sas | grep -Fq "remote $1"
    else
        /usr/sbin/racoonctl -l show-sa isakmp | grep -Fq "$1"
    fi
}

StartPhase1() {
    if [ -e "${FIC}" ] || [ -e "${FSC}" ]; then
        ipsec up "l2tp-lac-${2}"
    else
        /usr/sbin/racoonctl vpn-connect "$1"
    fi
}

logger "L2TP-Dialer: start"

while true
do

    while read lnsline; do

        ifname="$( echo "$lnsline" | awk '{print $1}')"
        desc="$(   echo "$lnsline" | awk '{print $2}')"
        peer_ip="$(echo "$lnsline" | awk '{print $3}')"

        /sbin/ifconfig "$ifname" > /dev/null 2>&1
        if [ $? = "0" ] ; then
            echo "$desc ok"
        else
            dial="no"
            if [ "$peer_ip" ]; then
                if Phase1UP "$peer_ip"; then
                    logger "L2TP-Dialer: phase 1 up with $peer_ip, ok to start dialing"
                    dial="yes"
                else
                    policy_count="$(/usr/sbin/setkey -DP | grep -c "$peer_ip")"
                    logger "L2TP-Dialer: start phase 1 for $peer_ip, number of policies:$policy_count"
                    StartPhase1 "$peer_ip" "$desc"
                    sleep 25
                    if Phase1UP "$peer_ip"; then
                        logger "L2TP-Dialer: phase 1 seems up with $peer_ip, ok to start dialing"
                        dial="yes"
                    else
                        logger "L2TP-Dialer: phase 1 failed with $peer_ip"
                    fi
                fi
            else
                dial="yes"
            fi

            if [ "$dial" = "yes" ]; then
                echo "Disable:$desc"
                echo "d $desc" > "$2"
                sleep 1
                echo "Calling:$desc"
                echo "c $desc" > "$2"
            fi
        fi
    done < "$1"

    sleep 120
done

