{ config, lib, pkgs, ... }: let cfg = config.sydnix.syncthing; in { options.sydnix.syncthing = { enable = lib.mkEnableOption "Syncthing"; includeDevices = lib.mkOption { type = lib.types.listOf (lib.types.enum (builtins.attrNames cfg.devices)); default = []; description = '' A list of device names to sync with. See the read-only option `sydnix.syncthing.devices` for the concrete details. ''; }; devices = lib.mkOption { # This should generally be in sync with modules/home/syncthing.nix. default = { "guix-rebound".id = "Q5B6LIV-5HQMWWV-XFQL5IT-PHP7PVE-XFWUVHK-F6WJ42C-OPMR4M7-GFNK3AG"; "deertopia".id = "OO6XGGQ-SORH6XW-YEMN3T3-CSW5QOO-2IRB2QE-NZOL6JE-RAV36GS-WZXXLQV"; "nixos-testbed".id = "BO3AESA-LBKMZW7-QFE7NTT-GF62DOA-PYUACYU-HNTNYI5-EMF6PAN-TR6YHAL"; }; readOnly = true; description = '' The read-only 'universe' of devices available. A subset of these devices — those named by `sydnix.syncthing.includeDevices` — will be handed to Syncthing's module. This should generally match the option of the same name in the Home-manager module, `sydnix.syncthing.devices`. ''; }; directories = lib.mkOption { type = lib.types.anything; default = {}; description = '' Directly handed to `services.syncthing.settings.folders`. ''; }; }; config = lib.mkIf cfg.enable { sydnix.impermanence.directories = [ # Most notably, preserves the device ID. "/var/lib/syncthing" ]; services.syncthing = { enable = true; openDefaultPorts = true; settings = { gui = { # TODO: Figure out how to read credentials from a file. # tls = true; user = "lain"; password = "my-awesome-password"; }; overrideDevices = true; overrideFolders = true; devices = lib.filterAttrs (k: _v: builtins.elem k cfg.includeDevices) cfg.devices; folders = cfg.directories; }; }; }; }