45 lines
1.4 KiB
Python
45 lines
1.4 KiB
Python
import json
|
|
from dataclasses import dataclass, field
|
|
|
|
from clan_lib.api import API
|
|
from clan_lib.ssh.localhost import LocalHost
|
|
from clan_lib.ssh.remote import Remote
|
|
|
|
|
|
@dataclass(order=True, frozen=True)
|
|
class MachineGeneration:
|
|
generation: int
|
|
date: str
|
|
nixos_version: str
|
|
kernel_version: str
|
|
configuration_revision: str
|
|
specialisations: list[str] = field(default_factory=list)
|
|
current: bool = False
|
|
|
|
|
|
@API.register
|
|
def get_machine_generations(target_host: Remote | LocalHost) -> list[MachineGeneration]:
|
|
"""Get the nix generations installed on the target host and compare them with the machine."""
|
|
with target_host.host_connection() as target_host_conn:
|
|
cmd = [
|
|
"nixos-rebuild",
|
|
"list-generations",
|
|
"--json",
|
|
]
|
|
res = target_host_conn.run(cmd)
|
|
|
|
data = json.loads(res.stdout.strip())
|
|
sorted_data = sorted(data, key=lambda gen: gen.get("generation", 0))
|
|
return [
|
|
MachineGeneration(
|
|
generation=gen.get("generation"),
|
|
date=gen.get("date"),
|
|
nixos_version=gen.get("nixosVersion", ""),
|
|
kernel_version=gen.get("kernelVersion", ""),
|
|
configuration_revision=gen.get("configurationRevision", ""),
|
|
specialisations=gen.get("specialisations", []),
|
|
current=gen.get("current", False),
|
|
)
|
|
for gen in sorted_data
|
|
]
|