klippy_connection: report systemd service info

Signed-off-by:  Eric Callahan <arksine.code@gmail.com>
This commit is contained in:
Eric Callahan 2022-08-29 13:40:07 -04:00 committed by Eric Callahan
parent 59471a7959
commit d3484e8c13
1 changed files with 26 additions and 4 deletions

View File

@ -34,6 +34,7 @@ if TYPE_CHECKING:
from websockets import WebRequest, Subscribable
from components.klippy_apis import KlippyAPI
from components.file_manager.file_manager import FileManager
from components.machine import Machine
from asyncio.trsock import TransportSocket
FlexCallback = Callable[..., Optional[Coroutine]]
@ -59,6 +60,7 @@ class KlippyConnection:
self._klipper_version: str = ""
self._missing_reqs: Set[str] = set()
self._peer_cred: Dict[str, int] = {}
self._service_info: Dict[str, Any] = {}
self.init_attempts: int = 0
self._state: str = "disconnected"
self._state_message: str = "Klippy Disconnected"
@ -101,6 +103,16 @@ class KlippyConnection:
def peer_credentials(self) -> Dict[str, int]:
return dict(self._peer_cred)
@property
def service_info(self) -> Dict[str, Any]:
return self._service_info
@property
def unit_name(self) -> str:
svc_info = self._service_info
unit_name = svc_info.get("unit_name", "klipper.service")
return unit_name.split(".", 1)[0]
async def wait_connected(self) -> bool:
if (
self.connection_task is None or
@ -226,18 +238,27 @@ class KlippyConnection:
continue
logging.info("Klippy Connection Established")
self.writer = writer
self._get_peer_credentials(writer)
if self._get_peer_credentials(writer):
machine: Machine = self.server.lookup_component("machine")
provider = machine.get_system_provider()
props = ["Description", "ExecStart", "FragmentPath"]
svc_info = await provider.extract_service_info(
"klipper", self._peer_cred["process_id"], props
)
if svc_info != self._service_info:
self._service_info = svc_info
machine.log_service_info(svc_info)
self.event_loop.create_task(self._read_stream(reader))
return await self._init_klippy_connection()
def _get_peer_credentials(self, writer: asyncio.StreamWriter) -> None:
def _get_peer_credentials(self, writer: asyncio.StreamWriter) -> bool:
sock: TransportSocket
sock = writer.get_extra_info("socket", None)
if sock is None:
logging.debug(
"Unable to get Unix Socket, cant fetch peer credentials"
)
return
return False
data: bytes = b""
try:
size = struct.calcsize("3I")
@ -249,7 +270,7 @@ class KlippyConnection:
logging.exception(
f"Failed to get Klippy Peer Credentials, raw: 0x{data.hex()}"
)
return
return False
self._peer_cred = {
"process_id": pid,
"user_id": uid,
@ -258,6 +279,7 @@ class KlippyConnection:
logging.debug(
f"Klippy Connection: Received Peer Credentials: {self._peer_cred}"
)
return True
async def _init_klippy_connection(self) -> bool:
self.init_list = []