{ config, lib, pkgs, ... }: with lib; let cfg = config.services.syncthing.autoRegister; localpkgs = import ../. { inherit pkgs; }; register-script = pkgs.writeShellScript "syncthing-autoregister-script" '' ${localpkgs.syncthing-set-id}/bin/syncthing-set-id ${ escapeShellArg cfg.path } ''; in { options = { services.syncthing.autoRegister = { enable = mkEnableOption '' Automatically write the local syncthing device id to the nix module file . ''; path = mkOption { type = types.path; description = '' Path of nix module file to write our syncthing device id into. It will be written into services.syncthing.devices..id. This file can be imported as a NixOS module. We recommend using a separate file just for this purpose. I.e., don't point this at your main NixOS config. Instead, import this file from your main NixOS config. (The current nix-configuration read-modify-write implementation only supports attrsets of strings; it does not support functions, which you probably use in your main configuration.) ''; }; }; }; config = mkIf cfg.enable { systemd.services.syncthing-autoregister = { after = [ "syncthing.service" "syncthing-init.service" ]; wantedBy = [ "multi-user.target" ]; environment.NIX_PATH = config.environment.variables.NIX_PATH; serviceConfig = { User = config.services.syncthing.user; RemainAfterExit = true; Type = "oneshot"; ExecStart = register-script; }; }; systemd.services.syncthing-reregister = { after = [ "syncthing-autoregister.service" ]; script = '' ${pkgs.coreutils}/bin/sleep 1 ${pkgs.systemd}/bin/systemctl restart syncthing-autoregister ''; serviceConfig = { Type = "oneshot"; }; }; systemd.paths.syncthing-reregister = { pathConfig.PathChanged = cfg.path; wantedBy = [ "multi-user.target" ]; }; }; }