mirror of
https://github.com/mofeng-git/One-KVM.git
synced 2026-01-29 00:51:53 +08:00
@@ -25,8 +25,6 @@ from typing import AsyncGenerator
|
||||
from ...errors import OperationError
|
||||
from ...errors import IsBusyError
|
||||
|
||||
from ...lanuages import Lanuages
|
||||
|
||||
from .. import BasePlugin
|
||||
from .. import get_plugin_class
|
||||
|
||||
@@ -42,7 +40,7 @@ class AtxOperationError(OperationError, AtxError):
|
||||
|
||||
class AtxIsBusyError(IsBusyError, AtxError):
|
||||
def __init__(self) -> None:
|
||||
super().__init__(Lanuages().gettext("Performing another ATX operation, please try again later"))
|
||||
super().__init__("Performing another ATX operation, please try again later")
|
||||
|
||||
|
||||
# =====
|
||||
|
||||
@@ -39,8 +39,6 @@ from ...validators.basic import valid_float_f01
|
||||
from ...validators.os import valid_abs_path
|
||||
from ...validators.hw import valid_gpio_pin
|
||||
|
||||
from ...lanuages import Lanuages
|
||||
|
||||
from . import AtxIsBusyError
|
||||
from . import BaseAtx
|
||||
|
||||
@@ -90,7 +88,6 @@ class Plugin(BaseAtx): # pylint: disable=too-many-instance-attributes
|
||||
notifier=self.__notifier,
|
||||
)
|
||||
|
||||
|
||||
@classmethod
|
||||
def get_plugin_options(cls) -> dict:
|
||||
return {
|
||||
@@ -193,7 +190,7 @@ class Plugin(BaseAtx): # pylint: disable=too-many-instance-attributes
|
||||
await self.__inner_click(name, pin, delay)
|
||||
else:
|
||||
await aiotools.run_region_task(
|
||||
Lanuages().gettext(f"Can't perform ATX {name} click or operation was not completed"),
|
||||
f"Can't perform ATX {name} click or operation was not completed",
|
||||
self.__region, self.__inner_click, name, pin, delay,
|
||||
)
|
||||
|
||||
@@ -206,4 +203,4 @@ class Plugin(BaseAtx): # pylint: disable=too-many-instance-attributes
|
||||
finally:
|
||||
self.__line_request.set_value(pin, gpiod.line.Value(False))
|
||||
await asyncio.sleep(1)
|
||||
get_logger(0).info(Lanuages().gettext("Clicked ATX button %r"), name)
|
||||
get_logger(0).info("Clicked ATX button %r", name)
|
||||
|
||||
@@ -32,8 +32,6 @@ from ...logging import get_logger
|
||||
|
||||
from ... import htclient
|
||||
|
||||
from ...lanuages import Lanuages
|
||||
|
||||
from . import BaseAuthService
|
||||
|
||||
|
||||
@@ -91,7 +89,7 @@ class Plugin(BaseAuthService):
|
||||
htclient.raise_not_200(response)
|
||||
return True
|
||||
except Exception:
|
||||
get_logger().exception(Lanuages().gettext("Failed HTTP auth request for user %r"), user)
|
||||
get_logger().exception("Failed HTTP auth request for user %r", user)
|
||||
return False
|
||||
|
||||
async def cleanup(self) -> None:
|
||||
|
||||
@@ -33,8 +33,6 @@ from ...logging import get_logger
|
||||
from ... import tools
|
||||
from ... import aiotools
|
||||
|
||||
from ...lanuages import Lanuages
|
||||
|
||||
from . import BaseAuthService
|
||||
|
||||
|
||||
@@ -103,9 +101,9 @@ class Plugin(BaseAuthService):
|
||||
except ldap.INVALID_CREDENTIALS:
|
||||
pass
|
||||
except ldap.SERVER_DOWN as err:
|
||||
get_logger().error(Lanuages().gettext("LDAP server is down: %s"), tools.efmt(err))
|
||||
get_logger().error("LDAP server is down: %s", tools.efmt(err))
|
||||
except Exception as err:
|
||||
get_logger().error(Lanuages().gettext("Unexpected LDAP error: %s"), tools.efmt(err))
|
||||
get_logger().error("Unexpected LDAP error: %s", tools.efmt(err))
|
||||
finally:
|
||||
if conn is not None:
|
||||
try:
|
||||
|
||||
@@ -34,8 +34,6 @@ from ...logging import get_logger
|
||||
|
||||
from ... import aiotools
|
||||
|
||||
from ...lanuages import Lanuages
|
||||
|
||||
from . import BaseAuthService
|
||||
|
||||
|
||||
@@ -88,13 +86,13 @@ class Plugin(BaseAuthService):
|
||||
return False
|
||||
else:
|
||||
if uid < self.__allow_uids_at:
|
||||
get_logger().error(Lanuages().gettext("Unallowed UID of user %r: uid=%d < allow_uids_at=%d"),
|
||||
get_logger().error("Unallowed UID of user %r: uid=%d < allow_uids_at=%d",
|
||||
user, uid, self.__allow_uids_at)
|
||||
return False
|
||||
|
||||
pam_obj = pam.pam()
|
||||
if not pam_obj.authenticate(user, passwd, service=self.__service):
|
||||
get_logger().error(Lanuages().gettext("Can't authorize user %r using PAM: code=%d; reason=%s"),
|
||||
get_logger().error("Can't authorize user %r using PAM: code=%d; reason=%s",
|
||||
user, pam_obj.code, pam_obj.reason)
|
||||
return False
|
||||
return True
|
||||
|
||||
@@ -36,8 +36,6 @@ from ...logging import get_logger
|
||||
|
||||
from ... import aiotools
|
||||
|
||||
from ...lanuages import Lanuages
|
||||
|
||||
from . import BaseAuthService
|
||||
|
||||
|
||||
@@ -442,5 +440,5 @@ class Plugin(BaseAuthService):
|
||||
response = client.SendPacket(request)
|
||||
return (response.code == pyrad.packet.AccessAccept)
|
||||
except Exception:
|
||||
get_logger().exception(Lanuages().gettext("Failed RADIUS auth request for user %r"), user)
|
||||
get_logger().exception("Failed RADIUS auth request for user %r", user)
|
||||
return False
|
||||
|
||||
@@ -46,8 +46,6 @@ from ....validators.basic import valid_float_f01
|
||||
from ....validators.os import valid_abs_path
|
||||
from ....validators.hw import valid_gpio_pin_optional
|
||||
|
||||
from ....lanuages import Lanuages
|
||||
|
||||
from .. import BaseHid
|
||||
|
||||
from .gpio import Gpio
|
||||
@@ -146,8 +144,6 @@ class BaseMcuHid(BaseHid, multiprocessing.Process): # pylint: disable=too-many-
|
||||
|
||||
self.__stop_event = multiprocessing.Event()
|
||||
|
||||
self.gettext=Lanuages().gettext
|
||||
|
||||
@classmethod
|
||||
def get_plugin_options(cls) -> dict:
|
||||
return {
|
||||
@@ -251,7 +247,7 @@ class BaseMcuHid(BaseHid, multiprocessing.Process): # pylint: disable=too-many-
|
||||
@aiotools.atomic_fg
|
||||
async def cleanup(self) -> None:
|
||||
if self.is_alive():
|
||||
get_logger(0).info(self.gettext("Stopping HID daemon ..."))
|
||||
get_logger(0).info("Stopping HID daemon ...")
|
||||
self.__stop_event.set()
|
||||
if self.is_alive() or self.exitcode is not None:
|
||||
self.join()
|
||||
@@ -320,14 +316,14 @@ class BaseMcuHid(BaseHid, multiprocessing.Process): # pylint: disable=too-many-
|
||||
with self.__gpio:
|
||||
self.__hid_loop()
|
||||
if self.__phy.has_device():
|
||||
logger.info(self.gettext("Clearing HID events ..."))
|
||||
logger.info("Clearing HID events ...")
|
||||
try:
|
||||
with self.__phy.connected() as conn:
|
||||
self.__process_request(conn, ClearEvent().make_request())
|
||||
except Exception:
|
||||
logger.exception(self.gettext("Can't clear HID events"))
|
||||
logger.exception("Can't clear HID events")
|
||||
except Exception:
|
||||
logger.exception(self.gettext("Unexpected error in the GPIO loop"))
|
||||
logger.exception("Unexpected error in the GPIO loop")
|
||||
time.sleep(1)
|
||||
|
||||
def __hid_loop(self) -> None:
|
||||
@@ -357,24 +353,24 @@ class BaseMcuHid(BaseHid, multiprocessing.Process): # pylint: disable=too-many-
|
||||
reset = False
|
||||
except Exception:
|
||||
self.clear_events()
|
||||
get_logger(0).exception(self.gettext("Unexpected error in the HID loop"))
|
||||
get_logger(0).exception("Unexpected error in the HID loop")
|
||||
time.sleep(1)
|
||||
|
||||
def __hid_loop_wait_device(self, reset: bool) -> bool:
|
||||
logger = get_logger(0)
|
||||
if reset:
|
||||
logger.info(self.gettext("Initial HID reset and wait for %s ..."), self.__phy)
|
||||
logger.info("Initial HID reset and wait for %s ...", self.__phy)
|
||||
self.__gpio.reset()
|
||||
# На самом деле SPI и Serial-девайсы не пропадают,
|
||||
# а вот USB CDC (Pico HID Bridge) вполне себе пропадает
|
||||
for _ in range(10):
|
||||
if self.__phy.has_device():
|
||||
logger.info(self.gettext("Physical HID interface found: %s"), self.__phy)
|
||||
logger.info("Physical HID interface found: %s", self.__phy)
|
||||
return True
|
||||
if self.__stop_event.is_set():
|
||||
break
|
||||
time.sleep(1)
|
||||
logger.error(self.gettext("Missing physical HID interface: %s"), self.__phy)
|
||||
logger.error("Missing physical HID interface: %s", self.__phy)
|
||||
self.__set_state_online(False)
|
||||
return False
|
||||
|
||||
@@ -392,28 +388,28 @@ class BaseMcuHid(BaseHid, multiprocessing.Process): # pylint: disable=too-many-
|
||||
try:
|
||||
if len(response) < 4:
|
||||
read_retries -= 1
|
||||
raise _TempRequestError(self.gettext(f"No response from HID: request={request!r}"))
|
||||
raise _TempRequestError(f"No response from HID: request={request!r}")
|
||||
|
||||
if not check_response(response):
|
||||
request = REQUEST_REPEAT
|
||||
raise _TempRequestError(self.gettext("Invalid response CRC; requesting response again ..."))
|
||||
raise _TempRequestError("Invalid response CRC; requesting response again ...")
|
||||
|
||||
code = response[1]
|
||||
if code == 0x48: # Request timeout # pylint: disable=no-else-raise
|
||||
raise _TempRequestError(self.gettext(f"Got request timeout from HID: request={request!r}"))
|
||||
raise _TempRequestError(f"Got request timeout from HID: request={request!r}")
|
||||
elif code == 0x40: # CRC Error
|
||||
raise _TempRequestError(self.gettext(f"Got CRC error of request from HID: request={request!r}"))
|
||||
raise _TempRequestError(f"Got CRC error of request from HID: request={request!r}")
|
||||
elif code == 0x45: # Unknown command
|
||||
raise _PermRequestError(self.gettext(f"HID did not recognize the request={request!r}"))
|
||||
raise _PermRequestError(f"HID did not recognize the request={request!r}")
|
||||
elif code == 0x24: # Rebooted?
|
||||
raise _PermRequestError(self.gettext("No previous command state inside HID, seems it was rebooted"))
|
||||
raise _PermRequestError("No previous command state inside HID, seems it was rebooted")
|
||||
elif code == 0x20: # Legacy done
|
||||
self.__set_state_online(True)
|
||||
return True
|
||||
elif code & 0x80: # Pong/Done with state
|
||||
self.__set_state_pong(response)
|
||||
return True
|
||||
raise _TempRequestError(self.gettext(f"Invalid response from HID: request={request!r}, response=0x{response!r}"))
|
||||
raise _TempRequestError(f"Invalid response from HID: request={request!r}, response=0x{response!r}")
|
||||
|
||||
except _RequestError as err:
|
||||
common_retries -= 1
|
||||
@@ -444,7 +440,7 @@ class BaseMcuHid(BaseHid, multiprocessing.Process): # pylint: disable=too-many-
|
||||
for msg in error_messages:
|
||||
logger.error(msg)
|
||||
if not (common_retries and read_retries):
|
||||
logger.error(self.gettext("Can't process HID request due many errors: %r", request))
|
||||
logger.error("Can't process HID request due many errors: %r", request)
|
||||
return error_retval
|
||||
|
||||
def __set_state_online(self, online: bool) -> None:
|
||||
|
||||
@@ -27,7 +27,6 @@ import gpiod
|
||||
|
||||
from ....logging import get_logger
|
||||
|
||||
from ....lanuages import Lanuages
|
||||
|
||||
# =====
|
||||
class Gpio: # pylint: disable=too-many-instance-attributes
|
||||
@@ -51,8 +50,6 @@ class Gpio: # pylint: disable=too-many-instance-attributes
|
||||
self.__line_request: (gpiod.LineRequest | None) = None
|
||||
self.__last_power: (bool | None) = None
|
||||
|
||||
self.gettext=Lanuages().gettext
|
||||
|
||||
def __enter__(self) -> None:
|
||||
if self.__power_detect_pin >= 0 or self.__reset_pin >= 0:
|
||||
assert self.__line_request is None
|
||||
@@ -94,7 +91,7 @@ class Gpio: # pylint: disable=too-many-instance-attributes
|
||||
assert self.__line_request
|
||||
power = bool(self.__line_request.get_value(self.__power_detect_pin).value)
|
||||
if power != self.__last_power:
|
||||
get_logger(0).info(self.gettext("HID power state changed: %s -> %s"), self.__last_power, power)
|
||||
get_logger(0).info("HID power state changed: %s -> %s", self.__last_power, power)
|
||||
self.__last_power = power
|
||||
return power
|
||||
return True
|
||||
@@ -108,4 +105,4 @@ class Gpio: # pylint: disable=too-many-instance-attributes
|
||||
finally:
|
||||
self.__line_request.set_value(self.__reset_pin, gpiod.line.Value(self.__reset_inverted))
|
||||
time.sleep(1)
|
||||
get_logger(0).info(self.gettext("Reset HID performed"))
|
||||
get_logger(0).info("Reset HID performed")
|
||||
|
||||
@@ -40,8 +40,6 @@ from .... import aiotools
|
||||
from .... import aiomulti
|
||||
from .... import aioproc
|
||||
|
||||
from ....lanuages import Lanuages
|
||||
|
||||
from .. import BaseHid
|
||||
|
||||
from ..otg.events import ResetEvent
|
||||
@@ -109,8 +107,6 @@ class Plugin(BaseHid): # pylint: disable=too-many-instance-attributes
|
||||
stop_event=self.__stop_event,
|
||||
)
|
||||
|
||||
self.gettext=Lanuages().gettext
|
||||
|
||||
@classmethod
|
||||
def get_plugin_options(cls) -> dict:
|
||||
return {
|
||||
@@ -134,7 +130,7 @@ class Plugin(BaseHid): # pylint: disable=too-many-instance-attributes
|
||||
}
|
||||
|
||||
def sysprep(self) -> None:
|
||||
get_logger(0).info(self.gettext("Starting HID daemon ..."))
|
||||
get_logger(0).info("Starting HID daemon ...")
|
||||
self.__proc = multiprocessing.Process(target=self.__server_worker, daemon=True)
|
||||
self.__proc.start()
|
||||
|
||||
@@ -179,7 +175,7 @@ class Plugin(BaseHid): # pylint: disable=too-many-instance-attributes
|
||||
async def cleanup(self) -> None:
|
||||
if self.__proc is not None:
|
||||
if self.__proc.is_alive():
|
||||
get_logger(0).info(self.gettext("Stopping HID daemon ..."))
|
||||
get_logger(0).info("Stopping HID daemon ...")
|
||||
self.__stop_event.set()
|
||||
if self.__proc.is_alive() or self.__proc.exitcode is not None:
|
||||
self.__proc.join()
|
||||
@@ -228,5 +224,5 @@ class Plugin(BaseHid): # pylint: disable=too-many-instance-attributes
|
||||
try:
|
||||
self.__server.run()
|
||||
except Exception:
|
||||
logger.exception(self.gettext("Unexpected HID error"))
|
||||
logger.exception("Unexpected HID error")
|
||||
time.sleep(5)
|
||||
|
||||
@@ -38,8 +38,6 @@ from .... import aiomulti
|
||||
|
||||
from ....keyboard.mappings import UsbKey
|
||||
|
||||
from ....lanuages import Lanuages
|
||||
|
||||
from ..otg.events import BaseEvent
|
||||
from ..otg.events import ClearEvent
|
||||
from ..otg.events import ResetEvent
|
||||
@@ -117,8 +115,6 @@ class BtServer: # pylint: disable=too-many-instance-attributes
|
||||
self.__keys: list[UsbKey | None] = [None] * 6
|
||||
self.__mouse_buttons = 0
|
||||
|
||||
self.gettext=Lanuages().gettext
|
||||
|
||||
def run(self) -> None:
|
||||
with self.__iface:
|
||||
self.__iface.configure()
|
||||
@@ -150,7 +146,7 @@ class BtServer: # pylint: disable=too-many-instance-attributes
|
||||
|
||||
@contextlib.contextmanager
|
||||
def __listen(self, role: _RoleT, addr: str, port: int) -> Generator[socket.socket, None, None]:
|
||||
get_logger(0).info(self.gettext("Listening [%s]:%d for %s ..."), addr, port, role)
|
||||
get_logger(0).info("Listening [%s]:%d for %s ...", addr, port, role)
|
||||
with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_L2CAP) as sock: # type: ignore
|
||||
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
||||
sock.settimeout(self.__socket_timeout)
|
||||
@@ -187,7 +183,7 @@ class BtServer: # pylint: disable=too-many-instance-attributes
|
||||
elif data == b"\x71":
|
||||
sock.send(b"\x00")
|
||||
except Exception as err:
|
||||
get_logger(0).exception(self.gettext("CTL socket error on %s: %s"), client.addr, tools.efmt(err))
|
||||
get_logger(0).exception("CTL socket error on %s: %s", client.addr, tools.efmt(err))
|
||||
self.__close_client("CTL", client, "ctl_sock")
|
||||
continue
|
||||
|
||||
@@ -201,7 +197,7 @@ class BtServer: # pylint: disable=too-many-instance-attributes
|
||||
elif data[:2] == b"\xA2\x01":
|
||||
self.__process_leds(data[2])
|
||||
except Exception as err:
|
||||
get_logger(0).exception(self.gettext("INT socket error on %s: %s"), client.addr, tools.efmt(err))
|
||||
get_logger(0).exception("INT socket error on %s: %s", client.addr, tools.efmt(err))
|
||||
self.__close_client("INT", client, "ctl_sock")
|
||||
|
||||
if qr in ready_read:
|
||||
@@ -284,7 +280,7 @@ class BtServer: # pylint: disable=too-many-instance-attributes
|
||||
try:
|
||||
client.int_sock.send(report)
|
||||
except Exception as err:
|
||||
get_logger(0).info(self.gettext("Can't send %s report to %s: %s"), name, client.addr, tools.efmt(err))
|
||||
get_logger(0).info("Can't send %s report to %s: %s", name, client.addr, tools.efmt(err))
|
||||
self.__close_client_pair(client)
|
||||
|
||||
def __clear_modifiers(self) -> None:
|
||||
@@ -311,12 +307,12 @@ class BtServer: # pylint: disable=too-many-instance-attributes
|
||||
(sock, peer) = server_sock.accept()
|
||||
sock.setblocking(True)
|
||||
except Exception:
|
||||
get_logger(0).exception(self.gettext("Can't accept %s client"), role)
|
||||
get_logger(0).exception("Can't accept %s client", role)
|
||||
else:
|
||||
if peer[0] not in self.__clients:
|
||||
if len(self.__clients) >= self.__max_clients:
|
||||
self.__close_sock(sock)
|
||||
get_logger(0).info(self.gettext("Refused %s client: %s: max clients reached"), role, peer[0])
|
||||
get_logger(0).info("Refused %s client: %s: max clients reached", role, peer[0])
|
||||
return
|
||||
self.__clients[peer[0]] = _BtClient(peer[0])
|
||||
client = self.__clients[peer[0]]
|
||||
@@ -325,7 +321,7 @@ class BtServer: # pylint: disable=too-many-instance-attributes
|
||||
setattr(client, sock_attr, sock)
|
||||
self.__to_read.add(sock)
|
||||
|
||||
get_logger(0).info(self.gettext("Accepted %s client: %s"), role, peer[0])
|
||||
get_logger(0).info("Accepted %s client: %s", role, peer[0])
|
||||
self.__state_flags.update(online=True)
|
||||
|
||||
self.__set_public(len(self.__clients) < self.__max_clients)
|
||||
@@ -337,7 +333,7 @@ class BtServer: # pylint: disable=too-many-instance-attributes
|
||||
setattr(client, sock_attr, None)
|
||||
self.__to_read.remove(sock)
|
||||
|
||||
get_logger(0).info(self.gettext("Closed %s client %s"), role, client.addr)
|
||||
get_logger(0).info("Closed %s client %s", role, client.addr)
|
||||
|
||||
if client.ctl_sock is None and client.int_sock is None:
|
||||
self.__clients.pop(client.addr)
|
||||
@@ -372,16 +368,16 @@ class BtServer: # pylint: disable=too-many-instance-attributes
|
||||
def __set_public(self, public: bool) -> None:
|
||||
logger = get_logger(0)
|
||||
if self.__control_public:
|
||||
logger.info(self.gettext("Publishing ...") if public else self.gettext("Unpublishing ..."))
|
||||
logger.info("Publishing ..." if public else "Unpublishing ...")
|
||||
try:
|
||||
self.__iface.set_public(public)
|
||||
except Exception as err:
|
||||
logger.error(self.gettext("Can't change public mode: %s"), tools.efmt(err))
|
||||
logger.error("Can't change public mode: %s", tools.efmt(err))
|
||||
|
||||
def __unpair_client(self, client: _BtClient) -> None:
|
||||
logger = get_logger(0)
|
||||
logger.info(self.gettext("Unpairing %s ..."), client.addr)
|
||||
logger.info("Unpairing %s ...", client.addr)
|
||||
try:
|
||||
self.__iface.unpair(client.addr)
|
||||
except Exception as err:
|
||||
logger.error(self.gettext("Can't unpair %s: %s"), client.addr, tools.efmt(err))
|
||||
logger.error("Can't unpair %s: %s", client.addr, tools.efmt(err))
|
||||
|
||||
@@ -41,8 +41,6 @@ from ....validators.basic import valid_float_f01
|
||||
from ....validators.os import valid_abs_path
|
||||
from ....validators.hw import valid_tty_speed
|
||||
|
||||
from ....lanuages import Lanuages
|
||||
|
||||
from .. import BaseHid
|
||||
|
||||
from .chip import ChipResponseError
|
||||
@@ -84,8 +82,6 @@ class Plugin(BaseHid, multiprocessing.Process): # pylint: disable=too-many-inst
|
||||
self.__keyboard = Keyboard()
|
||||
self.__mouse = Mouse()
|
||||
|
||||
self.gettext=Lanuages().gettext
|
||||
|
||||
@classmethod
|
||||
def get_plugin_options(cls) -> dict:
|
||||
return {
|
||||
@@ -96,7 +92,7 @@ class Plugin(BaseHid, multiprocessing.Process): # pylint: disable=too-many-inst
|
||||
}
|
||||
|
||||
def sysprep(self) -> None:
|
||||
get_logger(0).info(self.gettext("Starting HID daemon ..."))
|
||||
get_logger(0).info("Starting HID daemon ...")
|
||||
self.start()
|
||||
|
||||
async def get_state(self) -> dict:
|
||||
@@ -138,7 +134,7 @@ class Plugin(BaseHid, multiprocessing.Process): # pylint: disable=too-many-inst
|
||||
@aiotools.atomic_fg
|
||||
async def cleanup(self) -> None:
|
||||
if self.is_alive():
|
||||
get_logger(0).info(self.gettext("Stopping HID daemon ..."))
|
||||
get_logger(0).info("Stopping HID daemon ...")
|
||||
self.__stop_event.set()
|
||||
if self.is_alive() or self.exitcode is not None:
|
||||
self.join()
|
||||
@@ -175,7 +171,7 @@ class Plugin(BaseHid, multiprocessing.Process): # pylint: disable=too-many-inst
|
||||
|
||||
_ = keyboard_output
|
||||
if mouse_output is not None:
|
||||
get_logger(0).info(self.gettext("HID : mouse output = %s"), mouse_output)
|
||||
get_logger(0).info("HID : mouse output = %s", mouse_output)
|
||||
absolute = (mouse_output == "usb")
|
||||
self.__mouse.set_absolute(absolute)
|
||||
self._set_jiggler_absolute(absolute)
|
||||
@@ -205,7 +201,7 @@ class Plugin(BaseHid, multiprocessing.Process): # pylint: disable=too-many-inst
|
||||
try:
|
||||
self.__hid_loop()
|
||||
except Exception:
|
||||
logger.exception(self.gettext("Unexpected error in the run loop"))
|
||||
logger.exception("Unexpected error in the run loop")
|
||||
time.sleep(1)
|
||||
|
||||
def __hid_loop(self) -> None:
|
||||
@@ -228,7 +224,7 @@ class Plugin(BaseHid, multiprocessing.Process): # pylint: disable=too-many-inst
|
||||
self.__process_cmd(conn, cmd)
|
||||
except Exception:
|
||||
self.clear_events()
|
||||
get_logger(0).exception(self.gettext("Unexpected error in the HID loop"))
|
||||
get_logger(0).exception("Unexpected error in the HID loop")
|
||||
time.sleep(2)
|
||||
|
||||
def __process_cmd(self, conn: ChipConnection, cmd: bytes) -> bool: # pylint: disable=too-many-branches
|
||||
|
||||
@@ -25,8 +25,6 @@ import contextlib
|
||||
|
||||
from typing import Generator
|
||||
|
||||
from ....lanuages import Lanuages
|
||||
|
||||
|
||||
# =====
|
||||
class ChipResponseError(Exception):
|
||||
@@ -37,7 +35,6 @@ class ChipResponseError(Exception):
|
||||
class ChipConnection:
|
||||
def __init__(self, tty: serial.Serial) -> None:
|
||||
self.__tty = tty
|
||||
self.gettext=Lanuages().gettext
|
||||
|
||||
def xfer(self, cmd: bytes) -> int:
|
||||
self.__send(cmd)
|
||||
@@ -55,16 +52,16 @@ class ChipConnection:
|
||||
def __recv(self) -> int:
|
||||
data = self.__tty.read(5)
|
||||
if len(data) < 5:
|
||||
raise ChipResponseError(self.gettext("Too short response, HID might be disconnected"))
|
||||
raise ChipResponseError("Too short response, HID might be disconnected")
|
||||
|
||||
if data and data[4]:
|
||||
data += self.__tty.read(data[4] + 1)
|
||||
|
||||
if self.__make_checksum(data[:-1]) != data[-1]:
|
||||
raise ChipResponseError(self.gettext("Invalid response checksum"))
|
||||
raise ChipResponseError("Invalid response checksum")
|
||||
|
||||
if data[4] == 1 and data[5] != 0:
|
||||
raise ChipResponseError(self.gettext(f"Response error code = {data[5]!r}"))
|
||||
raise ChipResponseError(f"Response error code = {data[5]!r}")
|
||||
|
||||
# led_byte (info) response
|
||||
return (data[7] if data[3] == 0x81 else -1)
|
||||
|
||||
@@ -37,8 +37,6 @@ from .... import aiomulti
|
||||
from .... import aioproc
|
||||
from .... import usb
|
||||
|
||||
from ....lanuages import Lanuages
|
||||
|
||||
from .events import BaseEvent
|
||||
|
||||
|
||||
@@ -77,8 +75,6 @@ class BaseDeviceProcess(multiprocessing.Process): # pylint: disable=too-many-in
|
||||
self.__no_device_reported = False
|
||||
|
||||
self.__logger: (logging.Logger | None) = None
|
||||
|
||||
self.gettext=Lanuages().gettext
|
||||
|
||||
def start(self, udc: str) -> None: # type: ignore # pylint: disable=arguments-differ
|
||||
self.__udc_state_path = usb.get_udc_path(udc, usb.U_STATE)
|
||||
@@ -122,7 +118,7 @@ class BaseDeviceProcess(multiprocessing.Process): # pylint: disable=too-many-in
|
||||
retries -= 1
|
||||
|
||||
except Exception:
|
||||
self.__logger.exception(self.gettext("Unexpected HID-%s error"), self.__name)
|
||||
self.__logger.exception("Unexpected HID-%s error", self.__name)
|
||||
time.sleep(1)
|
||||
|
||||
self.__close_device()
|
||||
@@ -149,7 +145,7 @@ class BaseDeviceProcess(multiprocessing.Process): # pylint: disable=too-many-in
|
||||
|
||||
def _stop(self) -> None:
|
||||
if self.is_alive():
|
||||
get_logger().info(self.gettext("Stopping HID-%s daemon ..."), self.__name)
|
||||
get_logger().info("Stopping HID-%s daemon ...", self.__name)
|
||||
self.__stop_event.set()
|
||||
if self.is_alive() or self.exitcode is not None:
|
||||
self.join()
|
||||
@@ -194,7 +190,7 @@ class BaseDeviceProcess(multiprocessing.Process): # pylint: disable=too-many-in
|
||||
self.__state_flags.update(online=True)
|
||||
return True
|
||||
else:
|
||||
logger.error(self.gettext("HID-%s write() error: written (%s) != report length (%d)"),
|
||||
logger.error("HID-%s write() error: written (%s) != report length (%d)",
|
||||
self.__name, written, len(report))
|
||||
except Exception as err:
|
||||
if isinstance(err, OSError) and (
|
||||
@@ -202,9 +198,9 @@ class BaseDeviceProcess(multiprocessing.Process): # pylint: disable=too-many-in
|
||||
err.errno == errno.EAGAIN # pylint: disable=no-member
|
||||
or err.errno == errno.ESHUTDOWN # pylint: disable=no-member
|
||||
):
|
||||
logger.debug(self.gettext("HID-%s busy/unplugged (write): %s"), self.__name, tools.efmt(err))
|
||||
logger.debug("HID-%s busy/unplugged (write): %s", self.__name, tools.efmt(err))
|
||||
else:
|
||||
logger.exception(self.gettext("Can't write report to HID-%s"), self.__name)
|
||||
logger.exception("Can't write report to HID-%s", self.__name)
|
||||
|
||||
self.__state_flags.update(online=False)
|
||||
return False
|
||||
@@ -221,7 +217,7 @@ class BaseDeviceProcess(multiprocessing.Process): # pylint: disable=too-many-in
|
||||
try:
|
||||
read = bool(select.select([self.__fd], [], [], 0)[0])
|
||||
except Exception as err:
|
||||
logger.error(self.gettext("Can't select() for read HID-%s: %s"), self.__name, tools.efmt(err))
|
||||
logger.error("Can't select() for read HID-%s: %s", self.__name, tools.efmt(err))
|
||||
break
|
||||
|
||||
if read:
|
||||
@@ -229,9 +225,9 @@ class BaseDeviceProcess(multiprocessing.Process): # pylint: disable=too-many-in
|
||||
report = os.read(self.__fd, self.__read_size)
|
||||
except Exception as err:
|
||||
if isinstance(err, OSError) and err.errno == errno.EAGAIN: # pylint: disable=no-member
|
||||
logger.debug(self.gettext("HID-%s busy/unplugged (read): %s"), self.__name, tools.efmt(err))
|
||||
logger.debug("HID-%s busy/unplugged (read): %s", self.__name, tools.efmt(err))
|
||||
else:
|
||||
logger.exception(self.gettext("Can't read report from HID-%s"), self.__name)
|
||||
logger.exception("Can't read report from HID-%s", self.__name)
|
||||
else:
|
||||
self._process_read_report(report)
|
||||
|
||||
@@ -248,7 +244,7 @@ class BaseDeviceProcess(multiprocessing.Process): # pylint: disable=too-many-in
|
||||
self.__close_device()
|
||||
self.__state_flags.update(online=False)
|
||||
if not self.__no_device_reported:
|
||||
logger.error(self.gettext("Missing HID-%s device: %s"), self.__name, self.__device_path)
|
||||
logger.error("Missing HID-%s device: %s", self.__name, self.__device_path)
|
||||
self.__no_device_reported = True
|
||||
return False
|
||||
self.__no_device_reported = False
|
||||
@@ -260,8 +256,8 @@ class BaseDeviceProcess(multiprocessing.Process): # pylint: disable=too-many-in
|
||||
flags |= (os.O_RDWR if self.__read_size else os.O_WRONLY)
|
||||
self.__fd = os.open(self.__device_path, flags)
|
||||
except Exception as err:
|
||||
#logger.error(self.gettext("Can't open HID-%s device %s: %s"),self.__name, self.__device_path, tools.efmt(err))
|
||||
pass
|
||||
logger.error("Can't open HID-%s device %s: %s",
|
||||
self.__name, self.__device_path, tools.efmt(err))
|
||||
|
||||
if self.__fd >= 0:
|
||||
try:
|
||||
@@ -271,9 +267,9 @@ class BaseDeviceProcess(multiprocessing.Process): # pylint: disable=too-many-in
|
||||
return True
|
||||
else:
|
||||
# Если запись недоступна, то скорее всего устройство отключено
|
||||
logger.debug(self.gettext("HID-%s is busy/unplugged (write select)"), self.__name)
|
||||
logger.debug("HID-%s is busy/unplugged (write select)", self.__name)
|
||||
except Exception as err:
|
||||
logger.error(self.gettext("Can't select() for write HID-%s: %s"), self.__name, tools.efmt(err))
|
||||
logger.error("Can't select() for write HID-%s: %s", self.__name, tools.efmt(err))
|
||||
|
||||
self.__state_flags.update(online=False)
|
||||
return False
|
||||
|
||||
@@ -41,7 +41,6 @@ from .events import get_led_scroll
|
||||
from .events import get_led_num
|
||||
from .events import make_keyboard_report
|
||||
|
||||
from ....lanuages import Lanuages
|
||||
|
||||
# =====
|
||||
class KeyboardProcess(BaseDeviceProcess):
|
||||
@@ -55,11 +54,10 @@ class KeyboardProcess(BaseDeviceProcess):
|
||||
|
||||
self.__pressed_modifiers: set[UsbKey] = set()
|
||||
self.__pressed_keys: list[UsbKey | None] = [None] * 6
|
||||
self.gettext=Lanuages().gettext
|
||||
|
||||
def cleanup(self) -> None:
|
||||
self._stop()
|
||||
get_logger().info(self.gettext("Clearing HID-keyboard events ..."))
|
||||
get_logger().info("Clearing HID-keyboard events ...")
|
||||
self._cleanup_write(b"\x00" * 8) # Release all keys and modifiers
|
||||
|
||||
def send_clear_event(self) -> None:
|
||||
|
||||
@@ -36,7 +36,6 @@ from .events import MouseRelativeEvent
|
||||
from .events import MouseWheelEvent
|
||||
from .events import make_mouse_report
|
||||
|
||||
from ....lanuages import Lanuages
|
||||
|
||||
# =====
|
||||
class MouseProcess(BaseDeviceProcess):
|
||||
@@ -55,7 +54,6 @@ class MouseProcess(BaseDeviceProcess):
|
||||
self.__x = 0 # For absolute
|
||||
self.__y = 0
|
||||
self.__win98_fix = False
|
||||
self.gettext=Lanuages().gettext
|
||||
|
||||
def is_absolute(self) -> bool:
|
||||
return self.__absolute
|
||||
@@ -68,7 +66,7 @@ class MouseProcess(BaseDeviceProcess):
|
||||
|
||||
def cleanup(self) -> None:
|
||||
self._stop()
|
||||
get_logger().info(self.gettext("Clearing HID-mouse events ..."))
|
||||
get_logger().info("Clearing HID-mouse events ...")
|
||||
report = make_mouse_report(
|
||||
absolute=self.__absolute,
|
||||
buttons=0,
|
||||
|
||||
@@ -41,8 +41,6 @@ from ...validators.basic import valid_int_f1
|
||||
from ...validators.basic import valid_float_f01
|
||||
from ...validators.hw import valid_gpio_pin_optional
|
||||
|
||||
from ...lanuages import Lanuages
|
||||
|
||||
from ._mcu import BasePhyConnection
|
||||
from ._mcu import BasePhy
|
||||
from ._mcu import BaseMcuHid
|
||||
@@ -58,7 +56,6 @@ class _SpiPhyConnection(BasePhyConnection):
|
||||
|
||||
self.__xfer = xfer
|
||||
self.__read_timeout = read_timeout
|
||||
self.gettext=Lanuages().gettext
|
||||
|
||||
def send(self, request: bytes) -> bytes:
|
||||
assert len(request) == 8
|
||||
|
||||
@@ -40,7 +40,6 @@ from ... import aiotools
|
||||
from .. import BasePlugin
|
||||
from .. import get_plugin_class
|
||||
|
||||
from ...lanuages import Lanuages
|
||||
|
||||
# =====
|
||||
class MsdError(Exception):
|
||||
@@ -53,44 +52,37 @@ class MsdOperationError(OperationError, MsdError):
|
||||
|
||||
class MsdIsBusyError(IsBusyError, MsdError):
|
||||
def __init__(self) -> None:
|
||||
gettext=Lanuages().gettext
|
||||
super().__init__(gettext("Performing another MSD operation, please try again later"))
|
||||
super().__init__("Performing another MSD operation, please try again later")
|
||||
|
||||
|
||||
class MsdOfflineError(MsdOperationError):
|
||||
def __init__(self) -> None:
|
||||
gettext=Lanuages().gettext
|
||||
super().__init__(gettext("MSD is not found"))
|
||||
super().__init__("MSD is not found")
|
||||
|
||||
|
||||
class MsdConnectedError(MsdOperationError):
|
||||
def __init__(self) -> None:
|
||||
gettext=Lanuages().gettext
|
||||
super().__init__(gettext("MSD is connected to Server, but shouldn't for this operation"))
|
||||
super().__init__("MSD is connected to Server, but shouldn't for this operation")
|
||||
|
||||
|
||||
class MsdDisconnectedError(MsdOperationError):
|
||||
def __init__(self) -> None:
|
||||
gettext=Lanuages().gettext
|
||||
super().__init__(gettext("MSD is disconnected from Server, but should be for this operation"))
|
||||
super().__init__("MSD is disconnected from Server, but should be for this operation")
|
||||
|
||||
|
||||
class MsdImageNotSelected(MsdOperationError):
|
||||
def __init__(self) -> None:
|
||||
gettext=Lanuages().gettext
|
||||
super().__init__(gettext("The image is not selected"))
|
||||
super().__init__("The image is not selected")
|
||||
|
||||
|
||||
class MsdUnknownImageError(MsdOperationError):
|
||||
def __init__(self) -> None:
|
||||
gettext=Lanuages().gettext
|
||||
super().__init__(gettext("The image is not found in the storage"))
|
||||
super().__init__("The image is not found in the storage")
|
||||
|
||||
|
||||
class MsdImageExistsError(MsdOperationError):
|
||||
def __init__(self) -> None:
|
||||
gettext=Lanuages().gettext
|
||||
super().__init__(gettext("This image is already exists"))
|
||||
super().__init__("This image is already exists")
|
||||
|
||||
|
||||
# =====
|
||||
|
||||
@@ -31,13 +31,11 @@ from . import BaseMsdReader
|
||||
from . import BaseMsdWriter
|
||||
from . import BaseMsd
|
||||
|
||||
from ...lanuages import Lanuages
|
||||
|
||||
# =====
|
||||
class MsdDisabledError(MsdOperationError):
|
||||
def __init__(self) -> None:
|
||||
gettext=Lanuages().gettext
|
||||
super().__init__(gettext("MSD is disabled"))
|
||||
super().__init__("MSD is disabled")
|
||||
|
||||
|
||||
# =====
|
||||
|
||||
@@ -29,7 +29,6 @@ import os
|
||||
|
||||
from typing import AsyncGenerator
|
||||
|
||||
from ....lanuages import Lanuages
|
||||
from ....logging import get_logger
|
||||
|
||||
from ....inotify import InotifyMask
|
||||
@@ -45,8 +44,6 @@ from ....validators.kvm import valid_msd_image_name
|
||||
from .... import aiotools
|
||||
from .... import fstab
|
||||
|
||||
from ....lanuages import Lanuages
|
||||
|
||||
from .. import MsdIsBusyError
|
||||
from .. import MsdOfflineError
|
||||
from .. import MsdConnectedError
|
||||
@@ -62,6 +59,7 @@ from .storage import Image
|
||||
from .storage import Storage
|
||||
from .drive import Drive
|
||||
|
||||
|
||||
# =====
|
||||
@dataclasses.dataclass(frozen=True)
|
||||
class _DriveState:
|
||||
@@ -143,10 +141,9 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes
|
||||
|
||||
self.__notifier = aiotools.AioNotifier()
|
||||
self.__state = _State(self.__notifier)
|
||||
self.gettext=Lanuages().gettext
|
||||
|
||||
logger = get_logger(0)
|
||||
logger.info(self.gettext("Using OTG gadget %r as MSD"), gadget)
|
||||
logger.info("Using OTG gadget %r as MSD", gadget)
|
||||
aiotools.run_sync(self.__reload_state(notify=False))
|
||||
|
||||
@classmethod
|
||||
@@ -221,7 +218,7 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes
|
||||
self.__drive.set_rw_flag(False)
|
||||
await self.__storage.remount_rw(False)
|
||||
except Exception:
|
||||
get_logger(0).exception(self.gettext("Can't reset MSD properly"))
|
||||
get_logger(0).exception("Can't reset MSD properly")
|
||||
|
||||
@aiotools.atomic_fg
|
||||
async def cleanup(self) -> None:
|
||||
@@ -450,7 +447,7 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes
|
||||
if need_reload_state:
|
||||
await self.__reload_state()
|
||||
except Exception:
|
||||
logger.exception(self.gettext("Unexpected MSD watcher error"))
|
||||
logger.exception("Unexpected MSD watcher error")
|
||||
time.sleep(1)
|
||||
|
||||
async def __reload_state(self, notify: bool=True) -> None:
|
||||
@@ -469,13 +466,13 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes
|
||||
if self.__state.vd is None and drive_state.image is None:
|
||||
# Если только что включились и образ не подключен - попробовать
|
||||
# перемонтировать хранилище (и создать images и meta).
|
||||
logger.info(self.gettext("Probing to remount storage ..."))
|
||||
logger.info("Probing to remount storage ...")
|
||||
await self.__storage.remount_rw(True)
|
||||
await self.__storage.remount_rw(False)
|
||||
await self.__setup_initial()
|
||||
|
||||
except Exception:
|
||||
logger.exception(self.gettext("Error while reloading MSD state; switching to offline"))
|
||||
logger.exception("Error while reloading MSD state; switching to offline")
|
||||
self.__state.storage = None
|
||||
self.__state.vd = None
|
||||
|
||||
@@ -503,12 +500,12 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes
|
||||
logger = get_logger(0)
|
||||
image = await self.__storage.make_image_by_name(self.__initial_image)
|
||||
if (await image.exists()):
|
||||
logger.info(self.gettext("Setting up initial image %r ..."), self.__initial_image)
|
||||
logger.info("Setting up initial image %r ...", self.__initial_image)
|
||||
try:
|
||||
self.__drive.set_rw_flag(False)
|
||||
self.__drive.set_cdrom_flag(self.__initial_cdrom)
|
||||
self.__drive.set_image_path(image.path)
|
||||
except Exception:
|
||||
logger.exception(self.gettext("Can't setup initial image: ignored"))
|
||||
logger.exception("Can't setup initial image: ignored")
|
||||
else:
|
||||
logger.error(self.gettext("Can't find initial image %r: ignored"), self.__initial_image)
|
||||
logger.error("Can't find initial image %r: ignored", self.__initial_image)
|
||||
|
||||
@@ -27,13 +27,11 @@ from .... import usb
|
||||
|
||||
from .. import MsdOperationError
|
||||
|
||||
from ....lanuages import Lanuages
|
||||
|
||||
|
||||
# =====
|
||||
class MsdDriveLockedError(MsdOperationError):
|
||||
def __init__(self) -> None:
|
||||
super().__init__(Lanuages().gettext("MSD drive is locked on IO operation"))
|
||||
super().__init__("MSD drive is locked on IO operation")
|
||||
|
||||
|
||||
# =====
|
||||
|
||||
@@ -31,8 +31,6 @@ from typing import Optional
|
||||
import aiofiles
|
||||
import aiofiles.os
|
||||
|
||||
from ....lanuages import Lanuages
|
||||
|
||||
from .... import aiotools
|
||||
from .... import aiohelpers
|
||||
|
||||
@@ -294,4 +292,4 @@ class Storage(_StorageDc):
|
||||
async def remount_rw(self, rw: bool, fatal: bool=True) -> None:
|
||||
if not (await aiohelpers.remount("MSD", self.__remount_cmd, rw)):
|
||||
if fatal:
|
||||
raise MsdError(Lanuages().gettext("Can't execute remount helper"))
|
||||
raise MsdError("Can't execute remount helper")
|
||||
|
||||
@@ -41,8 +41,6 @@ from ...validators.basic import valid_bool
|
||||
from ...validators.basic import valid_number
|
||||
from ...validators.basic import valid_float_f01
|
||||
|
||||
from ...lanuages import Lanuages
|
||||
|
||||
from . import BaseUserGpioDriver
|
||||
from . import GpioDriverOfflineError
|
||||
|
||||
@@ -148,8 +146,7 @@ class Plugin(BaseUserGpioDriver): # pylint: disable=too-many-instance-attribute
|
||||
) as response:
|
||||
htclient.raise_not_200(response)
|
||||
except Exception as err:
|
||||
|
||||
get_logger().error(Lanuages().gettext("Failed ANELPWR POST request to pin %s: %s"), pin, tools.efmt(err))
|
||||
get_logger().error("Failed ANELPWR POST request to pin %s: %s", pin, tools.efmt(err))
|
||||
raise GpioDriverOfflineError(self)
|
||||
self.__update_notifier.notify()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user