
#!/bin/sh
#
# DDOS-GUARD tunnel configuration script.
#
#

#------------------------------------Client parameters----------------------------------
TUN_MODE="gre"
LOCAL_IP="45.126.210.200"
REMOTE_IP="185.129.101.255"
PTP_IP="91.215.40.74/30"
DDGPTP_IP="91.215.40.73"
USER_DEFAULT_GATEWAY="undefined" # to set as default gateway on ddg removal
#---------------------------------------------------------------------------------------

ICMP_HOSTS="198.18.100.0/24"
STATE_FILE="/run/ddg_default_gateway"

ERROR_COLOR="\033[37;1;41m"
WARNING_COLOR="\033[30;1;33mWARNING: "
INFO_COLOR="\033[1;32;40m"
NORM_COLOR="\033[0m"

COMMANDERROR()
{
    if [ $1 -ne 0 ]; then
        echo -e $ERROR_COLOR$2$NORM_COLOR
        exit $1
    fi
}

CHECKVARS()
{
    for varname in "$@"; do
        if [ -z "${!varname+x}" ]; then
            printf "Error: Variable '%s' is unset.\n" "$varname" >&2
            return 1
        fi

        value="${!varname}"

        if [ -z "$value" ]; then
            printf "Error: Variable '%s' is empty.\n" "$varname" >&2
            return 1
        fi

        if [ "$value" = "undefined" ]; then
            printf "Error: Variable '%s' is 'undefined'.\n" "$varname" >&2
            return 1
        fi
    done
}

IS_VALID_IPV4()
{
    echo "$1" | grep -Eq '^([0-9]{1,3}\.){3}[0-9]{1,3}$'
}

if [ `id -u` -ne 0 ]; then
    echo -e $ERROR_COLOR"Please run as root"$NORM_COLOR
    exit 1
fi

if [ ! -e "`which ip`" ]; then
    echo -e $ERROR_COLOR"The script use \"ip\" command which not found in your system!"$NORM_COLOR
    exit 1
fi

if [ "$1" = "create" ]; then
#----------------------------------- CREATE TUNNEL ----------------------------------------------------
    if ! CHECKVARS TUN_MODE LOCAL_IP REMOTE_IP PTP_IP DDGPTP_IP; then
        exit 1
    fi

    if [ $(ip route | grep -c '^default') -gt 1 ]; then
        echo -e $WARNING_COLOR"You have more than one default route. There should be only one default route. Configuration stopped!"$NORM_COLOR
        exit 1
    fi

    DEFAULT_GATEWAY=`ip route show default | awk '/default/ {print $3; exit}'`

    if [ ! -n "$DEFAULT_GATEWAY" ]; then
        echo -e $ERROR_COLOR"Unable to define default gateway"$NORM_COLOR
        exit 1
    fi

    if [ ! -f "$STATE_FILE" ]; then
        echo "$DEFAULT_GATEWAY" > "$STATE_FILE"
    fi

    ip tunnel add mode $TUN_MODE local $LOCAL_IP remote $REMOTE_IP ddosguard
    COMMANDERROR $? "Tunnel ip add error with code $?"

    ip link set ddosguard up
    COMMANDERROR $? "Command ip link set up error with code $?"

    ip address add $PTP_IP dev ddosguard
    COMMANDERROR $? "Error with ip address add with code $?"

    ip route add $REMOTE_IP via "$DEFAULT_GATEWAY"
    COMMANDERROR $? "Error with ip route add with code $?"

    for i in $ICMP_HOSTS; do
        ip route add $i via $DDGPTP_IP
        COMMANDERROR $? "Error with ip route add $i with code $?"
    done

    ip route replace default via $DDGPTP_IP
    COMMANDERROR $? "Error with ip route replace default with code $?"

    echo -e $INFO_COLOR"Tunnel configuration complete!"$NORM_COLOR

elif [ "$1" = "delete" ]; then
#----------------------------------- DELETE TUNNEL ----------------------------------------------------
    if ! CHECKVARS REMOTE_IP USER_DEFAULT_GATEWAY; then
        exit 1
    fi

    for i in $ICMP_HOSTS; do
        ip route del $i via $DDGPTP_IP
        COMMANDERROR $? "Error with ip route del $i with code $?"
    done

    ip route del "$REMOTE_IP"
    COMMANDERROR $? "Error with ip route del with code $?"

    ip addr flush dev ddosguard
    COMMANDERROR $? "Error with ip add flush with code $?"

    ip link set ddosguard down || true

    ip tunnel del ddosguard
    COMMANDERROR $? "Error with ip tunnel del with code $?"

    if IS_VALID_IPV4 "$USER_DEFAULT_GATEWAY"; then
        ip route replace default via "$USER_DEFAULT_GATEWAY"
        COMMANDERROR $? "Error with ip route replace default with code $?"
    else
        echo -e $WARNING_COLOR"USER_DEFAULT_GATEWAY not set, default route not restored"$NORM_COLOR
    fi

    echo -e $INFO_COLOR"Tunnel removal complete!"$NORM_COLOR

else
    echo -e "Unknown action. Use: $0 create or $0 delete"
    exit 1
fi
