diff --git a/nanokvm/client.py b/nanokvm/client.py index 7bf29c9..af56d3e 100644 --- a/nanokvm/client.py +++ b/nanokvm/client.py @@ -26,15 +26,17 @@ GetCdRomRsp, GetGpioRsp, GetHardwareRsp, + GetHdmiStateRsp, GetHidModeRsp, GetInfoRsp, GetMdnsStateRsp, GetMemoryLimitRsp, GetMountedImageRsp, + GetMouseJigglerRsp, GetOLEDRsp, GetPreviewRsp, GetSSHStateRsp, - GetSwapStateRsp, + GetSwapSizeRsp, GetTailscaleStatusRsp, GetVersionRsp, GetVirtualDeviceRsp, @@ -46,12 +48,15 @@ LoginReq, LoginRsp, MountImageReq, + MouseJigglerMode, PasteReq, SetGpioReq, SetHidModeReq, SetMemoryLimitReq, + SetMouseJigglerReq, SetOledReq, SetPreviewReq, + SetSwapSizeReq, StatusImageRsp, UpdateVirtualDeviceReq, UpdateVirtualDeviceRsp, @@ -305,12 +310,19 @@ async def get_ssh_state(self) -> GetSSHStateRsp: response_model=GetSSHStateRsp, ) - async def get_swap_state(self) -> GetSwapStateRsp: - """Get Swap enabled state.""" - return await self._api_request_json( + async def get_swap_size(self) -> int: + """Get Swap size.""" + rsp = await self._api_request_json( hdrs.METH_GET, "/vm/swap", - response_model=GetSwapStateRsp, + response_model=GetSwapSizeRsp, + ) + return rsp.size + + async def set_swap_size(self, size_mb: int) -> None: + """Set the Swap size.""" + await self._api_request_json( + hdrs.METH_POST, "/vm/swap", data=SetSwapSizeReq(size=size_mb) ) async def get_mdns_state(self) -> GetMdnsStateRsp: @@ -561,10 +573,26 @@ async def reboot_system(self) -> None: """Reboot the KVM device.""" await self._api_request_json(hdrs.METH_POST, "/vm/system/reboot") + async def get_hdmi_state(self) -> GetHdmiStateRsp: + """Get the HDMI state.""" + return await self._api_request_json( + hdrs.METH_GET, + "/vm/hdmi", + response_model=GetHdmiStateRsp, + ) + async def reset_hdmi(self) -> None: - """Reset the HDMI connection (relevant for PCIe version).""" + """Reset the HDMI connection.""" await self._api_request_json(hdrs.METH_POST, "/vm/hdmi/reset") + async def enable_hdmi(self) -> None: + """Enable the HDMI connection.""" + await self._api_request_json(hdrs.METH_POST, "/vm/hdmi/enable") + + async def disable_hdmi(self) -> None: + """Disable the HDMI connection.""" + await self._api_request_json(hdrs.METH_POST, "/vm/hdmi/disable") + async def reset_hid(self) -> None: """Reset the HID subsystem.""" await self._api_request_json(hdrs.METH_POST, "/hid/reset") @@ -608,3 +636,21 @@ async def tailscale_stop(self) -> None: async def tailscale_restart(self) -> None: """Perform a Tailscale action: restart.""" await self._api_request_json(hdrs.METH_POST, "/extensions/tailscale/restart") + + async def get_mouse_jiggler_state(self) -> GetMouseJigglerRsp: + """Get the mouse jiggler state.""" + return await self._api_request_json( + hdrs.METH_GET, + "/vm/mouse-jiggler", + response_model=GetMouseJigglerRsp, + ) + + async def set_mouse_jiggler_state( + self, enabled: bool, mode: MouseJigglerMode + ) -> None: + """Set the mouse jiggler state.""" + await self._api_request_json( + hdrs.METH_POST, + "/vm/mouse-jiggler", + data=SetMouseJigglerReq(enabled=enabled, mode=mode), + ) diff --git a/nanokvm/models.py b/nanokvm/models.py index af2ebcc..4881929 100644 --- a/nanokvm/models.py +++ b/nanokvm/models.py @@ -94,6 +94,13 @@ class HWVersion(StrEnum): UNKNOWN = "Unknown" +class MouseJigglerMode(StrEnum): + """Mouse Jiggler Modes.""" + + ABSOLUTE = "absolute" + RELATIVE = "relative" + + # Generic Response Wrapper class ApiResponse(BaseModel, Generic[T]): """Generic API response structure.""" @@ -199,8 +206,12 @@ class GetSSHStateRsp(BaseModel): enabled: bool -class GetSwapStateRsp(BaseModel): - enabled: bool | None = None +class GetSwapSizeRsp(BaseModel): + size: int + + +class SetSwapSizeReq(BaseModel): + size: int class GetMdnsStateRsp(BaseModel): @@ -296,3 +307,17 @@ class StatusImageRsp(BaseModel): class DownloadImageReq(BaseModel): file: str # URL of the image to download # cdrom field is ignored for downloads + + +class SetMouseJigglerReq(BaseModel): + enabled: bool + mode: MouseJigglerMode + + +class GetMouseJigglerRsp(BaseModel): + enabled: bool + mode: MouseJigglerMode + + +class GetHdmiStateRsp(BaseModel): + enabled: bool