#!/bin/sh #set -e PREREQ="udev" prereqs() { echo "$PREREQ" } case $1 in prereqs) prereqs exit 0 ;; esac [ -x /bin/tailscale ] || exit 0 . /scripts/functions PIDFILE="/run/tailscale.pid" if [ -e /etc/tailscale/initramfs/config ]; then . /etc/tailscale/initramfs/config fi if [ -z "${TAILSCALE_HOSTNAME-}" ]; then if [ -f /etc/tailscale/initramfs/hostname ]; then HOSTNAME=$(cat /etc/tailscale/initramfs/hostname) else HOSTNAME=$(hostname -s) fi TAILSCALE_HOSTNAME=${HOSTNAME}-initramfs fi network_up() { for conf in /run/net-*.conf /run/net6-*.conf; do if [ -e "$conf" ]; then # shellcheck disable=SC1090 . "$conf" return 0 fi done return 1 } # shellcheck disable=SC3043 create_resolv_conf() { if [ -e /etc/resolv.conf ]; then return fi local ns for ns in "${IPV4DNS0:-}" "${IPV4DNS1:-}" "${IPV6DNS0:-}" "${IPV6DNS1:-}"; do if [ -n "$ns" ] && [ "$ns" != "0.0.0.0" ]; then echo "nameserver $ns" >> /etc/resolv.conf fi done if [ -e /etc/resolv.conf ]; then return fi for ns in ${FALLBACK_DNS_SERVERS:-}; do if [ -n "$ns" ]; then echo "nameserver $ns" >> /etc/resolv.conf fi done } # shellcheck disable=SC2039,SC2086,SC3043 run_tailscale() { log_begin_msg "Starting tailscale" local options="--state=/var/lib/tailscale/tailscaled.state --socket=/run/tailscale/tailscaled.sock" # FIXME: This races with dropbear-initramfs bringing up the network # asynchronously if [ "$BOOT" != nfs ]; then # Keep trying to bring up the network until it's up # or the boot process continues toward finish. while true; do # "." builtin (in dash) exits on error. Run configure_networking # in a subshell and wait for it. configure_networking & wait $! if ! [ -e "$PIDFILE" ]; then break fi if network_up; then create_resolv_conf break fi done fi # A little race-y to start the client before the daemon, but the client # will attempt to connect to the socket for a while. # https://github.com/tailscale/tailscale/blob/8cf1af8a0703c36256fc58e98ddb63b8907848f1/safesocket/safesocket.go#L119-L122 /bin/tailscale --socket=/run/tailscale/tailscaled.sock up --authkey="${TAILSCALE_AUTHKEY}" --hostname="${TAILSCALE_HOSTNAME}" $TAILSCALE_OPTIONS & if [ "${debug:-}" != y ]; then exec 2>/run/initramfs/tailscale.log fi exec /sbin/tailscaled $options $TAILSCALED_OPTIONS } [ "$BOOT" = nfs ] && configure_networking modprobe tun run_tailscale & echo $! > "$PIDFILE" exit 0