Compare commits

...

457 Commits

Author SHA1 Message Date
Jörg Thalheim
34cc793af2 fix nix flake cache with chroot stores
The flake cache was not properly checking store paths when custom stores
were used (e.g., when using --store flag or CLAN_TEST_STORE). This
caused cache validation to fail even when the store paths existed.

This fix:
- Updates store path detection to properly identify any path with
  "/store/" in it and a proper nix store item format (hash-name)
- Normalizes store paths to use the current store when checking
  if they exist (CLAN_TEST_STORE or nix config)
- Uses CLAN_TEST_STORE environment variable for test stores, which
  matches how nix --store flag works

Added comprehensive tests to verify the fix works with custom stores.
2025-06-17 15:35:37 +02:00
kenji
c303ed8347 Merge pull request 'agit: Set COMMIT_EDITMSG as filetype' (#3991) from kenji/agit: Set COMMIT_EDITMSG as filetype into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3991
2025-06-17 12:02:03 +00:00
Mic92
2af619609a Merge pull request 'install: correctly pass nix options to nixos-anywhere' (#3989) from nixos-anywhere-options into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3989
2025-06-17 11:49:13 +00:00
kenji
6ab082d080 Merge pull request 'agit: Add -a flag alias for --auto' (#3992) from kenji/agit: Add -a flag alias for --auto into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3992
2025-06-17 11:44:04 +00:00
a-kenji
02f362df92 agit: Add -a flag alias for --auto 2025-06-17 12:45:37 +02:00
Jörg Thalheim
7ce65f429c install: correctly pass nix options to nixos-anywhere
The nix_options were collected but never passed to the nixos-anywhere command.
This fix adds the options to the command before the target host argument.
2025-06-17 12:43:20 +02:00
a-kenji
e6ed020423 agit: Set COMMIT_EDITMSG as filetype 2025-06-17 12:42:12 +02:00
kenji
4575251b7f Merge pull request 'clanServices: Enable garage by default' (#3987) from kenji/clanServices: Enable garge by default into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3987
2025-06-17 10:33:26 +00:00
Mic92
79f1bed800 Merge pull request 'make setupNixInNixPython a python package' (#3984) from setupNixInNixPython-only into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3984
2025-06-17 10:14:53 +00:00
kenji
212a02a202 Merge pull request 'pyproject: Fix typo' (#3963) from kenji/pyproject: Fix typo into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3963
2025-06-17 10:08:53 +00:00
a-kenji
55db78fbde clanServices/garage: Enable garage by default 2025-06-17 12:06:41 +02:00
kenji
19eed0cff5 Merge pull request 'agit: Add documentation to EDIT_MSG and strip comments' (#3986) from kenji/agit: Add documentation to EDIT_MSG and strip comments into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3986
2025-06-17 10:01:29 +00:00
Jörg Thalheim
0fb326b2f3 Apply nix fmt on setupNixInNixPython-only 2025-06-17 12:01:12 +02:00
a-kenji
f92cc19647 agit: Add documentation to EDIT_MSG and strip comments
Add documentation to EDIT_MSG and strip comments
2025-06-17 11:48:12 +02:00
kenji
47cf00df60 Merge pull request 'agit: Allow specifying commit information through the editor' (#3982) from kenji/agit: Allow specifying commit information through the editor into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3982
2025-06-17 09:27:39 +00:00
a-kenji
3ada326fde agit: Allow specifying through EDITOR 2025-06-17 11:00:03 +02:00
renovate[bot]
30dfe1656f chore(deps): update sops-nix digest to 77c423a 2025-06-17 00:20:11 +00:00
a-kenji
80ad10b8e5 pkgs/*: Remove pytest coverage testing from every single test run
There was no noticeable positive impact from having coverage reports on
every single test run.

While adding a separate command to check coverage might be added in the
future, the overhead of collecting the coverage for every test run made
seems not worth it currently.
2025-06-16 15:46:36 +00:00
pinpox
1132185b7d Merge pull request 'Migrate state-version to clanServices' (#3947) from migrate-state-version into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3947
2025-06-16 13:29:20 +00:00
pinpox
c9433a7784 Merge pull request 'Migrate packages module to clanServices' (#3945) from migrate-packages into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3945
2025-06-16 10:36:56 +00:00
pinpox
d1d15c34b7 add docs 2025-06-16 12:22:25 +02:00
pinpox
3b0fb23082 Migrate packages module to clanServices 2025-06-16 12:22:24 +02:00
kenji
003c128482 Merge pull request 'zerotier: Add a default to the allowedIps controller setting' (#3959) from kenji/zerotier: Add a default to the allowedIps controller setting into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3959
2025-06-16 10:07:11 +00:00
pinpox
13b987d3c4 migrate state-version 2025-06-16 11:28:35 +02:00
pinpox
482fee1ff2 Merge pull request 'Migrate trusted-nix-caches to clanServices' (#3949) from migrate-nix-caches into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3949
2025-06-16 09:03:08 +00:00
renovate[bot]
f3fccb1d9c chore(deps): update disko digest to 7f1857b 2025-06-16 02:50:14 +00:00
Michael Hoang
9bd1ce9a6f Merge pull request 'clanServices/emergency-access: use more descriptive instance name' (#3974) from push-nmlzqzptwsmv into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3974
2025-06-15 06:39:54 +00:00
Michael Hoang
8a7120b3da clanServices/emergency-access: use more descriptive instance name 2025-06-15 13:27:40 +07:00
hsjobeki
f0e3b753dc Merge pull request 'Feat(machine/templates): simplify template args for machines command' (#3937) from hsjobeki/template-ux into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3937
2025-06-14 08:25:28 +00:00
hsjobeki
6501b50058 Merge pull request 'Docs(cli/flash): improve disk instructions' (#3958) from hsjobeki/ux into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3958
2025-06-14 08:13:50 +00:00
renovate[bot]
9af3cc88bf chore(deps): update nix-darwin digest to 2f140d6 2025-06-14 05:00:12 +00:00
renovate[bot]
2820adb07a chore(deps): update data-mesher digest to b7cc9ee 2025-06-13 18:00:12 +00:00
kenji
69dfee3316 Merge pull request 'clanServices/zerotier: Add eval tests' (#3968) from kenji/clanServices/zerotier: Add eval tests into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3968
2025-06-13 13:21:20 +00:00
a-kenji
96325c0c29 clanServices/zerotier: Add eval tests
Add eval tests to the zerotier clanService module.

The vm module is a stub that acts as an api for the `generate-test-vars`
script, as that currently only works with a vm, not with an eval test.

This checks, if all the peers pick up their respective configuration
correctly. Without running the service itself.
2025-06-13 14:58:27 +02:00
kenji
626c80f029 Merge pull request 'emergency-access: Don't deploy plaintext passwords' (#3966) from kenji/emergency-access: Don't deploy plaintext passwords into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3966
Reviewed-by: Michael Hoang <enzime@noreply.git.clan.lol>
2025-06-13 11:50:00 +00:00
kenji
3c81b6073d Merge pull request 'emergency-access: Use default instead of mylounge instance name' (#3965) from kenji/emergency-access: Use default instead of mylounge instance name into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3965
2025-06-13 11:49:47 +00:00
a-kenji
30f1d1e6da emergency-access: Don't deploy plaintext passwords
Don't deploy the plaintext emergency password to the target machine.
It doesn't seem to be used anywhere.
2025-06-13 13:30:59 +02:00
a-kenji
34a0e077ee emergency-access: Use default instead of mylounge instance name
The mylounge instance name seems confusing.
2025-06-13 13:26:19 +02:00
kenji
edb156a387 Merge pull request 'checks: Remove the syncthing check again' (#3964) from kenji/checks: Remove the syncthing check again into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3964
2025-06-13 11:23:18 +00:00
a-kenji
c2f20c0ff0 checks: Remove the syncthing check again
Someone readded it for some unknown reason.
2025-06-13 13:08:29 +02:00
a-kenji
333a06456e pyproject: Fix typo 2025-06-13 13:05:21 +02:00
Luis Hebendanz
48a91d2017 Merge pull request 'clan-app: Propagate op_key to callApi callers.' (#3961) from Qubasa/clan-core:ui_get_op_key into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3961
2025-06-13 10:55:23 +00:00
Qubasa
8e79f78ef2 clan-app: Propagate op_key to callApi callers. 2025-06-13 12:41:58 +02:00
a-kenji
858b34769e zerotier: Add a default to the allowedIps controller setting 2025-06-13 11:48:58 +02:00
Johannes Kirschbauer
8b72d569e7 Docs(cli/flash): improve disk instructions 2025-06-13 11:37:39 +02:00
Michael Hoang
eabf7f86fc Merge pull request 'cli: don't error when more than one SOPS key found locally' (#3946) from push-tmsrnssnwrvn into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3946
Reviewed-by: brianmcgee <brian@bmcgee.ie>
2025-06-13 08:00:37 +00:00
pinpox
f1a0114739 Merge pull request 'emergency-access: init service' (#3950) from emergency-access into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3950
Reviewed-by: pinpox <clan@pablo.tools>
2025-06-13 07:45:05 +00:00
Michael Hoang
6b4df65412 cli: don't error when more than one SOPS key found locally 2025-06-13 14:37:19 +07:00
Michael Hoang
fc13e0be51 emergency-access: init service 2025-06-13 14:21:01 +07:00
Michael Hoang
41822097c7 Merge pull request 'cli: fix secrets key update failing when used with Nix in Nix' (#3956) from push-kzwtmtqokywm into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3956
2025-06-13 06:49:32 +00:00
Michael Hoang
362a889d0f cli: fix secrets key update failing when used with Nix in Nix 2025-06-13 13:36:29 +07:00
renovate[bot]
b16dc0a58f chore(deps): update nix-darwin digest to 72c88d5 2025-06-12 16:00:14 +00:00
brianmcgee
3239d4b614 Merge pull request 'UI: new Loader component; Button and Icon v2' (#3908) from ui/button into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3908
2025-06-12 15:52:17 +00:00
Luis Hebendanz
02a4c49952 Merge pull request 'init machine from inventory' (#3862) from Qubasa/clan-core:refactor_machinev2 into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3862
2025-06-12 15:05:44 +00:00
Qubasa
85537b7816 clan-lib: unify get_taget_host and get_build_host 2025-06-12 16:42:28 +02:00
Qubasa
e1091c0692 clan-cli: machine.get_inv_machine now uses actions.get_machine in the background 2025-06-12 16:36:55 +02:00
Qubasa
82299a5361 clan-cli: Fix check_machine_online to use Remote object instead of machine, this makes it possible to override HostKeyCheck properly 2025-06-12 16:36:55 +02:00
Qubasa
2540215f2e clan-cli: init machine from inventory 2025-06-12 16:36:55 +02:00
Luis Hebendanz
33be415922 Merge pull request 'clan-lib: Add log_manager api, clan-app: Fix API test page' (#3943) from Qubasa/clan-core:ui_log_collection2 into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3943
2025-06-12 14:35:15 +00:00
Qubasa
e6025493c4 clan-lib: Add LogManager class 2025-06-12 16:24:40 +02:00
Qubasa
726b8f4c6c clan-lib: Move task functions to own file 2025-06-12 16:23:53 +02:00
Qubasa
42ac12b34e clan-app: Fix api test page 2025-06-12 16:23:33 +02:00
lassulus
184f16d6f1 Merge pull request 'generate_test_vars: add support for darwin' (#3952) from lassulus/clanTest_darwin into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3952
2025-06-12 13:58:30 +00:00
lassulus
a267cc2f69 generate_test_vars: add support for darwin 2025-06-12 14:49:12 +02:00
pinpox
5a50463fb7 migrate trusted-nix-caches 2025-06-12 14:01:51 +02:00
Brian McGee
8f93015d80 feat(ui): new loader component; button and icon v2 2025-06-12 11:29:41 +01:00
renovate[bot]
e1df99ea31 chore(deps): update nix-darwin digest to e2da333 2025-06-12 08:10:12 +00:00
pinpox
3e94b75ada Merge pull request 'Migrate user-password and root-password to clan Services' (#3918) from migrate-user-password into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3918
Reviewed-by: lassulus <clanlol@lassul.us>
2025-06-12 08:08:36 +00:00
pinpox
db5e23e701 migrate clanmodules/{user,root}-password to clanServices/users
Move the functionality of both modules into a new clanService.
root-password was previously just a special case of user-password. This
migrates it into a deduplicated clan service and adds checks
2025-06-12 09:04:26 +02:00
Johannes Kirschbauer
0b6c30e8ad Fix(morph): ensure machine dir exists 2025-06-11 20:38:15 +02:00
Johannes Kirschbauer
8c02119ac0 fix(templates): add error handling 2025-06-11 20:22:20 +02:00
Johannes Kirschbauer
70bc7d3f0c feat(templates_urls): short circuit input names 2025-06-11 20:21:29 +02:00
Johannes Kirschbauer
2d2af10c78 feat(flake): add function to get input names 2025-06-11 20:21:29 +02:00
Johannes Kirschbauer
0e88b0ff66 feat(flake/select): add apply argument 2025-06-11 20:21:29 +02:00
pinpox
27998d777a Merge pull request 'Migrate sshd to clanServices' (#3912) from migrate-sshd into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3912
Reviewed-by: kenji <aks.kenji@protonmail.com>
2025-06-11 16:29:43 +00:00
Johannes Kirschbauer
acc41be9b3 doc(cli/templates): improve help description 2025-06-11 17:00:10 +02:00
Johannes Kirschbauer
e80a3fd2fc fix(tess/morph): skip creating existing machine 2025-06-11 17:00:10 +02:00
Johannes Kirschbauer
b6a0c6cb38 Docs(cli/machines): improve description of '--template' 2025-06-11 17:00:10 +02:00
Johannes Kirschbauer
b80395af44 Chore(machine/templates): simplify template args for machines command 2025-06-11 17:00:08 +02:00
Johannes Kirschbauer
43bc5f0812 Feat(template_url): substitute local refs
To execute the CLI in foreign directories
.#new-machine needs to get tranformed into /path/to/clan#new-machine
Otherwise it might pick-up some random flake that is in scope where the cli started executing
2025-06-11 16:59:32 +02:00
Johannes Kirschbauer
a9c933ac01 Feat(templates): init with_machine_template context handler 2025-06-11 16:52:52 +02:00
Johannes Kirschbauer
4a126fee12 Feat(templates): export clan templates statically 2025-06-11 16:52:52 +02:00
Johannes Kirschbauer
d166f73c00 Feat(templates): add template selector tranformation 2025-06-11 16:52:50 +02:00
pinpox
e4bb9e1958 Migrate sshd to clanServices
- migrate service
- add deprecation notice to old module
- add check
- update docs
2025-06-11 15:43:51 +02:00
lassulus
be0a5202e7 Merge pull request 'bugfix for persistent loginctl sessions' (#3903) from pr-3886 into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3903
2025-06-11 13:15:04 +00:00
kenji
3fee93811a Merge pull request 'pkgs/distro-packages: Remove the distro packages' (#3941) from kenji/pkgs/distro-packages: Remove the distro packages into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3941
Reviewed-by: lassulus <clanlol@lassul.us>
2025-06-11 13:00:44 +00:00
DavHau
c624119ad0 Merge pull request 'dummy-test: add vars' (#3940) from davhau/test into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3940
2025-06-11 12:55:41 +00:00
lassulus
35a7bbf5d8 clan-cli: reduce ssh controlmaster timeout to 1min 2025-06-11 14:39:50 +02:00
adeci
31f79abb53 bugfix for persistent loginctl sessions 2025-06-11 14:38:37 +02:00
DavHau
559baa56a8 dummy-test: add vars 2025-06-11 19:30:13 +07:00
DavHau
b13f64c96d clan tests: allow testing CLI interactions
This is an improvement of the clanTest nixos vm test module.

The module now has a new option clan.test.fromFlake that allows to specify a flake.nix as the source for the test clan instead of specifying clan.XXX options.

This in turn allows accessing the `flake.nix` inside the test driver allowing to use the clan cli on it
2025-06-11 19:30:13 +07:00
kenji
90746e0a19 Merge pull request 'borgbackup: Move tests close to service' (#3939) from kenji/borgbackup: Move tests close to service into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3939
2025-06-11 12:05:50 +00:00
a-kenji
a64f68f37a pkgs/distro-packages: Remove the distro packages
Remove the distro packages for now.
They can be added back, if we actually need them again.
2025-06-11 13:54:13 +02:00
a-kenji
a5d15d7832 borgbackup: Move tests close to service 2025-06-11 13:47:29 +02:00
kenji
f86816ec1e Merge pull request 'agit: init agit helper' (#3938) from kenji/agit: init agit helper into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3938
2025-06-11 10:39:48 +00:00
a-kenji
de5306e16d agit: init agit helper
This initializes a very simple AGit helper script.

Usage:

```
agit create
```
or
```
agit c
```

To create a new AGit Pr.

Integrate Pulling from an AGit remote.
Gitea doesn't expose an AGit endpoint in the api, or the `tea` cli.
This makes pulling not feasible, since there is no robust way to query
the AGit topic, which is the ref that need to be pulled.

One possible solution currently could be scraping the gitea instructions
for forking a pull request on an AGit PR.
2025-06-11 12:26:19 +02:00
renovate[bot]
0e6f8766f7 chore(deps): update sops-nix digest to 50754df 2025-06-10 22:10:12 +00:00
hsjobeki
1414c8e519 Merge pull request 'Chore(templates): move helper functions into a util file' (#3930) from hsjobeki/utils into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3930
2025-06-10 17:52:44 +00:00
hsjobeki
1b411fe8d3 Merge pull request 'Chore(complete_machines): simplify by using inventoryStore' (#3929) from hsjobeki/cleanups into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3929
2025-06-10 17:42:55 +00:00
Johannes Kirschbauer
8ca3dc36d7 Chore(templates): move helper functions into a util file 2025-06-10 19:38:10 +02:00
Johannes Kirschbauer
17527082f4 chore(clanInternals): remove unused 'templates' attribute" 2025-06-10 19:26:04 +02:00
Johannes Kirschbauer
7b7e1cf246 feat(clanInternals): dont allow superfluous options 2025-06-10 19:16:26 +02:00
Johannes Kirschbauer
30fe01be7b Chore(complete_machines): simplify by using inventoryStore 2025-06-10 19:15:07 +02:00
Johannes Kirschbauer
b2785d3b24 Chore(flake.py): remove unused uncached_nix_eval_with_args 2025-06-10 19:15:07 +02:00
hsjobeki
40b8e87659 Merge pull request 'Chore(clanInternals): remove unused attributes' (#3925) from hsjobeki/clanInternals into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3925
2025-06-10 17:12:33 +00:00
Johannes Kirschbauer
b429aed8f4 Fix(tests/buildClan): reduce expected attributes 2025-06-10 19:00:57 +02:00
Johannes Kirschbauer
78563b0544 Fix(clan.nix): create public attributes from 'clan', dont expose them from clanInternals
ClanInternals is already exposed at the toplevel the API can access anything
This also deduplicated 'templates' and 'modules' into 'clan.modules' and 'clan.templates' repsectively
Only this one path is its source
2025-06-10 18:51:42 +02:00
Johannes Kirschbauer
e322c92b2e Chore(clanInternals): remove unused attributes 2025-06-10 18:27:16 +02:00
hsjobeki
0f6731c813 Merge pull request 'Refactor(clanInternals): remove depending on clanInternals.inventory' (#3928) from hsjobeki/no-more-inventory into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3928
2025-06-10 16:00:50 +00:00
Johannes Kirschbauer
0837a8ecd7 Refactor(clanInternals): remove depending on clanInternals.inventory 2025-06-10 17:43:59 +02:00
hsjobeki
b9d7dac65f Merge pull request 'Refactor(autocompletions): use inventoryStore' (#3927) from hsjobeki/completions into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3927
2025-06-10 15:39:56 +00:00
Johannes Kirschbauer
3562c17514 Refactor(autocompletions): use inventoryStore 2025-06-10 17:02:16 +02:00
Johannes Kirschbauer
6e5de97a30 Feat(inventoryStore): add get_raw to read all the values unsafe 2025-06-10 17:02:16 +02:00
hsjobeki
585e6b677a Merge pull request 'Chore(show_clan_meta): use data from inventoryStore' (#3926) from hsjobeki/show_clan_meta into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3926
2025-06-10 14:58:58 +00:00
Johannes Kirschbauer
0f36041054 Chore(show_clan_meta): use data from inventoryStore 2025-06-10 16:46:18 +02:00
hsjobeki
45ef48a245 Merge pull request 'Fix(tests/templates): add narHash to allow local tests execution in devShell' (#3922) from fix-tests into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3922
2025-06-10 13:50:34 +00:00
Johannes Kirschbauer
55a92f1893 Fix(tests/substitutions): use different substitutions for nix-build and local environment 2025-06-10 15:34:56 +02:00
Johannes Kirschbauer
de32037255 Fix(tests/templates): add narHash to allow local tests execution in devShell 2025-06-10 12:36:58 +02:00
kenji
a4900faf27 Merge pull request 'user-password: Improve prompting documentation' (#3920) from ke-prompt into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3920
2025-06-10 09:48:16 +00:00
a-kenji
961e650a85 user-password: Improve prompting documentation 2025-06-10 11:04:22 +02:00
kenji
c3a9cccdd8 Merge pull request 'checks: Disable syncthing test for now' (#3919) from ke-disable-syncthing into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3919
2025-06-10 09:00:19 +00:00
a-kenji
992d5cbe46 checks: Disable syncthing test for now
Syncthing is currently being migrated and we can look at the test again
once we migrated.
It recently got changes upstream which might explain the spurious test
failures.
2025-06-10 10:46:28 +02:00
Michael Hoang
57a64c9a0b Merge pull request 'cli: fix clan secrets key update not working when age plugins defined' (#3916) from push-xrynsrlvulmu into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3916
2025-06-10 07:29:35 +00:00
Michael Hoang
11bc2c00c2 cli: fix clan secrets key update not working when age plugins defined 2025-06-10 14:07:10 +07:00
Michael Hoang
1b86f9efca Merge pull request 'vars: don't use sops.secrets.*.restartUnits on macOS' (#3917) from push-mtooonxozntq into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3917
2025-06-10 07:05:53 +00:00
Michael Hoang
213f12ce01 vars: don't expose restartUnits on macOS 2025-06-10 13:48:06 +07:00
Michael Hoang
49bec8536b vars: don't use sops.secrets.*.restartUnits on macOS 2025-06-10 13:27:15 +07:00
hsjobeki
9b5410a46d Merge pull request 'chore(api/create_clan): remove unused reponse class' (#3907) from api-narrowing into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3907
2025-06-09 19:00:27 +00:00
Johannes Kirschbauer
8360ee58b5 chore(flake): move 'inputs-from' into templates handling 2025-06-09 20:40:20 +02:00
Johannes Kirschbauer
03a2412227 chore(inspect): use simple list_machines 2025-06-09 20:33:17 +02:00
Johannes Kirschbauer
25875422f2 chore(api/create_clan): remove unused reponse class 2025-06-09 20:30:20 +02:00
Luis Hebendanz
94f8e365f9 Merge pull request 'clan-cli: Use Remote class in DeployInfo, add tests for qrcode parser and json parser' (#3914) from Qubasa/clan-core:deploy_info2 into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3914
Reviewed-by: hsjobeki <hsjobeki@gmail.com>
2025-06-09 17:45:30 +00:00
Qubasa
65a0843de7 clan-cli: Use Remote class in DeployInfo, add tests for qrcode parser and json parser 2025-06-09 19:27:01 +02:00
Michael Hoang
bd402b99c9 Merge pull request 'testing: fix Nix in Nix when remote building' (#3911) from ninixx into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3911
2025-06-09 14:10:35 +00:00
Michael Hoang
f771168b76 testing: fix Nix in Nix when remote building 2025-06-09 20:58:08 +07:00
kenji
eb6880c5ec Merge pull request 'clanServices: Move service tests to appropriate locations' (#3909) from ke-move-service-checks-to-service into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3909
2025-06-09 13:26:31 +00:00
a-kenji
4670dbfd6a clanServices: Move ergochat test to appropriate location
Move the ergochat clanService test to the ergochat clan service.
The tests should live close to the definition of the service, so that
debugging and discoverability is better.
2025-06-09 15:05:40 +02:00
a-kenji
cd5743b56f clanServices: Move heisenbridge test to appropriate location
Move the heisenbridge clanService test to the heisenbridge clan service.
The tests should live close to the definition of the service, so that
debugging and discoverability is better.
2025-06-09 15:05:40 +02:00
a-kenji
b2bc845d88 clanServices: Move deltachat test to appropriate location
Move the deltachat clanService test to the deltachat clan service.
The tests should live close to the definition of the service, so that
debugging and discoverability is better.
2025-06-09 15:05:40 +02:00
DavHau
7cf065ae8c buildClan function: export all machines via nixosModules/darwinModules
We want each machine not only to be exposed via nixosConfigurations but also as a module.
This allows re-importing the machine in tests and override the architecture for example.
2025-06-09 12:51:22 +00:00
kenji
3a7fd3085e Merge pull request 'clanServices: Move mycelium test to appropriate location' (#3902) from ke-move-mycelium-check into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3902
2025-06-09 12:04:39 +00:00
hsjobeki
1af826e0df Merge pull request 'Refactor(api/update_machine): rename to set_machine; use name, flake' (#3899) from api-narrowing into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3899
2025-06-09 11:55:28 +00:00
Johannes Kirschbauer
665b2095b2 Refactor(cli/list_machines): rename to list_full_machines
This makes it clear that this should be used with care
It is potentially more expensive to create the full object, therefore it should be discouraged by its longer name
This listing is implemented based on the basic listing, where each item is turned into the bigger machine class
2025-06-09 13:40:57 +02:00
Johannes Kirschbauer
0b6bc81efe Refactor(api/list_machines): rename from list_inv_machines 2025-06-09 13:33:25 +02:00
Johannes Kirschbauer
155f3721eb refactor: cleanup unused imports
They are registered already if they are located as module in clan_lib
2025-06-09 13:33:25 +02:00
Johannes Kirschbauer
6a8604f2b8 refactor(clan_lib): move show_clan_meta to clan_lib 2025-06-09 13:33:25 +02:00
Johannes Kirschbauer
ea65ca448d refactor(clan_lib): move update to clan_lib.clan 2025-06-09 13:33:25 +02:00
Johannes Kirschbauer
ebf3964197 Refactor(api/update_machine): rename to set_machine; use name, flake 2025-06-09 13:33:19 +02:00
kenji
3f1b776a5b Merge pull request 'clanServices: Move admin test to appropriate location' (#3905) from ke-move-admin-check into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3905
2025-06-09 11:30:43 +00:00
a-kenji
5e4167e375 clanServices: Move mycelium test to appropriate location
Move the mycelium clanService test to the mycelium clan service.
The tests should live close to the definition of the service, so that
debugging and discoverability is better.
2025-06-09 13:17:36 +02:00
a-kenji
08618e6c66 clanServices: Move admin test to appropriate location
Move the admin clanService test to the admin clan service.
The tests should live close to the definition of the service, so that
debugging and discoverability is better.
2025-06-09 13:01:48 +02:00
kenji
977c57579d Merge pull request 'clanServices: Move garage test to appropriate location' (#3901) from ke-move-garage-check into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3901
2025-06-09 10:55:44 +00:00
kenji
af9b878ccf Merge pull request 'clanServices: Move localsend test to appropriate location' (#3900) from ke-move-localsend-check into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3900
2025-06-09 10:55:28 +00:00
a-kenji
508e8cf85e clanServices: Move localsend test to appropriate location
Move the localsend clanService test to the localsend clan service.
2025-06-09 12:38:39 +02:00
a-kenji
5fbe24bb53 clanServices: Move garage test to appropriate location #3900
Move the garage clanService test to the garage clan service.
2025-06-09 12:37:49 +02:00
lassulus
050d582230 Merge pull request 'revert #3883' (#3898) from lassulus/revert_qubasa into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3898
2025-06-09 09:58:09 +00:00
lassulus
2460ac970f Revert "clan-cli: Use Remote class in DeployInfo, add tests for qrcode parser and json parser"
This reverts commit 2ca3b5d698.
2025-06-09 11:28:15 +02:00
hsjobeki
2a576a604b Merge pull request 'Chore(api): narrow down get_machine' (#3863) from api-narrowing into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3863
2025-06-09 08:59:36 +00:00
DavHau
ae611e8fde lib: mkOfflineFlakeLock init
copied from the clan-core-flake module

I plan to re-use this function to improve the clan test framework to allow cli execution
2025-06-09 15:23:09 +07:00
DavHau
4616545cba build-clan: refactor: don't only use imports 2025-06-09 13:24:27 +07:00
renovate[bot]
e3bc6d14f4 chore(deps): update disko digest to dfa4d1b 2025-06-09 02:50:13 +00:00
renovate[bot]
2672adcbb5 chore(deps): update data-mesher digest to ae2b263 2025-06-09 00:20:24 +00:00
renovate[bot]
4e445448f0 chore(deps): lock file maintenance 2025-06-09 00:00:32 +00:00
renovate[bot]
edebb91a0b chore(deps): update flake-parts digest to 9305fe4 2025-06-08 17:10:20 +00:00
renovate[bot]
50aed8fe37 chore(deps): update data-mesher digest to 24b49db 2025-06-08 16:50:16 +00:00
Luis Hebendanz
7358a4c737 Merge pull request 'clan-cli: Use Remote class in DeployInfo, add tests for qrcode parser and json parser' (#3883) from Qubasa/clan-core:test_for_deploy_info into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3883
2025-06-06 23:02:45 +00:00
Qubasa
2ca3b5d698 clan-cli: Use Remote class in DeployInfo, add tests for qrcode parser and json parser 2025-06-07 00:51:24 +02:00
Luis Hebendanz
d38fc3cb35 Merge pull request 'fix the infoboxes not rendering correctly' (#3885) from RuboGubo/clan-core:main into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3885
2025-06-06 21:34:08 +00:00
RuboGubo
691f35739d fix the infoboxes not rendering correctly 2025-06-06 20:54:14 +01:00
Mic92
e5127ea4e6 Merge pull request 'cli: fix buildHost source upload destination' (#3884) from clan-core-update-2 into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3884
2025-06-06 13:06:54 +00:00
Jörg Thalheim
9fecd0cc47 cli: fix buildHost source upload destination
Sources were being uploaded to target host instead of build host,
causing nixos-rebuild to fail with "no such file or directory".
2025-06-06 14:51:12 +02:00
Mic92
5c0f192a77 Merge pull request 'facts: Add deprecation warning' (#3851) from kenji/clan-core:ke-deprecation-warning-facts into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3851
2025-06-06 12:09:52 +00:00
Mic92
37e855be76 Merge pull request 'Expose all clanServices/<subfolder>/flake-module.nix' (#3874) from auto-import-all-services into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3874
2025-06-06 12:09:40 +00:00
Mic92
341bdd5e8f Merge pull request 'Add a note about giving the Zerotier network a better name' (#3876) from jfly/clan-core:add-note-about-vpn-name into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3876
2025-06-06 12:09:11 +00:00
lassulus
c4bb842806 Merge pull request 'fix select escaping' (#3857) from lassulus/test into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3857
2025-06-06 10:58:14 +00:00
renovate[bot]
e46b0ef520 chore(deps): update disko digest to 6d06f63 2025-06-06 09:20:10 +00:00
renovate[bot]
8d66f5e9f9 chore(deps): update nix-darwin digest to 1934680 2025-06-06 08:30:19 +00:00
lassulus
795d722461 select: fix error message showing nonsense 2025-06-06 10:12:15 +02:00
lassulus
fe7c618ae5 select: fix non escaped ' 2025-06-06 10:12:15 +02:00
renovate[bot]
a7ab21ffa2 chore(deps): update data-mesher digest to 5e87f09 2025-06-06 08:00:24 +00:00
renovate[bot]
68d4fcfa43 chore(deps): update treefmt-nix digest to a05be41 2025-06-06 07:40:11 +00:00
pinpox
d92757ffa5 Merge branch 'main' into auto-import-all-services 2025-06-06 07:39:23 +00:00
renovate[bot]
1fc1f05d7f chore(deps): update nix-darwin digest to 9753a87 2025-06-06 07:00:14 +00:00
renovate[bot]
cf8e011b04 chore(deps): update disko digest to d74db62 2025-06-06 02:40:11 +00:00
Michael Hoang
9d96c3ab97 Merge pull request 'cli: don't generate a sops key that is world readable' (#3877) from push-ytvoytptyzrz into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3877
2025-06-06 02:30:48 +00:00
Michael Hoang
9479f33f6e cli: don't generate a sops key that is world readable
Fixes https://git.clan.lol/clan/clan-core/issues/3808
2025-06-06 12:15:19 +10:00
Jeremy Fleischman
afefac3ac1 Add a note about giving the Zerotier network a better name
It's *very* easy to miss the "default" in the following code snippet.

It's quite useful to have a non-"default" Zerotier network name, for
example, when configuring data-mesher, you need to specify the
`network.interface` setting.
2025-06-05 13:21:48 -07:00
pinpox
68d3712078 Expose all clanServices/<subfolder>/flake-module.nix 2025-06-05 20:28:55 +02:00
pinpox
4592eeb0b8 Merge pull request 'Expose importer module' (#3873) from expose-importer-service into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3873
2025-06-05 18:11:44 +00:00
pinpox
8642ee7b5f Expose importer module 2025-06-05 19:57:19 +02:00
kenji
3bdfd86fdf Merge pull request 'zerotier: Allow the controller to accept external Ips' (#3871) from kenji/clan-core:ke-zerotier-allow-external-ips into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3871
2025-06-05 16:53:46 +00:00
a-kenji
7b0ffe7e5c zerotier: Allow the controller to accept external Ips
Allow the controller to accept external zerotier Ips into the network
through declarative settings.

Closes:	#3787
2025-06-05 16:53:46 +00:00
pinpox
cd4e39151d Merge pull request 'clanServices/importer: fix manifest name' (#3872) from migrate-importer into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3872
2025-06-05 16:49:06 +00:00
pinpox
e376702816 fix manifest name 2025-06-05 18:37:15 +02:00
pinpox
21fb085454 Merge pull request 'Migrate Importer module' (#3854) from migrate-importer into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3854
Reviewed-by: Luis Hebendanz <consulting@qube.email>
2025-06-05 16:29:37 +00:00
pinpox
4b2102bd7f wait for mycelium port 2025-06-05 18:03:59 +02:00
pinpox
b2e8009889 Add readme for clanServices/importer 2025-06-05 17:49:22 +02:00
pinpox
1e6a21ec63 migrate importer module 2025-06-05 17:49:22 +02:00
Luis Hebendanz
750660ca9c Merge pull request 'clan_lib: Fix quoting issues' (#3870) from Qubasa/clan-core:fix_quoting_issues into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3870
2025-06-05 15:41:04 +00:00
kenji
4206c58dae Merge pull request 'Open port for localsend' (#3869) from localsend-open-fw into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3869
Reviewed-by: kenji <aks.kenji@protonmail.com>
2025-06-05 15:33:11 +00:00
Qubasa
9cec635fdc clan_lib: Fix quoting issues 2025-06-05 17:24:36 +02:00
pinpox
cd107d5ff2 Open port for localsend 2025-06-05 17:19:45 +02:00
kenji
42d58c3c97 Merge pull request 'zerotier: Emphasize that moons are optional' (#3868) from kenji/clan-core:ke-zerotier-documentation-expand into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3868
2025-06-05 14:07:47 +00:00
a-kenji
99fb740f99 zerotier: Emphasize that moons are optional 2025-06-05 15:56:05 +02:00
kenji
3d39ab91bc Merge pull request 'zerotier: Add a usage example to the documentation' (#3867) from kenji/clan-core:ke-zerotier-documentation into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3867
2025-06-05 13:47:25 +00:00
a-kenji
9f1c660a4f zerotier: Add a usage example to the documentation 2025-06-05 15:28:01 +02:00
kenji
801b90025d Merge pull request 'Migrate localsend to clanServices' (#3866) from migrate-localsend into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3866
2025-06-05 13:26:06 +00:00
pinpox
802fd13954 Fix manifest.name 2025-06-05 15:14:15 +02:00
pinpox
17731ad06f Add README 2025-06-05 14:54:27 +02:00
pinpox
0d8ccf25b6 Add roles directory 2025-06-05 13:27:55 +02:00
pinpox
ef4caa94e7 Migrate localsend to clanServices 2025-06-05 12:49:51 +02:00
pinpox
e30522cdad Merge pull request 'Clean up checks' (#3853) from cleanup-checks into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3853
2025-06-05 10:40:55 +00:00
renovate[bot]
d7b9466153 chore(deps): update disko digest to a4f7deb 2025-06-05 02:30:11 +00:00
Johannes Kirschbauer
e24a197062 Chore(specific_machine_dir): use protocol to avoid direct dependency on machine class 2025-06-04 20:51:27 +02:00
Johannes Kirschbauer
8261ff09cc Chore(api): narrow down get_machine
Dont require the user to pass the machine into the same getter function
The workflow contradicts itself here
2025-06-04 20:38:45 +02:00
hsjobeki
22db6ace21 Merge pull request 'Feat(jsonschema): simplify isRequired, look into default and defaultText' (#3861) from json-schema into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3861
2025-06-04 18:34:40 +00:00
Johannes Kirschbauer
e8608f5af3 feat(jsonschema): filter out $exportedModuleInfo by default 2025-06-04 20:22:54 +02:00
Johannes Kirschbauer
cdaa35ca5f feat(jsonschema): remove 'default' if 'defaultText' is present
default is likely to contain an error thunk if defaultText is set
including it into $exportedModuleInfo makes it non-serializable
2025-06-04 20:22:32 +02:00
Johannes Kirschbauer
f99ddab70f Feat(jsonschema): simplify isRequired, look into default and defaultText 2025-06-04 19:57:39 +02:00
Luis Hebendanz
33f3f36742 Merge pull request 'clan-app: Catch method not found error in api' (#3860) from Qubasa/clan-core:clan_app_fix into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3860
2025-06-04 16:28:24 +00:00
Qubasa
77ea3409b0 clan-app: Catch method not found error in api 2025-06-04 18:16:58 +02:00
kenji
44d6f0eef2 Merge pull request 'zerotier: Simplify endpoint configuration for moons' (#3859) from kenji/clan-core:ke-zerotier-option-moon into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3859
2025-06-04 15:09:48 +00:00
a-kenji
d32b873dfc zerotier: Simplify endpoint configuration for moons 2025-06-04 16:46:39 +02:00
kenji
f5782e2bcf Merge pull request 'zerotier: Get settings from the instance' (#3855) from kenji/clan-core:ke-zerotier-settings into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3855
2025-06-04 13:17:46 +00:00
a-kenji
d6918efbc7 zerotier: Get settings from the instance 2025-06-04 13:17:46 +00:00
kenji
b2c41fbd38 Merge pull request 'Make IPv4 address optional in localsend module' (#3856) from optional-localsend-ipv4 into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3856
2025-06-04 13:14:26 +00:00
pinpox
509274c90e cleanup checks/flake-module.nix 2025-06-04 14:59:30 +02:00
pinpox
20ecec156b Make ipv4Addr optional in localsend module 2025-06-04 14:53:04 +02:00
hsjobeki
dbae114233 Merge pull request 'docs(service-modules): add description and docs for options' (#3848) from doc-1 into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3848
2025-06-04 12:44:32 +00:00
kenji
3f2dfdfd05 Merge pull request 'Migrate mycelium from clanModule to clanService' (#3852) from migrate-mycelium into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3852
2025-06-04 12:34:26 +00:00
Johannes Kirschbauer
e4e39f4b86 Fix(tests/inventory): fix test by adding passtrhough
Since nixosModule is not inspectable during unit test
2025-06-04 14:30:12 +02:00
Johannes Kirschbauer
c9398fab12 Feat(clanServices): expose all other instance options than nixosModule
This is usefull for augmenting the perInstance module
2025-06-04 14:29:36 +02:00
pinpox
84c1cb20be Migrate mycelium from clanModule to clanService 2025-06-04 14:10:32 +02:00
pinpox
7b44e68280 Merge pull request 'Re-introduce clanModules/*/default.nix for backward compatibility' (#3850) from add-module-default-nix into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3850
Reviewed-by: kenji <aks.kenji@protonmail.com>
2025-06-04 11:22:53 +00:00
a-kenji
dd330f10c1 facts: Add deprecation warning 2025-06-04 13:21:09 +02:00
pinpox
ce1c1747cf Apply suggestions 2025-06-04 13:12:28 +02:00
pinpox
951cf4ec3d Merge pull request 'Remove Golem-provider module' (#3847) from migrate-golemprovider into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3847
2025-06-04 11:09:35 +00:00
pinpox
de5b988345 Re-introduce clanModules/*/default.nix for backward compatibility 2025-06-04 13:05:27 +02:00
pinpox
fe6c3a7ef9 Remove yagna package and golem-provider 2025-06-04 12:55:46 +02:00
pinpox
f1d7b915b3 Simplify and tidy up golem-provider module 2025-06-04 12:55:46 +02:00
Johannes Kirschbauer
f6c5113394 docs: expose clan service authoring interface 2025-06-04 12:43:03 +02:00
Johannes Kirschbauer
04106b24d2 docs(service-modules): add description and docs for options 2025-06-04 12:40:37 +02:00
kenji
09f5a108be Merge pull request 'zerotier: Migrate from clanModule to clanServices' (#3820) from kenji/clan-core:ke-migrate-clan-module-zerotier into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3820
2025-06-04 10:37:35 +00:00
a-kenji
6548934997 !fixup: Remove ', because it breaks nix-select 2025-06-04 12:23:53 +02:00
Mic92
2219b9e8a6 Merge pull request 'Add warning note for users on cloud machines' (#3806) from RuboGubo/clan-core:main into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3806
2025-06-04 10:09:19 +00:00
a-kenji
517cb98ac5 zerotier: Migrate from clanModule to clanServices
This migrates zerotier from clanModules to clanServices.
This is a graceful migration and does not yet disables any of the
clanModule functionality.
2025-06-04 11:04:51 +02:00
hsjobeki
75b7e26817 Merge pull request 'Fix(docs): fix broken link to decision' (#3844) from doc-1 into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3844
2025-06-04 08:34:37 +00:00
Johannes Kirschbauer
f3a8a6454b Fix(docs): fix broken link to decision 2025-06-04 09:11:02 +02:00
lassulus
15b4646547 Merge pull request 'zerotier: fix targetHost' (#3842) from connectivity_by_default_fix into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3842
2025-06-04 06:58:40 +00:00
lassulus
e89fb92f52 zerotier: fix targetHost 2025-06-04 08:46:01 +02:00
renovate[bot]
4ef6e093e5 Update nix-darwin digest to fa6120c 2025-06-04 05:50:11 +00:00
renovate[bot]
e0a175f5a6 Update nix-darwin digest to d46a072 2025-06-04 01:30:11 +00:00
pinpox
68fc2e25af Merge pull request 'Migrate heisenbridge from clanModule to clanService' (#3837) from migrate-heisenbridge into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3837
2025-06-04 00:56:42 +00:00
pinpox
50213caa68 Migrate heisenbridge from clanModule to clanService 2025-06-04 02:45:41 +02:00
pinpox
f9b5f85dc4 Merge pull request 'Migrate garage from clanModule to clanService' (#3836) from migrate-garage into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3836
2025-06-03 23:43:58 +00:00
pinpox
0a0ed236ad Migrate garage from clanModule to clanService 2025-06-04 01:29:52 +02:00
pinpox
15f5de5bcd Merge pull request 'Migrate ergochat from clanModule to clanService' (#3835) from migrate-ergochat into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3835
2025-06-03 22:32:12 +00:00
pinpox
2d09e65ff4 migrate ergochat module to clanservice 2025-06-04 00:21:23 +02:00
pinpox
f34c2d0824 Merge pull request 'Migrate auto-upgrade from clanModule to clanService' (#3827) from migrate-auto-upgrade into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3827
2025-06-03 21:40:57 +00:00
pinpox
1d549918e4 Add auto-upgrade.md to docs 2025-06-03 23:31:20 +02:00
pinpox
919648eae5 nix fmt 2025-06-03 23:22:58 +02:00
pinpox
692b2ae738 Migrate auto-upgrade from clanModule to clanService 2025-06-03 23:13:51 +02:00
pinpox
5196755626 Merge pull request 'Migrate deltachat from clanModule to clanService' (#3829) from migrate-deltachat into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3829
2025-06-03 21:12:28 +00:00
pinpox
f1f67b547d Add deltachat.md to docs 2025-06-03 23:02:42 +02:00
pinpox
9912c18262 nix fmt 2025-06-03 22:54:02 +02:00
pinpox
31bfc6eb8e Fix module category 2025-06-03 22:48:57 +02:00
pinpox
11fd796d44 Fix test runner for tests without vars 2025-06-03 22:35:10 +02:00
pinpox
65af5ac5d2 Add test for deltachat clanService 2025-06-03 22:35:10 +02:00
pinpox
260ccb2815 Migrate deltachat from clanModule to clanService 2025-06-03 22:34:03 +02:00
hsjobeki
51b28a9265 Merge pull request 'feat(inventory/instances): add option for extraModules to roles' (#3830) from flake-models into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3830
2025-06-03 18:58:13 +00:00
hsjobeki
cc7ae5eb44 Merge pull request 'Reaply: #3777: fix/machine-detail-view' (#3833) from ui-1 into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3833
2025-06-03 17:19:43 +00:00
Johannes Kirschbauer
82af09443a Chore(ui/taglist): snapshot test 2025-06-03 19:09:43 +02:00
Johannes Kirschbauer
e5c0c1e69c Fix(inventory/extraModules): use more narrow type for better persistence 2025-06-03 18:57:34 +02:00
hsjobeki
63570d60a3 Merge pull request 'chore: delete duplicate inventory models' (#3831) from chores-1 into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3831
2025-06-03 16:49:40 +00:00
hsjobeki
1a55e0abf5 Merge pull request 'iwd: fix deprecation spam' (#3832) from DavHau-dave into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3832
2025-06-03 16:47:27 +00:00
hsjobeki
ea8865e22b Reaply: #3777: fix/machine-detail-view 2025-06-03 18:42:47 +02:00
hsjobeki
a45dba724e Merge pull request 'Typography component V2' (#3797) from ui/typography into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3797
2025-06-03 16:36:19 +00:00
Johannes Kirschbauer
a192ab4910 Fix(docs): dont link to assumed successor 2025-06-03 18:35:00 +02:00
Johannes Kirschbauer
bbbc13c973 Fix(tests/inventory): fix test assertions due to change in the exported structure 2025-06-03 18:30:04 +02:00
Johannes Kirschbauer
43e85b5482 Chore: update clan nix_models 2025-06-03 18:18:12 +02:00
Johannes Kirschbauer
a419e49bb9 Fix(classgen): support listOf union 2025-06-03 18:18:02 +02:00
Johannes Kirschbauer
682da0e396 feat(inventory/instances): add option for extraModules to roles 2025-06-03 18:17:16 +02:00
Johannes Kirschbauer
2ff09100e5 chore: delete duplicate inventory models 2025-06-03 17:52:07 +02:00
Johannes Kirschbauer
5601423ed5 chore(inventory/instances): add forward all role attributes to the service 2025-06-03 17:38:02 +02:00
Johannes Kirschbauer
9c2bf0bbfe feat(inventory/instances): map over all machines and return lazy attributes 2025-06-03 17:37:04 +02:00
lassulus
39d6a89c80 Merge pull request 'zerotier: set targetHost if var is generated' (#3823) from connectivity_by_default_hack into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3823
2025-06-03 13:53:28 +00:00
RuboGubo
5e43876f8e Merge branch 'main' of git.clan.lol:RuboGubo/clan-core 2025-06-03 14:33:12 +01:00
RuboGubo
2f0714770a remove unnecessary note and re-work requirements 2025-06-03 14:31:34 +01:00
DavHau
a858813f48 Merge pull request 'makeTestClan: simplify - move parameters into module' (#3825) from DavHau/clan-core:emergency into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3825
2025-06-03 12:54:09 +00:00
DavHau
6d1a3673ce iwd: fix deprecation spam
use config.warnings instead of lib.warn
2025-06-03 19:38:10 +07:00
DavHau
01737d2bf7 clan tests: convert makeTestClan to a module
Let's not put yet another wrapper around runTest, instead expose our logic as a module that can be imported into any nixos-vm-test
2025-06-03 19:38:02 +07:00
DavHau
a0cbc815e8 makeTestClan: simplify - move parameters into module
... in preparation of removing the makeTestClan wrapper and make this a module instead that can be imported into any test.
2025-06-03 19:38:02 +07:00
DavHau
286ac97063 Revert "Merge pull request 'fix/machine-detail-view' (#3777) from fix/machine-detail-view into main"
This reverts commit c08a9dc1ad, reversing
changes made to c4312bfa18.
2025-06-03 19:35:19 +07:00
RuboGubo
354ba3df70 Add warning note for users on cloud machines 2025-06-03 12:24:54 +00:00
Mic92
1ed2ff77f0 Merge pull request 'fix buildhost re-using control socket for updates' (#3824) from build-host into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3824
2025-06-03 12:21:22 +00:00
hsjobeki
c08a9dc1ad Merge pull request 'fix/machine-detail-view' (#3777) from fix/machine-detail-view into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3777
2025-06-03 12:10:21 +00:00
Jörg Thalheim
89b436b8a1 fix buildhost re-using control socket for updates
this is actually a serious issue because it also would result doing ssh
to the wrong host: https://git.clan.lol/clan/clan-core/issues/3822
2025-06-03 14:01:49 +02:00
lassulus
d108262b47 zerotier: set targetHost if var is generated 2025-06-03 12:16:09 +02:00
Michael Hoang
c4312bfa18 Merge pull request 'cli: allow using commands from local flakerefs for debugging' (#3819) from push-quvsovsorszu into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3819
2025-06-03 04:20:58 +00:00
Michael Hoang
10b89fe8fd cli: allow using commands from local flakerefs for debugging 2025-06-03 14:07:45 +10:00
Luis Hebendanz
0da94c27ca Merge pull request 'Fix test_create.py' (#3818) from Qubasa/clan-core:minimized-2 into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3818
2025-06-02 15:08:00 +00:00
Luis Hebendanz
710676ad9b Merge pull request 'inventory: Add buildHost argument' (#3817) from Qubasa/clan-core:minimized into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3817
2025-06-02 15:07:38 +00:00
pinpox
19b48b8c82 Merge pull request 'Migrate borgbackup to clan Services' (#3711) from migrate-borgbackup into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3711
2025-06-02 15:07:05 +00:00
pinpox
988e0825ed Update clan-core-for-checks 2025-06-02 16:19:06 +02:00
pinpox
00313723e2 Update hash 2025-06-02 16:16:17 +02:00
pinpox
13a9b17198 modules/borgbackup: migrate to clanServices
Migrates the borgbackup module to clanServices, preserving it's original
configuration syntax and functionality
2025-06-02 16:12:37 +02:00
Qubasa
bd7a5694e2 clan-cli: Fix test_create::test_clan_create_api 2025-06-02 15:39:50 +02:00
Qubasa
27791477b1 inventory: Add buildHost argument 2025-06-02 14:52:13 +02:00
renovate[bot]
fde6887754 chore(deps): lock file maintenance 2025-06-02 03:00:12 +00:00
renovate[bot]
c4e6b89e25 chore(deps): lock file maintenance 2025-06-02 01:00:23 +00:00
renovate[bot]
e3941a1b7b chore(deps): lock file maintenance 2025-06-02 00:40:41 +00:00
renovate[bot]
23fd87f144 chore(deps): update data-mesher digest to fcb19d9 2025-06-02 00:20:12 +00:00
renovate[bot]
9ec5e4419e chore(deps): update flake-parts digest to 49f0870 2025-06-01 23:50:10 +00:00
RuboGubo
d4b36d9d90 Add warning note for users on cloud machines 2025-05-31 20:10:10 +01:00
DavHau
6b1340d775 iwd: fix typo in deprecation message 2025-05-31 17:58:44 +07:00
DavHau
2b8a7c025f Merge pull request 'clanModules/iwd: deprecate gracefully' (#3804) from DavHau/clan-core:vars2 into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3804
2025-05-31 10:55:27 +00:00
DavHau
810d9f8122 deprecate iwd module gracefully 2025-05-31 17:46:07 +07:00
DavHau
dad846aa0b services/wifi: rename ssid -> network-name 2025-05-31 17:34:47 +07:00
DavHau
40b39faf70 serivces/wifi: make generator names generic
rename from iwd.<name> to wifi.<name>
2025-05-31 17:34:40 +07:00
DavHau
4922ff9ddc Merge pull request 'tests: actually execute vars checks in CI' (#3803) from DavHau/clan-core:vars2 into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3803
2025-05-31 10:27:36 +00:00
DavHau
65d9ef02dc generate-test-vars: fake prompt inputs
Use fake prompt inputs when generating vars for testing
2025-05-31 17:14:26 +07:00
DavHau
d27834b565 tests: actually execute vars checks in CI 2025-05-31 16:16:09 +07:00
clan-bot
3c9c7341c1 Merge pull request 'Update Clan Core for Checks' (#3799) from update-clan-core-for-checks into main 2025-05-31 07:37:42 +00:00
DavHau
e81771a724 tests: test vars generation for all clan service tests 2025-05-31 12:17:52 +07:00
DavHau
7ecc142ba9 sops: initialize age_plugins early
This avoids re-initializing the Flake object deep in the tree, which in turn leads to issue when overriding the Flake for testing, eg the URl would reset.
2025-05-31 11:27:17 +07:00
DavHau
54b13054ca vars: fix spelling in docs 2025-05-31 11:13:17 +07:00
clan-bot
c6ba82cfab Update pinned clan-core for checks 2025-05-31 02:51:24 +00:00
Mic92
1523ac18c9 Merge pull request 'Add inputs to specialArgs and make templates use it' (#3798) from templates into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3798
2025-05-30 18:33:33 +00:00
Jörg Thalheim
646a3d56ce add inputs to specialArgs and make templates use it. 2025-05-30 19:53:12 +02:00
Jörg Thalheim
9d62001a27 templates: unify specialArgs across examples 2025-05-30 19:22:45 +02:00
Brian McGee
8997f61ef8 feat(ui): Typography V2 2025-05-30 14:58:50 +01:00
Brian McGee
7f436d1a8b feat(ui): update border and background colors
To match latest design.
2025-05-30 13:46:57 +01:00
Brian McGee
8e155dd164 feat(ui): update primary colors
To match latest design.
2025-05-30 13:46:56 +01:00
Brian McGee
bbe14dbb3b chore(ui): setup base for Typography V2
Also removes Button stories for V1 component.
2025-05-30 13:46:55 +01:00
clan-bot
c375a39137 Merge pull request 'Update Clan Core for Checks' (#3781) from update-clan-core-for-checks into main 2025-05-30 10:41:20 +00:00
Mic92
5a8f8fc0bf Merge pull request 'container-test: better error message for nsenter' (#3794) from container-test-improv into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3794
2025-05-30 10:35:02 +00:00
clan-bot
a3cb5f5159 Update pinned clan-core for checks 2025-05-30 10:29:19 +00:00
Jörg Thalheim
1a1898b5f1 container-test: better error message for nsenter 2025-05-30 12:27:51 +02:00
brianmcgee
9341c14997 Merge pull request 'feat(ui): enable storybook snapshot tests' (#3789) from feat/storybook-snapshot-tests into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3789
2025-05-30 10:22:10 +00:00
Mic92
5ef82a1367 Merge pull request 'Revert "services/wifi: rename ssid -> network-name"' (#3796) from revert-wifi-change into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3796
2025-05-30 10:15:45 +00:00
Jörg Thalheim
2154af7f95 Revert "services/wifi: rename ssid -> network-name"
This reverts commit e45e994b83.
2025-05-30 12:09:46 +02:00
Jörg Thalheim
681a67f531 Revert "serivces/wifi: make generator names generic"
This reverts commit 2a347fb406.
2025-05-30 12:09:30 +02:00
Brian McGee
543cfd4fc6 fix(ui): disable storybook devshell and package on Darwin 2025-05-30 11:06:14 +01:00
Brian McGee
807b9fd61f feat(ui): enable storybook snapshot tests
- adds a process-compose namespace for running `storybook` and `luakit` together to replicate the `webkit`-based rendering that happens inside of `webview`
- adds some helper scripts for running storybook tests and updating snapshots, with documentation in the README.
- adds a `clan-app-ui-storybook` package which builds and tests the storybook, checking for rendering changes

Currently, we’re only doing markup-based snapshot tests. We’re also using headless chromium for the tests by default as I couldn't get webkit to work in the nix build.

As we’re only markup-based for the time being, this should be ok. But eventually I'd like to get it working with webkit.
2025-05-30 11:06:14 +01:00
Mic92
d1ad8c6c87 Merge pull request 'container-test: disable UsePam for ssh' (#3795) from use-pam into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3795
2025-05-30 10:05:08 +00:00
Jörg Thalheim
795ace408a container-test: disable UsePam for ssh
doesn't work without setuid, which we currently do not support.
2025-05-30 11:53:20 +02:00
Mic92
aba30e156a Merge pull request 'vars: add restartUnits option' (#3784) from vars-userborn into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3784
2025-05-30 09:45:17 +00:00
hsjobeki
672ef7c4d2 Merge pull request 'Tests(inventoryStore): add tests for intersecting nix/json lists' (#3783) from flake-models into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3783
2025-05-30 08:35:13 +00:00
Johannes Kirschbauer
c42d981285 Test(InventoryPersistence): improve error message 2025-05-30 10:23:57 +02:00
DavHau
e45e994b83 services/wifi: rename ssid -> network-name 2025-05-29 20:21:09 +07:00
DavHau
2a347fb406 serivces/wifi: make generator names generic
rename from iwd.<name> to wifi.<name>
2025-05-29 20:06:19 +07:00
Mic92
610253d45e Merge pull request 'vars upload: also add become_root' (#3788) from sudo into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3788
2025-05-28 18:45:34 +00:00
Jörg Thalheim
229401e6ef vars upload: also add become_root 2025-05-28 20:35:45 +02:00
Mic92
0d7c7a8856 Merge pull request 'add sudo_askpass_proxy' (#3642) from sudo into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3642
2025-05-28 18:32:16 +00:00
Jörg Thalheim
e733619139 test_upload_single_file: add missing ssh_control_master 2025-05-28 20:25:53 +02:00
Jörg Thalheim
14324a059b move test_ssh_remote to remote_test 2025-05-28 20:13:48 +02:00
Jörg Thalheim
7314f6b2ff vars: add restartUnits option
For secrets not part of the nix store there is no other way in NixOS to
restart a service after the secret is updated. One example is changing
password in userborn, which doesn't run as a activation script but as a
systemd service.
2025-05-28 16:44:19 +02:00
Jörg Thalheim
ac31b20522 re-store controllmaster in various places where it got removed. 2025-05-28 16:21:30 +02:00
Jörg Thalheim
75dd389c2c no longer require controlmaster for interactive ssh
we only run one ssh command, so control master is not needed
2025-05-28 16:21:30 +02:00
Jörg Thalheim
31274212a8 ssh/remote: Improve error message if _control_path_dir is not set 2025-05-28 16:21:30 +02:00
Jörg Thalheim
e0ebea7eb8 update/upload_sources remove ssh_control_master again from upload_sources 2025-05-28 16:21:30 +02:00
Jörg Thalheim
f06313d5b2 add sudo_askpass_proxy 2025-05-28 16:21:30 +02:00
Jörg Thalheim
5a560ff219 ssh/remote: make sure we also cleanup clan-ssh in the error case 2025-05-28 16:21:30 +02:00
Jörg Thalheim
91406b2016 remove unused method 2025-05-28 16:21:30 +02:00
Johannes Kirschbauer
1582402634 Tests(inventoryStore): add tests for intersecting nix/json lists 2025-05-28 15:39:52 +02:00
hsjobeki
2efb4994a6 Merge pull request 'Tests(inventoryStore): add fixture, make extensible' (#3782) from flake-models into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3782
2025-05-28 13:12:19 +00:00
Johannes Kirschbauer
dc94749647 Tests(inventoryStore): add fixture, make extensible 2025-05-28 15:06:17 +02:00
hsjobeki
53244303f6 Merge pull request 'chore(nix_models): use exported clan models' (#3773) from flake-models into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3773
2025-05-28 12:25:07 +00:00
Johannes Kirschbauer
2da7ebaa21 Fix(machines/create): use 'InventorySnapshot' as init argument
Inventory as a model is generally not json serializable
InventorySnapshot is the return value of InventoryStore.{read, write}
And should be used in API calls, because the other fields might not be compatible in general
2025-05-28 14:09:45 +02:00
Johannes Kirschbauer
e57c8f6f9a feat(InventoryStore): return a restricted view of the inventory 2025-05-28 14:04:34 +02:00
Johannes Kirschbauer
467aa546c4 Chore: update clan nix_models 2025-05-28 14:03:23 +02:00
Johannes Kirschbauer
19dbc0ff73 chore(nix_models): migrate import to use exported clan models 2025-05-28 14:03:22 +02:00
Johannes Kirschbauer
8eb2ad6c6d feat(nix_models): replace inventory model by holistic clan model 2025-05-28 14:02:43 +02:00
Johannes Kirschbauer
111983b508 feat(classgen): make type generation more predictable across 2025-05-28 14:02:43 +02:00
Johannes Kirschbauer
e2e4344d83 fix(clan/interface): minor fixes 2025-05-28 14:02:43 +02:00
hsjobeki
51c2f72174 Merge pull request 'Tests(clan_lib): enable clan_lib pytests not marked with_core' (#3779) from inventory-0 into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3779
2025-05-28 09:45:56 +00:00
Johannes Kirschbauer
5271b5c599 Fix(inventoryStore): use 'nix_eval' wrapper to set the store correct 2025-05-28 11:34:16 +02:00
Johannes Kirschbauer
f6c869dbae Fix(clan_cli): filter tests files from source 2025-05-28 11:34:12 +02:00
Johannes Kirschbauer
673b6bb31f Fix(tests): fix failing pytests 2025-05-28 11:01:54 +02:00
Johannes Kirschbauer
6f0a4549a5 Tests(inventoryStore): fixup tests to run in ci 2025-05-28 10:42:47 +02:00
Johannes Kirschbauer
c6c43ba737 Feat(inventoryStore): add possibility to turn off output filtering 2025-05-28 10:42:47 +02:00
Johannes Kirschbauer
6debc2ddf9 Tests(clan_lib): enable clan_lib pytests not marked with_core 2025-05-28 10:42:47 +02:00
hsjobeki
e374da632e Merge pull request 'refactor(persist/utils): rename apply_patch to 'set_value_by_path'' (#3780) from rename-1 into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3780
2025-05-28 08:19:10 +00:00
Johannes Kirschbauer
dac30c4dd7 refactor(persist/utils): rename apply_patch to 'set_value_by_path' 2025-05-28 10:16:48 +02:00
Brian McGee
dfd5e677ec chore: fmt 2025-05-28 08:24:03 +01:00
Brian McGee
4b7fc9e544 fix(ui): use asterisk html entity code
It wasn't rendering for me when using "*".
2025-05-28 08:20:45 +01:00
Brian McGee
03db7d1fbc feat(ui): improve tags display in machine detail
Also introduces a new TagList component.
2025-05-28 08:20:45 +01:00
Brian McGee
c36cf800bb fix(ui): normalize font sizes in machine detail view 2025-05-28 08:20:44 +01:00
Brian McGee
465fd14bfe feat(ui): refine Button stories
Add separate examples of start and end icon
2025-05-28 08:20:44 +01:00
Brian McGee
52ca7017d1 fix(ui): add default css in storybook preview 2025-05-28 08:20:43 +01:00
hsjobeki
61a587b382 Merge pull request 'Feat(inventory): remove legacy action functions' (#3778) from inventory-0 into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3778
2025-05-27 16:09:16 +00:00
Johannes Kirschbauer
ec6fddce03 Fix(test): migrate machine cli command tests to use the new functions 2025-05-27 17:57:08 +02:00
Johannes Kirschbauer
c293d813cc Feat(inventoryStore): add 'invalidate_cache' to the Flake protocol 2025-05-27 17:56:35 +02:00
Johannes Kirschbauer
3ed3cdddc9 Feat(inventory): remove legacy action functions
Inventory should only and always be accessed through the inventory store.
Manually reading and writing to the json file is highly insecure
2025-05-27 17:20:04 +02:00
hsjobeki
ec17a785af Merge pull request 'Fix: configure deferred setting module path correctly' (#3776) from fix-3 into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3776
2025-05-27 14:46:09 +00:00
Johannes Kirschbauer
38b83c41cf Fix: configure deferred setting module path correctly 2025-05-27 16:31:54 +02:00
Mic92
055b1eb413 Merge pull request 'chore(deps): update nix-darwin digest to 44a7d0e' (#3775) from renovate/nix-darwin-digest into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3775
2025-05-27 14:23:32 +00:00
Mic92
d74ddf7334 Merge pull request 'docs: clarify when to override the nixpkgs input of clan-core' (#3774) from push-kylqnyonxntl into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3774
2025-05-27 14:23:21 +00:00
renovate[bot]
55923023cf chore(deps): update nix-darwin digest to 44a7d0e 2025-05-27 14:10:10 +00:00
Michael Hoang
e0c1cb47e7 docs: clarify when to override the nixpkgs input of clan-core
To match 30987ee5b2/docs/site/guides/migrations/migration-guide.md (L54-L55)
2025-05-27 22:48:08 +10:00
Michael Hoang
30987ee5b2 Merge pull request 'docs: point users towards passing in self to buildClan' (#3772) from push-wluozlqruukw into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3772
Reviewed-by: kenji <aks.kenji@protonmail.com>
2025-05-27 12:34:27 +00:00
Michael Hoang
eadd59ff21 docs: point users towards passing in self to buildClan 2025-05-27 13:49:14 +10:00
clan-bot
a62ac116d8 Merge pull request 'Update Clan Core for Checks' (#3771) from update-clan-core-for-checks into main 2025-05-27 03:01:12 +00:00
clan-bot
2422e0c8e1 Update pinned clan-core for checks 2025-05-27 02:51:23 +00:00
hsjobeki
afa8d62d48 Merge pull request 'Refactor(lib/inventory): move machine actions into clan_lib/machines/actions.py' (#3770) from chores-3 into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3770
2025-05-26 16:05:26 +00:00
Johannes Kirschbauer
767477cd5c Chore: rename secrets.get_machine to avoid ambiguity 2025-05-26 17:52:46 +02:00
Johannes Kirschbauer
349968c631 Refactor(lib/inventory): move machine actions into clan_lib/machines/actions.py 2025-05-26 17:51:12 +02:00
hsjobeki
d7b111ef0a Merge pull request 'Feat(persist): add support for deferredModule read/write' (#3752) from deferredModule-serde into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3752
2025-05-26 14:18:53 +00:00
Johannes Kirschbauer
8aed51c63e fix(morph/test): temporary workaround for morph test 2025-05-26 16:06:12 +02:00
Johannes Kirschbauer
73d72298cc chore: add todo comments for template logic in create machine 2025-05-26 16:05:20 +02:00
brianmcgee
d389c4dc5d Merge pull request 'feat(ui): introduces storybook' (#3767) from feat/storybook into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3767
2025-05-26 13:55:46 +00:00
kenji
91cf2a54bb Merge pull request 'pkgs/generate-test-vars: Fix build' (#3769) from kenji/clan-core:ke-vars-generator-fix into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3769
2025-05-26 13:48:49 +00:00
a-kenji
322068dad1 pkgs/generate-test-vars: Fix erroneous module import
The machines module lives in the `clan_lib` library.
2025-05-26 15:43:41 +02:00
a-kenji
39995eef39 pkgs/generate-test-vars: Add basic module test
Add a basic module test that can catch breaking changes in module
usage.
2025-05-26 15:41:48 +02:00
kenji
01eff2c6b9 Merge pull request 'clanServices/wifi/tests: Use undeprecated module registration' (#3768) from kenji/clan-core:ke-wifi-fix into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3768
2025-05-26 12:59:01 +00:00
a-kenji
491dd8134a clanServices/wifi/tests: Use undeprecated module registration 2025-05-26 14:44:00 +02:00
DavHau
7e4e083014 Merge pull request 'services/wifi: migrate to NetworkManager' (#3766) from DavHau/clan-core:dave into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3766
2025-05-26 12:14:08 +00:00
DavHau
f561102ca8 clanModules/wifi: remove module
It was replaces by a service module and experimental anyways
2025-05-26 19:09:20 +07:00
DavHau
6d6a0521ff services/wifi: migrate to NetworkManager 2025-05-26 19:09:20 +07:00
Brian McGee
bf993af56f feat(ui): introduces storybook
- adds the necessary dependencies and configuration for Storybook.
- refactors the `Button` component and adds some stories for it.
2025-05-26 12:56:51 +01:00
brianmcgee
7503784699 Merge pull request 'feat(ui): add a clan context provider' (#3744) from feat/clan-uri-context into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3744
2025-05-26 09:26:07 +00:00
renovate[bot]
1c62c287b7 Update data-mesher digest to f52e3ee 2025-05-26 08:00:31 +00:00
renovate[bot]
a32b3db8e5 Update treefmt-nix digest to 1f3f7b7 2025-05-26 07:40:10 +00:00
clan-bot
04d0087239 Merge pull request 'Update Clan Core for Checks' (#3762) from update-clan-core-for-checks into main 2025-05-26 03:01:06 +00:00
clan-bot
6777baca96 Update pinned clan-core for checks 2025-05-26 02:51:22 +00:00
renovate[bot]
4b44892b47 Update disko digest to a894f28 2025-05-26 02:22:29 +00:00
renovate[bot]
339696da1f Lock file maintenance 2025-05-26 00:20:21 +00:00
renovate[bot]
1644dc66e7 Lock file maintenance 2025-05-26 00:00:32 +00:00
Luis Hebendanz
4aaa985703 Merge pull request 'clan-cli: Fix too long path for socket issue #3756' (#3757) from Qubasa/clan-core:fix_path_to_long into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3757
2025-05-25 20:28:46 +00:00
Qubasa
8a40d46e96 clan-cli: Fix too long path for socket issue #3756 2025-05-25 22:16:51 +02:00
kenji
c7515ab5e9 Merge pull request 'typo' (#3755) from nim65s/clan-core:typo into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3755
2025-05-25 17:05:30 +00:00
Guilhem Saurel
447a4ecc3e another typo 2025-05-25 18:02:06 +02:00
Guilhem Saurel
df12613ad8 typo 2025-05-25 17:36:14 +02:00
clan-bot
fe39c37c07 Merge pull request 'Update Clan Core for Checks' (#3754) from update-clan-core-for-checks into main 2025-05-25 03:01:27 +00:00
clan-bot
6b8c0ba57a Update pinned clan-core for checks 2025-05-25 02:51:32 +00:00
clan-bot
5f10f5712e Merge pull request 'Update Clan Core for Checks' (#3753) from update-clan-core-for-checks into main 2025-05-24 03:00:43 +00:00
clan-bot
2bf33ea295 Update pinned clan-core for checks 2025-05-24 02:51:23 +00:00
Johannes Kirschbauer
eadc7997cd Fix(machines/create): check if machine is already created 2025-05-23 22:31:06 +02:00
Johannes Kirschbauer
43be58c433 Fix(machines/create): always add 'deploy.targetHost'
Rationale: not passing the value, is equivalent to deleting a value from the inventory store
See: 'delete_by_path'
deploy.targetHost has a default of null (None)
2025-05-23 22:07:09 +02:00
Johannes Kirschbauer
d8a835c7ae test(persist/inventory): add test for adding deferredModule
This feature will allow us to read/write to 'settings' of service
'instances' which are of type deferredModule.
Usually a deferredModule needs to be evaulated, but because we use our
own type, which forces some constraints, we can safely perform read and
write
2025-05-23 21:49:16 +02:00
Johannes Kirschbauer
f746184bf6 fix(persist/delete): delete explizitly 2025-05-23 21:47:12 +02:00
Johannes Kirschbauer
de25fda5b3 fix(tests): use inventory store to interact with the inventory 2025-05-23 21:46:35 +02:00
Johannes Kirschbauer
bb2955d9ad feat(persist/inventory): add transformation and filtering to support deferredModules 2025-05-23 21:45:52 +02:00
Johannes Kirschbauer
467c1e7f28 fixes(persist/util): fix some expected error messages in tests 2025-05-23 21:43:49 +02:00
Johannes Kirschbauer
4c3dcfe8b5 test(persist/util): add test for adding empty submodules 2025-05-23 21:43:09 +02:00
Johannes Kirschbauer
2170235958 refactor(persist/util): improve calc_patches 2025-05-23 21:42:35 +02:00
Johannes Kirschbauer
60bd7bc3ce feat(persist/util): init parent_is_dict
Check if a parent value is of type dict
This utility is helpfull for cross checking of flattened dicts
2025-05-23 21:41:34 +02:00
Johannes Kirschbauer
634b4f8e46 chore(inventory): find_deleted_paths rename variables 2025-05-23 21:40:02 +02:00
Johannes Kirschbauer
8c9e1538fb fix(inventory/store): keep empty dicts as leafs 2025-05-23 21:39:23 +02:00
Johannes Kirschbauer
3974bd1580 test(inventory/store): clean up simple test 2025-05-23 21:38:16 +02:00
Johannes Kirschbauer
ed764a2f0f feat(inventory/store): init path_match utility 2025-05-23 21:36:14 +02:00
lassulus
e5ba0489c4 Merge pull request 'clan_lib flake_test: fix on darwin' (#3750) from clan-lib-darwin-fix into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3750
2025-05-23 10:43:31 +00:00
lassulus
98b0f97d45 clan_lib flake_test: fix on darwin 2025-05-23 12:29:34 +02:00
clan-bot
57cd50ae35 Merge pull request 'Update Clan Core for Checks' (#3749) from update-clan-core-for-checks into main 2025-05-23 03:01:12 +00:00
clan-bot
176b1f94bc Update pinned clan-core for checks 2025-05-23 02:51:24 +00:00
Luis Hebendanz
d4e5a5ef8b Merge pull request 'clan-cli: Move Machine object to clan_lib' (#3747) from Qubasa/clan-core:machine_object into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3747
2025-05-22 17:23:46 +00:00
Qubasa
0ca7600439 clan-cli: Move Machine object to clan_lib 2025-05-22 19:11:19 +02:00
597 changed files with 25008 additions and 4706 deletions

View File

@@ -1,64 +0,0 @@
{
pkgs,
self,
clanLib,
...
}:
let
public-key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAII6zj7ubTg6z/aDwRNwvM/WlQdUocMprQ8E92NWxl6t+ test@test";
in
clanLib.test.makeTestClan {
inherit pkgs self;
nixosTest = (
{ ... }:
{
name = "admin";
clan = {
directory = ./.;
modules."@clan/admin" = ../../clanServices/admin/default.nix;
inventory = {
machines.client = { };
machines.server = { };
instances = {
ssh-test-one = {
module.name = "@clan/admin";
roles.default.machines."server".settings = {
allowedKeys.testkey = public-key;
};
};
};
};
};
nodes = {
client.environment.etc.private-test-key.source = ./private-test-key;
server = {
services.openssh = {
enable = true;
settings.UsePAM = false;
};
};
};
testScript = ''
start_all()
machines = [client, server]
for m in machines:
m.systemctl("start network-online.target")
for m in machines:
m.wait_for_unit("network-online.target")
client.succeed(f"ssh -F /dev/null -i /etc/private-test-key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o BatchMode=yes root@server true &>/dev/null")
'';
}
);
}

View File

@@ -0,0 +1,51 @@
(
{ ... }:
{
name = "borgbackup";
nodes.machine =
{ self, pkgs, ... }:
{
imports = [
self.clanModules.borgbackup
self.nixosModules.clanCore
{
services.openssh.enable = true;
services.borgbackup.repos.testrepo = {
authorizedKeys = [ (builtins.readFile ../assets/ssh/pubkey) ];
};
}
{
clan.core.settings.directory = ./.;
clan.core.state.testState.folders = [ "/etc/state" ];
environment.etc.state.text = "hello world";
systemd.tmpfiles.settings."vmsecrets" = {
"/etc/secrets/borgbackup/borgbackup.ssh" = {
C.argument = "${../assets/ssh/privkey}";
z = {
mode = "0400";
user = "root";
};
};
"/etc/secrets/borgbackup/borgbackup.repokey" = {
C.argument = builtins.toString (pkgs.writeText "repokey" "repokey12345");
z = {
mode = "0400";
user = "root";
};
};
};
# clan.core.facts.secretStore = "vm";
clan.core.vars.settings.secretStore = "vm";
clan.borgbackup.destinations.test.repo = "borg@localhost:.";
}
];
};
testScript = ''
start_all()
machine.systemctl("start --wait borgbackup-job-test.service")
assert "machine-test" in machine.succeed("BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK=yes /run/current-system/sw/bin/borg-job-test list")
'';
}
)

View File

@@ -1,51 +1,118 @@
(
{
pkgs,
nixosLib,
clan-core,
...
}:
nixosLib.runTest (
{ ... }:
{
imports = [
clan-core.modules.nixosVmTest.clanTest
];
hostPkgs = pkgs;
name = "borgbackup";
nodes.machine =
{ self, pkgs, ... }:
{
imports = [
self.clanModules.borgbackup
self.nixosModules.clanCore
{
services.openssh.enable = true;
services.borgbackup.repos.testrepo = {
authorizedKeys = [ (builtins.readFile ../assets/ssh/pubkey) ];
};
}
{
clan.core.settings.directory = ./.;
clan.core.state.testState.folders = [ "/etc/state" ];
environment.etc.state.text = "hello world";
systemd.tmpfiles.settings."vmsecrets" = {
"/etc/secrets/borgbackup/borgbackup.ssh" = {
C.argument = "${../assets/ssh/privkey}";
z = {
mode = "0400";
user = "root";
};
};
"/etc/secrets/borgbackup/borgbackup.repokey" = {
C.argument = builtins.toString (pkgs.writeText "repokey" "repokey12345");
z = {
mode = "0400";
user = "root";
};
};
};
# clan.core.facts.secretStore = "vm";
clan.core.vars.settings.secretStore = "vm";
clan = {
directory = ./.;
test.useContainers = true;
modules."@clan/borgbackup" = ../../clanServices/borgbackup/default.nix;
inventory = {
clan.borgbackup.destinations.test.repo = "borg@localhost:.";
}
];
machines.clientone = { };
machines.serverone = { };
instances = {
borgone = {
module.name = "@clan/borgbackup";
roles.client.machines."clientone" = { };
roles.server.machines."serverone".settings.directory = "/tmp/borg-test";
};
};
};
};
nodes = {
serverone = {
services.openssh.enable = true;
# Needed so PAM doesn't see the user as locked
users.users.borg.password = "borg";
};
clientone =
{ config, pkgs, ... }:
let
dependencies = [
clan-core
pkgs.stdenv.drvPath
] ++ builtins.map (i: i.outPath) (builtins.attrValues clan-core.inputs);
closureInfo = pkgs.closureInfo { rootPaths = dependencies; };
in
{
services.openssh.enable = true;
users.users.root.openssh.authorizedKeys.keyFiles = [ ../assets/ssh/pubkey ];
clan.core.networking.targetHost = config.networking.hostName;
environment.systemPackages = [ clan-core.packages.${pkgs.system}.clan-cli ];
environment.etc.install-closure.source = "${closureInfo}/store-paths";
nix.settings = {
substituters = pkgs.lib.mkForce [ ];
hashed-mirrors = null;
connect-timeout = pkgs.lib.mkForce 3;
flake-registry = pkgs.writeText "flake-registry" ''{"flakes":[],"version":2}'';
};
system.extraDependencies = dependencies;
clan.core.state.test-backups.folders = [ "/var/test-backups" ];
};
};
testScript = ''
import json
start_all()
machine.systemctl("start --wait borgbackup-job-test.service")
assert "machine-test" in machine.succeed("BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK=yes /run/current-system/sw/bin/borg-job-test list")
machines = [clientone, serverone]
for m in machines:
m.systemctl("start network-online.target")
for m in machines:
m.wait_for_unit("network-online.target")
# dummy data
clientone.succeed("mkdir -p /var/test-backups /var/test-service")
clientone.succeed("echo testing > /var/test-backups/somefile")
clientone.succeed("${pkgs.coreutils}/bin/install -Dm 600 ${../assets/ssh/privkey} /root/.ssh/id_ed25519")
clientone.succeed("${pkgs.coreutils}/bin/touch /root/.ssh/known_hosts")
clientone.wait_until_succeeds("timeout 2 ssh -o StrictHostKeyChecking=accept-new localhost hostname")
clientone.wait_until_succeeds("timeout 2 ssh -o StrictHostKeyChecking=accept-new $(hostname) hostname")
# create
clientone.succeed("borgbackup-create >&2")
clientone.wait_until_succeeds("! systemctl is-active borgbackup-job-serverone >&2")
# list
backup_id = json.loads(clientone.succeed("borg-job-serverone list --json"))["archives"][0]["archive"]
out = clientone.succeed("borgbackup-list").strip()
print(out)
assert backup_id in out, f"backup {backup_id} not found in {out}"
# borgbackup restore
clientone.succeed("rm -f /var/test-backups/somefile")
clientone.succeed(f"NAME='serverone::borg@serverone:.::{backup_id}' borgbackup-restore >&2")
assert clientone.succeed("cat /var/test-backups/somefile").strip() == "testing", "restore failed"
'';
}
)

View File

@@ -0,0 +1,6 @@
[
{
"publickey": "age1tyyx2ratu8s9ugyre36xyksnquth9gxeh7wjdhvsk89rtf8yu5wq0pk04c",
"type": "age"
}
]

View File

@@ -0,0 +1,15 @@
{
"data": "ENC[AES256_GCM,data:wCKoKuJo4uXycfqEUYAXDlRRMGJaWgOFiaQa4Wigs0jx1eCI80lP3cEZ1QKyrU/9m9POoZz0JlaKHcuhziTKUqaevHvGfVq2y00=,iv:pH5a90bJbK9Ro6zndNJ18qd4/rU+Tdm+y+jJZtY7UGg=,tag:9lHZJ9C/zIfy8nFrYt9JBQ==,type:str]",
"sops": {
"age": [
{
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBwUDhpd1ZqbWFqR0I3dVFI\nOHlyZnFUYXJnWElrRWhoUHVNMzdKd0VrcGdRCkphQVhuYzlJV0p1MG9MSW5ncWJ3\nREp1OEJxMzQzS2MxTk9aMkJ1a3B0Q0kKLS0tIENweVJ2Tk1yeXlFc2F5cTNIV3F3\nTkRFOVZ1amRIYmg1K3hGWUFSTTl4Wk0KHJRJ7756Msod7Bsmn9SgtwRo53B8Ilp3\nhsAPv+TtdmOD8He9MvGV+BElKEXCsLUwhp/Py6n6CJCczu0VIr8owg==\n-----END AGE ENCRYPTED FILE-----\n"
}
],
"lastmodified": "2025-05-20T13:33:56Z",
"mac": "ENC[AES256_GCM,data:FyfxXhnI6o4SVGJY2e1eMDnfkbMWiCkP4JL/G4PQvzz+c7OIuz8xaa03P3VW7b7o85NP2Tln4FMNTZ0FYtQwd0kKypLUnIxAHsixAHFCv4X8ul1gtZynzgbFbmc0GkfVWW8Lf+U+vvDwT+UrEVfcmksCjdvAOwP26PvlEhYEkSw=,iv:H+VrWYL+kLOLezCZrI8ZgeCsaUdpb7LxDMiLotezVPs=,tag:B/cbPdiEFumGKQHby5inCA==,type:str]",
"unencrypted_suffix": "_unencrypted",
"version": "3.10.2"
}
}

View File

@@ -0,0 +1 @@
../../../../../../sops/machines/clientone

View File

@@ -0,0 +1,19 @@
{
"data": "ENC[AES256_GCM,data:52vY68gqbwiZRMUBKc9SeXR06fuKAhuAPciLpxXgEOxI,iv:Y34AVoHaZzRiFFTDbekXP1X3W8zSXJmzVCYODYkdxnY=,tag:8WQaGEHQKT/n+auHUZCE0w==,type:str]",
"sops": {
"age": [
{
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBOdUFUZUZ2M00zTGlhNjF4\nL0VlMVY4Z2xMbWRWR29zZlFwdm1XRk12NGtBCnkrb3A4M3BkalMyeWdDaUdQdStt\nUWY3SXJROXdpRzN0NlBJNEpjTEZ0aFkKLS0tIGZkMGhsTXB2RnRqVHVrUFQwL2lw\nZnBreWhWa3Jrcm4yOXBiaUlPWFM1aDAKRE+Zzrja7KeANEJUbmFYuVoO3qGyi4iH\n0cfH0W8irRe9vsKMXz7YJxtByYLwRulrT8tXtElHvIEVJG0mwwaf0Q==\n-----END AGE ENCRYPTED FILE-----\n"
},
{
"recipient": "age1tyyx2ratu8s9ugyre36xyksnquth9gxeh7wjdhvsk89rtf8yu5wq0pk04c",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBsNEljUFdnQ0tTQ1IxZ2Zo\nYkc4V2dCaUk0YXh5SzlSazhsRTVKVzFvVXhFCkRyMlMxR3EyWEZIRzFQV3d2dVpz\na3NPbk9XdWR1NmtMQlZsNlBuU0NkQWMKLS0tIDlDYzMzOExVL1g5SVRHYlpUQlBV\na2lpdTUwaEd4OXhWUWxuV04xRVVKNHcK9coohAD1IoarLOXSGg3MIRXQ3BsTIA4y\nKrcS/PxITKJs7ihg93RZin70R79Qsij1RHZLKGfgGJ67i8ZCxc4N0g==\n-----END AGE ENCRYPTED FILE-----\n"
}
],
"lastmodified": "2025-05-20T13:33:59Z",
"mac": "ENC[AES256_GCM,data:eABMaIe07dwAMMlgrIUUpfpj73q1H5Keafql91MBQ5NN9Znr5lI/ennQsQsuLO8ZTCC34US/MJndliW34SqVM9y53p0jjPzqBxSKYq74iNcBz7+TxbjlY1aapgTRPr6Ta8I/5loohnxlHqjvLL70ZzfbChDN0/4jZsDVXYNfbIk=,iv:41Mz2u40JN0iE5zPUK6siaxo0rTtlk7fGWq7TF5NyUI=,tag:1A+h6XPH7DeQ6kxGDV3PgQ==,type:str]",
"unencrypted_suffix": "_unencrypted",
"version": "3.10.2"
}
}

View File

@@ -0,0 +1 @@
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIE3clYF6BDZ0PxfDdprx7YYM4U4PKEZkWUuhpre0wb7w nixbld@kiwi

View File

@@ -0,0 +1 @@
../../../../../../sops/machines/clientone

View File

@@ -0,0 +1,19 @@
{
"data": "ENC[AES256_GCM,data:tAjfBW75XDS8lfJCf/+9rPYH3aMjRX1nmdN5dPMxnrlhuEPM3Smv9AM93Tz36k7BKk31bUWcV/99ax+KaIK1Rzgym/CwKGGxIUziuVOEOwrCOBeOw7amZ9YGsgiLUTLIhoeO6SjfdZ4q2JxGPw7KqNfUM9kiZT01vx5JTLa24JdvBKpizbtHRlL1lappTRVt0dG2WhT9/YhQUGu9ZFqPs8+bPOBclc78qjCm2DAPgsprK+JCBuq+r+qHgAx4Ee1QHI7FC39e5NeGBTBeZfZ5d95+0klKuTx9FCPs6QRBkQ0tN29OpwzkdSuRAXGGHpzPkZ+FupbETtSQWCmnjma6jPzEl8oDUTWooKK0mUEz8icvTQvRfyM3Qt3mQpkX3e0rTEbZzoLdWCwTufP/tRQNDCWvI/NV7OjIHpNPjymqE5uPmiBpA6y6hhCH7zL1eDo11ICSIX3hkyFJH2svvFQn6oLrPAoByvNutfetKhd8z7NFpVeIOWwtuPzO7wU5M7zESHww0JF78vjFwimQYYhQ,iv:fVjeVez4dTGSrANi5ZeP9PJhsSySqeqqJzBDbd0gFW4=,tag:Aa89+bWLljxV1tlSHtpddw==,type:str]",
"sops": {
"age": [
{
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBVaW94M3VwcFJ2elcrRGlv\nUGdzVk9vU2ZweFpIVVlIRUEyRVlSMlEyeHpVCnJuV0xIS3hMLy9IbG92S0pvL2RP\nL0J0WkVuWVhQdldHekdYNTVXdFkrUlEKLS0tIFQzdGErZVBwQUFNMXErbDBQVURZ\naHlsY2hDa1Zud1E2dFh0ZHl4VEJ2S0kKVABqwRcCUTcsBInfo9CpFtoM3kl4KMyU\nGXDjHOSjlX5df7OKZAvYukgX7Q2penvq+Fq4fa4A1Cmkqga7cHdJ+A==\n-----END AGE ENCRYPTED FILE-----\n"
},
{
"recipient": "age1tyyx2ratu8s9ugyre36xyksnquth9gxeh7wjdhvsk89rtf8yu5wq0pk04c",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBnbHRSVEg3Vi9qTnAwWGF6\nbEdIR2gvZ2laZnJMbVF3NjcvN25OdXF3WXowCnVUODdEa1NWU3JISXlrNldOMjVi\ndUlMTVdBaWxvZHlwSTdJY3NCcll4SjAKLS0tIEp6ZVlDTklqVXdNYzJ2dElCR21o\nUWphMDdyVVppVnFHOVlHZTNtajZzOXMKRB61lUrAkUXSYl3ffOOK8k4QgLA4bFln\naQ7GOol8f8W5H68zXBMZrhjP6k4kZDfknc9jgyoWM7jaZNSWC5J19Q==\n-----END AGE ENCRYPTED FILE-----\n"
}
],
"lastmodified": "2025-05-20T13:33:59Z",
"mac": "ENC[AES256_GCM,data:NjVpDweqxTSQGt9VKR/CMfvbvHQJHCi8P7XbOuKLZKQ4GVoeZ5r4PsC6nxKHHikN6YL1oJCmaSxr0mJRk/sFZg/+wdW8L7F5aQeFRiWo9jCjH0MDMnfiu5a0xjRt21uPl/7LUJ9jNon5nyxPTlZMeYSvTP2Q9spnNuN8vqipP68=,iv:DPvbN9IvWiUfxiJk6mey/us8N1GGVJcSJrT8Bty4kB4=,tag:+emK8uSkfIGUXoYpaWeu3A==,type:str]",
"unencrypted_suffix": "_unencrypted",
"version": "3.10.2"
}
}

View File

@@ -1,6 +1,6 @@
{ fetchgit }:
fetchgit {
url = "https://git.clan.lol/clan/clan-core.git";
rev = "843e1b24be6ff9a7015e67b3291216c08f628d3e";
sha256 = "1bfm3n9r9k8prbwsh0yzp421y4ahblv407gqihwvcpiqsx6s3b9b";
rev = "13a9b1719835ef4510e4adb6941ddfe9a91d41cb";
sha256 = "sha256-M+pLnpuX+vIsxTFtbBZaNA1OwGQPeSbsMbTiDl1t4vY=";
}

View File

@@ -1,86 +1,89 @@
{
pkgs,
self,
clanLib,
nixosLib,
clan-core,
lib,
...
}:
clanLib.test.makeTestClan {
inherit pkgs self;
nixosTest = (
{ lib, ... }:
let
machines = [
"admin"
"peer"
"signer"
];
in
{
name = "data-mesher";
let
machines = [
"admin"
"peer"
"signer"
];
in
nixosLib.runTest (
{ ... }:
{
imports = [
clan-core.modules.nixosVmTest.clanTest
];
clan = {
directory = ./.;
inventory = {
machines = lib.genAttrs machines (_: { });
services = {
data-mesher.default = {
roles.peer.machines = [ "peer" ];
roles.admin.machines = [ "admin" ];
roles.signer.machines = [ "signer" ];
};
hostPkgs = pkgs;
name = "data-mesher";
clan = {
directory = ./.;
inventory = {
machines = lib.genAttrs machines (_: { });
services = {
data-mesher.default = {
roles.peer.machines = [ "peer" ];
roles.admin.machines = [ "admin" ];
roles.signer.machines = [ "signer" ];
};
};
};
};
defaults =
{ config, ... }:
{
environment.systemPackages = [
config.services.data-mesher.package
];
defaults =
{ config, ... }:
{
environment.systemPackages = [
config.services.data-mesher.package
];
clan.data-mesher.network.interface = "eth1";
clan.data-mesher.bootstrapNodes = [
"[2001:db8:1::1]:7946" # peer1
"[2001:db8:1::2]:7946" # peer2
];
clan.data-mesher.network.interface = "eth1";
clan.data-mesher.bootstrapNodes = [
"[2001:db8:1::1]:7946" # peer1
"[2001:db8:1::2]:7946" # peer2
];
# speed up for testing
services.data-mesher.settings = {
cluster.join_interval = lib.mkForce "2s";
cluster.push_pull_interval = lib.mkForce "5s";
};
# speed up for testing
services.data-mesher.settings = {
cluster.join_interval = lib.mkForce "2s";
cluster.push_pull_interval = lib.mkForce "5s";
};
nodes = {
admin.clan.data-mesher.network.tld = "foo";
};
# TODO Add better test script.
testScript = ''
nodes = {
admin.clan.data-mesher.network.tld = "foo";
};
def resolve(node, success = {}, fail = [], timeout = 60):
for hostname, ips in success.items():
for ip in ips:
node.wait_until_succeeds(f"getent ahosts {hostname} | grep {ip}", timeout)
# TODO Add better test script.
testScript = ''
for hostname in fail:
node.wait_until_fails(f"getent ahosts {hostname}")
def resolve(node, success = {}, fail = [], timeout = 60):
for hostname, ips in success.items():
for ip in ips:
node.wait_until_succeeds(f"getent ahosts {hostname} | grep {ip}", timeout)
start_all()
for hostname in fail:
node.wait_until_fails(f"getent ahosts {hostname}")
admin.wait_for_unit("data-mesher")
signer.wait_for_unit("data-mesher")
peer.wait_for_unit("data-mesher")
start_all()
# check dns resolution
for node in [admin, signer, peer]:
resolve(node, {
"admin.foo": ["2001:db8:1::1", "192.168.1.1"],
"peer.foo": ["2001:db8:1::2", "192.168.1.2"],
"signer.foo": ["2001:db8:1::3", "192.168.1.3"]
})
'';
}
);
}
admin.wait_for_unit("data-mesher")
signer.wait_for_unit("data-mesher")
peer.wait_for_unit("data-mesher")
# check dns resolution
for node in [admin, signer, peer]:
resolve(node, {
"admin.foo": ["2001:db8:1::1", "192.168.1.1"],
"peer.foo": ["2001:db8:1::2", "192.168.1.2"],
"signer.foo": ["2001:db8:1::3", "192.168.1.3"]
})
'';
}
)

View File

@@ -1,28 +0,0 @@
(import ../lib/container-test.nix) (
{ pkgs, ... }:
{
name = "deltachat";
nodes.machine =
{ self, ... }:
{
imports = [
self.clanModules.deltachat
self.nixosModules.clanCore
{
clan.core.settings.directory = ./.;
}
];
};
testScript = ''
start_all()
machine.wait_for_unit("maddy")
# imap
machine.succeed("${pkgs.netcat}/bin/nc -z -v ::1 143")
# smtp submission
machine.succeed("${pkgs.netcat}/bin/nc -z -v ::1 587")
# smtp
machine.succeed("${pkgs.netcat}/bin/nc -z -v ::1 25")
'';
}
)

View File

@@ -0,0 +1,66 @@
{
pkgs,
nixosLib,
clan-core,
...
}:
nixosLib.runTest (
{ hostPkgs, config, ... }:
{
imports = [
clan-core.modules.nixosVmTest.clanTest
];
hostPkgs = pkgs;
# This tests the compatibility of the inventory
# With the test framework
# - legacy-modules
# - clan.service modules
name = "dummy-inventory-test-from-flake";
clan.test.fromFlake = ./.;
extraPythonPackages = _p: [
clan-core.legacyPackages.${hostPkgs.system}.setupNixInNixPythonPackage
];
testScript =
{ nodes, ... }:
''
from setup_nix_in_nix import setup_nix_in_nix # type: ignore[import-untyped]
setup_nix_in_nix()
def run_clan(cmd: list[str], **kwargs) -> str:
import subprocess
clan = "${clan-core.packages.${hostPkgs.system}.clan-cli}/bin/clan"
clan_args = ["--flake", "${config.clan.test.flakeForSandbox}"]
return subprocess.run(
["${hostPkgs.util-linux}/bin/unshare", "--user", "--map-user", "1000", "--map-group", "1000", clan, *cmd, *clan_args],
**kwargs,
check=True,
).stdout
start_all()
admin1.wait_for_unit("multi-user.target")
peer1.wait_for_unit("multi-user.target")
# Provided by the legacy module
print(admin1.succeed("systemctl status dummy-service"))
print(peer1.succeed("systemctl status dummy-service"))
# peer1 should have the 'hello' file
peer1.succeed("cat ${nodes.peer1.clan.core.vars.generators.new-service.files.not-a-secret.path}")
ls_out = peer1.succeed("ls -la ${nodes.peer1.clan.core.vars.generators.new-service.files.a-secret.path}")
# Check that the file is owned by 'nobody'
assert "nobody" in ls_out, f"File is not owned by 'nobody': {ls_out}"
# Check that the file is in the 'users' group
assert "users" in ls_out, f"File is not in the 'users' group: {ls_out}"
# Check that the file is in the '0644' mode
assert "-rw-r--r--" in ls_out, f"File is not in the '0644' mode: {ls_out}"
run_clan(["machines", "list"])
'';
}
)

View File

@@ -0,0 +1,70 @@
{
inputs.clan-core.url = "https://git.clan.lol/clan/clan-core/archive/main.tar.gz";
inputs.nixpkgs.follows = "clan-core/nixpkgs";
outputs =
{ self, clan-core, ... }:
let
# Usage see: https://docs.clan.lol
clan = clan-core.clanLib.buildClan {
inherit self;
inventory =
{ ... }:
{
meta.name = "foo";
machines.peer1 = { };
machines.admin1 = { };
services = {
legacy-module.default = {
roles.peer.machines = [ "peer1" ];
roles.admin.machines = [ "admin1" ];
};
};
instances."test" = {
module.name = "new-service";
roles.peer.machines.peer1 = { };
};
modules = {
legacy-module = ./legacy-module;
};
};
modules.new-service = {
_class = "clan.service";
manifest.name = "new-service";
roles.peer = { };
perMachine = {
nixosModule = {
# This should be generated by:
# nix run .#generate-test-vars -- checks/dummy-inventory-test dummy-inventory-test
clan.core.vars.generators.new-service = {
files.not-a-secret = {
secret = false;
deploy = true;
};
files.a-secret = {
secret = true;
deploy = true;
owner = "nobody";
group = "users";
mode = "0644";
};
script = ''
# This is a dummy script that does nothing
echo -n "not-a-secret" > $out/not-a-secret
echo -n "a-secret" > $out/a-secret
'';
};
};
};
};
};
in
{
# all machines managed by Clan
inherit (clan) nixosConfigurations nixosModules clanInternals;
};
}

View File

@@ -0,0 +1,10 @@
---
description = "Set up dummy-module"
categories = ["System"]
features = [ "inventory" ]
[constraints]
roles.admin.min = 1
roles.admin.max = 1
---

View File

@@ -0,0 +1,5 @@
{
imports = [
../shared.nix
];
}

View File

@@ -0,0 +1,5 @@
{
imports = [
../shared.nix
];
}

View File

@@ -0,0 +1,34 @@
{ config, ... }:
{
systemd.services.dummy-service = {
enable = true;
description = "Dummy service";
wantedBy = [ "multi-user.target" ];
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
};
script = ''
generated_password_path="${config.clan.core.vars.generators.dummy-generator.files.generated-password.path}"
if [ ! -f "$generated_password_path" ]; then
echo "Generated password file not found: $generated_password_path"
exit 1
fi
host_id_path="${config.clan.core.vars.generators.dummy-generator.files.host-id.path}"
if [ ! -e "$host_id_path" ]; then
echo "Host ID file not found: $host_id_path"
exit 1
fi
'';
};
# TODO: add and prompt and make it work in the test framework
clan.core.vars.generators.dummy-generator = {
files.host-id.secret = false;
files.generated-password.secret = true;
script = ''
echo $RANDOM > "$out"/host-id
echo $RANDOM > "$out"/generated-password
'';
};
}

View File

@@ -0,0 +1,6 @@
[
{
"publickey": "age12yt078p9ewxy2sh0a36nxdpgglv8wqqftmj4dkj9rgy5fuyn4p0q5nje9m",
"type": "age"
}
]

View File

@@ -0,0 +1,6 @@
[
{
"publickey": "age12w2ld4vxfyf3hdq2d8la4cu0tye4pq97egvv3me4wary7xkdnq2snh0zx2",
"type": "age"
}
]

View File

@@ -0,0 +1,15 @@
{
"data": "ENC[AES256_GCM,data:GPpsUhSzWPtTP8EUNKsobFXjYqDldhkkIH6hBk11RsDLAGWdhVrwcISGbhsWpYhvAdPKA84DB6Zqyh9lL2bLM9//ybC1kzY20BQ=,iv:NrxMLdedT2FCkUAD00SwsAHchIsxWvqe7BQekWuJcxw=,tag:pMDXcMyHnLF2t3Qhb1KolA==,type:str]",
"sops": {
"age": [
{
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBzb2tWb1ExKzdmUTRzaGVj\nK3cyYTBHZTJwVjM1SzUvbHFiMnVhY05iKzFZCnJTSE1VSVdpcUFLSEJuaE1CZzJD\nWjZxYzN2cUltdThNMVRKU3FIb20vUXMKLS0tIFlHQXRIdnMybDZFUVEzWlQrc1dw\nbUxhZURXblhHd0pka0JIK1FTZEVqdUEKI/rfxQRBc+xGRelhswkJQ9GcZs6lzfgy\nuCxS5JI9npdPLQ/131F3b21+sP5YWqks41uZG+vslM1zQ+BlENNhDw==\n-----END AGE ENCRYPTED FILE-----\n"
}
],
"lastmodified": "2025-05-04T12:44:13Z",
"mac": "ENC[AES256_GCM,data:fWxLHXBWolHVxv6Q7utcy6OVLV13ziswrIYyNKiwy1vsU8i7xvvuGO1HlnE+q43D2WuHR53liKq1UHuf1JMrWzTwZ0PYe+CVugtoEtbR2qu3rK/jAkOyMyhmmHzmf6Rp4ZMCzKgZeC/X2bDKY/z0firHAvjWydEyogutHpvtznM=,iv:OQI3FfkLneqbdztAXVQB3UkHwDPK+0hWu5hZ9m8Oczg=,tag:em6GfS2QHsXs391QKPxfmA==,type:str]",
"unencrypted_suffix": "_unencrypted",
"version": "3.10.2"
}
}

View File

@@ -0,0 +1 @@
../../../users/admin

View File

@@ -0,0 +1,15 @@
{
"data": "ENC[AES256_GCM,data:W3cOkUYL5/YulW2pEISyTlMaA/t7/WBE7BoCdFlqrqgaCL7tG4IV2HgjiPWzIVMs0zvDSaghdEvAIoB4wOf470d1nSWs0/E8SDk=,iv:wXXaZIw3sPY8L/wxsu7+C5v+d3RQRuwxZRP4YLkS8K4=,tag:HeK4okj7O7XDA9JDz2KULw==,type:str]",
"sops": {
"age": [
{
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAxRC83b3dtSVpXcGovNnVs\nTzFka2J2MEFhYkF1ajVrdjMrNUtPWGRObjM4Cm5zSUR5OGw0T0FaL3BaWmR6L29W\nU2syMFIyMUhFRUZpWFpCT28vWko2ZU0KLS0tIFpHK3BjU1V1L0FrMGtwTGFuU3Mz\nRkV5VjI2Vndod202bUR3RWQwNXpmVzQKNk8/y7M62wTIIKqY4r3ZRk5aUCRUfine\n1LUSHMKa2bRe+hR7nS7AF4BGXp03h2UPY0FP5+U5q8XuIj1jfMX8kg==\n-----END AGE ENCRYPTED FILE-----\n"
}
],
"lastmodified": "2025-05-04T12:44:16Z",
"mac": "ENC[AES256_GCM,data:yTkQeFvKrN1+5FP+yInsaRWSAG+ZGG0uWF3+gVRvzJTFxab8kT2XkAMc+4D7SKgcjsmwBBb77GNoAKaKByhZ92UaCfZ2X66i7ZmYUwLM1NVVmm+xiwwjsh7PJXlZO/70anTzd1evtlZse0jEmRnV5Y0F0M6YqXmuwU+qGUJU2F8=,iv:sy6ozhXonWVruaQfa7pdEoV5GkNZR/UbbINKAPbgWeg=,tag:VMruQ1KExmlMR7TsGNgMlg==,type:str]",
"unencrypted_suffix": "_unencrypted",
"version": "3.10.2"
}
}

View File

@@ -0,0 +1 @@
../../../users/admin

View File

@@ -0,0 +1,4 @@
{
"publickey": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg",
"type": "age"
}

View File

@@ -0,0 +1 @@
../../../../../../sops/machines/admin1

View File

@@ -0,0 +1,19 @@
{
"data": "ENC[AES256_GCM,data:T8edCvw=,iv:7/G5xt5fv38I9uFzk7WMIr9xQdz/6lFxqOC+18HBg8Q=,tag:F39Cxbgmzml+lZLsZ59Kmg==,type:str]",
"sops": {
"age": [
{
"recipient": "age12yt078p9ewxy2sh0a36nxdpgglv8wqqftmj4dkj9rgy5fuyn4p0q5nje9m",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBPNUhiYkZWK3dPMHNiRTVM\nRHNvaHFsOFp1c0UxQitwVG0zY01MNDZRV1E4CjEybENoTVIzN29vQ3FtUTRSYmFU\nNXIzQllVSllXRGN2M1B6WXJLdHZSajgKLS0tIDllZ0ZmZUcxMHhDQUpUOEdWbmkv\neUQweHArYTdFSmNteVpuQ3BKdnh0Y0UKs8Hm3D+rXRRfpUVSZM3zYjs6b9z8g10D\nGTkvreUMim4CS22pjdQ3eNA9TGeDXfWXE7XzwXLCb+wVcf7KwbDmvg==\n-----END AGE ENCRYPTED FILE-----\n"
},
{
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBKSDhpT3cvck9PenZYVEZH\ndFQreVRBdG93L1dBUGlvYjFWcDlHWUJsZUVBCm9DMTJ4UytiYzlEVHNWdUcwS1ds\nT0dhbzAzNDdmbDBCU0dvL2xNeHpXcGsKLS0tIFArbmpsbzU3WnpJdUt1MGN0L1d0\nV1JkTDJYWUxsbmhTQVNOeVRaSUhTODQKk9Vph2eldS5nwuvVX0SCsxEm4B+sO76Z\ndIjJ3OQxzoZmXMaOOuKHC5U0Y75Qn7eXC43w5KHsl2CMIUYsBGJOZw==\n-----END AGE ENCRYPTED FILE-----\n"
}
],
"lastmodified": "2025-05-04T12:44:14Z",
"mac": "ENC[AES256_GCM,data:6fKrS1eLLUWlHkQpxLFXBRk6f2wa5ADLMViVvYXXGU24ayl9UuNSKrCRHp9cbzhqhti3HdwyNt6TM+2X6qhiiAQanKEB2PF7JRYX74NfNKil9BEDjt5AqqtpSgVv5l7Ku/uSHaPkd2sDmzHsy5Q4bSGxJQokStk1kidrwle+mbc=,iv:I/Aad82L/TCxStM8d8IZICUrwdjRbGx2fuGWqexr21o=,tag:BfgRbGUxhPZzK2fLik1kxA==,type:str]",
"unencrypted_suffix": "_unencrypted",
"version": "3.10.2"
}
}

View File

@@ -0,0 +1 @@
../../../../../../sops/machines/peer1

View File

@@ -0,0 +1,19 @@
{
"data": "ENC[AES256_GCM,data:vp0yW0Gt,iv:FO2cy+UpEl5aRay/LUGu//c82QiVxuKuGSaVh0rGJvc=,tag:vf2RAOPpcRW0HwxHoGy17A==,type:str]",
"sops": {
"age": [
{
"recipient": "age12w2ld4vxfyf3hdq2d8la4cu0tye4pq97egvv3me4wary7xkdnq2snh0zx2",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBjaFVNMEd2YUxpSm5XVVRi\nY2ZUc3NTOStJUFNMWWVPQTgxZ2tCK1QrMW1ZCjYwMlA4dkIzSlc0TGtvZjcyK3Bi\nM3pob2JOOFUyeVJ6M2JpaTRCZlc1R0kKLS0tIDJMb1dFcVRWckhwYWNCQng0RlFO\nTkw3OGt4dkFIZVY5aVEzZE5mMzJSM0EKUv8bUqg48L2FfYVUVlpXvyZvPye699of\nG6PcjLh1ZMbNCfnsCzr+P8Vdk/F4J/ifxL66lRGfu2xOLxwciwQ+5Q==\n-----END AGE ENCRYPTED FILE-----\n"
},
{
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBnZ2dDbVhoQngxM3lTSmZF\nUTAwS1lCTGhEMU1GVXpFUzlIUFdqZy9LajF3Ck9mdVpBRjlyVUNhZXZIUFZjUzF1\nNlhFN28vNmwzcUVkNmlzUnpkWjJuZE0KLS0tIHpXVHVlNk9vU1ZPTGRrYStWbmRO\nbDM4U2o1SlEwYWtqOXBqd3BFUTAvMHcKkI8UVd0v+x+ELZ5CoGq9DzlA6DnVNU2r\nrV9wLfbFd7RHxS0/TYZh5tmU42nO3iMYA9FqERQXCtZgXS9KvfqHwQ==\n-----END AGE ENCRYPTED FILE-----\n"
}
],
"lastmodified": "2025-05-04T12:44:18Z",
"mac": "ENC[AES256_GCM,data:1ZZ+ZI1JsHmxTov1bRijfol3kTkyheg2o3ivLsMHRhCmScsUry97hQJchF78+y2Izt7avaQEHYn6pVbYt/0rLrSYD7Ru7ITVxXoYHOiN5Qb98masUzpibZjrdyg5nO+LW5/Hmmwsc3yn/+o3IH1AUYpsxlJRdnHHCmoSOFaiFFM=,iv:OQlgmpOTw4ljujNzqwQ5/0Mz8pQpCSUtqRvj3FJAxDs=,tag:foZvdeW7gK9ZVKkWqnlxGA==,type:str]",
"unencrypted_suffix": "_unencrypted",
"version": "3.10.2"
}
}

View File

@@ -0,0 +1 @@
../../../../../../sops/users/admin

View File

@@ -0,0 +1 @@
../../../../../../sops/machines/peer1

View File

@@ -0,0 +1,19 @@
{
"data": "ENC[AES256_GCM,data:prFl0EJy8bM=,iv:zITWxf+6Ebk0iB5vhhd7SBQa1HFrIJXm8xpSM+D9I0M=,tag:NZCRMCs1SzNKLBu/KUDKMQ==,type:str]",
"sops": {
"age": [
{
"recipient": "age12w2ld4vxfyf3hdq2d8la4cu0tye4pq97egvv3me4wary7xkdnq2snh0zx2",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB0S0RZRWxaZVZvTUhjdWVL\naU9WZmtEcm1qa2JsRmdvdmZmNENMaWFEVUFRCmdoVnRXSGlpRlFjNmVVbDJ5VnFT\nMnVJUlVnM3lxNmZCRTdoRVJ4NW1oYWcKLS0tIFFNbXBFUk1RWnlUTW1SeG1vYzlM\nVVpEclFVOE9PWWQxVkZ0eEgwWndoRWcKDAOHe+FIxqGsc6LhxMy164qjwG6t2Ei2\nP0FSs+bcKMDpudxeuxCjnDm/VoLxOWeuqkB+9K2vSm2W/c/fHTSbrA==\n-----END AGE ENCRYPTED FILE-----\n"
},
{
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB2VU5jOEpwYUtDVEVFcVpU\nQkExTVZ3ejZHcGo5TG8zdUQwNktoV09WdUZvCmQ0dE1TOWRFbTlxdVd4WWRxd3VF\nQUNTTkNNT3NKYjQ5dEJDY0xVZ3pZVUUKLS0tIDFjajRZNFJZUTdNeS8yN05FMFZU\ncEtjRjhRbGE0MnRLdk10NkFLMkxqencKGzJ66dHluIghH04RV/FccfEQP07yqnfb\n25Hi0XIVJfXBwje4UEyszrWTxPPwVXdQDQmoNKf76Qy2jYqJ56uksw==\n-----END AGE ENCRYPTED FILE-----\n"
}
],
"lastmodified": "2025-05-04T12:44:20Z",
"mac": "ENC[AES256_GCM,data:FIkilsni5kOdNlVwDuLsQ/zExypHRWdqIBQDNWMLTwe8OrsNPkX+KYutUvt9GaSoGv4iDULaMRoizO/OZUNfc2d8XYSdj0cxOG1Joov4GPUcC/UGyNuQneAejZBKolvlnidKZArofnuK9g+lOTANEUtEXUTnx8L+VahqPZayQas=,iv:NAo6sT3L8OOB3wv1pjr3RY2FwXgVmZ4N0F4BEX4YPUY=,tag:zHwmXygyvkdpASZCodQT9Q==,type:str]",
"unencrypted_suffix": "_unencrypted",
"version": "3.10.2"
}
}

View File

@@ -0,0 +1 @@
../../../../../../sops/users/admin

View File

@@ -1,93 +1,96 @@
{
pkgs,
self,
clanLib,
nixosLib,
clan-core,
...
}:
clanLib.test.makeTestClan {
inherit pkgs self;
nixosTest = (
{ ... }:
{
# This tests the compatibility of the inventory
# With the test framework
# - legacy-modules
# - clan.service modules
name = "dummy-inventory-test";
nixosLib.runTest (
{ ... }:
{
imports = [
clan-core.modules.nixosVmTest.clanTest
];
clan = {
directory = ./.;
inventory = {
machines.peer1 = { };
machines.admin1 = { };
services = {
legacy-module.default = {
roles.peer.machines = [ "peer1" ];
roles.admin.machines = [ "admin1" ];
};
};
hostPkgs = pkgs;
instances."test" = {
module.name = "new-service";
roles.peer.machines.peer1 = { };
};
# This tests the compatibility of the inventory
# With the test framework
# - legacy-modules
# - clan.service modules
name = "dummy-inventory-test";
modules = {
legacy-module = ./legacy-module;
clan = {
directory = ./.;
inventory = {
machines.peer1 = { };
machines.admin1 = { };
services = {
legacy-module.default = {
roles.peer.machines = [ "peer1" ];
roles.admin.machines = [ "admin1" ];
};
};
modules.new-service = {
_class = "clan.service";
manifest.name = "new-service";
roles.peer = { };
perMachine = {
nixosModule = {
# This should be generated by:
# nix run .#generate-test-vars -- checks/dummy-inventory-test dummy-inventory-test
clan.core.vars.generators.new-service = {
files.not-a-secret = {
secret = false;
deploy = true;
};
files.a-secret = {
secret = true;
deploy = true;
owner = "nobody";
group = "users";
mode = "0644";
};
script = ''
# This is a dummy script that does nothing
echo -n "not-a-secret" > $out/not-a-secret
echo -n "a-secret" > $out/a-secret
'';
instances."test" = {
module.name = "new-service";
roles.peer.machines.peer1 = { };
};
modules = {
legacy-module = ./legacy-module;
};
};
modules.new-service = {
_class = "clan.service";
manifest.name = "new-service";
roles.peer = { };
perMachine = {
nixosModule = {
# This should be generated by:
# nix run .#generate-test-vars -- checks/dummy-inventory-test dummy-inventory-test
clan.core.vars.generators.new-service = {
files.not-a-secret = {
secret = false;
deploy = true;
};
files.a-secret = {
secret = true;
deploy = true;
owner = "nobody";
group = "users";
mode = "0644";
};
script = ''
# This is a dummy script that does nothing
echo -n "not-a-secret" > $out/not-a-secret
echo -n "a-secret" > $out/a-secret
'';
};
};
};
};
};
testScript =
{ nodes, ... }:
''
start_all()
admin1.wait_for_unit("multi-user.target")
peer1.wait_for_unit("multi-user.target")
# Provided by the legacy module
print(admin1.succeed("systemctl status dummy-service"))
print(peer1.succeed("systemctl status dummy-service"))
testScript =
{ nodes, ... }:
''
start_all()
admin1.wait_for_unit("multi-user.target")
peer1.wait_for_unit("multi-user.target")
# Provided by the legacy module
print(admin1.succeed("systemctl status dummy-service"))
print(peer1.succeed("systemctl status dummy-service"))
# peer1 should have the 'hello' file
peer1.succeed("cat ${nodes.peer1.clan.core.vars.generators.new-service.files.not-a-secret.path}")
# peer1 should have the 'hello' file
peer1.succeed("cat ${nodes.peer1.clan.core.vars.generators.new-service.files.not-a-secret.path}")
ls_out = peer1.succeed("ls -la ${nodes.peer1.clan.core.vars.generators.new-service.files.a-secret.path}")
# Check that the file is owned by 'nobody'
assert "nobody" in ls_out, f"File is not owned by 'nobody': {ls_out}"
# Check that the file is in the 'users' group
assert "users" in ls_out, f"File is not in the 'users' group: {ls_out}"
# Check that the file is in the '0644' mode
assert "-rw-r--r--" in ls_out, f"File is not in the '0644' mode: {ls_out}"
'';
}
);
}
ls_out = peer1.succeed("ls -la ${nodes.peer1.clan.core.vars.generators.new-service.files.a-secret.path}")
# Check that the file is owned by 'nobody'
assert "nobody" in ls_out, f"File is not owned by 'nobody': {ls_out}"
# Check that the file is in the 'users' group
assert "users" in ls_out, f"File is not in the 'users' group: {ls_out}"
# Check that the file is in the '0644' mode
assert "-rw-r--r--" in ls_out, f"File is not in the '0644' mode: {ls_out}"
'';
}
)

View File

@@ -4,6 +4,7 @@ let
filter
pathExists
;
nixosLib = import (self.inputs.nixpkgs + "/nixos/lib") { };
in
{
imports = filter pathExists [
@@ -29,19 +30,18 @@ in
let
nixosTestArgs = {
# reference to nixpkgs for the current system
inherit pkgs lib;
inherit pkgs lib nixosLib;
# this gives us a reference to our flake but also all flake inputs
inherit self;
inherit (self) clanLib;
clan-core = self;
};
nixosTests =
lib.optionalAttrs (pkgs.stdenv.isLinux) {
# Deltachat is currently marked as broken
# deltachat = import ./deltachat nixosTestArgs;
# Base Tests
secrets = self.clanLib.test.baseTest ./secrets nixosTestArgs;
borgbackup = self.clanLib.test.baseTest ./borgbackup nixosTestArgs;
borgbackup-legacy = self.clanLib.test.baseTest ./borgbackup-legacy nixosTestArgs;
wayland-proxy-virtwl = self.clanLib.test.baseTest ./wayland-proxy-virtwl nixosTestArgs;
# Container Tests
@@ -50,11 +50,9 @@ in
matrix-synapse = self.clanLib.test.containerTest ./matrix-synapse nixosTestArgs;
postgresql = self.clanLib.test.containerTest ./postgresql nixosTestArgs;
# Clan Tests
dummy-inventory-test = import ./dummy-inventory-test nixosTestArgs;
admin = import ./admin nixosTestArgs;
dummy-inventory-test-from-flake = import ./dummy-inventory-test-from-flake nixosTestArgs;
data-mesher = import ./data-mesher nixosTestArgs;
syncthing = import ./syncthing nixosTestArgs;
}
// lib.optionalAttrs (pkgs.stdenv.hostPlatform.system == "aarch64-linux") {
# for some reason this hangs in an odd place in CI, but it works on my machine ...

View File

@@ -1,130 +1,132 @@
{
pkgs,
self,
clanLib,
nixosLib,
clan-core,
lib,
...
}:
clanLib.test.makeTestClan {
inherit pkgs self;
# TODO: container driver does not support: sleep, wait_for_window, send_chars, wait_for_text
useContainers = false;
nixosTest = (
{ lib, ... }:
let
common =
{ pkgs, modulesPath, ... }:
{
imports = [
(modulesPath + "/../tests/common/x11.nix")
];
nixosLib.runTest (
{ ... }:
let
machines = [
"peer1"
"peer2"
];
in
{
imports = [
clan-core.modules.nixosVmTest.clanTest
];
clan.services.mumble.user = "alice";
environment.systemPackages = [ pkgs.killall ];
};
machines = [
"peer1"
"peer2"
];
in
{
name = "mumble";
hostPkgs = pkgs;
clan = {
directory = ./.;
inventory = {
machines = lib.genAttrs machines (_: { });
services = {
mumble.default = {
roles.server.machines = machines;
};
name = "mumble";
defaults =
{ pkgs, modulesPath, ... }:
{
imports = [
(modulesPath + "/../tests/common/x11.nix")
];
clan.services.mumble.user = "alice";
environment.systemPackages = [ pkgs.killall ];
};
clan = {
directory = ./.;
# TODO: container driver does not support: sleep, wait_for_window, send_chars, wait_for_text
test.useContainers = false;
inventory = {
machines = lib.genAttrs machines (_: { });
services = {
mumble.default = {
roles.server.machines = machines;
};
};
};
};
enableOCR = true;
enableOCR = true;
nodes.peer1 = common;
nodes.peer2 = common;
testScript = ''
import time
import re
testScript = ''
import time
import re
def machine_has_text(machine: Machine, regex: str) -> bool:
variants = machine.get_screen_text_variants()
# for debugging
# machine.screenshot(f"/tmp/{machine.name}.png")
for text in variants:
print(f"Expecting '{regex}' in '{text}'")
if re.search(regex, text) is not None:
return True
return False
def machine_has_text(machine: Machine, regex: str) -> bool:
variants = machine.get_screen_text_variants()
# for debugging
# machine.screenshot(f"/tmp/{machine.name}.png")
for text in variants:
print(f"Expecting '{regex}' in '{text}'")
if re.search(regex, text) is not None:
return True
return False
start_all()
start_all()
with subtest("Waiting for x"):
peer1.wait_for_x()
peer2.wait_for_x()
with subtest("Waiting for x"):
peer1.wait_for_x()
peer2.wait_for_x()
with subtest("Waiting for murmur"):
peer1.wait_for_unit("murmur.service")
peer2.wait_for_unit("murmur.service")
with subtest("Waiting for murmur"):
peer1.wait_for_unit("murmur.service")
peer2.wait_for_unit("murmur.service")
with subtest("Starting Mumble"):
# starting mumble is blocking
peer1.execute("mumble >&2 &")
peer2.execute("mumble >&2 &")
with subtest("Starting Mumble"):
# starting mumble is blocking
peer1.execute("mumble >&2 &")
peer2.execute("mumble >&2 &")
with subtest("Wait for Mumble"):
peer1.wait_for_window(r"Mumble")
peer2.wait_for_window(r"Mumble")
with subtest("Wait for Mumble"):
peer1.wait_for_window(r"Mumble")
peer2.wait_for_window(r"Mumble")
with subtest("Wait for certificate creation"):
peer1.wait_for_window(r"Mumble")
peer2.wait_for_window(r"Mumble")
with subtest("Wait for certificate creation"):
peer1.wait_for_window(r"Mumble")
peer2.wait_for_window(r"Mumble")
for i in range(20):
time.sleep(1)
peer1.send_chars("\n")
peer1.send_chars("\n")
peer2.send_chars("\n")
peer2.send_chars("\n")
if machine_has_text(peer1, r"Mumble Server Connect") and \
machine_has_text(peer2, r"Mumble Server Connect"):
break
else:
raise Exception("Timeout waiting for certificate creation")
for i in range(20):
time.sleep(1)
peer1.send_chars("\n")
peer1.send_chars("\n")
peer2.send_chars("\n")
peer2.send_chars("\n")
if machine_has_text(peer1, r"Mumble Server Connect") and \
machine_has_text(peer2, r"Mumble Server Connect"):
break
else:
raise Exception("Timeout waiting for certificate creation")
with subtest("Check validity of server certificates"):
peer1.execute("killall .mumble-wrapped")
peer1.sleep(1)
peer1.execute("mumble mumble://peer2 >&2 &")
peer1.wait_for_window(r"Mumble")
with subtest("Check validity of server certificates"):
peer1.execute("killall .mumble-wrapped")
peer1.sleep(1)
peer1.execute("mumble mumble://peer2 >&2 &")
peer1.wait_for_window(r"Mumble")
for i in range(20):
time.sleep(1)
peer1.send_chars("\n")
peer1.send_chars("\n")
if machine_has_text(peer1, "Connected."):
break
else:
raise Exception("Timeout waiting for certificate creation")
for i in range(20):
time.sleep(1)
peer1.send_chars("\n")
peer1.send_chars("\n")
if machine_has_text(peer1, "Connected."):
break
else:
raise Exception("Timeout waiting for certificate creation")
peer2.execute("killall .mumble-wrapped")
peer2.sleep(1)
peer2.execute("mumble mumble://peer1 >&2 &")
peer2.wait_for_window(r"Mumble")
peer2.execute("killall .mumble-wrapped")
peer2.sleep(1)
peer2.execute("mumble mumble://peer1 >&2 &")
peer2.wait_for_window(r"Mumble")
for i in range(20):
time.sleep(1)
peer2.send_chars("\n")
peer2.send_chars("\n")
if machine_has_text(peer2, "Connected."):
break
else:
raise Exception("Timeout waiting for certificate creation")
'';
}
);
}
for i in range(20):
time.sleep(1)
peer2.send_chars("\n")
peer2.send_chars("\n")
if machine_has_text(peer2, "Connected."):
break
else:
raise Exception("Timeout waiting for certificate creation")
'';
}
)

View File

@@ -0,0 +1,53 @@
{
pkgs,
nixosLib,
clan-core,
...
}:
nixosLib.runTest (
{ ... }:
{
imports = [
clan-core.modules.nixosVmTest.clanTest
];
hostPkgs = pkgs;
name = "mycelium";
clan = {
test.useContainers = false;
directory = ./.;
modules."@clan/mycelium" = ../../clanServices/mycelium/default.nix;
inventory = {
machines.server = { };
instances = {
mycelium-test = {
module.name = "@clan/mycelium";
roles.peer.machines."server".settings = {
openFirewall = true;
addHostedPublicNodes = true;
};
};
};
};
};
nodes = {
server = { };
};
testScript = ''
start_all()
# Check that mycelium service is running
server.wait_for_unit("mycelium")
server.succeed("systemctl status mycelium")
# Check that mycelium is listening on its default port
server.wait_until_succeeds("${pkgs.iproute2}/bin/ss -tulpn | grep -q 'mycelium'", 10)
'';
}
)

View File

@@ -0,0 +1,6 @@
[
{
"publickey": "age122lc4fvw2p22gcvwqeme5k49qxtjanqkl2xvr6qvf3r0zyh7scuqz28cam",
"type": "age"
}
]

View File

@@ -0,0 +1,15 @@
{
"data": "ENC[AES256_GCM,data:hLJS+CJllYM50KxKuiYamxBLGd9lwoeIFapP9mZAlVGH5DSenylcKUfsphxafASoB516qns2DznBoS9mWqg9uTsRZjk4WlR3x6A=,iv:uRiIpUKIiV3riNcBAWUqhZbE+Vb7lLMfU0C/TClVZ6M=,tag:4+nsMssiSyq9Iv7sDuWmoQ==,type:str]",
"sops": {
"age": [
{
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBPUWFOMzluRmdOQXBmRjRN\ncXNSUlB5Z0t6dWYxNVkvMmhrN1FDdmxHcTNJCkhPL3BYMFFXMmU5ZGRqOC9KWEgv\nSHB5OUJqTk5Dd0tDTks1R1ZhYktrLzgKLS0tIHJIMlFRVWphZXlISmR3VUJKUjNk\ndWF4eCt6UHBrSndBay95RVJ3dldiaFkKCgYqrt0aCGRTaHycBoeqv/zeByu2ZZ3Z\nVfgxnD9liIQkS2wERbpk0/Yq9wkKgVxj+DZoWwHYhP0eKCw2UOorCA==\n-----END AGE ENCRYPTED FILE-----\n"
}
],
"lastmodified": "2025-06-04T11:54:59Z",
"mac": "ENC[AES256_GCM,data:xoeOz7FRCPJ18UTsfbY1x/N65pxbTsehT9Kv3MgEd6NQJn6FTvquaj3HEZ0KvIzStBz1FNOhSql9CZUFc4StYps05EbX61MMMnz6Nlj3xcTwuVQFabGoinxcXbCDSA+tAW7VqzVxumj6FMDg+r77gdcIApZjGJg4Z9ws2RZd3u4=,iv:U8IUDwmfg8Umob9mtKgGaKoIY4SKNL895BABJxzx5n8=,tag:tnMCx6D/17ZYgI6SgNS29A==,type:str]",
"unencrypted_suffix": "_unencrypted",
"version": "3.10.2"
}
}

View File

@@ -0,0 +1 @@
../../../users/admin

View File

@@ -0,0 +1,4 @@
{
"publickey": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg",
"type": "age"
}

View File

@@ -0,0 +1 @@
52d:87c1:4222:b550:ee01:a7ae:254:5a66

View File

@@ -0,0 +1,19 @@
{
"data": "ENC[AES256_GCM,data:DGzl2G4H+NkwXq0fCUQS0+8FG1x9xoIsYvAgUxP4Qp8=,iv:CXOJVgYNthVOZ4vbdI3n4KLXSFVemzaoEnRGMC+m0i8=,tag:/u+pV3xWpUq0ZtAm6LKuGQ==,type:str]",
"sops": {
"age": [
{
"recipient": "age122lc4fvw2p22gcvwqeme5k49qxtjanqkl2xvr6qvf3r0zyh7scuqz28cam",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBZZHZjdXMwclBTeGthcGpM\nV1ArVy83akNHNEpXVFhoR1FWNlJUeHNKTW00CjJFTFZneFNrL0hDMXJpaTQ2M1ln\nTmdPMGhzeUp0NU55QnhCZEU2QVk1OG8KLS0tIDFhQmJhOHJsTjhYNEhITEw0WFgy\nWC9pTi9od0wyMWtZRVZJYWo0Nmo5SHMKDohnAAfrnGOiw55huMme2EEWE53N/feS\nutvbiTZh1ECHCi/uoK757fjnJ/WrQMSxUpctT9I8bpJRtbTqkx3XRw==\n-----END AGE ENCRYPTED FILE-----\n"
},
{
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBZeTZENGFpWndDbmdsWDRw\nMTBCVXg5Zkg2a2s5Yk1HSERIVlVQRXdUSUNnCnREbno0dEN0ZEgvOFNMRG1ReGx4\na0h1YUFuMkxBZXJUTE9xOUVUMitEalkKLS0tIFZMZ21qclRqUFR0dlAyMFkzdUNX\nNjRLTWVRVWtHSDlDakEzMmpRVWkyc0EKabm8mTKJVxQNTaIgU+8rb/xk9Dpg+Zjz\nb+wgD0+TlARlenMtIub8Y6N06ENOc20oovylfu+g7xV+EkvRPCd6tA==\n-----END AGE ENCRYPTED FILE-----\n"
}
],
"lastmodified": "2025-06-04T11:55:02Z",
"mac": "ENC[AES256_GCM,data:UIBaD/3mACgFzkajkFXz3oKai8IxpYQriR2t0mc5fL92P5ECloxCobY386TDZYOEVrDJ45Bw+IzqZbsCx/G9f1xCCTR2JvqygxYIsK3TpQPsboJzb9Cz3dBNBCXGboVykcg/NobEMaJBw1xtdAQBhuo8S7ymIuOPtGz0vPFJkf8=,iv:g0YAOBsRpgAOikKDMJDyOtcVx+0QwetfA8R6wQFH7lY=,tag:sfdFLjtiqFHdP/Qe1suBBQ==,type:str]",
"unencrypted_suffix": "_unencrypted",
"version": "3.10.2"
}
}

View File

@@ -0,0 +1 @@
../../../../../../sops/users/admin

View File

@@ -0,0 +1 @@
2125c6b039374467eaa3eaf552bd3e97f434d16006433cfbba3e6823c958b728

View File

@@ -1,83 +1,87 @@
{
pkgs,
self,
clanLib,
nixosLib,
clan-core,
lib,
...
}:
clanLib.test.makeTestClan {
inherit pkgs self;
# TODO: container driver does not support wait_for_file() yet
useContainers = false;
nixosTest = (
{ lib, ... }:
{
name = "syncthing";
nixosLib.runTest (
{ ... }:
{
imports = [
clan-core.modules.nixosVmTest.clanTest
];
clan = {
directory = ./.;
inventory = {
machines = lib.genAttrs [
"introducer"
"peer1"
"peer2"
] (_: { });
services = {
syncthing.default = {
roles.peer.machines = [
"peer1"
"peer2"
];
roles.introducer.machines = [ "introducer" ];
hostPkgs = pkgs;
name = "syncthing";
clan = {
directory = ./.;
# TODO: container driver does not support wait_for_file() yet
test.useContainers = false;
inventory = {
machines = lib.genAttrs [
"introducer"
"peer1"
"peer2"
] (_: { });
services = {
syncthing.default = {
roles.peer.machines = [
"peer1"
"peer2"
];
roles.introducer.machines = [ "introducer" ];
};
};
};
};
nodes.introducer = {
# Doesn't test zerotier!
services.syncthing.openDefaultPorts = true;
services.syncthing.settings.folders = {
"Shared" = {
enable = true;
path = "~/Shared";
versioning = {
type = "trashcan";
params = {
cleanoutDays = "30";
};
};
};
};
clan.syncthing.autoAcceptDevices = true;
clan.syncthing.autoShares = [ "Shared" ];
# For faster Tests
systemd.timers.syncthing-auto-accept.timerConfig = {
OnActiveSec = 1;
OnUnitActiveSec = 1;
};
};
nodes.peer1 = {
services.syncthing.openDefaultPorts = true;
};
nodes.peer2 = {
services.syncthing.openDefaultPorts = true;
};
nodes.introducer = {
# Doesn't test zerotier!
services.syncthing.openDefaultPorts = true;
services.syncthing.settings.folders = {
"Shared" = {
enable = true;
path = "~/Shared";
versioning = {
type = "trashcan";
params = {
cleanoutDays = "30";
};
};
};
};
clan.syncthing.autoAcceptDevices = true;
clan.syncthing.autoShares = [ "Shared" ];
# For faster Tests
systemd.timers.syncthing-auto-accept.timerConfig = {
OnActiveSec = 1;
OnUnitActiveSec = 1;
};
};
nodes.peer1 = {
services.syncthing.openDefaultPorts = true;
};
nodes.peer2 = {
services.syncthing.openDefaultPorts = true;
};
testScript = ''
start_all()
introducer.wait_for_unit("syncthing")
peer1.wait_for_unit("syncthing")
peer2.wait_for_unit("syncthing")
peer1.execute("ls -la /var/lib/syncthing")
peer2.execute("ls -la /var/lib/syncthing")
peer1.wait_for_file("/var/lib/syncthing/Shared")
peer2.wait_for_file("/var/lib/syncthing/Shared")
introducer.shutdown()
peer1.execute("echo hello > /var/lib/syncthing/Shared/hello")
peer2.wait_for_file("/var/lib/syncthing/Shared/hello")
out = peer2.succeed("cat /var/lib/syncthing/Shared/hello")
assert "hello" in out
'';
}
);
}
testScript = ''
start_all()
introducer.wait_for_unit("syncthing")
peer1.wait_for_unit("syncthing")
peer2.wait_for_unit("syncthing")
peer1.execute("ls -la /var/lib/syncthing")
peer2.execute("ls -la /var/lib/syncthing")
peer1.wait_for_file("/var/lib/syncthing/Shared")
peer2.wait_for_file("/var/lib/syncthing/Shared")
introducer.shutdown()
peer1.execute("echo hello > /var/lib/syncthing/Shared/hello")
peer2.wait_for_file("/var/lib/syncthing/Shared/hello")
out = peer2.succeed("cat /var/lib/syncthing/Shared/hello")
assert "hello" in out
'';
}
)

View File

@@ -1,7 +1,7 @@
---
description = "Set up automatic upgrades"
categories = ["System"]
features = [ "inventory" ]
features = [ "inventory", "deprecated" ]
---
Whether to periodically upgrade NixOS to the latest version. If enabled, a

View File

@@ -1,7 +1,7 @@
---
description = "Efficient, deduplicating backup program with optional compression and secure encryption."
categories = ["System"]
features = [ "inventory" ]
features = [ "inventory", "deprecated" ]
---
BorgBackup (short: Borg) gives you:

View File

@@ -106,7 +106,8 @@ in
systemd.services = lib.mapAttrs' (
_: dest:
lib.nameValuePair "borgbackup-job-${dest.name}" {
# since borgbackup mounts the system read-only, we need to run in a ExecStartPre script, so we can generate additional files.
# since borgbackup mounts the system read-only, we need to run in a
# ExecStartPre script, so we can generate additional files.
serviceConfig.ExecStartPre = [
''+${pkgs.writeShellScript "borgbackup-job-${dest.name}-pre-backup-commands" preBackupScript}''
];

View File

@@ -45,7 +45,7 @@ in
else
lib.warn ''
Machine ${machine} does not have a borgbackup key at ${fullPath},
run `clan var generate ${machine}` to generate it.
run `clan vars generate ${machine}` to generate it.
'' null
) allClients;

View File

@@ -1,5 +1,7 @@
---
description = "Email-based instant messaging for Desktop."
categories = ["Social"]
features = [ "inventory", "deprecated" ]
---
!!! info

View File

@@ -1,143 +1,3 @@
{ config, pkgs, ... }:
{
networking.firewall.interfaces."zt+".allowedTCPPorts = [ 25 ]; # smtp with other hosts
environment.systemPackages = [ pkgs.deltachat-desktop ];
services.maddy =
let
domain = "${config.clan.core.settings.machine.name}.local";
in
{
enable = true;
primaryDomain = domain;
config = ''
# Minimal configuration with TLS disabled, adapted from upstream example
# configuration here https://github.com/foxcpp/maddy/blob/master/maddy.conf
# Do not use this in unencrypted networks!
auth.pass_table local_authdb {
table sql_table {
driver sqlite3
dsn credentials.db
table_name passwords
}
}
storage.imapsql local_mailboxes {
driver sqlite3
dsn imapsql.db
}
table.chain local_rewrites {
optional_step regexp "(.+)\+(.+)@(.+)" "$1@$3"
optional_step static {
entry postmaster postmaster@$(primary_domain)
}
optional_step file /etc/maddy/aliases
}
msgpipeline local_routing {
destination postmaster $(local_domains) {
modify {
replace_rcpt &local_rewrites
}
deliver_to &local_mailboxes
}
default_destination {
reject 550 5.1.1 "User doesn't exist"
}
}
smtp tcp://[::]:25 {
limits {
all rate 20 1s
all concurrency 10
}
dmarc yes
check {
require_mx_record
dkim
spf
}
source $(local_domains) {
reject 501 5.1.8 "Use Submission for outgoing SMTP"
}
default_source {
destination postmaster $(local_domains) {
deliver_to &local_routing
}
default_destination {
reject 550 5.1.1 "User doesn't exist"
}
}
}
submission tcp://[::1]:587 {
limits {
all rate 50 1s
}
auth &local_authdb
source $(local_domains) {
check {
authorize_sender {
prepare_email &local_rewrites
user_to_email identity
}
}
destination postmaster $(local_domains) {
deliver_to &local_routing
}
default_destination {
modify {
dkim $(primary_domain) $(local_domains) default
}
deliver_to &remote_queue
}
}
default_source {
reject 501 5.1.8 "Non-local sender domain"
}
}
target.remote outbound_delivery {
limits {
destination rate 20 1s
destination concurrency 10
}
mx_auth {
dane
mtasts {
cache fs
fs_dir mtasts_cache/
}
local_policy {
min_tls_level encrypted
min_mx_level none
}
}
}
target.queue remote_queue {
target &outbound_delivery
autogenerated_msg_domain $(primary_domain)
bounce {
destination postmaster $(local_domains) {
deliver_to &local_routing
}
default_destination {
reject 550 5.0.0 "Refusing to send DSNs to non-local addresses"
}
}
}
imap tcp://[::1]:143 {
auth &local_authdb
storage &local_mailboxes
}
'';
ensureAccounts = [ "user@${domain}" ];
ensureCredentials = {
"user@${domain}".passwordFile = pkgs.writeText "dummy" "foobar";
};
};
imports = [ ./roles/default.nix ];
}

View File

@@ -0,0 +1,143 @@
{ config, pkgs, ... }:
{
networking.firewall.interfaces."zt+".allowedTCPPorts = [ 25 ]; # smtp with other hosts
environment.systemPackages = [ pkgs.deltachat-desktop ];
services.maddy =
let
domain = "${config.clan.core.settings.machine.name}.local";
in
{
enable = true;
primaryDomain = domain;
config = ''
# Minimal configuration with TLS disabled, adapted from upstream example
# configuration here https://github.com/foxcpp/maddy/blob/master/maddy.conf
# Do not use this in unencrypted networks!
auth.pass_table local_authdb {
table sql_table {
driver sqlite3
dsn credentials.db
table_name passwords
}
}
storage.imapsql local_mailboxes {
driver sqlite3
dsn imapsql.db
}
table.chain local_rewrites {
optional_step regexp "(.+)\+(.+)@(.+)" "$1@$3"
optional_step static {
entry postmaster postmaster@$(primary_domain)
}
optional_step file /etc/maddy/aliases
}
msgpipeline local_routing {
destination postmaster $(local_domains) {
modify {
replace_rcpt &local_rewrites
}
deliver_to &local_mailboxes
}
default_destination {
reject 550 5.1.1 "User doesn't exist"
}
}
smtp tcp://[::]:25 {
limits {
all rate 20 1s
all concurrency 10
}
dmarc yes
check {
require_mx_record
dkim
spf
}
source $(local_domains) {
reject 501 5.1.8 "Use Submission for outgoing SMTP"
}
default_source {
destination postmaster $(local_domains) {
deliver_to &local_routing
}
default_destination {
reject 550 5.1.1 "User doesn't exist"
}
}
}
submission tcp://[::1]:587 {
limits {
all rate 50 1s
}
auth &local_authdb
source $(local_domains) {
check {
authorize_sender {
prepare_email &local_rewrites
user_to_email identity
}
}
destination postmaster $(local_domains) {
deliver_to &local_routing
}
default_destination {
modify {
dkim $(primary_domain) $(local_domains) default
}
deliver_to &remote_queue
}
}
default_source {
reject 501 5.1.8 "Non-local sender domain"
}
}
target.remote outbound_delivery {
limits {
destination rate 20 1s
destination concurrency 10
}
mx_auth {
dane
mtasts {
cache fs
fs_dir mtasts_cache/
}
local_policy {
min_tls_level encrypted
min_mx_level none
}
}
}
target.queue remote_queue {
target &outbound_delivery
autogenerated_msg_domain $(primary_domain)
bounce {
destination postmaster $(local_domains) {
deliver_to &local_routing
}
default_destination {
reject 550 5.0.0 "Refusing to send DSNs to non-local addresses"
}
}
}
imap tcp://[::1]:143 {
auth &local_authdb
storage &local_mailboxes
}
'';
ensureAccounts = [ "user@${domain}" ];
ensureCredentials = {
"user@${domain}".passwordFile = pkgs.writeText "dummy" "foobar";
};
};
}

View File

@@ -1,3 +1,5 @@
---
description = "A modern IRC server"
categories = ["Social"]
features = [ "inventory", "deprecated" ]
---

View File

@@ -1,14 +1,3 @@
_: {
services.ergochat = {
enable = true;
settings = {
datastore = {
autoupgrade = true;
path = "/var/lib/ergo/ircd.db";
};
};
};
clan.core.state.ergochat.folders = [ "/var/lib/ergo" ];
{
imports = [ ./roles/default.nix ];
}

View File

@@ -0,0 +1,14 @@
_: {
services.ergochat = {
enable = true;
settings = {
datastore = {
autoupgrade = true;
path = "/var/lib/ergo/ircd.db";
};
};
};
clan.core.state.ergochat.folders = [ "/var/lib/ergo" ];
}

View File

@@ -18,7 +18,6 @@ in
dyndns = ./dyndns;
ergochat = ./ergochat;
garage = ./garage;
golem-provider = ./golem-provider;
heisenbridge = ./heisenbridge;
importer = ./importer;
iwd = ./iwd;

View File

@@ -1,5 +1,7 @@
---
description = "S3-compatible object store for small self-hosted geo-distributed deployments"
categories = ["System"]
features = [ "inventory", "deprecated" ]
---
This module generates garage specific keys automatically.

View File

@@ -1,43 +1,3 @@
{ config, pkgs, ... }:
{
systemd.services.garage.serviceConfig = {
LoadCredential = [
"rpc_secret_path:${config.clan.core.vars.generators.garage-shared.files.rpc_secret.path}"
"admin_token_path:${config.clan.core.vars.generators.garage.files.admin_token.path}"
"metrics_token_path:${config.clan.core.vars.generators.garage.files.metrics_token.path}"
];
Environment = [
"GARAGE_ALLOW_WORLD_READABLE_SECRETS=true"
"GARAGE_RPC_SECRET_FILE=%d/rpc_secret_path"
"GARAGE_ADMIN_TOKEN_FILE=%d/admin_token_path"
"GARAGE_METRICS_TOKEN_FILE=%d/metrics_token_path"
];
};
clan.core.vars.generators.garage = {
files.admin_token = { };
files.metrics_token = { };
runtimeInputs = [
pkgs.coreutils
pkgs.openssl
];
script = ''
openssl rand -base64 -out "$out"/admin_token 32
openssl rand -base64 -out "$out"/metrics_token 32
'';
};
clan.core.vars.generators.garage-shared = {
share = true;
files.rpc_secret = { };
runtimeInputs = [
pkgs.coreutils
pkgs.openssl
];
script = ''
openssl rand -hex -out "$out"/rpc_secret 32
'';
};
clan.core.state.garage.folders = [ config.services.garage.settings.metadata_dir ];
imports = [ ./roles/default.nix ];
}

View File

@@ -0,0 +1,43 @@
{ config, pkgs, ... }:
{
systemd.services.garage.serviceConfig = {
LoadCredential = [
"rpc_secret_path:${config.clan.core.vars.generators.garage-shared.files.rpc_secret.path}"
"admin_token_path:${config.clan.core.vars.generators.garage.files.admin_token.path}"
"metrics_token_path:${config.clan.core.vars.generators.garage.files.metrics_token.path}"
];
Environment = [
"GARAGE_ALLOW_WORLD_READABLE_SECRETS=true"
"GARAGE_RPC_SECRET_FILE=%d/rpc_secret_path"
"GARAGE_ADMIN_TOKEN_FILE=%d/admin_token_path"
"GARAGE_METRICS_TOKEN_FILE=%d/metrics_token_path"
];
};
clan.core.vars.generators.garage = {
files.admin_token = { };
files.metrics_token = { };
runtimeInputs = [
pkgs.coreutils
pkgs.openssl
];
script = ''
openssl rand -base64 -out "$out"/admin_token 32
openssl rand -base64 -out "$out"/metrics_token 32
'';
};
clan.core.vars.generators.garage-shared = {
share = true;
files.rpc_secret = { };
runtimeInputs = [
pkgs.coreutils
pkgs.openssl
];
script = ''
openssl rand -hex -out "$out"/rpc_secret 32
'';
};
clan.core.state.garage.folders = [ config.services.garage.settings.metadata_dir ];
}

View File

@@ -1,7 +0,0 @@
---
description = "Golem Provider for the Golem Network, an open-source and decentralized platform where everyone can use and share each other's computing power without relying on centralized entities like cloud computing corporations"
---
By running a golem provider your machine's compute resources are offered via the golem network which will allow other members to execute compute tasks on your machine. If this happens, you will be compensated with GLM, an ERC20 token.
More about golem providers: https://docs.golem.network/docs/golem/overview

View File

@@ -1,34 +0,0 @@
{ config, pkgs, ... }:
let
cfg = config.clan.golem-provider;
yagna = pkgs.callPackage ../../pkgs/yagna { };
accountFlag = if cfg.account != null then "--account ${cfg.account}" else "";
in
{
imports = [ ./interface.nix ];
users.users.golem = {
isSystemUser = true;
home = "/var/lib/golem";
group = "golem";
createHome = true;
};
users.groups.golem = { };
environment.systemPackages = [ yagna ];
systemd.services.golem-provider = {
description = "Golem Provider";
wantedBy = [ "multi-user.target" ];
after = [ "network-online.target" ];
serviceConfig = {
Type = "simple";
ExecStart = "${yagna}/bin/golemsp run --no-interactive ${accountFlag}";
Restart = "always";
RestartSec = "5";
User = "golem";
Group = "golem";
};
};
}

View File

@@ -1,20 +0,0 @@
{ lib, ... }:
let
inherit (lib) mkOption;
inherit (lib.types) nullOr str;
in
{
options.clan.golem-provider = {
account = mkOption {
type = nullOr str;
description = ''
Ethereum address for payouts.
Leave empty to automatically generate a new address upon first start.
'';
default = null;
};
};
}

View File

@@ -1,4 +0,0 @@
{ ... }:
{
imports = [ ../. ];
}

View File

@@ -1,4 +1,5 @@
---
description = "A matrix bridge to communicate with IRC"
categories = ["Social"]
features = [ "inventory", "deprecated" ]
---

View File

@@ -1,23 +1,3 @@
{
config,
lib,
...
}:
{
imports = [
(lib.mkRemovedOptionModule [
"clan"
"heisenbridge"
"enable"
] "Importing the module will already enable the service.")
];
config = {
services.heisenbridge = {
enable = true;
homeserver = "http://localhost:8008"; # TODO: Sync with matrix-synapse
};
services.matrix-synapse.settings.app_service_config_files = [
"/var/lib/heisenbridge/registration.yml"
];
};
imports = [ ./roles/default.nix ];
}

View File

@@ -0,0 +1,22 @@
{
lib,
...
}:
{
imports = [
(lib.mkRemovedOptionModule [
"clan"
"heisenbridge"
"enable"
] "Importing the module will already enable the service.")
];
config = {
services.heisenbridge = {
enable = true;
homeserver = "http://localhost:8008"; # TODO: Sync with matrix-synapse
};
services.matrix-synapse.settings.app_service_config_files = [
"/var/lib/heisenbridge/registration.yml"
];
};
}

View File

@@ -1,6 +1,6 @@
---
description = "Automatically provisions wifi credentials"
features = [ "inventory" ]
features = [ "inventory", "deprecated" ]
categories = [ "Network" ]
---

View File

@@ -80,6 +80,18 @@ in
# TODO: restart the iwd.service if something changes
})
{
warnings = [
''
The clan module `iwd` is deprecated and replaced by the clan service `wifi`
Please migrate your config to the new service (see: https://docs.clan.lol/reference/clanServices/wifi/)
To keep passwords after migrating the config, use:
clan vars get <your-machine> iwd.<network-name>/ssid | clan vars set <your-machine> wifi.<network-name>/network-name
and:
clan vars get <your-machine> iwd.<network-name>/password | clan vars set <your-machine> wifi.<network-name>/password
''
];
# disable wpa supplicant
networking.wireless.enable = false;

View File

@@ -1,3 +1,5 @@
---
description = "Securely sharing files and messages over a local network without internet connectivity."
categories = ["Utility"]
features = [ "inventory", "deprecated" ]
---

View File

@@ -1,60 +1,3 @@
{
config,
pkgs,
lib,
...
}:
let
cfg = config.clan.localsend;
in
{
# Integration can be improved, if the following issues get implemented:
# - cli frontend: https://github.com/localsend/localsend/issues/11
# - ipv6 support: https://github.com/localsend/localsend/issues/549
options.clan.localsend = {
displayName = lib.mkOption {
type = lib.types.nullOr lib.types.str;
default = null;
description = "The name that localsend will use to display your instance.";
};
package = lib.mkPackageOption pkgs "localsend" { };
ipv4Addr = lib.mkOption {
type = lib.types.str;
example = "192.168.56.2/24";
description = "Every machine needs a unique ipv4 address";
};
};
imports = [
(lib.mkRemovedOptionModule [
"clan"
"localsend"
"enable"
] "Importing the module will already enable the service.")
];
config = {
clan.core.state.localsend.folders = [
"/var/localsend"
];
environment.systemPackages = [
(pkgs.callPackage ./localsend-ensure-config {
localsend = config.clan.localsend.package;
alias = config.clan.localsend.displayName;
})
];
networking.firewall.interfaces."zt+".allowedTCPPorts = [ 53317 ];
networking.firewall.interfaces."zt+".allowedUDPPorts = [ 53317 ];
#TODO: This is currently needed because there is no ipv6 multicasting support yet
systemd.network.networks."09-zerotier" = {
networkConfig = {
Address = cfg.ipv4Addr;
};
};
};
imports = [ ./roles/default.nix ];
}

View File

@@ -0,0 +1,63 @@
{
config,
pkgs,
lib,
...
}:
let
cfg = config.clan.localsend;
in
{
# Integration can be improved, if the following issues get implemented:
# - cli frontend: https://github.com/localsend/localsend/issues/11
# - ipv6 support: https://github.com/localsend/localsend/issues/549
options.clan.localsend = {
displayName = lib.mkOption {
type = lib.types.nullOr lib.types.str;
default = null;
description = "The name that localsend will use to display your instance.";
};
package = lib.mkPackageOption pkgs "localsend" { };
ipv4Addr = lib.mkOption {
type = lib.types.nullOr lib.types.str;
default = null;
example = "192.168.56.2/24";
description = "Optional IPv4 address for ZeroTier network.";
};
};
imports = [
(lib.mkRemovedOptionModule [
"clan"
"localsend"
"enable"
] "Importing the module will already enable the service.")
];
config = {
clan.core.state.localsend.folders = [
"/var/localsend"
];
environment.systemPackages = [
(pkgs.callPackage ./localsend-ensure-config {
localsend = config.clan.localsend.package;
alias = config.clan.localsend.displayName;
})
];
networking.firewall.interfaces."zt+".allowedTCPPorts = [ 53317 ];
networking.firewall.interfaces."zt+".allowedUDPPorts = [ 53317 ];
#TODO: This is currently needed because there is no ipv6 multicasting support yet
systemd.network.networks = lib.mkIf (cfg.ipv4Addr != null) {
"09-zerotier" = {
networkConfig = {
Address = cfg.ipv4Addr;
};
};
};
};
}

View File

@@ -1,7 +1,7 @@
---
description = "End-2-end encrypted IPv6 overlay network"
categories = ["System", "Network"]
features = [ "inventory" ]
features = [ "inventory", "deprecated" ]
---
Mycelium is an IPv6 overlay network written in Rust. Each node that joins the overlay network will receive an overlay network IP in the 400::/7 range.

View File

@@ -1,5 +1,5 @@
---
description = "Define package sets from nixpkgs and install them on one or more machines"
categories = ["System"]
features = [ "inventory" ]
features = [ "inventory", "deprecated" ]
---

View File

@@ -1,9 +1,11 @@
---
description = "Automatically generates and configures a password for the root user."
categories = ["System"]
features = [ "inventory" ]
features = ["inventory", "deprecated"]
---
This module is deprecated and will be removed in a future release. It's functionality has been replaced by the user-password service.
After the system was installed/deployed the following command can be used to display the root-password:
```bash

View File

@@ -1,6 +1,8 @@
{
_class,
pkgs,
config,
lib,
...
}:
{
@@ -9,9 +11,13 @@
config.clan.core.vars.generators.root-password.files.password-hash.path;
clan.core.vars.generators.root-password = {
files.password-hash = {
neededFor = "users";
};
files.password-hash =
{
neededFor = "users";
}
// (lib.optionalAttrs (_class == "nixos") {
restartUnits = lib.optional (config.services.userborn.enable) "userborn.service";
});
files.password = {
deploy = false;
};
@@ -30,7 +36,7 @@
if [[ -n "''${prompt_value-}" ]]; then
echo "$prompt_value" | tr -d "\n" > "$out"/password
else
xkcdpass --numwords 3 --delimiter - --count 1 | tr -d "\n" > "$out"/password
xkcdpass --numwords 4 --delimiter - --count 1 | tr -d "\n" > "$out"/password
fi
mkpasswd -s -m sha-512 < "$out"/password | tr -d "\n" > "$out"/password-hash
'';

View File

@@ -1,7 +1,7 @@
---
description = "Enables secure remote access to the machine over ssh."
categories = ["System", "Network"]
features = [ "inventory" ]
features = [ "inventory", "deprecated" ]
---
This module will setup the opensshd service.

View File

@@ -1,6 +1,6 @@
---
description = "Automatically generate the state version of the nixos installation."
features = [ "inventory" ]
features = [ "inventory", "deprecated" ]
---
This module generates the `system.stateVersion` of the nixos installation automatically.

View File

@@ -1,3 +1,5 @@
---
description = "This module sets the `clan.lol` and `nix-community` cache up as a trusted cache."
----
categories = ["System", "Network"]
features = [ "deprecated" ]
---

View File

@@ -1,7 +1,7 @@
---
description = "Automatically generates and configures a password for the specified user account."
categories = ["System"]
features = ["inventory"]
features = ["inventory", "deprecated"]
---
If setting the option prompt to true, the user will be prompted to type in their desired password.

View File

@@ -18,7 +18,10 @@ in
type = lib.types.bool;
default = true;
example = false;
description = "Whether the user should be prompted.";
description = ''
Whether the user should be prompted
If disabled, will autogenerate the password without prompting.
'';
};
};
@@ -31,6 +34,7 @@ in
clan.core.vars.generators.user-password = {
files.user-password-hash.neededFor = "users";
files.user-password-hash.restartUnits = lib.optional (config.services.userborn.enable) "userborn.service";
prompts.user-password.type = "hidden";
prompts.user-password.persist = true;
@@ -48,7 +52,7 @@ in
if [[ -n "''${prompt_value-}" ]]; then
echo "$prompt_value" | tr -d "\n" > "$out"/user-password
else
xkcdpass --numwords 3 --delimiter - --count 1 | tr -d "\n" > "$out"/user-password
xkcdpass --numwords 4 --delimiter - --count 1 | tr -d "\n" > "$out"/user-password
fi
mkpasswd -s -m sha-512 < "$out"/user-password | tr -d "\n" > "$out"/user-password-hash
'';

View File

@@ -1,7 +0,0 @@
---
description = "Configures Wifi networks to join"
features = [ "inventory", "experimental", "deprecated" ]
categories = [ "Network", "System" ]
---
## Experimental wifi module

View File

@@ -1,5 +0,0 @@
{
imports = [
./roles/default.nix
];
}

View File

@@ -1,110 +0,0 @@
{
lib,
config,
pkgs,
...
}:
let
cfg = config.clan.wifi;
inherit (lib)
concatMapAttrsStringSep
flip
mapAttrs
;
password_path =
network_name: config.clan.core.vars.generators."iwd.${network_name}".files.password.path;
ssid_path = network_name: config.clan.core.vars.generators."iwd.${network_name}".files.ssid.path;
secret_generator = name: value: {
name = "iwd.${name}";
value = {
prompts.ssid.type = "line";
prompts.ssid.persist = true;
prompts.password.type = "hidden";
prompts.password.persist = true;
share = true;
};
};
in
{
options.clan.wifi = {
networks = lib.mkOption {
visible = false;
type = lib.types.attrsOf (
lib.types.submodule (
{ ... }:
{
options = {
enable = lib.mkOption {
type = lib.types.bool;
default = true;
description = "Enable this wifi network";
};
autoConnect = lib.mkOption {
type = lib.types.bool;
default = true;
description = "Automatically try to join this wifi network";
};
};
}
)
);
default = { };
description = "Wifi networks to predefine";
};
};
config = lib.mkIf (cfg.networks != { }) {
clan.core.vars.generators = lib.mapAttrs' secret_generator cfg.networks;
networking.networkmanager.enable = true;
networking.networkmanager.ensureProfiles.environmentFiles = [
"/run/secrets/NetworkManager/wifi-secrets"
];
networking.networkmanager.ensureProfiles.profiles = flip mapAttrs cfg.networks (
name: _network: {
connection.id = "$ssid_${name}";
connection.type = "wifi";
wifi.mode = "infrastructure";
wifi.ssid = "$ssid_${name}";
wifi-security.psk = "$pw_${name}";
wifi-security.key-mgmt = "wpa-psk";
}
);
# service to generate the environment file containing all secrets, as
# expected by the nixos NetworkManager-ensure-profile service
systemd.services.NetworkManager-setup-secrets = {
description = "Generate wifi secrets for NetworkManager";
requiredBy = [ "NetworkManager-ensure-profiles.service" ];
partOf = [ "NetworkManager-ensure-profiles.service" ];
before = [ "NetworkManager-ensure-profiles.service" ];
serviceConfig = {
Type = "oneshot";
ExecStart = pkgs.writeShellScript "wifi-secrets" ''
set -euo pipefail
env_file=/run/secrets/NetworkManager/wifi-secrets
mkdir -p $(dirname "$env_file")
: > "$env_file"
# Generate the secrets file
echo "Generating wifi secrets file: $env_file"
${flip (concatMapAttrsStringSep "\n") cfg.networks (
name: _network: ''
echo "ssid_${name}=\"$(cat "${ssid_path name}")\"" >> /run/secrets/NetworkManager/wifi-secrets
echo "pw_${name}=\"$(cat "${password_path name}")\"" >> /run/secrets/NetworkManager/wifi-secrets
''
)}
'';
};
};
};
}

View File

@@ -26,7 +26,6 @@
nixosModule =
{ ... }:
{
imports = [
../../clanModules/sshd
../../clanModules/root-password

View File

@@ -1,6 +1,17 @@
{ lib, ... }:
{ lib, self, ... }:
{
clan.modules = {
admin = lib.modules.importApply ./default.nix { };
};
perSystem =
{ pkgs, ... }:
{
checks = lib.optionalAttrs (pkgs.stdenv.isLinux) {
admin = import ./tests/vm/default.nix {
inherit pkgs;
clan-core = self;
nixosLib = import (self.inputs.nixpkgs + "/nixos/lib") { };
};
};
};
}

View File

@@ -0,0 +1,62 @@
{
pkgs,
nixosLib,
clan-core,
...
}:
let
public-key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAII6zj7ubTg6z/aDwRNwvM/WlQdUocMprQ8E92NWxl6t+ test@test";
in
nixosLib.runTest (
{ ... }:
{
imports = [
clan-core.modules.nixosVmTest.clanTest
];
hostPkgs = pkgs;
name = "admin";
clan = {
directory = ./.;
modules."@clan/admin" = ../../default.nix;
inventory = {
machines.client = { };
machines.server = { };
instances = {
ssh-test-one = {
module.name = "@clan/admin";
roles.default.machines."server".settings = {
allowedKeys.testkey = public-key;
};
};
};
};
};
nodes = {
client.environment.etc.private-test-key.source = ./private-test-key;
server = {
services.openssh.enable = true;
};
};
testScript = ''
start_all()
machines = [client, server]
for m in machines:
m.systemctl("start network-online.target")
for m in machines:
m.wait_for_unit("network-online.target")
client.succeed(f"ssh -F /dev/null -i /etc/private-test-key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o BatchMode=yes root@server true &>/dev/null")
'';
}
)

Some files were not shown because too many files have changed in this diff Show More