{ pkgs, config, lib, ... }: let cfg = config.grimmShared; in { config = with cfg; lib.mkIf (enable && cloudSync.enable) ( let cloud_cmd = ''${pkgs.nextcloud-client}/bin/nextcloudcmd -u ${config.grimmShared.cloudSync.username} -p "$(cat ${config.grimmShared.cloudSync.passwordFile})" -h -n --path''; sync_server = "https://${config.grimmShared.cloudSync.server}"; in { environment.systemPackages = with pkgs; [ (writeShellScriptBin "cloudsync-cmd" (cloud_cmd + " $@ " + sync_server)) nextcloud-client ]; systemd.services = lib.mkMerge (lib.mapAttrsToList (local_user: user_conf: let paths = user_conf.syncPaths; sync_script = lib.strings.concatLines (map ({ local, remote }: let remote_clean = lib.strings.concatStrings (builtins.match "/*(.+)" remote); in "${cloud_cmd} /${remote_clean} ${local} ${sync_server}") paths); in { # user-specific sync jobs "nextcloud-autosync-${local_user}" = lib.mkIf (paths != [ ]) { description = "Auto sync Nextcloud"; after = [ "network-online.target" ]; wants = [ "network-online.target" ]; serviceConfig.Type = "simple"; serviceConfig.User = local_user; serviceConfig.Group = "users"; script = sync_script; # TimeoutStopSec = "180"; # KillMode = "process"; # KillSignal = "SIGINT"; wantedBy = [ "multi-user.target" ]; enable = true; }; }) config.users.users); systemd.timers = lib.mkMerge (lib.mapAttrsToList (local_user: user_conf: let paths = user_conf.syncPaths; in { # user-specific sync jobs "nextcloud-autosync-${local_user}" = lib.mkIf (paths != [ ]) { description = "Automatic sync files with Nextcloud when booted up after 5 minutes then rerun every 60 minutes"; timerConfig.OnBootSec = "5min"; timerConfig.OnUnitActiveSec = "60min"; wantedBy = [ "multi-user.target" "timers.target" ]; enable = true; }; }) config.users.users); } ); }