mirror of
https://github.com/home-assistant/supervisor.git
synced 2025-06-25 19:36:29 +00:00

* Add CoreDNS / DNS configuration * Support get version * add version * add coresys * Add more logic * move forwareder into dns * Setup docker inside * add docker to env * Add more function * more interface * Update hosts template * Add DNS folder * Fix issues * Add more logic * Add handling for hosts * Fix setting * fix lint * Fix some issues * Fix issue * Run with no cache * Fix issue on validate * Fix bug * Allow to jump into dev mode * Fix permission * Fix issue * Add dns search * Add watchdog * Fix set issues * add API description * Add API endpoint * Add CLI support * Fix logs + add hostname * Add/remove DNS entry * Fix attribute * Fix style * Better shutdown * Remove ha from network mapping * Add more options * Fix env shutdown * Add support for new repair function * Start coreDNS faster after restart * remove options * Fix ha fix
50 lines
1.5 KiB
Python
50 lines
1.5 KiB
Python
"""Setup the internal DNS service for host applications."""
|
|
import asyncio
|
|
import logging
|
|
import shlex
|
|
from ipaddress import IPv4Address
|
|
from typing import Optional
|
|
|
|
import async_timeout
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
COMMAND = "socat UDP-RECVFROM:53,fork UDP-SENDTO:{!s}"
|
|
|
|
|
|
class DNSForward:
|
|
"""Manage DNS forwarding to internal DNS."""
|
|
|
|
def __init__(self):
|
|
"""Initialize DNS forwarding."""
|
|
self.proc: Optional[asyncio.Process] = None
|
|
|
|
async def start(self, dns_server: IPv4Address) -> None:
|
|
"""Start DNS forwarding."""
|
|
try:
|
|
self.proc = await asyncio.create_subprocess_exec(
|
|
*shlex.split(COMMAND.format(dns_server)),
|
|
stdin=asyncio.subprocess.DEVNULL,
|
|
stdout=asyncio.subprocess.DEVNULL,
|
|
stderr=asyncio.subprocess.DEVNULL,
|
|
)
|
|
except OSError as err:
|
|
_LOGGER.error("Can't start DNS forwarding: %s", err)
|
|
else:
|
|
_LOGGER.info("Start DNS port forwarding to %s", dns_server)
|
|
|
|
async def stop(self) -> None:
|
|
"""Stop DNS forwarding."""
|
|
if not self.proc:
|
|
_LOGGER.warning("DNS forwarding is not running!")
|
|
return
|
|
|
|
self.proc.kill()
|
|
try:
|
|
with async_timeout.timeout(5):
|
|
await self.proc.wait()
|
|
except asyncio.TimeoutError:
|
|
_LOGGER.warning("Stop waiting for DNS shutdown")
|
|
|
|
_LOGGER.info("Stop DNS forwarding")
|