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. |