diff --git a/homeassistant/bootstrap.py b/homeassistant/bootstrap.py index cbc8ec5a633..4d68227d4d0 100644 --- a/homeassistant/bootstrap.py +++ b/homeassistant/bootstrap.py @@ -9,11 +9,12 @@ After bootstrapping you can add your own components or start by calling homeassistant.start_home_assistant(bus) """ -import os -import sys +from collections import defaultdict import logging import logging.handlers -from collections import defaultdict +import os +import shutil +import sys import homeassistant.core as core import homeassistant.util.dt as date_util @@ -25,7 +26,7 @@ import homeassistant.components as core_components import homeassistant.components.group as group from homeassistant.helpers.entity import Entity from homeassistant.const import ( - EVENT_COMPONENT_LOADED, CONF_LATITUDE, CONF_LONGITUDE, + __version__, EVENT_COMPONENT_LOADED, CONF_LATITUDE, CONF_LONGITUDE, CONF_TEMPERATURE_UNIT, CONF_NAME, CONF_TIME_ZONE, CONF_CUSTOMIZE, TEMP_CELCIUS, TEMP_FAHRENHEIT) @@ -168,6 +169,7 @@ def from_config_dict(config, hass=None, config_dir=None, enable_log=True, hass.config.config_dir = config_dir mount_local_lib_path(config_dir) + process_ha_config_upgrade(hass) process_ha_core_config(hass, config.get(core.DOMAIN, {})) if enable_log: @@ -281,6 +283,31 @@ def enable_logging(hass, verbose=False, daemon=False, log_rotate_days=None): 'Unable to setup error log %s (access denied)', err_log_path) +def process_ha_config_upgrade(hass): + """ Upgrade config if necessary. """ + version_path = hass.config.path('.HA_VERSION') + + try: + with open(version_path, 'rt') as inp: + conf_version = inp.readline().strip() + except FileNotFoundError: + # Last version to not have this file + conf_version = '0.7.7' + + if conf_version == __version__: + return + + _LOGGER.info('Upgrading config directory from %s to %s', conf_version, + __version__) + + lib_path = hass.config.path('lib') + if os.path.isdir(lib_path): + shutil.rmtree(lib_path) + + with open(version_path, 'wt') as outp: + outp.write(__version__) + + def process_ha_core_config(hass, config): """ Processes the [homeassistant] section from the config. """ hac = hass.config diff --git a/homeassistant/components/notify/__init__.py b/homeassistant/components/notify/__init__.py index 44a0639c001..fdd5d1b5d3a 100644 --- a/homeassistant/components/notify/__init__.py +++ b/homeassistant/components/notify/__init__.py @@ -10,8 +10,8 @@ from functools import partial import logging import os +import homeassistant.bootstrap as bootstrap from homeassistant.config import load_yaml_config_file -from homeassistant.loader import get_component from homeassistant.helpers import config_per_platform from homeassistant.const import CONF_NAME @@ -45,8 +45,8 @@ def setup(hass, config): for platform, p_config in config_per_platform(config, DOMAIN, _LOGGER): # get platform - notify_implementation = get_component( - 'notify.{}'.format(platform)) + notify_implementation = bootstrap.prepare_setup_platform( + hass, config, DOMAIN, platform) if notify_implementation is None: _LOGGER.error("Unknown notification service specified.") diff --git a/homeassistant/util/package.py b/homeassistant/util/package.py index 50b0fffb4af..fdfbc133944 100644 --- a/homeassistant/util/package.py +++ b/homeassistant/util/package.py @@ -29,6 +29,7 @@ def install_package(package, upgrade=True, target=None): try: return 0 == subprocess.call(args) except subprocess.SubprocessError: + _LOGGER.exception('Unable to install pacakge %s', package) return False diff --git a/tests/test_bootstrap.py b/tests/test_bootstrap.py index df05964a79f..a0c4da894f0 100644 --- a/tests/test_bootstrap.py +++ b/tests/test_bootstrap.py @@ -5,11 +5,13 @@ tests.test_bootstrap Tests bootstrap. """ # pylint: disable=too-many-public-methods,protected-access +import os import tempfile import unittest from unittest import mock -from homeassistant import bootstrap +from homeassistant import core, bootstrap +from homeassistant.const import __version__ import homeassistant.util.dt as dt_util from tests.common import mock_detect_location_info @@ -39,3 +41,45 @@ class TestBootstrap(unittest.TestCase): self.assertEqual(sorted(components), sorted(hass.config.components)) + + def test_remove_lib_on_upgrade(self): + with tempfile.TemporaryDirectory() as config_dir: + version_path = os.path.join(config_dir, '.HA_VERSION') + lib_dir = os.path.join(config_dir, 'lib') + check_file = os.path.join(lib_dir, 'check') + + with open(version_path, 'wt') as outp: + outp.write('0.7.0') + + os.mkdir(lib_dir) + + with open(check_file, 'w'): + pass + + hass = core.HomeAssistant() + hass.config.config_dir = config_dir + + self.assertTrue(os.path.isfile(check_file)) + bootstrap.process_ha_config_upgrade(hass) + self.assertFalse(os.path.isfile(check_file)) + + def test_not_remove_lib_if_not_upgrade(self): + with tempfile.TemporaryDirectory() as config_dir: + version_path = os.path.join(config_dir, '.HA_VERSION') + lib_dir = os.path.join(config_dir, 'lib') + check_file = os.path.join(lib_dir, 'check') + + with open(version_path, 'wt') as outp: + outp.write(__version__) + + os.mkdir(lib_dir) + + with open(check_file, 'w'): + pass + + hass = core.HomeAssistant() + hass.config.config_dir = config_dir + + bootstrap.process_ha_config_upgrade(hass) + + self.assertTrue(os.path.isfile(check_file))