77 lines
2.8 KiB
Python
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) |