79 lines
2.3 KiB
Bash
Executable File
79 lines
2.3 KiB
Bash
Executable File
#!/bin/sh
|
|
set -eu
|
|
|
|
log() {
|
|
printf '%s\n' "$*" >&2
|
|
}
|
|
|
|
is_true() {
|
|
case "$(printf '%s' "${1:-}" | tr '[:upper:]' '[:lower:]')" in
|
|
1|true|yes|on) return 0 ;;
|
|
*) return 1 ;;
|
|
esac
|
|
}
|
|
|
|
wait_for_kube_api_tunnel() {
|
|
local_host="${K3SCTL_KUBE_API_LOCAL_HOST:-127.0.0.1}"
|
|
local_port="${K3SCTL_KUBE_API_LOCAL_PORT:-6443}"
|
|
attempts="${K3SCTL_KUBE_API_SSH_TUNNEL_WAIT_ATTEMPTS:-30}"
|
|
index=1
|
|
while [ "$index" -le "$attempts" ]; do
|
|
status="$(curl -ksS --connect-timeout 2 --max-time 4 -o /dev/null -w '%{http_code}' "https://${local_host}:${local_port}/version" 2>/dev/null || true)"
|
|
case "$status" in
|
|
200|401|403)
|
|
log "k3sctl-adapter: kube api tunnel reachable status=${status}"
|
|
return 0
|
|
;;
|
|
esac
|
|
sleep 1
|
|
index=$((index + 1))
|
|
done
|
|
log "k3sctl-adapter: kube api tunnel did not become reachable at ${local_host}:${local_port}"
|
|
return 1
|
|
}
|
|
|
|
start_kube_api_ssh_tunnel() {
|
|
if ! is_true "${K3SCTL_KUBE_API_SSH_TUNNEL_ENABLED:-false}"; then
|
|
return 0
|
|
fi
|
|
|
|
ssh_host="${K3SCTL_KUBE_API_SSH_HOST:-host.docker.internal}"
|
|
ssh_user="${K3SCTL_KUBE_API_SSH_USER:-ubuntu}"
|
|
ssh_key="${K3SCTL_KUBE_API_SSH_KEY:-/run/host-ssh/id_ed25519}"
|
|
local_host="${K3SCTL_KUBE_API_LOCAL_HOST:-127.0.0.1}"
|
|
local_port="${K3SCTL_KUBE_API_LOCAL_PORT:-6443}"
|
|
remote_host="${K3SCTL_KUBE_API_REMOTE_HOST:-127.0.0.1}"
|
|
remote_port="${K3SCTL_KUBE_API_REMOTE_PORT:-6443}"
|
|
restart_delay="${K3SCTL_KUBE_API_SSH_RESTART_DELAY_SECONDS:-2}"
|
|
|
|
if [ ! -r "$ssh_key" ]; then
|
|
log "k3sctl-adapter: SSH tunnel key is not readable: ${ssh_key}"
|
|
exit 1
|
|
fi
|
|
|
|
mkdir -p /tmp/k3sctl-ssh
|
|
(
|
|
while :; do
|
|
log "k3sctl-adapter: starting kube api SSH tunnel ${local_host}:${local_port}->${remote_host}:${remote_port} via ${ssh_user}@${ssh_host}"
|
|
ssh \
|
|
-i "$ssh_key" \
|
|
-o BatchMode=yes \
|
|
-o StrictHostKeyChecking=no \
|
|
-o UserKnownHostsFile=/tmp/k3sctl-ssh/known_hosts \
|
|
-o ExitOnForwardFailure=yes \
|
|
-o ServerAliveInterval=15 \
|
|
-o ServerAliveCountMax=3 \
|
|
-N \
|
|
-L "${local_host}:${local_port}:${remote_host}:${remote_port}" \
|
|
"${ssh_user}@${ssh_host}" || true
|
|
log "k3sctl-adapter: kube api SSH tunnel exited; restarting in ${restart_delay}s"
|
|
sleep "$restart_delay"
|
|
done
|
|
) &
|
|
|
|
wait_for_kube_api_tunnel
|
|
}
|
|
|
|
start_kube_api_ssh_tunnel
|
|
exec "$@"
|