summaryrefslogtreecommitdiff
path: root/rsyncshot
diff options
context:
space:
mode:
authorCraig Jennings <cjennings@citizen.lan>2021-04-04 15:53:57 -0500
committerCraig Jennings <cjennings@citizen.lan>2021-04-04 15:53:57 -0500
commit7749a67d3846bbb88d9c07c02fcbd92866da4ba0 (patch)
treea7869c017b31f315ea7b67d2bfc21d580c04019b /rsyncshot
parent8143a7e6890b3127968a45b839bcd1bc1b33cc8a (diff)
Added properties to insert comments.
Diffstat (limited to 'rsyncshot')
-rwxr-xr-x[-rw-r--r--]rsyncshot47
1 files changed, 47 insertions, 0 deletions
diff --git a/rsyncshot b/rsyncshot
index d12827e..5b01129 100644..100755
--- a/rsyncshot
+++ b/rsyncshot
@@ -1,4 +1,10 @@
#!/bin/bash
+# rsyncshot
+
+# Craig Jennings craigmartinjennings@gmail.com
+# Inspired by Mike Rubel: http://www.mikerubel.org/computers/rsync_snapshots/
+
+# Debugging
# uncomment next 4 lines for debugging output
# exec 5> >(logger -t $0)
@@ -6,6 +12,8 @@
# PS4='$LINENO: '
# set -x
+# Default Locations For Setup
+
SCRIPTLOC=/usr/local/bin/rsyncshot;
DESTINATION=/media/backup;
@@ -15,10 +23,17 @@ LOGHOME=/var/log/rsyncshot.log;
INCLUDES="$INSTALLHOME/include.txt";
EXCLUDES="$INSTALLHOME/exclude.txt";
+# Default Cron Job Entries
+# CRON_H = hourly on minute 0 from 1am to 11pm
+# CRON_D = daily at midnight, Monday - Saturday
+# CRON_W = weekly at midnight on Sundays
+
CRON_H="0 1-23 * * * $SCRIPTLOC hourly 22";
CRON_D="0 0 * * 1-6 $SCRIPTLOC daily 6";
CRON_W="0 0 * * 7 $SCRIPTLOC weekly 51";
+# Help
+
help()
{
echo ""
@@ -33,6 +48,8 @@ help()
echo "Notes:"
echo "- install and log locations defined in script."
+# Error
+
error()
{
echo "ERROR: $0: $@" 1>&2;
@@ -40,6 +57,8 @@ error()
exit 1;
}
+# Setup
+
setup()
{
# copy this file to directory on path
@@ -72,19 +91,31 @@ setup()
echo "hourly, daily, and weekly cron jobs installed.";
}
+# Check Help Option
+
if [ "$TYPE" = "HELP" ]; then help; exit; fi
+# Ensure Root
+
if [ "$EUID" -ne 0 ]; then error "This script must be run as root."; fi
+# Display How Script Was Started
+
echo "rsyncshot invoked on `date -u` with: $0 $1 $2";
+# Parameter Validation
+
if ! [[ $1 =~ [a-zA-Z] ]]; then error "snapshot type not recognized."; fi
TYPE=$(tr '[a-z]' '[A-Z]' <<< $1);
if [ "$TYPE" = "SETUP" ]; then setup; exit; fi
+# Validate Max Snapshots
+
if ! [[ $2 =~ [0-9] ]]; then error "max snapshots not a number."; fi
MAX=$(($2-1));
+# Validate Include File (Source Directories) Exist
+
if [ ! -f "$INCLUDES" ]; then error "include file $INCLUDES not found."; fi
SOURCES=$(<$INCLUDES);
for SOURCE in $SOURCES
@@ -92,8 +123,12 @@ do
if [ ! -d "$SOURCE" ]; then error "source $SOURCE not found"; fi
done
+# Validate Exclude File (Exclusion Patterns) Exist
+
if [ ! -f "$EXCLUDES" ]; then error "Exclude file $EXCLUDES not found."; fi
+# Sync Each Directory In Turn
+
for SOURCE in $SOURCES
do
rsync -avh -i --times \
@@ -102,10 +137,14 @@ do
--update $SOURCE $DESTINATION/latest ;
done
+# Delete Max+1 Snapshot If Exists
+
if [ -d $DESTINATION/$TYPE.$MAX ]; then
rm -rf $DESTINATION/$TYPE.$MAX;
fi
+# Rotate Snapshots Descending
+
for (( start=$(($MAX)); start>=0; start--)); do
end=$(($start+1));
if [ -d $DESTINATION/$TYPE.$start ]; then
@@ -113,11 +152,19 @@ for (( start=$(($MAX)); start>=0; start--)); do
fi
done
+# Reset Directory Timestamp
+
touch $DESTINATION/latest
+# Hard Link Only Copy to Destination
+
cp -al $DESTINATION/latest $DESTINATION/$TYPE.0;
+# Make Directory Type Read-Only
+
chmod -w $DESTINATION/$TYPE.0
+# Print Time and Exit
+
echo "rsyncshot completed `date -u` ";
exit 0;