HayrettinIscan commited on
Commit
93a9d59
·
verified ·
1 Parent(s): bf177cd

Add GCP wait-start-ssh helper

Browse files
Files changed (1) hide show
  1. scripts/gcp_wait_start_ssh.sh +105 -0
scripts/gcp_wait_start_ssh.sh ADDED
@@ -0,0 +1,105 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env bash
2
+ # meshai-a100-trainer: start + SSH hazir olana kadar bekle / tekrar dene.
3
+ # Cloud Shell veya gcloud kurulu herhangi bir makinede:
4
+ # bash scripts/gcp_wait_start_ssh.sh
5
+ # bash scripts/gcp_wait_start_ssh.sh --no-ssh # sadece ac, SSH yapma
6
+ # bash scripts/gcp_wait_start_ssh.sh --cmd 'cd ~/MeshAI_Cloud && ...'
7
+
8
+ set -euo pipefail
9
+
10
+ INSTANCE="${INSTANCE:-meshai-a100-trainer}"
11
+ ZONE="${ZONE:-europe-west4-a}"
12
+ MAX_ATTEMPTS="${MAX_ATTEMPTS:-60}"
13
+ SLEEP_SEC="${SLEEP_SEC:-20}"
14
+ DO_SSH=1
15
+ REMOTE_CMD=""
16
+
17
+ while [[ $# -gt 0 ]]; do
18
+ case "$1" in
19
+ --no-ssh) DO_SSH=0; shift ;;
20
+ --cmd) REMOTE_CMD="$2"; shift 2 ;;
21
+ --zone) ZONE="$2"; shift 2 ;;
22
+ --instance) INSTANCE="$2"; shift 2 ;;
23
+ *) echo "Bilinmeyen arg: $1"; exit 1 ;;
24
+ esac
25
+ done
26
+
27
+ log() { echo "[$(date '+%H:%M:%S')] $*"; }
28
+
29
+ need_gcloud() {
30
+ if ! command -v gcloud >/dev/null 2>&1; then
31
+ echo "HATA: gcloud yok. Bu scripti Cloud Shell'de calistir."
32
+ exit 1
33
+ fi
34
+ }
35
+
36
+ instance_status() {
37
+ gcloud compute instances describe "$INSTANCE" --zone="$ZONE" --format='get(status)' 2>/dev/null || echo "UNKNOWN"
38
+ }
39
+
40
+ ensure_started() {
41
+ local st
42
+ st="$(instance_status)"
43
+ log "Durum: $st"
44
+ if [[ "$st" == "RUNNING" ]]; then
45
+ return 0
46
+ fi
47
+ if [[ "$st" == "STAGING" || "$st" == "PROVISIONING" || "$st" == "STOPPING" ]]; then
48
+ log "Gecis durumu ($st) — bekleniyor..."
49
+ return 1
50
+ fi
51
+ # TERMINATED / STOPPED / SUSPENDED / UNKNOWN
52
+ log "Start deneniyor: $INSTANCE ($ZONE)"
53
+ if gcloud compute instances start "$INSTANCE" --zone="$ZONE"; then
54
+ log "Start komutu OK"
55
+ return 0
56
+ fi
57
+ log "Start basarisiz — tekrar denenecek"
58
+ return 1
59
+ }
60
+
61
+ ssh_ready() {
62
+ # Exit 0 if SSH accepts a trivial command
63
+ gcloud compute ssh "$INSTANCE" --zone="$ZONE" --command="echo SSH_OK" --quiet 2>/dev/null | grep -q SSH_OK
64
+ }
65
+
66
+ need_gcloud
67
+ log "Hedef: $INSTANCE / $ZONE (max $MAX_ATTEMPTS x ${SLEEP_SEC}s)"
68
+
69
+ attempt=0
70
+ while (( attempt < MAX_ATTEMPTS )); do
71
+ attempt=$((attempt + 1))
72
+ log "Deneme $attempt/$MAX_ATTEMPTS"
73
+
74
+ ensure_started || true
75
+ sleep 5
76
+
77
+ st="$(instance_status)"
78
+ if [[ "$st" != "RUNNING" ]]; then
79
+ log "Henuz RUNNING degil ($st) — ${SLEEP_SEC}s"
80
+ sleep "$SLEEP_SEC"
81
+ continue
82
+ fi
83
+
84
+ log "RUNNING — SSH kontrol..."
85
+ if ssh_ready; then
86
+ log "SSH hazir."
87
+ if [[ "$DO_SSH" -eq 0 ]]; then
88
+ log " --no-ssh: cikis (VM acik)"
89
+ exit 0
90
+ fi
91
+ if [[ -n "$REMOTE_CMD" ]]; then
92
+ log "Uzak komut calistiriliyor..."
93
+ gcloud compute ssh "$INSTANCE" --zone="$ZONE" --command="$REMOTE_CMD"
94
+ exit $?
95
+ fi
96
+ log "Interaktif SSH aciliyor..."
97
+ exec gcloud compute ssh "$INSTANCE" --zone="$ZONE"
98
+ fi
99
+
100
+ log "SSH henuz yok — ${SLEEP_SEC}s sonra tekrar"
101
+ sleep "$SLEEP_SEC"
102
+ done
103
+
104
+ log "HATA: $MAX_ATTEMPTS denemede SSH hazir olmadi."
105
+ exit 1