first working release
This commit is contained in:
@@ -1,3 +1,5 @@
|
|||||||
PM_HOST="https://proxmox.example.com:8006"
|
PM_HOST="https://proxmox.example.com:8006"
|
||||||
PM_USER="root@pam"
|
PM_USER="root@pam"
|
||||||
PM_PASS="super-secret-password"
|
PM_PASS="super-secret-password"
|
||||||
|
SENTRI_URL="https://sentri.nl/api/v1/servers/"
|
||||||
|
SENTRI_TOKEN="your-api-token"
|
||||||
18
README.md
18
README.md
@@ -14,6 +14,7 @@ The script collects information such as:
|
|||||||
- VM descriptions/notes
|
- VM descriptions/notes
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# Requirements
|
# Requirements
|
||||||
## System Requirements
|
## System Requirements
|
||||||
The machine running this script must:
|
The machine running this script must:
|
||||||
@@ -38,22 +39,29 @@ sudo dnf install -y qemu-guest-agent
|
|||||||
sudo systemctl enable --now qemu-guest-agent
|
sudo systemctl enable --now qemu-guest-agent
|
||||||
```
|
```
|
||||||
Then enable the QEMU Guest Agent in Proxmox:
|
Then enable the QEMU Guest Agent in Proxmox:
|
||||||
```
|
```bash
|
||||||
qm set <VMID> --agent enabled=1
|
qm set <VMID> --agent enabled=1
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# Installation
|
# Installation
|
||||||
Clone the repository and configure the environment file:
|
Clone the repository and configure the environment file:
|
||||||
```
|
```bash
|
||||||
cd /optgit clone https://gitea.mooij.me/meteo/proxmox-to-sentri.gitcd proxmox-to-sentricp .env-sample .envchmod 600 .envchmod 740 proxmox-to-sentri.sh
|
cd /opt
|
||||||
|
git clone https://gitea.mooij.me/meteo/proxmox-to-sentri.git
|
||||||
|
cd proxmox-to-sentri
|
||||||
|
cp .env-sample .env
|
||||||
|
chmod 600 .env
|
||||||
|
chmod 740 proxmox-to-sentri.sh
|
||||||
```
|
```
|
||||||
Optional: Create a global command:
|
Optional: Create a global command:
|
||||||
```
|
```bash
|
||||||
ln -sf /opt/proxmox-to-sentri/proxmox-to-sentri.sh /usr/bin/proxmox-to-sentri
|
ln -sf /opt/proxmox-to-sentri/proxmox-to-sentri.sh /usr/bin/proxmox-to-sentri
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# Configuration
|
# Configuration
|
||||||
Edit the `.env` file and configure the Proxmox connection settings:
|
Edit the `.env` file and configure the Proxmox connection settings:
|
||||||
```
|
```
|
||||||
@@ -63,6 +71,7 @@ PM_PASS="your-password"
|
|||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# Running the Script
|
# Running the Script
|
||||||
|
|
||||||
Run the script directly:
|
Run the script directly:
|
||||||
@@ -75,6 +84,7 @@ proxmox-to-sentri
|
|||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# Output
|
# Output
|
||||||
|
|
||||||
Generated JSON files are written to:
|
Generated JSON files are written to:
|
||||||
|
|||||||
@@ -53,6 +53,12 @@ fi
|
|||||||
: "${PM_USER:?Missing PM_USER}"
|
: "${PM_USER:?Missing PM_USER}"
|
||||||
: "${PM_PASS:?Missing PM_PASS}"
|
: "${PM_PASS:?Missing PM_PASS}"
|
||||||
|
|
||||||
|
# Sentri API configuration
|
||||||
|
: "${SENTRI_URL:?Missing SENTRI_URL}"
|
||||||
|
: "${SENTRI_TOKEN:?Missing SENTRI_TOKEN}"
|
||||||
|
|
||||||
|
SERVERS_JSON="[]"
|
||||||
|
|
||||||
# Authenticate
|
# Authenticate
|
||||||
AUTH_RESPONSE=$(curl -sk \
|
AUTH_RESPONSE=$(curl -sk \
|
||||||
--data-urlencode "username=${PM_USER}" \
|
--data-urlencode "username=${PM_USER}" \
|
||||||
@@ -80,12 +86,18 @@ echo "Collecting VMs..."
|
|||||||
|
|
||||||
VMS=$(api_get "/api2/json/cluster/resources?type=vm")
|
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')
|
VMID=$(echo "$VM" | jq -r '.vmid')
|
||||||
NODE=$(echo "$VM" | jq -r '.node')
|
NODE=$(echo "$VM" | jq -r '.node')
|
||||||
NAME=$(echo "$VM" | jq -r '.name')
|
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')
|
CPU=$(echo "$VM" | jq -r '.maxcpu')
|
||||||
MEMORY_MB=$(echo "$VM" | jq -r '.maxmem / 1024 / 1024 | floor')
|
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)
|
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 \
|
DISKS_JSON=$(echo "$DISKS_JSON" | jq \
|
||||||
--arg name "$DISKKEY" \
|
--arg name "$DISKKEY" \
|
||||||
@@ -212,26 +245,25 @@ echo "$VMS" | jq -c '.data[]' | while read -r VM; do
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Build JSON
|
# Build JSON
|
||||||
|
SERVER_JSON=$(
|
||||||
jq -n \
|
jq -n \
|
||||||
--arg vmid "$MAC" \
|
--arg vmid "$MAC" \
|
||||||
--arg vmhost "$NAME" \
|
--arg vmhost "$NAME" \
|
||||||
--arg power "$STATUS" \
|
--arg power "$STATUS" \
|
||||||
--arg hostname "$NAME" \
|
|
||||||
--arg os "$OS" \
|
--arg os "$OS" \
|
||||||
--argjson cpu "$CPU" \
|
--argjson cpu "$CPU" \
|
||||||
--argjson memory "$MEMORY_MB" \
|
--argjson memory "$MEMORY_MB" \
|
||||||
--argjson snapshot "$SNAPSHOT_COUNT" \
|
--argjson snapshot "$SNAPSHOT_COUNT" \
|
||||||
--arg description "$DESCRIPTION" \
|
--arg description "$DESCRIPTION" \
|
||||||
--argjson disks "$DISKS_JSON" \
|
--argjson disks "$DISKS_JSON" \
|
||||||
--argjson ipv4 "$(printf '%s\n' "${IPV4[@]}" | jq -R . | jq -s .)" \
|
--argjson ipv4 "$(printf '%s\n' "${IPV4[@]:-}" | jq -R . | jq -s .)" \
|
||||||
--argjson ipv6 "$(printf '%s\n' "${IPV6[@]}" | jq -R . | jq -s .)" \
|
--argjson ipv6 "$(printf '%s\n' "${IPV6[@]:-}" | jq -R . | jq -s .)" \
|
||||||
--arg backup "$BACKUP_ENABLED" '
|
--arg backup "$BACKUP_ENABLED" '
|
||||||
{
|
{
|
||||||
"server_vm_id": $vmid,
|
"server_vm_id": $vmid,
|
||||||
"server_vm_host_name": $vmhost,
|
"server_vm_host_name": $vmhost,
|
||||||
"server_power_state": $power,
|
"server_power_state": $power,
|
||||||
"server_state": "new",
|
"server_state": "new",
|
||||||
"server_hostname": $hostname
|
|
||||||
}
|
}
|
||||||
+
|
+
|
||||||
(
|
(
|
||||||
@@ -260,10 +292,48 @@ echo "$VMS" | jq -c '.data[]' | while read -r VM; do
|
|||||||
),
|
),
|
||||||
"server_description": $description
|
"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
|
||||||
echo "Done."
|
echo "Done."
|
||||||
echo "JSON files written to: ${OUTPUT_DIR}/"
|
|
||||||
Reference in New Issue
Block a user