mirror of
https://github.com/mofeng-git/One-KVM.git
synced 2026-01-29 00:51:53 +08:00
@@ -105,9 +105,7 @@ from ..validators.hw import valid_otg_gadget
|
||||
from ..validators.hw import valid_otg_id
|
||||
from ..validators.hw import valid_otg_ethernet
|
||||
|
||||
from ..validators.languages import valid_languages
|
||||
|
||||
from ..languages import Languages
|
||||
from ..lanuages import Lanuages
|
||||
|
||||
# =====
|
||||
def init(
|
||||
@@ -129,16 +127,16 @@ def init(
|
||||
add_help=add_help,
|
||||
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
|
||||
)
|
||||
|
||||
_ = translation(domain="message",localedir="/kvmd/i18n",languages=["zh"]).gettext
|
||||
parser.add_argument("-c", "--config", default="/etc/kvmd/main.yaml", type=valid_abs_file,
|
||||
help="Set config file path", metavar="<file>")
|
||||
help=_("Set config file path"), metavar="<file>")
|
||||
parser.add_argument("-o", "--set-options", default=[], nargs="+",
|
||||
help="Override config options list (like sec/sub/opt=value)", metavar="<k=v>",)
|
||||
help=_("Override config options list (like sec/sub/opt=value)"), metavar="<k=v>",)
|
||||
parser.add_argument("-m", "--dump-config", action="store_true",
|
||||
help="View current configuration (include all overrides)")
|
||||
help=_("View current configuration (include all overrides)"))
|
||||
if check_run:
|
||||
parser.add_argument("--run", dest="run", action="store_true",
|
||||
help="Run the service")
|
||||
help=_("Run the service"))
|
||||
(options, remaining) = parser.parse_known_args(argv)
|
||||
|
||||
if options.dump_config:
|
||||
@@ -153,18 +151,9 @@ def init(
|
||||
))
|
||||
raise SystemExit()
|
||||
config = _init_config(options.config, options.set_options, **load)
|
||||
|
||||
logging.captureWarnings(True)
|
||||
logging.config.dictConfig(config.logging)
|
||||
|
||||
if isinstance(config.get("languages"), dict) and isinstance(config["languages"].get("console"), str):
|
||||
i18n_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))+"/i18n"
|
||||
Languages.init("message", i18n_path, config["languages"]["console"])
|
||||
gettext = Languages().gettext
|
||||
|
||||
logging.addLevelName(20, gettext("INFO"))
|
||||
logging.addLevelName(30, gettext("WARNING"))
|
||||
logging.addLevelName(40, gettext("ERROR"))
|
||||
|
||||
if cli_logging:
|
||||
logging.getLogger().handlers[0].setFormatter(logging.Formatter(
|
||||
"-- {levelname:>7} -- {message}",
|
||||
@@ -173,7 +162,7 @@ def init(
|
||||
|
||||
if check_run and not options.run:
|
||||
raise SystemExit(
|
||||
gettext("To prevent accidental startup, you must specify the --run option to start.\n")+gettext("Try the --help option to find out what this service does.\n")+gettext("Make sure you understand exactly what you are doing!"))
|
||||
_("To prevent accidental startup, you must specify the --run option to start.\n")+_("Try the --help option to find out what this service does.\n")+_("Make sure you understand exactly what you are doing!"))
|
||||
|
||||
return (parser, remaining, config)
|
||||
|
||||
@@ -798,9 +787,4 @@ def _get_config_scheme() -> dict:
|
||||
"timeout": Option(300, type=valid_int_f1),
|
||||
"interval": Option(30, type=valid_int_f1),
|
||||
},
|
||||
|
||||
"languages": {
|
||||
"console": Option("default", type=valid_languages),
|
||||
"web": Option("default", type=valid_languages),
|
||||
},
|
||||
}
|
||||
|
||||
@@ -26,7 +26,7 @@ from ...plugins.hid import get_hid_class
|
||||
from ...plugins.atx import get_atx_class
|
||||
from ...plugins.msd import get_msd_class
|
||||
|
||||
from ...languages import Languages
|
||||
from ...lanuages import Lanuages
|
||||
|
||||
from .. import init
|
||||
|
||||
@@ -112,4 +112,4 @@ def main(argv: (list[str] | None)=None) -> None:
|
||||
stream_forever=config.streamer.forever,
|
||||
).run(**config.server._unpack())
|
||||
|
||||
get_logger(0).info(Languages().gettext("Bye-bye"))
|
||||
get_logger(0).info(Lanuages().gettext("Bye-bye"))
|
||||
|
||||
@@ -34,7 +34,7 @@ from ...plugins.auth import get_auth_service_class
|
||||
|
||||
from ...htserver import HttpExposed
|
||||
|
||||
from ...languages import Languages
|
||||
from ...lanuages import Lanuages
|
||||
|
||||
# =====
|
||||
class AuthManager:
|
||||
@@ -52,7 +52,7 @@ class AuthManager:
|
||||
|
||||
totp_secret_path: str,
|
||||
) -> None:
|
||||
self.gettext=Languages().gettext
|
||||
self.gettext=Lanuages().gettext
|
||||
self.__enabled = enabled
|
||||
if not enabled:
|
||||
get_logger().warning(self.gettext("AUTHORIZATION IS DISABLED"))
|
||||
|
||||
@@ -33,8 +33,6 @@ from aiohttp.web import Request
|
||||
from aiohttp.web import Response
|
||||
from aiohttp.web import WebSocketResponse
|
||||
|
||||
from ...languages import Languages
|
||||
|
||||
from ...logging import get_logger
|
||||
|
||||
from ...errors import OperationError
|
||||
@@ -86,17 +84,17 @@ from .api.redfish import RedfishApi
|
||||
# =====
|
||||
class StreamerQualityNotSupported(OperationError):
|
||||
def __init__(self) -> None:
|
||||
super().__init__(Languages().gettext("This streamer does not support quality settings"))
|
||||
super().__init__("This streamer does not support quality settings")
|
||||
|
||||
|
||||
class StreamerResolutionNotSupported(OperationError):
|
||||
def __init__(self) -> None:
|
||||
super().__init__(Languages().gettext("This streamer does not support resolution settings"))
|
||||
super().__init__("This streamer does not support resolution settings")
|
||||
|
||||
|
||||
class StreamerH264NotSupported(OperationError):
|
||||
def __init__(self) -> None:
|
||||
super().__init__(Languages().gettext("This streamer does not support H264"))
|
||||
super().__init__("This streamer does not support H264")
|
||||
|
||||
|
||||
# =====
|
||||
@@ -212,8 +210,6 @@ class KvmdServer(HttpServer): # pylint: disable=too-many-arguments,too-many-ins
|
||||
self.__reset_streamer = False
|
||||
self.__new_streamer_params: dict = {}
|
||||
|
||||
self.gettext=Languages().gettext
|
||||
|
||||
# ===== STREAMER CONTROLLER
|
||||
|
||||
@exposed_http("POST", "/streamer/set_params")
|
||||
@@ -295,24 +291,24 @@ class KvmdServer(HttpServer): # pylint: disable=too-many-arguments,too-many-ins
|
||||
|
||||
async def _on_shutdown(self) -> None:
|
||||
logger = get_logger(0)
|
||||
logger.info(self.gettext("Waiting short tasks ..."))
|
||||
logger.info("Waiting short tasks ...")
|
||||
await aiotools.wait_all_short_tasks()
|
||||
logger.info(self.gettext("Stopping system tasks ..."))
|
||||
logger.info("Stopping system tasks ...")
|
||||
await aiotools.stop_all_deadly_tasks()
|
||||
logger.info(self.gettext("Disconnecting clients ..."))
|
||||
logger.info("Disconnecting clients ...")
|
||||
await self._close_all_wss()
|
||||
logger.info(self.gettext("On-Shutdown complete"))
|
||||
logger.info("On-Shutdown complete")
|
||||
|
||||
async def _on_cleanup(self) -> None:
|
||||
logger = get_logger(0)
|
||||
for sub in self.__subsystems:
|
||||
if sub.cleanup:
|
||||
logger.info(self.gettext("Cleaning up %s ..."), sub.name)
|
||||
logger.info("Cleaning up %s ...", sub.name)
|
||||
try:
|
||||
await sub.cleanup() # type: ignore
|
||||
except Exception:
|
||||
logger.exception(self.gettext("Cleanup error on %s"), sub.name)
|
||||
logger.info(self.gettext("On-Cleanup complete"))
|
||||
logger.exception("Cleanup error on %s", sub.name)
|
||||
logger.info("On-Cleanup complete")
|
||||
|
||||
async def _on_ws_opened(self) -> None:
|
||||
self.__streamer_notifier.notify()
|
||||
|
||||
@@ -34,7 +34,7 @@ import aiohttp
|
||||
|
||||
from PIL import Image as PilImage
|
||||
|
||||
from ...languages import Languages
|
||||
from ...lanuages import Lanuages
|
||||
|
||||
from ...logging import get_logger
|
||||
|
||||
@@ -228,7 +228,7 @@ class Streamer: # pylint: disable=too-many-instance-attributes
|
||||
|
||||
self.__notifier = aiotools.AioNotifier()
|
||||
|
||||
self.gettext=Languages().gettext
|
||||
self.gettext=Lanuages().gettext
|
||||
|
||||
|
||||
# =====
|
||||
|
||||
@@ -26,7 +26,7 @@ from typing import AsyncGenerator
|
||||
from typing import Callable
|
||||
from typing import Any
|
||||
|
||||
from ...languages import Languages
|
||||
from ...lanuages import Lanuages
|
||||
|
||||
from ...logging import get_logger
|
||||
|
||||
@@ -48,22 +48,22 @@ from ...yamlconf import Section
|
||||
# =====
|
||||
class GpioChannelNotFoundError(GpioOperationError):
|
||||
def __init__(self) -> None:
|
||||
super().__init__(Languages().gettext("GPIO channel is not found"))
|
||||
super().__init__(Lanuages().gettext("GPIO channel is not found"))
|
||||
|
||||
|
||||
class GpioSwitchNotSupported(GpioOperationError):
|
||||
def __init__(self) -> None:
|
||||
super().__init__(Languages().gettext("This GPIO channel does not support switching"))
|
||||
super().__init__(Lanuages().gettext("This GPIO channel does not support switching"))
|
||||
|
||||
|
||||
class GpioPulseNotSupported(GpioOperationError):
|
||||
def __init__(self) -> None:
|
||||
super().__init__(Languages().gettext("This GPIO channel does not support pulsing"))
|
||||
super().__init__(Lanuages().gettext("This GPIO channel does not support pulsing"))
|
||||
|
||||
|
||||
class GpioChannelIsBusyError(IsBusyError, GpioError):
|
||||
def __init__(self) -> None:
|
||||
super().__init__(Languages().gettext("Performing another GPIO operation on this channel, please try again later"))
|
||||
super().__init__(Lanuages().gettext("Performing another GPIO operation on this channel, please try again later"))
|
||||
|
||||
|
||||
# =====
|
||||
@@ -82,7 +82,7 @@ class _GpioInput:
|
||||
self.__driver = driver
|
||||
self.__driver.register_input(self.__pin, config.debounce)
|
||||
|
||||
self.gettext=Languages().gettext
|
||||
self.gettext=Lanuages().gettext
|
||||
|
||||
def get_scheme(self) -> dict:
|
||||
return {
|
||||
@@ -255,7 +255,7 @@ class UserGpio:
|
||||
self.__inputs: dict[str, _GpioInput] = {}
|
||||
self.__outputs: dict[str, _GpioOutput] = {}
|
||||
|
||||
self.gettext=Languages().gettext
|
||||
self.gettext=Lanuages().gettext
|
||||
|
||||
for (channel, ch_config) in tools.sorted_kvs(config.scheme):
|
||||
driver = self.__drivers[ch_config.driver]
|
||||
|
||||
@@ -29,7 +29,7 @@ import argparse
|
||||
|
||||
from os.path import join
|
||||
|
||||
from ...languages import Languages
|
||||
from ...lanuages import Lanuages
|
||||
|
||||
from ...logging import get_logger
|
||||
|
||||
@@ -207,7 +207,7 @@ def _cmd_start(config: Section) -> None: # pylint: disable=too-many-statements,
|
||||
# https://www.isticktoit.net/?p=1383
|
||||
|
||||
logger = get_logger()
|
||||
gettext=Languages().gettext
|
||||
gettext=Lanuages().gettext
|
||||
|
||||
_check_config(config)
|
||||
|
||||
@@ -300,7 +300,7 @@ def _cmd_stop(config: Section) -> None:
|
||||
|
||||
gadget_path = usb.get_gadget_path(config.otg.gadget)
|
||||
|
||||
logger.info(Languages().gettext("Disabling gadget %r ..."), config.otg.gadget)
|
||||
logger.info(Lanuages().gettext("Disabling gadget %r ..."), config.otg.gadget)
|
||||
_write(join(gadget_path, "UDC"), "\n")
|
||||
|
||||
_unlink(join(gadget_path, "os_desc", usb.G_PROFILE_NAME), optional=True)
|
||||
|
||||
@@ -26,7 +26,7 @@ import dataclasses
|
||||
import itertools
|
||||
import argparse
|
||||
|
||||
from ...languages import Languages
|
||||
from ...lanuages import Lanuages
|
||||
|
||||
from ...logging import get_logger
|
||||
|
||||
@@ -89,7 +89,7 @@ class _Service: # pylint: disable=too-many-instance-attributes
|
||||
self.__gadget: str = config.otg.gadget
|
||||
self.__driver: str = config.otg.devices.ethernet.driver
|
||||
|
||||
self.gettext=Languages().gettext
|
||||
self.gettext=Lanuages().gettext
|
||||
|
||||
def start(self) -> None:
|
||||
asyncio.run(self.__run(True))
|
||||
|
||||
@@ -28,8 +28,6 @@ import contextlib
|
||||
|
||||
import aiohttp
|
||||
|
||||
from ...languages import Languages
|
||||
|
||||
from ...logging import get_logger
|
||||
|
||||
from ...keyboard.keysym import SymmapModifiers
|
||||
@@ -135,8 +133,6 @@ class _Client(RfbClient): # pylint: disable=too-many-instance-attributes
|
||||
|
||||
self.__modifiers = 0
|
||||
|
||||
self.gettext=Languages().gettext
|
||||
|
||||
# =====
|
||||
|
||||
async def run(self) -> None:
|
||||
@@ -160,13 +156,13 @@ class _Client(RfbClient): # pylint: disable=too-many-instance-attributes
|
||||
logger = get_logger(0)
|
||||
await self.__stage1_authorized.wait_passed()
|
||||
|
||||
logger.info(self.gettext("%s [kvmd]: Waiting for the SetEncodings message ..."), self._remote)
|
||||
logger.info("%s [kvmd]: Waiting for the SetEncodings message ...", self._remote)
|
||||
if not (await self.__stage2_encodings_accepted.wait_passed(timeout=5)):
|
||||
raise RfbError(self.gettext("No SetEncodings message recieved from the client in 5 secs"))
|
||||
raise RfbError("No SetEncodings message recieved from the client in 5 secs")
|
||||
|
||||
assert self.__kvmd_session
|
||||
try:
|
||||
logger.info(self.gettext("%s [kvmd]: Applying HID params: mouse_output=%s ..."), self._remote, self.__mouse_output)
|
||||
logger.info("%s [kvmd]: Applying HID params: mouse_output=%s ...", self._remote, self.__mouse_output)
|
||||
await self.__kvmd_session.hid.set_params(mouse_output=self.__mouse_output)
|
||||
|
||||
async with self.__kvmd_session.ws() as self.__kvmd_ws:
|
||||
@@ -174,7 +170,7 @@ class _Client(RfbClient): # pylint: disable=too-many-instance-attributes
|
||||
self.__stage3_ws_connected.set_passed()
|
||||
async for (event_type, event) in self.__kvmd_ws.communicate():
|
||||
await self.__process_ws_event(event_type, event)
|
||||
raise RfbError(self.gettext("KVMD closed the websocket (the server may have been stopped)"))
|
||||
raise RfbError("KVMD closed the websocket (the server may have been stopped)")
|
||||
finally:
|
||||
self.__kvmd_ws = None
|
||||
|
||||
@@ -208,19 +204,19 @@ class _Client(RfbClient): # pylint: disable=too-many-instance-attributes
|
||||
while True:
|
||||
frame = await read_frame(not self.__fb_has_key)
|
||||
if not streaming:
|
||||
logger.info(self.gettext("%s [streamer]: Streaming ..."), self._remote)
|
||||
logger.info("%s [streamer]: Streaming ...", self._remote)
|
||||
streaming = True
|
||||
if frame["online"]:
|
||||
await self.__queue_frame(frame)
|
||||
else:
|
||||
await self.__queue_frame(self.gettext("No signal"))
|
||||
await self.__queue_frame("No signal")
|
||||
except StreamerError as err:
|
||||
if isinstance(err, StreamerPermError):
|
||||
streamer = self.__get_default_streamer()
|
||||
logger.info(self.gettext("%s [streamer]: Permanent error: %s; switching to %s ..."), self._remote, err, streamer)
|
||||
logger.info("%s [streamer]: Permanent error: %s; switching to %s ...", self._remote, err, streamer)
|
||||
else:
|
||||
logger.info(self.gettext("%s [streamer]: Waiting for stream: %s"), self._remote, err)
|
||||
await self.__queue_frame(self.gettext("Waiting for stream ..."))
|
||||
logger.info("%s [streamer]: Waiting for stream: %s", self._remote, err)
|
||||
await self.__queue_frame("Waiting for stream ...")
|
||||
await asyncio.sleep(1)
|
||||
|
||||
def __get_preferred_streamer(self) -> BaseStreamerClient:
|
||||
@@ -231,13 +227,13 @@ class _Client(RfbClient): # pylint: disable=too-many-instance-attributes
|
||||
streamer: (BaseStreamerClient | None) = None
|
||||
for streamer in self.__streamers:
|
||||
if getattr(self._encodings, formats[streamer.get_format()]):
|
||||
get_logger(0).info(self.gettext("%s [streamer]: Using preferred %s"), self._remote, streamer)
|
||||
get_logger(0).info("%s [streamer]: Using preferred %s", self._remote, streamer)
|
||||
return streamer
|
||||
raise RuntimeError("No streamers found")
|
||||
|
||||
def __get_default_streamer(self) -> BaseStreamerClient:
|
||||
streamer = self.__streamers[-1]
|
||||
get_logger(0).info(self.gettext("%s [streamer]: Using default %s"), self._remote, streamer)
|
||||
get_logger(0).info("%s [streamer]: Using default %s", self._remote, streamer)
|
||||
return streamer
|
||||
|
||||
async def __queue_frame(self, frame: (dict | str)) -> None:
|
||||
@@ -302,13 +298,13 @@ class _Client(RfbClient): # pylint: disable=too-many-instance-attributes
|
||||
await self._send_fb_jpeg(last["data"])
|
||||
elif last["format"] == StreamFormats.H264:
|
||||
if not self._encodings.has_h264:
|
||||
raise RfbError(self.gettext("The client doesn't want to accept H264 anymore"))
|
||||
raise RfbError("The client doesn't want to accept H264 anymore")
|
||||
if self.__fb_has_key:
|
||||
await self._send_fb_h264(last["data"])
|
||||
else:
|
||||
await self._send_fb_allow_again()
|
||||
else:
|
||||
raise RuntimeError(self.gettext(f"Unknown format: {last['format']}"))
|
||||
raise RuntimeError(f"Unknown format: {last['format']}")
|
||||
last["data"] = b""
|
||||
|
||||
# =====
|
||||
@@ -414,7 +410,7 @@ class _Client(RfbClient): # pylint: disable=too-many-instance-attributes
|
||||
|
||||
has_quality = (await self.__kvmd_session.streamer.get_state())["features"]["quality"]
|
||||
quality = (self._encodings.tight_jpeg_quality if has_quality else None)
|
||||
get_logger(0).info(self.gettext("%s [main]: Applying streamer params: jpeg_quality=%s; desired_fps=%d ..."),
|
||||
get_logger(0).info("%s [main]: Applying streamer params: jpeg_quality=%s; desired_fps=%d ...",
|
||||
self._remote, quality, self.__desired_fps)
|
||||
await self.__kvmd_session.streamer.set_params(quality, self.__desired_fps)
|
||||
|
||||
@@ -460,16 +456,14 @@ class VncServer: # pylint: disable=too-many-instance-attributes
|
||||
|
||||
shared_params = _SharedParams()
|
||||
|
||||
self.gettext=Languages().gettext
|
||||
|
||||
async def cleanup_client(writer: asyncio.StreamWriter) -> None:
|
||||
if (await aiotools.close_writer(writer)):
|
||||
get_logger(0).info(self.gettext("%s [entry]: Connection is closed in an emergency"), rfb_format_remote(writer))
|
||||
get_logger(0).info("%s [entry]: Connection is closed in an emergency", rfb_format_remote(writer))
|
||||
|
||||
async def handle_client(reader: asyncio.StreamReader, writer: asyncio.StreamWriter) -> None:
|
||||
logger = get_logger(0)
|
||||
remote = rfb_format_remote(writer)
|
||||
logger.info(self.gettext("%s [entry]: Connected client"), remote)
|
||||
logger.info("%s [entry]: Connected client", remote)
|
||||
try:
|
||||
sock = writer.get_extra_info("socket")
|
||||
if no_delay:
|
||||
@@ -488,7 +482,7 @@ class VncServer: # pylint: disable=too-many-instance-attributes
|
||||
async with kvmd.make_session("", "") as kvmd_session:
|
||||
none_auth_only = await kvmd_session.auth.check()
|
||||
except (aiohttp.ClientError, asyncio.TimeoutError) as err:
|
||||
logger.error(self.gettext("%s [entry]: Can't check KVMD auth mode: %s"), remote, tools.efmt(err))
|
||||
logger.error("%s [entry]: Can't check KVMD auth mode: %s", remote, tools.efmt(err))
|
||||
return
|
||||
|
||||
await _Client(
|
||||
@@ -510,7 +504,7 @@ class VncServer: # pylint: disable=too-many-instance-attributes
|
||||
shared_params=shared_params,
|
||||
).run()
|
||||
except Exception:
|
||||
logger.exception(self.gettext("%s [entry]: Unhandled exception in client task"), remote)
|
||||
logger.exception("%s [entry]: Unhandled exception in client task", remote)
|
||||
finally:
|
||||
await aiotools.shield_fg(cleanup_client(writer))
|
||||
|
||||
@@ -520,7 +514,7 @@ class VncServer: # pylint: disable=too-many-instance-attributes
|
||||
if not (await self.__vnc_auth_manager.read_credentials())[1]:
|
||||
raise SystemExit(1)
|
||||
|
||||
get_logger(0).info(self.gettext("Listening VNC on TCP [%s]:%d ..."), self.__host, self.__port)
|
||||
get_logger(0).info("Listening VNC on TCP [%s]:%d ...", self.__host, self.__port)
|
||||
(family, _, _, _, addr) = socket.getaddrinfo(self.__host, self.__port, type=socket.SOCK_STREAM)[0]
|
||||
with contextlib.closing(socket.socket(family, socket.SOCK_STREAM)) as sock:
|
||||
if family == socket.AF_INET6:
|
||||
@@ -538,4 +532,4 @@ class VncServer: # pylint: disable=too-many-instance-attributes
|
||||
|
||||
def run(self) -> None:
|
||||
aiotools.run(self.__inner_run())
|
||||
get_logger().info(self.gettext("Bye-bye"))
|
||||
get_logger().info("Bye-bye")
|
||||
|
||||
@@ -22,8 +22,6 @@
|
||||
|
||||
import dataclasses
|
||||
|
||||
from ...languages import Languages
|
||||
|
||||
from ...logging import get_logger
|
||||
|
||||
from ... import aiotools
|
||||
@@ -32,7 +30,7 @@ from ... import aiotools
|
||||
# =====
|
||||
class VncAuthError(Exception):
|
||||
def __init__(self, path: str, lineno: int, msg: str) -> None:
|
||||
super().__init__(Languages().gettext(f"Syntax error at {path}:{lineno}: {msg}"))
|
||||
super().__init__(f"Syntax error at {path}:{lineno}: {msg}")
|
||||
|
||||
|
||||
# =====
|
||||
@@ -51,7 +49,6 @@ class VncAuthManager:
|
||||
|
||||
self.__path = path
|
||||
self.__enabled = enabled
|
||||
self.gettext=Languages().gettext
|
||||
|
||||
async def read_credentials(self) -> tuple[dict[str, VncAuthKvmdCredentials], bool]:
|
||||
if self.__enabled:
|
||||
@@ -60,7 +57,7 @@ class VncAuthManager:
|
||||
except VncAuthError as err:
|
||||
get_logger(0).error(str(err))
|
||||
except Exception:
|
||||
get_logger(0).exception(self.gettext("Unhandled exception while reading VNCAuth passwd file"))
|
||||
get_logger(0).exception("Unhandled exception while reading VNCAuth passwd file")
|
||||
return ({}, (not self.__enabled))
|
||||
|
||||
async def __inner_read_credentials(self) -> dict[str, VncAuthKvmdCredentials]:
|
||||
@@ -71,19 +68,19 @@ class VncAuthManager:
|
||||
continue
|
||||
|
||||
if " -> " not in line:
|
||||
raise VncAuthError(self.__path, lineno, self.gettext("Missing ' -> ' operator"))
|
||||
raise VncAuthError(self.__path, lineno, "Missing ' -> ' operator")
|
||||
|
||||
(vnc_passwd, kvmd_userpass) = map(str.lstrip, line.split(" -> ", 1))
|
||||
if ":" not in kvmd_userpass:
|
||||
raise VncAuthError(self.__path, lineno, self.gettext("Missing ':' operator in KVMD credentials (right part)"))
|
||||
raise VncAuthError(self.__path, lineno, "Missing ':' operator in KVMD credentials (right part)")
|
||||
|
||||
(kvmd_user, kvmd_passwd) = kvmd_userpass.split(":")
|
||||
kvmd_user = kvmd_user.strip()
|
||||
if len(kvmd_user) == 0:
|
||||
raise VncAuthError(self.__path, lineno, self.gettext("Empty KVMD user (right part)"))
|
||||
raise VncAuthError(self.__path, lineno, "Empty KVMD user (right part)")
|
||||
|
||||
if vnc_passwd in credentials:
|
||||
raise VncAuthError(self.__path, lineno, self.gettext("Duplicating VNC password (left part)"))
|
||||
raise VncAuthError(self.__path, lineno, "Duplicating VNC password (left part)")
|
||||
|
||||
credentials[vnc_passwd] = VncAuthKvmdCredentials(kvmd_user, kvmd_passwd)
|
||||
return credentials
|
||||
|
||||
Reference in New Issue
Block a user