#!/bin/bash ################################################################################ # rapop 0.9.1 # # # # Este programa habilita o IP que se logou no sistema POP/Imap para usar # # o servidor sendmail como relay por um tempo determinado. Inicialmente # # criado para ser usado com o software Dovecot. # # # # Este programa e' livre para usar nas condicoes da Licenca Publica GNU # # Free to use under the terms of the GNU Public License # ################################################################################ # Arquivo para depuracao. Se deixado em branco, nao ira gerar os logs. # depurar=/var/log/rapop.log depurar= # Local do arquivo de logs dos e-mails recebidos. logs=/var/log/maillog # String que identifica a linha de quando um usuario se logou. A modificacao # desta linha provavelmente implicara em uma alteracao na obtencao dos valores # das seguintes variaveis do programa: (mes, dia, hora, minuto, usuario, ip). indicador='Login' # Arquivo de informacoes dos usuarios que estao com o Relay habilitado. relay=/etc/mail/rapop.info # Arquivo dos usuarios que nao estao habilitados a enviar e-mails para outras # redes. Este arquivo deve ser editado conforme o exemplo: # # fulano # deltrano # ciclano # # Os usuarios contidos acima e que combinarem com uma string durante o login nao # estarao aptos a usarem o sistema como relay. Por exemplo, se acrescentarmos a # palavra 'fulan', os usuarios 'fulano' e 'fulana' nao terao o relay habilitado. norelay=/etc/mail/rapop.norelay # Arquivo temporario. temp=/tmp/rapop.tmp # Arquivos access, access.db e executavel makemap. access=/etc/mail/access accessdb=/etc/mail/access.db makemap=/usr/sbin/makemap # Minutos que o relay permanecera ativo para cada IP. temporelay=100 ######################### Programa ############################# if [ ! -e $relay ]; then touch $relay fi if [ ! -e $norelay ]; then touch $norelay fi posini=`wc $logs -l | cut -d'/' -f1` while [ "1" ] do sleep 1 posfin=`wc $logs -l | cut -d'/' -f1` let "linhas=($posfin-$posini)" if [ $posfin -lt $posini ]; then posini=0; linhas=$posfin else posini=$posfin fi if [ $linhas -gt 0 ]; then tail -"$linhas" $logs | grep $indicador | while read logou do if [ "$logou" != "" ]; then mes=`echo $logou | cut -d' ' -f1` dia=`echo $logou | cut -d' ' -f2` hora=`echo $logou | cut -d' ' -f3 | cut -d':' -f1` minuto=`echo $logou | cut -d' ' -f3 | cut -d':' -f2` usuario=`echo $logou | cut -d' ' -f8 | cut -d'=' -f2 | tr -d '<>,'` ip=`echo $logou | cut -d' ' -f10 | cut -d'=' -f2 | tr -d ','` if [ "$depurar" != "" ]; then echo $logou >> $depurar fi if [ `cat $norelay | grep $usuario -c -w` = 0 ]; then cat $relay | grep $usuario -v > $temp echo $usuario $mes $dia $hora:$minuto $ip >> $temp cp -f $temp $relay cat $access | grep "Connect:" -v > $temp cat $relay | while read info do acr=`echo $info | cut -d' ' -f5` echo "Connect:"$acr" RELAY" >> $temp cat $temp | sort -u > $access done rm -f $temp fi fi done fi sisminuto=`date +%M | sed -e s/^0//g` if [ "$sisminuto" != "$tempoproximo" ]; then tempoproximo=$sisminuto if [ `cat $relay | wc -l` -gt 0 ]; then touch $temp sismes=`date +%m | sed -e s/^0//g` sisdia=`date +%d | sed -e s/^0//g` sishora=`date +%H | sed -e s/^0//g` cat $relay | while read info do mes=`echo $info | cut -d' ' -f2` dia=`echo $info | cut -d' ' -f3 | sed -e s/^0//g` hora=`echo $info | cut -d' ' -f4 | cut -d':' -f1 | sed -e s/^0//g` minuto=`echo $info | cut -d' ' -f4 | cut -d':' -f2 | sed -e s/^0//g` case "$mes" in Jan ) mes=1 diasmes=31;; Feb ) mes=2 diasmes=28;; Mar ) mes=3 diasmes=31;; Apr ) mes=4 diasmes=30;; May ) mes=5 diasmes=31;; Jun ) mes=6 diasmes=30;; Jul ) mes=7 diasmes=31;; Aug ) mes=8 diasmes=31;; Sep ) mes=9 diasmes=30;; Oct ) mes=10 diasmes=31;; Nov ) mes=11 diasmes=30;; Dec ) mes=12 diasmes=31;; esac if [ "$mes" -gt "$sismes" ]; then let "minutoatual=(13*$diasmes*24*60)+(($sisdia-1)*24*60)+($sishora*60)+($sisminuto+0)" else let "minutoatual=(($sismes-1)*$diasmes*24*60)+(($sisdia-1)*24*60)+($sishora*60)+($sisminuto+0)" fi let "minutopop=(($mes-1)*$diasmes*24*60)+(($dia-1)*24*60)+($hora*60)+($minuto)" let "soma=($minutoatual-$minutopop-1)" if [ "$soma" -lt "$temporelay" ]; then echo $info >> $temp else if [ "$depurar" != "" ]; then echo "Removendo $info" >> $depurar fi fi done cat $temp | sort -u > $relay $makemap hash $accessdb < $access rm -f $temp fi fi done