diff --git a/docs/30_Scripts.md b/docs/30_Scripts.md index 52ca90ba37d5b98754070c5add211680d952fe17..1773b02dd931ce8b5b88d8cb1de12e0c4ac431bc 100644 --- a/docs/30_Scripts.md +++ b/docs/30_Scripts.md @@ -139,6 +139,7 @@ The inc_config.sh mus contain 3 variables for pruning prune_basedir=/netshare/restic-backup prune_params="--group-by paths,tags --prune --keep-within 180d --max-unused unlimited --max-repack-size 100M --cleanup-cache" prune_skipdays="7" + prune_cachedir=${prune_basedir}/.cache_for_pruning ``` ## rest_pruner.cfg @@ -162,9 +163,9 @@ ls -l rest_pruner.cfg ## Syntax ```txt - -========== RESTIC REST PRUNER v0.1 ========== - +------------------------------------------------------------------------------ + --------========###| RESTIC REST PRUNER :: v0.3 |###=======-------- +------------------------------------------------------------------------------ Pruner for restic rest server with append only option. This script prunes all repositories on server side. @@ -172,11 +173,21 @@ This script prunes all repositories on server side. The config file [rest_pruner.cfg] contains <USER>:<RESTIC_PASSWORD> If a directory matches /netshare/restic-backup/<USER> then it will be pruned. +Institute for Medical Education * University of Bern +GNU GPL 3.0 + + SYNTAX: rest_pruner.sh [OPTIONS] [FILTER] + OPTIONS: -h, --help show help and exit. + -a, --all process all repositories, default: rest only + archives + -d, --debug show more infos + -f, --force force pruning; do not wait 7 days + -s, --status show pruning status with last prunes + PARAMETERS: FILTER regex to filter directory list in @@ -185,10 +196,22 @@ PARAMETERS: EXAMPLES: rest_pruner.sh Start pruning of all matching repositories + rest_pruner.sh mail Prune servers that match "mail", eg. my-mailhub.example.com + rest_pruner.sh --force mail + Prune servers that match "mail", + eg. my-mailhub.example.com + + rest_pruner.sh --status + Show statistics with last prunes, if it is archive or + running or on error. + It shows repositories with passwords and archives. + Other repositories are not visible until you + specify --all. + ``` ## How does it work diff --git a/inc_config.sh.dist b/inc_config.sh.dist index 18621c01014cc5ee11cbe65cabb256c57be0df51..9912b902c96960705efa4f61ca27bb350721e5e9 100644 --- a/inc_config.sh.dist +++ b/inc_config.sh.dist @@ -28,7 +28,9 @@ sLogfile="$sLogdir/connections.log" # for prune on restic rest server - prune_params="--group-by paths,tags --prune --keep-within 180d --max-unused unlimited --max-repack-size 100M --cleanup-cache" + prune_basedir=/netshare/restic-backup + prune_params="--group-by paths,tags --prune --keep-within 180d --max-unused unlimited --max-repack-size 100M --cleanup-cache --verbose=0" prune_skipdays="7" + prune_cachedir=${prune_basedir}/.cache_for_pruning # ---------------------------------------------------------------------- diff --git a/rest_pruner.sh b/rest_pruner.sh index 095490b488e9fda60d10c832e30306b0b266fa82..8fbf8d7ab650985565ce5439419116660a8ecf21 100755 --- a/rest_pruner.sh +++ b/rest_pruner.sh @@ -6,16 +6,18 @@ # ---------------------------------------------------------------------- # 2024-02-01 v0.1 <axel.hahn@unibe.ch> first lines # 2024-02-02 v0.2 <axel.hahn@unibe.ch> add: timer, skip file, skin N days, limit process time, stats +# 2024-02-03 v0.3 <axel.hahn@unibe.ch> enable cache dir; unlock before pruning # ====================================================================== cd "$( dirname $0 )" || exit -_version=0.2 +_version=0.3 logdir=_last_prune prune_basedir= prune_params= prune_skipdays=7 +prune_cachedir= # stop pruning more repositories when running longer N seconds prune_timeout=7200 @@ -40,6 +42,7 @@ typeset -i rcAll=0 . "inc_config.sh" || exit 1 cfgfile=rest_pruner.cfg || exit 1 +test -z "$prune_cachedir" && prune_cachedir="${prune_basedir}/.cache_for_pruning" # ---------------------------------------------------------------------- @@ -93,7 +96,7 @@ EXAMPLES: running or on error. It shows repositories with passwords and archives. Other repositories are not visible until you - specify -d. + specify --all. EOH } @@ -153,13 +156,24 @@ function _prune(){ fi if [ "$bDoRun" -eq "1" ]; then - local _user; _user=$( stat -c "%U" "$_dir" ) - echo ">>>>> $( _getTimer ) >>>>> $_dir" + echo ">>>>> $( _getTimer ) sec >>>>> $_dir" + + local _user; + _user=$( stat -c "%U" "$_dir" ) + + local _cachedir; + export _cachedir=$prune_cachedir/${mybase} + echo "Creating cache $_cachedir ..." + test -d "$_cachedir" || mkdir -p "$_cachedir" + chown ${_user}:${_user} "$_cachedir" + echo "Starting prune as user $_user ..." su - $_user - /bin/bash -c " echo START $( date ) $_dir export RESTIC_PASSWORD=$mypw - restic forget -r $_dir $prune_params 2>&1 + set -vx + restic unlock -r $_dir --cache-dir=$_cachedir 2>&1 + restic forget -r $_dir --cache-dir=$_cachedir $prune_params 2>&1 " | tee "${logfile}.running" rc=${PIPESTATUS[0]} rcAll+=$rc @@ -170,7 +184,10 @@ function _prune(){ else iCountPruneError+=1 mv "${logfile}.running" "${logfile}.error" + echo "!!! ERROR !!! pruning failed." fi + echo "Removing cache $_cachedir ..." + rm -rf "$_cachedir" fi else test "$bOptAll" -eq "1" && echo "SKIP: $_dir - no password for this repo"