#!/bin/bash
rrdfile=ingress.rrd
graph_width=800
L1color=FFCF58
L2color=FFA52E
L3color=FF7110
L4color=E70000
L5color=FF2691
L6color=EF24CE
L7color=C221E1
L8color=9523F8
L9color=000000
L10color=000000
L11color=000000
L12color=000000
L13color=000000
L14color=000000
L15color=000000
L16color=000000
default_start=-604800
default_end=1209600
start=$default_start
end=$default_end
medals=(
Explorer
Seer
Hacker
Builder
Connector
Mind_Controller
Recharger
Liberator
Pioneer
Purifier
Guardian
)
## (0) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
lvl=( . 0 2500 20000 70000 150000 300000 600000 1200000 2400000 4000000 6000000 8400000 12000000 17000000 24000000 40000000 )
lvlsilver=( . 0 0 0 0 0 0 0 0 4 5 6 7 0 0 0 0 )
lvlgold=( . 0 0 0 0 0 0 0 0 1 2 4 6 7 0 0 0 )
lvlplatinum=( . 0 0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 )
lvlblack=( . 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 )
declare -A bronze silver gold platinum black
bronze["Explorer"]=100
silver["Explorer"]=1000
gold["Explorer"]=2000
platinum["Explorer"]=10000
black["Explorer"]=30000
bronze["Seer"]=10
silver["Seer"]=50
gold["Seer"]=200
platinum["Seer"]=500
black["Seer"]=5000
bronze["Hacker"]=2000
silver["Hacker"]=10000
gold["Hacker"]=30000
platinum["Hacker"]=100000
black["Hacker"]=200000
bronze["Builder"]=2000
silver["Builder"]=10000
gold["Builder"]=30000
platinum["Builder"]=100000
black["Builder"]=200000
bronze["Connector"]=50
silver["Connector"]=1000
gold["Connector"]=5000
platinum["Connector"]=25000
black["Connector"]=100000
bronze["Mind_Controller"]=100
silver["Mind_Controller"]=500
gold["Mind_Controller"]=2000
platinum["Mind_Controller"]=10000
black["Mind_Controller"]=40000
bronze["Recharger"]=100000
silver["Recharger"]=1000000
gold["Recharger"]=3000000
platinum["Recharger"]=10000000
black["Recharger"]=25000000
bronze["Liberator"]=100
silver["Liberator"]=1000
gold["Liberator"]=5000
platinum["Liberator"]=15000
black["Liberator"]=40000
bronze["Pioneer"]=20
silver["Pioneer"]=200
gold["Pioneer"]=1000
platinum["Pioneer"]=5000
black["Pioneer"]=20000
bronze["Purifier"]=2000
silver["Purifier"]=10000
gold["Purifier"]=30000
platinum["Purifier"]=100000
black["Purifier"]=300000
bronze["Guardian"]=3
silver["Guardian"]=10
gold["Guardian"]=20
platinum["Guardian"]=90
black["Guardian"]=150
if [ -n "$QUERY_STRING" ]
then
query_data="${QUERY_STRING//&/
}"
exprtime='[[:alnum:]-]+'
exprgraph='[[:alpha:]_]+'
while read name value
do
case $name in
start)
[[ $value =~ $exprtime ]] && start=$value
;;
end)
[[ $value =~ $exprtime ]] && end=$value
;;
graph)
[[ $value =~ $exprgraph ]] && graph=$value
;;
show)
[[ $value == all ]] && show_all=1
;;
esac
done <<<"${query_data//=/ }"
fi
(( start >= end)) && (( end = start + 604800 ))
if [ -z "$graph" ]
then
cat <<-EOHTML
content-type: application/xhtml+xml
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' -d '1 day')
refresh: 600
Cache-Control: max-age=86400, must-revalidate
IngRRD - Graph
EOHTML
if (( show_all ))
then
stats=(
AP
Explorer
Seer
XM
Hacker
Builder
Connector
Mind_Controller
MU
Longest_Link
Largest_Field
Recharger
Liberator
Pioneer
Purifier
Neutralized
Links_Destroyed
Fields_Destroyed
Walked
Guardian
Link_Maintained
Link_Length_x_Days
Field_Held
Field_x_Days
)
else
stats=(
AP
"${medals[@]}"
)
fi
for stat in "${stats[@]}"
do
cat <<-EOHTML
EOHTML
done
encodeduri="${REQUEST_URI//\//%2F}"
encodeduri="${encodeduri/\?/%3F}"
encodeduri="${encodeduri//\=/%3D}"
encodeduri="${encodeduri//\&/%26}"
cat <<-EOHTML
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
)
else
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#303030
AREA:areabronze#A02020
AREA:areasilver#808080
AREA:areagold#A0A020
AREA:areaplatinum#505050
AREA:areablack#101010
)
fi
(( start > -1209600 )) && datastart=-1209600
(( start > 0 )) && start="+$start"
(( end > 0 )) && end="+$end"
rrdtool graph - \
-a PNG \
-w $graph_width \
-v $graph \
-s $start -e $end \
DEF:data=$rrdfile:$graph:AVERAGE:step=3600${datastart+:start=$datastart} \
DEF:fail=$rrdfile:$graph:FAILURES \
VDEF:intercept=data,LSLINT \
VDEF:growth=data,LSLSLOPE \
CDEF:trend=data,POP,COUNT,growth,*,intercept,+ \
CDEF:pred=TIME,NOW,GE,trend,UNKN,IF \
LINE1:trend#FFFF00:Trend\\t \
"${draw[@]:-AREA:data#00BD27}" \
"${thresholds[@]}" \
TICK:fail#ffffa0:1.0 \
VRULE:$now#000000 \
'GPRINT:data:MIN:min %6.2lf%S' \
'GPRINT:data:AVERAGE:\tavg %6.2lf%S' \
'GPRINT:data:MAX:\tmax %6.2lf%S' \
'GPRINT:growth:\tgrowth %6.2lf%s/h\n'
fi