From: Frank Brehm Date: Wed, 19 Apr 2017 13:37:35 +0000 (+0200) Subject: Renaming pp_archive_old_homes.sh -> archive-old-homes.sh and adding output of version X-Git-Tag: 0.1.2~205 X-Git-Url: https://git.uhu-banane.de/?a=commitdiff_plain;h=8e336bfa1f18d6d30f2b00896ae383fb799acf13;p=pixelpark%2Fadmin-tools.git Renaming pp_archive_old_homes.sh -> archive-old-homes.sh and adding output of version --- diff --git a/archive-old-homes.sh b/archive-old-homes.sh new file mode 100755 index 0000000..b17fbc6 --- /dev/null +++ b/archive-old-homes.sh @@ -0,0 +1,451 @@ +#!/bin/bash +################################################################################ +## +## Header details +## +## Host..............: achilles.pixelpark.com +## Zone..............: N/A +## +## Copyright ........: Pixelpark AG +## File ........ ....: archive-old-homes.sh +## Maintained by ....: Frank Brehm +## Description ......: +## +## +## History ..........: +## +## Vers. Date By Reason +## ----- ----------- ---------------- --------------------------------------- +## 1.0 09.01.2009 thomas.kotschok initial Version +## 2.0 18.04.2017 frank.brehm modifying for running on Linux +## +################################################################################ + +set -e +set -u + +VERBOSE="n" +DEBUG="n" + +VERSION="2.1" + +# console colors: +RED="" +YELLOW="" +GREEN="" +BLUE="" +NORMAL="" + +HAS_TTY='y' + +DO_ASK="n" +SIMULATE="n" +NO_REMOVE="n" + +BASENAME="$(basename ${0})" +BASE_DIR="$(dirname ${0})" + +INPUT_TIMEOUT=5 + +DATE=$( date '+%G%m%d' ) + +HOMES_DIR="/mnt/nfs/home" +SAVEPATH="${HOMES_DIR}/_old_homes" +NODENAME=$( uname -n ) +LOGFILE="${SAVEPATH}/pp_archive_old_homes.log" +FILELIST="" + +declare -a DIRS2ARCH=() +declare -A BACKUP_FILES=() + +#------------------------------------------------------------------- +detect_color() { + + local safe_term="${TERM//[^[:alnum:]]/?}" + local match_lhs="" + local use_color="false" + [[ -f ~/.dir_colors ]] && match_lhs="${match_lhs}$(<~/.dir_colors)" + [[ -f /etc/DIR_COLORS ]] && match_lhs="${match_lhs}$(/dev/null \ + && match_lhs=$(dircolors --print-database) + [[ $'\n'${match_lhs} == *$'\n'"TERM "${safe_term}* ]] && use_color="true" + + # console colors: + if [ "${use_color}" = "true" ] ; then + RED="\033[38;5;196m" + YELLOW="\033[38;5;226m" + GREEN="\033[38;5;46m" + BLUE="\033[38;5;27m" + NORMAL="\033[39m" + else + RED="" + YELLOW="" + GREEN="" + BLUE="" + NORMAL="" + fi + + local my_tty=$(tty) + if [[ "${my_tty}" =~ 'not a tty' ]] ; then + my_tty='-' + fi + + if [[ "${my_tty}" = '-' || "${safe_term}" = "dump" ]] ; then + HAS_TTY='n' + fi + +} +detect_color + +#------------------------------------------------------------------------------ +description() { + echo -e $( cat <<-EOF + Archiving and removing all given directories beneath '${HOMES_DIR}'. + + EOF + ) +} + +#------------------------------------------------------------------------------ +usage() { + cat <<-EOF + Usage: ${BASENAME} [OPTIONS] [ [&2 + usage >&2 + exit 1 + fi + set -e + + # Note the quotes around `$TEMP': they are essential! + eval set -- "${tmp}" + + local p= + + while true ; do + case "$1" in + -a|--ask) + DO_ASK="y" + shift + ;; + -s|--simulate) + SIMULATE="y" + shift + ;; + -N|--no-remove) + NO_REMOVE="y" + shift + ;; + -d|--debug) + DEBUG="y" + shift + ;; + -v|--verbose) + VERBOSE="y" + shift + ;; + --nocolor) + RED="" + YELLOW="" + GREEN="" + BLUE="" + NORMAL="" + shift + ;; + -h|--help) + description + usage + exit 0 + ;; + -V|--version) + echo "${BASENAME} version: ${VERSION}" + exit 0 + ;; + --) shift + break + ;; + *) echo "Internal error!" + exit 1 + ;; + esac + done + + if [[ "${DEBUG}" = "y" ]] ; then + set -x + fi + + if [[ "$#" -lt 1 ]] ; then + DO_ASK="y" + else + local item + for item in "$@" ; do + base_dir=$( basename "${item}" ) + add_dir "${base_dir}" + done + if [[ "${#DIRS2ARCH[*]}" == "0" ]] ; then + DO_ASK="y" + fi + fi + +} + +######################################### +# Some often used funktions + +#------------------------------------------------------------------------------ +my_date() { + date +'%F %T.%N %:::z' +} + +#------------------------------------------------------------------------------ +debug() { + if [[ "${VERBOSE}" != "y" ]] ; then + return 0 + fi + echo -e " * [$(my_date)] [${BASENAME}:DEBUG]: $@" >&2 +} + +#------------------------------------------------------------------------------ +info() { + echo -e " ${GREEN}*${NORMAL} [$(my_date)] [${BASENAME}:${GREEN}INFO${NORMAL}] : $@" >&2 +} + +#------------------------------------------------------------------------------ +warn() { + echo -e " ${YELLOW}*${NORMAL} [$(my_date)] [${BASENAME}:${YELLOW}WARN${NORMAL}] : $@" >&2 +} + +#------------------------------------------------------------------------------ +error() { + echo -e " ${RED}*${NORMAL} [$(my_date)] [${BASENAME}:${RED}ERROR${NORMAL}]: $@" >&2 +} + +if [[ ! -d "${HOMES_DIR}" ]] ; then + echo "Directory '${HOMES_DIR}' does not exists." >&2 + exit 4 +fi +HOMES_DIR=$( readlink -f "${HOMES_DIR}" ) + +if [[ ! -d "${SAVEPATH}" ]] ; then + echo "Directory '${SAVEPATH}' does not exists." >&2 + exit 5 +fi +SAVEPATH=$( readlink -f "${SAVEPATH}" ) + +#------------------------------------------------------------------------------ +add_dir() { + + local base_dir="$1" + + local i= + local real_path="${HOMES_DIR}/${base_dir}" + local backup_file= + + if [[ ! -e "${real_path}" ]] ; then + error "Directory '${real_path}' does not exists." + return 0 + fi + + real_path=$( readlink -f "${real_path}" ) + if [[ "${real_path}" == "${SAVEPATH}" ]] ; then + error "Directory '${real_path}' is the backup directory." + return 0 + fi + + i=0 + backup_file="${SAVEPATH}/${base_dir}.${i}.tar.gz" + while [[ -e "${backup_file}" ]] ; do + i=$(( $i + 1 )) + backup_file="${SAVEPATH}/${base_dir}.${i}.tar.gz" + done + + info "ADD ${base_dir} -> ${backup_file}" + DIRS2ARCH+=("${base_dir}") + BACKUP_FILES[${base_dir}]="${backup_file}" + +} + +#------------------------------------------------------------------------------ +create_file_list() { + + local cont="1" + local input= + local base_dir= + local ret= + + info "Create a file list ..." + echo + + # constructing comand + echo + + while [[ "${cont}" -eq 1 ]] ; do + + echo "######################################" + echo " q = Done " + echo " e = Exit " + echo "weiteren hinzufügen oder mit \"q\" beenden?" + echo "######################################" + echo "" + + set +e + read -p "Directory [|q|e]: " -t "${INPUT_TIMEOUT}" input + ret="$?" + set -e + if [[ -z "${input}" ]] ; then + echo + fi + debug "Got input: \"${input}\", return value: ${ret}." + if [[ -z "${input}" ]] ; then + if [[ ${ret} -ne 0 ]] ; then + error "Input ${RED}timeout after ${INPUT_TIMEOUT} seconds${NORMAL}." + exit 1 + fi + continue + fi + case "${input}" in + q|Q) + cont=0 + ;; + e|E) + info "Exit" + exit 0 + ;; + *) + base_dir=$( basename "${input}" ) + add_dir "${base_dir}" + ;; + esac + done + +} + +#------------------------------------------------------------------------------ +backup_archive() { + + local base_dir= + local backup_file= + local real_path= + local cmd= + local annotation="Old home archive from ${NODENAME} -> ${SAVEPATH} - Date ${DATE}" + + if [[ "${SIMULATE}" != "y" ]] ; then + echo | tee -a "${LOGFILE}" + echo "${annotation}" | tee -a "${LOGFILE}" + else + echo + echo "${annotation}" + fi + cd "${HOMES_DIR}" + + for base_dir in "${DIRS2ARCH[@]}" ; do + + echo + debug "Performing '${base_dir}' ..." + + backup_file="${BACKUP_FILES[${base_dir}]}" + real_path="${HOMES_DIR}/${base_dir}" + + info "Creating '${GREEN}${backup_file}${NORMAL}' ..." + + cmd="tar --create --gzip --file=\"${backup_file}\" \"${base_dir}\"" + if [[ "${VERBOSE}" == "y" ]] ; then + echo "${cmd}" + fi + eval ${cmd} + + debug "Setting timestamps of '${backup_file}' ..." + cmd="touch -r \"${real_path}\" \"${backup_file}\"" + if [[ "${VERBOSE}" == "y" ]] ; then + echo "${cmd}" + fi + eval ${cmd} + + if [[ "${NO_REMOVE}" != "y" ]] ; then + info "Removing '${GREEN}${real_path}${NORMAL}' ..." + cmd="rm -rf \"${base_dir}\"" + if [[ "${VERBOSE}" == "y" ]] ; then + echo "${cmd}" + fi + if [[ "${SIMULATE}" != "y" ]] ; then + eval ${cmd} + fi + fi + + if [[ "${SIMULATE}" != "y" ]] ; then + echo " - ${base_dir} ${backup_file}" >> "${LOGFILE}" + fi + printf " " + ls -l "${backup_file}" || true + + if [[ "${SIMULATE}" == "y" ]] ; then + debug "Removing '${backup_file}' ..." + rm -f "${backup_file}" + fi + + done + +} + +################################################################################ +## +## Main +## +################################################################################ + +#------------------------------------------------------------------------------ +main() { + + get_options "$@" + + if [[ "${SIMULATE}" == "y" ]] ; then + info "Simulation mode, nothing is really done." + fi + + if [[ "${DO_ASK}" == "y" ]] ; then + create_file_list + fi + + if [[ "${#DIRS2ARCH[*]}" == "0" ]] ; then + warn "No directories to archive given." + exit 0 + fi + + backup_archive + + echo + info "Finished." + +} + +main "$@" + +exit 0 + +# vim: ts=4 et list diff --git a/pp_archive_old_homes.sh b/pp_archive_old_homes.sh deleted file mode 100755 index b4d4a25..0000000 --- a/pp_archive_old_homes.sh +++ /dev/null @@ -1,462 +0,0 @@ -#!/bin/bash -################################################################################ -## -## Header details -## -## Host..............: achilles.pixelpark.com -## Zone..............: N/A -## -## Copyright ........: Pixelpark AG -## File ........ ....: pp_archive_old_homes.sh -## Major-Version ....: 2 -## Minor-Version ....: 00 -## Maintained by ....: Frank Brehm -## Description ......: -## -## -## History ..........: -## -## Vers. Date By Reason -## ----- ----------- ---------------- --------------------------------------- -## 01 09.01.2009 thomas.kotschok initial Version -## -################################################################################ - -################################################################################ -## -## Vars -## -################################################################################ -## -## TIME -> last Days ago -## -## DATE -> Actual Time -## -## NODENAME -> machine name -## -## SAVEPATH -> where go's the archive -## -## ANNOTATION -> Archive save sets can be annotated -## -################################################################################ - -set -e -set -u - -VERBOSE="n" -DEBUG="n" - -# console colors: -RED="" -YELLOW="" -GREEN="" -BLUE="" -NORMAL="" - -HAS_TTY='y' - -DO_ASK="n" -SIMULATE="n" -NO_REMOVE="n" - -BASENAME="$(basename ${0})" -BASE_DIR="$(dirname ${0})" - -INPUT_TIMEOUT=5 - -DATE=$( date '+%G%m%d' ) - -HOMES_DIR="/mnt/nfs/home" -SAVEPATH="${HOMES_DIR}/_old_homes" -NODENAME=$( uname -n ) -LOGFILE="${SAVEPATH}/pp_archive_old_homes.log" -FILELIST="" - -declare -a DIRS2ARCH=() -declare -A BACKUP_FILES=() - -#------------------------------------------------------------------- -detect_color() { - - local safe_term="${TERM//[^[:alnum:]]/?}" - local match_lhs="" - local use_color="false" - [[ -f ~/.dir_colors ]] && match_lhs="${match_lhs}$(<~/.dir_colors)" - [[ -f /etc/DIR_COLORS ]] && match_lhs="${match_lhs}$(/dev/null \ - && match_lhs=$(dircolors --print-database) - [[ $'\n'${match_lhs} == *$'\n'"TERM "${safe_term}* ]] && use_color="true" - - # console colors: - if [ "${use_color}" = "true" ] ; then - RED="\033[38;5;196m" - YELLOW="\033[38;5;226m" - GREEN="\033[38;5;46m" - BLUE="\033[38;5;27m" - NORMAL="\033[39m" - else - RED="" - YELLOW="" - GREEN="" - BLUE="" - NORMAL="" - fi - - local my_tty=$(tty) - if [[ "${my_tty}" =~ 'not a tty' ]] ; then - my_tty='-' - fi - - if [[ "${my_tty}" = '-' || "${safe_term}" = "dump" ]] ; then - HAS_TTY='n' - fi - -} -detect_color - -#------------------------------------------------------------------------------ -description() { - echo -e $( cat <<-EOF - Archiving and removing all given directories beneath '${HOMES_DIR}'. - - EOF - ) -} - -#------------------------------------------------------------------------------ -usage() { - cat <<-EOF - Usage: ${BASENAME} [OPTIONS] [ [&2 - usage >&2 - exit 1 - fi - set -e - - # Note the quotes around `$TEMP': they are essential! - eval set -- "${tmp}" - - local p= - - while true ; do - case "$1" in - -a|--ask) - DO_ASK="y" - shift - ;; - -s|--simulate) - SIMULATE="y" - shift - ;; - -N|--no-remove) - NO_REMOVE="y" - shift - ;; - -d|--debug) - DEBUG="y" - shift - ;; - -v|--verbose) - VERBOSE="y" - shift - ;; - --nocolor) - RED="" - YELLOW="" - GREEN="" - BLUE="" - NORMAL="" - shift - ;; - -h|--help) - description - usage - exit 0 - ;; - --) shift - break - ;; - *) echo "Internal error!" - exit 1 - ;; - esac - done - - if [[ "${DEBUG}" = "y" ]] ; then - set -x - fi - - if [[ "$#" -lt 1 ]] ; then - DO_ASK="y" - else - local item - for item in "$@" ; do - base_dir=$( basename "${item}" ) - add_dir "${base_dir}" - done - if [[ "${#DIRS2ARCH[*]}" == "0" ]] ; then - DO_ASK="y" - fi - fi - -} - -######################################### -# Some often used funktions - -#------------------------------------------------------------------------------ -my_date() { - date +'%F %T.%N %:::z' -} - -#------------------------------------------------------------------------------ -debug() { - if [[ "${VERBOSE}" != "y" ]] ; then - return 0 - fi - echo -e " * [$(my_date)] [${BASENAME}:DEBUG]: $@" >&2 -} - -#------------------------------------------------------------------------------ -info() { - echo -e " ${GREEN}*${NORMAL} [$(my_date)] [${BASENAME}:${GREEN}INFO${NORMAL}] : $@" >&2 -} - -#------------------------------------------------------------------------------ -warn() { - echo -e " ${YELLOW}*${NORMAL} [$(my_date)] [${BASENAME}:${YELLOW}WARN${NORMAL}] : $@" >&2 -} - -#------------------------------------------------------------------------------ -error() { - echo -e " ${RED}*${NORMAL} [$(my_date)] [${BASENAME}:${RED}ERROR${NORMAL}]: $@" >&2 -} - -if [[ ! -d "${HOMES_DIR}" ]] ; then - echo "Directory '${HOMES_DIR}' does not exists." >&2 - exit 4 -fi -HOMES_DIR=$( readlink -f "${HOMES_DIR}" ) - -if [[ ! -d "${SAVEPATH}" ]] ; then - echo "Directory '${SAVEPATH}' does not exists." >&2 - exit 5 -fi -SAVEPATH=$( readlink -f "${SAVEPATH}" ) - -#------------------------------------------------------------------------------ -add_dir() { - - local base_dir="$1" - - local i= - local real_path="${HOMES_DIR}/${base_dir}" - local backup_file= - - if [[ ! -e "${real_path}" ]] ; then - error "Directory '${real_path}' does not exists." - return 0 - fi - - real_path=$( readlink -f "${real_path}" ) - if [[ "${real_path}" == "${SAVEPATH}" ]] ; then - error "Directory '${real_path}' is the backup directory." - return 0 - fi - - i=0 - backup_file="${SAVEPATH}/${base_dir}.${i}.tar.gz" - while [[ -e "${backup_file}" ]] ; do - i=$(( $i + 1 )) - backup_file="${SAVEPATH}/${base_dir}.${i}.tar.gz" - done - - info "ADD ${base_dir} -> ${backup_file}" - DIRS2ARCH+=("${base_dir}") - BACKUP_FILES[${base_dir}]="${backup_file}" - -} - -#------------------------------------------------------------------------------ -create_file_list() { - - local cont="1" - local input= - local base_dir= - local ret= - - info "Create a file list ..." - echo - - # constructing comand - echo - - while [[ "${cont}" -eq 1 ]] ; do - - echo "######################################" - echo " q = Done " - echo " e = Exit " - echo "weiteren hinzufügen oder mit \"q\" beenden?" - echo "######################################" - echo "" - - set +e - read -p "Directory [|q|e]: " -t "${INPUT_TIMEOUT}" input - ret="$?" - set -e - if [[ -z "${input}" ]] ; then - echo - fi - debug "Got input: \"${input}\", return value: ${ret}." - if [[ -z "${input}" ]] ; then - if [[ ${ret} -ne 0 ]] ; then - error "Input ${RED}timeout after ${INPUT_TIMEOUT} seconds${NORMAL}." - exit 1 - fi - continue - fi - case "${input}" in - q|Q) - cont=0 - ;; - e|E) - info "Exit" - exit 0 - ;; - *) - base_dir=$( basename "${input}" ) - add_dir "${base_dir}" - ;; - esac - done - -} - -#------------------------------------------------------------------------------ -backup_archive() { - - local base_dir= - local backup_file= - local real_path= - local cmd= - local annotation="Old home archive from ${NODENAME} -> ${SAVEPATH} - Date ${DATE}" - - if [[ "${SIMULATE}" != "y" ]] ; then - echo | tee -a "${LOGFILE}" - echo "${annotation}" | tee -a "${LOGFILE}" - else - echo - echo "${annotation}" - fi - cd "${HOMES_DIR}" - - for base_dir in "${DIRS2ARCH[@]}" ; do - - echo - debug "Performing '${base_dir}' ..." - - backup_file="${BACKUP_FILES[${base_dir}]}" - real_path="${HOMES_DIR}/${base_dir}" - - info "Creating '${GREEN}${backup_file}${NORMAL}' ..." - - cmd="tar --create --gzip --file=\"${backup_file}\" \"${base_dir}\"" - if [[ "${VERBOSE}" == "y" ]] ; then - echo "${cmd}" - fi - eval ${cmd} - - debug "Setting timestamps of '${backup_file}' ..." - cmd="touch -r \"${real_path}\" \"${backup_file}\"" - if [[ "${VERBOSE}" == "y" ]] ; then - echo "${cmd}" - fi - eval ${cmd} - - if [[ "${NO_REMOVE}" != "y" ]] ; then - info "Removing '${GREEN}${real_path}${NORMAL}' ..." - cmd="rm -rf \"${base_dir}\"" - if [[ "${VERBOSE}" == "y" ]] ; then - echo "${cmd}" - fi - if [[ "${SIMULATE}" != "y" ]] ; then - eval ${cmd} - fi - fi - - if [[ "${SIMULATE}" != "y" ]] ; then - echo " - ${base_dir} ${backup_file}" >> "${LOGFILE}" - fi - printf " " - ls -l "${backup_file}" || true - - if [[ "${SIMULATE}" == "y" ]] ; then - debug "Removing '${backup_file}' ..." - rm -f "${backup_file}" - fi - - done - -} - -################################################################################ -## -## Main -## -################################################################################ - -#------------------------------------------------------------------------------ -main() { - - get_options "$@" - - if [[ "${SIMULATE}" == "y" ]] ; then - info "Simulation mode, nothing is really done." - fi - - if [[ "${DO_ASK}" == "y" ]] ; then - create_file_list - fi - - if [[ "${#DIRS2ARCH[*]}" == "0" ]] ; then - warn "No directories to archive given." - exit 0 - fi - - backup_archive - - echo - info "Finished." - -} - -main "$@" - -exit 0 - -# vim: ts=4 et list