#!/usr/bin/env bash MAPDNS_BIN="${MAPDNS_BIN:-${BANGER_MAPDNS_BIN:-mapdns}}" MAPDNS_DATA_FILE="${MAPDNS_DATA_FILE:-${BANGER_MAPDNS_DATA_FILE:-}}" banger_mapdns_cmd() { local subcommand="$1" shift if [[ -n "$MAPDNS_DATA_FILE" ]]; then "$MAPDNS_BIN" "$subcommand" --data-file "$MAPDNS_DATA_FILE" "$@" return fi "$MAPDNS_BIN" "$subcommand" "$@" } banger_dns_name() { local vm_name="$1" printf '%s.vm' "$vm_name" } banger_dns_write_record() { local vm_name="$1" local guest_ip="$2" local dns_name if [[ -n "$MAPDNS_DATA_FILE" ]]; then mkdir -p "$(dirname "$MAPDNS_DATA_FILE")" fi dns_name="$(banger_dns_name "$vm_name")" banger_mapdns_cmd set "$dns_name" "$guest_ip" >/dev/null } banger_dns_record_exists() { local dns_name="$1" [[ -n "$dns_name" ]] || return 1 banger_mapdns_cmd list | awk '{print $1}' | rg -Fxq "$dns_name" } banger_dns_remove_record_name() { local dns_name="${1:-}" [[ -n "$dns_name" ]] || return 0 if ! banger_dns_record_exists "$dns_name"; then return 0 fi banger_mapdns_cmd rm "$dns_name" >/dev/null } banger_vm_process_running() { local pid="$1" local api_sock="$2" [[ -n "$pid" && -n "$api_sock" ]] || return 1 ps -p "$pid" -o comm=,args= 2>/dev/null | rg -q "firecracker.*--api-sock $api_sock" } banger_wait_for_vm_exit() { local pid="$1" local api_sock="$2" local timeout_secs="${3:-30}" local deadline=$((SECONDS + timeout_secs)) while banger_vm_process_running "$pid" "$api_sock"; do if (( SECONDS >= deadline )); then return 1 fi sleep 0.1 done } banger_teardown_vm_runtime() { local tap="${1:-}" local api_sock="${2:-}" local dm_name="${3:-}" local dm_dev="${4:-}" local cow_loop="${5:-}" local base_loop="${6:-}" if [[ -n "$tap" ]]; then sudo ip link del "$tap" 2>/dev/null || true fi if [[ -n "$api_sock" ]]; then rm -f "$api_sock" fi if [[ -n "$dm_name" || -n "$dm_dev" ]]; then sudo dmsetup remove "${dm_name:-$dm_dev}" 2>/dev/null || true fi if [[ -n "$cow_loop" ]]; then sudo losetup -d "$cow_loop" 2>/dev/null || true fi if [[ -n "$base_loop" ]]; then sudo losetup -d "$base_loop" 2>/dev/null || true fi } banger_mark_vm_stopped() { local vm_json="$1" [[ -f "$vm_json" ]] || return 0 jq \ 'del(.meta.pid, .meta.base_loop, .meta.cow_loop, .meta.dm_dev)' \ "$vm_json" > "$vm_json.tmp" && mv "$vm_json.tmp" "$vm_json" }