58 lines
1.9 KiB
Bash
Executable File
58 lines
1.9 KiB
Bash
Executable File
#! /bin/sh -
|
|
# Depends on GNU cp, log.err
|
|
|
|
############################### completion start ###############################
|
|
options='--no-chattr --no-sudo'
|
|
if [ -n "${COMP_LINE}" ] ; then
|
|
if [ "${1}" = "${3}" ] && [ ! "${2#-}" = "${2}" ] ; then
|
|
for option in $options ; do
|
|
case "${option}" in
|
|
"${2}"*) printf '%s\n' "${option}" ;;
|
|
esac
|
|
done
|
|
elif [ "${2#-}" = "${2}" ] ; then
|
|
find "$(dirname -- "${2}")" -mindepth 1 -maxdepth 1 -path "$(dirname -- "${2}")/$(basename -- "${2}")*"
|
|
fi
|
|
exit
|
|
fi
|
|
################################ completion end ################################
|
|
|
|
############################ argument parsing start ############################
|
|
no_chattr=0
|
|
no_sudo=0
|
|
while : ; do
|
|
case "${1}" in
|
|
--no-chattr|-c) no_chattr=1 ;;
|
|
--no-sudo|-s) no_sudo=1 ;;
|
|
-*) log.err "Invalid option argument: '${1}'" ; exit 1 ;;
|
|
*) break ;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
test "${#}" -ne "2" && { log.err "Usage: backup_dir [--no-chattr] [--no-sudo] BACKUP_DIR DIR" ; exit 1 ; }
|
|
|
|
backupdir="${1:-${HOME}/backups}"
|
|
srcdir="${2}"
|
|
############################# argument parsing end #############################
|
|
|
|
if [ "${no_sudo}" = "1" ] ; then
|
|
sudo_cmd=""
|
|
else
|
|
sudo_cmd="sudo --"
|
|
fi
|
|
|
|
backupname="$(basename -- "$srcdir")"
|
|
|
|
[ -d "${srcdir}" ] || { log.err "Directory '${srcdir}' does not exist" ; exit 2 ; }
|
|
[ -d "${backupdir}" ] || mkdir -p -- "${backupdir}" || { log.err "Backup Directory '${backupdir}' couldn't be created" ; exit 3 ; }
|
|
|
|
if [ -e "${backupdir}/${backupname}" ] && [ "${no_chattr}" = "0" ] ; then
|
|
$sudo_cmd chattr -i "${backupdir}/${backupname}" || { log.err "Can't chattr -i '${backupdir}/${backupname}'" ; exit 4 ; }
|
|
fi
|
|
tar --backup=t -cvzf "${backupdir}/${backupname}" "${srcdir}" || { log.err "Can't tar --backup=t -cvzf '${backupdir}/${backupname}' '${srcdir}'" ; exit 5 ; }
|
|
|
|
if [ "${no_chattr}" = "0" ] ; then
|
|
$sudo_cmd find "${backupdir}" -mindepth 1 -exec chattr +i {} + || { log.err "Can't chattr +i some files" ; exit 6 ; }
|
|
fi
|