From 8c9d5d34b1fe1a4affbf54b8699bf2735fbf72b9 Mon Sep 17 00:00:00 2001 From: Alexander Barton Date: Tue, 19 Apr 2016 17:48:33 +0200 Subject: [PATCH] Implement job tagging Introduce new command line option "-t TAG"/"--tags TAG" and new job option "[default_]tags". --- README.md | 14 +++++++++++++- bin/backup-script | 30 ++++++++++++++++++++++++++++-- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 8fcdf38..de10ad2 100644 --- a/README.md +++ b/README.md @@ -14,8 +14,9 @@ Usage: `backup-script [] [ [ [...]]]` Options: -- `-p`, `--progress`: Show progress, see rsync(1). - `-n`, `--dry-run`: Test run only, don't copy any data. +- `-p`, `--progress`: Show progress, see rsync(1). +- `-t TAG`, `--tag TAG`: Only run jobs with tag TAG (see "tags" variable below). When no *system* is given, all defined systems are backed up. @@ -166,6 +167,17 @@ Supported file systems are: The latest snapshot is always reachable using a symlink named `latest` inside the system directory. +### [default_]tags + +Comma-separated list of tags of this job. All uppercase tag names are reserved +and become set automatically on runtime: + +- NONE: Jobs with no other tags at all. +- ALL: Matches all jobs, regardless of their tags (see `-t`/`--tags` option). +- LOCAL: All jobs running on "localhost". + +Default: NONE. + ### [default_]job_pre_exec Optional script to execute before `rsync` starts. Default: none. diff --git a/bin/backup-script b/bin/backup-script index 1099f0c..4107e24 100755 --- a/bin/backup-script +++ b/bin/backup-script @@ -15,6 +15,7 @@ PIDFILE="/var/run/$NAME.pid" DRYRUN=0 VERBOSE=0 +TAG="" export LC_ALL=C @@ -46,12 +47,14 @@ default_local=0 default_generations=0 default_job_pre_exec="" default_job_post_exec="" +default_tags="" Usage() { echo "Usage: $NAME [] [ [ [...]]]" echo - echo " -p, --progress Show progress, see rsync(1)." - echo " -n, --dry-run Test run only, don't copy any data." + echo " -n, --dry-run Test run only, don't copy any data." + echo " -p, --progress Show progress, see rsync(1)." + echo " -t TAG, --tag TAG Only run jobs with tag TAG." echo echo "When no is given, all defined systems are used." echo @@ -292,6 +295,10 @@ while [ $# -gt 0 ]; do "-p"|"--progress") VERBOSE=1; shift ;; + "-t"|"--tag") + shift; TAG="$1"; shift + [ -n "$TAG" ] || Usage + ;; "-"*) Usage ;; @@ -315,6 +322,8 @@ if [ $? -ne 0 ]; then exit 1 fi echo "Rsync command is $rsync, protocol version $rsync_proto." + +[[ -n "$TAG" ]] && echo "Running jobs tagged with \"$TAG\"." echo trap GotSignal SIGINT @@ -388,6 +397,7 @@ for f in $sys; do generations="$default_generations" job_pre_exec="$default_job_pre_exec" job_post_exec="$default_job_post_exec" + tags="$default_tags" # Compatibility with backup-pull(1) script: Save global values ... pre_exec_saved="$pre_exec" @@ -423,6 +433,22 @@ for f in $sys; do compress=0 fi + # Add "NONE" tag when no tags are given in the config file: + [[ -z "$tags" ]] && tags="NONE" + # Add "auto-tags": + [[ "$local" -eq 1 ]] && tags="$tags,LOCAL" + # Check tags + if [[ -n "$TAG" && "$TAG" != "ALL" ]]; then + echo "$tags" | grep -E "(^|,)$TAG(,|$)" >/dev/null 2>&1 + if [ $? -ne 0 ]; then + if [ "$DRYRUN" -ne 0 ]; then + echo "Tags of system \"$system\" don't match \"$TAG\": \"$tags\". Skipped." + echo + fi + continue + fi + fi + # Make sure "source" ends with a slash ("/") case "$source" in "*/") -- 2.39.2