#!/usr/bin/perl
#
# Kristian Kallenberg, 28/5-2004 - 13/9-2004, GPL, This is NOT to be patented!
# You are encouraged to start this scrip with nice!
# Constants
$tc = "/sbin/tc";
$clock = 0;
@graphs = ( # title, data, update, average
["1 minut", 60, 10, 30],
["5 minutter", 5 * 60, 30, 50],
["15 minutter", 15 * 60, 5 * 60, 180],
["1 time", 60 * 60, 5 * 60, 300],
["5 timer", 5 * 60 * 60, 15 * 60, 600]
#["1 dag", 24 * 60 * 60, 60 * 60, 24 * 60],
#["5 dage", 5 * 24 * 60 * 60, 60 * 60, 60 * 60]
);
# Count qdiscs
if (open(TC, "$tc qdisc show dev eth2|wc -l|")) {
$qdiscs = readline(TC);
$qdiscs--;
close(TC);
} else {
die("cannot run $tc");
}
# Create gnuplot files
for $table (@graphs) {
($title, $data, $update, $average) = @$table;
$filename = $title;
$filename =~ s/ //;
if (open(GNUPLOT, ">$filename.gplt")) {
print GNUPLOT "set terminal png\n";
print GNUPLOT "set xlabel \"Dato og Klokkeslet\"\n";
print GNUPLOT "set ylabel \"Data [KB/s]\"\n";
print GNUPLOT "set xdata time\n";
print GNUPLOT "set timefmt \"%d/%m %H:%M:%S\"\n";
print GNUPLOT "set format x \" %d/%m\\n%H:%M:%S \"\n";
print GNUPLOT "set lmargin 10\n";
print GNUPLOT "set rmargin 5\n";
print GNUPLOT "set output \"$filename-new.png\"\n";
print GNUPLOT "set title \"$title\"\n";
$plot = "plot ";
$qdisc = 0;
print "$users";
while ($qdisc < $qdiscs) {
$qdisc++;
$using = $qdisc + 2;
$plot .= "\"$filename.log\" using 1:$using smooth unique title \"";
$plot .= chr($qdisc + 64);
$plot .= "\"";
if ($qdisc < $qdiscs) {
$plot .= ", ";
}
}
print GNUPLOT "$plot\n";
close(GNUPLOT);
} else {
print "Cannot create gnuplot file: $title.gplt";
}
}
# Create index.html
if (open(FILE, ">index.html")) {
print FILE "<html>\n";
print FILE "\t<head>\n";
print FILE "\t\t<title>qos.pl</title>\n";
print FILE "\t</head>\n";
print FILE "\t<body>\n";
#print FILE "\t\t<meta http-equiv=\"refresh\" content=\"10\">\n";
for $table (@graphs) {
($title, $data, $update, $average) = @$table;
$title =~ s/ //;
print FILE "\t\t<img src=\"$title.png\" width=\"640\" hight=\"480\">\n";
print FILE "\t\t<br>\n";
print FILE "\t\t<br>\n";
}
print FILE "\t\tdownload(<a href=\"qos.pl\">qos.pl</a>)<br>\n";
print FILE "\t\t<br>\n";
print FILE "\t\t/kallenberg\n" ;
print FILE "\t</body>\n";
print FILE "</html>";
close(FILE);
} else {
print "Cannot create file: index.html";
}
sub logdata {
$data = time();
if (open(TC, "$tc -s qdisc show dev eth2|")) {
while (! eof(TC)) {
($qdisc, $queue) = split(" ", <TC>);
if ($qdisc eq "qdisc" && $queue eq "sfq") {
($one, $sent) = split(" ", <TC>);
$data .= "\t";
$data .= $sent;
}
}
close(TC);
} else {
die("cannot run $tc");
}
if (open(LOG, ">>qos.log")) {
flock(LOG, LOCK_EX);
seek(LOG, 0, SEEK_END);
print LOG "$data\n";
close(LOG);
flock(LOG, LOCK_UN);
} else {
die("cannot write \"qos.log\"");
}
}
sub plotdata {
foreach $graph (@graphs) {
($title, $data, $update, $average) = @$graph;
if (!($clock % $update)) {
$filename = $title;
$filename =~ s/ //;
$lines = $data + $average;
if (open(LOG, "tail -n $lines qos.log|")) {
if (open(PLOT, ">$filename.log")) {
flock(LOG, LOCK_EX);
# Get first line
@logdata = split("\t", <LOG>);
@buffer = [ @logdata ];
$lines--;
# Get average lines
while ($lines-- > $data && ! eof(LOG)) {
@logdata = split("\t", <LOG>);
push @buffer, [ @logdata ];
}
# Get remaining lines and write gnuplot data
while (! eof(LOG)) {
@logdata = split("\t", <LOG>);
push @buffer, [ @logdata ];
$seconds = $logdata[0] - $buffer[0][0];
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($logdata[0]);
$mon += 1;
$plotdata = "$mday/$mon $hour:$min:$sec";
$qdisc = @logdata;
while ($qdisc-- > 1) {
$plotdata .= "\t";
$value = ($logdata[$qdisc] - $buffer[0][$qdisc]) / 1024;
if ($value < 0 ) {
$value = 0;
}
if ($seconds > 0) {
$value /= $seconds;
} else {
$value = 0;
}
$plotdata .= $value;
}
print PLOT "$plotdata\n";
shift @buffer;
}
close(PLOT);
flock(PLOT, LOCK_UN);
# Generate plots
system("nice -n +19 gnuplot $filename.gplt");
system("rm -f $filename.png $filename.log");
system("mv $filename-new.png $filename.png");
} else {
die("cannot write \"$filename.log\"");
}
close(LOG);
} else {
die("cannot read \"qos.log\"");
}
}
}
}
while (true) {
logdata;
plotdata;
$clock++;
sleep(1);
}
Detta är orginal koden av scriptet, jag har moddat mitt lite. Scriptet för grapherna kommer från http://qos.kallenberg.dk/.
UPDATE: Får man ingen syntax highlightning på bash eller perl script? Eller ska man använda något annat än code taggen?