#!/bin/sh

## Check input.
case "$1" in
  up)   export action="up" ;;
  down) export action="down" ;;
  *)    echo "No action specified." && exit 1 ;;
esac

## Gather the required information
export tun_dev="$2"
export ns="`env | sed '/^foreign_option_[0-9].*DNS /!d; s/^.*DNS //' | head -n 1`"
export domain="`env | sed '/^foreign_option_[0-9].*DOMAIN /!d; s/^.*DOMAIN //' | head -n 1`"

## Sanity check
[ ! "$tun_dev" ] && echo "No tunnel device specified." && exit 1
[ ! "$ns" ] && echo "No name server specified." && exit 1
[ ! "$domain" ] && echo "No domain name specified." && exit 1

## Do stuff for action "up".
if [ "$action" = "up" ]; then

## Update dynamic store
scutil <<EOF
open
d.init
get State:/Network/Interface/$tun_dev/IPv4
d.add InterfaceName $tun_dev
set State:/Network/Service/openvpn-$tun_dev/IPv4
d.init
d.add ServerAddresses * $ns
d.add SupplementalMatchDomains * $domain
set State:/Network/Service/openvpn-$tun_dev/DNS
EOF

## Update resolv.conf
cur_resolv="`cat /etc/resolv.conf | sed '/^## OPENVPN START ##$/,/^## OPENVPN END ##$/d'`"
new_resolv="
## OPENVPN START ##
nameserver $ns
## OPENVPN END ##
$cur_resolv"
new_resolv="`echo \"$new_resolv\" | sed '/^ *$/d'`"
echo "$new_resolv" > /etc/resolv.conf

fi

## Do stuff for action "down".
if [ "$action" = "down" ]; then

## Remove lines from resolv.conf
cur_resolv="`cat /etc/resolv.conf | sed '/^## OPENVPN START ##$/,/^## OPENVPN END ##$/d'`"
new_resolv="`echo \"$cur_resolv\" | sed '/^ *$/d'`"
echo "$new_resolv" > /etc/resolv.conf

## Remove information from dynamic store
scutil <<EOF
open
d.init
remove State:/Network/Service/openvpn-$tun_dev/IPv4
remove State:/Network/Service/openvpn-$tun_dev/DNS
EOF

fi

