#!/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 "Коннектор остановлен."