added comments to the script, fixed a couple of lines of code
This commit is contained in:
parent
ec4a6119f7
commit
4eaaf32b10
1 changed files with 27 additions and 6 deletions
33
backup.zsh
33
backup.zsh
|
@ -5,16 +5,19 @@ default_postfix=$(date +%F-%H%M)
|
||||||
default_ftp_port='21'
|
default_ftp_port='21'
|
||||||
default_ssh_port='22'
|
default_ssh_port='22'
|
||||||
|
|
||||||
|
# echo to stderr
|
||||||
function err
|
function err
|
||||||
{
|
{
|
||||||
[[ -n $1 ]] && echo $1 >&2
|
[[ -n $1 ]] && echo $1 >&2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# standard configuration error message to stderr
|
||||||
function cfg_err
|
function cfg_err
|
||||||
{
|
{
|
||||||
[[ -n $1 ]] && echo "$1 is not set in configuration, but is required by $self_name to work." >&2
|
[[ -n $1 ]] && echo "$1 is not set in configuration, but is required by $self_name to work." >&2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# print help
|
||||||
function usage
|
function usage
|
||||||
{
|
{
|
||||||
echo "usage: $self_name [--help|--conf /path/to/config]
|
echo "usage: $self_name [--help|--conf /path/to/config]
|
||||||
|
@ -24,9 +27,10 @@ function usage
|
||||||
Default config path $default_cfg will be used if invoked without options"
|
Default config path $default_cfg will be used if invoked without options"
|
||||||
}
|
}
|
||||||
|
|
||||||
# function to read the configuration file and spit out some exceptions if stuff is missing
|
# read the configuration file and spit out some exceptions if stuff is missing
|
||||||
function apply_config
|
function apply_config
|
||||||
{
|
{
|
||||||
|
# testing remote settings only needed for non-local backups
|
||||||
function test_remote_settings
|
function test_remote_settings
|
||||||
{
|
{
|
||||||
if [[ -z $remote_host ]]; then
|
if [[ -z $remote_host ]]; then
|
||||||
|
@ -46,7 +50,9 @@ function apply_config
|
||||||
return 5
|
return 5
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
# import contents of the config (including functions if present)
|
||||||
source $cfg || { err "Config file $cfg is unreadable or does not exist"; return 15 }
|
source $cfg || { err "Config file $cfg is unreadable or does not exist"; return 15 }
|
||||||
|
# do the tests
|
||||||
if [[ -z $source_dirs ]]; then
|
if [[ -z $source_dirs ]]; then
|
||||||
cfg_err 'source_dirs'
|
cfg_err 'source_dirs'
|
||||||
return 5
|
return 5
|
||||||
|
@ -59,18 +65,19 @@ function apply_config
|
||||||
err 'local_host is not set, using hostname.'
|
err 'local_host is not set, using hostname.'
|
||||||
local_host=$HOST
|
local_host=$HOST
|
||||||
fi
|
fi
|
||||||
# date postfix
|
|
||||||
if [[ -z $outfile_postfix ]]; then
|
if [[ -z $outfile_postfix ]]; then
|
||||||
postfix=$default_postfix
|
postfix=$default_postfix
|
||||||
else
|
else
|
||||||
postfix=$outfile_postfix
|
postfix=$outfile_postfix
|
||||||
fi
|
fi
|
||||||
|
# set defaults and / or fail to run if something is missing
|
||||||
case $protocol in
|
case $protocol in
|
||||||
('ftp'|'ftps') port=${remote_port:-$default_ftp_port}; test_remote_settings; return $?;;
|
('ftp'|'ftps') port=${remote_port:-$default_ftp_port}; test_remote_settings; return $?;;
|
||||||
('sftp'|'ssh') port=${remote_port:-$default_ssh_port}; test_remote_settings; return $?;;
|
('sftp'|'ssh') port=${remote_port:-$default_ssh_port}; test_remote_settings; return $?;;
|
||||||
('local') unset remote_port;;
|
('local') unset remote_port;;
|
||||||
(*) cfg_err 'protocol'; return 5;;
|
(*) cfg_err 'protocol'; return 5;;
|
||||||
esac
|
esac
|
||||||
|
# set variables for tar command
|
||||||
case $compress_format in
|
case $compress_format in
|
||||||
('xz') compress_flag='J' ;;
|
('xz') compress_flag='J' ;;
|
||||||
('bz2') compress_flag='j' ;;
|
('bz2') compress_flag='j' ;;
|
||||||
|
@ -104,8 +111,10 @@ function generate_fullpath
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function compress # compress to stdout
|
# compress to stdout
|
||||||
|
function compress
|
||||||
{
|
{
|
||||||
|
# snapshot file is per directory so we cannot test it within apply_config()
|
||||||
if [[ -n $snapshot_file ]]; then
|
if [[ -n $snapshot_file ]]; then
|
||||||
if printf '' >> $snapshot_file; then
|
if printf '' >> $snapshot_file; then
|
||||||
snapshot_option='-g'
|
snapshot_option='-g'
|
||||||
|
@ -113,11 +122,14 @@ function compress # compress to stdout
|
||||||
err "Snapshot file $snapshot_file cannot be written. Proceeding with full backup."
|
err "Snapshot file $snapshot_file cannot be written. Proceeding with full backup."
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
# do the magic and spit to stdout
|
||||||
tar -c$compress_flag $snapshot_option $snapshot_file $exclude_option $exclude_list --ignore-failed-read -C $src_basedir $src_basename
|
tar -c$compress_flag $snapshot_option $snapshot_file $exclude_option $exclude_list --ignore-failed-read -C $src_basedir $src_basename
|
||||||
}
|
}
|
||||||
|
|
||||||
function store # store to local or remote
|
# store to local or remote
|
||||||
|
function store
|
||||||
{
|
{
|
||||||
|
# take from stdin and do the magic
|
||||||
case $protocol in
|
case $protocol in
|
||||||
('local') dd of=$outfile ;;
|
('local') dd of=$outfile ;;
|
||||||
('ssh') ssh -p$port $remote_user@$remote_host "dd of=$outfile" ;;
|
('ssh') ssh -p$port $remote_user@$remote_host "dd of=$outfile" ;;
|
||||||
|
@ -125,32 +137,41 @@ function store # store to local or remote
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# self explanatory, using case statement, so no one dash multiple opts supported
|
||||||
function parse_opts
|
function parse_opts
|
||||||
{
|
{
|
||||||
while [[ -n $1 ]]; do
|
while [[ -n $1 ]]; do
|
||||||
case $1 in
|
case $1 in
|
||||||
('--help'|'-h') usage; exit 0;;
|
('--help'|'-h') usage; exit 0;;
|
||||||
('--conf'|'-c') shift; opt_cfg=$1; shift;;
|
('--conf'|'-c') shift; opt_cfg=$1; shift;;
|
||||||
('') opt_cfg=$default_cfg;;
|
|
||||||
(*) err "unknown parameter $1"; exit 127;;
|
(*) err "unknown parameter $1"; exit 127;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# the main logic
|
||||||
function main
|
function main
|
||||||
{
|
{
|
||||||
|
# parse options
|
||||||
parse_opts $@
|
parse_opts $@
|
||||||
|
# set default config if $opt_cfg is not defined via an option
|
||||||
cfg=${opt_cfg:-$default_cfg}
|
cfg=${opt_cfg:-$default_cfg}
|
||||||
|
# run config tests and fill in defaults
|
||||||
apply_config
|
apply_config
|
||||||
|
# fail in case something goes wrong
|
||||||
local apply_config_returns=$?
|
local apply_config_returns=$?
|
||||||
[[ $apply_config_returns -ne 0 ]] && return $apply_config_returns
|
[[ $apply_config_returns -ne 0 ]] && return $apply_config_returns
|
||||||
|
# run backups per directory
|
||||||
for i in $source_dirs; do
|
for i in $source_dirs; do
|
||||||
|
# prepare the set of variables
|
||||||
unset src_basename src_basedir outfile
|
unset src_basename src_basedir outfile
|
||||||
IFS=':' read source_dir snapshot_file <<< $i
|
IFS=':' read source_dir snapshot_file <<< $i
|
||||||
src_basename=${source_dir:t}
|
src_basename=${source_dir:t}
|
||||||
src_basedir=${source_dir:h}
|
src_basedir=${source_dir:h}
|
||||||
|
# generate the backups path
|
||||||
generate_fullpath
|
generate_fullpath
|
||||||
echo "Creating a backup of $source_dir. Using protocol $protocol to store it in $outfile."
|
err "Creating a backup of $source_dir via $protocol to store it in $outfile."
|
||||||
|
# pipe magic into magic
|
||||||
compress | store
|
compress | store
|
||||||
done
|
done
|
||||||
return 0
|
return 0
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue