moved lua crutch to kvmd

This commit is contained in:
Devaev Maxim 2018-11-18 08:11:18 +03:00
parent 51dd9a7428
commit 9762c82d0a
15 changed files with 98 additions and 51 deletions

View File

@ -4,10 +4,8 @@ TESTENV_VIDEO ?= /dev/video0
TESTENV_LOOP ?= /dev/loop7 TESTENV_LOOP ?= /dev/loop7
TESTENV_CMD ?= /bin/bash -c " \ TESTENV_CMD ?= /bin/bash -c " \
(socat PTY,link=$(TESTENV_HID) PTY,link=/dev/ttyS11 &) \ (socat PTY,link=$(TESTENV_HID) PTY,link=/dev/ttyS11 &) \
&& rm -rf /etc/nginx/* \ && cp -r /usr/share/kvmd/configs.default/nginx/* /etc/nginx \
&& cp -r /usr/share/kvmd/configs/nginx/* /etc/nginx \ && cp /usr/share/kvmd/configs.default/kvmd/*.yaml /etc/kvmd \
&& mkdir -p /etc/kvmd \
&& cp /usr/share/kvmd/configs/kvmd/*.yaml /etc/kvmd \
&& cp /testenv/kvmd.yaml /etc/kvmd \ && cp /testenv/kvmd.yaml /etc/kvmd \
&& nginx -c /etc/nginx/nginx.conf \ && nginx -c /etc/nginx/nginx.conf \
&& ln -s $(TESTENV_VIDEO) /dev/kvmd-streamer \ && ln -s $(TESTENV_VIDEO) /dev/kvmd-streamer \
@ -33,7 +31,8 @@ run: _testenv
- docker run --rm \ - docker run --rm \
--volume `pwd`/kvmd:/kvmd:ro \ --volume `pwd`/kvmd:/kvmd:ro \
--volume `pwd`/web:/usr/share/kvmd/web:ro \ --volume `pwd`/web:/usr/share/kvmd/web:ro \
--volume `pwd`/configs:/usr/share/kvmd/configs:ro \ --volume `pwd`/extras:/usr/share/kvmd/extras:ro \
--volume `pwd`/configs:/usr/share/kvmd/configs.default:ro \
--volume `pwd`/testenv:/testenv:ro \ --volume `pwd`/testenv:/testenv:ro \
--device $(TESTENV_LOOP):/dev/kvmd-msd \ --device $(TESTENV_LOOP):/dev/kvmd-msd \
--device $(TESTENV_VIDEO):$(TESTENV_VIDEO) \ --device $(TESTENV_VIDEO):$(TESTENV_VIDEO) \

View File

@ -42,6 +42,7 @@ package() {
mkdir -p "$pkgdir/usr/share/kvmd" mkdir -p "$pkgdir/usr/share/kvmd"
mkdir -p "$pkgdir/etc/kvmd" mkdir -p "$pkgdir/etc/kvmd"
cp -r web "$pkgdir/usr/share/kvmd" cp -r web "$pkgdir/usr/share/kvmd"
cp -r configs "$pkgdir/usr/share/kvmd" cp -r extras "$pkgdir/usr/share/kvmd"
cp -r configs "$pkgdir/usr/share/kvmd/configs.default"
find "$pkgdir" -name ".gitignore" -delete find "$pkgdir" -name ".gitignore" -delete
} }

View File

@ -1,5 +1,5 @@
# Don't touch this file otherwise your device may stop working. # Don't touch this file otherwise your device may stop working.
# You can find a workable configuration in /usr/share/kvmd/configs/kvmd. # You can find a working configuration in /usr/share/kvmd/configs.default/kvmd.
kvmd: kvmd:
server: server:
@ -9,6 +9,7 @@ kvmd:
info: info:
meta: /etc/kvmd/meta.yaml meta: /etc/kvmd/meta.yaml
extras: /usr/share/kvmd/extras
hid: hid:
pinout: pinout:

View File

@ -1,5 +1,5 @@
# Don't touch this file otherwise your device may stop working. # Don't touch this file otherwise your device may stop working.
# You can find a workable configuration in /usr/share/kvmd/configs/kvmd. # You can find a workable configuration in /usr/share/kvmd/configs.default/kvmd.
kvmd: kvmd:
server: server:
@ -9,6 +9,7 @@ kvmd:
info: info:
meta: /etc/kvmd/meta.yaml meta: /etc/kvmd/meta.yaml
extras: /usr/share/kvmd/extras
hid: hid:
pinout: pinout:

View File

@ -1,8 +0,0 @@
{
"name": "KVM",
"description": "Open KVM session in a web browser",
"icon": "/svg/kvm.svg",
"path": "/kvm.html",
"place": 0,
"keyboard_cap": true
}

View File

@ -6,7 +6,7 @@ worker_processes 4;
# error_log /tmp/nginx.error.log; # error_log /tmp/nginx.error.log;
error_log stderr; error_log stderr;
include /etc/nginx/apps/*/main-ctx.conf; include /usr/share/kvmd/extras/*/nginx.main-ctx.conf;
events { events {
worker_connections 1024; worker_connections 1024;
@ -40,26 +40,12 @@ http {
server 127.0.0.1:8082 fail_timeout=0s max_fails=0; server 127.0.0.1:8082 fail_timeout=0s max_fails=0;
} }
include /etc/nginx/apps/*/http-ctx.conf; include /usr/share/kvmd/extras/*/nginx.http-ctx.conf;
lua_shared_dict WS_TOKENS 10m; #PROD lua_shared_dict WS_TOKENS 10m;
init_by_lua_block { #PROD init_by_lua_block {
WS_TOKEN_EXPIRES = 10; #PROD WS_TOKEN_EXPIRES = 10;
#PROD }
local cjson = require("cjson");
local io = require("io");
local apps = {};
local apps_dir_path = "/etc/nginx/apps";
for app in io.popen("ls " .. apps_dir_path):lines() do
local manifest_file = assert(io.open(apps_dir_path .. "/" .. app .. "/manifest.json", "r"));
local manifest = cjson.decode(manifest_file:read("*all"));
manifest_file:close();
apps[app] = manifest;
end
APPS_JSON = cjson.encode(apps);
}
#PROD server { #PROD server {
#PROD listen 80; #PROD listen 80;
@ -98,13 +84,6 @@ http {
} }
} }
location /get_apps {
default_type "application/json";
content_by_lua_block {
ngx.say(APPS_JSON);
}
}
location /kvmd/ws { location /kvmd/ws {
#PROD auth_basic off; #PROD auth_basic off;
#PROD access_by_lua_block { #PROD access_by_lua_block {
@ -165,6 +144,6 @@ http {
proxy_ignore_headers X-Accel-Buffering; proxy_ignore_headers X-Accel-Buffering;
} }
include /etc/nginx/apps/*/server-ctx.conf; include /usr/share/kvmd/extras/*/nginx.server-ctx.conf;
} }
} }

6
extras/kvm/manifest.yaml Normal file
View File

@ -0,0 +1,6 @@
name: KVM
description: Open KVM session in a web browser
icon: /svg/kvm.svg
keyboard_cap: true
daemon: kvmd
place: 0

View File

@ -8,6 +8,7 @@ from ...logging import Log
from ... import gpio from ... import gpio
from .info import InfoManager
from .hid import Hid from .hid import Hid
from .atx import Atx from .atx import Atx
from .msd import MassStorageDevice from .msd import MassStorageDevice
@ -24,6 +25,12 @@ def main() -> None:
log = Log(loop) log = Log(loop)
info_manager = InfoManager(
meta_path=str(config["info"]["meta"]),
extras_path=str(config["info"]["extras"]),
loop=loop,
)
hid = Hid( hid = Hid(
reset=int(config["hid"]["pinout"]["reset"]), reset=int(config["hid"]["pinout"]["reset"]),
device_path=str(config["hid"]["device"]), device_path=str(config["hid"]["device"]),
@ -77,12 +84,13 @@ def main() -> None:
Server( Server(
log=log, log=log,
info_manager=info_manager,
hid=hid, hid=hid,
atx=atx, atx=atx,
msd=msd, msd=msd,
streamer=streamer, streamer=streamer,
meta_path=str(config["info"]["meta"]),
heartbeat=float(config["server"]["heartbeat"]), heartbeat=float(config["server"]["heartbeat"]),
streamer_shutdown_delay=float(config["streamer"]["shutdown_delay"]), streamer_shutdown_delay=float(config["streamer"]["shutdown_delay"]),
msd_chunk_size=int(config["msd"]["chunk_size"]), msd_chunk_size=int(config["msd"]["chunk_size"]),

51
kvmd/apps/kvmd/info.py Normal file
View File

@ -0,0 +1,51 @@
import os
import asyncio
from typing import Dict
import dbus # pylint: disable=import-error
import dbus.exceptions # pylint: disable=import-error
from ...yaml import load_yaml_file
# =====
class InfoManager:
def __init__(
self,
meta_path: str,
extras_path: str,
loop: asyncio.AbstractEventLoop,
) -> None:
self.__meta_path = meta_path
self.__extras_path = extras_path
self.__loop = loop
async def get_meta(self) -> Dict:
return (await self.__loop.run_in_executor(None, load_yaml_file, self.__meta_path))
async def get_extras(self) -> Dict:
return (await self.__loop.run_in_executor(None, self.__sync_get_extras))
def __sync_get_extras(self) -> Dict:
try:
bus = dbus.SystemBus()
def is_enabled(daemon: str) -> bool:
obj = bus.get_object("org.freedesktop.systemd1", "/org/freedesktop/systemd1")
get_unit_state = obj.get_dbus_method("GetUnitFileState", "org.freedesktop.systemd1.Manager")
return (get_unit_state(daemon + ".service") in ["enabled", "enabled-runtime", "static", "indirect", "generated"])
except dbus.exceptions.DBusException:
is_enabled = (lambda daemon: True)
extras: Dict[str, Dict] = {}
for app in os.listdir(self.__extras_path):
if app[0] != "." and os.path.isdir(os.path.join(self.__extras_path, app)):
extras[app] = load_yaml_file(os.path.join(self.__extras_path, app, "manifest.yaml"))
daemon = extras[app].get("daemon", "")
if isinstance(daemon, str) and daemon.strip():
extras[app]["enabled"] = is_enabled(daemon.strip())
return extras

View File

@ -18,10 +18,10 @@ from ...logging import Log
from ...aioregion import RegionIsBusyError from ...aioregion import RegionIsBusyError
from ...yaml import load_yaml_file
from ... import __version__ from ... import __version__
from .info import InfoManager
from .hid import Hid from .hid import Hid
from .atx import Atx from .atx import Atx
@ -108,12 +108,13 @@ class Server: # pylint: disable=too-many-instance-attributes
def __init__( # pylint: disable=too-many-arguments def __init__( # pylint: disable=too-many-arguments
self, self,
log: Log, log: Log,
info_manager: InfoManager,
hid: Hid, hid: Hid,
atx: Atx, atx: Atx,
msd: MassStorageDevice, msd: MassStorageDevice,
streamer: Streamer, streamer: Streamer,
meta_path: str,
heartbeat: float, heartbeat: float,
streamer_shutdown_delay: float, streamer_shutdown_delay: float,
msd_chunk_size: int, msd_chunk_size: int,
@ -122,12 +123,13 @@ class Server: # pylint: disable=too-many-instance-attributes
) -> None: ) -> None:
self.__log = log self.__log = log
self.__info_manager = info_manager
self.__hid = hid self.__hid = hid
self.__atx = atx self.__atx = atx
self.__msd = msd self.__msd = msd
self.__streamer = streamer self.__streamer = streamer
self.__meta_path = meta_path
self.__heartbeat = heartbeat self.__heartbeat = heartbeat
self.__streamer_shutdown_delay = streamer_shutdown_delay self.__streamer_shutdown_delay = streamer_shutdown_delay
self.__msd_chunk_size = msd_chunk_size self.__msd_chunk_size = msd_chunk_size
@ -190,7 +192,8 @@ class Server: # pylint: disable=too-many-instance-attributes
"streamer": await self.__streamer.get_version(), "streamer": await self.__streamer.get_version(),
}, },
"streamer": self.__streamer.get_app(), "streamer": self.__streamer.get_app(),
"meta": load_yaml_file(self.__meta_path), "meta": await self.__info_manager.get_meta(),
"extras": await self.__info_manager.get_extras(),
}) })
@_wrap_exceptions_for_web("Log error") @_wrap_exceptions_for_web("Log error")

View File

@ -6,3 +6,4 @@ pyyaml
pyserial pyserial
setproctitle setproctitle
systemd-python systemd-python
dbus-python

View File

@ -43,8 +43,8 @@ RUN pacman -Syy \
python \ python \
python-pip \ python-pip \
python-systemd \ python-systemd \
python-dbus \
nginx-mainline \ nginx-mainline \
lua51-cjson \
ustreamer \ ustreamer \
socat \ socat \
htmlhint \ htmlhint \
@ -56,4 +56,7 @@ RUN pacman -Syy \
COPY testenv/requirements.txt requirements.txt COPY testenv/requirements.txt requirements.txt
RUN pip install -r requirements.txt RUN pip install -r requirements.txt
RUN rm -rf /etc/nginx/* \
&& mkdir /etc/kvmd
CMD /bin/bash CMD /bin/bash

View File

@ -6,6 +6,7 @@ kvmd:
info: info:
meta: /etc/kvmd/meta.yaml meta: /etc/kvmd/meta.yaml
extras: /usr/share/kvmd/extras
hid: hid:
pinout: pinout:

View File

@ -6,4 +6,5 @@ pyyaml
pyserial pyserial
setproctitle setproctitle
systemd-python systemd-python
dbus-python
tox tox