X-Git-Url: https://arthur.barton.de/gitweb/?a=blobdiff_plain;f=bin%2Fbackup-audit;h=4f3358674f0ca5ca2dc7771909c366a3df32da8d;hb=dc62385b6c1db1f36f3b58fa9a44ffed31d5cb3e;hp=809a8a731de19d147f497951e674872d66820bfe;hpb=800f0efc35b74ffcfa0faaab4e49409a1c1977d0;p=backup-script.git diff --git a/bin/backup-audit b/bin/backup-audit index 809a8a7..4f33586 100755 --- a/bin/backup-audit +++ b/bin/backup-audit @@ -42,9 +42,15 @@ for conf in \ done Usage() { - echo "Usage: $NAME [-q|--quiet] [-v|--verbose] [ [ [...]]]" + echo "Usage: $NAME [-q|--quiet] [-v|--verbose] [ [ [...]]]" echo " $NAME <-d|--dirs> " echo + echo " -d, --dirs Compare two backup directories (not jobs)." + echo " -q, --quiet Quite mode, only list jobs with changes or errors." + echo " -v, --verbose Verbose mode, show all checks that are run." + echo + echo "When no is given, all defined jobs are checked." + echo exit 2 } @@ -64,6 +70,24 @@ EndDiff() { : } +ListDirectory() { + local base_dir="$1" + local dir_name="$2" + + local exclude + + exclude='total ' + if [[ "$dir_name" == "/" ]]; then + exclude="$exclude"'| \.stamp$| dev$| etc$| proc$| root$| run$| sys$| tmp$' + exclude="$exclude"'| data$| net$| srv$' + exclude="$exclude"'| [[:alnum:]_-]+\.log(\.[[:alnum:]]+|)$' + fi + + # shellcheck disable=SC2012 + ls -Al "$base_dir$dir_name" 2>/dev/null \ + | egrep -v "($exclude)" | awk '!($2="")' | column -t +} + HandleSystem() { local fname="$1" @@ -164,10 +188,18 @@ DiffGenerations() { /etc/gshadow \ \ /boot/grub/grub.cfg \ + /etc/aliases \ /etc/bash.bashrc \ + /etc/crontab \ + /etc/environment \ /etc/fstab \ /etc/hostname \ /etc/hosts \ + /etc/hosts.allow \ + /etc/hosts.deny \ + /etc/inittab \ + /etc/ld.so.conf \ + /etc/login.defs \ /etc/machine-id \ /etc/modules \ /etc/network/interfaces \ @@ -177,14 +209,16 @@ DiffGenerations() { /etc/rc.local \ /etc/resolv.conf \ /etc/services \ + /etc/shells \ + /etc/ssh/sshd_config \ + /etc/sshd_config \ /etc/sudoers \ /etc/sysctl.conf \ ; do [[ -r "${gen1_d}${file}" ]] || continue [[ $VERBOSE -ne 0 ]] && echo "Checking \"$file\" ..." - diff -U 3 "${gen1_d}${file}" "${gen2_d}${file}" >"$tmp_diff" - if [[ $? -ne 0 ]]; then + if ! diff -U 3 "${gen1_d}${file}" "${gen2_d}${file}" >"$tmp_diff"; then BeginDiff "\"$file\"" tail -n +3 "$tmp_diff" | PipeDiff EndDiff @@ -192,12 +226,39 @@ DiffGenerations() { fi done + for dir in \ + / \ + /etc/cron.d/ \ + /etc/cron.daily/ \ + /etc/cron.hourly/ \ + /etc/cron.monthly/ \ + /etc/cron.weekly/ \ + /etc/sudoers.d/ \ + /var/log/dumps/ \ + ; do + [[ ! -d "${gen1_d}${dir}" ]] && continue + [[ ! -d "${gen2_d}${dir}" ]] && continue + + # Make sure that this is a system root; comparing other + # root folders results in misleading output ... + [[ "$dir" == "/" && ! -d "${gen1_d}${dir}/etc" ]] && continue + + [[ $VERBOSE -ne 0 ]] && echo "Checking \"$dir\" ..." + ListDirectory "${gen1_d}" "${dir}" >"$tmp_1" + ListDirectory "${gen2_d}" "${dir}" >"$tmp_2" + if ! diff -U 0 "$tmp_1" "$tmp_2" >"$tmp_diff"; then + BeginDiff "\"$dir\" directory" + tail -n +3 "$tmp_diff" | egrep -v '^@@ ' | PipeDiff + EndDiff + return_code=1 + fi + done + if [[ -d "${gen1_d}/var/lib/dpkg/info" && -d "${gen2_d}/var/lib/dpkg/info" ]]; then [[ $VERBOSE -ne 0 ]] && echo "Checking list of installed packages ..." chroot "${gen1_d}" dpkg --get-selections >"$tmp_1" || return 2 chroot "${gen2_d}" dpkg --get-selections >"$tmp_2" || return 2 - diff -U 0 "$tmp_1" "$tmp_2" >"$tmp_diff" - if [[ $? -ne 0 ]]; then + if ! diff -U 0 "$tmp_1" "$tmp_2" >"$tmp_diff"; then BeginDiff "list of installed packages" tail -n +3 "$tmp_diff" | grep -v '^@@ ' | PipeDiff EndDiff @@ -208,8 +269,7 @@ DiffGenerations() { # scp Backup type file=$(basename "$files") [[ $VERBOSE -ne 0 ]] && echo "Checking \"$file\" ..." - diff -U 3 "${gen1_d}/${file}" "${gen2_d}/${file}" >"$tmp_diff" - if [[ $? -ne 0 ]]; then + if ! diff -U 3 "${gen1_d}/${file}" "${gen2_d}/${file}" >"$tmp_diff"; then BeginDiff "\"$file\"" tail -n +3 "$tmp_diff" | PipeDiff EndDiff @@ -282,8 +342,8 @@ for f in "${sys[@]}"; do ;; esac - HandleSystem "$fname" >"$tmp_out" 2>&1 - [[ $QUIET -eq 0 || $? -ne 0 ]] && cat "$tmp_out" + HandleSystem "$fname" >"$tmp_out" 2>&1; result=$? + [[ $QUIET -eq 0 || $result -ne 0 ]] && cat "$tmp_out" done CleanUp