Merge remote-tracking branch 'remotes/origin/master' into prod

This commit is contained in:
Vincent Riquer 2014-11-26 11:29:49 +01:00
commit 7fc9376478
8 changed files with 506 additions and 27 deletions

16
add
View File

@ -59,12 +59,28 @@ else
exit exit
fi fi
while read ds junk
do
ds="${ds//ds[/}"
ds="${ds//]*/}"
datasets+=("$ds")
done < <(rrdtool info ingress.rrd |grep index)
for ds in ${dsnames[@]}
do
if [[ ! ${datasets[@]} =~ $ds ]]
then
cp -f ingress.rrd ingress.rrd.bak_add_$ds
./dsaddtor.pl ingress.rrd $ds GAUGE $((48*60*60)) 0 NaN
fi
done
data=N data=N
for dsname in "${dsnames[@]}" for dsname in "${dsnames[@]}"
do do
data+=:${POST["$dsname"]:=U} data+=:${POST["$dsname"]:=U}
echo "$dsname....${POST["$dsname"]}" echo "$dsname....${POST["$dsname"]}"
done done
echo ${POST["innovator"]} > .innovator
rrdtool update ingress.rrd "$data" rrdtool update ingress.rrd "$data"
if [ -n "$CACHE_DIR" ] if [ -n "$CACHE_DIR" ]

View File

@ -67,6 +67,7 @@ then
DS:Link_Length_x_Days:GAUGE:$((48*60*60)):0:NaN \ DS:Link_Length_x_Days:GAUGE:$((48*60*60)):0:NaN \
DS:Field_Held:GAUGE:$((48*60*60)):0:NaN \ DS:Field_Held:GAUGE:$((48*60*60)):0:NaN \
DS:Field_x_Days:GAUGE:$((48*60*60)):0:NaN \ DS:Field_x_Days:GAUGE:$((48*60*60)):0:NaN \
DS:Mercenary:GAUGE:$((48*60*60)):0:NaN \
RRA:HWPREDICT:8760:8e-1:8e-1:$((24)) \ RRA:HWPREDICT:8760:8e-1:8e-1:$((24)) \
RRA:AVERAGE:99e-2:1:$((24*15)) \ RRA:AVERAGE:99e-2:1:$((24*15)) \
RRA:MAX:99e-2:1:$((24*15)) \ RRA:MAX:99e-2:1:$((24*15)) \
@ -94,6 +95,62 @@ cat <<-EOHTML
<ul> <ul>
EOHTML EOHTML
case $innovator in
1)
echo "<li><input type=\"radio\" name=\"innovator\" value=\"0\" /> No Innovator medal</li>"
echo "<li><input type=\"radio\" name=\"innovator\" value=\"1\" checked=\"checked\" /> Innovator Bronze</li>"
echo "<li><input type=\"radio\" name=\"innovator\" value=\"2\" /> Innovator Silver</li>"
echo "<li><input type=\"radio\" name=\"innovator\" value=\"3\" /> Innovator Gold</li>"
echo "<li><input type=\"radio\" name=\"innovator\" value=\"4\" /> Innovator Platinum</li>"
echo "<li><input type=\"radio\" name=\"innovator\" value=\"5\" /> Innovator Onyx</li>"
;;
2)
echo "<li><input type=\"radio\" name=\"innovator\" value=\"0\" /> No Innovator medal</li>"
echo "<li><input type=\"radio\" name=\"innovator\" value=\"1\" /> Innovator Bronze</li>"
echo "<li><input type=\"radio\" name=\"innovator\" value=\"2\" checked=\"checked\" /> Innovator Silver</li>"
echo "<li><input type=\"radio\" name=\"innovator\" value=\"3\" /> Innovator Gold</li>"
echo "<li><input type=\"radio\" name=\"innovator\" value=\"4\" /> Innovator Platinum</li>"
echo "<li><input type=\"radio\" name=\"innovator\" value=\"5\" /> Innovator Onyx</li>"
;;
3)
echo "<li><input type=\"radio\" name=\"innovator\" value=\"0\" /> No Innovator medal</li>"
echo "<li><input type=\"radio\" name=\"innovator\" value=\"1\" /> Innovator Bronze</li>"
echo "<li><input type=\"radio\" name=\"innovator\" value=\"2\" /> Innovator Silver</li>"
echo "<li><input type=\"radio\" name=\"innovator\" value=\"3\" checked=\"checked\" /> Innovator Gold</li>"
echo "<li><input type=\"radio\" name=\"innovator\" value=\"4\" /> Innovator Platinum</li>"
echo "<li><input type=\"radio\" name=\"innovator\" value=\"5\" /> Innovator Onyx</li>"
;;
4)
echo "<li><input type=\"radio\" name=\"innovator\" value=\"0\" /> No Innovator medal</li>"
echo "<li><input type=\"radio\" name=\"innovator\" value=\"1\" /> Innovator Bronze</li>"
echo "<li><input type=\"radio\" name=\"innovator\" value=\"2\" /> Innovator Silver</li>"
echo "<li><input type=\"radio\" name=\"innovator\" value=\"3\" /> Innovator Gold</li>"
echo "<li><input type=\"radio\" name=\"innovator\" value=\"4\" checked=\"checked\" /> Innovator Platinum</li>"
echo "<li><input type=\"radio\" name=\"innovator\" value=\"5\" /> Innovator Onyx</li>"
;;
5)
echo "<li><input type=\"radio\" name=\"innovator\" value=\"0\" /> No Innovator medal</li>"
echo "<li><input type=\"radio\" name=\"innovator\" value=\"1\" /> Innovator Bronze</li>"
echo "<li><input type=\"radio\" name=\"innovator\" value=\"2\" /> Innovator Silver</li>"
echo "<li><input type=\"radio\" name=\"innovator\" value=\"3\" /> Innovator Gold</li>"
echo "<li><input type=\"radio\" name=\"innovator\" value=\"4\" /> Innovator Platinum</li>"
echo "<li><input type=\"radio\" name=\"innovator\" value=\"5\" checked=\"checked\" /> Innovator Onyx</li>"
;;
0)
echo "<li><input type=\"radio\" name=\"innovator\" value=\"0\" checked=\"checked\" /> No Innovator medal</li>"
echo "<li><input type=\"radio\" name=\"innovator\" value=\"1\" /> Innovator Bronze</li>"
echo "<li><input type=\"radio\" name=\"innovator\" value=\"2\" /> Innovator Silver</li>"
echo "<li><input type=\"radio\" name=\"innovator\" value=\"3\" /> Innovator Gold</li>"
echo "<li><input type=\"radio\" name=\"innovator\" value=\"4\" /> Innovator Platinum</li>"
echo "<li><input type=\"radio\" name=\"innovator\" value=\"5\" /> Innovator Onyx</li>"
;;
esac
cat <<-EOHTML
</ul>
<ul>
EOHTML
for indice in ${!uinames[@]} for indice in ${!uinames[@]}
do do
echo "<li><input type=\"text\" name=\"${dsnames[indice]}\" value=\"${last["${dsnames[indice]}"]}\" /> ${uinames[indice]}</li>" echo "<li><input type=\"text\" name=\"${dsnames[indice]}\" value=\"${last["${dsnames[indice]}"]}\" /> ${uinames[indice]}</li>"
@ -163,7 +220,23 @@ cat <<-EOHTML
</tr> </tr>
</table> </table>
</td> </td>
<td class="menu-inv">Add data</td> <td class="menu-inv">
<table class="menu">
<tr>
<td colspan="2" class="menu-inv">
<b>Add data</b>
</td>
</tr>
<tr>
<td class="submenu-inv">
<b>Add</b>
</td>
<td class="menu">
<a href="import?start=$start&amp;end=$end">Import</a>
</td>
</tr>
</table>
</td>
</tr> </tr>
</table> </table>
EOHTML EOHTML

59
dsaddtor.pl Executable file
View File

@ -0,0 +1,59 @@
#!/usr/bin/perl
# dsaddtor.pl, Program to add datasources to an existing RRD
#
# Copyright (C) 2010 R. Sandevoir remi.sandevoir(at)gmail.com
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>
use strict;
use warnings;
use RRD::Simple ();
my $rrdfile = shift || &Usage;
if ($rrdfile eq '-h') {
&Usage;
exit 0;
}
my $name = shift || &Usage;
my $type = shift || 'COUNTER';
my $heartbeat = shift || '600';
my $min = shift || 'NaN';
my $max = shift || 'NaN';
my $rrd = RRD::Simple->new(
file => $rrdfile,
rrdtool => "/usr/bin/rrdtool",
);
print "Adding DS $name on $rrdfile\n";
$rrd->add_source($rrdfile, $name => $type);
print "Heartbeat : $heartbeat\nMinimum value : $min\nMaximum value : $max\n";
RRDs::tune ($rrdfile, "-h","$name:$heartbeat");
RRDs::tune ($rrdfile, "-i","$name:$min");
RRDs::tune ($rrdfile, "-a","$name:$max");
sub Usage {
print "dsaddtor.pl <file.rrd> <ds_name> [type] [heartbeat] [rrdmin] [rrdmax]\n";
print "\t<file.rrd>\tSource RRD file\n";
print "\t<ds_name>\tDatasource name to add\n";
print "\t[type]\t\tType of datasource (i.e. COUNTER, GAUGE...). Default : COUNTER\n";
print "\t[heartbeat]\tLength of time in seconds before RRD thinks your DS is dead. Default : 600\n";
print "\t[rrdmin]\tMinimum value allowed for each datasource. Default : NaN\n";
print "\t[rrdmax]\tMax value allowed for each datasource. Default : NaN\n";
exit 0
}

252
import Executable file
View File

@ -0,0 +1,252 @@
#!/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
read_query_string
if [[ $REQUEST_METHOD == POST ]]
then
# refresh: 0,url=/cgi/$webuser/?start=${POST["start"]}&end=${POST["end"]}
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')
EOHead
if [[ $webuser == $AUTH_USER || $webuser == dev ]]
then
echo "Welcome agent $webuser"$'!\n\n'
else
echo 'Nice try!'
exit
fi
while read ds junk
do
ds="${ds//ds[/}"
ds="${ds//]*/}"
datasets+=("$ds")
done < <(rrdtool info ingress.rrd |grep index)
for ds in ${dsnames[@]}
do
if [[ ! ${datasets[@]} =~ $ds ]]
then
cp -f ingress.rrd ingress.rrd.bak_add_$ds
./dsaddtor.pl ingress.rrd $ds GAUGE $((48*60*60)) 0 NaN
fi
done
declare -A POST
exprdsname='^[[:upper:][:lower:]_]+$'
while read dsname value
do
if [[ $dsname =~ $exprdsname ]]
then
POST["$dsname"]="$value"
fi
done < <(
sed 's/&/\n/g;s/=/ /g'
)
POST["data"]="${POST["data"]//%0D%0A/
}"
POST["data"]="${POST["data"]//%3A/:}"
POST["data"]="${POST["data"]//+/ }"
echo "${POST["data"]}"
while read date hour data
do
data=$(date -d "$date $hour" +%s):${data// /:}
rrdtool update ingress.rrd "$data" 2>&1
done <<<"${POST["data"]}"
if [ -n "$CACHE_DIR" ]
then
find "$CACHE_DIR" -type f -delete
echo $'\nCache cleared!'
fi
else
cat <<-EOHTML
content-type: text/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')
<?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>IngRRD - $webuser - Import Data</title>
<link rel="stylesheet" type="text/css" href="/ingrrd.css" />
</head>
<body>
<div class="container" style="width:$(( graph_width + 97 ))px">
EOHTML
if ! [ -w "$rrdfile" ]
then
rrdtool create ingress.rrd -s $((60*60)) \
DS:AP:GAUGE:$((2*24*60*60)):0:NaN \
DS:Explorer:GAUGE:$((48*60*60)):0:NaN \
DS:Seer:GAUGE:$((48*60*60)):0:NaN \
DS:XM:GAUGE:$((48*60*60)):0:NaN \
DS:Hacker:GAUGE:$((48*60*60)):0:NaN \
DS:Builder:GAUGE:$((48*60*60)):0:NaN \
DS:Connector:GAUGE:$((48*60*60)):0:NaN \
DS:Mind_Controller:GAUGE:$((48*60*60)):0:NaN \
DS:MU:GAUGE:$((48*60*60)):0:NaN \
DS:Longest_Link:GAUGE:$((48*60*60)):0:NaN \
DS:Largest_Field:GAUGE:$((48*60*60)):0:NaN \
DS:Recharger:GAUGE:$((48*60*60)):0:NaN \
DS:Liberator:GAUGE:$((48*60*60)):0:NaN \
DS:Pioneer:GAUGE:$((48*60*60)):0:NaN \
DS:Purifier:GAUGE:$((48*60*60)):0:NaN \
DS:Neutralized:GAUGE:$((48*60*60)):0:NaN \
DS:Links_Destroyed:GAUGE:$((48*60*60)):0:NaN \
DS:Fields_Destroyed:GAUGE:$((48*60*60)):0:NaN \
DS:Walked:GAUGE:$((48*60*60)):0:NaN \
DS:Guardian:GAUGE:$((48*60*60)):0:NaN \
DS:Link_Maintained:GAUGE:$((48*60*60)):0:NaN \
DS:Link_Length_x_Days:GAUGE:$((48*60*60)):0:NaN \
DS:Field_Held:GAUGE:$((48*60*60)):0:NaN \
DS:Field_x_Days:GAUGE:$((48*60*60)):0:NaN \
DS:Mercenary:GAUGE:$((48*60*60)):0:NaN \
RRA:HWPREDICT:8760:8e-1:8e-1:$((24)) \
RRA:AVERAGE:99e-2:1:$((24*15)) \
RRA:MAX:99e-2:1:$((24*15)) \
RRA:AVERAGE:99e-2:4:$((24*180)) \
RRA:MAX:99e-2:4:$((24*180)) \
RRA:AVERAGE:99e-2:24:$(((4*365)+1)) \
RRA:MAX:99e-2:24:$(((4*365)+1)) \
RRA:AVERAGE:99e-2:$((24*30)):$(((32*365)+8)) \
RRA:MAX:99e-2:$((24*30)):$(((32*365)+8)) \
|| {
cat <<-EOHTML
<h1 style="color:red">Cannot create $rrdfile</h1>
</body>
</html>
EOHTML
exit
}
fi
readlast
medals
get_current_level
cat <<-EOHTML
<div class="main">
<p>Import data from e.g. https://www.agent-stats.com/ <br/>
<small>Expected format: <tt>YYYY-MM-DD hh:mm:ss 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
Mercenary</tt></small></p>
<form method="post" action="import">
<input type="hidden" name="start" value="$start" />
<input type="hidden" name="end" value="$end" />
<textarea name="data" rows="30" cols="110" /><br/>
<button type="submit" name="submit" value="send">Send</button>
</form>
<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 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" height="31" width="88" />
</a>
</td>
</tr>
</table>
</div>
<div class="menu">
<table style="width:$(( graph_width + 97 ))px" class="menu">
<tr>
<td class="menu"><a href="/cgi/$webuser/?start=$start&amp;end=$end">Overview</a></td>
<td class="menu">
<table class="menu-nobrd">
<tr>
<td colspan="2" class="menu-nobrd">
<a href="/cgi/$webuser/?hist&amp;start=$start&amp;end=$end">
History &amp; Trend
</a>
</td>
</tr>
<tr>
<td class="menu">
<a href="/cgi/$webuser/?hist&amp;start=$start&amp;end=$end">
Medals
</a>
</td>
<td class="menu">
<a href="/cgi/$webuser/?hist&amp;show=all&amp;start=$start&amp;end=$end">
All
</a>
</td>
</tr>
</table>
</td>
<td class="menu-inv">
<table class="menu">
<tr>
<td colspan="2" class="menu-inv">
<b>Add data</b>
</td>
</tr>
<tr>
<td
class="menu">
<a href="add.html?start=$start&amp;end=$end"><b>Add</b></a>
</td>
<td class="submenu-inv">
Import
</td>
</tr>
</table>
</td>
</tr>
</table>
EOHTML
show_current_level
cat <<-EOHTML
</div>
</div>
</body>
</html>
EOHTML
fi

61
index
View File

@ -95,7 +95,23 @@ then
</tr> </tr>
</table> </table>
</td> </td>
<td class="menu"><a href="add.html?start=$start&amp;end=$end"><b>Add data</b></a></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> </tr>
</table> </table>
EOHTML EOHTML
@ -300,7 +316,23 @@ then
cat <<-EOHTML cat <<-EOHTML
</table> </table>
</td> </td>
<td class="menu"><a href="add.html?start=$start&amp;end=$end"><b>Add data</b></a></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> </tr>
</table> </table>
EOHTML EOHTML
@ -331,30 +363,7 @@ then
if (( show_all )) if (( show_all ))
then then
stats=( stats=(
AP "${dsnames[@]}"
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 else
stats=( stats=(

View File

@ -34,3 +34,30 @@ declare \
start \ start \
end \ end \
want_ds=(
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
Mercenary
)

View File

@ -4,6 +4,47 @@ medals() {
local \ local \
stat \ stat \
if [[ -f .innovator ]]
then
innovator=$(<.innovator)
else
innovator=0
fi
if (( innovator >= 1 ))
then
(( bronzecount++ ))
bronzes+=( innovator )
else
nosilver["Innovator"]=1
fi
if (( innovator >= 2 ))
then
(( silvercount++ ))
silvers+=( innovator )
else
nobronze["Innovator"]=1
fi
if (( innovator >= 3 ))
then
(( goldcount++ ))
golds+=( innovator )
else
nogold["Innovator"]=1
fi
if (( innovator >= 4 ))
then
(( platinumcount++ ))
platinums+=( innovator )
else
noplatinum["Innovator"]=1
fi
if (( innovator == 5 ))
then
(( blackcount++ ))
blacks+=( innovator )
else
noblack["Innovator"]=1
fi
for stat in "${medals[@]}" for stat in "${medals[@]}"
do do
if (( last["$stat"] >= bronze["$stat"] )) if (( last["$stat"] >= bronze["$stat"] ))

View File

@ -60,6 +60,7 @@ uinames=(
"Max Link Length x Days" "Max Link Length x Days"
"Max Time Field Held" "Max Time Field Held"
"Largest Field MUs x Days" "Largest Field MUs x Days"
"Unique missions completed"
) )
dsnames=( dsnames=(
AP AP
@ -86,6 +87,7 @@ dsnames=(
Link_Length_x_Days Link_Length_x_Days
Field_Held Field_Held
Field_x_Days Field_x_Days
Mercenary
) )
medals=( medals=(
Explorer Explorer