From 657ee84e39ca2d1207986b493c7a310032214a2a Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Sat, 28 Mar 2020 16:10:22 +0100 Subject: [PATCH 1/3] Bump version to 213 --- supervisor/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/supervisor/const.py b/supervisor/const.py index 9746c4470..6c701dc57 100644 --- a/supervisor/const.py +++ b/supervisor/const.py @@ -3,7 +3,7 @@ from enum import Enum from ipaddress import ip_network from pathlib import Path -SUPERVISOR_VERSION = "212" +SUPERVISOR_VERSION = "213" URL_HASSIO_ADDONS = "https://github.com/home-assistant/hassio-addons" From 7b2377291f1027d5e739affbe5e896e3bfe303af Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Sat, 28 Mar 2020 17:05:42 +0100 Subject: [PATCH 2/3] Fix error handling on tasks (#1608) --- supervisor/tasks.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/supervisor/tasks.py b/supervisor/tasks.py index a24f9b3f5..4aa569e40 100644 --- a/supervisor/tasks.py +++ b/supervisor/tasks.py @@ -3,7 +3,7 @@ import asyncio import logging from .coresys import CoreSysAttributes -from .exceptions import HomeAssistantError, CoreDNSError +from .exceptions import AudioError, CliError, CoreDNSError, HomeAssistantError _LOGGER: logging.Logger = logging.getLogger(__name__) @@ -258,7 +258,7 @@ class Tasks(CoreSysAttributes): try: await self.sys_audio.start() - except CoreDNSError: + except AudioError: _LOGGER.error("Watchdog PulseAudio reanimation fails!") async def _watchdog_cli_docker(self): @@ -270,5 +270,5 @@ class Tasks(CoreSysAttributes): try: await self.sys_cli.start() - except CoreDNSError: + except CliError: _LOGGER.error("Watchdog cli reanimation fails!") From 58155c35f9581e95ea34e96992cbc6e9ec39b642 Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Sun, 29 Mar 2020 13:45:46 +0200 Subject: [PATCH 3/3] Supervisor use own dns layer (#1610) * Supervisor use own dns layer * Add logs --- supervisor/data/resolv.tmpl | 5 +++++ supervisor/dns.py | 27 ++++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 supervisor/data/resolv.tmpl diff --git a/supervisor/data/resolv.tmpl b/supervisor/data/resolv.tmpl new file mode 100644 index 000000000..945db1bc9 --- /dev/null +++ b/supervisor/data/resolv.tmpl @@ -0,0 +1,5 @@ +search local.hass.io +{% for server in servers %} +nameserver {{ server }} +{% endfor %} +options ndots:0 diff --git a/supervisor/dns.py b/supervisor/dns.py index e25c35cc8..f81ee3ceb 100644 --- a/supervisor/dns.py +++ b/supervisor/dns.py @@ -22,7 +22,8 @@ from .validate import dns_url, SCHEMA_DNS_CONFIG _LOGGER: logging.Logger = logging.getLogger(__name__) COREDNS_TMPL: Path = Path(__file__).parents[0].joinpath("data/coredns.tmpl") -RESOLV_CONF: Path = Path("/etc/resolv.conf") +RESOLV_TMPL: Path = Path(__file__).parents[0].joinpath("data/resolv.tmpl") +HOST_RESOLV: Path = Path("/etc/resolv.conf") @attr.s @@ -43,6 +44,7 @@ class CoreDNS(JsonConfig, CoreSysAttributes): self.instance: DockerDNS = DockerDNS(coresys) self.forwarder: DNSForward = DNSForward() self.coredns_template: Optional[jinja2.Template] = None + self.resolv_template: Optional[jinja2.Template] = None self._hosts: List[HostEntry] = [] self._loop: bool = False @@ -123,6 +125,10 @@ class CoreDNS(JsonConfig, CoreSysAttributes): self.coredns_template = jinja2.Template(COREDNS_TMPL.read_text()) except OSError as err: _LOGGER.error("Can't read coredns.tmpl: %s", err) + try: + self.resolv_template = jinja2.Template(RESOLV_TMPL.read_text()) + except OSError as err: + _LOGGER.error("Can't read coredns.tmpl: %s", err) # Run CoreDNS with suppress(CoreDNSError): @@ -131,6 +137,9 @@ class CoreDNS(JsonConfig, CoreSysAttributes): else: await self.start() + # Update supervisor + self._write_resolv(HOST_RESOLV) + async def unload(self) -> None: """Unload DNS forwarder.""" await self.forwarder.stop() @@ -375,3 +384,19 @@ class CoreDNS(JsonConfig, CoreSysAttributes): await self.instance.install(self.version) except DockerAPIError: _LOGGER.error("Repairing of CoreDNS fails") + + def _write_resolv(self, resolv_conf: Path) -> None: + """Update/Write resolv.conf file.""" + nameservers = [f"{self.sys_docker.network.dns!s}", "127.0.0.11"] + + # Read resolv config + data = self.resolv_template.render(servers=nameservers) + + # Write config back to resolv + try: + resolv_conf.write_text(data) + except OSError as err: + _LOGGER.warning("Can't write/update %s: %s", resolv_conf, err) + return + + _LOGGER.info("Updated %s", resolv_conf)