API/show_block_devices: add option for remote devices

This commit is contained in:
Johannes Kirschbauer
2024-08-16 12:17:52 +02:00
parent b29f649343
commit 340babd348
2 changed files with 34 additions and 5 deletions

View File

@@ -90,6 +90,7 @@ def get_directory(current_path: str) -> Directory:
@dataclass @dataclass
class BlkInfo: class BlkInfo:
name: str name: str
id_link: str
path: str path: str
rm: str rm: str
size: str size: str
@@ -111,19 +112,47 @@ def blk_from_dict(data: dict) -> BlkInfo:
size=data["size"], size=data["size"],
ro=data["ro"], ro=data["ro"],
mountpoints=data["mountpoints"], mountpoints=data["mountpoints"],
type_=data["type"], # renamed here type_=data["type"], # renamed
id_link=data["id-link"], # renamed
) )
@dataclass
class BlockDeviceOptions:
hostname: str | None = None
keyfile: str | None = None
@API.register @API.register
def show_block_devices() -> Blockdevices: def show_block_devices(options: BlockDeviceOptions) -> Blockdevices:
""" """
Abstract api method to show block devices. Abstract api method to show block devices.
It must return a list of block devices. It must return a list of block devices.
""" """
keyfile = options.keyfile
remote = (
[
"ssh",
*(["-i", f"{keyfile}"] if keyfile else []),
# Disable strict host key checking
"-o StrictHostKeyChecking=no",
# Disable known hosts file
"-o UserKnownHostsFile=/dev/null",
f"{options.hostname}",
]
if options.hostname
else []
)
cmd = nix_shell( cmd = nix_shell(
["nixpkgs#util-linux"], ["nixpkgs#util-linux", *(["nixpkgs#openssh"] if options.hostname else [])],
["lsblk", "--json", "--output", "PATH,NAME,RM,SIZE,RO,MOUNTPOINTS,TYPE"], [
*remote,
"lsblk",
"--json",
"--output",
"PATH,NAME,RM,SIZE,RO,MOUNTPOINTS,TYPE,ID-LINK",
],
) )
proc = run_no_stdout(cmd) proc = run_no_stdout(cmd)
res = proc.stdout.strip() res = proc.stdout.strip()

View File

@@ -83,7 +83,7 @@ export const Flash = () => {
const deviceQuery = createQuery(() => ({ const deviceQuery = createQuery(() => ({
queryKey: ["block_devices"], queryKey: ["block_devices"],
queryFn: async () => { queryFn: async () => {
const result = await callApi("show_block_devices", {}); const result = await callApi("show_block_devices", { options: {} });
if (result.status === "error") throw new Error("Failed to fetch data"); if (result.status === "error") throw new Error("Failed to fetch data");
return result.data; return result.data;
}, },