Skip to content

Commit b5af35b

Browse files
committed
Fix version conflicts
2 parents 99eea99 + 7d46487 commit b5af35b

File tree

16 files changed

+255
-74
lines changed

16 files changed

+255
-74
lines changed

API.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,10 @@ Image with `null` and last_version with `null` reset this options.
331331

332332
Proxy to real home-assistant instance.
333333

334+
- GET `/homeassistant/websocket`
335+
336+
Proxy to real websocket instance.
337+
334338
### RESTful for API addons
335339

336340
- GET `/addons`
@@ -373,6 +377,7 @@ Get all available addons.
373377
{
374378
"name": "xy bla",
375379
"description": "description",
380+
"long_description": "null|markdown",
376381
"auto_update": "bool",
377382
"url": "null|url of addon",
378383
"detached": "bool",

hassio/addons/addon.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ def auto_update(self):
137137
"""Return if auto update is enable."""
138138
if ATTR_AUTO_UPDATE in self.data.user.get(self._id, {}):
139139
return self.data.user[self._id][ATTR_AUTO_UPDATE]
140+
return None
140141

141142
@auto_update.setter
142143
def auto_update(self, value):
@@ -159,12 +160,26 @@ def api_token(self):
159160
"""Return a API token for this add-on."""
160161
if self.is_installed:
161162
return self.data.user[self._id][ATTR_UUID]
163+
return None
162164

163165
@property
164166
def description(self):
165167
"""Return description of addon."""
166168
return self._mesh[ATTR_DESCRIPTON]
167169

170+
@property
171+
def long_description(self):
172+
"""Return README.md as long_description."""
173+
readme = Path(self.path_location, 'README.md')
174+
175+
# If readme not exists
176+
if not readme.exists():
177+
return None
178+
179+
# Return data
180+
with readme.open('r') as readme_file:
181+
return readme_file.read()
182+
168183
@property
169184
def repository(self):
170185
"""Return repository of addon."""
@@ -333,7 +348,7 @@ def audio_output(self, value):
333348
def audio_input(self):
334349
"""Return ALSA config for input or None."""
335350
if not self.with_audio:
336-
return
351+
return None
337352

338353
setting = self.config.audio_input
339354
if self.is_installed and ATTR_AUDIO_INPUT in self.data.user[self._id]:

hassio/addons/build.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
"""HassIO addons build environment."""
22
from pathlib import Path
33

4-
from .validate import SCHEMA_BUILD_CONFIG
4+
from .validate import SCHEMA_BUILD_CONFIG, BASE_IMAGE
55
from ..const import ATTR_SQUASH, ATTR_BUILD_FROM, ATTR_ARGS, META_ADDON
66
from ..tools import JsonConfig
77

@@ -24,7 +24,8 @@ def save(self):
2424
@property
2525
def base_image(self):
2626
"""Base images for this addon."""
27-
return self._data[ATTR_BUILD_FROM][self.config.arch]
27+
return self._data[ATTR_BUILD_FROM].get(
28+
self.config.arch, BASE_IMAGE[self.config.arch])
2829

2930
@property
3031
def squash(self):

hassio/addons/built-in.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"local": {
33
"name": "Local Add-Ons",
44
"url": "https://home-assistant.io/hassio",
5-
"maintainer": "By our self"
5+
"maintainer": "you"
66
},
77
"core": {
88
"name": "Built-in Add-Ons",

hassio/addons/validate.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@ def validate(struct):
219219

220220

221221
# pylint: disable=no-value-for-parameter
222+
# pylint: disable=inconsistent-return-statements
222223
def _single_validate(typ, value, key):
223224
"""Validate a single element."""
224225
# if required argument

hassio/api/__init__.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from .homeassistant import APIHomeAssistant
99
from .host import APIHost
1010
from .network import APINetwork
11+
from .proxy import APIProxy
1112
from .supervisor import APISupervisor
1213
from .security import APISecurity
1314
from .snapshots import APISnapshots
@@ -63,9 +64,9 @@ def register_supervisor(self, supervisor, snapshots, addons, host_control,
6364
'/supervisor/options', api_supervisor.options)
6465
self.webapp.router.add_get('/supervisor/logs', api_supervisor.logs)
6566

66-
def register_homeassistant(self, dock_homeassistant):
67+
def register_homeassistant(self, homeassistant):
6768
"""Register homeassistant function."""
68-
api_hass = APIHomeAssistant(self.config, self.loop, dock_homeassistant)
69+
api_hass = APIHomeAssistant(self.config, self.loop, homeassistant)
6970

7071
self.webapp.router.add_get('/homeassistant/info', api_hass.info)
7172
self.webapp.router.add_get('/homeassistant/logs', api_hass.logs)
@@ -75,10 +76,21 @@ def register_homeassistant(self, dock_homeassistant):
7576
self.webapp.router.add_post('/homeassistant/stop', api_hass.stop)
7677
self.webapp.router.add_post('/homeassistant/start', api_hass.start)
7778
self.webapp.router.add_post('/homeassistant/check', api_hass.check)
79+
80+
def register_proxy(self, homeassistant, websession):
81+
"""Register HomeAssistant API Proxy."""
82+
api_proxy = APIProxy(self.loop, homeassistant, websession)
83+
84+
self.webapp.router.add_get(
85+
'/homeassistant/api/websocket', api_proxy.websocket)
86+
self.webapp.router.add_get(
87+
'/homeassistant/websocket', api_proxy.websocket)
7888
self.webapp.router.add_post(
79-
'/homeassistant/api/{path:.+}', api_hass.api)
89+
'/homeassistant/api/{path:.+}', api_proxy.api)
90+
self.webapp.router.add_get(
91+
'/homeassistant/api/{path:.+}', api_proxy.api)
8092
self.webapp.router.add_get(
81-
'/homeassistant/api/{path:.+}', api_hass.api)
93+
'/homeassistant/api', api_proxy.api)
8294

8395
def register_addons(self, addons):
8496
"""Register homeassistant function."""

hassio/api/addons.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
ATTR_INSTALLED, ATTR_LOGO, ATTR_WEBUI, ATTR_DEVICES, ATTR_PRIVILEGED,
1515
ATTR_AUDIO, ATTR_AUDIO_INPUT, ATTR_AUDIO_OUTPUT, ATTR_HASSIO_API,
1616
ATTR_GPIO, ATTR_HOMEASSISTANT_API, ATTR_STDIN, BOOT_AUTO, BOOT_MANUAL,
17-
ATTR_CHANGELOG, ATTR_HOST_IPC, ATTR_HOST_DBUS,
17+
ATTR_CHANGELOG, ATTR_HOST_IPC, ATTR_HOST_DBUS, ATTR_LONG_DESCRIPTION,
1818
CONTENT_TYPE_PNG, CONTENT_TYPE_BINARY, CONTENT_TYPE_TEXT)
1919
from ..validate import DOCKER_PORTS
2020

@@ -57,7 +57,7 @@ def _pretty_devices(addon):
5757
"""Return a simplified device list."""
5858
dev_list = addon.devices
5959
if not dev_list:
60-
return
60+
return None
6161
return [row.split(':')[0] for row in dev_list]
6262

6363
@api_process
@@ -108,6 +108,7 @@ async def info(self, request):
108108
return {
109109
ATTR_NAME: addon.name,
110110
ATTR_DESCRIPTON: addon.description,
111+
ATTR_LONG_DESCRIPTION: addon.long_description,
111112
ATTR_VERSION: addon.version_installed,
112113
ATTR_AUTO_UPDATE: addon.auto_update,
113114
ATTR_REPOSITORY: addon.repository,

hassio/api/homeassistant.py

Lines changed: 1 addition & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,13 @@
22
import asyncio
33
import logging
44

5-
import aiohttp
6-
from aiohttp import web
7-
from aiohttp.web_exceptions import HTTPBadGateway
8-
from aiohttp.hdrs import CONTENT_TYPE
9-
import async_timeout
105
import voluptuous as vol
116

127
from .util import api_process, api_process_raw, api_validate
138
from ..const import (
149
ATTR_VERSION, ATTR_LAST_VERSION, ATTR_DEVICES, ATTR_IMAGE, ATTR_CUSTOM,
1510
ATTR_BOOT, ATTR_PORT, ATTR_PASSWORD, ATTR_SSL, ATTR_WATCHDOG,
16-
CONTENT_TYPE_BINARY, HEADER_HA_ACCESS)
11+
CONTENT_TYPE_BINARY)
1712
from ..validate import HASS_DEVICES, NETWORK_PORT
1813

1914
_LOGGER = logging.getLogger(__name__)
@@ -46,45 +41,6 @@ def __init__(self, config, loop, homeassistant):
4641
self.loop = loop
4742
self.homeassistant = homeassistant
4843

49-
async def homeassistant_proxy(self, path, request):
50-
"""Return a client request with proxy origin for Home-Assistant."""
51-
url = "{}/api/{}".format(self.homeassistant.api_url, path)
52-
53-
try:
54-
data = None
55-
headers = {}
56-
method = getattr(
57-
self.homeassistant.websession, request.method.lower())
58-
59-
# read data
60-
with async_timeout.timeout(10, loop=self.loop):
61-
data = await request.read()
62-
63-
if data:
64-
headers.update({CONTENT_TYPE: request.content_type})
65-
66-
# need api password?
67-
if self.homeassistant.api_password:
68-
headers = {HEADER_HA_ACCESS: self.homeassistant.api_password}
69-
70-
# reset headers
71-
if not headers:
72-
headers = None
73-
74-
client = await method(
75-
url, data=data, headers=headers, timeout=300
76-
)
77-
78-
return client
79-
80-
except aiohttp.ClientError as err:
81-
_LOGGER.error("Client error on api %s request %s.", path, err)
82-
83-
except asyncio.TimeoutError:
84-
_LOGGER.error("Client timeout error on api request %s.", path)
85-
86-
raise HTTPBadGateway()
87-
8844
@api_process
8945
async def info(self, request):
9046
"""Return host information."""
@@ -169,14 +125,3 @@ async def check(self, request):
169125
raise RuntimeError(message)
170126

171127
return True
172-
173-
async def api(self, request):
174-
"""Proxy API request to Home-Assistant."""
175-
path = request.match_info.get('path')
176-
177-
client = await self.homeassistant_proxy(path, request)
178-
return web.Response(
179-
body=await client.read(),
180-
status=client.status,
181-
content_type=client.content_type
182-
)

0 commit comments

Comments
 (0)