{ config, lib, pkgs, ... }: let inherit (lib) mkEnableOption mkOption mkPackageOption mkIf types; cfg = config.programs.resticprofile; yamlFormat = pkgs.formats.yaml { }; baseProfile = import ./profiles/base.nix { inherit lib config; }; profiles = lib.recursiveUpdate baseProfile cfg.profiles; in { # Create the programs.resticprofile option options.programs.resticprofile = { enable = mkEnableOption "Enable resticprofile (Restic backup profile manager)"; package = mkPackageOption pkgs "resticprofile" { }; # Multiple configuration files support profiles = mkOption { type = types.attrsOf yamlFormat.type; default = { }; description = '' Multiple configuration files for resticprofile. Each attribute name becomes a YAML file under `$XDG_CONFIG_HOME/resticprofile/`. ''; example = { common = { repository = "local:/backup"; passwordFile = "password.txt"; includes = [ "common.yaml" ]; backup = { source = [ "/home/user/Documents" ]; schedule = "12:30"; }; forget = { keep-daily = 7; keep-weekly = 4; keep-monthly = 6; keep-yearly = 2; }; }; }; }; }; config = mkIf cfg.enable ( let resticprofileCmd = '' ${cfg.package}/bin/resticprofile --config "${config.xdg.configHome}/resticprofile/profiles.yaml" ''; # Define the rp script as a variable so we can reference it rpScript = pkgs.writeShellScriptBin "rp" '' set -e sudo ${cfg.package}/bin/resticprofile --config "${config.xdg.configHome}/resticprofile/profiles.yaml" $@ ''; rpbackupScript = pkgs.writeShellScriptBin "rp-backup" '' ${rpScript}/bin/rp run-schedule backup@default ''; in { # Add a script to manually unschedule and reschedule all resticprofiles home.packages = [ cfg.package rpScript rpbackupScript (pkgs.writeShellScriptBin "rps" '' set -e ${rpScript}/bin/rp unschedule --all ${rpScript}/bin/rp schedule --all '';) (pkgs.writeShellScriptBin "rp-test" "${rpbackupScript}/bin/rp-backup --dry-run") ]; xdg.configFile."resticprofile/profiles.yaml".source = yamlFormat.generate "profiles" { version = "2"; profiles = profiles; }; } ); }