From b30e74b5956ac770dec5c98d6324b41b6e022d98 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Wed, 19 Jun 2019 13:18:34 +0200 Subject: [PATCH] wg-quick: darwin: support being called from launchd This causes wg-quick up to wait for the monitor to exit before it exits, so that launchd can correctly wait on it. Reported-by: Cameron Palmer Signed-off-by: Jason A. Donenfeld --- contrib/launchd/README | 12 ++++++++++++ contrib/launchd/com.wireguard.wg0.plist | 25 +++++++++++++++++++++++++ src/wg-quick/darwin.bash | 17 ++++++++++++++++- 3 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 contrib/launchd/README create mode 100644 contrib/launchd/com.wireguard.wg0.plist diff --git a/contrib/launchd/README b/contrib/launchd/README new file mode 100644 index 0000000..67f8d3c --- /dev/null +++ b/contrib/launchd/README @@ -0,0 +1,12 @@ +WireGuard for Launchd +===================== + +The example `com.wireguard.wg0.plist` file may be used for running wg-quick(8) +as a launchd service. Note that the `PATH` variable is modified to point to +the PATH used by Homebrew or Macports, so that it uses the non-system bash(1). + +Usage +----- + +$ sudo cp com.wireguard.wg0.plist /Library/LaunchDaemons +$ sudo launchctl load /Library/LaunchDaemons/com.wireguard.wg0.plist diff --git a/contrib/launchd/com.wireguard.wg0.plist b/contrib/launchd/com.wireguard.wg0.plist new file mode 100644 index 0000000..9fc0141 --- /dev/null +++ b/contrib/launchd/com.wireguard.wg0.plist @@ -0,0 +1,25 @@ + + + + + Label + com.wireguard.wg0 + ProgramArguments + + /usr/local/bin/wg-quick + up + /usr/local/etc/wireguard/wg0.conf + + OnDemand + + RunAtLoad + + TimeOut + 90 + EnvironmentVariables + + PATH + /usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin + + + diff --git a/src/wg-quick/darwin.bash b/src/wg-quick/darwin.bash index a2b3789..d5dd396 100755 --- a/src/wg-quick/darwin.bash +++ b/src/wg-quick/darwin.bash @@ -81,6 +81,17 @@ parse_options() { shopt -u nocasematch } +detect_launchd() { + unset LAUNCHED_BY_LAUNCHD + local line + while read -r line; do + if [[ $line =~ ^\s*domain\ =\ ]]; then + LAUNCHED_BY_LAUNCHD=1 + break + fi + done < <(launchctl procinfo $$ 2>/dev/null) +} + read_bool() { case "$2" in true) printf -v "$1" 1 ;; @@ -308,7 +319,8 @@ monitor_daemon() { set_dns sleep 2 && kill -ALRM $pid 2>/dev/null & fi - done < <(route -n monitor)) & disown + done < <(route -n monitor)) & + [[ -n $LAUNCHED_BY_LAUNCHD ]] || disown } add_route() { @@ -463,6 +475,7 @@ if [[ $# -eq 1 && ( $1 == --help || $1 == -h || $1 == help ) ]]; then cmd_usage elif [[ $# -eq 2 && $1 == up ]]; then auto_su + detect_launchd parse_options "$2" cmd_up elif [[ $# -eq 2 && $1 == down ]]; then @@ -482,4 +495,6 @@ else exit 1 fi +[[ -n $LAUNCHED_BY_LAUNCHD ]] && wait + exit 0