{ pov, pkgs, lib, config, hostConfig, ... }: let inherit (lib) types; cfg = lib.getAttrFromPath pov config; in { options.enable = { type = types.bool; default = false; }; config = lib.mkIf (cfg.enable && cfg.syncthing.enable) ( let syncthingDevices = { #mobile devices blechkasten.id = "HGPWBVY-RD4JKBQ-X3V53IB-KRVDXEQ-4YLN5F2-WPPSMYR-SOXGTY6-IDFOAAC"; coladose.id = "BNCAOEB-CYTYIBA-ZKFJKRB-DX4C3MT-SDH7IWQ-5EI35PJ-YUIJSYH-COCGUAW"; seifenkiste.id = "6YZT5PZ-EKXZBMV-C2MJL75-OCQ36LC-L3QIRPW-VJ5EU3C-2ICZDDO-IZ7IGAO"; iphone.id = "3SM3LJV-XMHYW2D-MU5WQ3T-KGYUJOI-LXOL6YI-BSVZ2B5-QJ6GVXN-MPWMKQ7"; #servers hector.name = "hector.infra.katja.wtf"; hector.id = "MVGBPSX-YSZNBDO-E7HZFGJ-WULYWQ5-XDHVMJO-BKA4R37-GPPRLLS-Z5DQMQJ"; wanderduene.name = "wanderduene.infra.katja.wtf"; wanderduene.id = "WEFYARN-GY3WZXB-TIXBI56-ZZ77AHS-GFH5SH2-Q35NTBI-VPT3OEM-EQNAMQH"; briefkasten.name = "briefkasten.infra.katja.wtf"; briefkasten.id = "QI2EPUE-4VMZ3XV-LXX3GXP-RHCWTRY-AACLSGL-YG7MIYV-THST74N-KJGIBQ6"; }; enabledShares = { briefkasten = [ "ctucx-music-orig" "ctucx-media" ]; }; defaultVersioning = { type = "trashcan"; params = { cleanoutDays = "3"; }; }; isCurrentHost = key: value: key != config.networking.hostName; deviceNames = (syncthingDevices |> lib.filterAttrs isCurrentHost |> builtins.attrNames); shareDeviceNames = share: ( enabledShares |> lib.filterAttrs isCurrentHost |> lib.filterAttrs (key: value: builtins.elem share value) |> builtins.attrNames ); isShareEnabled = share: ( if builtins.hasAttr config.networking.hostName enabledShares then (if builtins.elem share enabledShares.${config.networking.hostName} then true else false) else false ); devices = lib.filterAttrs isCurrentHost syncthingDevices; folders = let dataDir = config.services.syncthing.dataDir; in { "${dataDir}/Audiobooks" = { enable = lib.mkDefault true; id = "ctucx-audiobooks"; label = "Audiobooks"; devices = deviceNames; versioning = lib.mkDefault defaultVersioning; }; "${dataDir}/Documents" = { enable = lib.mkDefault true; id = "ctucx-documents"; label = "Documents"; devices = deviceNames; versioning = lib.mkDefault defaultVersioning; }; "${dataDir}/Music" = { enable = lib.mkDefault true; id = "ctucx-music"; label = "Music"; devices = deviceNames; versioning = lib.mkDefault defaultVersioning; }; "${dataDir}/Pictures" = { enable = lib.mkDefault true; id = "ctucx-pictures"; label = "Pictures"; devices = deviceNames; versioning = lib.mkDefault defaultVersioning; }; "${dataDir}/Videos" = { enable = lib.mkDefault true; id = "ctucx-videos"; label = "Videos"; devices = deviceNames; versioning = lib.mkDefault defaultVersioning; }; "${dataDir}/Bahn-Richtlinien" = { enable = lib.mkDefault true; id = "Bahn-Richtlinien"; label = "Bahn-Richtlinien"; devices = deviceNames; versioning = lib.mkDefault defaultVersioning; }; "${dataDir}/Music (Originals)" = rec { enable = lib.mkDefault (isShareEnabled "${id}"); id = "ctucx-music-orig"; label = "Music (Originals)"; devices = shareDeviceNames "${id}"; versioning = lib.mkDefault defaultVersioning; }; "${dataDir}/Media (legacy)" = rec { enable = lib.mkDefault (isShareEnabled "${id}"); id = "ctucx-media"; label = "Media (legacy)"; devices = shareDeviceNames "${id}"; versioning = lib.mkDefault defaultVersioning; }; }; in { sops.secrets = lib.genAttrs [ "syncthingCert" "syncthingKey" ] (name: { owner = "zaphyra"; group = "users"; }); services.syncthing = { enable = true; openDefaultPorts = true; guiAddress = "[::1]:8384"; user = lib.mkDefault "zaphyra"; group = lib.mkDefault "users"; cert = lib.mkDefault config.sops.secrets.syncthingCert.path; key = lib.mkDefault config.sops.secrets.syncthingKey.path; dataDir = lib.mkDefault "/home/zaphyra"; configDir = lib.mkDefault "/home/zaphyra/.config/syncthing"; settings.devices = devices; settings.folders = folders; }; } ); }