pdnsd.in revision 225524
1207753Smm#!/bin/sh 2207753Smm# Copyright (c) 2010 Roy Marples 3207753Smm# All rights reserved 4207753Smm 5207753Smm# pdnsd subscriber for resolvconf 6207753Smm 7207753Smm# Redistribution and use in source and binary forms, with or without 8207753Smm# modification, are permitted provided that the following conditions 9207753Smm# are met: 10207753Smm# * Redistributions of source code must retain the above copyright 11207753Smm# notice, this list of conditions and the following disclaimer. 12207753Smm# * Redistributions in binary form must reproduce the above 13207753Smm# copyright notice, this list of conditions and the following 14207753Smm# disclaimer in the documentation and/or other materials provided 15207753Smm# with the distribution. 16207753Smm# 17207753Smm# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18312517Sdelphij# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19207753Smm# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20207753Smm# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21207753Smm# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22207753Smm# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23207753Smm# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24207753Smm# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25207753Smm# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26207753Smm# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27207753Smm# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28207753Smm 29207753Smm[ -f "@SYSCONFDIR@"/resolvconf.conf ] || exit 0 30207753Smm. "@SYSCONFDIR@/resolvconf.conf" || exit 1 31207753Smm[ -z "$pdnsd_conf" -a -z "$pdnsd_resolv" ] && exit 0 32207753Smm[ -z "$RESOLVCONF" ] && eval "$(@PREFIX@/sbin/resolvconf -v)" 33207753Smm 34207753Smm: ${pdnsd_restart:=pdnsd-ctl config $pdnsd_conf} 35207753Smmsignature="# Generated by resolvconf" 36207753Smmsignature_end="# End of resolvconf" 37207753Smm 38207753Smm# We normally use sed to remove markers from a configuration file 39207753Smm# but sed may not always be available at the time. 40207753Smmremove_markers() 41207753Smm{ 42207753Smm local m1="$1" m2="$2" x= line= in_marker=0 43207753Smm 44207753Smm shift; shift 45207753Smm if type sed >/dev/null 2>&1; then 46207753Smm sed "/^$m1/,/^$m2/d" $@ 47207753Smm else 48278433Srpaulo for x; do 49278433Srpaulo while read line; do 50278433Srpaulo case "$line" in 51312517Sdelphij "$m1"*) in_marker=1;; 52207753Smm "$m2"*) in_marker=0;; 53207753Smm *) [ $in_marker = 0 ] && echo "$line";; 54207753Smm esac 55207753Smm done < "$x" 56207753Smm done 57207753Smm fi 58207753Smm} 59207753Smm 60207753Smm# Compare two files 61207753Smm# If different, replace first with second otherwise remove second 62207753Smmchange_file() 63207753Smm{ 64207753Smm if [ -e "$1" ]; then 65207753Smm if type cmp >/dev/null 2>&1; then 66207753Smm cmp -s "$1" "$2" 67207753Smm elif type diff >/dev/null 2>&1; then 68207753Smm diff -q "$1" "$2" >/dev/null 69207753Smm else 70207753Smm # Hopefully we're only working on small text files ... 71207753Smm [ "$(cat "$1")" = "$(cat "$2")" ] 72207753Smm fi 73207753Smm if [ $? -eq 0 ]; then 74207753Smm rm -f "$2" 75207753Smm return 1 76207753Smm fi 77312517Sdelphij fi 78207753Smm cat "$2" > "$1" 79207753Smm rm -f "$2" 80207753Smm return 0 81207753Smm} 82312517Sdelphij 83312517Sdelphijnewresolv="# Generated by resolvconf\n" 84207753Smmchanged=false 85207753Smm 86207753Smmif [ -n "$pdnsd_resolv" ]; then 87207753Smm for n in $NAMESERVERS; do 88207753Smm newresolv="${newresolv}nameserver $n\n" 89207753Smm done 90207753Smmfi 91207753Smm 92207753Smmif [ -n "$pdnsd_conf" ]; then 93207753Smm cf="$pdnsd_conf.new" 94207753Smm newconf= 95207753Smm 96207753Smm if [ -z "$pdnsd_resolv" ]; then 97207753Smm newconf="${newconf}server {\n" 98207753Smm newconf="${newconf}\tlabel=resolvconf;\n" 99207753Smm if [ -n "$NAMESERVERS" ]; then 100207753Smm newconf="${newconf}\tip=" 101207753Smm first=true 102207753Smm for n in $NAMESERVERS; do 103207753Smm if $first; then 104207753Smm first=false 105278433Srpaulo else 106278433Srpaulo newconf="${newconf}," 107278433Srpaulo fi 108207753Smm newconf="$newconf$n" 109207753Smm done 110207753Smm newconf="${newconf};\n" 111207753Smm fi 112207753Smm newconf="${newconf}}\n" 113207753Smm fi 114207753Smm 115207753Smm for d in $DOMAINS; do 116207753Smm newconf="${newconf}server {\n" 117207753Smm newconf="${newconf}\tinclude=.${d%%:*}.;\n" 118207753Smm newconf="${newconf}\tpolicy=excluded;\n" 119207753Smm newconf="${newconf}\tip=" 120207753Smm ns="${d#*:}" 121207753Smm while [ -n "$ns" ]; do 122207753Smm newconf="${newconf}${ns%%,*}" 123207753Smm [ "$ns" = "${ns#*,}" ] && break 124207753Smm ns="${ns#*,}" 125207753Smm newconf="${newconf}," 126207753Smm done 127207753Smm newconf="${newconf};\n}\n" 128207753Smm done 129207753Smm 130207753Smm rm -f "$cf" 131207753Smm remove_markers "$signature" "$signature_end" "$pdnsd_conf" > "$cf" 132207753Smm if [ -n "$newconf" ]; then 133207753Smm echo "$signature" >> "$cf" 134207753Smm printf %s "$newconf" >> "$cf" 135207753Smm echo "$signature_end" >> "$cf" 136207753Smm fi 137207753Smm if change_file "$pdnsd_conf" "$cf"; then 138207753Smm changed=true 139207753Smm fi 140207753Smmfi 141207753Smm 142207753Smmif [ -n "$pdnsd_resolv" ]; then 143207753Smm if [ ! -f "$pdnsd_resolv" ] || \ 144207753Smm [ "$(cat "$pdnsd_resolv")" != "$(printf %s "$newresolv")" ] 145207753Smm then 146207753Smm changed=true 147207753Smm printf %s "$newresolv" >"$pdnsd_resolv" 148207753Smm fi 149278433Srpaulofi 150278433Srpaulo 151278433Srpauloif $changed; then 152207753Smm eval $pdnsd_restart 153207753Smmfi 154207753Smm