1#!/bin/sh 2
| 1#!/bin/sh 2
|
3# $FreeBSD: head/etc/rc.d/netwait 230099 2012-01-14 02:18:41Z dougb $
| 3# $FreeBSD: head/etc/rc.d/netwait 292752 2015-12-26 18:21:32Z ian $
|
4# 5# PROVIDE: netwait
| 4# 5# PROVIDE: netwait
|
6# REQUIRE: NETWORKING
| 6# REQUIRE: devd routing
|
7# KEYWORD: nojail 8#
| 7# KEYWORD: nojail 8#
|
9# The netwait script is intended to be used by systems which have 10# statically-configured IP addresses in rc.conf(5). If your system 11# uses DHCP, you should use synchronous_dhclient="YES" in your 12# /etc/rc.conf instead of using netwait.
| 9# The netwait script helps handle two situations: 10# - Systems with USB or other late-attaching network hardware which 11# is initialized by devd events. The script waits for all the 12# interfaces named in the netwait_if list to appear. 13# - Systems with statically-configured IP addresses in rc.conf(5). 14# The IP addresses in the netwait_ip list are pinged. The script 15# waits for any single IP in the list to respond to the ping. If your 16# system uses DHCP, you should probably use synchronous_dhclient="YES" 17# in your /etc/rc.conf instead of netwait_ip. 18# Either or both of the wait lists can be used (at least one must be 19# non-empty if netwait is enabled).
|
13 14. /etc/rc.subr 15 16name="netwait" 17rcvar="netwait_enable" 18 19start_cmd="${name}_start" 20stop_cmd=":" 21 22netwait_start() 23{
| 20 21. /etc/rc.subr 22 23name="netwait" 24rcvar="netwait_enable" 25 26start_cmd="${name}_start" 27stop_cmd=":" 28 29netwait_start() 30{
|
24 local ip rc count output link
| 31 local ip rc count output link wait_if got_if any_error
|
25
| 32
|
26 if [ -z "${netwait_ip}" ]; then 27 err 1 "You must define one or more IP addresses in netwait_ip"
| 33 if [ -z "${netwait_if}" ] && [ -z "${netwait_ip}" ]; then 34 err 1 "No interface or IP addresses listed, nothing to wait for"
|
28 fi 29 30 if [ ${netwait_timeout} -lt 1 ]; then 31 err 1 "netwait_timeout must be >= 1" 32 fi 33
| 35 fi 36 37 if [ ${netwait_timeout} -lt 1 ]; then 38 err 1 "netwait_timeout must be >= 1" 39 fi 40
|
34 # Handle SIGINT (Ctrl-C); force abort of while() loop 35 trap break SIGINT 36
| |
37 if [ -n "${netwait_if}" ]; then
| 41 if [ -n "${netwait_if}" ]; then
|
38 echo -n "Waiting for $netwait_if to have link" 39 40 count=1 41 while [ ${count} -le ${netwait_if_timeout} ]; do 42 if output=`/sbin/ifconfig ${netwait_if} 2>/dev/null`; then 43 link=`expr "${output}" : '.*[[:blank:]]status: \(no carrier\)'` 44 if [ -z "${link}" ]; then 45 echo '.' 46 break
| 42 any_error=0 43 for wait_if in ${netwait_if}; do 44 echo -n "Waiting for ${wait_if}" 45 link="" 46 got_if=0 47 count=1 48 # Handle SIGINT (Ctrl-C); force abort of while() loop 49 trap break SIGINT 50 while [ ${count} -le ${netwait_if_timeout} ]; do 51 if output=`/sbin/ifconfig ${wait_if} 2>/dev/null`; then 52 if [ ${got_if} -eq 0 ]; then 53 echo -n ", interface present" 54 got_if=1 55 fi 56 link=`expr "${output}" : '.*[[:blank:]]status: \(no carrier\)'` 57 if [ -z "${link}" ]; then 58 echo ', got link.' 59 break 60 fi
|
47 fi
| 61 fi
|
48 else 49 echo '' 50 err 1 "ifconfig ${netwait_if} failed" 51 fi 52 sleep 1 53 count=$((count+1)) 54 done 55 if [ -n "${link}" ]; then
| 62 sleep 1 63 count=$((count+1)) 64 done
|
56 # Restore default SIGINT handler 57 trap - SIGINT
| 65 # Restore default SIGINT handler 66 trap - SIGINT
|
58 59 echo '' 60 warn "Interface still has no link. Continuing with startup, but" 61 warn "be aware you may not have a fully functional networking" 62 warn "layer at this point." 63 return
| 67 if [ ${got_if} -eq 0 ]; then 68 echo ", wait failed: interface never appeared." 69 any_error=1 70 elif [ -n "${link}" ]; then 71 echo ", wait failed: interface still has no link." 72 any_error=1 73 fi 74 done 75 if [ ${any_error} -eq 1 ]; then 76 warn "Continuing with startup, but be aware you may not have " 77 warn "a fully functional networking layer at this point."
|
64 fi 65 fi
| 78 fi 79 fi
|
| 80 81 if [ -n "${netwait_ip}" ]; then 82 # Handle SIGINT (Ctrl-C); force abort of for() loop 83 trap break SIGINT
|
66
| 84
|
67 # Handle SIGINT (Ctrl-C); force abort of while() loop 68 trap break SIGINT
| 85 for ip in ${netwait_ip}; do 86 echo -n "Waiting for ${ip} to respond to ICMP ping"
|
69
| 87
|
70 for ip in ${netwait_ip}; do 71 echo -n "Waiting for ${ip} to respond to ICMP"
| 88 count=1 89 while [ ${count} -le ${netwait_timeout} ]; do 90 /sbin/ping -t 1 -c 1 -o ${ip} >/dev/null 2>&1 91 rc=$?
|
72
| 92
|
73 count=1 74 while [ ${count} -le ${netwait_timeout} ]; do 75 /sbin/ping -t 1 -c 1 -o ${ip} >/dev/null 2>&1 76 rc=$?
| 93 if [ $rc -eq 0 ]; then 94 # Restore default SIGINT handler 95 trap - SIGINT
|
77
| 96
|
78 if [ $rc -eq 0 ]; then 79 # Restore default SIGINT handler 80 trap - SIGINT 81 82 echo '.' 83 return 84 fi 85 count=$((count+1))
| 97 echo ', got response.' 98 return 99 fi 100 count=$((count+1)) 101 done 102 echo ', failed: No response from host.'
|
86 done
| 103 done
|
87 echo ': No response from host.' 88 done
| |
89
| 104
|
90 # Restore default SIGINT handler 91 trap - SIGINT
| 105 # Restore default SIGINT handler 106 trap - SIGINT
|
92
| 107
|
93 warn "Exhausted IP list. Continuing with startup, but be aware you may" 94 warn "not have a fully functional networking layer at this point."
| 108 warn "Exhausted IP list. Continuing with startup, but be aware you may" 109 warn "not have a fully functional networking layer at this point." 110 fi 111
|
95} 96 97load_rc_config $name 98run_rc_command "$1"
| 112} 113 114load_rc_config $name 115run_rc_command "$1"
|