#!/usr/local/bin/perl
print "content-type: text/html\n\n";
use CGI;
use MIME::QuotedPrint;
use HTML::Entities;
use Mail::Sendmail;
$req = new CGI;
#new version
#print $req->param("action");
#print $req->param("fileID");
#print $req->param("flag");
&html_css;
$debug=0;
###################update next three lines#######################
$s_mail = 'test@hotmail.com';
$mail_subject = 'Monthly Notification (Title recommendation)';
$mypath = '/cgi-bin';
#################################################################
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
if($debug == 1)
{
print "CurrentLine:<font color=red>";
print __LINE__;
print "</font><br>";
print "\$buffer's length:\t".length($buffer)."\$buffer:$buffer<br>";
}
if(length($buffer) > 0)
{
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
($query_name, $query_value) = split(/=/, $pair);
$query_value =~ tr/+/ /;
$query_value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$query_name =~ tr/+/ /;
$query_name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$DataForm{$query_name} = $query_value;
}
}
$buffer = $ENV{QUERY_STRING};
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
($query_name, $query_value) = split(/=/, $pair);
$query_value =~ tr/+/ /;
$query_value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$query_name =~ tr/+/ /;
$query_name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$FORM{$query_name} = $query_value;
if($debug == 1)
{
print "CurrentLine:<font color=red>";
print __LINE__;
print "</font><br>";
print $query_name."---".$query_value."<br>";
print "\$FORM{\$query_name} = ".$FORM{$query_name}."<br>";
}
}
&title;
if($FORM{'action'} eq '')
{
$curtime = &mytime('dmy');
print <<HTML_start;
<center>
<TABLE border=0>
<tr><td> </td></tr>
<tr><td>
<li>You need upload one file to library's server.
<li>Second, click "Send mail". All things have been done!
<li>Check logfile -- check the error messages.
<li>Check result --check the mails that you have sent.
<li>Edit staff list -- update your staff's list
<li>Back -- back to first page.
</td></tr>
<tr><td> </td></tr>
<tr><td align=right>
$curtime
</td></tr>
</table>
</center>
HTML_start
}
if($FORM{'action'} eq 'updatestaff' and $FORM{'flag'} ne 'true')
{
print <<HTML_updatestaff;
<center>
<table border=0>
<form action="$mypath/index.pl?action=updatestaff&flag=true" method="post">
<tr><td>Staff code:</td><td><input type="text" name="staffcode" value="" size="20"></td></tr>
<tr><td>Staff name:</td><td><input type="text" name="staffname" value="" size="20"></td></tr>
<tr><td>Add staff:</td><td align=left><input type="radio" name="newcmd" checked value="addline"></td></tr>
<tr><td>Delete one:</td><td align=left><input type="radio" name="newcmd" value="delete"></td></tr>
<tr><td colspan=2 align=center>
<input type="submit" value="Continue"></td></tr>
</form>
</center>
HTML_updatestaff
}
if($FORM{'action'} eq 'updatestaff' and $FORM{'flag'} eq 'true')
{
$staff_file="./staffs/staff.list";
open(IN,$staff_file) or &error("Can not open file $staff_file!");
@stafftmplist = <IN>;
close(IN);
if($debug == 1)
{
print "CurrentLine:<font color=red>";
print __LINE__;
print "</font><br>";
print '$req->param("newcmd")='.$req->param("newcmd")."<br>";
print '$req->param("staffcode")='.$req->param("staffcode")."<br>";
print '$req->param("staffname")='.$req->param("staffname")."<br>";
}
if($req->param("newcmd") eq 'addline')
{
if(length($req->param("staffcode")) == 5 and length($req->param("staffname")) > 0)
{
splice(@stafftmplist,-1,0,$req->param("staffcode")."#".$req->param("staffname")."\@ied.edu.hk#\n");
open(DAT,">$staff_file") || die("Cannot Open File $staff_file");
print DAT @stafftmplist;
close(DAT);
print "<center><font color=blue size=5>Add staff success!</font></center>";
}
else
{
print "<center><font color=red size=5>Add staff failure. Please check your source.</font></center>";
}
}
if($req->param("newcmd") eq 'delete')
{
$index=0;
$moved_flag = 0;
foreach $staff_s (@stafftmplist)
{
@staff_s_array = split('#',$staff_s);
if($staff_s_array[0] eq $req->param("staffcode"))
{
splice(@stafftmplist,$index,1);
open(DAT,">$staff_file") || die("Cannot Open File $staff_file");
print DAT @stafftmplist;
close(DAT);
print "<center>The staff <font color=red size=5>".$req->param("staffcode")."</font> has been moved!</center>";
$moved_flag = 1;
}
$index++;
}
if($moved_flag == 0)
{
print "<center><font color=red size=5>Not found the staff</font></center>";
}
}
}
if($FORM{'action'} eq 'checklog')
{
print "<center>";
opendir(DIR,"./log");
foreach (readdir(DIR))
{
if($_ ne '.' and $_ ne '..')
{
print "$_\t<a href=$mypath/index.pl?action=logshow&fileID=$_>Show Content</a>\t<a href=$mypath/index.pl?action=logdelete&fileID=$_>Delete the file</a><br>";
}
}
closedir DIR;
print "</center>";
}
if($FORM{'action'} eq 'logshow')
{
open(IN,"./log/$FORM{'fileID'}") or &error("Open file ./log/$FORM{'fileID'} error!<br>");
while($line = <IN>)
{
#$line =~ s/</</g;
#$line =~ s/>/>/g;
#$line =~ s/\n/<BR>/g;
print $line;
}
close(IN);
}
if($FORM{'action'} eq 'logdelete')
{
unlink("./log/$FORM{'fileID'}") or &error("Delete file ./log/$FORM{'fileID'} error!<br>");
print "<center>The file $FORM{'fileID'} has been deleted!<br>";
print "<a href=$mypath/index.pl?action=checklog>Back ..</a></center>";
}
if($FORM{'action'} eq 'checktemp')
{
print "<center>";
opendir(DIR,"./tmp");
print "<table border=0>";
foreach (readdir(DIR))
{
if($_ ne '.' and $_ ne '..')
{
print "<tr><td>$_</td><td><a href=$mypath/index.pl?action=tmpshow&fileID=$_>Show Content</a></td><td><a href=$mypath/index.pl?action=tmpdelete&fileID=$_>Delete the file</a></td><td><a href=$mypath/index.pl?action=sendmail&fileID=$_>Send the file</a></td></tr>";
}
}
print "</table>";
closedir DIR;
print "</center>";
}
if($FORM{'action'} eq 'tmpshow')
{
open(IN,"./tmp/$FORM{'fileID'}") or &error("Open file ./tmp/$FORM{'fileID'} error!<br>");
while($line = <IN>)
{
$line =~ s/</</g;
$line =~ s/>/>/g;
$line =~ s/\n/<BR>/g;
print $line;
}
close(IN);
}
if($FORM{'action'} eq 'tmpdelete')
{
unlink("./tmp/$FORM{'fileID'}") or &error("Delete file ./tmp/$FORM{'fileID'} error!<br>");
print "<center>The file $query_value[1] has been deleted!<br>";
print "<a href=$mypath/index.pl?action=checktemp>Back ..</a></center>";
}
if($FORM{'action'} eq 'datadelete')
{
unlink("./data/$FORM{'fileID'}") or &error("Delete file ./data/$FORM{'fileID'} error!<br>");
print "<center>The file $FORM{'fileID'} has been deleted!<br>";
print "<a href=$mypath/index.pl?action=checkdata>Back ..</a></center>";
}
if($FORM{'action'} eq 'checkdata')
{
print "<center>";
opendir(DIR,"./data");
foreach (readdir(DIR))
{
if($_ ne '.' and $_ ne '..')
{
print "$_\t<a href=$mypath/index.pl?action=datashow&fileID=$_>Show Content</a>\t<a href=$mypath/index.pl?action=datadelete&fileID=$_>Delete the file</a><br>";
}
}
closedir DIR;
print "</center>";
}
if($FORM{'action'} eq 'datashow')
{
open(IN,"./data/$FORM{'fileID'}") or &error("Open file ./data/$FORM{'fileID'} error!<br>");
while($line = <IN>)
{
#$line =~ s/</</g;
#$line =~ s/>/>/g;
#$line =~ s/\n/<BR>/g;
print $line;
}
close(IN);
}
if($FORM{'action'} eq 'upload' and $FORM{'upload'} ne 'true')
{
print <<HTML_upload;
<html>
<body>
<center>
<form method="POST" action="$mypath/index.pl?action=upload&upload=true" ENCTYPE="multipart/form-data">
select one file :
<input type="file" name="FILE1">
<br>
<input type="submit" value="Upload!">
</form>
</center>
</body>
</html>
HTML_upload
}
if($FORM{'action'} eq 'upload' and $FORM{'upload'} eq 'true')
{
my $file = $req->param("FILE1");
my $fileName = $file;
if ($fileName =~ /([^\/\\]+)$/)
{
$fileName="$1";
}
$fileName =~ s/\s+//g;
open (OUTFILE, ">./tmp/$fileName");
while (my $bytesread = read($file, my $buffer, 1024))
{
print OUTFILE $buffer;
}
close (OUTFILE);
print "<center>Upload $fileName success!</center>";
}
if($FORM{'action'} eq 'sendmail' and length($FORM{'fileID'}) > 0 )
{
$userfile="./staffs/staff.list";
$sourcefile="./tmp/$FORM{'fileID'}";
if($debug == 1)
{
print "CurrentLine:<font color=red>";
print __LINE__;
print "</font><br>";
print "\$sourcefile=$sourcefile<br>";
}
$file_prefix= &mytime('dmyhms');
open(USER,$userfile) || &error("Could not open file $userfile");
open(IN,$sourcefile) || &error("Could not open file $sourcefile");
$testfile=">./data/".$file_prefix.".list";
$logfile=">./log/".$file_prefix.".log";
open(OUT,$testfile) || &error("Could not open file $testfile");
open(LOG,$logfile) || &error("Could not open file $logfile");
@userlists=<USER>;
$i=0;
$staff_index=0;
while($line=<IN>)
{
$lists[$i]=$line;
if($debug == 1)
{
print "CurrentLine:<font color=red>";
print __LINE__;
print "</font><br>";
print "$line"."'s length:".length($line)."<br>";
}
if(length($line) == 1 && $i > 3)
{
($location,$classnum,$bookname,@staffs)=&check(@lists);
$pages="<tr><td>".$location."<br>".$classnum."<br>".$bookname."<br>";
foreach $staff_tmp1 (@staffs)
{
$staff_tmp1 = substr($staff_tmp1,0,5);
$mail_list[$staff_index]= $staff_tmp1."#####".$pages . $staff_tmp1 . ".</td></tr>\n";
$staff_index++;
}
$location='';
$classnum='';
$bookname='';
$index=0;
$counter=@staffs;
while($index<=$counter)
{
shift(@staffs);
$index++;
}
$index=0;
$counter=@lists;
while($index<=$counter)
{
shift(@lists);
$index++;
}
$i=0;
}
$i++;
}
$pages_title='<table border=0><tr><td align=center><strong>';
$pages_title.='Monthly Notification (Title recommendation)';
$pages_title.='</strong></td></tr><tr><td> </td></tr>';
$pages_title.='<tr><td>The library materials that you have recommended are now available on shelves.</td></tr>';
$pages_title.='<tr><td>Thank you for your recommendation.</td></tr>';
$pages_title.='<tr><td> </td><tr><td align=right>Library </td></tr>';
$pages_title.='<tr><td align=right>';
$pages_title.=&mytime('dmy');
$pages_title.='</td></tr>';
$pages_title.='<tr><td> </td></tr>';
$pages_title.='<tr><td> </td></tr>';
$pages_title.='<tr><td> </td></tr>';
$pages_title.='<tr><td> </td></tr>';
$k=0;
foreach $j(@userlists)
{
($code) = split("#",$j);
$found_flag=0;
foreach $i(@mail_list)
{
if(substr($i,0,5) eq $code)
{
$new_maillist[$k]=$i;
$found_flag=1;
$k++;
}
}
if($found_flag == 0)
{
print LOG $code."Not found!<br>";
}
else
{
$found_flag = 0;
}
}
$tmp='';
$i=0;
$new_maillist[@new_maillist]="#################";
foreach (@new_maillist)
{
$first_str=substr($new_maillist[$i],0,5);
$second_str=substr($new_maillist[$i+1],0,5);
$code=$first_str;
chomp($first_str);
chomp($second_str);
if($first_str eq $second_str)
{
$tmp.=substr($new_maillist[$i],10);
}
else
{
if($new_maillist[$i] ne '#################')
{
$tmp = $tmp.substr($new_maillist[$i],10);
$newpages=$pages_title . $tmp;
&mynewmail($code,$newpages);
$tmp='';
$code='';
}
}
$i++;
}
print "<center><font size=5 color=blue>Mails have been sent. OK!</font></center>";
close(USER);
close(IN);
close(OUT);
close(LOG);
}
#################function##################
sub mytime
{
my($flag)=@_;
my($mydate)='';
my(@weekDay)=("Mon","Tue","Wed","Thu","Fri","Sat","Sun");
my(@Month)=("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
($sec, $min, $hour, $day, $mon, $year, $wday, $yday, $isdst) = localtime(time());
$year+=1900;
$mon=$Month[$mon];
$wday=$weekDay[$wday+1];
if($hour < 10)
{
$hour="0".$hour;
}
if($sec < 10)
{
$sec="0".$sec;
}
if($min < 10)
{
$min="0".$min;
}
if($flag eq 'dmy')
{
$mydate="$day $mon $year";
}
if($flag eq 'dmyhms')
{
$mydate="$day-$mon-$year-$hour-$min-$sec";
}
return($mydate);
}
sub title
{
print <<HTML_start;
<center>
<table border=0>
<tr>
<td><a href="$mypath/index.pl?action=upload">Upload</a></td>
<td><a href="$mypath/index.pl?action=checktemp">Sendmail</a></td>
<td><a href="$mypath/index.pl?action=checklog">Logfile</a></td>
<td><a href="$mypath/index.pl?action=checkdata">Resultfile</a></td>
<td><a href="$mypath/index.pl?action=updatestaff">Update staff</a></td>
<td><a href="$mypath/index.pl">Back to main </a></td>
</tr>
</table>
</center>
<hr width=60%>
HTML_start
}
sub check
{
my(@lists)=@_;
my($index)=0;
while($index<=@lists)
{
if($lists[$index] =~ /LOCATION/)
{
last;
}
$index++;
}
$location=$lists[$index];
$index++;
$classnum=$lists[$index];
$index++;
$bookname=$lists[$index];
$index++;
until($lists[$index] =~ /[A-Z][A-Z]\d{3}/)
{
if(length($lists[$index]) ==1)
{
last;
}
$bookname.=$lists[$index];
$index++;
}
$i=0;
while($lists[$index] =~ /[A-Z][A-Z]\d{3}/)
{
$staffs[$i]=$lists[$index];
$i++;
$index++;
}
return($location,$classnum,$bookname,@staffs);
}
sub error
{
my($message) = @_;
print <<End_of_Error;
Content-type: text/html
Status: 500 CGI Error
<HTML>
<HEAD><TITLE>CGI Error</TITLE></HEAD>
<BODY>
<H1>Oops! Error</H1>
<HR>
$message
<HR>
</BODY>
</HTML>
End_of_Error
}
sub html_css
{
print <<HTML_css;
<style>
BODY {FONT-SIZE: 14px; BACKGROUND: #e4eaef; COLOR: #000000; FONT-FAMILY: Arial, Helvetica, Verdana, Sans}
A:link {COLOR: #0033cc; TEXT-DECORATION: underline}
A:visited { TEXT-DECORATION: underline}
A:hover {COLOR: #f00000; TEXT-DECORATION: underline}
A:active {TEXT-DECORATION: underline}
TD {FONT-SIZE: 12px}
</style>
HTML_css
}
sub mynewmail
{
my($staff,$tmppages) = @_;
my($user_found)= 0;
foreach $user(@userlists)
{
if(substr($user,0,5) eq $staff)
{
($code,$email,$test)=split("#",$user);
if($debug == 1)
{
$pages =~ s/\n/<br>/g;
print OUT $pages."E-mail:$email<br><hr>";
}
else
{
%mail = (from => $s_mail,to => $email,subject => $mail_subject);
$mail{'content-type'} = 'text/html; charset="big5"';
$mail{body} = <<END_OF_BODY;
<html>$tmppages</html>
END_OF_BODY
sendmail(%mail) || &error("Error: $Mail::Sendmail::error\n");
print OUT $tmppages."E-mail:$email<br><hr>";
}
$user_found = 1;
}
}
if($user_found == 0)
{
if($debug ==1)
{
print "Error:".$staff."\tNOT FOUND!<br>";
}
else
{
print LOG "Error:".$staff."\tNOT FOUND!\n";
}
}
}
#日志处理部分有问题,不能显示错误和正常的日志,但是运行的结果是对的.