first working release

This commit is contained in:
2026-05-17 21:06:17 +02:00
parent 4930f5c75c
commit 9736a007f1
3 changed files with 97 additions and 15 deletions

View File

@@ -53,6 +53,12 @@ fi
: "${PM_USER:?Missing PM_USER}"
: "${PM_PASS:?Missing PM_PASS}"
# Sentri API configuration
: "${SENTRI_URL:?Missing SENTRI_URL}"
: "${SENTRI_TOKEN:?Missing SENTRI_TOKEN}"
SERVERS_JSON="[]"
# Authenticate
AUTH_RESPONSE=$(curl -sk \
--data-urlencode "username=${PM_USER}" \
@@ -80,12 +86,18 @@ echo "Collecting VMs..."
VMS=$(api_get "/api2/json/cluster/resources?type=vm")
echo "$VMS" | jq -c '.data[]' | while read -r VM; do
while read -r VM; do
VMID=$(echo "$VM" | jq -r '.vmid')
NODE=$(echo "$VM" | jq -r '.node')
NAME=$(echo "$VM" | jq -r '.name')
STATUS=$(echo "$VM" | jq -r '.status')
STATUS=$(echo "$VM" | jq -r '
.status
| if . == "running" then "Running"
elif . == "stopped" then "Off"
else "Running"
end
')
CPU=$(echo "$VM" | jq -r '.maxcpu')
MEMORY_MB=$(echo "$VM" | jq -r '.maxmem / 1024 / 1024 | floor')
@@ -188,7 +200,28 @@ echo "$VMS" | jq -c '.data[]' | while read -r VM; do
DISK_LOCATION=$(echo "$DISKCONF" | cut -d',' -f1)
SIZE=$(echo "$DISKCONF" | sed -n 's/.*size=\([^,]*\).*/\1/p')
SIZE=$(echo "$DISKCONF" | sed -n 's/.*size=\([^,]*\).*/\1/p' \
| awk '
function ceil(x) { return (x == int(x)) ? x : int(x)+1 }
{
if ($0 ~ /G$/) {
gsub(/G/, "", $0)
printf "%d", ceil($0)
}
else if ($0 ~ /M$/) {
gsub(/M/, "", $0)
printf "%d", ceil($0 / 1024)
}
else if ($0 ~ /T$/) {
gsub(/T/, "", $0)
printf "%d", ceil($0 * 1024)
}
else {
printf "%d", $0
}
}
')
DISKS_JSON=$(echo "$DISKS_JSON" | jq \
--arg name "$DISKKEY" \
@@ -212,26 +245,25 @@ echo "$VMS" | jq -c '.data[]' | while read -r VM; do
)
# Build JSON
SERVER_JSON=$(
jq -n \
--arg vmid "$MAC" \
--arg vmhost "$NAME" \
--arg power "$STATUS" \
--arg hostname "$NAME" \
--arg os "$OS" \
--argjson cpu "$CPU" \
--argjson memory "$MEMORY_MB" \
--argjson snapshot "$SNAPSHOT_COUNT" \
--arg description "$DESCRIPTION" \
--argjson disks "$DISKS_JSON" \
--argjson ipv4 "$(printf '%s\n' "${IPV4[@]}" | jq -R . | jq -s .)" \
--argjson ipv6 "$(printf '%s\n' "${IPV6[@]}" | jq -R . | jq -s .)" \
--argjson ipv4 "$(printf '%s\n' "${IPV4[@]:-}" | jq -R . | jq -s .)" \
--argjson ipv6 "$(printf '%s\n' "${IPV6[@]:-}" | jq -R . | jq -s .)" \
--arg backup "$BACKUP_ENABLED" '
{
"server_vm_id": $vmid,
"server_vm_host_name": $vmhost,
"server_power_state": $power,
"server_state": "new",
"server_hostname": $hostname
}
+
(
@@ -260,10 +292,48 @@ echo "$VMS" | jq -c '.data[]' | while read -r VM; do
),
"server_description": $description
}
' > "${OUTPUT_DIR}/${VMID}.json"
')
done
# Save per-VM JSON
echo "$SERVER_JSON" > "${OUTPUT_DIR}/${VMID}.json"
# Add VM to combined payload
SERVERS_JSON=$(jq -n \
--argjson old "$SERVERS_JSON" \
--argjson server "$SERVER_JSON" \
'$old + [$server]')
done < <(
echo "$VMS" | jq -c '.data[]? // empty'
)
FINAL_PAYLOAD=$(jq -n \
--argjson servers "$SERVERS_JSON" '
{
"servers": $servers
}
')
# Save combined payload
echo "$FINAL_PAYLOAD" | jq . > "${OUTPUT_DIR}/servers.json"
echo
echo "Uploading payload to Sentri..."
RESPONSE=$(curl -sk \
-X POST \
-H "Authorization: Bearer ${SENTRI_TOKEN}" \
-H "Content-Type: application/json" \
--data "$FINAL_PAYLOAD" \
"${SENTRI_URL}"
)
echo
echo "Sentri API response:"
echo "$RESPONSE" | jq . || echo "$RESPONSE"
echo "Combined payload written to:"
echo "${OUTPUT_DIR}/servers.json"
echo "Individual server json files written to: ${OUTPUT_DIR}/"
echo
echo "Done."
echo "JSON files written to: ${OUTPUT_DIR}/"