summaryrefslogtreecommitdiff
path: root/backup.in
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2016-05-04 10:20:42 +0200
committerErich Eckner <git@eckner.net>2016-05-04 10:20:42 +0200
commite63bf65b3661e582a2a6b42b131c3a53f04108a4 (patch)
tree2247570e88f487dc5bd3d08dfd335cce565490ce /backup.in
parent930ced0b96e4b0ac32eadf1037c1c3e78e3988ec (diff)
downloadhardlinkedBackups-e63bf65b3661e582a2a6b42b131c3a53f04108a4.tar.xz
Makefile, manpage neu, neue Version
Diffstat (limited to 'backup.in')
-rwxr-xr-xbackup.in117
1 files changed, 117 insertions, 0 deletions
diff --git a/backup.in b/backup.in
new file mode 100755
index 0000000..fdc467e
--- /dev/null
+++ b/backup.in
@@ -0,0 +1,117 @@
+#!/bin/bash
+
+. #ETCDIR#/backup.conf
+
+usage()
+{
+ >&2 echo 'This is backup version #VERSION#'
+ >&2 echo ''
+ >&2 echo 'usage:'
+ >&2 echo ' backup /tmp/pidFile /path/to/destination/ user@source:path'
+ >&2 echo ' backup /tmp/pidFile /path/to/destination/ user@source:path proxy_user@ssh_host'
+ >&2 echo 'or as a symlink (e.g. in /etc/cron/daily) named after a key of $backups in #ETCDIR#/backup.conf without arguments'
+ exit 1
+}
+
+if [ $# -eq 0 ]
+then
+ backupID="$(basename $0)"
+ [ -z "${backups[${backupID}]}" ] && usage
+ set /tmp/${backupID}.pid ${backups[${backupID}]}
+fi
+
+Basis="$2"
+pidFile="$1"
+QuellIP=$(echo "$3" | sed "s|^[a-zA-Z]*://||; s|^[a-zA-Z]*@||; s|:\?/.*$||")
+
+if [ "$#" -eq 3 ]
+then
+ Quelle="$3"
+elif [ "$#" -eq 4 ]
+then
+ sshHopp="$4"
+ lokPort=$[$RANDOM/2+8000]
+ rsyncShell="-e ssh -p${lokPort} -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
+ tunnelBefehl="ssh -t -t -L${lokPort}:${QuellIP}:22 ${sshHopp}"
+ HoppIP="${sshHopp#*@}"
+ Quelle="$(echo "$3" | sed "s|${QuellIP}|127.0.0.1|")"
+else
+ usage
+fi
+
+ping -c1 ${QuellIP} > /dev/null || exit 11
+if [ -n "${HoppIP}" ]
+then
+ ping -c1 ${HoppIP} > /dev/null || exit 11
+fi
+
+if [ ! -d ${Basis} ]
+then
+ [ $(mount | grep -c "\S\+\s\+\S\+\s\+/var/ftp\s") -eq 0 ] && exit 11
+ exit 2
+fi
+
+neues_Datum=${Basis}/$(date "+%Y_%m_%d")
+neues=${Basis}/aktuell
+linkdests=""
+for s in $(ls -1tr ${Basis} | grep -v aktuell | tail -n20 )
+do
+ linkdests="${linkdests} --link-dest ${Basis}/${s}"
+done
+
+if [ ! "$(whoami)" == "root" ]
+then
+ echo "I need to be root."
+ exit 3
+fi
+
+[ -w ${Basis} ] || exit 11
+[ -e ${neues_Datum} ] && exit 4
+[ -e ${pidFile} ] && exit 5
+
+echo $$ > ${pidFile}
+
+if [ -n "${tunnelBefehl}" ]
+then
+ ${tunnelBefehl} &
+ backgroundPid=$!
+ sleep 4
+fi
+
+for toExclude in ${excludes}
+do
+ excludeArgs="${excludeArgs} --exclude ${toExclude}"
+done
+
+if [ ! -e ${neues} ]
+then
+ mkdir ${neues}
+fi
+chmod 750 ${neues}
+chown erich:root ${neues}
+if [ -z "${rsyncShell}" ]
+then
+ rsync -av -x --no-p --no-o --no-g ${linkdests} \
+ ${excludeArgs} \
+ ${Quelle} ${neues}/
+ sleep 1
+ rsync ${Quelle}
+else
+ rsync "${rsyncShell}" -av -x --no-p --no-o --no-g ${linkdests} \
+ ${excludeArgs} \
+ ${Quelle} ${neues}/
+ sleep 1
+ rsync "${rsyncShell}" ${Quelle}
+fi
+erg=$?
+
+[ -n "${backgroundPid}" ] && kill ${backgroundPid}
+
+if [ ${erg} -eq 0 ] || [ ${erg} -eq 24 ]
+then
+ mv ${neues} ${neues_Datum}
+ rm ${pidFile}
+else
+ rm ${pidFile}
+ exit 11
+fi