#!/usr/local/bin/perl
@matrice=();
#---------------------------------------------------------------------------
# inizializza le hash
#---------------------------------------------------------------------------
if(open(CODICICLIENTI,"codici_clients")){
    while(<CODICICLIENTI>){
	chomp;
	($key,$value)=split/ /;
	$codici_client{$key}=$value;
    }
}
else{
%codici_client=();
}
close(CODICICLIENTI);
#---------------------------------------------------------------------------
if(open(CODICIMACCH,"codici_macchina")){
    while(<CODICIMACCH>){
	chomp;
	($key,$value)=split/ /;
	$codici_macchina_host{$key}=$value;
    }
}
else{
%codici_macchina_host=();
}
close(CODICIMACCH);
#---------------------------------------------------------------------------
# impostazione tipo filtro: L'input file deve essere inserito da 
# commandline...anche piu' di un file
#---------------------------------------------------------------------------

while($line=<>){
    chomp($line);
    if($line=~/VERSION|START|MGR|QUEUE/){next;}
#--------------------------------------------------------------------------
# parte che si occupa del POP3
#--------------------------------------------------------------------------
    if($line=~/POP3 Connection/){
	@tmp=split(/ /,$line);
	$codice_msg=$tmp[2];
	$sender_address=substr($tmp[6],0,-1);
#---------------------------------------------------------------------------
# assegno un codice all'indirizzo dell'host che manda:
# l'hash che contiene tale codice e' %codici_macchina_host
# la variabile che contiene tale codice e' $address_code 
#---------------------------------------------------------------------------
        if(exists($codici_macchina_host{$sender_address})){
            	if(defined($codici_macchina_host{$sender_address})){
      		    $address_code=$codici_macchina_host{$sender_address};}
       		else{
     		    $tipo=0;
       		    while(($key,$value)=each(%codici_macchina_host)){
     			$tipo=($value>$tipo)?$value:$tipo;
       		    }
       		    $address_code=$tipo+1;
      		    $codici_macchina_host{$sender_address}=$address_code;
       		}
       	    }
         else{
		$tipo=0;
		while(($key,$value)=each(%codici_macchina_host)){
		    $tipo=($value>$tipo)?$value:$tipo;
		}
		$address_code=$tipo+1;
		$codici_macchina_host{$sender_address}=$address_code;
         }
# fine routine hash
	$new_line=<>;
	chomp($new_line);
	@tmpnew=split(/ /,$new_line);
	$new_code=$tmpnew[2];
	while($codice_msg==$new_code){
	    if($new_line=~/LOGIN/){
		$date_login=$tmpnew[0];
		$time_login=$tmpnew[1];
		$utente=substr($tmpnew[6],1,-1);
		($nome_utente,$indirizzo_macchina)=split(/@/,$utente);
#---------------------------------------------------------------------------
# assegno un codice all'utente:
# la variabile sara' $cliente_code
# 'hash: %codici_client
#---------------------------------------------------------------------------
		if(exists($codici_client{$nome_utente})){
		    if(defined($codici_client{$nome_utente})){
       			$cliente_code=$codici_client{$nome_utente};}
		    else{
	       		$tipo=0;
	       		while(($key,$value)=each(%codici_client)){
			    $tipo=($value>$tipo)?$value:$tipo;
	       		}
	       		$cliente_code=$tipo+1;
	       		$codici_client{$nome_utente}=$cliente_code;
	       	    }
		}
		else{
		    $tipo=0;
		    while(($key,$value)=each(%codici_client)){
			$tipo=($value>$tipo)?$value:$tipo;
		    }
		    $cliente_code=$tipo+1;
		    $codici_client{$nome_utente}=$cliente_code;
		}
#fine routine di hash
		$new_line=<>;
		chomp($new_line);
		@tmpnew=split(/ /,$new_line);
		$new_code=$tmpnew[2];
	}
	    if($new_line=~/LOGOUT/){
		$logout=$tmpnew[0];
		$tempo=$tmpnew[1];
		@vettore=($cliente_code,$address_code,$date_login,$time_login,"POP3","**","**","**","**",$logout,$tempo,"**");
		push @matrice,[@vettore];
		$new_line=<>;
		chomp($new_line);
		@tmpnew=split(/ /,$new_line);
		$new_code=$tmpnew[2];
	    }
	    if($new_line=~/Disconnected/){
		$new_code="-------";
	    }
	}
    }
#---------------------------------------------------------------------------
# parte che si occupa di IMAP4
#---------------------------------------------------------------------------
    if($line=~/IMAP4 Connection/){
	@tmp=split(/ /,$line);
	$codice_msg=$tmp[2];
	$sender_address=substr($tmp[6],0,-1);
#---------------------------------------------------------------------------
# assegno un codice all'indirizzo dell'host che manda:
# l'hash che contiene tale codice e' %codici_macchina_host
# la variabile che contiene tale codice e' $address_code 
#---------------------------------------------------------------------------
        if(exists($codici_macchina_host{$sender_address})){
            	if(defined($codici_macchina_host{$sender_address})){
      		    $address_code=$codici_macchina_host{$sender_address};}
       		else{
     		    $tipo=0;
       		    while(($key,$value)=each(%codici_macchina_host)){
     			$tipo=($value>$tipo)?$value:$tipo;
       		    }
       		    $address_code=$tipo+1;
      		    $codici_macchina_host{$sender_address}=$address_code;
       		}
       	    }
         else{
		$tipo=0;
		while(($key,$value)=each(%codici_macchina_host)){
		    $tipo=($value>$tipo)?$value:$tipo;
		}
		$address_code=$tipo+1;
		$codici_macchina_host{$sender_address}=$address_code;
         }
# fine routine hash
	$new_line=<>;
	chomp($new_line);
	@tmpnew=split(/ /,$new_line);
	$new_code=$tmpnew[2];
	while($codice_msg==$new_code){
	    if($new_line=~/LOGIN/){
		$date_login=$tmpnew[0];
		$time_login=$tmpnew[1];
		$utente=substr($tmpnew[6],1,-1);
		($nome_utente,$indirizzo_macchina)=split(/@/,$utente);
#---------------------------------------------------------------------------
# assegno un codice all'utente:
# la variabile sara' $cliente_code
# 'hash: %codici_client
#---------------------------------------------------------------------------
		if(exists($codici_client{$nome_utente})){
		    if(defined($codici_client{$nome_utente})){
       			$cliente_code=$codici_client{$nome_utente};}
		    else{
	       		$tipo=0;
	       		while(($key,$value)=each(%codici_client)){
			    $tipo=($value>$tipo)?$value:$tipo;
	       		}
	       		$cliente_code=$tipo+1;
	       		$codici_client{$nome_utente}=$cliente_code;
	       	    }
		}
		else{
		    $tipo=0;
		    while(($key,$value)=each(%codici_client)){
			$tipo=($value>$tipo)?$value:$tipo;
		    }
		    $cliente_code=$tipo+1;
		    $codici_client{$nome_utente}=$cliente_code;
		}
#fine routine di hash
		$new_line=<>;
		chomp($new_line);
		@tmpnew=split(/ /,$new_line);
		$new_code=$tmpnew[2];
	}
	    if($new_line=~/LOGOUT/){
		$logout=$tmpnew[0];
		$tempo=$tmpnew[1];
		@vettore=($cliente_code,$address_code,$date_login,$time_login,"IMAP4","**","**","**","**",,$logout,$tempo,"**");
		push @matrice,[@vettore];
		$new_line=<>;
		chomp($new_line);
		@tmpnew=split(/ /,$new_line);
		$new_code=$tmpnew[2];
	    }
	    if($new_line=~/Disconnected/){
		$new_code="-------";
	    }
	}
    }

#---------------------------------------------------------------------------
# parte che si occupa dell'archivio SMTP
#---------------------------------------------------------------------------
    if($line=~/SMTP HELO|SMTP EHLO/){
	@tmp=split(/ /,$line);
	$date_login=$tmp[0];
	$time_login=$tmp[1];
	$sender_address=substr($tmp[8],0,-1);
#---------------------------------------------------------------------------
# assegno un codice all'indirizzo dell'host che manda:
# l'hash che contiene tale codice e' %codici_macchina_host
# la variabile che contiene tale codice e' $address_code 
#---------------------------------------------------------------------------
        if(exists($codici_macchina_host{$sender_address})){
            	if(defined($codici_macchina_host{$sender_address})){
      		    $address_code=$codici_macchina_host{$sender_address};}
       		else{
     		    $tipo=0;
       		    while(($key,$value)=each(%codici_macchina_host)){
     			$tipo=($value>$tipo)?$value:$tipo;
       		    }
       		    $address_code=$tipo+1;
      		    $codici_macchina_host{$sender_address}=$address_code;
       		}
       	    }
         else{
		$tipo=0;
		while(($key,$value)=each(%codici_macchina_host)){
		    $tipo=($value>$tipo)?$value:$tipo;
		}
		$address_code=$tipo+1;
		$codici_macchina_host{$sender_address}=$address_code;
         }
# fine routine hash
#--------------------------------------------------------------------------
# leggi la riga successiva:1.SMTP lost connection 2.IMSFA
#--------------------------------------------------------------------------
	$new_line=<>;
	chomp($new_line);
	if($new_line=~/SMTP lost/){
	    $date_login=0;
	    $time_login=0;
	    $sender_address=0;
	    $line=$new_line;
	    next;
	}
	if($new_line=~/IMSFA From/){
# estrai codice operazione e codice cliente
	    @tmp=split(/ /,$new_line);
	    $codice_msg=$tmp[2];
	    $status=10;
	    $conta_recipienti=0;
	    $posta_locale=0;
	    $posta_remota=0;
	    $utente=substr($tmp[4],6,-1);
	    ($nome_utente,$indirizzo_macchina)=split(/@/,$utente);
#---------------------------------------------------------------------------
# assegno un codice all'utente:
# la variabile sara' $cliente_code
# 'hash: %codici_client
#---------------------------------------------------------------------------
	    if(exists($codici_client{$nome_utente})){
		if(defined($codici_client{$nome_utente})){
       			$cliente_code=$codici_client{$nome_utente};}
    	        else{
	       		$tipo=0;
	       		while(($key,$value)=each(%codici_client)){
			    $tipo=($value>$tipo)?$value:$tipo;
	       		}
	       		$cliente_code=$tipo+1;
	       		$codici_client{$nome_utente}=$cliente_code;
	       	    }
	    }
	    else{
		$tipo=0;
		while(($key,$value)=each(%codici_client)){
		    $tipo=($value>$tipo)?$value:$tipo;
		}
	        $cliente_code=$tipo+1;
		$codici_client{$nome_utente}=$cliente_code;
	    }
	    $nextrow=<>;
	    chomp($nextrow);
	    @tmpnew=split(/ /,$nextrow);
	    $new_code=$tmpnew[2];
	    while($codice_msg==$new_code){
		if($nextrow=~/Message-ID|Subject|Relay/){
		    $nextrow=<>;
		    chomp($nextrow);
		    @tmpnew=split(/ /,$nextrow);
		    $new_code=$tmpnew[2];
		}
		if($nextrow=~/IMSFA Recipient/){
		    $conta_recipienti++;
		    ($desti,$ctrl)=split(/@/,$tmpnew[4]);
		    $ctrl=substr($ctrl,0,-2);
		    if($ctrl=~/$indirizzo_macchina/){
			$posta_locale++;
		    }
		    else{
			if($indirizzo_macchina=~/$ctrl/){
			    $posta_locale++;
			}
			else{$posta_remota++;}
		    }
		    $nextrow=<>;
		    chomp($nextrow);
		    @tmpnew=split(/ /,$nextrow);
		    $new_code=$tmpnew[2];
		}
		if($nextrow=~/DELIVER From/){
		    $status=0;
		    $size=substr($tmpnew[5],5,-1);$nextrow=<>;
		    while($nextrow=~/DELIVER/){
			   $nextrow=<>;
		       }		  
       	    	    if(($nextrow=~/SMTP closing/)&&($status==0)){
#sono arrivato qui dal deliver 
			chomp($nextrow);
			@tmpnew=split(/ /,$nextrow);
			$new_code=$tmpnew[2];
			$logout=$tmpnew[0];
			$tempo=$tmpnew[1];

			@array=($cliente_code,$address_code,$date_login,$time_login,"SMTP",$size,$conta_recipienti,$posta_locale,$posta_remota,$logout,$tempo,$status);
			push @matrice,[@array];
			$status=10;
			$posta_remota=0;$posta_locale=0;$conta_recipienti=0;
			$line=$nextrow;
		    }
	
		}
	    }
	    if(($nextrow=~/SMTP closing/)&($status!=0)){
		$logout=$tmpnew[0];
		$tempo=$tmpnew[1];
		$riga=<>;
		if($riga=~/QUEUE From/){
		    chomp($riga);
		    @tmp1=split(/ /,$riga);
		    $size=substr($tmp1[5],5);
		    $status=2;
		    @array=($cliente_code,$address_code,$date_login,$time_login,"SMTP",$size,$conta_recipienti,$posta_locale,$posta_remota,$logout,$tempo,$status);
		push @matrice,[@array];
		$status=10;
		$posta_remota=0;$posta_locale=0;$conta_recipienti=0;
		}
		$line=$riga;
	    }
#chiude SMTP HELO...
	}
    }
}
#--------------------------------------------------------------------------
# stampa su file dei risultati
#--------------------------------------------------------------------------
open(OUTPUT,">>output");
for($i=0;$i<=$#matrice;$i++){
    for $y (0..11){
	print OUTPUT "$matrice[$i][$y] ";
    }
    print OUTPUT "\n";
}
close(OUTPUT);
# riscrivo sui files le hash---> per consistenza    
open(CODICICLIENTI,">codici_clients");
while(($key,$value)=each(%codici_client)){
    print CODICICLIENTI "$key $value\n";
}
close(CODICICLIENTI);
open(CODICIMACCH,">codici_macchina");
while(($key,$value)=each(%codici_macchina_host)){
    print CODICIMACCH "$key $value\n";
}
close(CODICIMACCH);
