summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Vertes <mvertes@free.fr>2021-12-06 15:36:55 +0100
committerMarc Vertes <mvertes@free.fr>2021-12-06 15:36:55 +0100
commit14b5c600034a9d52497af2974f30dafc21710282 (patch)
tree24f2e793ffa777a13d95274c98210668ab19f1a0
parent0ef8a62a84932a70be06686c55205793921b783b (diff)
update
-rw-r--r--.backupignore1
-rw-r--r--.bashrc4
-rwxr-xr-xbin/backup57
-rwxr-xr-xbin/backup-clean132
4 files changed, 91 insertions, 103 deletions
diff --git a/.backupignore b/.backupignore
index b4667fa..a660b53 100644
--- a/.backupignore
+++ b/.backupignore
@@ -13,6 +13,7 @@ go/pkg
*.socket
*.db-wal
*.db-shm
+*- Google Drive
httpstorages.*
SiriAnalytics.db
Application Support/Knowledge/
diff --git a/.bashrc b/.bashrc
index 5c0cdee..c5bdc82 100644
--- a/.bashrc
+++ b/.bashrc
@@ -38,12 +38,12 @@ export LESS=Rx4
# gnuplot display in terminal
export GNUTERM='sixelgd enhanced truecolor font "arial,9"'
+export BACKUP=bip:/home/backup/marc@m1
+
# Stopwatch
alias timer='echo "Timer started. Stop with Ctrl-D." && date && time cat && date'
#export TERMINAL=xt
-
-alias bu='backup -uvd bip:/home/backup/m1'
#alias cl='cf xft:Mono:size=12'
#alias cp='cp --reflink'
#alias ls='ls --color=auto -v'
diff --git a/bin/backup b/bin/backup
index 9de097f..3964927 100755
--- a/bin/backup
+++ b/bin/backup
@@ -1,38 +1,47 @@
#!/bin/sh
-# Incremental backup using rsync(1).
-backup() {
- date=$(date +%Y%m%d_%H%M%S)
- last=$(rsync --list-only "$dest/" 2>/dev/null | awk '{r=$NF} END {print r}')
+usage() {
+ echo "Usage: $0 [-nv] [[[user@]host]:dir]
- case $last in
- ([12]*) opt_link=--link-dest=../$last;;
- (*) opt_link=;;
- esac
+Incremental backup using rsync(1). If run as root, a full system
+backup is performed. Otherwise, the user's home directory is backed.
- rsync -HSxa$optv --exclude-from=$ignore $opt_link $volumes "$dest/$date"
-}
+Options:
+-n dry-run
+-v verbose
-dest=/.history
-ignore=/etc/backupignore
-volumes='/ /boot'
+Files:
+- $HOME/.backupignore exclude files from user backup (non root)
+- /etc/backupignore exclude files from system backup (root)
+
+Environment:
+- BACKUP backup directory"
+}
-while getopts :d:i:nuv opt; do
+while getopts :nv opt; do
case $opt in
- (d) dest="$OPTARG" ;;
- (i) ignore="$OPTARG" ;;
(n|v) optv="$opt$optv" ;;
- (u) optu=1 volumes="$HOME" ignore="$HOME/.backupignore" ;;
- (*) echo "Usage: $0 [-nuv] [-d [[user@]host:]dir] [clean|diff]"; exit 1 ;;
+ (*) usage; exit 1 ;;
esac
done
shift $((OPTIND - 1))
-[ "$optu" ] || [ "$USER" = root ] || exec sudo "$0" "$@"
+BACKUP=${1:-$BACKUP}
+[ "$BACKUP" ] || { usage; exit 1; }
-[ "$1" ] && cmd=$1 && shift || cmd=""
-case $cmd in
-(""|save) backup ;;
-(clean) exec backup-clean ${optv+-$optv} "$@" "$dest";;
-(diff) exec diffdir "$@";;
+[ "$USER" = root ] &&
+ ignore=/etc/backupignore volumes='/ /boot' ||
+ ignore="$HOME/.backupignore" volumes="$HOME"
+[ -f "$ignore" ] && ignore="--exclude-from=$ignore" || ignore=
+
+last=$(rsync --list-only "$BACKUP/" 2>/dev/null | awk '{r=$NF} END {print r}')
+case $last in
+([12]*) opt_link=--link-dest=../$last;;
+(*) opt_link=;;
esac
+
+date=$(date +%Y-%m-%d-%H%M%S)
+
+[ "$optv" ] && echo "# Backup $volumes to $BACKUP/$date"
+
+exec rsync -HSxa$optv $ignore $opt_link $volumes "$BACKUP/$date"
diff --git a/bin/backup-clean b/bin/backup-clean
index 30d25db..f5baa29 100755
--- a/bin/backup-clean
+++ b/bin/backup-clean
@@ -1,89 +1,67 @@
#!/bin/sh
-# backup garbage collector
-[ "$USER" = root ] || exec sudo "$0" "$@"
-# Durations, in number of seconds.
-hd=3600 # hour duration: 60s * 60
-h12=43200 # 12h: hd * 12
-dd=86400 # day duration: hd * 24
-wd=604800 # week duration: dd * 7
-md=2592000 # month duration: dd * 30
-yd=31557600 # year duration: dd * 365.25
+usage() {
+ echo "Usage: $0 [-nv] [[[user@]host:]dir]
-now=$(date +'%Y%m%d_%H%M%S')
+$0 removes old backups and keeps:
+- backups for the current day
+- 1 backup per past day for the current month
+- 1 backup per past month for the current year
+- 1 backup per past year
-# The following works only for busybox date, not coreutils
-# Kept for reference only.
-#date2ts() { d=${1%_*} t=${1#*_}; date -d "$d${t%??}" +%s; }
+Options:
+-n dry run
+-v verbose
-# Convert date to timestamp, using date from GNU coreutils,
-# works also with busybox date.
-date2ts() {
- t=$1; r=${t#????}; Y=${t%$r} # Year (with century)
- t=$r; r=${t#??}; m=${t%$r} # Month
- t=$r; r=${t#??}; d=${t%$r} # Day
- t=${r#_}; r=${t#??}; H=${t%$r} # Hour
- t=$r; r=${t#??}; M=${t%$r} # Minute
- S=${t#??} # Second
- date -d "$Y-$m-$d $H:$M:$S" +%s
- #date -jf "%Y-%m-%d %H:%M:%S" "$Y-$m-$d $H:$M:$S" +%s # BSD, MacOS (not tested)
+Environment variables:
+- BACKUP - backup directory"
}
-ts2date() { date -d "@$1" +'%Y%m%d_%H%M%S'; }
-
-tsn=$(date2ts "$now")
-
-# Minimal retention delay in seconds, according to backup age,
-# implemented using POSIX shell arithmetic.
-retention_delay() {
- d=$((tsn - $1))
- if [ $((d < h12)) = 1 ]; then
- r=0 # keep all backups in the last 12 hours
- elif [ $((d < dd)) = 1 ]; then
- r=$hd # keep 1 backup per hour in the last day
- elif [ $((d < wd)) = 1 ]; then
- r=$dd # keep 1 backup per day in the last week
- elif [ $((d < md)) = 1 ]; then
- r=$wd # keep 1 backup per week in the last month
- elif [ $((d < yd)) = 1 ]; then
- r=$md # keep 1 backup per month in the last year
- else
- r=$yd # keep 1 backup per year in the previous years
- fi
- echo $r
-}
-
-dest=/.history
-while getopts :d:nv opt; do
+while getopts :nv opt; do
case $opt in
- (d) tsn=$(date2ts "$OPTARG") ;;
- (n) optn=1 ;;
- (v) optv=1 ;;
- (*) echo "Usage: $0 [-nv] [dir]"; exit 1 ;;
+ (n) optn=echo ;;
+ (v) optv=-t ;;
+ (*) usage; exit 1 ;;
esac
done
-shift $((OPTIND - 1))
-[ "$1" ] && dest=$1
+shift $((OPTIND -1))
+
+BACKUP=${1:-$BACKUP}
+[ "$BACKUP" ] || { usage; exit 1; }
-# Sorted list of backups, most recent first.
-lbu=$(ls -rv "$dest")
-lasy=${lbu##*
+host=${BACKUP%:*} dir=${BACKUP#*:}
+ls='ls -r' rm="xargs -r $optv $optn rm -rf"
+[ "$host" = "$dir" ] || ls="ssh $host $ls" rm="ssh $host $rm"
+
+[ "$optv" ] && echo "# Cleaning backups on $BACKUP"
+
+$ls "$dir" |
+awk -v now=$(date +%Y-%m-%d) -v dir="$dir" '
+BEGIN {
+ yn = substr(now, 1, 4) # Year now
+ mn = substr(now, 6, 2) # Month now
+ dn = substr(now, 9, 2) # Day now
}
-for d in $lbu; do
- tsc=$(date2ts "$d")
- if ! [ "$tsp" ]; then
- [ "$optv" ] && echo "keep $dest/$d"
- tsp=$tsc
- continue
- fi
- mrd=$(retention_delay "$tsp")
- dp=$((tsp - tsc))
- #if [ $((dp < mrd)) = 1 ]; then
- if [ "$d" != "last" -a $((dp < mrd)) = 1 ]; then
- [ "$optv" ] && echo "delete $dest/$d"
- [ "$optn" ] || rm -rf "${dest:?}/$d"
- else
- [ "$optv" ] && echo "keep $dest/$d"
- tsp=$tsc
- fi
-done
+{
+ yb = substr($0, 1, 4) # Year backup
+ mb = substr($0, 6, 2) # Month backup
+ db = substr($0, 9, 2) # Day backup
+ $0 = dir "/" $0
+
+ dy = yn - yb
+ dm = dy * 12 + mn - mb
+ # if (yb != yn) {
+ if (dm > 12)
+ if (yb in yearly) print; else yearly[yb] = 1
+ next
+ }
+ # if (mb != mn) {
+ dd = dm * 30 + dn - db
+ if (dd > 30) {
+ if (mb in monthly) print; else monthly[mb] = 1
+ next
+ }
+ if (db != dn) {
+ if (db in dayly) print; else dayly[db] = 1
+ }
+}' | $rm