#!/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'
}

source ${0%/*}/tw_conf

DATABASE=tw.db_$HOSTNAME
DBSIG=tw.db_sig

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

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

function set_entry
{
  # Liest Pfade und zug. Hinweistexte.
  unset -v entry rem ; declare -i i=0 ; h=$IFS ; IFS=${h:2:1}
  for l in $(grep "#.*$1" $conf); do
    entry[$i]=${l%% *}
    if echo $l | grep -q "$1("; then
      end=${l#*$1(} ; rem[$i]=${end%%)*}
    fi
    i=$((i+1))
  done
  IFS=$h
}

function set_index
{
  # Merkt sich Treffer.
  unset -v index
  declare -i i=0 n=0
  while [ -n "${entry[$i]}" ]; do
    if eval ${1:+"!"} grep -q "${entry[$i]}$" $buff; then
      index[$n]=$i ; n=$((n+1))
    fi
    i=$((i+1))
  done
}

function delete
{
  # Löscht überflüssige Zeilen.
  str=${entry[*]} ; su_str="\(${str// /\\|}\)"
  eval cat ${str:+"| grep -v \$su_str"}
}

function add
{
  # Ergänzt ASR-Bericht.
  cat
  for i in ${index[*]}; do
    top="$1${entry[$i]}"
    [ "${rem[$i]}" ] && top="$top (${rem[$i]})"
    echo "$top"
  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##*/}: Keine gültige Konfiguration!"
  exit 1
fi

cat $1 | tee $buff | sed 's/: /:  /g' | {

# Trojaner?
set_entry FLAG
set_index if_not_found
delete | add "detected: ... "
} | {

# Köder?
set_entry BAIT
set_index
delete | add "touched:  ... "
#} | {
#
# benutzerdefinierter Filter.

} | 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	-

