You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

90 lines
3.2 KiB

"""HACS http endpoints."""
import os
from integrationhelper import Logger
from homeassistant.components.http import HomeAssistantView
from aiohttp import web
from hacs_frontend import locate_gz, locate_debug_gz
from custom_components.hacs.globals import get_hacs
IGNORE = ["class-map.js.map"]
class HacsFrontend(HomeAssistantView):
"""Base View Class for HACS."""
requires_auth = False
name = "hacs_files"
url = r"/hacsfiles/{requested_file:.+}"
async def get(self, request, requested_file): # pylint: disable=unused-argument
"""Handle HACS Web requests."""
return await get_file_response(requested_file)
async def get_file_response(requested_file):
"""Get file."""
hacs = get_hacs()
if requested_file in IGNORE:
hacs.logger.debug(f"Ignoring request for {requested_file}")
return web.Response(status=200)
if requested_file.startswith("frontend-"):
if hacs.configuration.debug:
servefile = await hacs.hass.async_add_executor_job(locate_debug_gz)
hacs.logger.debug("Serving DEBUG frontend")
elif hacs.configuration.frontend_repo_url:
hacs.logger.debug("Serving REMOTE DEVELOPMENT frontend")
request = await hacs.session.get(f"{hacs.configuration.frontend_repo_url}/main.js")
if request.status == 200:
result = await request.read()
response = web.Response(body=result)
response.headers["Cache-Control"] = "no-store, max-age=0"
response.headers["Pragma"] = "no-store"
return response
elif hacs.configuration.frontend_repo:
hacs.logger.debug("Serving LOCAL DEVELOPMENT frontend")
servefile = f"{hacs.configuration.frontend_repo}/hacs_frontend/main.js"
else:
servefile = await hacs.hass.async_add_executor_job(locate_gz)
if os.path.exists(servefile):
response = web.FileResponse(servefile)
if hacs.configuration.frontend_repo:
response.headers["Cache-Control"] = "no-store, max-age=0"
response.headers["Pragma"] = "no-store"
return response
elif requested_file == "iconset.js":
return web.FileResponse(
f"{hacs.system.config_path}/custom_components/hacs/iconset.js"
)
try:
if requested_file.startswith("themes"):
file = f"{hacs.system.config_path}/{requested_file}"
else:
file = f"{hacs.system.config_path}/www/community/{requested_file}"
# Serve .gz if it exist
if os.path.exists(file + ".gz"):
file += ".gz"
if os.path.exists(file):
hacs.logger.debug("Serving {} from {}".format(requested_file, file))
response = web.FileResponse(file)
response.headers["Cache-Control"] = "no-store, max-age=0"
response.headers["Pragma"] = "no-store"
return response
else:
hacs.logger.error(f"Tried to serve up '{file}' but it does not exist")
except Exception as error: # pylint: disable=broad-except
hacs.logger.debug(
"there was an issue trying to serve {} - {}".format(requested_file, error)
)
return web.Response(status=404)

Powered by TurnKey Linux.