refactoring

This commit is contained in:
Devaev Maxim 2018-11-18 08:21:55 +03:00
parent f38dc912d3
commit 1e44482a84
4 changed files with 56 additions and 59 deletions

View File

@ -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,

View 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(),
}

View File

@ -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"],

View File

@ -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(),
}