#! /usr/local/bin/perl
# The contents of this file are subject to the Mozilla Public License
# Version 1.0 (the "License"); you may not use this file except in
# compliance with the License. You may obtain a copy of the License at
# http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS IS"
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
# License for the specific language governing rights and limitations
# under the License.
#
# The Original Code is the Berkeley Open Infrastructure for Network Computing.
#
# The Initial Developer of the Original Code is the SETI@home project.
# Portions created by the SETI@home project are Copyright (C) 2002
# University of California at Berkeley. All Rights Reserved.
#
# Contributor(s):
#
# Stripchart.cgi - Version 2.0 by Matt Lebofsky ( November 4, 2002)
#
# Requires: stripchart
# apache or other CGI-enabled web server
#
# Stripchart.cgi is a web-based GUI interface for stripchart, allowing
# users to display multiple plots from various data sources.
#
# You should only need to edit the variables in the section
# "GLOBAL/DEFAULT VARS" below
#
# Type "stripchart -h" for usage
#
# See doc/stripchart.txt for details
use CGI;
$query = CGI::new();
use File::Basename;
use Time::Local;
#####################
# GLOBAL/DEFAULT VARS
#####################
# Where are these unix commands located?
$grepexe = "/usr/bin/grep";
# Where is the stripchart executable located?
$stripchartexe = "/usr/local/stripchart/stripchart";
# What is the default number of stripcharts?
$defaultnumcharts = 4;
# Any default flags to send to stripchart?
$defaultflags = "-s";
# Read in list of datafiles:
$datafilelist = "/usr/local/www/share/cgi-bin/lib/datafiles";
@datafiles = `$grepexe -v '^#' $datafilelist`;
# Read in list of queries:
$queryfilelist = "/usr/local/www/share/cgi-bin/lib/querylist";
@querylist = `$grepexe -v '^#' $queryfilelist`;
# What time is it right now?
$rightnow = time;
($sec,$min,$hour,$day,$month,$year) = localtime($rightnow);
$sec = "";
$month++;
$year += 1900;
# Make file option list based on @datafiles
$optionlist = "";
foreach $element (@datafiles) {
chomp $element;
$thisop = (split /:/, $element)[1];
$optionlist .= "\n";
}
# Make query option list based on @querylist
$queryoptionlist = "";
foreach $element (@querylist) {
chomp $element;
($thisname,$thisquery) = (split /:/, $element)[0,1];
$queryoptionlist .= "\n";
}
# Make year list based on time right now, and other lists
$yearlist = "";
for ($i = $year; $i> 1999; $i--) { $yearlist .= "\n" }
$monthlist = sprintf("\n",$month);
foreach $i (01 .. 12) { $monthlist .= sprintf("\n",$i) }
$daylist = sprintf("\n",$day);
foreach $i (01 .. 31) { $daylist .= sprintf("\n",$i) }
$hourlist = sprintf("\n",$hour);
foreach $i (00 .. 23) { $hourlist .= sprintf("\n",$i) }
$minlist = sprintf("\n",$min);
for ($i=0; $i<59; $i+=5) { $minlist .= sprintf("\n",$i) }
# Seconds in a day
$daysecs = 86400;
#############
# SUBS
#############
sub to_unix_time {
# same routine as in stripchart
# no colons and no decimal point? must already be in unix time
if ($_[0] !~ /:/ && $_[0] !~ /\./ ) { return $_[0] }
# colons = civil time
if ($_[0] =~ /:/) {
(my $year, my $month, my $day, my $hour, my $minute) = split /:/, $_[0];
$month--;
return timelocal(0,$minute,$hour,$day,$month,$year)
}
# must be julian date
return (($_[0] - 2440587.5) * $daysecs);
}
#############
# MAIN
#############
# ARE WE JUST PLOTTING A SINGLE GRAPH?
#
# stripchart.cgi calls itself via an "param("flags");
$outfile = "/tmp/tempout$$" . "." . rand(100000);
print "Content-type: image/gif\n\n";
`$stripchartexe $flags > $outfile`;
open (OUTFILE,"$outfile");
while ($dummy=read(OUTFILE,$buffer,1024)) { print $buffer }
close (OUTFILE);
exit 0
}
# ARE WE SAVING/DELETING A QUERY?
#
# If the user chose to save or delete a query, act on that and
# then continue on with the standard plots:
if ($query->param("sqname") ne "") {
$sqname = $query->param("sqname");
# are we deleting it?
if ($query->param("delq") eq "y") {
@querylist = `$grepexe -v '^$sqname:' $queryfilelist`;
open (QUERYLIST,">$queryfilelist");
flock (QUERYLIST,2);
foreach $queryline (@querylist) {
print QUERYLIST $queryline
}
}
# must be saving it
else {
# first check to see if query already in the list
$found = 0;
foreach $checkline (@querylist) {
($key,$value) = split /:/, $checkline;
if ($key eq $sqname) { $found = 1 }
}
# not found - add it to the end
if (!$found) {
open (QUERYLIST,">>$queryfilelist");
flock (QUERYLIST,2);
$fullquery = $ENV{'QUERY_STRING'};
$fullquery =~ s/sqname=$sqname//;
print QUERYLIST "$sqname:$fullquery\n";
close (QUERYLIST);
}
}
}
# PARSE INCOMING
$datafile1 = $query->param("df1");
$numcharts = $query->param("numcharts");
if ($numcharts == 0) { $numcharts = $defaultnumcharts }
print $query->header;
print << "EOF";
(Note: A set of stripcharts takes upwards to 10-60 seconds to generate)
EOF