TasmotaManager/is_hostname_unknown_implementation_summary.md
Mike Geppert 126cd39555 Major code improvements and bug fixes:
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
2025-08-08 19:04:33 -05:00

112 lines
4.6 KiB
Markdown

# is_hostname_unknown Function Implementation Summary
## Overview
A new utility function `is_hostname_unknown` has been added to the TasmotaManager.py script to provide a centralized way to check if a hostname matches any pattern in the `unknown_device_patterns` list. This function standardizes the pattern matching logic that was previously duplicated in multiple places throughout the codebase.
## Implementation Details
The function has been implemented as a method of the `TasmotaDiscovery` class:
```python
def is_hostname_unknown(self, hostname: str, patterns: list = None) -> bool:
"""Check if a hostname matches any pattern in unknown_device_patterns.
This function provides a centralized way to check if a hostname matches any of the
unknown_device_patterns defined in the configuration. It uses case-insensitive
matching and supports glob patterns (with *) in the patterns list.
Args:
hostname: The hostname to check against unknown_device_patterns
patterns: Optional list of patterns to check against. If not provided,
patterns will be loaded from the configuration.
Returns:
bool: True if the hostname matches any pattern, False otherwise
Examples:
# Check if a hostname matches any unknown_device_patterns in the config
if manager.is_hostname_unknown("tasmota_device123"):
print("This is an unknown device")
# Check against a specific list of patterns
custom_patterns = ["esp-*", "tasmota_*"]
if manager.is_hostname_unknown("esp-abcd", custom_patterns):
print("This matches a custom pattern")
"""
# If no patterns provided, get them from the configuration
if patterns is None:
patterns = []
network_filters = self.config['unifi'].get('network_filter', {})
for network in network_filters.values():
patterns.extend(network.get('unknown_device_patterns', []))
# Convert hostname to lowercase for case-insensitive matching
hostname_lower = hostname.lower()
# Check if hostname matches any pattern
for pattern in patterns:
pattern_lower = pattern.lower()
# Convert glob pattern to regex pattern
pattern_regex = pattern_lower.replace('.', r'\.').replace('*', '.*')
if re.match(f"^{pattern_regex}", hostname_lower):
self.logger.debug(f"Hostname '{hostname}' matches unknown device pattern: {pattern}")
return True
return False
```
## Features
The function includes the following features:
1. **Centralized Logic**: Provides a single place for hostname pattern matching logic
2. **Case Insensitivity**: Performs case-insensitive matching
3. **Glob Pattern Support**: Supports glob patterns (with *) in the patterns list
4. **Flexible Pattern Source**: Can use patterns from the configuration or a custom list
5. **Detailed Logging**: Logs when a hostname matches a pattern
6. **Comprehensive Documentation**: Includes detailed docstring with examples
## Testing
A comprehensive test script (`test_is_hostname_unknown.py`) has been created to verify the function's behavior. The tests include:
1. Testing with patterns from the configuration
2. Testing with custom patterns
3. Testing case insensitivity
All tests have passed, confirming that the function works correctly in all scenarios.
## Usage Examples
### Basic Usage
```python
# Check if a hostname matches any unknown_device_patterns in the config
if manager.is_hostname_unknown("tasmota_device123"):
print("This is an unknown device")
```
### With Custom Patterns
```python
# Check against a specific list of patterns
custom_patterns = ["esp-*", "tasmota_*"]
if manager.is_hostname_unknown("esp-abcd", custom_patterns):
print("This matches a custom pattern")
```
## Potential Refactoring Opportunities
The following places in the code could potentially be refactored to use the new function:
1. In `get_tasmota_devices` (lines 235-244)
2. In `get_unknown_devices` (lines 500-506)
3. In `process_single_device` (lines 1526-1533)
4. In `process_devices` (lines 1760-1766)
Refactoring these sections would improve code maintainability and ensure consistent behavior across all parts of the application.
## Conclusion
The `is_hostname_unknown` function provides a centralized, well-documented, and thoroughly tested way to check if a hostname matches any pattern in the `unknown_device_patterns` list. This implementation satisfies the requirements specified in the issue description and improves the overall code quality of the TasmotaManager.py script.