{ nixosConfigurations, machineConfig, config, lib, ... }: let inherit (lib) types; cfg = config.zpha.configure.syncthing; in { options.zpha.configure.syncthing = { enable = lib.mkEnableOption ""; user = lib.mkOption { type = types.str; default = "zaphyra"; }; group = lib.mkOption { type = types.str; default = "users"; }; dataDir = lib.mkOption { type = types.str; default = "/persist/home/zaphyra"; }; configDir = lib.mkOption { type = types.str; default = "/persist/home/zaphyra/.config/syncthing"; }; id = lib.mkOption { type = types.str; default = machineConfig.syncthingId; }; enabledShares = lib.mkOption { type = with types; listOf str; default = [ "zaphyra-audiobooks" "zaphyra-documents" "zaphyra-pictures" "zaphyra-music" "zaphyra-music-orig" "zaphyra-videos" "zaphyra-db-richtlinien" ]; }; }; config = lib.mkIf cfg.enable ( let syncthingDevices = { #mobile devices huntii.id = "6YZT5PZ-EKXZBMV-C2MJL75-OCQ36LC-L3QIRPW-VJ5EU3C-2ICZDDO-IZ7IGAO"; haueri.id = "YMIK4FX-2IVSTHP-CRZHAEM-2KNSZTP-QR5JTSD-MSSR3XV-SUCJF4F-T5SSDAN"; iphone.id = "3SM3LJV-XMHYW2D-MU5WQ3T-KGYUJOI-LXOL6YI-BSVZ2B5-QJ6GVXN-MPWMKQ7"; #servers isodon.name = "isodon.fc9f.de"; isodon.id = "QI2EPUE-4VMZ3XV-LXX3GXP-RHCWTRY-AACLSGL-YG7MIYV-THST74N-KJGIBQ6"; cuvier.name = "cuvier.fc9f.de"; cuvier.id = "JUIJQZE-AWVYZIZ-CR6E66M-TAJIRDH-NEPEPZW-FHO37MJ-QM2MV5Q-OFJTEQI"; #others #celestine.id = "K6DSDMU-PV56YYN-3XNIU2K-DKIFYT5-AL3PWNS-73M3V52-CYO5WLP-B655VAG"; }; defaultVersioning = { type = "trashcan"; params = { cleanoutDays = "3"; }; }; isCurrentHost = key: _value: key != config.networking.hostName; deviceNames = lib.pipe syncthingDevices [ (lib.filterAttrs isCurrentHost) builtins.attrNames ]; shareDeviceNames = share: (lib.pipe syncthingDevices [ (lib.filterAttrs isCurrentHost) (lib.filterAttrs ( name: _value: let syncthingCfg = nixosConfigurations."${name}".config.modules.presets.zaphyra.syncthing; in if (nixosConfigurations ? name) then if syncthingCfg.enable then lib.elem share syncthingCfg.enabledShares else false else false )) builtins.attrNames ]); devices = lib.pipe syncthingDevices [ (lib.filterAttrs isCurrentHost) ]; folders = let inherit (config.services.syncthing) dataDir; in { zaphyra-audiobooks = rec { enable = lib.mkDefault (lib.elem id cfg.enabledShares); id = "zaphyra-audiobooks"; label = "Audiobooks"; path = lib.mkDefault "${dataDir}/Audiobooks"; devices = deviceNames; versioning = lib.mkDefault defaultVersioning; }; zaphyra-documents = rec { enable = lib.mkDefault (lib.elem id cfg.enabledShares); id = "zaphyra-documents"; label = "Documents"; path = lib.mkDefault "${dataDir}/Documents"; devices = deviceNames; versioning = lib.mkDefault defaultVersioning; }; zaphyra-music = rec { enable = lib.mkDefault (lib.elem id cfg.enabledShares); id = "zaphyra-music"; label = "Music"; path = lib.mkDefault "${dataDir}/Music"; devices = deviceNames; versioning = lib.mkDefault defaultVersioning; }; zaphyra-pictures = rec { enable = lib.mkDefault (lib.elem id cfg.enabledShares); id = "zaphyra-pictures"; label = "Pictures"; path = lib.mkDefault "${dataDir}/Pictures"; devices = deviceNames; versioning = lib.mkDefault defaultVersioning; }; zaphyra-videos = rec { enable = lib.mkDefault (lib.elem id cfg.enabledShares); id = "zaphyra-videos"; label = "Videos"; path = lib.mkDefault "${dataDir}/Videos"; devices = deviceNames; versioning = lib.mkDefault defaultVersioning; }; zaphyra-db-richtlinien = rec { enable = lib.mkDefault (lib.elem id cfg.enabledShares); id = "zaphyra-db-richtlinien"; label = "Bahn-Richtlinien"; path = lib.mkDefault "${dataDir}/Bahn-Richtlinien"; devices = deviceNames; versioning = lib.mkDefault defaultVersioning; }; zaphyra-music-orig = rec { enable = lib.mkDefault (lib.elem id cfg.enabledShares); id = "zaphyra-music-orig"; label = "Music (Originals)"; path = lib.mkDefault "${dataDir}/Music (Originals)"; devices = shareDeviceNames "${id}"; versioning = lib.mkDefault defaultVersioning; }; zaphyra-media = rec { enable = lib.mkDefault (lib.elem id cfg.enabledShares); id = "zaphyra-media"; label = "Media (legacy)"; path = lib.mkDefault "${dataDir}/Media (legacy)"; devices = shareDeviceNames "${id}"; versioning = lib.mkDefault defaultVersioning; }; zaphyra-music-inbox = rec { enable = lib.mkDefault (lib.elem id cfg.enabledShares); id = "zaphyra-music-inbox"; label = "Music (Inbox)"; path = lib.mkDefault "${dataDir}/Music (Inbox)"; devices = (shareDeviceNames "${id}"); versioning = lib.mkDefault defaultVersioning; }; }; in { sops.secrets = lib.genAttrs [ "syncthing/cert" "syncthing/key" ] (_name: { owner = cfg.user; inherit (cfg) group; }); services.syncthing = { enable = true; openDefaultPorts = true; guiAddress = "[::1]:8384"; inherit (cfg) user; inherit (cfg) group; cert = config.sops.secrets."syncthing/cert".path; key = config.sops.secrets."syncthing/key".path; inherit (cfg) dataDir; inherit (cfg) configDir; settings.devices = devices; settings.folders = folders; }; } ); }