diff --git a/agent-arka/install.sh b/agent-arka/install.sh index 5f4d8e1..16c5bc0 100755 --- a/agent-arka/install.sh +++ b/agent-arka/install.sh @@ -157,6 +157,19 @@ ensure_path() { warn "Added ${bindir} to PATH in ${rc} (open a new shell, or: source ${rc})" } +# Normalize a CalVer "YYYY.M.D" into a single sortable integer (YYYYMMDD pads). +ver_cmp_key() { + printf '%s' "$1" | awk -F. '{ printf "%04d%02d%02d", $1, $2, $3 }' 2>/dev/null || printf '%s' 0 +} + +# Installed version, or empty when there is no binary/detectable version. +installed_version() { + local bin="$1" out + [[ -x "$bin" ]] || return 1 + out=$("$bin" --version 2>/dev/null | head -n 1) || return 1 + printf '%s\n' "$out" | grep -oE '[0-9]{4}\.[0-9]+(\.[0-9]+)?' | tail -n 1 +} + main() { printf '%s\n' "${C_BOLD}Agent Arka${C_RESET} — web dashboard installer" command -v curl >/dev/null 2>&1 || die "curl is required" @@ -183,6 +196,31 @@ main() { info "Latest: ${version}" fi + # Update handling: detect an existing install and skip / stop / back it up. + local existing + existing=$(installed_version "${bindir}/agent-arka" 2>/dev/null || true) + if [[ -n "$existing" ]]; then + local ek tk + ek=$(ver_cmp_key "$existing") + tk=$(ver_cmp_key "$version") + if [[ "$ek" == "$tk" ]]; then + info "Already up to date: agent-arka ${existing} (target ${version})" + ensure_path "$bindir" + return 0 + fi + if [[ "$ek" -gt "$tk" ]]; then + warn "Downgrading ${existing} -> ${version}" + else + info "Upgrading ${existing} -> ${version}" + fi + # Bring the running daemon down before replacing the binary. + if AGENT_ARKA_HOME="${HOME_DIR}" LIBREFANG_HOME="${HOME_DIR}" "${bindir}/agent-arka" stop >/dev/null 2>&1; then + ok "Stopped running agent-arka ${existing}" + fi + # Keep a rollback copy of the current binary. + cp -f "${bindir}/agent-arka" "${bindir}/agent-arka.previous" 2>/dev/null || true + fi + local tag="${TAG_PREFIX}${version}" local asset="agent-arka-${version}-${PLATFORM}.tar.gz" local url="${PUBLIC_DL}/${tag}/${asset}"