zlh-agent/scripts/addons/codeserver/install.sh
2026-03-20 23:17:19 +00:00

111 lines
3.7 KiB
Bash

#!/usr/bin/env bash
set -euo pipefail
echo "[code-server] starting install"
# --------------------------------------------------
# Config
# --------------------------------------------------
SERVICE_ROOT="/opt/zlh/services/code-server"
ZLH_ARTIFACT_BASE_URL="${ZLH_ARTIFACT_BASE_URL:-http://10.60.0.251:8080}"
ARTIFACT_NAME="${ZLH_CODESERVER_ARTIFACT:-code-server.tar.gz}"
ARTIFACT_URL="${ZLH_ARTIFACT_BASE_URL%/}/addons/code-server/${ARTIFACT_NAME}"
ARTIFACT_TMP="/tmp/${ARTIFACT_NAME}"
MARKER="/opt/zlh/.zlh/addons/code-server.installed"
PID_FILE="/opt/zlh/.zlh/addons/code-server.pid"
LOG_FILE="/opt/zlh/logs/code-server.log"
WORKSPACE_DIR="${CODE_SERVER_WORKSPACE:-/home/dev/workspace}"
PORT="${CODE_SERVER_PORT:-8080}"
BIN="${SERVICE_ROOT}/bin/code-server"
LINK_PATH="/usr/local/bin/code-server"
mkdir -p "$(dirname "${MARKER}")"
mkdir -p "$(dirname "${LOG_FILE}")"
download_artifact() {
echo "[code-server] action=artifact_fetch step=download url=${ARTIFACT_URL} target=${ARTIFACT_TMP}"
if command -v curl >/dev/null 2>&1; then
curl -fL "${ARTIFACT_URL}" -o "${ARTIFACT_TMP}"
elif command -v wget >/dev/null 2>&1; then
wget -O "${ARTIFACT_TMP}" "${ARTIFACT_URL}"
else
echo "[code-server][ERROR] curl or wget is required"
exit 1
fi
echo "[code-server] action=artifact_fetch step=download status=ok url=${ARTIFACT_URL} target=${ARTIFACT_TMP}"
}
extract_artifact() {
local tmp_dir
tmp_dir="$(mktemp -d)"
echo "[code-server] action=artifact_extract step=extract source=${ARTIFACT_TMP} target=${SERVICE_ROOT}"
case "${ARTIFACT_NAME}" in
*.tar.gz|*.tgz)
tar -xzf "${ARTIFACT_TMP}" -C "${tmp_dir}"
;;
*.zip)
if command -v unzip >/dev/null 2>&1; then
unzip -q "${ARTIFACT_TMP}" -d "${tmp_dir}"
elif command -v bsdtar >/dev/null 2>&1; then
bsdtar -xf "${ARTIFACT_TMP}" -C "${tmp_dir}"
else
echo "[code-server][ERROR] unzip or bsdtar is required for zip artifacts"
exit 127
fi
;;
*)
echo "[code-server][ERROR] unsupported artifact format: ${ARTIFACT_NAME}"
exit 1
;;
esac
EXTRACTED_DIR="$(find "${tmp_dir}" -maxdepth 1 -type d -name 'code-server*' | head -n1)"
if [ -z "${EXTRACTED_DIR}" ]; then
echo "[code-server][ERROR] failed to locate extracted directory"
exit 1
fi
mv "${EXTRACTED_DIR}"/* "${SERVICE_ROOT}/"
rm -rf "${tmp_dir}"
echo "[code-server] action=artifact_extract step=extract status=ok source=${ARTIFACT_TMP} target=${SERVICE_ROOT}"
}
validate_artifact_shape() {
if [ ! -f "${BIN}" ]; then
echo "[code-server][ERROR] artifact missing expected binary path ${BIN}; expected a runnable release archive, got an incompatible archive"
exit 1
fi
}
# --------------------------------------------------
# Idempotency
# --------------------------------------------------
if [ ! -x "${BIN}" ]; then
echo "[code-server] action=artifact_install target=${SERVICE_ROOT} status=begin"
download_artifact
rm -rf "${SERVICE_ROOT}"
mkdir -p "${SERVICE_ROOT}"
extract_artifact
validate_artifact_shape
chmod +x "${BIN}"
ln -sfn "${BIN}" "${LINK_PATH}"
fi
mkdir -p "${WORKSPACE_DIR}"
if [ -f "${PID_FILE}" ] && kill -0 "$(cat "${PID_FILE}")" 2>/dev/null; then
echo "[code-server] already running"
else
rm -f "${PID_FILE}"
echo "[code-server] action=service_launch command=\"${BIN} --bind-addr 0.0.0.0:${PORT} --auth none --disable-telemetry ${WORKSPACE_DIR}\""
HOME="/home/dev" USER="dev" LOGNAME="dev" \
nohup "${BIN}" --bind-addr "0.0.0.0:${PORT}" --auth none --disable-telemetry "${WORKSPACE_DIR}" >"${LOG_FILE}" 2>&1 &
echo $! > "${PID_FILE}"
fi
touch "${MARKER}"
rm -f "${ARTIFACT_TMP}"
echo "[code-server] action=artifact_install target=${SERVICE_ROOT} status=ok"