mirror of
https://github.com/mofeng-git/One-KVM.git
synced 2025-12-12 09:10:30 +08:00
refactoring
This commit is contained in:
parent
f38dc912d3
commit
1e44482a84
@ -4,10 +4,10 @@ import aiohttp
|
|||||||
|
|
||||||
from ...application import init
|
from ...application import init
|
||||||
from ...logging import get_logger
|
from ...logging import get_logger
|
||||||
from ...logging import Log
|
|
||||||
|
|
||||||
from ... import gpio
|
from ... import gpio
|
||||||
|
|
||||||
|
from .logreader import LogReader
|
||||||
from .info import InfoManager
|
from .info import InfoManager
|
||||||
from .hid import Hid
|
from .hid import Hid
|
||||||
from .atx import Atx
|
from .atx import Atx
|
||||||
@ -23,14 +23,14 @@ def main() -> None:
|
|||||||
loop = asyncio.get_event_loop()
|
loop = asyncio.get_event_loop()
|
||||||
http_session = aiohttp.ClientSession(loop=loop)
|
http_session = aiohttp.ClientSession(loop=loop)
|
||||||
|
|
||||||
log = Log(loop)
|
|
||||||
|
|
||||||
info_manager = InfoManager(
|
info_manager = InfoManager(
|
||||||
meta_path=str(config["info"]["meta"]),
|
meta_path=str(config["info"]["meta"]),
|
||||||
extras_path=str(config["info"]["extras"]),
|
extras_path=str(config["info"]["extras"]),
|
||||||
loop=loop,
|
loop=loop,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
log_reader = LogReader(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"]),
|
||||||
@ -83,8 +83,8 @@ def main() -> None:
|
|||||||
)
|
)
|
||||||
|
|
||||||
Server(
|
Server(
|
||||||
log=log,
|
|
||||||
info_manager=info_manager,
|
info_manager=info_manager,
|
||||||
|
log_reader=log_reader,
|
||||||
|
|
||||||
hid=hid,
|
hid=hid,
|
||||||
atx=atx,
|
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
|
import setproctitle
|
||||||
|
|
||||||
from ...logging import get_logger
|
from ...logging import get_logger
|
||||||
from ...logging import Log
|
|
||||||
|
|
||||||
from ...aioregion import RegionIsBusyError
|
from ...aioregion import RegionIsBusyError
|
||||||
|
|
||||||
from ... import __version__
|
from ... import __version__
|
||||||
|
|
||||||
from .info import InfoManager
|
from .info import InfoManager
|
||||||
|
from .logreader import LogReader
|
||||||
from .hid import Hid
|
from .hid import Hid
|
||||||
|
|
||||||
from .atx import Atx
|
from .atx import Atx
|
||||||
|
|
||||||
from .msd import MsdOperationError
|
from .msd import MsdOperationError
|
||||||
from .msd import MassStorageDevice
|
from .msd import MassStorageDevice
|
||||||
|
|
||||||
from .streamer import Streamer
|
from .streamer import Streamer
|
||||||
|
|
||||||
|
|
||||||
@ -107,8 +103,8 @@ def _wrap_exceptions_for_web(msg: str) -> Callable:
|
|||||||
class Server: # pylint: disable=too-many-instance-attributes
|
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,
|
|
||||||
info_manager: InfoManager,
|
info_manager: InfoManager,
|
||||||
|
log_reader: LogReader,
|
||||||
|
|
||||||
hid: Hid,
|
hid: Hid,
|
||||||
atx: Atx,
|
atx: Atx,
|
||||||
@ -122,8 +118,8 @@ class Server: # pylint: disable=too-many-instance-attributes
|
|||||||
loop: asyncio.AbstractEventLoop,
|
loop: asyncio.AbstractEventLoop,
|
||||||
) -> None:
|
) -> None:
|
||||||
|
|
||||||
self.__log = log
|
|
||||||
self.__info_manager = info_manager
|
self.__info_manager = info_manager
|
||||||
|
self.__log_reader = log_reader
|
||||||
|
|
||||||
self.__hid = hid
|
self.__hid = hid
|
||||||
self.__atx = atx
|
self.__atx = atx
|
||||||
@ -202,7 +198,7 @@ class Server: # pylint: disable=too-many-instance-attributes
|
|||||||
follow = _valid_bool("follow", request.query.get("follow", "false"))
|
follow = _valid_bool("follow", request.query.get("follow", "false"))
|
||||||
response = aiohttp.web.StreamResponse(status=200, reason="OK", headers={"Content-Type": "text/plain"})
|
response = aiohttp.web.StreamResponse(status=200, reason="OK", headers={"Content-Type": "text/plain"})
|
||||||
await response.prepare(request)
|
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" % (
|
await response.write(("[%s %s] --- %s" % (
|
||||||
record["dt"].strftime("%Y-%m-%d %H:%M:%S"),
|
record["dt"].strftime("%Y-%m-%d %H:%M:%S"),
|
||||||
record["service"],
|
record["service"],
|
||||||
|
|||||||
@ -1,13 +1,5 @@
|
|||||||
import sys
|
import sys
|
||||||
import re
|
|
||||||
import asyncio
|
|
||||||
import logging
|
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
|
break
|
||||||
name = frames[depth].f_globals["__name__"]
|
name = frames[depth].f_globals["__name__"]
|
||||||
return logging.getLogger(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