#!/bin/sh
#               ************************************
#               * skrypt dupochronowy v1.5 Beta ;) *
#               ************************************
#  
# maxses -  maksymalna liczba sesji dozwolonych dla jednego usera
# maxsesnoc - maksymalna liczba sesji w nocy
# maxsesdz - maksymalna liczba sesji w dzien
# czasblok - czas blokowania po przekroczeniu limitu sesji (w minutach)
# admin - adres IP admina (nie blokujemy go),
#   mozna utworzyc plik listaadm z wieksza iloscia adresow adminow
# nocod, nocdo - przedzial godzinowy ze zwiekszona liczba sesji
# sciezka - sciezka do ktalogu w ktorym beda trzymane logi

maxses=200
maxsesnoc=400
maxsesdz=150
czasblok=60
admin="192.168.0.66"
nocod=0
nocdo=9
sciezka="/mnt/router/masq_logi"

T=`cat /rc/rc_masq | grep 'ipfwadm -M -s' | sed 's/ipfwadm -M -s //' | sed 's/ .*//'`
T=`expr $T - 5`
if [ -s "$sciezka/lista3" ]; then
  rm "$sciezka/lista3"
fi

while :; do

# Robienie loga  ...bez gupich skojarzen ;)

        sleep $T 2>/dev/null 
        FN=`/bin/date +%y%m%d`
        C=`/bin/date +%H%M`
        puste=`ipfwadm -M -ln | grep -c '('`
        if [ $puste -gt 0 ]; then
          ipfwadm -M -ln | grep '(' >> "$sciezka/$FN"
          echo $C >> "$sciezka/$FN"
        fi

# Zamiana godzin na minuty, sprawdzenie czy jest noc

        kiedyg=`/bin/date +%H`
        kiedym=`/bin/date +%M`
        kiedy=`expr $kiedyg \* 60 + $kiedym`
        if [ $nocod -lt $nocdo ]; then
          if [ $kiedyg -ge $nocod -a $kiedyg -lt $nocdo ]; then
            maxses=$maxsesnoc
          else
            maxses=$maxsesdz
          fi
        else
          if [ $kiedyg -ge $nocod -o $kiedyg -lt $nocdo ]; then
            maxses=$maxsesnoc
          else
            maxses=$maxsesdz
          fi
        fi
       
# Liczenie sesji i blokada

        spr=`ipfwadm -M -ln | grep -c '('`
        if [ $spr -gt $maxses ]; then
          ipfwadm -M -ln | grep '(' | sed 's/..............//' | sed 's/ .*//' > "$sciezka/lista1"
          i=0
          for entry in `cat "$sciezka/lista1"`; do
            if [ $i -eq 0 ]; then
              echo $entry > "$sciezka/lista2"
            else
              test="false"
              for adr in `cat "$sciezka/lista2"`; do
                if [ "$adr" = "$entry" ]; then
                  test="true"
                fi
              done
              if [ $test = "false" ]; then 
                echo $entry >> "$sciezka/lista2"
              fi
            fi 
            i=`expr $i + 1`
          done
          for adr in `cat "$sciezka/lista2"`; do
            adm="false"
            if [ -s "$sciezka/listaadm" ]; then
              for admin in `cat "$sciezka/listaadm"`; do
                if [ "$adr" = "$admin" ]; then
                  adm="true"
                fi
              done
            else
              if [ "$adr" = "$admin" ]; then
                adm="true"
              fi
            fi
            if [ "$adm" != "true" ]; then
              ile=`cat "$sciezka/lista1" | grep -cw $adr`
              if [ $ile -gt $maxses ]; then
                echo "$adr&$kiedy" >> "$sciezka/lista3"
                ipfwadm -I -i reject -P all -S $adr -D any/0
                ipfwadm -I -i reject -P all -S any/0 -D $adr
                if [ -s "$sciezka/listax" ]; then
                  czypszy=`cat "$sciezka/listax" | grep -cw $FN`
                  if [ $czypszy -eq 0 ]; then
                    echo $FN >> "$sciezka/listax"
                  fi
                else
                  echo $FN >> "$sciezka/listax"
                fi
                echo "$C $adr $ile sesji" >> "$sciezka/listax"
              fi
            fi
          done
        fi   

# odblokowanie 

        if [ -s "$sciezka/lista3" ]; then
          for adr in `cat "$sciezka/lista3"`; do 
            ip=`echo $adr | sed 's/&.*//'`
            czas=`echo $adr | sed 's/.*&//'`
            czaszabl=`expr $kiedy - $czas`
            if [ $czaszabl -ge $czasblok -o $czaszabl -lt 0 ]; then
              ipfwadm -I -d reject -P all -S $ip -D any/0
              ipfwadm -I -d reject -P all -S any/0 -D $ip
            else
              echo "$ip&$czas" >> "$sciezka/lista4"
            fi
          done
          if [ -s "$sciezka/lista4" ]; then
            cat "$sciezka/lista4" > "$sciezka/lista3"
            rm "$sciezka/lista4"
          else
            rm "$sciezka/lista3"
          fi
        fi
done
