#!/bin/sh 
# Read the log files depending on $1 (PREF)
# Read all of the IPs concerned, search countries and count them.  
# exec crontab 2h AM for previous day

EXECDIR="/usr/share/xt_geoip"
STATDIR="/var/lib/xt_geoip"

case $1 in
    "ssh")
        PREF="ssh"
        LOGDIR="/var/log/sshd"
        CMD1='cat'
        CMD2=' | grep -i '
        CMD3=' | grep -E "(Failed password|Invalid user \w+ from)" | sed -e "s/^.*from //" -e "s/ port.*$//" >> $RESFILE'
    ;;
    "ipt")
        PREF="ipt"
        LOGDIR="/var/log/iptables"
        CMD1='zcat -f '
        CMD2=' | grep -i '
        CMD3=' | grep "GeoIP BAN" | sed -e "s/^.*SRC=//" -e "s/ DST=.*$//" >> $RESFILE'
    ;;
     "f2b")
 	if [[ -x /bin/fail2ban-client && -f /var/log/fail2ban/daemon.log ]]
 	then
     	    PREF="f2b"
     	    LOGDIR="/var/log/fail2ban"
     	    CMD1='zcat -f '
     	    CMD2=' | grep -i '
     	    CMD3=' | grep -E "] Ban " | sed -e "s/^.* Ban //" >> $RESFILE'
 #        	CMD3=' | grep -E ": NOTICE  [.*] Ban" | sed -e "s/^.* Ban //" >> $RESFILE'
 	else
 	    echo "No fail2ban enabled here"
 	    exit 1
 	fi
     ;;
    *)
	echo "usage : $0 [ssh|ipt|f2b|....]"
        exit 1
    ;;
esac


# files of the day
RESFILE="$STATDIR/${PREF}_ip.lst"
RES2FILE="$STATDIR/${PREF}_country.lst"
# permanent files
BASEFILE="$STATDIR/Base_${PREF}_ip.lst"
BASE2FILE="$STATDIR/Base_${PREF}_country.lst"
ARCHFILE="$STATDIR/ArchBase_${PREF}_ip.lst"
ARCH2FILE="$STATDIR/ArchBase_${PREF}_country.lst"
# tempo
TMPFILE=$(mktemp $STATDIR/xt_${PREF}.XXXXXXX)
# Day - 1
MONTH=$(date --date '1 day ago' +%B)
LOGDAY="$(LC_ALL=C date --date '1 day ago' '+%h %e')"
DATE=$(date --date '1 day ago' '+%Y-%m-%d')
ARCHDATE=$(date --date '90 day ago' '+%Y-%m-%d')
[[ $PREF = 'f2b' ]] && LOGDAY=$DATE

cd $EXECDIR

# yesterday already in base ?
if  [ -f $BASEFILE ]
then
    if (fgrep $DATE $BASEFILE > /dev/null 2>&1)
    then 
        echo "$0 : $PREF already run for that date. Please verify this !"
        exit 1
    fi
fi

cp /dev/null $RESFILE

# All logfiles update for 2 days, not empty
for file in $(find $LOGDIR/* -type f -mtime -2 -size +50c)
do
#    echo "$(echo $CMD1 $file $CMD2 \'^"$LOGDAY"\' $CMD3)"
    eval "$(echo $CMD1 $file $CMD2 \'^"$LOGDAY"\' $CMD3)"
done

# number of incidents by IP, sorted by IP
awk  -F ";" -v OFS=";" \
 '{t[$1]=$1; t1[$1]+=1} END {for(n in t) print t[n], t1[n]}' $RESFILE | sort -t ";" -n -k 1 > $TMPFILE

# +date, +country code
awk -F ";" -v v1=$DATE -v OFS=";" \
'{ printf "%s",v1 ";" $0 ";"; system("./geoip_look " $1) }' $TMPFILE > $RESFILE

# number of incidents by country code, sorted reverse by number
awk -F ";" -v v1=$DATE -v OFS=";" \
 '{t[$4]=$4; t1[$4]+=$3} END {for(n in t) print v1, t[n], t1[n]}' $RESFILE | sort -t ";" -k 3 -r -n > $RES2FILE

rm -f $TMPFILE

# concatenate into bases
cat $RESFILE >> $BASEFILE
cat $RES2FILE >> $BASE2FILE

touch ${TMPFILE}_last3m
touch ${TMPFILE}_older

# split IP bases file between 'last 3 months' and 'archives'
awk -F ';' "\$1 > \"$ARCHDATE\" {print > (\"${TMPFILE}_last3m\"); next} {print > (\"${TMPFILE}_older\")}" $BASEFILE

if [ -f ${TMPFILE}_older ]
then
    cat ${TMPFILE}_older >> $ARCHFILE
    cp ${TMPFILE}_last3m $BASEFILE
fi
cp /dev/null ${TMPFILE}_last3m
cp /dev/null ${TMPFILE}_older
 
# split COUNTRY bases file between 'last 3 months' and archives
 awk -F ';' "\$1 > \"$ARCHDATE\" {print > (\"${TMPFILE}_last3m\"); next} {print > (\"${TMPFILE}_older\")}" $BASE2FILE
 
if [ -f ${TMPFILE}_older ]
then
     cat ${TMPFILE}_older >> $ARCH2FILE
     cp ${TMPFILE}_last3m $BASE2FILE
fi

rm -f ${TMPFILE}_last3m ${TMPFILE}_older

# for mail
if [ -s $RES2FILE ]
then
    echo "parse $LOGDIR for $PREF events"
    cat $RES2FILE
fi

# delete files of today
#rm -f $RESFILE $RES2FILE

