aboutsummaryrefslogtreecommitdiff
path: root/init.d
diff options
context:
space:
mode:
authorWilliam Hubbs <w.d.hubbs@gmail.com>2015-10-19 18:06:55 -0500
committerWilliam Hubbs <w.d.hubbs@gmail.com>2015-10-20 12:13:47 -0500
commit960881fcfe974178c0846a816663a258cdd488cc (patch)
treedb1cff0b0f4dcd055efd6f39f1af0e129a1560b9 /init.d
parentd26013494db8ea8699db9815ef4c4b0eb2f55e7f (diff)
Add net-online service
Diffstat (limited to 'init.d')
-rw-r--r--init.d/Makefile2
-rw-r--r--init.d/net-online.in69
2 files changed, 70 insertions, 1 deletions
diff --git a/init.d/Makefile b/init.d/Makefile
index a662f8d7..f2560956 100644
--- a/init.d/Makefile
+++ b/init.d/Makefile
@@ -23,7 +23,7 @@ SRCS-FreeBSD+= adjkerntz.in devd.in dumpon.in encswap.in ipfw.in \
SRCS-Linux= binfmt.in devfs.in dmesg.in hwclock.in consolefont.in keymaps.in \
killprocs.in modules.in mount-ro.in mtab.in numlock.in \
- procfs.in sysfs.in termencoding.in tmpfiles.dev.in
+ procfs.in net-online.in sysfs.in termencoding.in tmpfiles.dev.in
# Generic BSD scripts
SRCS-NetBSD= hostid.in moused.in newsyslog.in pf.in rarpd.in rc-enabled.in \
diff --git a/init.d/net-online.in b/init.d/net-online.in
new file mode 100644
index 00000000..ab3da6fb
--- /dev/null
+++ b/init.d/net-online.in
@@ -0,0 +1,69 @@
+#!@SBINDIR@/openrc-run
+# Copyright (C) 2015 William Hubbs <w.d.hubbs@gmail.com>
+# Released under the 2-clause BSD license.
+
+description="Delays until the network is online or a specific timeout"
+
+depend()
+{
+ after modules
+ need sysfs
+ keyword -jail -lxc -openvz -prefix -systemd-nspawn -uml -vserver
+}
+
+get_interfaces()
+{
+ local ifname iftype
+ for ifname in /sys/class/net/*; do
+ read iftype < ${ifname}/type
+ [ "$iftype" = "1" ] && printf "%s " ${ifname##*/}
+ done
+}
+
+get_default_gateway()
+{
+ local cmd gateway
+ if command -v ip > /dev/null 2>&1; then
+ cmd="ip route show"
+ else
+ cmd=route
+ fi
+ set -- $($cmd | grep default)
+ [ "$2" != via ] && gateway="$2" || gateway="$3"
+ printf "%s" $gateway
+}
+
+start ()
+{
+ local carriers configured dev gateway ifcount infinite interfaces
+ local rc state timeout x
+
+ 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 x < /sys/class/net/$dev/carrier
+ [ $x -eq 1 ] && : $((carriers += 1))
+ read x < /sys/class/net/$dev/operstate
+ [ "$x" = up ] && : $((configured += 1))
+ done
+ [ $configured -eq $ifcount ] && [ $carriers -ge 1 ] && break
+ sleep 1
+ : $((timeout -= 1))
+ done
+ ! $infinite && [ $timeout -eq 0 ] && rc=1
+ if [ $rc -eq 0 ] && yesno ${ping_default_gateway:-no}; then
+ gateway="$(get_default_gateway)"
+ if [ -n "$gateway" ] && ! ping -c 1 $gateway > /dev/null 2>&1; then
+ rc=1
+ fi
+ fi
+ eend $rc "The network is offline"
+}