Update HassIO API

This commit is contained in:
pvizeli 2017-03-22 17:59:06 +01:00
parent e454b8ded9
commit 3ded742f90
5 changed files with 39 additions and 33 deletions

View File

@ -9,6 +9,7 @@ import docker
import .bootstrap import .bootstrap
import .tools import .tools
from .docker.homeassistant import DockerHomeAssistant from .docker.homeassistant import DockerHomeAssistant
from .const import CONF_HOMEASSISTANT_TAG
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -20,30 +21,38 @@ def main():
# init asyncio & aiohttp client # init asyncio & aiohttp client
loop = asyncio.get_event_loop() loop = asyncio.get_event_loop()
websession = aiohttp.ClientSession(loop=loop) websession = aiohttp.ClientSession(loop=loop)
dock = docker.from_env() dock = docker.Client(base_url='unix://var/run/docker.sock', version='auto')
# init system # init system
versions = bootstrap.initialize_system_data() conf_version = bootstrap.initialize_system_data()
# init HomeAssistant Docker # init HomeAssistant Docker
docker_hass = DockerHomeAssistant( docker_hass = DockerHomeAssistant(
loop, dock, versions[CONF_HOMEASSISTANT_IMAGE], loop, dock, conf_version.homeassistant_image,
versions[CONF_HOMEASSISTANT_TAG]) conf_version.homeassistant_tag
)
# first start of supervisor? # first start of supervisor?
if versions['CONF_HOMEASSISTANT_TAG'] is None: if conf_version.homeassistant_tag is None:
_LOGGER.info("First start of supervisor, read version from github.") _LOGGER.info("First start of supervisor, read version from github.")
# read homeassistant tag and install it # read homeassistant tag and install it
current = None current = None
while True: while True:
current = await tools.fetch_current_versions(websession) current = await tools.fetch_current_versions(websession)
if current and 'homeassistant_tag' in current: if current and CONF_HOMEASSISTANT_TAG in current:
if docker_hass.install(current['homeassistant_tag']): if docker_hass.install(current[CONF_SUPERVISOR_TAG]):
break break
_LOGGER.waring("Can't fetch info from github. Retry in 60") _LOGGER.waring("Can't fetch info from github. Retry in 60")
await asyncio.sleep(60, loop=loop) await asyncio.sleep(60, loop=loop)
conf_version.homeassistant_tag = current[CONF_HOMEASSISTANT_TAG]
# run HomeAssistant
docker_hass.run()
await loop.run_forever()
if __name__ == "__main__": if __name__ == "__main__":
sys.exit(main()) sys.exit(main())

View File

@ -6,9 +6,8 @@ import os
from colorlog import ColoredFormatter from colorlog import ColoredFormatter
from .const import ( from .const import FILE_HASSIO_ADDONS, HOMEASSISTANT_CONFIG, HOMEASSISTANT_SSL
FILE_HASSIO_ADDONS, FILE_HASSIO_VERSION, FILE_RESIN_CONFIG, from .version import Version
HOMEASSISTANT_CONFIG, CONF_SUPERVISOR_TAG, CONF_SUPERVISOR_IMAGE)
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -21,33 +20,21 @@ def initialize_system_data():
"Create Home-Assistant config folder %s", HOMEASSISTANT_CONFIG) "Create Home-Assistant config folder %s", HOMEASSISTANT_CONFIG)
os.mkdir(HOMEASSISTANT_CONFIG) os.mkdir(HOMEASSISTANT_CONFIG)
# homeassistant ssl folder
if not os.path.isdir(HOMEASSISTANT_SSL):
_LOGGER.info(
"Create Home-Assistant ssl folder %s", HOMEASSISTANT_SSL)
os.mkdir(HOMEASSISTANT_SSL)
# installed addons # installed addons
if not os.path.isfile(FILE_HASSIO_ADDONS): if not os.path.isfile(FILE_HASSIO_ADDONS):
with open(FILE_HASSIO_ADDONS) as addons_file: with open(FILE_HASSIO_ADDONS) as addons_file:
addons_file.write(json.dumps({})) addons_file.write(json.dumps({}))
# supervisor/homeassistant image/tag versions # supervisor/homeassistant image/tag versions
versions = {} conf_version = Version()
if not os.path.isfile(FILE_HASSIO_VERSION):
versions.update({
CONF_HOMEASSISTANT_IMAGE: os.environ['HOMEASSISTANT_REPOSITORY'],
CONF_HOMEASSISTANT_TAG: '',
})
else:
with open(FILE_HASSIO_VERSION, 'r') as conf_file:
versions = json.loads(conf_file.read())
# update version return conf_version
versions.update({
CONF_SUPERVISOR_IMAGE: os.environ['SUPERVISOR_IMAGE'],
CONF_SUPERVISOR_TAG: os.environ['SUPERVISOR_TAG'],
})
with open(FILE_HASSIO_VERSION, 'w') as conf_file:
conf_file.write(json.dumps(versions))
_LOGGER("initialize system done: %s", versions)
return versions
def initialize_logging(): def initialize_logging():

View File

@ -10,8 +10,11 @@ FILE_RESIN_CONFIG = '/boot/config.json'
FILE_HASSIO_ADDONS = '/data/addons.json' FILE_HASSIO_ADDONS = '/data/addons.json'
FILE_HASSIO_VERSION = '/data/version.json' FILE_HASSIO_VERSION = '/data/version.json'
HOMEASSISTANT_SHARE = os.environ['SUPERVISOR_SHARE'] HASSIO_SHARE = os.environ['SUPERVISOR_SHARE']
HOMEASSISTANT_CONFIG = "{}/config".format(HOMEASSISTANT_SHARE) HASSIO_DOCKER = os.environ['SUPERVISOR_NAME']
HOMEASSISTANT_CONFIG = "{}/homeassistant_config".format(HASSIO_SHARE)
HOMEASSISTANT_SSL = "{}/homeassistant_ssl".format(HASSIO_SHARE)
HTTP_PORT = 9123 HTTP_PORT = 9123

View File

@ -3,6 +3,7 @@ import asyncio
import docker import docker
_LOGGER = logging.getLogger(__name__)
class DockerBase(object): class DockerBase(object):
"""Docker hassio wrapper.""" """Docker hassio wrapper."""

View File

@ -4,7 +4,10 @@ import asyncio
import docker import docker
import . from DockerBase import . from DockerBase
from ..const.py import HOMEASSISTANT_CONFIG, HOMEASSISTANT_SSL, HASSIO_DOCKER
_LOGGER = logging.getLogger(__name__)
HASS_DOCKER_NAME = 'homeassistant'
class DockerHomeAssistant(DockerBase): class DockerHomeAssistant(DockerBase):
"""Docker hassio wrapper for HomeAssistant.""" """Docker hassio wrapper for HomeAssistant."""
@ -17,14 +20,17 @@ class DockerHomeAssistant(DockerBase):
try: try:
self.container = self.dock.containers.run( self.container = self.dock.containers.run(
self.image, self.image,
name=HASS_DOCKER_NAME,
remove=True, remove=True,
network_mode='host', network_mode='host',
restart_policy={ restart_policy={
"Name": "always", "Name": "always",
"MaximumRetryCount": 10, "MaximumRetryCount": 10,
}, },
links={HASSIO_DOCKER: 'HASSIO'},
volumes={ volumes={
'/data': {'bind': '/data', 'mode': 'rw'} HOMEASSISTANT_CONFIG: {'bind': '/config', 'mode': 'rw'},
HOMEASSISTANT_SSL: {'bind': '/ssl', 'mode': 'rw'},
}) })
except docker.errors.APIError as err: except docker.errors.APIError as err:
_LOGGER.error("Can't run %s", self.image) _LOGGER.error("Can't run %s", self.image)