65 lines
2.4 KiB
Bash
Executable File
65 lines
2.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
# A holder may create only the configured named socket. Existing servers are
|
|
# accepted only when their private install-derived ownership identity, exact
|
|
# holder session, and complete approved global environment all match.
|
|
|
|
MOSAIC_HOME=${MOSAIC_HOME:-$HOME/.config/mosaic}
|
|
MOSAIC_TMUX_SOCKET=${MOSAIC_TMUX_SOCKET:-mosaic-fleet}
|
|
MOSAIC_TMUX_HOLDER=${MOSAIC_TMUX_HOLDER:-_holder}
|
|
OWNER_FILE="$MOSAIC_HOME/fleet/run/holder-owner"
|
|
TMUX_BIN=/usr/bin/tmux
|
|
|
|
fail() {
|
|
echo "ERROR: refusing unmanaged Mosaic tmux server on socket ${MOSAIC_TMUX_SOCKET}: $1" >&2
|
|
exit 64
|
|
}
|
|
|
|
[ -x "$TMUX_BIN" ] || fail "tmux binary is unavailable"
|
|
[ -f "$OWNER_FILE" ] && [ ! -L "$OWNER_FILE" ] || fail "private ownership identity is missing"
|
|
owner_mode=$(stat -c '%a' -- "$OWNER_FILE") || fail "private ownership identity is unreadable"
|
|
(( (8#$owner_mode & 8#077) == 0 )) || fail "private ownership identity has unsafe permissions"
|
|
MOSAIC_FLEET_OWNER=$(tr -d '\n' < "$OWNER_FILE")
|
|
[[ "$MOSAIC_FLEET_OWNER" =~ ^[a-f0-9-]{36}$ ]] || fail "private ownership identity is malformed"
|
|
|
|
_tmux() {
|
|
"$TMUX_BIN" -L "$MOSAIC_TMUX_SOCKET" "$@"
|
|
}
|
|
|
|
server_running() {
|
|
_tmux list-sessions >/dev/null 2>&1
|
|
}
|
|
|
|
assert_owned_server() {
|
|
_tmux has-session -t "=${MOSAIC_TMUX_HOLDER}:0.0" 2>/dev/null || fail "exact holder session is absent"
|
|
local environment
|
|
environment=$(_tmux show-environment -g 2>/dev/null) || fail "global environment is unreadable"
|
|
local expected
|
|
expected=$(printf '%s\n' \
|
|
"HOME=$HOME" \
|
|
'PATH=/usr/bin:/bin' \
|
|
"PWD=$HOME" \
|
|
"MOSAIC_FLEET_OWNER=$MOSAIC_FLEET_OWNER" \
|
|
"MOSAIC_TMUX_HOLDER=$MOSAIC_TMUX_HOLDER" \
|
|
"MOSAIC_TMUX_SOCKET=$MOSAIC_TMUX_SOCKET" | sort)
|
|
[ "$(printf '%s\n' "$environment" | sort)" = "$expected" ] || \
|
|
fail "global environment does not match the owned-server contract"
|
|
}
|
|
|
|
if server_running; then
|
|
assert_owned_server
|
|
else
|
|
cd "$HOME" || fail "trusted home is unavailable"
|
|
# Start the tmux server itself under the approved environment. The holder pane
|
|
# receives the same closed environment rather than arbitrary server globals.
|
|
/usr/bin/env -i \
|
|
"HOME=$HOME" \
|
|
PATH=/usr/bin:/bin \
|
|
"MOSAIC_FLEET_OWNER=$MOSAIC_FLEET_OWNER" \
|
|
"MOSAIC_TMUX_HOLDER=$MOSAIC_TMUX_HOLDER" \
|
|
"MOSAIC_TMUX_SOCKET=$MOSAIC_TMUX_SOCKET" \
|
|
"$TMUX_BIN" -L "$MOSAIC_TMUX_SOCKET" new-session -d -s "$MOSAIC_TMUX_HOLDER" \
|
|
/usr/bin/env -i "HOME=$HOME" PATH=/usr/bin:/bin /bin/sh -c 'while true; do sleep 3600; done'
|
|
fi
|