#!/bin/bash
#
# Parses DHCP options from openvpn to update DNS by writing directly to /etc/resolv.conf
# Example envs set from openvpn:
#
#     foreign_option_1='dhcp-option DNS 193.43.27.132'
#     foreign_option_2='dhcp-option DNS 193.43.27.133'
#     foreign_option_3='dhcp-option DOMAIN be.bnc.ch'
#

[ "$script_type" ] || exit 0
[ "$dev" ] || exit 0


SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
DNS_LEAK_SCRIPT=$SCRIPT_DIR/dns-leak-protect
CACHE_NAMESERVER_DIR="/etc/windscribe/windscribe_nameservers"
CACHE_NAMESERVER_FILE="$CACHE_NAMESERVER_DIR/$DEV.nameserver"
PATH="$PATH:/usr/local/sbin:/usr/sbin:/sbin"

case "$script_type" in
  up)
    if [ ! -d $CACHE_NAMESERVER_DIR ]; then
        mkdir $CACHE_NAMESERVER_DIR
    fi
    echo -n "" > $CACHE_NAMESERVER_FILE

    servers=()

    dns=dns
    for opt in ${!foreign_option_*}
    do
        eval "dns=\${$opt#dhcp-option DNS }"
        if [[ $dns =~ [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} ]]; then
            if [ ! -f /etc/resolv.conf.default ]; then
                cp /etc/resolv.conf /etc/resolv.conf.default
            fi

            cat /etc/resolv.conf | grep -v ^# | grep -v ^nameserver > /tmp/resolv.conf
            echo "nameserver $dns" >> /tmp/resolv.conf
            echo $dns >> $CACHE_NAMESERVER_FILE
            cat /etc/resolv.conf | grep -v ^# | grep -v "nameserver $dns" | grep nameserver >> /tmp/resolv.conf
            mv /tmp/resolv.conf $(readlink -f /etc/resolv.conf)

            servers+=(${dns})
        fi
    done

    "$DNS_LEAK_SCRIPT" "up" ${servers[@]}
    ;;
  down)

    echo $CACHE_NAMESERVER_FILE

    if [ -f $CACHE_NAMESERVER_FILE ]; then
        for ns in `cat $CACHE_NAMESERVER_FILE`; do
            echo "Removing $ns from /etc/resolv.conf"
            cat /etc/resolv.conf | grep -v "nameserver $ns" > /tmp/resolv.conf
            mv /tmp/resolv.conf $(readlink -f /etc/resolv.conf)

        done
    fi

    "$DNS_LEAK_SCRIPT" "down"
    ;;
esac
