Date: Thu, 15 Apr 2010 10:00:33 +0100 From: Alex Zbyslaw <xfb52@dial.pipex.com> To: smyru@heron.pl Cc: freebsd-rc@FreeBSD.org Subject: Re: conf/145530: [rc.d] ntpdate(8): ntpdate rc needs wpa_supplicant to go online Message-ID: <4BC6D5B1.3000107@dial.pipex.com> In-Reply-To: <20100413202145.M96857@heron.pl> References: <201004092358.o39NwXVE012127@freefall.freebsd.org> <20100413202145.M96857@heron.pl>
next in thread | previous in thread | raw e-mail | index | archive | help
I don't think the attached script is quite what you want, but I use it to solve a similar problem. On my domestic network I have a gateway FreeBSD box that the entire local network sits behind, and I have the machine I use as my desktop. Both machines get switched off at least every night. Come switch on time, I don't always remember to boot the gateway first, and often got exactly this problem --- ntpdate failing because I had no external network connection. I was able to solve that by creating my own /usr/local/etc/rc.d script which runs before ntpdate and waits some amount of time for my gateway machine to come up. If I know I'm booting with no network I can just interrupt it with ^C. I'm sure that something similar would work for you. Whether such a solution is appropriate more generally I don't know but something like it should work for you, I think, without any mods being required to the base system. hth, --Alex $ egrep gateway_up /etc/rc.conf gateway_up_enable="YES" # Wait for gateway to come up gateway_up_host="192.168.23.3" In addition you can set e.g. gateway_up_external="some.domain.name" # External host we can ping gateway_up_wait=600 # wait 600s for gateway to come up gateway_up_external_wait=600 # wait 600s for external host to be available (e.g. waiting for named to start on gateway) #!/bin/sh # # $Id: gateway_up,v 1.4 2009/05/25 11:23:52 alex Exp $ # # PROVIDE: gateway_up # REQUIRE: NETWORKING syslogd named # BEFORE: ntpdate # KEYWORD: nojail . /etc/rc.subr name="gateway_up" rcvar=`set_rcvar` start_cmd="gateway_up_start" stop_cmd=":" : ${gateway_up_wait:=180} : ${gateway_up_external_wait:=180} [ ${gateway_up_wait} -lt 0 ] && gateway_up_wait=$((-${gateway_up_wait})) [ ${gateway_up_external_wait} -lt 0 ] && gateway_up_external_wait=$((-${gateway_up_external_wait})) gateway_up_start() { local external_host count echo_done if [ -z "$gateway_up_host" ]; then warn "gateway_up_host not set" return 1 fi if [ -z "$gateway_up_external" ]; then if [ -n "$ntpdate_hosts" ]; then "$gateway_up_external"="$ntpdate_hosts" elif [ -z "$ntpdate_hosts" -a -f ${ntpdate_config} ]; then gateway_up_external=`awk ' /^server[ \t]*127.127/ {next} /^(server|peer)/ {print $2} ' < ${ntpdate_config}` else warn "gateway_up_external unset and no ntp hosts found" fi fi if ! ping -W 1 -c 1 $gateway_up_host > /dev/null 2>&1; then # Wait for gateway host a maximum of ${gateway_up_wait} seconds echo -n "Waiting (roughly) ${gateway_up_wait}s for gateway ${gateway_up_host}: " if ! ping -o -t ${gateway_up_wait} $gateway_up_host > /dev/null 2>&1; then echo "not up...continuing" return 0 fi echo "done" fi # Wait for an external host to ping for a rough maximum of # ${gateway_up_external_wait} seconds, trying each in turn # for 2 seconds if [ -z "${gateway_up_external}" ]; then echo "No gateway_up_external hosts to check" return 0 fi count=0 echo_done=0 while [ $count -lt ${gateway_up_external_wait} ]; do for external_host in ${gateway_up_external}; do count=$((count+1)) #echo checking $external_host # SIGALRM somewhere (prints "Alarm clock") sometimes # if we try -o -t 1 if ping -W 100 -c 1 $external_host > /dev/null 2>&1; then if [ $echo_done -gt 0 ]; then echo "done" fi return 0 fi if [ $count -eq 1 ]; then echo -n "Waiting (roughly) ${gateway_up_external_wait}s for external connectivity: " echo_done=1 fi #echo "sleeping" sleep 2 done done if [ $echo_done -gt 0 ]; then echo "No connectivity...continuing" fi } load_rc_config $name run_rc_command "$1"
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4BC6D5B1.3000107>