我把我写的程序贴出来吧!
[root@www cgi-bin]# vi listlog.pl
#!/usr/bin/perl
#2003-04-02:15-35-00
#------------------------------------------------------
#this Script file is used to
#response the admin's query from filelog;
#the file's head lines can be palced by 'sub head' at end;
#requery log file "admin.log" and You can defined them youself;
$dir_logfile = "../log/admin.log"; #mod 0444
$dir_tmpfile = "$dir_logfile".'.tmp'; #mod 0666
#------------------------------------------------------
push(@INC, '.');
use CGI;
$query = new CGI();
print "Content-type:text/html\n\n";
#logfile format
#Yyyy-mm-dd:hh-ss-mm domain admin ip logstring
%logStruct = (
"yyyy" , "2003",
"mm" , "01",
"dd" , "01",
"hh" , "00",
"ss" , "00",
"mmmm" , "00",
"domain" , "www.orizone1.com" ,
"admin" , "admin1",
"ip" , "202.103.44.5",
"logstring", "AVDFGGHKGJKJHGLGJLKJG)GKL_FHJLKFO"
);
#Struct get from client;
#Yyyyy-mm-dd domain admin oktype
%postStruct = (
"yyyy" , "2003",
"mm" , "12",
"dd" , "31",
"date" , '2003-12-31',
"domain" , "www.orizone.com",
"admin" , "admin1",
"oktype" , 'ok.date'
);
#Get the detail info of %postStruct;
if ( defined $query->param("ok.date") ) {
$postStruct{"oktype"}='ok.date';
if ( defined $query->param("yyyy")
&& defined $query->param("mm")
&& defined $query->param("dd") ) {
$postStruct{"yyyy"}=$query->param("yyyy");
$postStruct{"mm"}=$query->param("mm");
$postStruct{"dd"}=$query->param("dd");
$postStruct{"date"}=$postStruct{"yyyy"}."-".$postStruct{"mm"}."-".$postStruct{"dd"};
}
}elsif ( defined $query->param("ok.domain") ) {
$postStruct{"oktype"}='ok.domain';
$postStruct{"domain"}=$query->param("domain");
}
else {
if ( defined $query->param("ok.admin") ) {
$postStruct{"oktype"}='ok.admin';
$postStruct{"admin"}=$query->param("admin");
}
}
#whether the logfile exists
if ((-e $dir_logfile) == 0) {
&out_err("sorry,\t","The logfile is not exists!");
}elsif ((-r $dir_logfile) ==0) {
&out_err("sorry,\t","Can not read the logfile!");
}else {
#Body Begin
if ($postStruct{"oktype"} eq 'ok.date') {
if ( length($postStruct{"yyyy"}) == 4 && $postStruct{"yyyy"} =~ /[12]\d\d\d/) {
&getlog_date;
&out_date("Result: \t","Query by date $postStruct{\"date\"}");
}else {
&out_err("sorry,\t","enter date error!");
}
}elsif ($postStruct{"oktype"} eq 'ok.domain') {
if ($postStruct{"domain"} =~ /\./) {
&getlog_domain;
&out_date("Result: \t","Query by domain $postStruct{\"domain\"}");
}else {
&out_err("sorry,\t","enter domain error!");
}
}elsif ($postStruct{"oktype"} eq 'ok.admin') {
if ($postStruct{"admin"} =~ /./) {
&getlog_admin;
&out_date("Result: \t","Query by admin $postStruct{\"admin\"}");
}else {
&out_err("sorry,\t","enter admin error!");
}
}else {
&out_err("Sorry,","have a noknown error!!!");
}
#Body End;
}
#html => ok.date;
#=======================HTML====================================
sub out_date
{
print <<__EOF__;
<html>
<head>
<title>Rockmail system administrator -Query by Date</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body bgcolor="#FFFFFF" text="#000000" background="images/bg.gif" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
<table align=center><tr><td align=center>
__EOF__
$info = shift;
$result = shift;
print $info,$result,"\n";
print <<__EOF__;
</td></tr>
__EOF__
#display the patched log
&displayForm;
print <<__EOF__;
<br><br><br>
<tr><td align=center>
</td></tr><tr><td align=center>
<a href="http://10.0.0.100/listlog.htm"><b>ruturn</b></a>
</td></tr></table>
</body>
</html>
__EOF__
}
#html => ok.domain;
#=====================HTML======================================
sub out_domain
{
print <<__EOF__;
<html>
<head>
<title>Rockmail system administrator -Query by Domain</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body bgcolor="#FFFFFF" text="#000000" background="images/bg.gif" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
<table align=center><tr><td align=center>
__EOF__
$info = shift;
$result = shift;
print $info,$result,"\n";
print <<__EOF__;
</td></tr>
__EOF__
#display the patched log
&displayForm;
print <<__EOF__;
<br><br><br>
<tr><td align=center>
</td></tr><tr><td align=center>
<a href="http://10.0.0.100/listlog.htm"><b>ruturn</b></a>
</td></tr></table>
</body>
</html>
__EOF__
}
#html => ok.admin
#========================HTML===================================
sub out_admin
{
print <<__EOF__;
<html>
<head>
<title>Rockmail system administrator -Query by Admin</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body bgcolor="#FFFFFF" text="#000000" background="images/bg.gif" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
<table align=center><tr><td align=center>
__EOF__
$info = shift;
$result = shift;
print $info,$result,"\n";
print <<__EOF__;
</td></tr>
__EOF__
#display the patched log
&displayForm;
print <<__EOF__;
<br><br><br>
<tr><td align=center>
</td></tr><tr><td align=center>
<a href="http://10.0.0.100/listlog.htm"><b>ruturn</b></a>
</td></tr></table>
</body>
</html>
__EOF__
}
#html => error;
#========================HTML===================================
sub out_err
{
print <<__EOF__;
<html>
<head>
<title>Rockmail system administrator -Query Error</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body bgcolor="#FFFFFF" text="#000000" background="images/bg.gif" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
<table align=center><tr><td align=center>
__EOF__
$info = shift;
$result = shift;
print $info,$result,"\n";
print <<__EOF__;
</td></tr>
<br><br><br>
<tr><td align=center>
</td></tr><tr><td align=center>
<a href="http://10.0.0.100/listlog.htm"><b>ruturn</b></a>
</td></tr></table>
</body>
</html>
__EOF__
}
#display the patched loglines
#called by out_*
#-----------------------SUB--------------------------------------
sub displayForm
{
open(MYFILE,"$dir_tmpfile");
@lines = <MYFILE>;
close(MYFILE);
print <<__EOF__;
<tr><td align=center>
<table border align=center>
<tr><th>Date</th><th>Time</th><th>Domain</th><th>Admin</th><th>IP</th><th>Log</th>
__EOF__
foreach $line(@lines){
print <<__EOF__;
<tr>
__EOF__
@info = split(/ /,$line);
my $i=0;
foreach $logi(@info) {
$i++;
if ($i <= 1) {
($logdate,$logtime) = split(/:/,$logi);
print <<__EOF__;
<td>
__EOF__
print $logdate;
print <<__EOF__;
</td>
<td>
__EOF__
print $logtime;
print <<__EOF__;
</td>
__EOF__
} else {
print <<__EOF__;
<td>
__EOF__
print $logi;
print <<__EOF__;
</td>
__EOF__
}
}
}
print <<__EOF__;
</table></td></tr>
__EOF__
}
#copy patched logs from logfile to tmpfile => ok.date;
#------------------------SUB-------------------------------------
sub getlog_date
{
open (MYFILE, "$dir_logfile") || die ("Could not open file");
@lines = <MYFILE>;
close(MYFILE);
&empty_tmpfile;
foreach $line (@lines) {
@info = split(/ /,$line);
($logdate,$logtime) = split(/:/,$info[0]);
if ($logdate eq $postStruct{"date"}) {
&addline_tmpfile("$line");
}
}
}
#copy patched logs from logfile to tmpfile => ok.domain;
#-------------------------SUB------------------------------------
sub getlog_domain
{
open (MYFILE, "$dir_logfile") || die ("Could not open file");
@lines = <MYFILE>;
close(MYFILE);
&empty_tmpfile;
foreach $line (@lines) {
@info = split(/ /,$line);
$logdomain = $info[1];
if ($logdomain eq $postStruct{"domain"}) {
&addline_tmpfile("$line");
}
}
}
#copy patched logs from logfile to tmpfile => ok.admin;
#--------------------------SUB-----------------------------------
sub getlog_admin
{
open (MYFILE, "$dir_logfile") || die ("Could not open file");
@lines = <MYFILE>;
close(MYFILE);
&empty_tmpfile;
foreach $line (@lines) {
@info = split(/ /,$line);
$logadmin = $info[2];
if ($logadmin eq $postStruct{"admin"}) {
&addline_tmpfile("$line");
}
}
}
#empty the tmpfile;
#called by getlog_date, getlog_domain, getlog_admin
#-------------------------SUB------------------------------------
sub empty_tmpfile
{
open(OUTFILE, ">$dir_tmpfile");
print OUTFILE ("");
close(OUTFILE);
# chmod 0666,$dir_tmpfile;
}
#add new line to tmpfile;
#called by getlog_date, getlog_domain, getlog_admin
#-------------------------SUB------------------------------------
sub addline_tmpfile
{
($addline) = @_;
open(OUTFILE, ">>$dir_tmpfile");
# seek (OUTFILE, 0, 2);
print OUTFILE ("$addline");
close(OUTFILE);
}
就是这两个函数中涉及到访问文件的权限问题:
#empty the tmpfile;
#called by getlog_date, getlog_domain, getlog_admin
#-------------------------SUB------------------------------------
sub empty_tmpfile
{
open(OUTFILE, ">$dir_tmpfile"); #程序好像没有执行这个,因为我的$dir_tmpfile不存在的话根本没有创建。
print OUTFILE ("");
close(OUTFILE);
# chmod 0666,$dir_tmpfile;
#我在程序执行前手工创建了$dir_tmpfile后,程序执行到这里没有改变其权限!
}
#display the patched loglines
#called by out_*
#-----------------------SUB--------------------------------------
sub displayForm
{
open(MYFILE,"$dir_tmpfile");
#这里要读取$dir_tmpfile,可是empty_tmpfile没有创建这个文件。
@lines = <MYFILE>;
close(MYFILE);
。。。。。。。。。。。。。。
}