gnuplot / webplot / access_cgi (E)

Make a graph

Real-time counting with CGI

The previous method counts
an access_log file at a fixed time, and real-time counting is not
possible. Here we add some lines to the webplot.pl
program in order to generate an HTML file.

Again we define the place of files firstly. However we have to distinguish
the absolute PATH inside the web server, and that in the area where httpd
can access (so call-ed ‘htdocs’ directory).

$abspath='/absolute/path/to/parent_of_image/';
$webpath='/relative/path/to/parent_of_image/';
$imgfile="access.png";
$logfile='/home/www/httpd/logs/access_log';
$gnuplot='/path/to/gnuplot';

The $abspath variable is the directory which is specified by
an absolute PATH on the server. While the $webpath is a relative
PATH from the httpd document root directory, and URL includes this.
This CGI generates an image file in this directory, so that httpd
is allowed to write files there.

The structure of this script is the same as the previous one.

open(LOG,$logfile);
while(<LOG>){
if(/.html/){
split;
$day = substr($_[3],1,2);
$mon = substr($_[3],4,3);
$year= substr($_[3],8,4);
$count[$day]++;
}
}
close(LOG);

$day=$#count;
$count[$day+1]=$count[$day];

& make_gnuplot;
open(GNUPLOT,"| ".$gnuplot);
foreach $i (0..$#plot){ print GNUPLOT $plot[$i]; }
for($i=1;$i<=$#count;$i++){
printf(GNUPLOT "%10d%10dn",$i,$count[$i]);
}
print GNUPLOT "endn";
close(GNUPLOT);

& generate_html;
exit 0;

sub make_gnuplot{
$i=0;
$plot[$i++]=sprintf("set term png colorn");
$plot[$i++]=sprintf("set output '%s'n",$abspath.$imgfile);
$plot[$i++]=sprintf("set size 0.7,0.7n");
$plot[$i++]=sprintf("set xrange [0:32]n");
$plot[$i++]=sprintf("set yrange [0:*]n");
$plot[$i++]=sprintf("set xtics 1,7,31n");
$plot[$i++]=sprintf("set mxtics 7n");
$plot[$i++]=sprintf("set nokeyn");
$plot[$i++]=sprintf("set gridn");
$plot[$i++]=sprintf("set title '%s %s'n",$mon,$year);
$plot[$i++]=sprintf("plot '-' with stepn");
}

Newly added lines are the next subroutine which generates HTML
data and tells a client browser the place of generated image file.


sub generate_html{
print << "EOF";
Content-Type: text/html


<html>
<head><title> access_log stat </title></head>
<body bgcolor="white">
<center><img src="$webpath$imgfile"></center>
</body>
</html>
EOF

This perl script is copied into cgi-bin, and you make a following
link in an HTML file.

< a href=”/cgi-bin/webplot_cgi.pl/”> Web Plot </a>

Since browsers cache image files generally, and if the file name is
the same (like above), browser shows you an old image even it is
renewed. An easy way to avoid this is to make a file with the different
names. For example, perl holds PID in the variable $$, and when the file
name is something like “access$$.png”, each time you will see the different
images. However this method makes many garbages in the directory and you
have to clean-up them sometimes.

up