#!/usr/bin/env bash # サーバー側で root として実行し、各ユーザーの Claude Code systemd user service を同期する set -euo pipefail APP_DIR="$(cd "$(dirname "$0")/.." && pwd)" TEMPLATE_SRC="$APP_DIR/systemd/user/claude-code@.service" SESSIONS_FILE="$APP_DIR/claude-code-sessions.txt" # sessions.txt をパースして user -> repos のマップを構築 declare -A user_repos while IFS= read -r line; do [[ "$line" =~ ^#.*$ || -z "$line" ]] && continue user="${line%%:*}" repo="${line#*:}" user_repos["$user"]+=" $repo" done < "$SESSIONS_FILE" for user in "${!user_repos[@]}"; do uid=$(id -u "$user" 2>/dev/null) || { echo "WARNING: user $user not found, skipping"; continue; } runtime_dir="/run/user/$uid" systemd_dir="/home/$user/.config/systemd/user" mkdir -p "$systemd_dir" chown "$user:$user" "$systemd_dir" # テンプレートを更新(差分があれば) if ! diff -q "$TEMPLATE_SRC" "$systemd_dir/claude-code@.service" >/dev/null 2>&1; then echo "[$user] Updating claude-code@.service template" cp "$TEMPLATE_SRC" "$systemd_dir/claude-code@.service" chown "$user:$user" "$systemd_dir/claude-code@.service" runuser -u "$user" -- env XDG_RUNTIME_DIR="$runtime_dir" DBUS_SESSION_BUS_ADDRESS="unix:path=$runtime_dir/bus" \ systemctl --user daemon-reload fi # sessions.txt で指定されたリポジトリを enable & start desired=() for repo in ${user_repos[$user]}; do [[ -z "$repo" ]] && continue desired+=("$repo") repo_path="/home/$user/workspaces/repos/$repo" if [[ ! -d "$repo_path" ]]; then echo "[$user] WARNING: $repo_path not found, skipping $repo" continue fi runuser -u "$user" -- env XDG_RUNTIME_DIR="$runtime_dir" DBUS_SESSION_BUS_ADDRESS="unix:path=$runtime_dir/bus" \ systemctl --user enable "claude-code@${repo}.service" 2>/dev/null || true if ! runuser -u "$user" -- env XDG_RUNTIME_DIR="$runtime_dir" DBUS_SESSION_BUS_ADDRESS="unix:path=$runtime_dir/bus" \ systemctl --user is-active "claude-code@${repo}.service" >/dev/null 2>&1; then echo "[$user] Starting claude-code@${repo}.service" runuser -u "$user" -- env XDG_RUNTIME_DIR="$runtime_dir" DBUS_SESSION_BUS_ADDRESS="unix:path=$runtime_dir/bus" \ systemctl --user start "claude-code@${repo}.service" || true fi done # sessions.txt にないが enabled になっているインスタンスを無効化 while IFS= read -r unit; do instance="${unit#claude-code@}" instance="${instance%.service}" if ! printf '%s\n' "${desired[@]}" | grep -qx "$instance"; then echo "[$user] Disabling claude-code@${instance}.service (not in sessions.txt)" runuser -u "$user" -- env XDG_RUNTIME_DIR="$runtime_dir" DBUS_SESSION_BUS_ADDRESS="unix:path=$runtime_dir/bus" \ systemctl --user disable --now "claude-code@${instance}.service" || true fi done < <(runuser -u "$user" -- env XDG_RUNTIME_DIR="$runtime_dir" DBUS_SESSION_BUS_ADDRESS="unix:path=$runtime_dir/bus" \ systemctl --user list-unit-files --plain --no-legend 'claude-code@*.service' 2>/dev/null \ | awk '$2 == "enabled" {print $1}') done echo "Claude Code session sync complete."