From e356d0bcda962ed4074f3f15a78d68d8c471bef6 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 19 May 2019 12:01:29 +0200 Subject: [PATCH] Better handle file not found when loading YAML (#23908) * Better handle file not found * Lint --- homeassistant/components/apns/notify.py | 6 ++++-- homeassistant/components/http/ban.py | 6 ++---- homeassistant/config.py | 8 +++----- homeassistant/scripts/check_config.py | 2 ++ 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/homeassistant/components/apns/notify.py b/homeassistant/components/apns/notify.py index 365bdbcb4f5..ccf7c495f39 100644 --- a/homeassistant/components/apns/notify.py +++ b/homeassistant/components/apns/notify.py @@ -1,6 +1,5 @@ """APNS Notification platform.""" import logging -import os import voluptuous as vol @@ -149,7 +148,8 @@ class ApnsNotificationService(BaseNotificationService): self.devices = {} self.device_states = {} self.topic = topic - if os.path.isfile(self.yaml_path): + + try: self.devices = { str(key): ApnsDevice( str(key), @@ -160,6 +160,8 @@ class ApnsNotificationService(BaseNotificationService): for (key, value) in load_yaml_config_file(self.yaml_path).items() } + except FileNotFoundError: + pass tracking_ids = [ device.full_tracking_device_id diff --git a/homeassistant/components/http/ban.py b/homeassistant/components/http/ban.py index 92c41157a33..1cb610e71a6 100644 --- a/homeassistant/components/http/ban.py +++ b/homeassistant/components/http/ban.py @@ -3,7 +3,6 @@ from collections import defaultdict from datetime import datetime from ipaddress import ip_address import logging -import os from aiohttp.web import middleware from aiohttp.web_exceptions import HTTPForbidden, HTTPUnauthorized @@ -155,11 +154,10 @@ async def async_load_ip_bans_config(hass: HomeAssistant, path: str): """Load list of banned IPs from config file.""" ip_list = [] - if not os.path.isfile(path): - return ip_list - try: list_ = await hass.async_add_executor_job(load_yaml_config_file, path) + except FileNotFoundError: + return ip_list except HomeAssistantError as err: _LOGGER.error('Unable to load %s: %s', path, str(err)) return ip_list diff --git a/homeassistant/config.py b/homeassistant/config.py index 88abf2ac791..b084ed358f3 100644 --- a/homeassistant/config.py +++ b/homeassistant/config.py @@ -363,13 +363,11 @@ def find_config_file(config_dir: Optional[str]) -> Optional[str]: def load_yaml_config_file(config_path: str) -> Dict[Any, Any]: """Parse a YAML configuration file. + Raises FileNotFoundError or HomeAssistantError. + This method needs to run in an executor. """ - try: - conf_dict = load_yaml(config_path) - except FileNotFoundError as err: - raise HomeAssistantError("Config file not found: {}".format( - getattr(err, 'filename', err))) + conf_dict = load_yaml(config_path) if not isinstance(conf_dict, dict): msg = "The configuration file {} does not contain a dictionary".format( diff --git a/homeassistant/scripts/check_config.py b/homeassistant/scripts/check_config.py index c06a5da4207..991a45b6498 100644 --- a/homeassistant/scripts/check_config.py +++ b/homeassistant/scripts/check_config.py @@ -312,6 +312,8 @@ async def check_ha_config_file(hass): return result.add_error("File configuration.yaml not found.") config = await hass.async_add_executor_job( load_yaml_config_file, config_path) + except FileNotFoundError: + return result.add_error("File not found: {}".format(config_path)) except HomeAssistantError as err: return result.add_error( "Error loading {}: {}".format(config_path, err))