diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2009-03-03 19:29:22 -0800 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2009-03-03 19:29:22 -0800 |
commit | f7c5421560640d23fc10803b9d59a9ff1d83e467 (patch) | |
tree | d6ae69d0d3f4a4d760a3254ec326bca4a8afacfe /dhcpcd-hooks | |
parent | d97c47cad830d00c9da685cc4ea157d6185f6c97 (diff) | |
download | external_dhcpcd-f7c5421560640d23fc10803b9d59a9ff1d83e467.zip external_dhcpcd-f7c5421560640d23fc10803b9d59a9ff1d83e467.tar.gz external_dhcpcd-f7c5421560640d23fc10803b9d59a9ff1d83e467.tar.bz2 |
auto import from //depot/cupcake/@135843
Diffstat (limited to 'dhcpcd-hooks')
-rw-r--r-- | dhcpcd-hooks/01-test | 7 | ||||
-rw-r--r-- | dhcpcd-hooks/10-mtu | 5 | ||||
-rw-r--r-- | dhcpcd-hooks/20-dns.conf | 32 | ||||
-rw-r--r-- | dhcpcd-hooks/20-resolv.conf | 107 | ||||
-rw-r--r-- | dhcpcd-hooks/29-lookup-hostname | 34 | ||||
-rw-r--r-- | dhcpcd-hooks/30-hostname | 28 | ||||
-rw-r--r-- | dhcpcd-hooks/50-dhcpcd-compat | 31 | ||||
-rw-r--r-- | dhcpcd-hooks/50-ntp.conf | 82 | ||||
-rw-r--r-- | dhcpcd-hooks/50-yp.conf | 49 | ||||
-rw-r--r-- | dhcpcd-hooks/90-NetworkManager | 8 | ||||
-rw-r--r-- | dhcpcd-hooks/95-configured | 26 | ||||
-rw-r--r-- | dhcpcd-hooks/Makefile | 13 |
12 files changed, 422 insertions, 0 deletions
diff --git a/dhcpcd-hooks/01-test b/dhcpcd-hooks/01-test new file mode 100644 index 0000000..609b3a1 --- /dev/null +++ b/dhcpcd-hooks/01-test @@ -0,0 +1,7 @@ +# Just echo our DHCP options we have + +case ${reason} in +TEST) set | grep "^\(interface\|metric\|pid\|reason\|skip_hooks\)=" | sort + set | grep "^\(new_\|old_\)" | sort + ;; +esac diff --git a/dhcpcd-hooks/10-mtu b/dhcpcd-hooks/10-mtu new file mode 100644 index 0000000..4265b48 --- /dev/null +++ b/dhcpcd-hooks/10-mtu @@ -0,0 +1,5 @@ +# Configure the MTU for the interface + +if [ -n "${new_interface_mtu}" ]; then + ifconfig "${interface}" mtu "${new_interface_mtu}" +fi diff --git a/dhcpcd-hooks/20-dns.conf b/dhcpcd-hooks/20-dns.conf new file mode 100644 index 0000000..a92e91d --- /dev/null +++ b/dhcpcd-hooks/20-dns.conf @@ -0,0 +1,32 @@ +# Set net.<iface>.dnsN properties that contain the +# DNS server addresses given by the DHCP server. + +set_dns_props() +{ + case "${new_domain_name_servers}" in + "") return 0;; + esac + + count=1 + for i in 1 2 3 4; do + setprop dhcp.${interface}.dns${i} "" + done + + count=1 + for dnsaddr in ${new_domain_name_servers}; do + setprop dhcp.${interface}.dns${count} ${dnsaddr} + count=$(($count + 1)) + done +} + +unset_dns_props() +{ + for i in 1 2 3 4; do + setprop dhcp.${interface}.dns${i} "" + done +} + +case "${reason}" in +BOUND|INFORM|REBIND|REBOOT|RENEW|TIMEOUT) set_dns_props;; +EXPIRE|FAIL|IPV4LL|RELEASE|STOP) unset_dns_props;; +esac diff --git a/dhcpcd-hooks/20-resolv.conf b/dhcpcd-hooks/20-resolv.conf new file mode 100644 index 0000000..e757ddf --- /dev/null +++ b/dhcpcd-hooks/20-resolv.conf @@ -0,0 +1,107 @@ +# Generate /etc/resolv.conf +# Support resolvconf(8) if available +# We can merge other dhcpcd resolv.conf files into one like resolvconf, +# but resolvconf is preferred as other applications like VPN clients +# can readily hook into it. +# Also, resolvconf can configure local nameservers such as bind +# or dnsmasq. This is important as the libc resolver isn't that powerful. + +resolv_conf_dir="${state_dir}/resolv.conf" + +build_resolv_conf() +{ + local cf="/etc/resolv.conf.${interface}" + local interfaces= header= search= srvs= servers= x= + + # Build a list of interfaces + interfaces=$(list_interfaces "${resolv_conf_dir}") + + # Build the resolv.conf + if [ -n "${interfaces}" ]; then + # Build the header + for x in ${interfaces}; do + header="${header}${header:+, }${x}" + done + + # Build the search list + search=$(cd "${resolv_conf_dir}"; \ + key_get_value "search " ${interfaces}) + [ -n "${search}" ] && search="search $(uniqify ${search})\n" + + # Build the nameserver list + srvs=$(cd "${resolv_conf_dir}"; \ + key_get_value "nameserver " ${interfaces}) + for x in $(uniqify ${srvs}); do + servers="${servers}nameserver ${x}\n" + done + fi + header="${signature_base}${header:+ ${from} }${header}" + + # Assemble resolv.conf using our head and tail files + [ -f "${cf}" ] && rm -f "${cf}" + echo "${header}" > "${cf}" + if [ -f /etc/resolv.conf.head ]; then + cat /etc/resolv.conf.head >> "${cf}" + else + echo "# /etc/resolv.conf.head can replace this line" >> "${cf}" + fi + printf "${search}${servers}" >> "${cf}" + if [ -f /etc/resolv.conf.tail ]; then + cat /etc/resolv.conf.tail >> "${cf}" + else + echo "# /etc/resolv.conf.tail can replace this line" >> "${cf}" + fi + mv -f "${cf}" /etc/resolv.conf +} + +add_resolv_conf() +{ + local x= conf="${signature}\n" + + # If we don't have any configuration, remove it + if [ -z "${new_domain_name_servers}" -a \ + -z "${new_domain_name}" -a \ + -z "${new_domain_search}" ]; then + remove_resolv_conf + return $? + fi + + if [ -n "${new_domain_search}" ]; then + conf="${conf}search ${new_domain_search}\n" + elif [ -n "${new_domain_name}" ]; then + conf="${conf}search ${new_domain_name}\n" + fi + for x in ${new_domain_name_servers}; do + conf="${conf}nameserver ${x}\n" + done + if type resolvconf >/dev/null 2>&1; then + printf "${conf}" | resolvconf -a "${interface}" + return $? + fi + + if [ -e "${resolv_conf_dir}/${interface}" ]; then + rm -f "${resolv_conf_dir}/${interface}" + fi + if [ ! -d "${resolv_conf_dir}" ]; then + mkdir -p "${resolv_conf_dir}" + fi + printf "${conf}" > "${resolv_conf_dir}/${interface}" + build_resolv_conf +} + +remove_resolv_conf() +{ + if type resolvconf >/dev/null 2>&1; then + resolvconf -d "${interface}" -f + else + if [ -e "${resolv_conf_dir}/${interface}" ]; then + rm -f "${resolv_conf_dir}/${interface}" + fi + build_resolv_conf + fi +} + +case "${reason}" in +BOUND|INFORM|REBIND|REBOOT|RENEW|TIMEOUT) add_resolv_conf;; +PREINIT|EXPIRE|FAIL|IPV4LL|RELEASE|STOP) remove_resolv_conf;; +esac diff --git a/dhcpcd-hooks/29-lookup-hostname b/dhcpcd-hooks/29-lookup-hostname new file mode 100644 index 0000000..3dfade3 --- /dev/null +++ b/dhcpcd-hooks/29-lookup-hostname @@ -0,0 +1,34 @@ +# Lookup the hostname in DNS if not set + +lookup_hostname() +{ + [ -z "${new_ip_address}" ] && return 1 + local h= + # Silly ISC programs love to send error text to stdout + if type dig >/dev/null 2>&1; then + h=`dig +short -x ${new_ip_address}` + if [ $? = 0 ]; then + echo "${h}" | sed 's/\.$//' + return 0 + fi + elif type host >/dev/null 2>&1; then + h=`host ${new_ip_address}` + if [ $? = 0 ]; then + echo "${h}" \ + | sed 's/.* domain name pointer \(.*\)./\1/' + return 0 + fi + fi + return 1 +} + +set_hostname() +{ + if [ -z "${new_host_name}" -a -z "${new_fqdn_name}" ]; then + export new_host_name="$(lookup_hostname)" + fi +} + +case "${reason}" in +BOUND|INFORM|REBIND|REBOOT|RENEW|TIMEOUT) set_hostname;; +esac diff --git a/dhcpcd-hooks/30-hostname b/dhcpcd-hooks/30-hostname new file mode 100644 index 0000000..b2e5fc8 --- /dev/null +++ b/dhcpcd-hooks/30-hostname @@ -0,0 +1,28 @@ +# Set the hostname from DHCP data if required + +need_hostname() +{ + case "$(hostname)" in + ""|"(none)"|localhost|localhost.localdomain) + [ -n "${new_host_name}" -o -n "${new_fqdn_name}" ];; + "${old_host_name}"|"${old_fqdn_name}") + true;; + *) + false;; + esac +} + +set_hostname() +{ + if need_hostname; then + if [ -n "${new_host_name}" ]; then + hostname "${new_host_name}" + else + hostname "${new_fqdn_name}" + fi + fi +} + +case "${reason}" in +BOUND|INFORM|REBIND|REBOOT|RENEW|TIMEOUT) set_hostname;; +esac diff --git a/dhcpcd-hooks/50-dhcpcd-compat b/dhcpcd-hooks/50-dhcpcd-compat new file mode 100644 index 0000000..cba40a4 --- /dev/null +++ b/dhcpcd-hooks/50-dhcpcd-compat @@ -0,0 +1,31 @@ +# Compat enter hook shim for older dhcpcd versions + +IPADDR=${new_ip_address} +INTERFACE=${interface} +NETMASK=${new_subnet_mask} +BROADCAST=${new_broadcast_address} +NETWORK=${new_network_number} +DHCPSID=${new_dhcp_server_identifier} +GATEWAYS=${new_routers} +DNSSERVERS=${new_domain_name_servers} +DNSDOMAIN=${new_domain_name} +DNSSEARCH=${new_domain_search} +NISDOMAIN=${new_nis_domain} +NISSERVERS=${new_nis_servers} +NTPSERVERS=${new_ntp_servers} + +GATEWAY= +for x in ${new_routers}; do + GATEWAY="${GATEWAY}${GATEWAY:+,}${x}" +done +DNS= +for x in ${new_domain_name_servers}; do + DNS="${DNS}${DNS:+,}${x}" +done + +x="down" +case "${reason}" in +RENEW) x="up";; +BOUND|INFORM|REBIND|REBOOT|TEST|TIMEOUT|IPV4LL) x="new";; +esac +set -- "" "${x}" diff --git a/dhcpcd-hooks/50-ntp.conf b/dhcpcd-hooks/50-ntp.conf new file mode 100644 index 0000000..536f14e --- /dev/null +++ b/dhcpcd-hooks/50-ntp.conf @@ -0,0 +1,82 @@ +# Sample dhcpcd hook script for ntp +# Like our resolv.conf hook script, we store a database of ntp.conf files +# and merge into /etc/ntp.conf + +# Detect OpenRC or BSD rc +# Distributions may want to just have their command here instead of this +if type rc-service >/dev/null 2>&1 && rc-service --exists ntpd; then + ntpd_restart_cmd="rc-service ntpd -- --ifstarted --quiet restart" +elif [ -x /etc/rc.d/ntpd ]; then + ntpd_restart_cmd="/etc/rc.d/ntpd restart" +elif [ -x /usr/local/etc/rc.d/ntpd ]; then + ntpd_restart_cmd="/usr/local/etc/rc.d/ntpd restart" +fi + +ntp_conf_dir="${state_dir}/ntp.conf" + +build_ntp_conf() +{ + local cf="/etc/ntp.conf.${interface}" + local interfaces= header= srvs= servers= x= + + # Build a list of interfaces + interfaces=$(list_interfaces "${ntp_conf_dir}") + + if [ -n "${interfaces}" ]; then + # Build the header + for x in ${interfaces}; do + header="${header}${header:+, }${x}" + done + + # Build a server list + srvs=$(cd "${ntp_conf_dir}"; + key_get_value "server " ${interfaces}) + if [ -n "${srvs}" ]; then + for x in $(uniqify ${srvs}); do + servers="${servers}server ${x}\n" + done + fi + fi + + # Merge our config into ntp.conf + [ -e "${cf}" ] && rm -f "${cf}" + remove_markers "${signature_base}" "${signature_base_end}" \ + /etc/ntp.conf > "${cf}" + if [ -n "${servers}" ]; then + echo "${signature_base}${header:+ ${from} }${header}" >> "${cf}" + printf "${search}${servers}" >> "${cf}" + echo "${signature_base_end}${header:+ ${from} }${header}" >> "${cf}" + fi + + # If we changed anything, restart ntpd + if change_file /etc/ntp.conf "${cf}"; then + [ -n "${ntpd_restart_cmd}" ] && ${ntpd_restart_cmd} + fi +} + +add_ntp_conf() +{ + local cf="${ntp_conf_dir}/${interface}" x= + + [ -e "${cf}" ] && rm "${cf}" + [ -d "${ntp_conf_dir}" ] || mkdir -p "${ntp_conf_dir}" + if [ -n "${new_ntp_servers}" ]; then + for x in ${new_ntp_servers}; do + echo "server ${x}" >> "${cf}" + done + fi + build_ntp_conf +} + +remove_ntp_conf() +{ + if [ -e "${ntp_conf_dir}/${interface}" ]; then + rm "${ntp_conf_dir}/${interface}" + fi + build_ntp_conf +} + +case "${reason}" in +BOUND|INFORM|REBIND|REBOOT|RENEW|TIMEOUT) add_ntp_conf add;; +PREINIT|EXPIRE|FAIL|IPV4LL|RELEASE|STOP) remove_ntp_conf del;; +esac diff --git a/dhcpcd-hooks/50-yp.conf b/dhcpcd-hooks/50-yp.conf new file mode 100644 index 0000000..a2296eb --- /dev/null +++ b/dhcpcd-hooks/50-yp.conf @@ -0,0 +1,49 @@ +# Sample dhcpcd hook for ypbind +# This script is only suitable for the Linux version. + +ypbind_pid() +{ + [ -s /var/run/ypbind.pid ] && cat /var/run/ypbind.pid +} + +make_yp_conf() +{ + [ -z "${new_nis_domain}" -a -z "${new_nis_servers}" ] && return 0 + local cf=/etc/yp.conf."${interface}" prefix= x= pid= + rm -f "${cf}" + echo "${signature}" > "${cf}" + if [ -n "${new_nis_domain}" ]; then + domainname "${new_nis_domain}" + if [ -n "${new_nis_servers}" ]; then + prefix="domain ${new_nis_domain} server " + else + echo "domain ${new_nis_domain} broadcast" >> "${cf}" + fi + else + prefix="ypserver " + fi + for x in ${new_nis_servers}; do + echo "${prefix}${x}" >> "${cf}" + done + save_conf /etc/yp.conf + mv -f "${cf}" /etc/yp.conf + pid="$(ypbind_pid)" + if [ -n "${pid}" ]; then + kill -HUP "${pid}" + fi +} + +restore_yp_conf() +{ + [ -n "${old_nis_domain}" ] && domainname "" + restore_conf /etc/yp.conf || return 0 + local pid="$(ypbind_pid)" + if [ -n "${pid}" ]; then + kill -HUP "${pid}" + fi +} + +case "${reason}" in +BOUND|INFORM|REBIND|REBOOT|RENEW|TIMEOUT) make_yp_conf;; +EXPIRE|FAIL|IPV4LL|RELEASE|STOP) restore_yp_conf;; +esac diff --git a/dhcpcd-hooks/90-NetworkManager b/dhcpcd-hooks/90-NetworkManager new file mode 100644 index 0000000..c4d69fe --- /dev/null +++ b/dhcpcd-hooks/90-NetworkManager @@ -0,0 +1,8 @@ +# Hook for NetworkManager-0.7.0 +# NOTE: NetworkManager will override the script dhcpcd calls, so this hook +# only makes sense if NetworkManager is patched NOT to override the +# script dhcpcd would call. + +if [ -x /usr/libexec/nm-dhcp-client.action ]; then + /usr/libexec/nm-dhcp-client.action +fi diff --git a/dhcpcd-hooks/95-configured b/dhcpcd-hooks/95-configured new file mode 100644 index 0000000..93f1c43 --- /dev/null +++ b/dhcpcd-hooks/95-configured @@ -0,0 +1,26 @@ +# This script runs last, after all network configuration +# has completed. It sets a property to let the framework +# know that setting up the interface is complete. + +# For debugging: +setprop dhcp.${interface}.reason "${reason}" + +case "${reason}" in +BOUND|INFORM|REBIND|REBOOT|RENEW|TIMEOUT) + setprop dhcp.${interface}.ipaddress "${new_ip_address}" + setprop dhcp.${interface}.gateway "${new_routers%% *}" + setprop dhcp.${interface}.mask "${new_subnet_mask}" + setprop dhcp.${interface}.leasetime "${new_dhcp_lease_time}" + setprop dhcp.${interface}.server "${new_dhcp_server_identifier}" + + setprop dhcp.${interface}.result "ok" + ;; + +EXPIRE|FAIL|IPV4LL|STOP) + setprop dhcp.${interface}.result "failed" + ;; + +RELEASE) + setprop dhcp.${interface}.result "released" + ;; +esac diff --git a/dhcpcd-hooks/Makefile b/dhcpcd-hooks/Makefile new file mode 100644 index 0000000..cfb19f7 --- /dev/null +++ b/dhcpcd-hooks/Makefile @@ -0,0 +1,13 @@ +LIBEXECDIR?= ${PREFIX}/libexec +HOOKDIR= ${LIBEXECDIR}/dhcpcd-hooks +SYSTEMSCRIPTS= 01-test 10-mtu 20-resolv.conf 30-hostname +FILES= ${SYSTEMSCRIPTS} ${HOOKSCRIPTS} +FILESDIR= ${HOOKDIR} + +all: + +MK= ../mk +include ${MK}/os.mk +include ${MK}/sys.mk +include ${MK}/files.mk +install: _filesinstall |