#!/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 --allowed-hosts all ${WORKSPACE_DIR}\"" HOME="/home/dev" USER="dev" LOGNAME="dev" \ nohup "${BIN}" --bind-addr "0.0.0.0:${PORT}" --auth none --disable-telemetry --allowed-hosts all "${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"