mirror of
https://github.com/mofeng-git/One-KVM.git
synced 2025-12-12 01:00:29 +08:00
refactoring
This commit is contained in:
parent
f38dc912d3
commit
1e44482a84
@ -4,10 +4,10 @@ import aiohttp
|
||||
|
||||
from ...application import init
|
||||
from ...logging import get_logger
|
||||
from ...logging import Log
|
||||
|
||||
from ... import gpio
|
||||
|
||||
from .logreader import LogReader
|
||||
from .info import InfoManager
|
||||
from .hid import Hid
|
||||
from .atx import Atx
|
||||
@ -23,14 +23,14 @@ def main() -> None:
|
||||
loop = asyncio.get_event_loop()
|
||||
http_session = aiohttp.ClientSession(loop=loop)
|
||||
|
||||
log = Log(loop)
|
||||
|
||||
info_manager = InfoManager(
|
||||
meta_path=str(config["info"]["meta"]),
|
||||
extras_path=str(config["info"]["extras"]),
|
||||
loop=loop,
|
||||
)
|
||||
|
||||
log_reader = LogReader(loop)
|
||||
|
||||
hid = Hid(
|
||||
reset=int(config["hid"]["pinout"]["reset"]),
|
||||
device_path=str(config["hid"]["device"]),
|
||||
@ -83,8 +83,8 @@ def main() -> None:
|
||||
)
|
||||
|
||||
Server(
|
||||
log=log,
|
||||
info_manager=info_manager,
|
||||
log_reader=log_reader,
|
||||
|
||||
hid=hid,
|
||||
atx=atx,
|
||||
|
||||
48
kvmd/apps/kvmd/logreader.py
Normal file
48
kvmd/apps/kvmd/logreader.py
Normal file
@ -0,0 +1,48 @@
|
||||
import re
|
||||
import asyncio
|
||||
import time
|
||||
|
||||
from typing import Dict
|
||||
from typing import AsyncGenerator
|
||||
|
||||
import systemd.journal
|
||||
|
||||
|
||||
# =====
|
||||
class LogReader:
|
||||
def __init__(self, loop: asyncio.AbstractEventLoop) -> None:
|
||||
self.__loop = loop
|
||||
|
||||
async def poll_log(self, seek: int, follow: bool) -> AsyncGenerator[Dict, None]:
|
||||
reader = systemd.journal.Reader()
|
||||
reader.this_boot()
|
||||
reader.this_machine()
|
||||
reader.log_level(systemd.journal.LOG_DEBUG)
|
||||
|
||||
services = set(
|
||||
service
|
||||
for service in systemd.journal.Reader().query_unique("_SYSTEMD_UNIT")
|
||||
if re.match(r"kvmd(-\w+)?\.service", service)
|
||||
).union(["kvmd.service"])
|
||||
|
||||
for service in services:
|
||||
reader.add_match(_SYSTEMD_UNIT=service)
|
||||
if seek > 0:
|
||||
reader.seek_realtime(float(time.time() - seek))
|
||||
|
||||
for entry in reader:
|
||||
yield self.__entry_to_record(entry)
|
||||
|
||||
while follow:
|
||||
entry = reader.get_next()
|
||||
if entry:
|
||||
yield self.__entry_to_record(entry)
|
||||
else:
|
||||
await asyncio.sleep(1)
|
||||
|
||||
def __entry_to_record(self, entry: Dict) -> Dict[str, Dict]:
|
||||
return {
|
||||
"dt": entry["__REALTIME_TIMESTAMP"],
|
||||
"service": entry["_SYSTEMD_UNIT"],
|
||||
"msg": entry["MESSAGE"].rstrip(),
|
||||
}
|
||||
@ -14,21 +14,17 @@ import aiohttp.web
|
||||
import setproctitle
|
||||
|
||||
from ...logging import get_logger
|
||||
from ...logging import Log
|
||||
|
||||
from ...aioregion import RegionIsBusyError
|
||||
|
||||
from ... import __version__
|
||||
|
||||
from .info import InfoManager
|
||||
|
||||
from .logreader import LogReader
|
||||
from .hid import Hid
|
||||
|
||||
from .atx import Atx
|
||||
|
||||
from .msd import MsdOperationError
|
||||
from .msd import MassStorageDevice
|
||||
|
||||
from .streamer import Streamer
|
||||
|
||||
|
||||
@ -107,8 +103,8 @@ def _wrap_exceptions_for_web(msg: str) -> Callable:
|
||||
class Server: # pylint: disable=too-many-instance-attributes
|
||||
def __init__( # pylint: disable=too-many-arguments
|
||||
self,
|
||||
log: Log,
|
||||
info_manager: InfoManager,
|
||||
log_reader: LogReader,
|
||||
|
||||
hid: Hid,
|
||||
atx: Atx,
|
||||
@ -122,8 +118,8 @@ class Server: # pylint: disable=too-many-instance-attributes
|
||||
loop: asyncio.AbstractEventLoop,
|
||||
) -> None:
|
||||
|
||||
self.__log = log
|
||||
self.__info_manager = info_manager
|
||||
self.__log_reader = log_reader
|
||||
|
||||
self.__hid = hid
|
||||
self.__atx = atx
|
||||
@ -202,7 +198,7 @@ class Server: # pylint: disable=too-many-instance-attributes
|
||||
follow = _valid_bool("follow", request.query.get("follow", "false"))
|
||||
response = aiohttp.web.StreamResponse(status=200, reason="OK", headers={"Content-Type": "text/plain"})
|
||||
await response.prepare(request)
|
||||
async for record in self.__log.poll_log(seek, follow):
|
||||
async for record in self.__log_reader.poll_log(seek, follow):
|
||||
await response.write(("[%s %s] --- %s" % (
|
||||
record["dt"].strftime("%Y-%m-%d %H:%M:%S"),
|
||||
record["service"],
|
||||
|
||||
@ -1,13 +1,5 @@
|
||||
import sys
|
||||
import re
|
||||
import asyncio
|
||||
import logging
|
||||
import time
|
||||
|
||||
from typing import Dict
|
||||
from typing import AsyncGenerator
|
||||
|
||||
import systemd.journal
|
||||
|
||||
|
||||
# =====
|
||||
@ -21,42 +13,3 @@ def get_logger(depth: int=1) -> logging.Logger:
|
||||
break
|
||||
name = frames[depth].f_globals["__name__"]
|
||||
return logging.getLogger(name)
|
||||
|
||||
|
||||
class Log:
|
||||
def __init__(self, loop: asyncio.AbstractEventLoop) -> None:
|
||||
self.__loop = loop
|
||||
|
||||
async def poll_log(self, seek: int, follow: bool) -> AsyncGenerator[Dict, None]:
|
||||
reader = systemd.journal.Reader()
|
||||
reader.this_boot()
|
||||
reader.this_machine()
|
||||
reader.log_level(systemd.journal.LOG_DEBUG)
|
||||
|
||||
services = set(
|
||||
service
|
||||
for service in systemd.journal.Reader().query_unique("_SYSTEMD_UNIT")
|
||||
if re.match(r"kvmd(-\w+)?\.service", service)
|
||||
).union(["kvmd.service"])
|
||||
|
||||
for service in services:
|
||||
reader.add_match(_SYSTEMD_UNIT=service)
|
||||
if seek > 0:
|
||||
reader.seek_realtime(float(time.time() - seek))
|
||||
|
||||
for entry in reader:
|
||||
yield self.__entry_to_record(entry)
|
||||
|
||||
while follow:
|
||||
entry = reader.get_next()
|
||||
if entry:
|
||||
yield self.__entry_to_record(entry)
|
||||
else:
|
||||
await asyncio.sleep(1)
|
||||
|
||||
def __entry_to_record(self, entry: Dict) -> Dict[str, Dict]:
|
||||
return {
|
||||
"dt": entry["__REALTIME_TIMESTAMP"],
|
||||
"service": entry["_SYSTEMD_UNIT"],
|
||||
"msg": entry["MESSAGE"].rstrip(),
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user