#!/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 . . 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 & Trend: All stats" elif (( show_graphs )) then title="IngRRD - $webuser [L$curlevel] - History & 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 $title
EOHTML if (( ! show_graphs )) then cat <<-EOHTML
EOHTML cat <<-EOHTML
EOHTML for level in {1..16} do never=0 maxtimestamp=0 tableline=() if (( last["AP"] >= lvl[level] )) then tableline+=( '' ) else #FIXME readable=$(printf "%'li" ${lvl[level]}) tableline+=( '" ) (( nextlevels[level] > maxtimestamp )) \ && maxtimestamp=${nextlevels[level]} else tableline+=( "
(maybe some day)" ) never=1 fi fi if (( silvercount >= lvlsilver[level] )) then tableline+=( '' ) else tableline+=( "' ) fi if (( goldcount >= lvlgold[level] )) then tableline+=( '' ) else tableline+=( "' ) fi if (( platinumcount >= lvlplatinum[level] )) then tableline+=( '' ) else tableline+=( "' ) fi if (( blackcount >= lvlblack[level] )) then tableline+=( '' ) else tableline+=( "' ) fi if (( level <= curlevel )) then echo "" else cat <<-EOHTML EOHTML fi echo "${tableline[@]}" if (( level > curlevel )) then cat <<-EOHTML EOHTML fi echo '' done cat <<-EOHTML
Level AP Silver Gold Platinum Black
' $(printf "%'li" ${lvl[level]}) ''"${readable// / }" ) readable=$(printf "%'li" $(( last["AP"] - lvl[level] ))) tableline+=( "
(${readable// / })" ) if (( timestamp )) then tableline+=( "
$(date +%Y-%m-%d -d @${nextlevels[level]})
'${lvlsilver[level]}'${lvlsilver[level]} ($(( silvercount - lvlsilver[level] )))
" ) 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+=( '
' ) (( ++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+=( '
' ) (( count++ )) done tableline+=( '
'${lvlgold[level]}'${lvlgold[level]} ($(( goldcount - lvlgold[level] )))
" ) 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+=( '
' ) (( ++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+=( '
' ) (( count++ )) done tableline+=( '
'${lvlplatinum[level]}'${lvlplatinum[level]} ($(( platinumcount - lvlplatinum[level] )))
" ) 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+=( '
' ) (( ++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+=( '
' ) (( count++ )) done tableline+=( '
'${lvlblack[level]}'${lvlblack[level]} ($(( blackcount - lvlblack[level] )))
" ) 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+=( '
' ) (( ++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+=( '
' ) (( count++ )) done tableline+=( '
$level
$level$(date +%Y-%m-%d -d @$maxtimestamp)
EOHTML else cat <<-EOHTML
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
Ingress $stat evolution EOHTML done fi encodeduri="${REQUEST_URI//\//%2F}" encodeduri="${encodeduri/\?/%3F}" encodeduri="${encodeduri//\=/%3D}" encodeduri="${encodeduri//\&/%26}" cat <<-EOHTML
Valid XHTML 1.1 Valid CSS! Generated by IngRRD © 2014-2015 Vincent Riquer AGPLv3
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