blob: d30e52453f2aff47e8000c561bb6f39267c1f8ca [file] [log] [blame] [edit]
#!/bin/sh
# PROVIDE: buildlet
# REQUIRE: NETWORKING DAEMON
# BEFORE: LOGIN
. /etc/rc.subr
name=buildlet
rcvar=buildlet_enable
procname=/buildlet
pidfile="/var/run/${name}.pid"
command=/usr/sbin/daemon
command_args="-r -fc -p ${pidfile}"
command_args="${command_args} ${procname}"
start_precmd="${name}_prestart"
stop_cmd=":"
load_rc_config $name
: ${buildlet_enable:="NO"}
buildlet_resetnet()
{
warn "buildlet resetting network"
ifconfig vtnet0 down
sleep 1
ifconfig vtnet0 up
sleep 1
dhclient vtnet0
sleep 1
}
buildlet_fixnet()
{
# Some fraction of the time, the VM comes up unable to deliver UDP packets.
# If we detect this situation, by host -W 3 failing to look up metadata.google.internal,
# then reset the network interface (ifup/ifdown/dhclient).
# Once is almost always enough, so 10 attempts should drive the failure rate to zero.
for i in 0 1 2 3 4 5 6 7 8 9; do
if /usr/local/bin/host -W 3 metadata.google.internal; then
return 0
fi
buildlet_resetnet
done
return 1
}
buildlet_prestart()
{
local buildlet_url
info $(netstat -rn)
info $(cat /etc/resolv.conf)
if ! buildlet_fixnet; then
warn "cannot fix network"
poweroff
return 1
fi
buildlet_url=$(/usr/local/bin/curl -s -H "Metadata-Flavor: Google" \
http://metadata.google.internal/computeMetadata/v1/instance/attributes/buildlet-binary-url)
if [ "$buildlet_url" = "" ]; then
warn "cannot find buildlet url"
poweroff
return 1
fi
if ! /usr/local/bin/curl -o /buildlet "${buildlet_url}"; then
warn "failed to download buildlet from ${buildlet_url}"
poweroff
return 1
fi
chmod a+x /buildlet
}
run_rc_command "$1"