banger/list.sh

53 lines
1.3 KiB
Bash
Executable file

#!/usr/bin/env bash
set -euo pipefail
shopt -s nullglob
statuses=()
ids=()
names=()
ips=()
created=()
max_name=4
max_ip=2
GREEN='\033[32m'
YELLOW='\033[33m'
RESET='\033[0m'
for vm_json in state/vms/*/vm.json; do
id="$(jq -r '.meta.id // empty' "$vm_json")"
name="$(jq -r '.meta.name // empty' "$vm_json")"
created_at="$(jq -r '.meta.created_at // empty' "$vm_json")"
guest_ip="$(jq -r '.meta.guest_ip // empty' "$vm_json")"
pid="$(jq -r '.meta.pid // empty' "$vm_json")"
api_sock="$(jq -r '.meta.api_sock // empty' "$vm_json")"
status="stopped"
if [[ -n "$pid" && -n "$api_sock" ]]; then
if ps -p "$pid" -o comm=,args= 2>/dev/null | rg -q "firecracker.*--api-sock $api_sock"; then
status="running"
fi
fi
short_id="${id:0:12}"
statuses+=("$status")
ids+=("$short_id")
names+=("$name")
ips+=("$guest_ip")
created+=("$created_at")
if (( ${#name} > max_name )); then
max_name=${#name}
fi
if (( ${#guest_ip} > max_ip )); then
max_ip=${#guest_ip}
fi
done
for i in "${!ids[@]}"; do
color="$YELLOW"
if [[ "${statuses[$i]}" == "running" ]]; then
color="$GREEN"
fi
printf '%-10b %-12s %-*s %-*s %s\n' \
"${color}[${statuses[$i]}]${RESET}" "${ids[$i]}" "$max_name" "${names[$i]}" "$max_ip" "${ips[$i]}" "${created[$i]}"
done