firmware-base/scripts/get_boot_metrics.py

77 lines
2.8 KiB
Python

import requests
import json
import os
import sys
import argparse
# Default device identifier (mDNS or IP)
DEFAULT_DEVICE_ID = "modbus-esp32.local"
# API endpoint
API_ENDPOINT = "/api/v1/system/boot-metrics"
# Output directory
OUTPUT_DIR = "./tmp"
OUTPUT_FILE = "boot_metrics.json"
def get_device_url(device_id):
"""Constructs the full URL for the API endpoint."""
if not device_id.startswith(("http://", "https://")):
device_id = f"http://{device_id}"
return f"{device_id}{API_ENDPOINT}"
def fetch_and_save_metrics(device_url):
"""Fetches boot and current metrics from the device and saves them to a JSON file."""
try:
print(f"Attempting to fetch metrics from: {device_url}")
response = requests.get(device_url, timeout=10) # 10 second timeout
response.raise_for_status() # Raise an exception for bad status codes (4xx or 5xx)
metrics_data = response.json()
print("Successfully fetched metrics:")
# Print initial and current metrics
print(json.dumps(metrics_data, indent=2))
# Ensure the output directory exists
os.makedirs(OUTPUT_DIR, exist_ok=True)
output_path = os.path.join(OUTPUT_DIR, OUTPUT_FILE)
# Save the data to a JSON file
with open(output_path, 'w') as f:
json.dump(metrics_data, f, indent=4)
print(f"Metrics saved to: {output_path}")
except requests.exceptions.ConnectionError as e:
print(f"Error: Could not connect to the device at {device_url}.", file=sys.stderr)
print(f"Details: {e}", file=sys.stderr)
sys.exit(1)
except requests.exceptions.Timeout:
print(f"Error: Request timed out while connecting to {device_url}.", file=sys.stderr)
sys.exit(1)
except requests.exceptions.RequestException as e:
print(f"Error: An error occurred during the request to {device_url}.", file=sys.stderr)
print(f"Details: {e}", file=sys.stderr)
sys.exit(1)
except json.JSONDecodeError:
print(f"Error: Failed to decode JSON response from {device_url}.", file=sys.stderr)
print(f"Received content: {response.text}", file=sys.stderr)
sys.exit(1)
except OSError as e:
print(f"Error: Could not create directory or write file.", file=sys.stderr)
print(f"Details: {e}", file=sys.stderr)
sys.exit(1)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Fetch boot and current metrics from ESP32 device via REST API.")
parser.add_argument(
"--ip",
type=str,
default=DEFAULT_DEVICE_ID,
help=f"IP address or mDNS name of the device (default: {DEFAULT_DEVICE_ID})"
)
args = parser.parse_args()
url = get_device_url(args.ip)
fetch_and_save_metrics(url)