46 lines
1.3 KiB
Python
46 lines
1.3 KiB
Python
"""Models for Zeroconf."""
|
|
|
|
from typing import Any
|
|
|
|
from zeroconf import DNSAddress, DNSRecord, Zeroconf
|
|
from zeroconf.asyncio import AsyncServiceBrowser, AsyncZeroconf
|
|
|
|
TYPE_AAAA = 28
|
|
|
|
|
|
class HaZeroconf(Zeroconf):
|
|
"""Zeroconf that cannot be closed."""
|
|
|
|
def close(self) -> None:
|
|
"""Fake method to avoid integrations closing it."""
|
|
|
|
ha_close = Zeroconf.close
|
|
|
|
|
|
class HaAsyncZeroconf(AsyncZeroconf):
|
|
"""Home Assistant version of AsyncZeroconf."""
|
|
|
|
async def async_close(self) -> None:
|
|
"""Fake method to avoid integrations closing it."""
|
|
|
|
ha_async_close = AsyncZeroconf.async_close
|
|
|
|
|
|
class HaAsyncServiceBrowser(AsyncServiceBrowser):
|
|
"""ServiceBrowser that only consumes DNSPointer records."""
|
|
|
|
def __init__(self, ipv6: bool, *args: Any, **kwargs: Any) -> None:
|
|
"""Create service browser that filters ipv6 if it is disabled."""
|
|
self.ipv6 = ipv6
|
|
super().__init__(*args, **kwargs)
|
|
|
|
def update_record(self, zc: Zeroconf, now: float, record: DNSRecord) -> None:
|
|
"""Pre-Filter AAAA records if IPv6 is not enabled."""
|
|
if (
|
|
not self.ipv6
|
|
and isinstance(record, DNSAddress)
|
|
and record.type == TYPE_AAAA
|
|
):
|
|
return
|
|
super().update_record(zc, now, record)
|