#! /bin/sh - # Depends on GNU tar, log.err ############################### completion start ############################### options='--no-chattr --no-sudo' if [ -n "${COMP_LINE}" ] ; then if [ "${2#-}" = "${2}" ] ; then find "$(dirname -- "${2}")" -mindepth 1 -maxdepth 1 -path "$(dirname -- "${2}")/$(basename -- "${2}")*" else for option in $options ; do case "${option}" in "${2}"*) printf '%s\n' "${option}" ;; esac done 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 if [ "${#}" -eq "1" ] && [ -n "${1}" ]; then backupdir="${HOME}/backups" srcdir="${1}" elif [ "${#}" -eq "2" ] && [ -n "${1}" ] && [ -n "${2}" ] ; then backupdir="${1}" srcdir="${2}" else log.err "Usage: backup_dir [--no-chattr] [--no-sudo] [BACKUP_DIR] DIR" exit 1 fi ############################# 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