chiark / gitweb /
cache pngs
[rrd-graphs.git] / cgi
diff --git a/cgi b/cgi
index 79f2b11cfe0802ecb059c185a697828c59a76f3f..c348508dd9b4001ff849897f5b7df2ffb87a36b1 100755 (executable)
--- a/cgi
+++ b/cgi
@@ -25,7 +25,7 @@ sub graph_of_group ($$$$$) {
     my ($section, $group, $elem, $basis, $args) = @_;
     $basis->{Args}= $args;
     $basis->{Slower}= 0 unless exists $basis->{Slower};
-
+    $basis->{TimeRanges} ||= \@timeranges;
     $graphs{$section,$group,$elem}= $basis;
     if (!exists $group_elems{$section,$group}) {
        # new group then
@@ -140,7 +140,29 @@ foreach my $src (<$R/df/df-*.rrd>) {
           ]);
 }
 
-foreach my $src (<$SELF/data/news/*.rrd>) {
+our %news_name_map;
+
+if (!open NM, '<', "$SELF/data/news/name-map") {
+    die unless $!==&ENOENT;
+} else {
+    while (<NM>) {
+       s/^\s*//; s/\s+$//;
+       next unless m/^[^\#]/;
+       m/^(\S+)\s+(in|out|\*)\s+(\S+)$/ or die;
+       if ($2 eq '*') {
+           $news_name_map{$1,$_}= $3 foreach qw(in out);
+       } else {
+           $news_name_map{$1,$2}= $3;
+       }
+    }
+}
+
+sub news_name_sortkey {
+    return join '.', reverse split /\./, $_[0];
+}
+
+foreach my $src (sort { news_name_sortkey($a) cmp news_name_sortkey($b) }
+                <$SELF/data/news/*.rrd>) {
     my $site= $src;
     $site =~ s,\.rrd$,, or next;
     $site =~ s,.*/,,;
@@ -148,10 +170,13 @@ foreach my $src (<$SELF/data/news/*.rrd>) {
     my $inout= $1;
     $site =~ s/^([-.0-9a-z]+)_//;
     my $us= $1; # all very well but we ignore it
+    my $newsite= $news_name_map{$site,$inout};
+    $site= $newsite if defined $newsite;
+    next if $site eq '-';
     graph_of_group("News", $site, $inout,
          {
-               Slower => 1,
-               Units => '[art/s]'
+               Units => '[art/s]',
+               TimeRanges => [ map { $_*86400 } qw(1 7 31), 366, 366*3 ]
            }, $inout eq 'out' ?
          [
           (map { "DEF:$_=$src:$_:AVERAGE" }
@@ -172,8 +197,9 @@ foreach my $src (<$SELF/data/news/*.rrd>) {
           "AREA:rejected#f00:rej:STACK",
           "AREA:duplicate#000:dupe:STACK",
           "AREA:refused#aaa:unw:STACK",
+          "CDEF:kb_accepted_smooth=kb_accepted,<interval/60>,TREND",
           "LINE:kb_duplicate#ff0:kb dupe",
-          "LINE:kb_accepted#008:kb",
+          "LINE:kb_accepted_smooth#008:~kb",
           ]);
 }
 
@@ -221,32 +247,40 @@ if (defined $elem) {
     my $g= $graphs{$section,$group,$elem};
     die unless $g;
 
-    my @args= @{ $g->{Args} };
-
     my $width= num_param('w',370,100,1600);
     my $height= num_param('h',200,100,1600);
 
     my $sloth= param('sloth');
     die unless defined $sloth;
     $sloth =~ m/^(\d+)$/ or die;
-    my $end= $timeranges[$sloth];
-    die unless defined $end;
+    $sloth= $1+0;
+    my $end= $g->{TimeRanges}[$sloth];
+
+    my $cacheid= "$section!$group!$elem!$sloth!$width!$height";
+    my $cachepath= "cache/$cacheid.png";
+
+    my @args= @{ $g->{Args} };
+    s,\<interval/(\d+)\>, $end/$1 ,ge foreach @args;
     unshift @args, qw(--end now --start), "end-${end}s";
     
-    if (param('debug')) {
-        print((join "\n",@args),"\n"); exit 0;
-    }
-    print "Content-Type: image/png\n\n";
-
     my $title= $group;
     if (length $elem) { $title.= " $elem"; }
 
     $title .= " $g->{Units}" if $g->{Units};
-    unshift @args, '-t', $title;
-    
-    exec (qw(rrdtool graph - -a PNG --full-size-mode),
-         '-w',$width, '-h',$height,
-         @args);
+    unshift @args, '-t', $title, '-w',$width, '-h',$height;
+    unshift @args, qw(-a PNG --full-size-mode);
+
+    if (param('debug')) {
+        print((join "\n",@args),"\n"); exit 0;
+    }
+
+#print STDERR "||| ",(join ' ', map { "'$_'" } @args)." |||\n";
+    exec(qw(sh -ec), <<'END', 'x', $cachepath, @args);
+        p="$1"; shift
+        rrdtool graph "$p" --lazy "$@" >/dev/null
+       printf "Content-Type: image/png\n\n"
+       exec cat "$p"
+END
     die $!;
 }