From 42e3fea9e5d6d0b14c7af1f488f7dc703fe77205 Mon Sep 17 00:00:00 2001 From: pinpox Date: Mon, 13 Oct 2025 12:38:50 +0200 Subject: [PATCH] clanServices: add desktop module --- clanServices/kde/README.md | 28 +++++++++++++++++ clanServices/kde/default.nix | 18 +++++++++++ clanServices/kde/flake-module.nix | 24 +++++++++++++++ clanServices/kde/tests/vm/default.nix | 30 +++++++++++++++++++ .../kde/tests/vm/sops/users/admin/key.json | 4 +++ .../client/state-version/version/value | 1 + docs/mkdocs.yml | 1 + .../distributed-service/service-module.nix | 11 +++---- pkgs/clan-cli/clan_lib/services/modules.py | 1 + 9 files changed, 113 insertions(+), 5 deletions(-) create mode 100644 clanServices/kde/README.md create mode 100644 clanServices/kde/default.nix create mode 100644 clanServices/kde/flake-module.nix create mode 100644 clanServices/kde/tests/vm/default.nix create mode 100644 clanServices/kde/tests/vm/sops/users/admin/key.json create mode 100644 clanServices/kde/tests/vm/vars/per-machine/client/state-version/version/value diff --git a/clanServices/kde/README.md b/clanServices/kde/README.md new file mode 100644 index 000000000..ea45b6d78 --- /dev/null +++ b/clanServices/kde/README.md @@ -0,0 +1,28 @@ +This module sets up the [KDE Plasma](https://kde.org) Desktop environment. + +!!! Note "Customisation" + This service intentionally does not provide any settings or customisation + options, as desktop preferences are highly subjective. Clan currently + supports only this default desktop configuration. Any additional + customisation can be done via the `extraModules` option. Furthermore, if you + want to use a different desktop environment or compositor (e.g. Gnome or + sway), we encourage you to to build your own + [Clan Service](https://docs.clan.lol/guides/services/community/) or have a + look at the [Community Services](https://docs.clan.lol/services/community/). + +## Example Usage + +```nix +inventory = { + instances = { + kde = { + + # Deploy on all machines + roles.default.tags.all = { }; + + # Or individual hosts + roles.default.machines.laptop = { }; + }; + }; +}; +``` diff --git a/clanServices/kde/default.nix b/clanServices/kde/default.nix new file mode 100644 index 000000000..e27cb600f --- /dev/null +++ b/clanServices/kde/default.nix @@ -0,0 +1,18 @@ +{ ... }: +{ + _class = "clan.service"; + manifest.name = "clan-core/kde"; + manifest.description = "Sets up a graphical desktop environment"; + manifest.categories = [ "Desktop" ]; + + roles.default = { + description = "KDE/Plasma (wayland): Full-featured desktop environment with modern Qt-based interface"; + perInstance.nixosModule = { + services = { + displayManager.sddm.enable = true; + displayManager.sddm.wayland.enable = true; + desktopManager.plasma6.enable = true; + }; + }; + }; +} diff --git a/clanServices/kde/flake-module.nix b/clanServices/kde/flake-module.nix new file mode 100644 index 000000000..ef4e9191d --- /dev/null +++ b/clanServices/kde/flake-module.nix @@ -0,0 +1,24 @@ +{ + self, + lib, + ... +}: +let + module = lib.modules.importApply ./default.nix { + inherit (self) packages; + }; +in +{ + clan.modules = { + kde = module; + }; + perSystem = + { ... }: + { + clan.nixosTests.kde = { + imports = [ ./tests/vm/default.nix ]; + + clan.modules.kde = module; + }; + }; +} diff --git a/clanServices/kde/tests/vm/default.nix b/clanServices/kde/tests/vm/default.nix new file mode 100644 index 000000000..c5ed96994 --- /dev/null +++ b/clanServices/kde/tests/vm/default.nix @@ -0,0 +1,30 @@ +{ + name = "kde"; + + clan = { + directory = ./.; + inventory = { + + machines.client = { }; + + instances = { + kde = { + module.name = "kde"; + module.input = "self"; + roles.default.machines."client" = { }; + }; + }; + }; + }; + + testScript = '' + start_all() + + client.systemctl("start network-online.target") + client.wait_for_unit("network-online.target") + + client.wait_for_unit("graphical.target") + client.wait_for_unit("display-manager.service") + client.succeed("systemctl status display-manager.service") + ''; +} diff --git a/clanServices/kde/tests/vm/sops/users/admin/key.json b/clanServices/kde/tests/vm/sops/users/admin/key.json new file mode 100644 index 000000000..e408aa96b --- /dev/null +++ b/clanServices/kde/tests/vm/sops/users/admin/key.json @@ -0,0 +1,4 @@ +{ + "publickey": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg", + "type": "age" +} diff --git a/clanServices/kde/tests/vm/vars/per-machine/client/state-version/version/value b/clanServices/kde/tests/vm/vars/per-machine/client/state-version/version/value new file mode 100644 index 000000000..115ab7a6a --- /dev/null +++ b/clanServices/kde/tests/vm/vars/per-machine/client/state-version/version/value @@ -0,0 +1 @@ +25.11 \ No newline at end of file diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index a2b0be602..380a5d63d 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -165,6 +165,7 @@ nav: - services/official/garage.md - services/official/hello-world.md - services/official/importer.md + - services/official/kde.md - services/official/localbackup.md - services/official/matrix-synapse.md - services/official/mycelium.md diff --git a/lib/modules/inventory/distributed-service/service-module.nix b/lib/modules/inventory/distributed-service/service-module.nix index b578b976b..77db7d53f 100644 --- a/lib/modules/inventory/distributed-service/service-module.nix +++ b/lib/modules/inventory/distributed-service/service-module.nix @@ -294,21 +294,22 @@ in ''; type = types.listOf ( types.enum [ - "AudioVideo" "Audio" - "Video" + "AudioVideo" + "Desktop" "Development" "Education" "Game" "Graphics" - "Social" "Network" "Office" "Science" - "System" "Settings" - "Utility" + "Social" + "System" "Uncategorized" + "Utility" + "Video" ] ); }; diff --git a/pkgs/clan-cli/clan_lib/services/modules.py b/pkgs/clan-cli/clan_lib/services/modules.py index 3f002a1c4..8869b5a10 100644 --- a/pkgs/clan-cli/clan_lib/services/modules.py +++ b/pkgs/clan-cli/clan_lib/services/modules.py @@ -39,6 +39,7 @@ class ModuleManifest: "Audio": {"color": "#CFCFC4", "description": "Audio"}, "Video": {"color": "#FFD1DC", "description": "Video"}, "Development": {"color": "#F49AC2", "description": "Development"}, + "Desktop": {"color": "#F4eeaa", "description": "Desktop Environment"}, "Education": {"color": "#B39EB5", "description": "Education"}, "Game": {"color": "#FFB347", "description": "Game"}, "Graphics": {"color": "#FF6961", "description": "Graphics"},