File size: 2,888 Bytes
93a9d59
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#!/usr/bin/env bash
# meshai-a100-trainer: start + SSH hazir olana kadar bekle / tekrar dene.
# Cloud Shell veya gcloud kurulu herhangi bir makinede:
#   bash scripts/gcp_wait_start_ssh.sh
#   bash scripts/gcp_wait_start_ssh.sh --no-ssh          # sadece ac, SSH yapma
#   bash scripts/gcp_wait_start_ssh.sh --cmd 'cd ~/MeshAI_Cloud && ...'

set -euo pipefail

INSTANCE="${INSTANCE:-meshai-a100-trainer}"
ZONE="${ZONE:-europe-west4-a}"
MAX_ATTEMPTS="${MAX_ATTEMPTS:-60}"
SLEEP_SEC="${SLEEP_SEC:-20}"
DO_SSH=1
REMOTE_CMD=""

while [[ $# -gt 0 ]]; do
  case "$1" in
    --no-ssh) DO_SSH=0; shift ;;
    --cmd) REMOTE_CMD="$2"; shift 2 ;;
    --zone) ZONE="$2"; shift 2 ;;
    --instance) INSTANCE="$2"; shift 2 ;;
    *) echo "Bilinmeyen arg: $1"; exit 1 ;;
  esac
done

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

need_gcloud() {
  if ! command -v gcloud >/dev/null 2>&1; then
    echo "HATA: gcloud yok. Bu scripti Cloud Shell'de calistir."
    exit 1
  fi
}

instance_status() {
  gcloud compute instances describe "$INSTANCE" --zone="$ZONE" --format='get(status)' 2>/dev/null || echo "UNKNOWN"
}

ensure_started() {
  local st
  st="$(instance_status)"
  log "Durum: $st"
  if [[ "$st" == "RUNNING" ]]; then
    return 0
  fi
  if [[ "$st" == "STAGING" || "$st" == "PROVISIONING" || "$st" == "STOPPING" ]]; then
    log "Gecis durumu ($st) — bekleniyor..."
    return 1
  fi
  # TERMINATED / STOPPED / SUSPENDED / UNKNOWN
  log "Start deneniyor: $INSTANCE ($ZONE)"
  if gcloud compute instances start "$INSTANCE" --zone="$ZONE"; then
    log "Start komutu OK"
    return 0
  fi
  log "Start basarisiz — tekrar denenecek"
  return 1
}

ssh_ready() {
  # Exit 0 if SSH accepts a trivial command
  gcloud compute ssh "$INSTANCE" --zone="$ZONE" --command="echo SSH_OK" --quiet 2>/dev/null | grep -q SSH_OK
}

need_gcloud
log "Hedef: $INSTANCE / $ZONE (max $MAX_ATTEMPTS x ${SLEEP_SEC}s)"

attempt=0
while (( attempt < MAX_ATTEMPTS )); do
  attempt=$((attempt + 1))
  log "Deneme $attempt/$MAX_ATTEMPTS"

  ensure_started || true
  sleep 5

  st="$(instance_status)"
  if [[ "$st" != "RUNNING" ]]; then
    log "Henuz RUNNING degil ($st) — ${SLEEP_SEC}s"
    sleep "$SLEEP_SEC"
    continue
  fi

  log "RUNNING — SSH kontrol..."
  if ssh_ready; then
    log "SSH hazir."
    if [[ "$DO_SSH" -eq 0 ]]; then
      log " --no-ssh: cikis (VM acik)"
      exit 0
    fi
    if [[ -n "$REMOTE_CMD" ]]; then
      log "Uzak komut calistiriliyor..."
      gcloud compute ssh "$INSTANCE" --zone="$ZONE" --command="$REMOTE_CMD"
      exit $?
    fi
    log "Interaktif SSH aciliyor..."
    exec gcloud compute ssh "$INSTANCE" --zone="$ZONE"
  fi

  log "SSH henuz yok — ${SLEEP_SEC}s sonra tekrar"
  sleep "$SLEEP_SEC"
done

log "HATA: $MAX_ATTEMPTS denemede SSH hazir olmadi."
exit 1