Compare commits

...

2 Commits

Author SHA1 Message Date
8722afe2c8
Format flake.nix 2025-01-27 22:35:16 +01:00
5b9b65bc1f
Attempt to support backing up commands 2025-01-27 22:34:13 +01:00
3 changed files with 76 additions and 34 deletions

View File

@ -11,30 +11,7 @@ let
runtimeInputs = [
pkgs.restic
];
text = ''
if [ -z "$BACKUP_HELPER_DIRS" ]; then
echo "BACKUP_HELPER_DIRS is not set"
exit 1;
fi
exit_code=0;
for i in ''${BACKUP_HELPER_DIRS//,/ }; do
echo "Starting backup of $i";
if ! output=$(restic backup "$i"); then
exit_code=1;
echo "Backup of $i failed with exit code $?:"
echo "$output"
else
echo "Backup of $i successful:"
echo "$output"
fi
done
if [ "$BACKUP_FORGET" -eq 1 ]; then
echo "Removing old backups"
output=$(restic forget -d 7 -w 4 -m 6 --keep-within 1d --prune)
echo "$output"
fi
exit "$exit_code";
'';
text = (builtins.readFile ./backup.sh);
};
in
{
@ -50,6 +27,11 @@ in
default = [ ];
description = "Directories to be backed up.";
};
backup-commands = lib.mkOption {
type = lib.types.listOf lib.types.str;
default = [ ];
description = "Backup the stdout of commands. Format strings like key:command";
};
schedule = lib.mkOption {
type = lib.types.str;
default = "*-*-* 00:00:00";
@ -83,6 +65,9 @@ in
}
// lib.attrsets.optionalAttrs (builtins.hasAttr "password-file" cfg) {
RESTIC_PASSWORD_FILE = cfg.password-file;
}
// lib.attrsets.optionalAttrs (cfg.backup-commands != [ ]) {
BACKUP_HELPER_COMMANDS = lib.strings.concatStringsSep ";" cfg.backup-commands;
};
serviceConfig = {
Type = "oneshot";

49
backup.sh Normal file
View File

@ -0,0 +1,49 @@
#!/usr/bin/env bash
# If neither of BACKUP_HELPER_DIRS and BACKUP_HELPER_COMMANDS not set. Exit
if [ -z "$BACKUP_HELPER_DIRS" ] && [ -z "$BACKUP_HELPER_COMMANDS" ]; then
echo "BACKUP_HELPER_DIRS is not set"
exit 1;
fi
exit_code=0;
# Backup directories
if [ -n "$BACKUP_HELPER_DIRS" ]; then
for i in ${BACKUP_HELPER_DIRS//,/ }; do
echo "Starting backup of $i";
if ! output=$(restic backup "$i"); then
exit_code=1;
echo "Backup of $i failed with exit code $?:"
echo "$output"
else
echo "Backup of $i successful:"
echo "$output"
fi
done
fi
# Backup command outputs
if [ -n "$BACKUP_HELPER_COMMANDS" ]; then
IFS=";" read -r -a pairs <<< "$BACKUP_HELPER_COMMANDS"
for pair in "${pairs[@]}"; do
IFS=":" read -r key value <<< "$pair"
if ! output=$(restic backup --stdin-filename "$key" --stdin-from-command -- "$value"); then
exit_code=1;
echo "Backup of $i failed with exit code $?:"
echo "$output"
else
echo "Backup of $i successful:"
echo "$output"
fi
done
fi
if [ "$BACKUP_FORGET" -eq 1 ]; then
echo "Removing old backups"
output=$(restic forget -d 7 -w 4 -m 6 --keep-within 1d --prune)
echo "$output"
fi
exit "$exit_code"

View File

@ -3,7 +3,8 @@
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
outputs = { self, nixpkgs }:
outputs =
{ self, nixpkgs }:
let
allSystems = [
"x86_64-linux"
@ -11,24 +12,31 @@
"x86_64-darwin"
"aarch64-darwin"
];
forAllSystems = f: nixpkgs.lib.genAttrs allSystems (system: f {
pkgs = import nixpkgs { inherit system; };
});
forAllSystems =
f:
nixpkgs.lib.genAttrs allSystems (
system:
f {
pkgs = import nixpkgs { inherit system; };
}
);
in
{
nixosModules.backup-helper = import ./backup.nix;
nixosModules.default = self.nixosModules.backup-helper;
devShells = forAllSystems ({ pkgs }: {
default = pkgs.mkShell {
packages = with pkgs;
[
devShells = forAllSystems (
{ pkgs }:
{
default = pkgs.mkShell {
packages = with pkgs; [
restic
bash
jq
curl
];
};
});
};
}
);
};
}