#!/usr/bin/env bash set -e CMD0="${0##*/}" TS_HOSTNAME="${HOSTNAME}-initrd" TS_STATEDIR=/etc/initcpio/tailscale PID="" usage() { cat <&2 "${CMD0} INFO : %s\n" "$1"; } error() { printf >&2 "${CMD0} ERROR: %s\n" "$1"; } die() { error "$@"; exit 1; } cleanup() { if [[ -n "${SETUPDIR}" ]]; then rm -rf "${SETUPDIR}" fi if [[ -n "$PID" ]]; then kill "$PID" 2>/dev/null fi exit 0 } trap "cleanup" EXIT # Scan arguments looking for --hostname=VALUE FOUND_HOSTNAME_IN_ARGS=no for arg in "$@"; do if [[ $arg =~ ^(-h|--help|help)$ ]]; then usage exit 0 fi if [[ $arg =~ ^--hostname= ]]; then TS_HOSTNAME=${arg#*=} TS_HOSTNAME=${TS_HOSTNAME//[\"\']} FOUND_HOSTNAME_IN_ARGS=yes fi done [[ $FOUND_HOSTNAME_IN_ARGS == yes ]] || set -- --hostname="$TS_HOSTNAME" "$@" SETUPDIR="$(mktemp -d)" socket="${SETUPDIR}/tailscaled.sock" state="${SETUPDIR}/tailscaled.state" tailscaled \ -state="$state" \ -socket="$socket" \ -no-logs-no-support \ -tun=userspace-networking \ >"${SETUPDIR}/setup.log" 2>&1 & PID="$!" # --accept-risk=lose-ssh is fine because we are setting up an isolated tailscaled daemon, # it has nothing to do with system tailscale service. if ! tailscale --socket="$socket" up --qr --accept-risk=lose-ssh "$@"; then cp -f "${SETUPDIR}/setup.log" /tmp/setup-initcpio-tailscale-daemon.log die "Failed to configure tailscale. Check daemon logs at /tmp/setup-initcpio-tailscale-daemon.log" fi [[ "$(id -u)" != 0 ]] && xsu=sudo || xsu="" $xsu install -o root -g root -m600 -d "${TS_STATEDIR}" $xsu install -o root -g root -m644 -t "${TS_STATEDIR}" "${SETUPDIR}/tailscaled.state" $xsu tee "${TS_STATEDIR}/default.env" >/dev/null <