|
3 | 3 | # Use of this source code is governed by a BSD-style |
4 | 4 | # license that can be found in the LICENSE file. |
5 | 5 |
|
6 | | -set -euxo pipefail |
| 6 | +check_userspace() { |
| 7 | + if [[ ! -c /dev/net/tun ]]; then |
| 8 | + >&2 cat - <<-EOF |
| 9 | +Error: /dev/net/tun is missing and could not be created! |
| 10 | +
|
| 11 | +taiilscaled will fail to start. |
| 12 | +
|
| 13 | +You can start tailscaled manually in userspace mode, see: |
| 14 | + https://tailscale.com/kb/1112/userspace-networking |
| 15 | +EOF |
| 16 | + fi |
| 17 | +} |
7 | 18 |
|
8 | 19 | # Note: It is not recommended that users copy this setting into other |
9 | 20 | # environments, the feature is in test and will be formally released in the |
10 | 21 | # future, debug flags may later be recycled for other purposes leading to |
11 | 22 | # unexpected behavior. |
12 | 23 | export TS_DEBUG_FIREWALL_MODE=auto |
| 24 | +TAILSCALED_PID="" |
| 25 | +TAILSCALED_SOCK=/var/run/tailscale/tailscaled.sock |
| 26 | +TAILSCALED_LOG=/var/log/tailscaled.log |
13 | 27 | if [[ "$(id -u)" -eq 0 ]]; then |
14 | | - mkdir -p /workspaces/.tailscale || true |
15 | | - 2>/dev/null >/dev/null \ |
| 28 | + if [[ ! -c /dev/net/tun ]]; then |
| 29 | + mkdir -p /dev/net |
| 30 | + mknod /dev/net/tun c 10 200 |
| 31 | + fi |
| 32 | + check_userspace |
| 33 | + mkdir -p /workspaces/.tailscale /var/log |
| 34 | + touch $TAILSCALED_LOG |
| 35 | + >$TAILSCALED_LOG 2>&1 \ |
16 | 36 | /usr/local/sbin/tailscaled \ |
17 | 37 | --statedir=/workspaces/.tailscale/ \ |
18 | | - --socket=/var/run/tailscale/tailscaled.sock \ |
| 38 | + --socket=$TAILSCALED_SOCK \ |
19 | 39 | --port=41641 & |
| 40 | + TAILSCALED_PID=$! |
20 | 41 | elif command -v sudo > /dev/null; then |
21 | | - sudo --non-interactive mkdir -p /workspaces/.tailscale |
22 | | - 2>/dev/null >/dev/null \ |
| 42 | + if [[ ! -c /dev/net/tun ]]; then |
| 43 | + sudo --non-interactive mkdir -p /dev/net |
| 44 | + sudo --non-interactive mknod /dev/net/tun c 10 200 |
| 45 | + fi |
| 46 | + check_userspace |
| 47 | + sudo --non-interactive mkdir -p /workspaces/.tailscale /var/log |
| 48 | + sudo --non-interactive touch $TAILSCALED_LOG |
| 49 | + >$TAILSCALED_LOG 2>&1 \ |
23 | 50 | sudo --non-interactive "TS_DEBUG_FIREWALL_MODE=$TS_DEBUG_FIREWALL_MODE" \ |
24 | 51 | /usr/local/sbin/tailscaled \ |
25 | 52 | --statedir=/workspaces/.tailscale/ \ |
26 | | - --socket=/var/run/tailscale/tailscaled.sock \ |
| 53 | + --socket=$TAILSCALED_SOCK \ |
27 | 54 | --port=41641 & |
| 55 | + TAILSCALED_PID=$! |
28 | 56 | else |
29 | 57 | >&2 echo "tailscaled could not start as root." |
30 | 58 | fi |
31 | 59 | unset TS_DEBUG_FIREWALL_MODE |
32 | 60 |
|
| 61 | +if [[ -n "$TAILSCALED_PID" ]]; then |
| 62 | + count=100 |
| 63 | + while ((count--)); do |
| 64 | + [[ -f $TAILSCALED_SOCK ]] && break |
| 65 | + sleep 0.01 |
| 66 | + |
| 67 | + if ! kill -0 "$TAILSCALED_PID"; then |
| 68 | + >&2 echo "ERROR: tailscaled exited during startup, logs follow:" |
| 69 | + >&2 cat $TAILSCALED_LOG |
| 70 | + break |
| 71 | + fi |
| 72 | + done |
| 73 | +fi |
| 74 | + |
33 | 75 | exec "$@" |
0 commit comments