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
112 lines
4.6 KiB
Markdown
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. |