diff --git a/stripchart/samples/count_users b/stripchart/samples/count_users new file mode 100755 index 0000000000..bd1e75ca8e --- /dev/null +++ b/stripchart/samples/count_users @@ -0,0 +1,23 @@ +#! /bin/csh + +# where is mysql located? +set MYSQL = /usr/local/mysql/bin/mysql + +# what is the name of the database? +set DATABASE = mysql + +# what is the name of the table you wish to count? +set TABLE = user + +# tmpfile for sql +set TMPFILE = /tmp/count$$.sql + +echo "use $DATABASE;" > $TMPFILE +echo "select count(*) from $TABLE;" >> $TMPFILE + +set COUNT = `cat $TMPFILE | $MYSQL | /bin/tail -1` + +set CIVDATE = `/bin/date "+%c:%m:%d:%H:%M" | awk '{print $5}'` +set UNIXDATE = `/usr/local/bin/perl -e 'print time()'` + +echo $CIVDATE $UNIXDATE $COUNT diff --git a/stripchart/samples/crontab b/stripchart/samples/crontab new file mode 100644 index 0000000000..d93cafce7b --- /dev/null +++ b/stripchart/samples/crontab @@ -0,0 +1 @@ +0,5,10,15,20,25,30,35,40,45,50,55 * * * * /usr/local/stripchart/samples/get_load >> /disks/matt/data/machine_load diff --git a/stripchart/samples/datafiles b/stripchart/samples/datafiles new file mode 100644 index 0000000000..565b9ccc88 --- /dev/null +++ b/stripchart/samples/datafiles @@ -0,0 +1,11 @@ +# This is the list of data sources for stripchart, in the colon-delimited format: +# full path to data file:title for the graph:column number in the data file:flags to stripchart +# +# examples: +# /disks/matt/data_files/connections:connection drops:3 +# /disks/matt/data_files/connections:tcp rate:4:-b 100 +# +# To put in a horizontal rule for ease of selection, use the line: +# x:----------------------------------:x +# +/disks/matt/data_files/get_load:machine load:3 diff --git a/stripchart/samples/get_load b/stripchart/samples/get_load new file mode 100755 index 0000000000..72836f0fc6 --- /dev/null +++ b/stripchart/samples/get_load @@ -0,0 +1,11 @@ +#! /bin/csh + +set UPTIME = `/usr/bin/uptime | awk '{print $10}' | sed s/,//` +if ($UPTIME == "average:") then + set UPTIME = `/usr/bin/uptime | awk '{print $11}' | sed s/,//` +endif + +set CIVDATE = `/bin/date "+%c:%m:%d:%H:%M" | awk '{print $5}'` +set UNIXDATE = `/usr/local/bin/perl -e 'print time()'` + +echo $CIVDATE $UNIXDATE $UPTIME diff --git a/stripchart/stripchart b/stripchart/stripchart new file mode 100755 index 0000000000..87b67878d7 --- /dev/null +++ b/stripchart/stripchart @@ -0,0 +1,439 @@ +#! /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 - Version 2.1 by Matt Lebofsky ( started: November 11, 2002 ) +# +# Requires: gnuplot with .gif support (which may require gd) +# perl 5.0 or later +# stripchart.cnf (make sure you set the path the .cnf file below) +# +# Stripchart is a wrapper around gnuplot which takes in time-based +# data from a file and creates a web-friendly image. It is quite +# useful for system diagnostic checking, especially when used with +# stripchart.cgi +# +# 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 Getopt::Std; +use File::Basename; +$|++; + +################ +# READ IN .cnf +################ + +# Where is the .cnf file? +$cnfpath = "./stripchart.cnf"; + +# Read it in: +open (CNFFILE,$cnfpath) or die "cannot open configuration file: $cnfpath\nmake sure this variable is set properly"; +while () { eval } +close (CNFFILE); + +############# +# SUBS +############# + +sub to_unix_time { + # times should generally be in epoch seconds, but just in case they're not: + + # 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); + + } + +sub unix_to_civillabel { + # convert epoch seconds to a pretty date string + + (my $minute, my $hour, my $day, my $month, my $year) = + (localtime($_[0]))[1,2,3,4,5]; + $month++; + $year+=1900; + $year = substr($year,2,2); + my $label = sprintf("%02d/%02d/%02d %02d:%02d",$month,$day,$year,$hour,$minute); + return $label + } + +sub time_to_monthlabel { + # convert epoch seconds to a simple month label (for x axis) + + (my $day, my $month) = (localtime($_[0]))[3,4]; + my $label = $monthabbs[$month] . " $day"; + return $label; + + } + +sub time_to_hourlabel { + # convert epoch seconds to a simple hour label (for x axis) + + (my $minute, my $hour) = (localtime($_[0]))[1,2]; + my $label = sprintf("%02d:%02d",$hour,$minute); + return $label; + + } + +############# +# MAIN +############# + +# get command line options + +if (getopts("f:t:r:i:o:O:l:T:x:y:Y:b:Bd:D:vLc:CsjVh") == FALSE || $opt_h) { + print STDERR << "EOF"; +stripchart: creates stripchart .gif graphic based on data in flat files +options: + -i: input FILE - name of input data file (mandatory) + -o: output FILE - name of output .gif file (default: STDOUT) + -O: output FILE - name of output .gif file and dump to STDOUT as well + -f: from TIME - stripchart with data starting at TIME + (default: 24 hours ago) + -t: to TIME - stripchart with data ending at TIME (default: now) + -r: range RANGE - stripchart data centered around "from" time the size + of RANGE (overrides -t) + -l: last LINES - stripchart last number of LINES in data file + (overrides -f and -t and -r) + -T: title TITLE - title to put on graphic (default: FILE RANGE) + -x: column X - time or "x" column (default: 2) + -y: column Y - value or "y" column (default: 3) + -Y: column Y' - overplot second "y" column (default: none) + -b: baseline VALUE - overplot baseline of arbitrary value VALUE + -B: baseline-avg - overrides -b, it plots baseline of computed average + -d: dump low VALUE - ignore data less than VALUE + -D: dump high VALUE - ignore data higher than VALUE + -v: verbose - puts verbose runtime output to STDERR + -L: log - makes y axis log scale + -c: colors "COLORS" - set gnuplot colors for graph/axis/fonts/data (default: + "$colorvals" + in order: bground, axis/fonts, grids, pointcolor1,2,3) + -C: cgi - output CGI header to STDOUT if being called as CGI + -s: stats - turn extra plot stats on (current, avg, min, max) + -j: julian times - time columns is in local julian date (legacy stuff) + -V: version - print version number and exit + -h: help - display this help + +notes: + * TIME either unix date, julian date, or civil date in the form: + YYYY:MM:DD:HH:MM (year, month, day, hour, minute) + If you enter something with colons, it assumes it is civil date + If you have a decimal point, it assumes it is julian date + If it is an integer, it assumes it is unix date (epoch seconds) + If it is a negative number, it is in decimal days from current time + (i.e. -2.5 = two and a half days ago) + * All times on command line are assumed to be "local" times + * All times in the data file must be in unix date (epoch seconds) + * RANGE is given in decimal days (i.e. 1.25 = 1 day, 6 hours) + * if LINES == 0, (i.e. -l 0) then the whole data file is read in + * columns (given with -x, -y, -Y flags) start at 1 + * titles given with -T can contain the following key words which will + be converted: + FILE - basename of input file + RANGE - pretty civil date range (in local time zone) + the default title is: FILE RANGE +EOF + exit 1 + } + +if ($opt_V) { + print STDERR "Stripchart version $majorversion.$minorversion by Matt Lebofsky\n"; + exit 1 + } + +if ($opt_C && $opt_v) { + print STDERR "you cannot have -v and -C set at the same time..\n"; exit 1 } + +if ($opt_i) { $infile = $opt_i } +else { print STDERR "need to set input file via -i. exiting..\n"; exit 1 } + +if ($opt_f) { + if ($opt_f < 0) { $fromtime = to_unix_time($rightnow) + ($daysecs * $opt_f) } + else { $fromtime = to_unix_time($opt_f) } + } +else { $fromtime = to_unix_time($rightnow) - $daysecs } + +if ($opt_t) { $totime = to_unix_time($opt_t) } +else { $totime = to_unix_time($rightnow) } + +if ($opt_v) { print STDERR "selected time range: $fromtime - $totime\n" } + +if ($opt_r) { + $totime = $fromtime + ($opt_r * $daysecs); + $fromtime -= ($opt_r * $daysecs) + } + +# if -l is set, override from/to with close-to-impossible all-inclusive range +if (defined($opt_l)) { $fromtime = 0; $totime = 2147483647 } + +if ($opt_x) { $timecol = $opt_x } else { $timecol = 2 } +if ($opt_y) { $datacol = $opt_y } else { $datacol = 3 } +if ($opt_Y) { $extracol = $opt_Y } + +if ($opt_c) { $colorvals = $opt_c } + +# read in file + +if ($opt_v) { print STDERR "reading in data from $infile..\n" } + +if ($opt_l > 0) { + $numlines = $opt_l; + @stripdata = `$tailexe -$numlines $infile` or die "cannot open file: $infile"; + } +else { + @stripdata = `$catexe $infile` or die "cannot open file: $infile"; + $numlines = @stripdata; + } + +if ($opt_v) { print STDERR "read in $numlines lines..\n" } + +# make gnuplot data file + +if ($opt_v) { print STDERR "making temp data file for gnuplot..\n" } + +open (GNUDATA,">$gnudata") or die "cannot write temp data file: $gnudata"; + +$statcurrent = 0; +$statmax = "x"; +$statmin = "x"; +$stattotal = 0; + +$checkfromtime = $fromtime; +if ($opt_j) { $checkfromtime = (($fromtime + $tzdiff) / $daysecs ) + 2440587.5 } + +$thisextra = 0; +$thisbaseline = 0; +if ($opt_b) { $thisbaseline = $opt_b } +$numlines = 0; +$firstunixdate = -1; +foreach $dataline (@stripdata) { + chomp $dataline; + @dataarray = split /\s/, $dataline; + $thistime = $dataarray[$timecol-1]; + if ($thistime < $checkfromtime) { next } + if ($opt_j) { $thistime = int(($dataarray[$timecol-1] - 2440587.5) * $daysecs) - $tzdiff } + $thisdata = $dataarray[$datacol-1]; + if ($thistime <= $totime) { + if ($thistime !~ /[a-zA-Z]/ && $thisdata !~ /[a-zA-Z]/ && # ignore junky numbers + $thisdata ne "" ) { + if ((defined($opt_d) && ($thisdata >= $opt_d)) || !defined($opt_d)) { + if ((defined($opt_D) && ($thisdata <= $opt_D)) || !defined($opt_D)) { + $numlines++; + if ($firstunixdate == -1) { $firstunixdate = $thistime } + $lastunixdate = $thistime; + if ($opt_Y) { $thisextra = $dataarray[$extracol-1]; } + if ($opt_s) { + $statcurrent = $thisdata; + $stattotal += $thisdata; + if ($statmax eq "x" || $thisdata > $statmax) { $statmax = $thisdata } + if ($statmin eq "x" || $thisdata < $statmin) { $statmin = $thisdata } + } + print GNUDATA "$thistime $thisdata $thisextra $thisbaseline\n" + } + } + } + } + } +close (GNUDATA); + +$statavg = ($stattotal / $numlines); + +if ($opt_B) { + @tmpdata = `$catexe $gnudata`; + open (GNUDATA,">$gnudata") or die "cannot write temp data file: $gnudata"; + foreach $tmpline (@tmpdata) { + chomp $tmpline; + ($tempone,$temptwo,$tempthree,$tempfour) = (split /\s/, $tmpline); + $tempfour = $statavg; + print GNUDATA "$tempone $temptwo $tempthree $tempfour\n"; + } + close (GNUDATA); + } + +if ($numlines == 0) { + print STDERR "no data selected due to user constraints.\n"; + exit 1 + } + +if ($opt_v) { print STDERR "$numlines data points within time range..\n" } + +$begin = $firstunixdate; $end = $lastunixdate; +if (!defined($opt_l)) { $begin = $fromtime; $end = $totime } + +if ($opt_v) { print STDERR "actual time range being plotted: $begin - $end\n" } + +# make gnuplot xtics file + +$daydiff = $end - $begin; + +if ($opt_v) { print STDERR "making xtics file..\n" } + +# depending on the range, pick appropriate tic steps and label steps + +# less than 10 minutes: label every minute, extra tics every 30 seconds +if ($daydiff <= 600) { $labelstep = 60; $ticstep = 30 } +# less than 50 minutes: label every 5 minutes, extra tics every minute +elsif ($daydiff <= 3000) { $labelstep = 300; $ticstep = 60 } +# less than 100 minutes: label every 10 minutes, extra tics every 5 minutes +elsif ($daydiff <= 6000) { $labelstep = 600; $ticsstep = 300 } +# less than 200 minutes: label every 20 minutes, extra tics every 10 minutes +elsif ($daydiff <= 12000) { $labelstep = 1200; $ticsstep = 600 } + +# less than 5 hours: label every 30 minutes, extra tics every 15 minutes +elsif ($daydiff <= 18000) { $labelstep = 1800; $ticstep = 900 } +# less than 10 hours: label every hour, extra tics every 30 minutes +elsif ($daydiff <= 36000) { $labelstep = 3600; $ticstep = 1800 } +# less than 20 hours: label every 2 hours, extra tics every hour +elsif ($daydiff <= 72000) { $labelstep = 7200; $ticstep = 3600 } +# less than 40 hours: label every 4 hours, extra tics every hour +elsif ($daydiff <= 144000) { $labelstep = 14400 ; $ticstep = 3600 } +# less than 60 hours: label every 6 hours, extra tics every hour +elsif ($daydiff <= 216000) { $labelstep = 21600; $ticstep = 3600 } +# less than 120 hours: label every 12 hours, extra tics every 6 hours +elsif ($daydiff <= 432000) { $labelstep = 43200; $ticstep = 21600 } + +# less than 10 days: label every day, extra tics every half day +elsif ($daydiff <= 864000) { $labelstep = 86400; $ticstep = 43200 } +# less than 20 days: label every 2 days, extra tics every day +elsif ($daydiff <= 1728000) { $labelstep = 172800; $ticstep = 86400 } +# less than 40 days: label every 4 days, extra tics every 2 days +elsif ($daydiff <= 3456000) { $labelstep = 345600; $ticstep = 172800 } +# less than 70 days: label every 7 days, extra tics every 7 days +elsif ($daydiff <= 6048000) { $labelstep = 604800; $ticstep = 604800 } +# less than 140 days: label every 14 days, extra tics every 7 days +elsif ($daydiff <= 12096000) { $labelstep = 1209600; $ticstep = 604800 } +# less than 280 days: label every 28 days, extra tics every 14 days +elsif ($daydiff <= 24192000) { $labelstep = 2419200; $ticstep = 1209600 } +# less than 600 days: label every 60 days, extra tics every 30 days +elsif ($daydiff <= 51840000) { $labelstep = 5184000; $ticstep = 2592000 } +# less than 1000 days: label every 100 days, extra tics every 50 days +elsif ($daydiff <= 86400000) { $labelstep = 8640000; $ticstep = 4320000 } +# okay, you're on your own now: every 200 days, extra tics every 100 days +else { $labelstep = 17280000; $ticstep = 8640000 } + +if ($opt_v) { + print STDERR "x label resolution: $labelstep seconds..\n"; + print STDERR "x tic resolution: $ticstep seconds..\n" } + +open (TICDATA,">$ticdata") or die "cannot write temp tic file: $ticdata"; +print TICDATA "set xtics( \\\n"; + +if ($daydiff >= 18000 && $daydiff <= 216000) { + # round down/up to nearest hour + $firstunixdate = int($firstunixdate/3600) * 3600; + $lastunixdate = (int($lastunixdate/3600)+1) * 3600; + } +elsif ($daydiff >= 216000) { + # round down/up to nearest day + $firstunixdate = ((int($firstunixdate/86400)) * 86400) - $tzdiff; + $lastunixdate = ((int($lastunixdate/86400)+1) * 86400) - $tzdiff; + } + +for ($thisdate = $firstunixdate; $thisdate < $lastunixdate; $thisdate += $ticstep) { + $label = '""'; + if (($thisdate - $firstunixdate) % $labelstep == 0) { + if ($daydiff <= 432000) { + $label = '"' . time_to_hourlabel($thisdate) . '"' + } + else { + $label = '"' . time_to_monthlabel($thisdate) . '"' + } + } + print TICDATA $label . " " . $thisdate; + if (($thisdate + $ticstep) < $lastunixdate) { print TICDATA "," } + print TICDATA " \\\n"; + } +print TICDATA ")\n"; +close (TICDATA); + +# make gnuplot file and run it! + +if ($opt_v) { print STDERR "running gnuplot to create $opt_o..\n" } + +if (defined($opt_l)) { # fix for title + $fromtime = $begin; + $totime = $end; + } + +if ($opt_T) { $title = $opt_T } else { $title = "FILE RANGE" } +$thisfile = basename($infile); +$thisrange = "(" . unix_to_civillabel($fromtime) . " -> " . + unix_to_civillabel($totime) . ")"; +$title =~ s/FILE/$thisfile/g; +$title =~ s/RANGE/$thisrange/g; + +if ($opt_s) { + $plotheight += 12; + $statlabel = sprintf("(cur: %.2f max: %.2f min: %.2f avg: %.2f)",$statcurrent,$statmax,$statmin,$statavg); + $title .= "\\n$statlabel"; + } + +open (GNUSCRIPT,">$gnuscript") or die "cannot open gnuscript file: $gnuscript"; +print GNUSCRIPT "set terminal gif small size $plotwidth, $plotheight \\\n"; +print GNUSCRIPT "$colorvals\n"; +print GNUSCRIPT "set nokey\nset grid\nset title \"$title\"\n"; +if ($opt_L) { print GNUSCRIPT "set logscale y\n" } +print GNUSCRIPT "set pointsize 0.1\n"; +print GNUSCRIPT "plot \"$gnudata\" using 1:2 with impulses"; +if ($opt_Y) { + print GNUSCRIPT ", \"$gnudata\" using 1:3 with lines" + } +if ($opt_b || $opt_B) { + print GNUSCRIPT ", \"$gnudata\" using 1:4 with lines" + } +print GNUSCRIPT "\n"; +close (GNUSCRIPT); + +if ($opt_C) { + print "Content-type: image/gif\n\n"; + } + +if ($opt_o) { `$gnuplot/gnuplot $ticdata $gnuscript > $opt_o` } +else { + `$gnuplot/gnuplot $ticdata $gnuscript > $outfile`; + open (OUTFILE,"$outfile"); + while ($bytesread=read(OUTFILE,$buffer,1024)) { print $buffer } + close (OUTFILE); + if ($opt_O) { `$gnuplot/gnuplot $ticdata $gnuscript > $opt_O` } + } + +# the end. clean up. + +if ($opt_v) { print "done. cleaning up..\n" } + +unlink ($outfile); +unlink ($ticdata); +unlink ($gnudata); +unlink ($gnuscript); +exit 0; diff --git a/stripchart/stripchart.cgi b/stripchart/stripchart.cgi new file mode 100755 index 0000000000..7a570eaafc --- /dev/null +++ b/stripchart/stripchart.cgi @@ -0,0 +1,462 @@ +#! /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.1 by Matt Lebofsky ( started: November 11, 2002 ) +# +# Requires: stripchart +# stripchart.cnf (make sure you set the path the .cnf file below) +# 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; + +################ +# READ IN .cnf +################ + +# Where is the .cnf file? +$cnfpath = "./stripchart.cnf"; + +# Read it in: +open (CNFFILE,$cnfpath) or die "cannot open configuration file: $cnfpath\nmake sure this variable is set properly"; +while () { eval } +close (CNFFILE); + +############### +# PREP ARRAYS +############### + +# Read in list of datafiles: +@datafiles = `$grepexe -v '^#' $datafilelist`; + +# Read in list of queries: +@querylist = `$grepexe -v '^#' $queryfilelist`; + +# 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) } + +############# +# 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); + unlink ($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"; + + + + +Stripchart + + +EOF + +if ($datafile1 ne "") { # stripcharts were selected, so plot them + +foreach $which (1 .. $numcharts) { + $thisfile = $query->param("df$which"); + if ($thisfile eq "No plot" || $thisfile =~ /^-+$/ || $thisfile eq "") { next } + if ($thisfile eq "Same as datafile 1") { $thisfile = $query->param("df1") } + $rangetype = $query->param("dr$which"); + $trustnum = $which; + $from = "-f "; + $to = ""; + if ($rangetype eq "sa1") { $rangetype = $query->param("dr1"); $trustnum = 1 } + if ($rangetype eq "lh") { $from .= "-" .($query->param("lhv$trustnum") / 24) } + elsif ($rangetype eq "ld") { $from .= "-" . ($query->param("ldv$trustnum")) } + else { + $fromstring = $query->param("dfy$trustnum") . ":" . + $query->param("dfm$trustnum") . ":" . + $query->param("dfd$trustnum") . ":" . + $query->param("dfh$trustnum") . ":" . + $query->param("dfn$trustnum"); + $tostring = $query->param("dty$trustnum") . ":" . + $query->param("dtm$trustnum") . ":" . + $query->param("dtd$trustnum") . ":" . + $query->param("dth$trustnum") . ":" . + $query->param("dtn$trustnum"); + $from .= to_unix_time($fromstring); + $to = "-t " . to_unix_time($tostring) + } + + foreach $element (@datafiles) { + ($maybepath,$maybefile,$maybedatacol,$maybeflags) = split /:/, $element; + if ($maybefile eq $thisfile) { + $fullpath = $maybepath; + $datacol = $maybedatacol; + $flags = $maybeflags; + } + } + + $flags .= " $from $to"; + + if ($query->param("log$which")) { $flags .= " -L" } + if ($query->param("bavg$which")) { $flags .= " -B " } + if ($query->param("base$which")) { $flags .= " -b " . $query->param("basev$which") } + if ($query->param("ymin$which")) { $flags .= " -d " . $query->param("yminv$which") } + if ($query->param("ymax$which")) { $flags .= " -D " . $query->param("ymaxv$which") } + if ($query->param("savem")) { $flags .= " -O /tmp/stripchart_plot_$which.gif" } + + + $flags .= " -i $fullpath -y $datacol -T \"$thisfile RANGE\" $defaultflags"; + + $fixflags = $flags; + $fixflags =~ s/ /+/g; + $fixflags =~ s/"/%22/g; + + if ($cgiplotwidth == 0) { + print "
\n" + } + else { + print "
\n" + } + + } +print "
"; + + } + +# Now display the user entry form: + +print << "EOF"; +
+ +Select a saved query if you like: + + + + +
+ + +Number of stripcharts: +EOF +for ($i=1;$i<21;$i++) { + $fullquery = $ENV{'QUERY_STRING'}; + $fullquery =~ s/numcharts=\d+//; + $fullquery =~ s/&+/&/g; + $fullquery =~ s/^&//; + print "$i\n" + } + +print << "EOF"; +

+

+ to plot stripcharts - +enter name: + +to save query (check here: + +to delete) + +

+EOF + +foreach $which (1 .. $numcharts) { + $thisoptionlist = $optionlist; + if ($which > 1) { + $thisoptionlist = "\n" . + "\n" . + "\n" . $optionlist + } + if ($dummy = $query->param("df$which")) { + $dummy = ""; + $newoptionlist = "$dummy\n"; + foreach $thisline (split /\n/, $thisoptionlist) { + if ($dummy ne $thisline) { $newoptionlist .= "$thisline\n" } + } + $thisoptionlist = $newoptionlist; + } + $lhc = ""; + $ldc = ""; + $ownc = ""; + $sa1c = ""; + if ($dummy = $query->param("dr$which")) { + if ($dummy eq "lh") { $lhc = "checked" } + elsif ($dummy eq "ld") { $ldc = "checked" } + elsif ($dummy eq "own") { $ownc = "checked" } + elsif ($dummy eq "sa1") { $sa1c = "checked" } + } + else { + if ($which > 1) { $sa1c = "checked" } + else { $lhc = "checked" } + } + $samerange = ""; + if ($which > 1) { + $samerange = " Same range as datafile 1" + } + + $logcheck = ""; + if ($query->param("log$which") eq "y") { $logcheck = "checked" } + + $bavgcheck = ""; + if ($query->param("bavg$which") eq "y") { $bavgcheck = "checked" } + $basecheck = ""; + if ($query->param("base$which") eq "y") { $basecheck = "checked"; $baseval = $query->param("basev$which") } + + + $ymincheck = ""; + $ymaxcheck = ""; + if ($query->param("ymin$which") eq "y") { $ymincheck = "checked"; $yminval = $query->param("yminv$which") } + if ($query->param("ymax$which") eq "y") { $ymaxcheck = "checked"; $ymaxval = $query->param("ymaxv$which") } + + if ($dummy = $query->param("dfy$which")) { + $dfytop = "\n\n" } + else { $dfytop = "" } + if ($dummy = $query->param("dfm$which")) { + $dfmtop = "\n\n" } + else { $dfmtop = "" } + if ($dummy = $query->param("dfd$which")) { + $dfdtop = "\n\n" } + else { $dfdtop = "" } + if ($dummy = $query->param("dfh$which")) { + $dfhtop = "\n\n" } + else { $dfhtop = "" } + if ($dummy = $query->param("dfn$which")) { + $dfntop = "\n\n" } + else { $dfntop = "" } + + if ($dummy = $query->param("dty$which")) { + $dtytop = "\n\n" } + else { $dtytop = "" } + if ($dummy = $query->param("dtm$which")) { + $dtmtop = "\n\n" } + else { $dtmtop = "" } + if ($dummy = $query->param("dtd$which")) { + $dtdtop = "\n\n" } + else { $dtdtop = "" } + if ($dummy = $query->param("dth$which")) { + $dthtop = "\n\n" } + else { $dthtop = "" } + if ($dummy = $query->param("dtn$which")) { + $dtntop = "\n\n" } + else { $dtntop = "" } + + $lhourlist = ""; + if ($query->param("lhv$which")) { + $lhourlist = ""; + } + foreach $hourval (24,36,48,60,72) { + if ($hourval != $query->param("lhv$which")) { + $lhourlist .= ""; + } + } + + $ldaylist = ""; + if ($query->param("ldv$which")) { + $ldaylist = ""; + } + foreach $dayval (2,3,4,5,6,7,10,14,21,28,30,60,90,120,240,360,720) { + if ($dayval != $query->param("ldv$which")) { + $ldaylist .= ""; + } + } + +print << "EOF"; +please select datafile $which: + +
+ Last + + + + +hours    + Last + + + + + +days    +$samerange +
+ Enter range: +
+ +// : -> +// : + + +
+ Log y axis? + Baseline average, or + Baseline at: + + Y min: + + Y max: + +
+


+EOF + + } # end foreach $which + +print << "EOF"; + + Save images in /tmp? +
+ to plot stripcharts + +

+Reset Form

+ + +Stripchart version $majorversion.$minorversion by +Matt Lebofsky. + +EOF diff --git a/stripchart/stripchart.cnf b/stripchart/stripchart.cnf new file mode 100644 index 0000000000..1213ad86a0 --- /dev/null +++ b/stripchart/stripchart.cnf @@ -0,0 +1,69 @@ +#! /usr/local/bin/perl + +use Time::Local; + +# What version is this? +$majorversion = 2; $minorversion = 1; + +# Where is gnuplot located? +# $gnuplot = "/usr/local/gnuplot-3.7"; +$gnuplot = "/disks/asimov/a/users/hiramc/local/src/gnuplot-3.7"; + +# Temporary files +$suffix = rand(10000); +$gnudata = "/tmp/XYZzyx..indata" . $suffix; # contains input data +$ticdata = "/tmp/XYZzyx..ticdata" . $suffix; # contains xtic information +$gnuscript = "/tmp/XYZzyx..gnuscript" .$suffix; # contains script for gnuplot +$outfile = "/tmp/XYZzyx..outfile" . $suffix; # contains output plot + +# Default colors for plotting (in standard RRGGBB hex format) +# in order: 1. background color, 2. axis/font color, 3. grid color, +# 4. point color 1, 5. point color 2, 6. point color 3 +$colorvals = "xffffff x000000 xc0c0c0 x00a000 x0000a0 x2020c0"; + +# Default size of plot in pixels +$plotwidth = 600; +$plotheight = 180; + +# Abbreviations for months +@monthabbs = ("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"); + +# Where are these unix commands located? +$tailexe = "/usr/ucb/tail"; +$catexe = "/usr/bin/cat"; +$grepexe = "/usr/bin/grep"; + +# How many seconds in a day? +$daysecs = 86400; + +# Local time difference? (Yes this is a wonky way to get current time zone difference) +($sec,$min,$hour,$mday,$mon,$year) = gmtime($rightnow); +$tzdiff = timegm($sec,$min,$hour,$mday,$mon,$year) - timelocal($sec,$min,$hour,$mday,$mon,$year); + +# Where is the stripchart executable located? +$stripchartexe = "./stripchart" + +# What is the default number of stripcharts? +$defaultnumcharts = 1; + +# Any default flags to send to stripchart? +$defaultflags = "-s"; + +# Where is the list of datafiles for stripchart.cgi? +# Note: there is a sample copy in the samples directory: +$datafilelist = "/disks/jill/a/inet_services/www/share/cgi-bin/lib/datafiles"; + +# Where is the list of user-definied cgi queries? +# Note: this file gets created by the cgi - must put it somewhere that the cgi user can write to +$queryfilelist = "/disks/jill/a/inet_services/www/share/cgi-bin/lib/querylist"; + +# What time is it right now? +$rightnow = time; +($sec,$min,$hour,$day,$month,$year) = localtime($rightnow); +$sec = ""; +$month++; +$year += 1900; + +# CGI plot width and plot height: set only if it will always be the same +# $cgiplotwidth = 0; $cgiplotheight = 0; # if you don't know +$cgiplotwidth = 600; $cgiplotheight = 192; # if you do know diff --git a/todo b/todo index 31aa49b838..ada851cd7e 100755 --- a/todo +++ b/todo @@ -45,6 +45,19 @@ Messages from core client MEDIUM-PRIORITY (should do before public release) ----------------------- +Devise system for porting applications + password-protected web-based interface for + uploading app versions and adding them to DB + +Figure out how to support people with computers at home/work + with different preferences. + - separate accounts, but credit funnels to 1 account? + (can have same email?) + - separate prefs under 1 account? + need separate DB table for prefs? + +Add 2-D waterfall display to Astropulse + protect project admin web pages (htaccess) get timezone working on all platforms