IngRRD/index
2015-01-30 16:08:33 +01:00

643 lines
21 KiB
Bash
Executable File

#!/bin/bash
# IngRRD (https://forge.riquer.fr/p/ingrrd/)
# Copyright (C) 2014 Vincent Riquer
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
. settings
for lib in lib/*
do
source $lib
done
if [ ! -w "$rrdfile" ]
then
cat <<-EOHead
Content-type: text/plain
Last-Modified: $(LC_ALL=C TZ=GMT date +'%a, %d %b %Y %X %Z')
Expires: $(LC_ALL=C TZ=GMT date +'%a, %d %b %Y %X %Z')
refresh: 0,url=/cgi/$webuser/add.html
EOHead
exit
fi
read_query_string
(( start >= end)) && (( end = start + 604800 ))
if [ -z "$graph" ]
then
readlast
medals
get_current_level
readold "${last[time]}-$prevperiod"
get_next_level
if (( show_all ))
then
title="IngRRD - $webuser [L$curlevel] - History &amp; Trend: All stats"
elif (( show_graphs ))
then
title="IngRRD - $webuser [L$curlevel] - History &amp; Trend: Badges"
else
title="IngRRD - $webuser [L$curlevel] - Overview"
fi
cat <<-EOHTML
content-type: application/xhtml+xml
Last-Modified: $(
LC_ALL=C TZ=GMT date +'%a, %d %b %Y %X %Z' \
-d @$(rrdtool last ingress.rrd)
)
Expires: $(LC_ALL=C TZ=GMT date +'%a, %d %b %Y %X %Z' -d '1 hour')
Cache-Control: max-age=0, must-revalidate
refresh: 600
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>$title</title>
<link rel="stylesheet" type="text/css" href="/ingrrd.css" />
</head>
<body>
<div style="width:$(( graph_width + 97 ))px" class="container">
EOHTML
if (( ! show_graphs ))
then
cat <<-EOHTML
<div class="menu">
<table style="width:$(( graph_width + 97 ))px" class="menu">
<tr>
<td class="menu-inv">Overview</td>
<td class="menu">
<table class="menu-nobrd">
<tr>
<td colspan="2"><a href="?hist&amp;start=$start&amp;end=$end">History &amp; Trend</a></td>
</tr>
<tr>
<td class="menu">
<a href="?hist&amp;start=$start&amp;end=$end">Medals</a>
</td>
<td class="menu">
<a href="?hist&amp;show=all&amp;start=$start&amp;end=$end">All</a>
</td>
</tr>
</table>
</td>
<td class="menu">
<table class="menu-nobrd">
<tr>
<td colspan="2">
<a href="add.html?start=$start&amp;end=$end"><b>Add data</b></a>
</td>
</tr>
<tr>
<td class="menu">
<a href="add.html?start=$start&amp;end=$end"><b>Add</b></a>
</td>
<td class="menu">
<a href="import?start=$start&amp;end=$end">Import</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
EOHTML
show_current_level
cat <<-EOHTML
</div>
<div class="main">
EOHTML
cat <<-EOHTML
<div>
<table class="level">
<tr>
<th class="level">Level</th>
<th>AP</th>
<th class="badge">Silver</th>
<th class="badge">Gold</th>
<th class="badge">Platinum</th>
<th class="badge">Black</th>
</tr>
EOHTML
for level in {1..16}
do
never=0
maxtimestamp=0
tableline=()
if (( last["AP"] >= lvl[level] ))
then
tableline+=( '<td class="AP" style="background:lightgreen">'
$(printf "%'li" ${lvl[level]})
'</td>' )
else
#FIXME
readable=$(printf "%'li" ${lvl[level]})
tableline+=( '<td class="AP" style="background:lightgrey">'"${readable// /&nbsp;}" )
readable=$(printf "%'li" $(( last["AP"] - lvl[level] )))
tableline+=( "<br />(<span class=\"missing\">${readable// /&nbsp;}</span>)" )
if (( timestamp ))
then
tableline+=( "<br />$(date +%Y-%m-%d -d @${nextlevels[level]})</td>" )
(( nextlevels[level] > maxtimestamp )) \
&& maxtimestamp=${nextlevels[level]}
else
tableline+=( "<br />(maybe some day)</td>" )
never=1
fi
fi
if (( silvercount >= lvlsilver[level] ))
then
tableline+=( '<td class="badge" style="background:lightgreen">'${lvlsilver[level]}'</td>' )
else
tableline+=( "<td class=\"badge\" style=\"background:lightgrey\">${lvlsilver[level]} (<span class=\"missing\">$(( silvercount - lvlsilver[level] ))</span>)<br />" )
count=0
for timestamp in ${!nextsilver[@]}
do
if (( timestamp ))
then
thisdate=$(date +%Y-%m-%d -d @$timestamp)
(( timestamp > maxtimestamp )) \
&& maxtimestamp=$timestamp
for stat in ${nextsilver[timestamp]}
do
tableline+=( "$(print_medal $timestamp $stat ${upsilver[$stat]})" )
tableline+=( '<br />' )
(( ++count == lvlsilver[level] - silvercount )) && break 2
done
fi
done
for stat in ${nextsilver[0]}
do
(( count >= lvlsilver[level] - silvercount )) && break 1
(( count < lvlsilver[level] - silvercount )) && never=1
tableline+=( "$(print_medal $timestamp $stat ${upsilver[$stat]})" )
tableline+=( '<br />' )
(( count++ ))
done
tableline+=( '</td>' )
fi
if (( goldcount >= lvlgold[level] ))
then
tableline+=( '<td class="badge" style="background:lightgreen">'${lvlgold[level]}'</td>' )
else
tableline+=( "<td class=\"badge\" style=\"background:lightgrey\">${lvlgold[level]} (<span class=\"missing\">$(( goldcount - lvlgold[level] ))</span>)<br />" )
count=0
for timestamp in ${!nextgold[@]}
do
if (( timestamp ))
then
thisdate=$(date +%Y-%m-%d -d @$timestamp)
(( timestamp > maxtimestamp )) \
&& maxtimestamp=$timestamp
for stat in ${nextgold[timestamp]}
do
tableline+=( "$(print_medal $timestamp $stat ${upgold[$stat]})" )
tableline+=( '<br />' )
(( ++count == lvlgold[level] - goldcount )) && break 2
done
fi
done
for stat in ${nextgold[0]}
do
(( count >= lvlgold[level] - goldcount )) && break 1
(( count < lvlgold[level] - goldcount )) && never=1
tableline+=( "$(print_medal $timestamp $stat ${upgold[$stat]})" )
tableline+=( '<br />' )
(( count++ ))
done
tableline+=( '</td>' )
fi
if (( platinumcount >= lvlplatinum[level] ))
then
tableline+=( '<td class="badge" style="background:lightgreen">'${lvlplatinum[level]}'</td>' )
else
tableline+=( "<td class=\"badge\" style=\"background:lightgrey\">${lvlplatinum[level]} (<span class=\"missing\">$(( platinumcount - lvlplatinum[level] ))</span>)<br />" )
count=0
for timestamp in ${!nextplatinum[@]}
do
if (( timestamp ))
then
thisdate=$(date +%Y-%m-%d -d @$timestamp)
(( timestamp > maxtimestamp )) \
&& maxtimestamp=$timestamp
for stat in ${nextplatinum[timestamp]}
do
tableline+=( "$(print_medal $timestamp $stat ${upplatinum[$stat]})" )
tableline+=( '<br />' )
(( ++count == lvlplatinum[level] - platinumcount )) && break 2
done
fi
done
for stat in ${nextplatinum[0]}
do
(( count >= lvlplatinum[level] - platinumcount )) && break 1
(( count < lvlplatinum[level] - platinumcount )) && never=1
tableline+=( "$(print_medal $timestamp $stat ${upplatinum[$stat]})" )
tableline+=( '<br />' )
(( count++ ))
done
tableline+=( '</td>' )
fi
if (( blackcount >= lvlblack[level] ))
then
tableline+=( '<td class="badge" style="background:lightgreen">'${lvlblack[level]}'</td>' )
else
tableline+=( "<td class=\"badge\" style=\"background:lightgrey\">${lvlblack[level]} (<span class=\"missing\">$(( blackcount - lvlblack[level] ))</span>)<br />" )
count=0
for timestamp in ${!nextblack[@]}
do
if (( timestamp ))
then
thisdate=$(date +%Y-%m-%d -d @$timestamp)
(( timestamp > maxtimestamp )) \
&& maxtimestamp=$timestamp
for stat in ${nextblack[timestamp]}
do
tableline+=( "$(print_medal $timestamp $stat ${upblack[$stat]})" )
tableline+=( '<br />' )
(( ++count == lvlblack[level] - blackcount )) && break 2
done
fi
done
for stat in ${nextblack[0]}
do
(( count >= lvlblack[level] - blackcount )) && break 1
(( count < lvlblack[level] - blackcount )) && never=1
tableline+=( "$(print_medal $timestamp $stat ${upblack[$stat]})" )
tableline+=( '<br />' )
(( count++ ))
done
tableline+=( '</td>' )
fi
if (( level <= curlevel ))
then
echo "<tr class=\"curlevel\"><th class=\"level\">$level</th>"
else
cat <<-EOHTML
<tr class="nextlevel">
<th class="level">$level</th>
EOHTML
fi
echo "${tableline[@]}"
if (( level > curlevel ))
then
cat <<-EOHTML
<td class="date">$(date +%Y-%m-%d -d @$maxtimestamp)</td>
EOHTML
fi
echo '</tr>'
done
cat <<-EOHTML
</table>
</div>
EOHTML
else
cat <<-EOHTML
<div class="menu">
<table class="menu" style="width:$(( graph_width + 97 ))px">
<tr>
<td class="menu"><a href="?start=$start&amp;end=$end">Overview</a></td>
<td class="menu-inv">
<table class="menu">
<tr>
<td colspan="2" class="menu-inv">History &amp; Trend</td>
</tr>
EOHTML
if (( show_all ))
then
cat <<-EOHTML
<tr>
<td class="menu">
<a href="?hist&amp;start=$start&amp;end=$end">Medals</a>
</td>
<td class="submenu-inv">All</td>
</tr>
EOHTML
else
cat <<-EOHTML
<tr>
<td class="submenu-inv">Medals</td>
<td class="menu">
<a href="?hist&amp;show=all&amp;start=$start&amp;end=$end">All</a>
</td>
</tr>
EOHTML
fi
cat <<-EOHTML
</table>
</td>
<td class="menu">
<table class="menu-nobrd">
<tr>
<td colspan="2">
<a href="add.html?start=$start&amp;end=$end"><b>Add data</b></a>
</td>
</tr>
<tr>
<td class="menu">
<a href="add.html?start=$start&amp;end=$end"><b>Add</b></a>
</td>
<td class="menu">
<a href="import?start=$start&amp;end=$end">Import</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
EOHTML
show_current_level
cat <<-EOHTML
<table style="width:$(( graph_width + 97 ))px">
<tr>
<td>
<a href="?hist&amp;start=$(rrdtool first ingress.rrd)&amp;end=$end">First</a>
<a href="?hist&amp;start=$(( start - 365 * 86400 ))&amp;end=$end">-Y</a>
<a href="?hist&amp;start=$(( start - 30 * 86400 ))&amp;end=$end">-M</a>
<a href="?hist&amp;start=$(( start - 604800 ))&amp;end=$end">-W</a>
<a href="?hist&amp;start=$(( start - 86400 ))&amp;end=$end">-D</a>
<a href="?hist&amp;start=$now&amp;end=$end">Now</a>
<a href="?hist&amp;start=$(( start + 86400 ))&amp;end=$end">+D</a>
<a href="?hist&amp;start=$(( start + 604800 ))&amp;end=$end">+W</a>
<a href="?hist&amp;start=$(( start + 30 * 86400 ))&amp;end=$end">+M</a>
<a href="?hist&amp;start=$(( start + 365 * 86400 ))&amp;end=$end">+Y</a>
</td>
<td align="right">
<a href="?hist&amp;start=$start&amp;end=$(( end - 365 * 86400 ))">-Y</a>
<a href="?hist&amp;start=$start&amp;end=$(( end - 30 * 86400 ))">-M</a>
<a href="?hist&amp;start=$start&amp;end=$(( end - 604800 ))">-W</a>
<a href="?hist&amp;start=$start&amp;end=$(( end - 86400 ))">-D</a>
<a href="?hist&amp;start=$start&amp;end=$now">Now</a>
<a href="?hist&amp;start=$start&amp;end=$(( end + 86400 ))">+D</a>
<a href="?hist&amp;start=$start&amp;end=$(( end + 604800 ))">+W</a>
<a href="?hist&amp;start=$start&amp;end=$(( end + 30 * 86400 ))">+M</a>
<a href="?hist&amp;start=$start&amp;end=$(( end + 365 * 86400 ))">+Y</a>
</td>
</tr>
</table>
</div>
<div class="maingraph">
EOHTML
if (( show_all ))
then
stats=(
"${dsnames[@]}"
)
else
stats=(
AP
"${medals[@]}"
)
fi
for stat in "${stats[@]}"
do
if [[ $stat == AP ]] || (( bronze["$stat"] ))
then
height=169
else
height=155
fi
cat <<-EOHTML
<div id="$stat" class="anchor" />
<img
src="?graph=$stat&amp;start=$start&amp;end=$end"
width="$(( graph_width + 97 ))"
height="$height"
alt="Ingress $stat evolution" />
EOHTML
done
fi
encodeduri="${REQUEST_URI//\//%2F}"
encodeduri="${encodeduri/\?/%3F}"
encodeduri="${encodeduri//\=/%3D}"
encodeduri="${encodeduri//\&/%26}"
cat <<-EOHTML
<table style="width:$(( graph_width + 97 ))px">
<tr>
<td style="width:180px">
<a
href="http://validator.w3.org/check?uri=https%3A%2F%2F$SERVER_NAME$encodeduri">
<img
src="/valid-xhtml11"
alt="Valid XHTML 1.1"
height="31"
width="88" />
</a>
<a
href="http://jigsaw.w3.org/css-validator/validator?uri=https%3A%2F%2F$SERVER_NAME$encodeduri">
<img
style="border:0;width:88px;height:31px"
src="/vcss"
alt="Valid CSS!" />
</a>
</td>
<td style="text-align:center">
Generated by <a href="https://forge.riquer.fr/p/ingrrd/">IngRRD</a> &copy; 2014-2015 Vincent Riquer
</td>
<td style="text-align:right; width:180px">
<a href="http://www.fsf.org/licensing/licenses/agpl-3.0.html">
<img src="/AGPL.png" alt="AGPLv3" height="31" width="88" />
</a>
</td>
</tr>
</table>
</div>
</div>
</body></html>
EOHTML
else
now=$(date +%s)
cat <<-EOHEAD
content-type: image/png
Last-Modified: $(
LC_ALL=C TZ=GMT date +'%a, %d %b %Y %X %Z' \
-d @$(rrdtool last ingress.rrd)
)
Expires: $(LC_ALL=C TZ=GMT date +'%a, %d %b %Y %X %Z' -d '1 hour')
Cache-Control: max-age=0, must-revalidate
EOHEAD
if [[ $graph == AP ]]
then
thresholds=(
COMMENT:'Levels\:'
HRULE:${lvl[2]}#$L1color:1
HRULE:${lvl[2]}#$L2color:2
HRULE:${lvl[3]}#$L3color:3
HRULE:${lvl[4]}#$L4color:4
HRULE:${lvl[5]}#$L5color:5
HRULE:${lvl[6]}#$L6color:6
HRULE:${lvl[7]}#$L7color:7
HRULE:${lvl[8]}#$L8color:8
HRULE:${lvl[9]}#$L9color:9
HRULE:${lvl[10]}#$L10color:10
HRULE:${lvl[11]}#$L11color:11
HRULE:${lvl[12]}#$L12color:12
HRULE:${lvl[13]}#$L13color:13
HRULE:${lvl[14]}#$L14color:14
HRULE:${lvl[15]}#$L15color:15
HRULE:${lvl[16]}#$L16color:16\\n
)
draw=(
CDEF:arealvl1=data,${lvl[2]},LT,data,UNKN,IF
CDEF:arealvl2=data,${lvl[2]},${lvl[3]},LIMIT
CDEF:arealvl3=data,${lvl[3]},${lvl[4]},LIMIT
CDEF:arealvl4=data,${lvl[4]},${lvl[5]},LIMIT
CDEF:arealvl5=data,${lvl[5]},${lvl[6]},LIMIT
CDEF:arealvl6=data,${lvl[6]},${lvl[7]},LIMIT
CDEF:arealvl7=data,${lvl[7]},${lvl[8]},LIMIT
CDEF:arealvl8=data,${lvl[8]},${lvl[9]},LIMIT
CDEF:arealvl9=data,${lvl[9]},${lvl[10]},LIMIT
CDEF:arealvl10=data,${lvl[10]},${lvl[11]},LIMIT
CDEF:arealvl11=data,${lvl[11]},${lvl[12]},LIMIT
CDEF:arealvl12=data,${lvl[12]},${lvl[13]},LIMIT
CDEF:arealvl13=data,${lvl[13]},${lvl[14]},LIMIT
CDEF:arealvl14=data,${lvl[14]},${lvl[15]},LIMIT
CDEF:arealvl15=data,${lvl[15]},${lvl[16]},LIMIT
CDEF:arealvl16=data,${lvl[16]},GE,data,UNKN,IF
AREA:arealvl1#$L1color
AREA:arealvl2#$L2color
AREA:arealvl3#$L3color
AREA:arealvl4#$L4color
AREA:arealvl5#$L5color
AREA:arealvl6#$L6color
AREA:arealvl7#$L7color
AREA:arealvl8#$L8color
AREA:arealvl9#$L9color
AREA:arealvl10#$L10color
AREA:arealvl11#$L11color
AREA:arealvl12#$L12color
AREA:arealvl13#$L13color
AREA:arealvl14#$L14color
AREA:arealvl15#$L15color
AREA:arealvl16#$L16color
)
next=(
CDEF:next=data,POP,last,${lvl[2]},LT,${lvl[2]},last,${lvl[3]},LT,${lvl[3]},last,${lvl[4]},LT,${lvl[4]},last,${lvl[5]},LT,${lvl[5]},last,${lvl[6]},LT,${lvl[6]},last,${lvl[7]},LT,${lvl[7]},last,${lvl[8]},LT,${lvl[8]},last,${lvl[9]},LT,${lvl[9]},last,${lvl[10]},LT,${lvl[10]},last,${lvl[11]},LT,${lvl[11]},last,${lvl[12]},LT,${lvl[12]},last,${lvl[13]},LT,${lvl[13]},last,${lvl[14]},LT,${lvl[14]},last,${lvl[15]},LT,${lvl[15]},last,${lvl[16]},LT,${lvl[16]},UNKN,IF,IF,IF,IF,IF,IF,IF,IF,IF,IF,IF,IF,IF,IF,IF
CDEF:nextcross=pred,next,GE,pred,UNKN,IF
VDEF:nexttime=nextcross,FIRST
'GPRINT:next:LAST:\tnext %6.2lf%s'
'GPRINT:nexttime:(%Y-%m-%d)\n:strftime'
CDEF:tickl2=pred,${lvl[2]},0.995,*,${lvl[2]},1.005,*,LIMIT
TICK:tickl2#0000FF50:1
CDEF:tickl3=pred,${lvl[3]},0.995,*,${lvl[3]},1.005,*,LIMIT
TICK:tickl3#0000FF50:1
CDEF:tickl4=pred,${lvl[4]},0.995,*,${lvl[4]},1.005,*,LIMIT
TICK:tickl4#0000FF50:1
CDEF:tickl5=pred,${lvl[5]},0.995,*,${lvl[5]},1.005,*,LIMIT
TICK:tickl5#0000FF50:1
CDEF:tickl6=pred,${lvl[6]},0.995,*,${lvl[6]},1.005,*,LIMIT
TICK:tickl6#0000FF50:1
CDEF:tickl7=pred,${lvl[7]},0.995,*,${lvl[7]},1.005,*,LIMIT
TICK:tickl7#0000FF50:1
CDEF:tickl8=pred,${lvl[8]},0.995,*,${lvl[8]},1.005,*,LIMIT
TICK:tickl8#0000FF50:1
CDEF:tickl9=pred,${lvl[9]},0.995,*,${lvl[9]},1.005,*,LIMIT
TICK:tickl9#0000FF50:1
CDEF:tickl10=pred,${lvl[10]},0.995,*,${lvl[10]},1.005,*,LIMIT
TICK:tickl10#0000FF50:1
CDEF:tickl11=pred,${lvl[11]},0.995,*,${lvl[11]},1.005,*,LIMIT
TICK:tickl11#0000FF50:1
CDEF:tickl12=pred,${lvl[12]},0.995,*,${lvl[12]},1.005,*,LIMIT
TICK:tickl12#0000FF50:1
CDEF:tickl13=pred,${lvl[13]},0.995,*,${lvl[13]},1.005,*,LIMIT
TICK:tickl13#0000FF50:1
CDEF:tickl14=pred,${lvl[14]},0.995,*,${lvl[14]},1.005,*,LIMIT
TICK:tickl14#0000FF50:1
CDEF:tickl15=pred,${lvl[15]},0.995,*,${lvl[15]},1.005,*,LIMIT
TICK:tickl15#0000FF50:1
CDEF:tickl16=pred,${lvl[16]},0.995,*,${lvl[16]},1.005,*,LIMIT
TICK:tickl16#0000FF50:1
)
elif (( bronze["$graph"] ))
then
thresholds=(
COMMENT:'Medals\:'
HRULE:${bronze["$graph"]}#A02020:${bronze["$graph"]}
HRULE:${silver["$graph"]}#808080:${silver["$graph"]}
HRULE:${gold["$graph"]}#A0A020:${gold["$graph"]}
HRULE:${platinum["$graph"]}#505050:${platinum["$graph"]}
HRULE:${black["$graph"]}#101010:${black["$graph"]}\\n
)
draw=(
CDEF:areanone=data,${bronze["$graph"]},LT,data,UNKN,IF
CDEF:areabronze=data,${bronze["$graph"]},${silver["$graph"]},LIMIT
CDEF:areasilver=data,${silver["$graph"]},${gold["$graph"]},LIMIT
CDEF:areagold=data,${gold["$graph"]},${platinum["$graph"]},LIMIT
CDEF:areaplatinum=data,${platinum["$graph"]},${black["$graph"]},LIMIT
CDEF:areablack=data,${black["$graph"]},GE,data,UNKN,IF
CDEF:tickbronze=pred,${bronze["$graph"]},0.995,*,${bronze["$graph"]},1.005,*,LIMIT
CDEF:ticksilver=pred,${silver["$graph"]},0.995,*,${silver["$graph"]},1.005,*,LIMIT
CDEF:tickgold=pred,${gold["$graph"]},0.995,*,${gold["$graph"]},1.005,*,LIMIT
CDEF:tickplatinum=pred,${platinum["$graph"]},0.995,*,${platinum["$graph"]},1.005,*,LIMIT
CDEF:tickblack=pred,${black["$graph"]},0.995,*,${black["$graph"]},1.005,*,LIMIT
TICK:tickbronze#0000FF50:1
TICK:ticksilver#0000FF50:1
TICK:tickgold#0000FF50:1
TICK:tickplatinum#0000FF50:1
TICK:tickblack#0000FF50:1
AREA:areanone#E0E0E0
AREA:areabronze#A02020
AREA:areasilver#808080
AREA:areagold#A0A020
AREA:areaplatinum#505050
AREA:areablack#101010
)
next=(
CDEF:next=data,POP,last,${bronze["$graph"]},LT,${bronze["$graph"]},last,${silver["$graph"]},LT,${silver["$graph"]},last,${gold["$graph"]},LT,${gold["$graph"]},last,${platinum["$graph"]},LT,${platinum["$graph"]},last,${black["$graph"]},LT,${black["$graph"]},UNKN,IF,IF,IF,IF,IF
CDEF:nextcross=pred,next,GE,pred,UNKN,IF
VDEF:nexttime=nextcross,FIRST
'GPRINT:next:LAST:\tnext %6.2lf%s'
'GPRINT:nexttime:(%Y-%m-%d)\n:strftime'
)
else
thresholds=()
draw=()
next=('COMMENT:\n')
fi
(( start - now > -1209600 )) && datastart=-1209600
(( end - now < 157680001 )) && dataend="+157680001"
(( datastart > 0 )) && datastart="+$datastart"
rrdtool graph - \
-a PNG \
-w $graph_width \
-v $graph \
-s $start -e $end \
DEF:data=$rrdfile:$graph:AVERAGE:step=3600${datastart+:start=$datastart}${dataend+:end=$dataend} \
DEF:fail=$rrdfile:$graph:FAILURES \
VDEF:last=data,LAST \
VDEF:intercept=data,LSLINT \
VDEF:growth=data,LSLSLOPE \
CDEF:trend=data,POP,COUNT,growth,*,intercept,+ \
CDEF:trendline=trend,0,GT,trend,UNKN,IF \
CDEF:pred=TIME,NOW,GE,trend,UNKN,IF \
LINE1:trendline#FFFF00:Trend\\t \
"${draw[@]:-AREA:data#00BD27}" \
"${thresholds[@]}" \
TICK:fail#ffffa0:1.0 \
VRULE:$now#000000 \
'GPRINT:data:MAX:%6.2lf%S' \
"${next[@]}"
fi