#!/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_URL="${ZLH_ARTIFACT_BASE_URL%/}/addons/code-server/code-server.zip" ARTIFACT_TMP="/tmp/code-server.zip" 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="/home/dev/workspace" 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] downloading ${ARTIFACT_URL}" 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 } extract_artifact() { local tmp_dir tmp_dir="$(mktemp -d)" 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" exit 127 fi 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}" } # -------------------------------------------------- # Idempotency # -------------------------------------------------- if [ ! -x "${BIN}" ]; then download_artifact echo "[code-server] extracting ${ARTIFACT_TMP}" rm -rf "${SERVICE_ROOT}" mkdir -p "${SERVICE_ROOT}" extract_artifact 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}" nohup "${BIN}" --bind-addr 0.0.0.0:8080 "${WORKSPACE_DIR}" >"${LOG_FILE}" 2>&1 & echo $! > "${PID_FILE}" fi touch "${MARKER}" rm -f "${ARTIFACT_TMP}" echo "[code-server] install complete"