118 lines
3.2 KiB
Python
118 lines
3.2 KiB
Python
#!/usr/bin/env python3
|
|
import asyncio
|
|
import jinja2
|
|
import aiohttp_jinja2
|
|
import os
|
|
import __py_include
|
|
|
|
from io import StringIO
|
|
from typing import Optional
|
|
from homekit.config import config, AppConfigUnit
|
|
from homekit.util import homekit_path
|
|
from aiohttp import web
|
|
from homekit import http
|
|
from homekit.modem import ModemsConfig
|
|
|
|
|
|
class WebKbnConfig(AppConfigUnit):
|
|
NAME = 'web_kbn'
|
|
|
|
@classmethod
|
|
def schema(cls) -> Optional[dict]:
|
|
return {
|
|
'listen_addr': cls._addr_schema(required=True),
|
|
'assets_public_path': {'type': 'string'}
|
|
}
|
|
|
|
|
|
STATIC_FILES = [
|
|
'bootstrap.min.css',
|
|
'bootstrap.min.js',
|
|
'polyfills.js',
|
|
'app.js',
|
|
'app.css'
|
|
]
|
|
|
|
|
|
def get_js_link(file, version) -> str:
|
|
if version:
|
|
file += f'?version={version}'
|
|
return f'<script src="{config.app_config["assets_public_path"]}/{file}" type="text/javascript"></script>'
|
|
|
|
|
|
def get_css_link(file, version) -> str:
|
|
if version:
|
|
file += f'?version={version}'
|
|
return f'<link rel="stylesheet" type="text/css" href="{config.app_config["assets_public_path"]}/{file}">'
|
|
|
|
|
|
def get_head_static() -> str:
|
|
buf = StringIO()
|
|
for file in STATIC_FILES:
|
|
v = 1
|
|
try:
|
|
q_ind = file.index('?')
|
|
v = file[q_ind+1:]
|
|
file = file[:file.index('?')]
|
|
except ValueError:
|
|
pass
|
|
|
|
if file.endswith('.js'):
|
|
buf.write(get_js_link(file, v))
|
|
else:
|
|
buf.write(get_css_link(file, v))
|
|
return buf.getvalue()
|
|
|
|
|
|
class WebSite(http.HTTPServer):
|
|
def __init__(self, *args, **kwargs):
|
|
super().__init__(*args, **kwargs)
|
|
|
|
aiohttp_jinja2.setup(
|
|
self.app,
|
|
loader=jinja2.FileSystemLoader(homekit_path('web', 'kbn_templates'))
|
|
)
|
|
|
|
self.app.router.add_static('/assets/', path=homekit_path('web', 'kbn_assets'))
|
|
|
|
self.get('/main.cgi', self.get_index)
|
|
self.get('/modems.cgi', self.get_modems)
|
|
|
|
async def render_page(self,
|
|
req: http.Request,
|
|
template_name: str,
|
|
title: Optional[str] = None,
|
|
context: Optional[dict] = None):
|
|
if context is None:
|
|
context = {}
|
|
context = {
|
|
**context,
|
|
'head_static': get_head_static()
|
|
}
|
|
if title is not None:
|
|
context['title'] = title
|
|
response = aiohttp_jinja2.render_template(template_name+'.j2', req, context=context)
|
|
return response
|
|
|
|
async def get_index(self, req: http.Request):
|
|
return await self.render_page(req, 'index',
|
|
title="Home web site")
|
|
|
|
async def get_modems(self, req: http.Request):
|
|
mc = ModemsConfig()
|
|
print(mc)
|
|
return await self.render_page(req, 'modems',
|
|
title='Состояние модемов',
|
|
context=dict(modems=ModemsConfig()))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
config.load_app(WebKbnConfig)
|
|
|
|
loop = asyncio.get_event_loop()
|
|
# print(config.app_config)
|
|
|
|
print(config.app_config['listen_addr'].host)
|
|
server = WebSite(config.app_config['listen_addr'])
|
|
server.run()
|