forked from therootcompany/proxmox-sh
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathproxmox-shutdown
executable file
·100 lines (85 loc) · 2.47 KB
/
proxmox-shutdown
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
#!/bin/sh
set -e
set -u
if test -e .env; then
# shellcheck disable=SC1091
. .env
fi
if test -e .env.secret; then
# shellcheck disable=SC1091
. .env.secret || true
fi
if test -z "${PROXMOX_HOST:-}" ||
test -z "${PROXMOX_TOKEN_ID:-}" ||
test -z "${PROXMOX_TOKEN_SECRET:-}" ||
test -z "${PROXMOX_TARGET_NODE:-}"; then
echo "./.env or ./.env.secret should contain values like these:"
echo " PROXMOX_HOST='10.x.x.x:8006'"
echo " PROXMOX_TARGET_NODE='pve1'"
echo " PROXMOX_TOKEN_ID='<user>@<strategy>!<token-name>'"
echo " PROXMOX_TOKEN_SECRET='00000000-0000-4000-8000-000000000000'"
exit 1
fi
my_auth="Authorization: PVEAPIToken=${PROXMOX_TOKEN_ID}=${PROXMOX_TOKEN_SECRET}"
my_base_url="https://${PROXMOX_HOST}:8006/api2/json"
my_curl="curl -k --max-time 15 -fsSL"
fn_shutdown() { (
my_ctid="${1:-}"
my_url="${my_base_url}/nodes/${PROXMOX_TARGET_NODE}/lxc/${my_ctid}/status/shutdown"
echo 2>&1 "POST ${my_url}"
${my_curl} -H "${my_auth}" \
-X POST \
"${my_url}" |
jq '.'
); }
fn_wait_status() { (
my_task_id_raw="${1}"
my_check_count="${2:-1}"
my_task_id="$(
printf '%s' "${my_task_id_raw}" |
xxd -plain |
tr -d '\n' |
sed 's/\(..\)/%\1/g'
)"
my_task_result="$(
${my_curl} -H "${my_auth}" \
"${my_base_url}/nodes/${PROXMOX_TARGET_NODE}/tasks/${my_task_id}/status"
)"
my_task_status="$(
printf '%s' "${my_task_result}" |
jq -r '.data.status'
)"
echo "Status: ${my_task_status}"
if test "${my_task_status}" = "running"; then
if test "${my_check_count}" -ge 20; then
echo "Error: tried 20 times"
return 1
fi
sleep 1
my_check_count="$((my_check_count + 1))"
fn_wait_status "${my_task_id_raw}" "${my_check_count}"
return 0
fi
echo "${my_task_result}" | jq '.'
); }
main() { (
my_ctid="${1:-}"
if test -z "${my_ctid:-}"; then
${my_curl} -H "${my_auth}" \
"${my_base_url}/nodes/${PROXMOX_TARGET_NODE}/lxc" | jq -r '.data[]'
echo ""
echo "USAGE"
echo " proxmox-shutdown <ctid>"
echo ""
echo "EXAMPLE"
echo " proxmox-shutdown 999"
echo ""
exit 1
fi
my_task_id="$(
fn_shutdown "${my_ctid}" | jq -r '.data'
)"
echo "Waiting for ${my_task_id}..."
fn_wait_status "${my_task_id}"
); }
main "${@:-}"