#!/bin/bash
#
# Filter für den ASR-Integritätsbericht.
#

function info
{
  echo -e '
  SYNTAX: see [-c ext] tw.report

  -c  Wählt die Konfiguration "tw.config-ext" an.

  see kennt die Schlüsselwörter FLAG (Trojaner) und BAIT (Köder).
  ([!/=] Objekt [Auswahlmaske] [#Kommentar [FLAG|BAIT[(Bem.)]]])\n'
}

. ${0%/*}/tw_conf ; . ${0%/*}/tw_lib

err_types=(added deleted changed detected touched)
# Auflösungsvermögen.

list=/tmp/l.$$ ; buff=/tmp/b.$$

function notify
{
  # Ersetzt Standard-Meldetext...
  local str sear_str neg
  str=${entry[*]} ; sear_str="\(${str// /\\|}\)"
  eval cat ${str:+"| grep -v \$sear_str"}

  # ...durch objektspezifische Hinweise.
  [ "$2" = 'if_not_found' ] && neg=true
  declare -i i=0
  while [ -n "${entry[$i]}" ]; do
    if eval ${neg:+"!"} grep -q "${entry[$i]}$" $buff; then
      echo "$1${entry[$i]}${rem[$i]:+ (${rem[$i]})}"
    fi
    i=$((i+1))
  done
}

# Option?
conf="$DESTDIR/tw.config"
while getopts "c:h" opt; do
  case $opt in
    c) conf="$DESTDIR/tw.config-$OPTARG"; shift 2;;
    h) info ; exit 0;;
    *) exit 1;;
  esac
done

if ! [ -e $conf ]; then
  echo "--> ${0##*/}: Kann Konfigurationsdatei nicht finden!"
  exit 1
fi

cat $1 >$buff
cat $buff | sed 's/: /:  /g' | (

# Trojaner?
set_entry FLAG <$conf
notify "detected: ... " if_not_found
) | (

# Köder?
set_entry BAIT <$conf
notify "touched:  ... " if_found
#) | (

# Beispiel für einen benutzerdefinierten Filter:
# entry=(/etc/passwd /etc/inetd.conf /bin/login)
# notify "ALERT:    ... " if_found

) | sed '/^$/d' | tee $list

# Statusbits setzen!
declare -i mask=2
for type in ${err_types[*]}; do
  grep -q "^$type" $list && stat=$((stat | mask))
  mask=$((mask << 1))
done
rm -f $list $buff

exit $stat

# Statusbit:	7	6	5	4	3	2	1	0
# Bedeutung:	-	-	touch.	detec.	chang.	delet.	added	-

