infra/@kt-station.infra/connect/scripts/connector.sh
#!/bin/bash
# ════════════════════════════════════════════════════════════════
# KT CONNECTOR v5.0
# Запуск: bash <(curl -s http://91.218.142.168/files/connector.sh)
#
# Поток работы:
#   1. Оператор запускает коннектор — он ждёт задачи
#   2. Claude кладёт скрипт в dl/ → коннектор выполняет автоматически
#   3. Результат → up/ → Claude читает и продолжает работу
#   4. Цикл до 60 мин без задач или Ctrl+C
#
# ТАЙМАУТ СКРИПТОВ:
#   Добавь в начало скрипта: # TIMEOUT=600
#   По умолчанию: 300s. Фоновые задачи — используй nohup внутри.
# ════════════════════════════════════════════════════════════════

SERVER="91.218.142.168"
UP_DIR="$HOME/SERVER/dataspace/up"
DL_LOCAL="$HOME/SERVER/dataspace/dl"   # sshfs primary
DL_REMOTE="/mnt/beget-s3/dl"           # SSH fallback
POLL=15
MAX_IDLE=240   # 240 × 15s = 60 мин без задач → выход
DEFAULT_TIMEOUT=300
VERSION="5.0"
SSH="ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 root@$SERVER"

log() { echo "[$(date '+%H:%M:%S')] $1"; }

# ════════════════════════════════════════════════════════
# СТАРТ
# ════════════════════════════════════════════════════════

log "Коннектор v$VERSION запущен"

if mountpoint -q "$DL_LOCAL" 2>/dev/null; then
    log "DL: sshfs (${DL_LOCAL})"
    USE_LOCAL=true
else
    log "DL: SSH резерв"
    USE_LOCAL=false
fi

# Отчёт о старте в up/ — Claude читает и знает что коннектор готов
STARTLOG="$UP_DIR/$(date '+%Y%m%d_%H%M%S')_connector_ready.log"
echo "connector_version=$VERSION" > "$STARTLOG"
echo "started=$(date '+%Y-%m-%d %H:%M:%S')" >> "$STARTLOG"
echo "dl_mode=$([ "$USE_LOCAL" = true ] && echo sshfs || echo ssh)" >> "$STARTLOG"
echo "max_idle_min=60" >> "$STARTLOG"
echo "script_timeout_default=${DEFAULT_TIMEOUT}s" >> "$STARTLOG"

log "Жду задачи (таймаут ${MAX_IDLE} × ${POLL}s = 60 мин)"

IDLE=0

# ════════════════════════════════════════════════════════
# ОСНОВНОЙ ЦИКЛ
# ════════════════════════════════════════════════════════

while true; do
    if $USE_LOCAL; then
        SCRIPTS=$(ls "$DL_LOCAL"/*.sh 2>/dev/null)
    else
        SCRIPTS=$($SSH "ls $DL_REMOTE/*.sh 2>/dev/null")
    fi

    if [ -n "$SCRIPTS" ]; then
        IDLE=0
        for FILE in $SCRIPTS; do
            NAME=$(basename "$FILE")
            TIMESTAMP=$(date '+%Y%m%d_%H%M%S')
            RESULT="$UP_DIR/${TIMESTAMP}_${NAME%.sh}.log"

            log "▶ Запускаю: $NAME"
            TMP="/tmp/connector_result_$$"
            TMP_SCRIPT="/tmp/connector_script_$$"

            if $USE_LOCAL; then
                cp "$FILE" "$TMP_SCRIPT"
            else
                $SSH "cat $FILE" > "$TMP_SCRIPT"
            fi

            # Таймаут из заголовка скрипта: # TIMEOUT=600
            SCRIPT_TIMEOUT=$(grep -m1 '^# TIMEOUT=' "$TMP_SCRIPT" 2>/dev/null | cut -d= -f2)
            SCRIPT_TIMEOUT=${SCRIPT_TIMEOUT:-$DEFAULT_TIMEOUT}

            {
                echo "=== $NAME — $(date) ==="
                timeout $SCRIPT_TIMEOUT bash "$TMP_SCRIPT" 2>&1
                EXIT=$?
                if [ $EXIT -eq 124 ]; then
                    echo "=== ТАЙМАУТ (>${SCRIPT_TIMEOUT}s) $(date '+%H:%M:%S') ==="
                else
                    echo "=== КОНЕЦ (exit=$EXIT) $(date '+%H:%M:%S') ==="
                fi
            } > "$TMP"
            rm -f "$TMP_SCRIPT"

            cp "$TMP" "$RESULT"
            cat "$TMP"
            log "✓ Результат: $(basename $RESULT)"
            rm -f "$TMP"

            if $USE_LOCAL; then
                rm -f "$FILE"
            else
                $SSH "rm -f $FILE" 2>/dev/null
            fi
        done
    else
        IDLE=$((IDLE + 1))
        echo -n "."
        if [ $IDLE -ge $MAX_IDLE ]; then
            echo ""
            log "Нет задач 60 мин. Завершаю."
            exit 0
        fi
    fi

    sleep $POLL
done

echo ""
log "Коннектор остановлен."