Kleine Frage zu Perl

Bash, Shell, PHP, Python, Perl, CGI
mds
Posts: 15
Joined: 2002-10-18 16:15
Location: Bielefeld

Kleine Frage zu Perl

Post by mds »

Hallo Ihr lieben,

für mich stellt sich folgendes Problem in die Ausgabedes folgenden Scripts soll der Inhalt der Datei /etc/mail/access eingebunden werden.

In PHP wäre das kein Problem für mich, aber wie mache ich das in Perl ?

Code: Select all

#!/usr/bin/perl -w

#pl-SaPd 0.1j - 07/18/2001				                                       
#SMTP after POP Daemon for Sendmail/Qpoppper                             
#copyright (C) 2001 by Chris (rc@networkz.ch)                                                                 

#This program is free software; you can redistribute it and/or
#modify it under the terms of the GNU General Public License
#as published by the Free Software Foundation; either version 2
#of the License, or (at your option) any later version.

#This program is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#GNU General Public License for more details.

#settings

#check logfile every n seconds
$timeout="5";

#logfile location
$logfile="/var/log/qpopper" ;

#addresses are vaild for n seconds (3600 = 1 hour)
$seconds_valid=900; 		

#after n x $timeout, acccess database is recreated
#(this is used to purge old addresses)
$max_runs=360; 			
$current_run=358;

#location of files
$temp_list="/tmp/pl-SaPd.map";
$access_db="/etc/mail/access.db";

#let this address always relay
$always_relay="127";
#now the fun part... 

while () {

	$check1=`ls -l $logfile` ;
	sleep $timeout ;
	$current_run++;
	#print "$current_run n";
	$check2=`ls -l $logfile` ;
	
	if ($current_run == $max_runs){
		$check2="time to update list";
		$current_run=1;
		}

	if ($check1 ne $check2){
                         # push @notvalidarray, $never_relay;                            
		push @validarray, $always_relay;
                           
		#routine to get valid ip's from logfile
		#print "searching log for valids n";

		#open(LOGFILE, "$logfile");
		open(LOGFILE, "tail -n 20 $logfile |") || die "cannot fork: $!" ; 
		$current_time=time;

		while (<LOGFILE>) {
       			#print ;
			$test=grep(/Stats/, $_);
	
			if ($test eq "1") {
	
				#split to get date and address
				@el=split;
				$month=$el[0];
				$day=$el[1];
				$timestring=$el[2];
				$year=$el[3];
				$hname=$el[11];
				$ip=$el[12];

				@timearray=split(/:/,$timestring);
				$hour=$timearray[0];
				$minute=$timearray[1];

				#calculate unix timestamp
				$pop3_time=`date --date "$month $day $hour:$minute $year" +%s`; 
				chomp $pop3_time;
				$diff=$current_time - $pop3_time;
	
				#generate an array with unique, valid values
				if ($diff < $seconds_valid){
					#see if hname/ip is already in list
					$test_if_unique=grep(/$ip|$hname/, @validarray);
					
					if ($test_if_unique < 1 ){
						push @validarray, $ip, $hname;
						}
					}
		
			}

		}#end of routine to get valid ip's from logfile
	
	close LOGFILE;

	#write list to generate db
	$cmd=`rm -f $temp_list`;
	for (@validarray){
       		$cmd=`echo $_	RELAY >> $temp_list`;
		}
           
	$make=`makemap hash $access_db < $temp_list`;
	$logger=`logger -t pl-SaPd[$$] -p mail.notice  DB rebuildt`;
	undef @validarray;
	undef $make;
	undef $logger;

	}#end if (check eq check)

}#end main while

Mein Ansatz war, ...

Code: Select all

$never_relay=open("/etc/mail/access");
 @tmp= split(/n/,$never_relay);
 foreach $tmp (@tmp) {
$cmd=`echo $_	>> $temp_list`;
}
aber ich denke die Syntax ist noch nicht so ganz ok, ...


Für Hilfe wäre ich sehr dankbar.


Gruß Oliver
alexander newald
Posts: 1117
Joined: 2002-09-27 00:54
Location: Hannover

Re: Kleine Frage zu Perl

Post by alexander newald »

Code: Select all

open(FILE,"</etc/mail/access");
while(<FILE>) { print $_; }
close(FILE);
mds
Posts: 15
Joined: 2002-10-18 16:15
Location: Bielefeld

Re: Kleine Frage zu Perl

Post by mds »

Danke schon mal, ...

jetzt stellt sich nur noch die frage wie bekomme ich jetzt jede einzelne Zeile in das Array $Temp_list ?

Gruß
Oliver
mds
Posts: 15
Joined: 2002-10-18 16:15
Location: Bielefeld

Re: Kleine Frage zu Perl

Post by mds »

Das Problem hat sich erledigt, ...

war echt was für Anfänger ;-)

das hier einfügen, ....

Code: Select all

  `cat < $never_relay > $temp_list` ;
dann siehtes so aus, ...

Code: Select all

#write list to generate db
	$cmd=`rm -f $temp_list`;
[color=red] `cat < $never_relay > $temp_list` ;[/color]
	for (@validarray){
       		$cmd=`echo $_	RELAY >> $temp_list`;
		}

           
	$make=`makemap hash $access_db < $temp_list`;

und das war es schon, bin mit ein bisschen tüfteln von selbst draufgekommen.

Gruß Oliver