meta-sysmocom-bsp/recipes-support/backup-scripts/files/cbackup

191 lines
4.3 KiB
Bash

#!/bin/sh
STAG=cbackup:
# lock wait time max 15mn * 60 = 900 secs (sufficient time to update)
LOCKWAIT=900
# this is a protection to make sure a backup is not currently created while checking
bname=mbackup
BAKPATH=""
_curr_dir=""
BAKEXT=".tar.gz"
BAKMD5EXT=".md5"
mybasename=""
readonly LOCKFILE_DIR=/var/lock
readonly LOCK_FD=980
lock() {
local prefix=$1
local fd=${2:-$LOCK_FD}
local lock_file=$LOCKFILE_DIR/$prefix.lock
# still allow to run unlocked if the lock dir does not exist
if [ ! -d "${LOCKFILE_DIR}" ]; then
return 0
fi
# create lock file
eval "exec $fd>$lock_file"
# still allow to run unlocked if the lock file cannot be created
if [ $? -ne 0 ]; then
return 0
fi
# acquier the lock
flock -w ${LOCKWAIT} $fd \
&& return 0 \
|| return 1
}
unlock() {
local prefix=$1
local fd=${2:-$LOCK_FD}
local lock_file=$LOCKFILE_DIR/$prefix.lock
# release the lock
flock -u $fd
sync
}
function my_exit()
{
cd "$_curr_dir"
unlock $bname
exit $*
}
function __sig_int {
log_write " "
log_write "$STAG WARNING: SIGINT caught"
my_exit 110
}
function __sig_quit {
log_write " "
log_write "$STAG WARNING: SIGQUIT caught"
my_exit 111
}
function __sig_term {
log_write " "
log_write "$STAG WARNING: SIGTERM caught"
my_exit 112
}
function __sig_hup {
log_write " "
log_write "$STAG WARNING: SIGHUP caught"
my_exit 113
}
function log_write()
{
echo "$*"
}
function log_write_nr()
{
echo -n "$*"
}
function show_help {
log_write "cbackup help information:"
log_write "checks integrity of backup created with mbackup, exit with 0 when valid"
log_write "Usage: cbackup [ --help ] <bfile>"
log_write " where: <bfile> # source backup base file name (without .tar.gz)"
log_write " # same base file name as provided with mbackup -f option"
log_write " --help # displays this help information"
log_write "example: cbackup /mnt/storage/.sysbackup/bk-mnt-rom-user # checks backup"
}
function check_path()
{
local retval=0
local slen=${#1}
local mystr
if ! [ -d $1 ] ; then
log_write "$STAG directory does not exist ($1)!"
retval=80
else
if [ "${1:$slen - 1:1}" == "/" ] ; then
mystr=${1:0:$slen - 1}
slen=$((slen-1))
else
mystr=$1
fi
BAKPATH=$mystr"/"
fi
return $retval
}
_curr_dir=`pwd`
# Lock to test a single instance is running, and exit if wait timeout
log_write "$STAG Checking if allowed to run..."
lock $bname || ( log_write "$STAG Checking if allowed to run... failed"; exit 100 )
log_write "$STAG Checking if allowed to run... done"
# Set TRAPs to release lock if forced to exit
trap __sig_int SIGINT
trap __sig_quit SIGQUIT
trap __sig_term SIGTERM
trap __sig_hup SIGHUP
TOTALARG=$#
while getopts :- FLAG; do
case $FLAG in
'-')
show_help
my_exit 0;;
\?)
log_write "Invalid option: -$OPTARG" && my_exit 1;;
\:)
log_write "Required argument not found for option: -$OPTARG" && my_exit 2;;
esac
done
# removes processed option(s) from the cmd line args
shift $((OPTIND-1))
if [ "$#" -ne 1 ]; then
show_help
my_exit 3
fi
check_path `dirname "$1"`
valret=$?
if [ $valret -ne 0 ]; then
my_exit $valret
fi
mybasename=`basename "$1"`
log_write "$STAG Checking backup: "$BAKPATH$mybasename
if ! [ -f $BAKPATH$mybasename$BAKEXT ] ; then
log_write "$STAG Source backup does not exist ($BAKPATH$mybasename$BAKEXT)!"
my_exit 4
fi
if ! [ -f $BAKPATH$mybasename$BAKMD5EXT ] ; then
log_write "$STAG Source backup MD5 does not exist ($BAKPATH$mybasename$BAKMD5EXT)!"
my_exit 5
fi
# verify if backup is valid
cd $BAKPATH
if [ $? != 0 ]; then
log_write "$STAG change dir to ($BAKPATH) failed."
my_exit 6
fi
# verifies if md5 is for the expected backup file
md5file=`cat $BAKPATH$mybasename$BAKMD5EXT | awk '{ print $2 }'`
if ! [ "./"$mybasename$BAKEXT == "$md5file" ]; then
log_write "$STAG MD5 ref file is not backup file ($md5file)!"
my_exit 7
fi
# verifies if md5 is correct
myresult=$(md5sum -c $BAKPATH$mybasename$BAKMD5EXT 2>&1)
myres=$?
if [ $myres != 0 ]; then
log_write "$STAG Checksum invalid"
my_exit 8
fi
log_write "$STAG Checksum Ok."
my_exit 0