Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 52 additions & 6 deletions nanokvm/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,15 +26,17 @@
GetCdRomRsp,
GetGpioRsp,
GetHardwareRsp,
GetHdmiStateRsp,
GetHidModeRsp,
GetInfoRsp,
GetMdnsStateRsp,
GetMemoryLimitRsp,
GetMountedImageRsp,
GetMouseJigglerRsp,
GetOLEDRsp,
GetPreviewRsp,
GetSSHStateRsp,
GetSwapStateRsp,
GetSwapSizeRsp,
GetTailscaleStatusRsp,
GetVersionRsp,
GetVirtualDeviceRsp,
Expand All @@ -46,12 +48,15 @@
LoginReq,
LoginRsp,
MountImageReq,
MouseJigglerMode,
PasteReq,
SetGpioReq,
SetHidModeReq,
SetMemoryLimitReq,
SetMouseJigglerReq,
SetOledReq,
SetPreviewReq,
SetSwapSizeReq,
StatusImageRsp,
UpdateVirtualDeviceReq,
UpdateVirtualDeviceRsp,
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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")
Expand Down Expand Up @@ -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),
)
29 changes: 27 additions & 2 deletions nanokvm/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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."""
Expand Down Expand Up @@ -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):
Expand Down Expand Up @@ -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
Loading