summaryrefslogtreecommitdiff
path: root/network-online
diff options
context:
space:
mode:
Diffstat (limited to 'network-online')
-rwxr-xr-xnetwork-online51
1 files changed, 51 insertions, 0 deletions
diff --git a/network-online b/network-online
new file mode 100755
index 0000000..e04eee9
--- /dev/null
+++ b/network-online
@@ -0,0 +1,51 @@
+#!/usr/bin/env bash
+# Copyright © 2015-2016 Luke Shumaker <lukeshu@sbcglobal.net>
+# This work is free. You can redistribute it and/or modify it under the
+# terms of the Do What The Fuck You Want To Public License, Version 2,
+# as published by Sam Hocevar. See the COPYING file for more details.
+
+# Usage: network-online [start|stop] NETWORK_NAME
+mode="$1"
+lock=/run/network-online/lock
+fifo=/run/network-online/"$2"
+PS4="$mode: "
+
+# Use a named pipe (fifo) as an inter-process synchronization
+# mechanism; a call to block_{a,b} blocks until its counterpart is
+# run.
+block_a() {
+ cat "$fifo" >/dev/null
+}
+block_b() {
+ echo foo >> "$fifo"
+}
+
+# Because of restrictions put in place by systemd, the ExecStart
+# process can't run `systemctl stop network-online.target`, but the
+# ExecStop process can.
+case "$mode" in
+ start)
+ trap 'rm -f -- "$fifo"' EXIT
+ set -x
+ mkdir -p /run/network-online || exit $?
+ exec 8>"$lock" || exit $?
+ flock -s 8 || exit $?
+ systemctl start network-online.target || exit $?
+ mkfifo "$fifo" || exit $?
+
+ block_a # wait for 'stop' to be called
+ exec 8>&-
+ block_a # signal to 'stop' that we've unlocked
+ ;;
+ stop)
+ set -x
+ exec 8>"$lock" || exit $?
+ flock -s 8 || exit $?
+ block_b # signal 'start' to stop
+ block_b # wait for 'start' to unlock
+ if flock -x -n 8; then
+ systemctl stop network-online.target
+ rm -rf /run/network-online
+ fi
+ ;;
+esac