1. Restructured configuration: Moved config_other and console to top level 2. Added common _match_pattern function for regex pattern matching 3. Implemented Unifi Hostname bug fix in is_hostname_unknown 4. Created common get_device_hostname function to eliminate code duplication 5. Added comprehensive test scripts for all new functionality 6. Added detailed documentation for all changes
116 lines
4.0 KiB
Python
116 lines
4.0 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Test script to verify the unifi_hostname_bug_detected flag is set correctly.
|
|
This script will:
|
|
1. Run TasmotaManager with --Device parameter for a device with the UniFi OS hostname bug
|
|
2. Check if the unifi_hostname_bug_detected flag is set correctly in the output
|
|
"""
|
|
|
|
import sys
|
|
import subprocess
|
|
import json
|
|
import logging
|
|
|
|
# Configure logging
|
|
logging.basicConfig(level=logging.INFO,
|
|
format='%(asctime)s - %(levelname)s - %(message)s',
|
|
datefmt='%Y-%m-%d %H:%M:%S')
|
|
logger = logging.getLogger(__name__)
|
|
|
|
def get_test_device():
|
|
"""Get a test device from current.json"""
|
|
try:
|
|
with open('current.json', 'r') as f:
|
|
data = json.load(f)
|
|
devices = data.get('tasmota', {}).get('devices', [])
|
|
if devices:
|
|
return devices[0] # Use the first device
|
|
else:
|
|
logger.error("No devices found in current.json")
|
|
return None
|
|
except Exception as e:
|
|
logger.error(f"Error reading current.json: {e}")
|
|
return None
|
|
|
|
def run_device_mode(device_ip):
|
|
"""Run TasmotaManager in Device mode with the given IP"""
|
|
try:
|
|
cmd = ["python3", "TasmotaManager.py", "--Device", device_ip, "--debug"]
|
|
logger.info(f"Running command: {' '.join(cmd)}")
|
|
|
|
# Run the command and capture output
|
|
process = subprocess.run(cmd, capture_output=True, text=True)
|
|
|
|
# Log the output
|
|
logger.info("Command output:")
|
|
for line in process.stdout.splitlines():
|
|
logger.info(f" {line}")
|
|
|
|
if process.returncode != 0:
|
|
logger.error(f"Command failed with return code {process.returncode}")
|
|
logger.error(f"Error output: {process.stderr}")
|
|
return False
|
|
|
|
return True
|
|
except Exception as e:
|
|
logger.error(f"Error running TasmotaManager: {e}")
|
|
return False
|
|
|
|
def check_tasmota_devices_json():
|
|
"""Check if the unifi_hostname_bug_detected flag is set in TasmotaDevices.json"""
|
|
try:
|
|
with open('TasmotaDevices.json', 'r') as f:
|
|
data = json.load(f)
|
|
devices = data.get('devices', [])
|
|
|
|
if not devices:
|
|
logger.error("No devices found in TasmotaDevices.json")
|
|
return False
|
|
|
|
# Check each device for the flag
|
|
for device in devices:
|
|
name = device.get('name', 'Unknown')
|
|
ip = device.get('ip', '')
|
|
bug_detected = device.get('unifi_hostname_bug_detected', None)
|
|
|
|
if bug_detected is None:
|
|
logger.error(f"Device {name} ({ip}) does not have the unifi_hostname_bug_detected flag")
|
|
return False
|
|
|
|
logger.info(f"Device {name} ({ip}) has unifi_hostname_bug_detected = {bug_detected}")
|
|
|
|
return True
|
|
except Exception as e:
|
|
logger.error(f"Error reading TasmotaDevices.json: {e}")
|
|
return False
|
|
|
|
def main():
|
|
# Get a test device
|
|
device = get_test_device()
|
|
if not device:
|
|
logger.error("No test device available. Run discovery first.")
|
|
return 1
|
|
|
|
device_name = device.get('name')
|
|
device_ip = device.get('ip')
|
|
|
|
logger.info(f"Testing with device: {device_name} (IP: {device_ip})")
|
|
|
|
# Run TasmotaManager in Device mode
|
|
logger.info(f"Running TasmotaManager in Device mode for {device_ip}")
|
|
success = run_device_mode(device_ip)
|
|
if not success:
|
|
logger.error("Failed to run TasmotaManager in Device mode")
|
|
return 1
|
|
|
|
# Check if the flag is set correctly
|
|
logger.info("Checking if the unifi_hostname_bug_detected flag is set correctly")
|
|
if check_tasmota_devices_json():
|
|
logger.info("SUCCESS: unifi_hostname_bug_detected flag is set correctly!")
|
|
return 0
|
|
else:
|
|
logger.error("FAILURE: unifi_hostname_bug_detected flag is not set correctly!")
|
|
return 1
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main()) |