File size: 3,531 Bytes
e0d0466
99c21be
 
 
 
e0d0466
99c21be
e0d0466
 
99c21be
 
 
 
e0d0466
99c21be
e0d0466
 
 
 
 
 
 
 
 
 
 
 
 
 
99c21be
e0d0466
 
 
 
 
 
99c21be
e0d0466
 
 
99c21be
e0d0466
 
 
 
 
 
 
 
 
 
99c21be
e0d0466
99c21be
 
e0d0466
99c21be
e0d0466
 
99c21be
e0d0466
99c21be
e0d0466
 
 
 
 
 
99c21be
e0d0466
99c21be
e0d0466
 
 
 
 
 
 
 
99c21be
e0d0466
 
 
 
 
 
 
 
 
 
 
 
 
99c21be
e0d0466
99c21be
e0d0466
 
 
99c21be
e0d0466
 
 
 
 
99c21be
e0d0466
 
99c21be
e0d0466
99c21be
 
 
e0d0466
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
107
108
109
110
111
112
113
114
115
#!/usr/bin/env bash
# removeRunpodSafely.sh — Remove o POD atual do RunPod após um atraso.
# Requisitos: bash, runpodctl; env RUNPOD_POD_ID presente.
# Comportamento: aguarda SECONDS_ALIVE (default 7200), barra de progresso,
# Ctrl+C cancela com segurança, janela final de 5s, e então REMOVE o pod.

set -Eeuo pipefail
umask 077

DEFAULT_SECONDS=7200          # 2 horas
MAX_SECONDS=$((14*24*3600))   # limite de segurança: 14 dias
PROGRESS_WIDTH=50
GRACE_SECONDS=5

#--- utils ---#
format_duration() {
  local sec=${1:-0}
  local h=$(( sec / 3600 ))
  local m=$(( (sec % 3600) / 60 ))
  local s=$(( sec % 60 ))
  printf "%02d:%02d:%02d" "$h" "$m" "$s"
}
repeat_char() {
  local n=${1:-0} ch="${2:-#}" buf=
  (( n < 0 )) && n=0
  printf -v buf '%*s' "$n" ''
  echo "${buf// /$ch}"
}

#--- parâmetros ---#
SECONDS_TOTAL="${SECONDS_ALIVE:-$DEFAULT_SECONDS}"
if [[ ! "$SECONDS_TOTAL" =~ ^[0-9]+$ ]]; then
  echo "ERRO: SECONDS_ALIVE precisa ser um inteiro >= 0 (em segundos)." >&2
  exit 2
fi
if (( SECONDS_TOTAL > MAX_SECONDS )); then
  echo "Aviso: SECONDS_ALIVE=$SECONDS_TOTAL excede o limite de segurança; limitando a $MAX_SECONDS."
  SECONDS_TOTAL="$MAX_SECONDS"
fi

#--- pré-checagens mínimas ---#
if ! command -v runpodctl >/dev/null 2>&1; then
  echo "ERRO: 'runpodctl' não encontrado no PATH. Execute dentro de um pod do RunPod." >&2
  exit 3
fi
POD_ID="${RUNPOD_POD_ID:-}"
if [[ -z "$POD_ID" ]]; then
  echo "ERRO: RUNPOD_POD_ID não definido. Este script deve rodar dentro de um pod do RunPod." >&2
  exit 4
fi

#--- header ---#
echo "==================== REMOVER POD RUNPOD (SEGURO) ===================="
echo "Pod: $POD_ID"
echo "Ação: REMOVE (apagar/terminar)"
echo "Tempo até a remoção: $(format_duration "$SECONDS_TOTAL")"
echo "Pressione Ctrl+C a qualquer momento para CANCELAR sem remover."
echo "======================================================================"

#--- progresso + cancelamento ---#
CANCELLED=0
on_cancel(){ CANCELLED=1; }
trap on_cancel INT TERM

START_TS=$(date +%s)
END_TS=$(( START_TS + SECONDS_TOTAL ))

while :; do
  (( CANCELLED )) && { echo -e "\nCancelado pelo usuário. Nada foi removido."; exit 130; }
  NOW=$(date +%s)
  (( NOW >= END_TS )) && break

  ELAPSED=$(( NOW - START_TS ))
  REMAIN=$(( END_TS - NOW ))

  if (( SECONDS_TOTAL > 0 )); then
    PERCENT=$(( (ELAPSED * 100) / SECONDS_TOTAL ))
    FILLED=$(( (ELAPSED * PROGRESS_WIDTH) / SECONDS_TOTAL ))
  else
    PERCENT=100; FILLED=$PROGRESS_WIDTH
  fi
  (( FILLED > PROGRESS_WIDTH )) && FILLED=$PROGRESS_WIDTH
  EMPTY=$(( PROGRESS_WIDTH - FILLED ))

  BAR_FILLED=$(repeat_char "$FILLED" "#")
  BAR_EMPTY=$(repeat_char "$EMPTY" ".")
  printf "\r[%s%s] %3d%% | faltam %s " \
    "$BAR_FILLED" "$BAR_EMPTY" "$PERCENT" "$(format_duration "$REMAIN")"

  sleep 1 || true
done
echo

(( CANCELLED )) && { echo "Cancelado pelo usuário. Nada foi removido."; exit 130; }

#--- janela de segurança final ---#
echo "Tempo esgotado."
echo "Janela de segurança: removendo o pod em ${GRACE_SECONDS}s (Ctrl+C para abortar)."
for (( i=GRACE_SECONDS; i>0; i-- )); do
  (( CANCELLED )) && { echo -e "\nCancelado durante a janela de segurança. Nada foi removido."; exit 130; }
  printf "\rRemovendo em %ds... " "$i"
  sleep 1 || true
done
echo

#--- remoção ---#
echo "Executando: runpodctl remove pod \"$POD_ID\""
if runpodctl remove pod "$POD_ID"; then
  echo "Comando enviado. Este pod será encerrado."
else
  rc=$?
  echo "ERRO: falha ao executar 'runpodctl remove pod \"$POD_ID\"' (código $rc)" >&2
  exit "$rc"
fi