diff options
Diffstat (limited to 'network-online')
-rwxr-xr-x | network-online | 51 |
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 |