From 1aa326e4eec6c1136afdd0ef6baca091a451c482 Mon Sep 17 00:00:00 2001 From: Andris Raugulis Date: Mon, 9 Apr 2018 16:46:56 +0300 Subject: [PATCH] Create custom vpnc-script, which handles manual routes and dns via unbound. --- vpnc-script-wrapper.sh | 99 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100755 vpnc-script-wrapper.sh diff --git a/vpnc-script-wrapper.sh b/vpnc-script-wrapper.sh new file mode 100755 index 0000000..1695f42 --- /dev/null +++ b/vpnc-script-wrapper.sh @@ -0,0 +1,99 @@ +#!/bin/sh + +_VPNC_SCRIPT="/usr/local/sbin/vpnc-script" + +_ROUTES=" +10.0.0.0/255.0.0.0/8 +192.168.0.0/255.255.0.0/16 +" +_DOMAINS=" +example.com +" + +OIFS=$IFS; NLIFS=' +' + +_split() { + _line=$1; IFS=$2; shift 2 + read -r -- "$@" <<-EOF + ${_line} + EOF +} + +_get_unbound() { + command -v /usr/local/sbin/unbound-control >/dev/null 2>&1 \ + && echo "/usr/local/sbin/unbound-control" && return 0 + command -v unbound-control >/dev/null 2>&1 \ + && echo "unbound-control" && return 0 + return 1 +} + +output_routes() +{ + if [ -n "${CISCO_SPLIT_INC}" ]; then + _i=0 + while [ ${_i} -lt ${CISCO_SPLIT_INC} ] ; do + eval _addr="\${CISCO_SPLIT_INC_${_i}_ADDR}" + eval _mask="\${CISCO_SPLIT_INC_${_i}_MASK}" + eval _masklen="\${CISCO_SPLIT_INC_${_i}_MASKLEN}" + echo "orig.route: ${_addr}/${_masklen}" + _i=$(expr ${_i} + 1) + done + fi +} + +adjust_routes() +{ + for _k in $(env | grep ^CISCO_SPLIT_INC | cut -d '=' -f 1); do + unset ${_k} + done + IFS=$NLIFS + _i=0; + for _line in ${_ROUTES}; do + _split "${_line}" ' ' _route _ + _split "${_route}" '/' _addr _mask _masklen _ + export CISCO_SPLIT_INC_${_i}_ADDR="${_addr}" + export CISCO_SPLIT_INC_${_i}_MASK="${_mask}" + export CISCO_SPLIT_INC_${_i}_MASKLEN="${_masklen}" + _i=$(expr ${_i} + 1) + done + export CISCO_SPLIT_INC=${_i} + IFS=$OIFS +} + +output_dns() +{ + echo "orig.dns: ${INTERNAL_IP4_DNS}" + echo "orig.domain: ${CISCO_DEF_DOMAIN}" +} + +adjust_dns() +{ + _dns="${INTERNAL_IP4_DNS}" + unset CISCO_DEF_DOMAIN + unset INTERNAL_IP4_DNS + [ -z "${_dns}" ] && return + _unbound=$(_get_unbound) || { echo "err: unbound not found" >&2 && exit 1; } + IFS=$NLIFS + for _line in ${_DOMAINS}; do + _split "${_line}" ' ' _domain _ + if [ X"${reason}" = X"connect" ]; then + ${_unbound} forward_add +i "${_domain}" "${_dns}" + ${_unbound} flush_requestlist + ${_unbound} flush_zone "${_domain}" + elif [ X"${reason}" = X"disconnect" ]; then + ${_unbound} forward_remove +i "${_domain}" + ${_unbound} flush_zone "${_domain}" + ${_unbound} flush_requestlist + fi + done + IFS=$OIFS +} + +output_routes +adjust_routes +output_dns +adjust_dns + +${_VPNC_SCRIPT} $@ +