clanModules/state-version: init state-version

This adds a clanModule that will initialize the `system.stateVersion`
upon deploying the machine for the first time.

If the machine is completely reinstalled, then the state version might be
regenerated. But care should be taken if rebuilding from backups.
This commit is contained in:
a-kenji
2024-09-11 12:14:52 +02:00
parent 7c7a8f40e4
commit 66c0517dfe
6 changed files with 62 additions and 11 deletions

View File

@@ -21,6 +21,7 @@
postgresql = ./postgresql;
root-password = ./root-password;
single-disk = ./single-disk;
state-version = ./state-version;
sshd = ./sshd;
static-hosts = ./static-hosts;
sunshine = ./sunshine;

View File

@@ -0,0 +1,7 @@
---
description = "Automatically generate the state version of the nixos installation."
---
This module generates the `system.stateVersion` of the nixos installation automatically.
Options: [system.stateVersion](https://search.nixos.org/options?channel=unstable&show=system.stateVersion&from=0&size=50&sort=relevance&type=packages&query=stateVersion)

View File

@@ -1,7 +1,14 @@
{ config, lib, ... }:
let
var = config.clan.core.vars.generators.state-version.files.version or { };
in
{
system.stateVersion = config.clan.core.vars.generators.state-version.files.version.value;
config = lib.mkMerge [
(lib.mkIf ((var.value or null) != null) {
system.stateVersion = lib.mkDefault (lib.removeSuffix "\n" var.value);
})
{
clan.core.vars.generators.state-version = {
files.version.secret = false;
runtimeInputs = [ ];
@@ -10,3 +17,5 @@
'';
};
}
];
}

View File

@@ -0,0 +1 @@
{ }

View File

@@ -60,24 +60,24 @@ nav:
- reference/clanModules/borgbackup.md
- reference/clanModules/deltachat.md
- reference/clanModules/dyndns.md
- reference/clanModules/nginx.md
- reference/clanModules/vaultwarden.md
- reference/clanModules/ergochat.md
- reference/clanModules/garage.md
- reference/clanModules/golem-provider.md
- reference/clanModules/heisenbridge.md
- reference/clanModules/index.md
- reference/clanModules/iwd.md
- reference/clanModules/localbackup.md
- reference/clanModules/localsend.md
- reference/clanModules/matrix-synapse.md
- reference/clanModules/heisenbridge.md
- reference/clanModules/moonlight.md
- reference/clanModules/mumble.md
- reference/clanModules/nginx.md
- reference/clanModules/packages.md
- reference/clanModules/postgresql.md
- reference/clanModules/root-password.md
- reference/clanModules/single-disk.md
- reference/clanModules/sshd.md
- reference/clanModules/state-version.md
- reference/clanModules/static-hosts.md
- reference/clanModules/sunshine.md
- reference/clanModules/syncthing-static-peers.md
@@ -85,6 +85,7 @@ nav:
- reference/clanModules/thelounge.md
- reference/clanModules/trusted-nix-caches.md
- reference/clanModules/user-password.md
- reference/clanModules/vaultwarden.md
- reference/clanModules/xfce.md
- reference/clanModules/zerotier-static-peers.md
- reference/clanModules/zt-tcp-relay.md

View File

@@ -218,6 +218,37 @@ class ServiceSingleDisk:
machines: dict[str, ServiceSingleDiskMachine] = field(default_factory = dict)
@dataclass
class StateVersionConfig:
pass
@dataclass
class ServiceStateVersionMachine:
config: StateVersionConfig = field(default_factory = StateVersionConfig)
imports: list[str] = field(default_factory = list)
@dataclass
class ServiceStateVersionRoleDefault:
config: StateVersionConfig = field(default_factory = StateVersionConfig)
imports: list[str] = field(default_factory = list)
machines: list[str] = field(default_factory = list)
tags: list[str] = field(default_factory = list)
@dataclass
class ServiceStateVersionRole:
default: ServiceStateVersionRoleDefault
@dataclass
class ServiceStateVersion:
meta: ServiceMeta
roles: ServiceStateVersionRole
config: StateVersionConfig = field(default_factory = StateVersionConfig)
machines: dict[str, ServiceStateVersionMachine] = field(default_factory = dict)
@dataclass
class Service:
admin: dict[str, ServiceAdmin] = field(default_factory = dict)
@@ -225,6 +256,7 @@ class Service:
iwd: dict[str, ServiceIwd] = field(default_factory = dict)
packages: dict[str, ServicePackage] = field(default_factory = dict)
single_disk: dict[str, ServiceSingleDisk] = field(default_factory = dict, metadata = {"alias": "single-disk"})
state_version: dict[str, ServiceStateVersion] = field(default_factory = dict, metadata = {"alias": "state-version"})
@dataclass