From 9a9eced188c34c385032381259dc1a509db9828c Mon Sep 17 00:00:00 2001 From: Julien Cabillot Date: Mon, 30 Mar 2026 17:01:40 -0400 Subject: [PATCH] feat: add lockfile --- Dockerfile | 5 ++--- opencode-attach | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 303481e..ae318b6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,9 +6,8 @@ RUN apt-get update && apt-get upgrade -y && \ RUN set -eux; \ userdel -r node; \ groupadd -g 1000 opencode; \ - useradd -m -u 1000 -g 1000 opencode - -RUN npm update -g && \ + useradd -m -u 1000 -g 1000 -s /usr/bin/bash opencode && \ + npm update -g && \ npm install -g opencode-ai n2-soul@9.0.8 && \ npm cache clean --force diff --git a/opencode-attach b/opencode-attach index b59c417..46adeab 100644 --- a/opencode-attach +++ b/opencode-attach @@ -1,7 +1,48 @@ #!/bin/sh set -eu +LOCKFILE="${OPENCODE_ATTACH_LOCK:-/tmp/opencode-attach.lock}" + : "${OPENCODE_SERVER_PASSWORD:?OPENCODE_SERVER_PASSWORD is required}" : "${OPENCODE_API_URL:?OPENCODE_API_URL is required}" +cleanup_lock() { + if [ -f "$LOCKFILE" ]; then + existing_pid=$(cat "$LOCKFILE" 2>/dev/null || true) + [ "$existing_pid" = "$$" ] && rm -f "$LOCKFILE" + fi +} + +kill_existing_instance() { + if [ ! -f "$LOCKFILE" ]; then + return + fi + + existing_pid=$(cat "$LOCKFILE" 2>/dev/null || true) + if [ -z "$existing_pid" ] || [ "$existing_pid" = "$$" ]; then + rm -f "$LOCKFILE" + return + fi + + if kill -0 "$existing_pid" 2>/dev/null; then + kill "$existing_pid" 2>/dev/null + for _ in 1 2 3 4 5; do + if ! kill -0 "$existing_pid" 2>/dev/null; then + break + fi + sleep 1 + done + if kill -0 "$existing_pid" 2>/dev/null; then + kill -9 "$existing_pid" 2>/dev/null || true + fi + fi + + rm -f "$LOCKFILE" +} + +trap cleanup_lock INT TERM EXIT + +kill_existing_instance +printf '%s\n' "$$" > "$LOCKFILE" + exec opencode attach -p "${OPENCODE_SERVER_PASSWORD}" "${OPENCODE_API_URL}" "$@"