dhcpcd-run-hooks.in revision 938bc384f44031877543765a9ae18c764f5da9c8
1#!/bin/sh 2# dhcpcd client configuration script 3 4# Handy variables and functions for our hooks to use 5from="from" 6signature_base="# Generated by dhcpcd" 7signature="${signature_base} ${from} ${interface}" 8signature_base_end="# End of dhcpcd" 9signature_end="${signature_base_end} ${from} ${interface}" 10state_dir="/var/run/dhcpcd" 11 12# Ensure that all arguments are unique 13uniqify() 14{ 15 local result= 16 17 while [ -n "$1" ]; do 18 case " ${result} " in 19 *" $1 "*);; 20 *) result="${result}${result:+ }$1";; 21 esac 22 shift 23 done 24 echo "${result}" 25} 26 27# List interface config files in a dir 28# We may wish to control the order at some point rather than just lexical 29list_interfaces() 30{ 31 local x= interfaces= 32 for x in "$1"/*; do 33 [ -e "${x}" ] || continue 34 interfaces="${interfaces}${interfaces:+ }${x##*/}" 35 done 36 echo "${interfaces}" 37} 38 39# We normally use sed to extract values using a key from a list of files 40# but sed may not always be available at the time. 41key_get_value() 42{ 43 local key="$1" value= x= line= 44 45 shift 46 if type sed >/dev/null 2>&1; then 47 sed -n "s/^${key}//p" $@ 48 else 49 for x; do 50 while read line; do 51 case "${line}" in 52 "${key}"*) echo "${line##${key}}";; 53 esac 54 done < "${x}" 55 done 56 fi 57} 58 59# We normally use sed to remove markers from a configuration file 60# but sed may not always be available at the time. 61remove_markers() 62{ 63 local m1="$1" m2="$2" x= line= in_marker=0 64 65 shift; shift 66 if type sed >/dev/null 2>&1; then 67 sed "/^${m1}/,/^${m2}/d" $@ 68 else 69 for x; do 70 while read line; do 71 case "${line}" in 72 "${m1}"*) in_marker=1;; 73 "${m2}"*) in_marker=0;; 74 *) [ ${in_marker} = 0 ] && echo "${line}";; 75 esac 76 done < "${x}" 77 done 78 fi 79} 80 81# Compare two files 82# If different, replace first with second otherwise remove second 83change_file() 84{ 85 if type cmp >/dev/null 2>&1; then 86 cmp -s "$1" "$2" 87 elif type diff >/dev/null 2>&1; then 88 diff -q "$1" "$2" >/dev/null 89 else 90 # Hopefully we're only working on small text files ... 91 [ "$(cat "$1")" = "$(cat "$2")" ] 92 fi 93 if [ $? -eq 0 ]; then 94 rm -f "$2" 95 return 1 96 fi 97 mv -f "$2" "$1" 98 return 0 99} 100 101# Save a config file 102save_conf() 103{ 104 if [ -f "$1" ]; then 105 rm -f "$1"-pre."${interface}" 106 mv -f "$1" "$1"-pre."${interface}" 107 fi 108} 109 110# Restore a config file 111restore_conf() 112{ 113 [ -f "$1"-pre."${interface}" ] || return 1 114 rm -f "$1" 115 mv -f "$1"-pre."${interface}" "$1" 116} 117 118 119# We source each script into this one so that scripts run earlier can 120# remove variables from the environment so later scripts don't see them. 121# Thus, the user can create their dhcpcd.enter/exit-hook script to configure 122# /etc/resolv.conf how they want and stop the system scripts ever updating it. 123for hook in \ 124 @SYSCONFDIR@/dhcpcd.enter-hook \ 125 @HOOKDIR@/* \ 126 @SYSCONFDIR@/dhcpcd.exit-hook 127do 128 for skip in ${skip_hooks}; do 129 case "${hook}" in 130 */"${skip}") continue 2;; 131 */[0-9][0-9]"-${skip}") continue 2;; 132 */[0-9][0-9]"-${skip}.sh") continue 2;; 133 esac 134 done 135 if [ -f "${hook}" ]; then 136 . "${hook}" 137 fi 138done 139