aboutsummaryrefslogtreecommitdiff
path: root/init.d/net-online.in
blob: 7f753aaead7d5f33102a39cf9ee9d38999f6653e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#!@SBINDIR@/openrc-run
# Copyright (c) 2015 The OpenRC Authors.
# See the Authors file at the top-level directory of this distribution and
# https://github.com/OpenRC/openrc/blob/HEAD/AUTHORS
#
# This file is part of OpenRC. It is subject to the license terms in
# the LICENSE file found in the top-level directory of this
# distribution and at https://github.com/OpenRC/openrc/blob/HEAD/LICENSE
# This file may not be copied, modified, propagated, or distributed
# except according to the terms contained in the LICENSE file.

description="Delays until the network is online or a specific timeout"

depend()
{
	after modules net
	need sysfs
	provide network-online
	keyword -docker -jail -lxc -openvz -prefix -systemd-nspawn -uml -vserver
}

get_interfaces()
{
	local ifname iftype
	for ifname in /sys/class/net/*; do
		[ -h "${ifname}" ] || continue
		read iftype < ${ifname}/type
		[ "$iftype" = "1" ] && printf "%s " ${ifname##*/}
	done
}

start ()
{
	local carriers configured dev gateway ifcount infinite
	local carrier operstate rc

	ebegin "Checking to see if the network is online"
	rc=0
	interfaces=${interfaces:-$(get_interfaces)}
	timeout=${timeout:-120}
 [ $timeout -eq 0 ] && infinite=true || infinite=false
 while $infinite || [ $timeout -gt 0 ]; do
	carriers=0
	configured=0
	ifcount=0
 	for dev in ${interfaces}; do
		: $((ifcount += 1))
		read carrier < /sys/class/net/$dev/carrier 2> /dev/null ||
			carrier=
		[ "$carrier" = 1 ] && : $((carriers += 1))
		read operstate < /sys/class/net/$dev/operstate 2> /dev/null ||
			operstate=
		[ "$operstate" = up ] && : $((configured += 1))
	done
	[ $configured -eq $ifcount ] && [ $carriers -ge 1 ] && break
	sleep 1
	: $((timeout -= 1))
 done
 ! $infinite && [ $timeout -eq 0 ] && rc=1
 include_ping_test=${include_ping_test:-${ping_default_gateway}}
 if [ -n "${ping_default_gateway}" ]; then
 ewarn "ping_default_gateway is deprecated, please use include_ping_test"
 fi
 if [ $rc -eq 0 ] && yesno ${include_ping_test:-no}; then
 	ping_test_host="${ping_test_host:-google.com}"
 	if [ -n "$ping_test_host" ]; then
		while $infinite || [ $timeout -gt 0 ]; do
			ping -c 1 $ping_test_host > /dev/null 2>&1
			rc=$?
			[ $rc -eq 0 ] && break
			sleep 1
			: $((timeout -= 1))
		done
	fi
 fi
 eend $rc "The network is offline"
}