| #!/bin/sh |
| # Copyright (c) 2006-2007 Gentoo Foundation |
| # Distributed under the terms of the GNU General Public License v2 |
| # Contributed by Roy Marples (uberlord@gentoo.org) |
| |
| # Setup our resolv.conf |
| # Vitally important that we use the domain entry in resolv.conf so we |
| # can setup the nameservers are for the domain ONLY in resolvconf if |
| # we're using a decent dns cache/forwarder like dnsmasq and NOT nscd/libc. |
| # nscd/libc users will get the VPN nameservers before their other ones |
| # and will use the first one that responds - maybe the LAN ones? |
| # non resolvconf users just the the VPN resolv.conf |
| |
| # FIXME:- if we have >1 domain, then we have to use search :/ |
| # We need to add a flag to resolvconf to say |
| # "these nameservers should only be used for the listed search domains |
| # if other global nameservers are present on other interfaces" |
| # This however, will break compatibility with Debians resolvconf |
| # A possible workaround would be to just list multiple domain lines |
| # and try and let resolvconf handle it |
| |
| min_route() { |
| local n=1 |
| local m |
| local r |
| |
| eval m="\$route_metric_$n" |
| while [ -n "${m}" ]; do |
| if [ -z "$r" ] || [ "$r" -gt "$m" ]; then |
| r="$m" |
| fi |
| n="$(($n+1))" |
| eval m="\$route_metric_$n" |
| done |
| |
| echo "$r" |
| } |
| |
| if [ "${PEER_DNS}" != "no" ]; then |
| NS= |
| DOMAIN= |
| SEARCH= |
| i=1 |
| while true ; do |
| eval opt=\$foreign_option_${i} |
| [ -z "${opt}" ] && break |
| if [ "${opt}" != "${opt#dhcp-option DOMAIN *}" ] ; then |
| if [ -z "${DOMAIN}" ] ; then |
| DOMAIN="${opt#dhcp-option DOMAIN *}" |
| else |
| SEARCH="${SEARCH}${SEARCH:+ }${opt#dhcp-option DOMAIN *}" |
| fi |
| elif [ "${opt}" != "${opt#dhcp-option DNS *}" ] ; then |
| NS="${NS}nameserver ${opt#dhcp-option DNS *}\n" |
| fi |
| i=$((${i} + 1)) |
| done |
| |
| if [ -n "${NS}" ] ; then |
| DNS="# Generated by openvpn for interface ${dev}\n" |
| if [ -n "${SEARCH}" ] ; then |
| DNS="${DNS}search ${DOMAIN} ${SEARCH}\n" |
| elif [ -n "${DOMAIN}" ]; then |
| DNS="${DNS}domain ${DOMAIN}\n" |
| fi |
| DNS="${DNS}${NS}" |
| if [ -x /sbin/resolvconf ] ; then |
| metric="$(min_route)" |
| printf "${DNS}" | /sbin/resolvconf -a "${dev}" ${metric:+-m ${metric}} |
| else |
| # Preserve the existing resolv.conf |
| if [ -e /etc/resolv.conf ] ; then |
| cp /etc/resolv.conf /etc/resolv.conf-"${dev}".sv |
| fi |
| printf "${DNS}" > /etc/resolv.conf |
| chmod 644 /etc/resolv.conf |
| fi |
| fi |
| fi |
| |
| # Below section is Gentoo specific |
| # Quick summary - our init scripts are re-entrant and set the SVCNAME env var |
| # as we could have >1 openvpn service |
| |
| if [ -n "${SVCNAME}" ]; then |
| # If we have a service specific script, run this now |
| if [ -x /etc/openvpn/"${SVCNAME}"-up.sh ] ; then |
| /etc/openvpn/"${SVCNAME}"-up.sh "$@" |
| fi |
| |
| # Re-enter the init script to start any dependant services |
| if ! /etc/init.d/"${SVCNAME}" --quiet status ; then |
| export IN_BACKGROUND=true |
| /etc/init.d/${SVCNAME} --quiet start |
| fi |
| fi |
| |
| exit 0 |
| |
| # vim: ts=4 : |