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