[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[or-cvs] r17700: {torstatus} Martin Mulazzani's fine work so far adding network history s (in torstatus/trunk: . web)
Author: kasimir
Date: 2008-12-19 12:22:53 -0500 (Fri, 19 Dec 2008)
New Revision: 17700
Added:
torstatus/trunk/web/history/
torstatus/trunk/web/network_history.php
Modified:
torstatus/trunk/tns_update.pl
torstatus/trunk/web/config_template.php
torstatus/trunk/web/header.php
torstatus/trunk/web/index.php
Log:
Martin Mulazzani's fine work so far adding network history support to TorStatus
Modified: torstatus/trunk/tns_update.pl
===================================================================
--- torstatus/trunk/tns_update.pl 2008-12-19 17:11:37 UTC (rev 17699)
+++ torstatus/trunk/tns_update.pl 2008-12-19 17:22:53 UTC (rev 17700)
@@ -70,7 +70,7 @@
# First the configuration file must be read
# All of the variables will be inputed into a hash for ease of use
my %config;
-open (my $config_handle, "<", "web/config.php");
+open ($config_handle, "<", "web/config.php");
while (<$config_handle>)
{
# A regular expression is going to try to pull out the configuration
@@ -112,14 +112,14 @@
my $start_time = time();
# Initiate a connection to the MySQL server
-my $dbh = DBI->connect('DBI:mysql:database='.$config{'SQL_Catalog'}.';host='.$config{'SQL_Server'},$config{'SQL_User'},$config{'SQL_Pass'}, {
+$dbh = DBI->connect('DBI:mysql:database='.$config{'SQL_Catalog'}.';host='.$config{'SQL_Server'},$config{'SQL_User'},$config{'SQL_Pass'}, {
PrintError => 0,
RaiseError => 1
}) or die "Unable to connect to MySQL server";
-my $query;
-my $dbresponse;
-my $record;
+$query;
+$dbresponse;
+$record;
# Determine if the GeoIP database should be automatically updated
if ($config{'AutomaticallyUpdateGeoIPDatbase'} eq "yes")
@@ -262,7 +262,7 @@
$dbresponse = $dbh->prepare($query);
$dbresponse->execute();
my @record = $dbresponse->fetchrow_array;
-my $descriptorTable = 1;
+$descriptorTable = 1;
if ($record[0] =~ /1/)
{
$descriptorTable = 2;
@@ -876,6 +876,221 @@
# Rename the DNSEL table so it is used
$dbh->do("RENAME TABLE DNSEL TO tmp_table, DNSEL_INACT TO DNSEL, tmp_table TO DNSEL_INACT;");
+################# TOR History #################
+
+if ($config{'TorHistory'} eq "true") {
+
+# check for RRD Files, and create it if not found
+ my $serverflagfile = $config{'TNS_Path'} . "serverflags.rrd";
+ my $servernumberfile = $config{'TNS_Path'} . "servernumbers.rrd";
+ my $graphfile = $config{'TNS_Path'} . "web/history/";
+
+# set global RRD arguments
+ @RRDargs = (
+ "--lower-limit=0",
+ "--end=now",
+ "--lazy",
+ "--height=130",
+ "--color=BACK#FFFFFF",
+ "--color=FRAME#FFF368",
+ "--color=SHADEA#FFF368",
+ "--color=SHADEB#FFF368",
+ "--color=FONT#0000BF",
+ "--color=ARROW#000000"
+ );
+
+
+ unless (-e $serverflagfile) {
+ my $err = RRDs::create(
+ $serverflagfile,
+ "--start=1199145600", # start on Jan 1, 2008
+ "--step=300", # maybe change to $config{$Cache_Expire_Time}, and heartbeat to 2times|3times expire time ???
+ "DS:run:GAUGE:900:0:U", # number of running servers
+ "DS:runExit:GAUGE:900:0:U", # number of running exits
+ "DS:runGuard:GAUGE:900:0:U", # number of guard nodes
+ "DS:runFast:GAUGE:900:0:U", # number of fast nodes
+ "RRA:AVERAGE:0.5:1:288", # every 5 minutes, for 1 day
+ "RRA:AVERAGE:0.5:12:168", # every hour, for 1 week
+ "RRA:AVERAGE:0.5:48:558", # every 4 hours, for 93 days
+ "RRA:AVERAGE:0.5:144:732", # every 12 hours, for 1 year
+ "RRA:AVERAGE:0.5:576:549" # every 48 hours, for 3 years
+ );
+ print "RRDs::create error: $err\n" if $err and $err != 1;
+ }
+
+ unless (-e $servernumberfile) {
+ my $err = RRDs::create(
+ $servernumberfile,
+ "--start=1199145600", # start on Jan 1, 2008
+ "--step=300", # maybe change to $config{$Cache_Expire_Time}, and heartbeat to 2times|3times expire time ???
+ "DS:runUS:GAUGE:900:0:U", # number of servers in: US
+ "DS:runExitUS:GAUGE:900:0:U", # US - Exit
+ "DS:runDE:GAUGE:900:0:U", # DE
+ "DS:runExitDE:GAUGE:900:0:U", # DE - Exit
+ "DS:runCN:GAUGE:900:0:U", # CN
+ "DS:runExitCN:GAUGE:900:0:U", # CN - Exit
+ "DS:runFR:GAUGE:900:0:U", # FR
+ "DS:runExitFR:GAUGE:900:0:U", # FR - Exit
+ "DS:runSE:GAUGE:900:0:U", # SE
+ "DS:runExitSE:GAUGE:900:0:U", # SE - Exit
+ "DS:runRU:GAUGE:900:0:U", # RU
+ "DS:runExitRU:GAUGE:900:0:U", # RU - Exit
+ "DS:runNL:GAUGE:900:0:U", # NL
+ "DS:runExitNL:GAUGE:900:0:U", # NL - Exit
+ "DS:runCA:GAUGE:900:0:U", # CA
+ "DS:runExitCA:GAUGE:900:0:U", # CA - Exit
+ "DS:runGB:GAUGE:900:0:U", # GB
+ "DS:runExitGB:GAUGE:900:0:U", # GB - Exit
+ "DS:runIT:GAUGE:900:0:U", # IT
+ "DS:runExitIT:GAUGE:900:0:U", # IT - Exit
+ "DS:runAT:GAUGE:900:0:U", # AT
+ "DS:runExitAT:GAUGE:900:0:U", # AT - Exit
+ # ADD OTHERS HERE ...
+ "DS:runOther:GAUGE:900:0:U", # other countries
+ "DS:runExitOther:GAUGE:900:0:U", # other countries - Exit
+ "RRA:AVERAGE:0.5:1:288", # every 5 minutes, for 1 day
+ "RRA:AVERAGE:0.5:12:168", # every hour, for 1 week
+ "RRA:AVERAGE:0.5:48:558", # every 4 hours, for 93 days
+ "RRA:AVERAGE:0.5:144:732", # every 12 hours, for 1 year
+ "RRA:AVERAGE:0.5:576:549" # every 48 hours, for 3 years
+ );
+ print "RRDs::create error: $err\n" if $err and $err != 1;
+
+ }
+
+
+
+# get the values from the database
+# serverflags.rrd
+ $query = "SELECT count( * ) FROM NetworkStatus${descriptorTable} WHERE FRunning = '1'; ";
+ $dbresponse = $dbh->prepare($query);
+ $dbresponse->execute();
+ my $run = $dbresponse->fetchrow();
+ $dbresponse->finish();
+
+ $query = "SELECT count( * ) FROM NetworkStatus${descriptorTable} WHERE FRunning = '1' AND FExit = '1' ";
+ $dbresponse = $dbh->prepare($query);
+ $dbresponse->execute();
+ my $runExit = $dbresponse->fetchrow();
+ $dbresponse->finish();
+
+ $query = "SELECT count( * ) FROM NetworkStatus${descriptorTable} WHERE FRunning = '1' AND FGuard = '1' ";
+ $dbresponse = $dbh->prepare($query);
+ $dbresponse->execute();
+ my $runGuard = $dbresponse->fetchrow();
+ $dbresponse->finish();
+
+ $query = "SELECT count( * ) FROM NetworkStatus${descriptorTable} WHERE FRunning = '1' AND FFast = '1' ";
+ $dbresponse = $dbh->prepare($query);
+ $dbresponse->execute();
+ my $runFast = $dbresponse->fetchrow();
+ $dbresponse->finish();
+
+#servernumbers.rrd
+# US
+ my $runUS = &country_query('US');
+ my $runExitUS = &country_exit_query('US');
+
+# DE
+ my $runDE = &country_query('DE');
+ my $runExitDE = &country_exit_query('DE');
+
+# CN
+ my $runCN = &country_query('CN');
+ my $runExitCN = &country_exit_query('CN');
+
+# FR
+ my $runFR = &country_query('FR');
+ my $runExitFR = &country_exit_query('FR');
+
+# SE
+ my $runSE = &country_query('SE');
+ my $runExitSE = &country_exit_query('SE');
+
+# RU
+ my $runRU = &country_query('RU');
+ my $runExitRU = &country_exit_query('RU');
+
+# NL
+ my $runNL = &country_query('NL');
+ my $runExitNL = &country_exit_query('NL');
+
+# CA
+ my $runCA = &country_query('CA');
+ my $runExitCA = &country_exit_query('CA');
+
+# GB
+ my $runGB = &country_query('GB');
+ my $runExitGB = &country_exit_query('GB');
+
+# IT
+ my $runIT = &country_query('IT');
+ my $runExitIT = &country_exit_query('IT');
+
+# AT
+ my $runAT = &country_query('AT');
+ my $runExitAT = &country_exit_query('AT');
+
+# Totals:
+ my $runOther = $run-$runUS-$runDE-$runCN-$runFR-$runSE-$runRU-$runNL-$runCA-$runGB-$runIT-$runAT;
+ my $runExitOther = $runExit-$runExitUS-$runExitDE-$runExitCN-$runExitFR-$runExitSE-$runExitRU-$runExitNL-$runExitCA-$runExitGB-$runExitIT-$runExitAT;
+
+
+# put values into RRDs
+ my $err = RRDs::update($serverflagfile, "--template", "run:runExit:runGuard:runFast", "N:".$run.":".$runExit.":".$runGuard.":".$runFast);
+ print "RRDs::update error: $err\n" if $err and $err != 1;
+
+ my $err = RRDs::update($servernumberfile, "--template", "runUS:runExitUS:runDE:runExitDE:runCN:runExitCN:runFR:runExitFR:runSE:runExitSE:runRU:runExitRU:runNL:runExitNL:runCA:runExitCA:runGB:runExitGB:runIT:runExitIT:runAT:runExitAT:runOther:runExitOther", "N:".$runUS.":".$runExitUS.":".$runDE.":".$runExitDE.":".$runCN.":".$runExitCN.":".$runFR.":".$runExitFR.":".$runSE.":".$runExitSE.":".$runRU.":".$runExitRU.":".$runNL.":".$runExitNL.":".$runCA.":".$runExitCA.":".$runGB.":".$runExitGB.":".$runIT.":".$runExitIT.":".$runAT.":".$runExitAT.":".$runOther.":".$runExitOther);
+ print "RRDs::update error: $err\n" if $err and $err != 1;
+
+
+# draw RRD graphs - running server
+ &drawHistory('Running', '6h');
+ &drawHistory('Running', '1d');
+ &drawHistory('Running', '1w');
+ &drawHistory('Running', '1m');
+ &drawHistory('Running', '3m');
+ &drawHistory('Running', '1y');
+
+# draw RRD graphs - running exit server
+ &drawHistory('Exit', '6h');
+ &drawHistory('Exit', '1d');
+ &drawHistory('Exit', '1w');
+ &drawHistory('Exit', '1m');
+ &drawHistory('Exit', '3m');
+ &drawHistory('Exit', '1y');
+
+# draw RRD graphs - running Guard Servers
+ &drawHistory('Guard', '6h');
+ &drawHistory('Guard', '1d');
+ &drawHistory('Guard', '1w');
+ &drawHistory('Guard', '1m');
+ &drawHistory('Guard', '3m');
+ &drawHistory('Guard', '1y');
+
+# draw RRD graphs - running Fast Servers
+ &drawHistory('Fast', '6h');
+ &drawHistory('Fast', '1d');
+ &drawHistory('Fast', '1w');
+ &drawHistory('Fast', '1m');
+ &drawHistory('Fast', '3m');
+ &drawHistory('Fast', '1y');
+
+# draw RRD History graphs - countries
+ &graph_multiplier('US');
+ &graph_multiplier('DE');
+ &graph_multiplier('CN');
+ &graph_multiplier('FR');
+ &graph_multiplier('SE');
+ &graph_multiplier('RU');
+ &graph_multiplier('NL');
+ &graph_multiplier('CA');
+ &graph_multiplier('GB');
+ &graph_multiplier('IT');
+ &graph_multiplier('AT');
+ &graph_multiplier('Other');
+}
+
# Close both the database connection and the Tor server connection
$dbh->disconnect();
close($torSocket);
@@ -908,6 +1123,140 @@
return $CACHE{$ip} || $ip;
}
+
+sub country_query {
+ my ($country) = @_;
+ $query = "SELECT count( * ) FROM NetworkStatus${descriptorTable} WHERE FRunning = '1' AND CountryCode = '$country' ";
+ $dbresponse = $dbh->prepare($query);
+ $dbresponse->execute();
+ my $temp = $dbresponse->fetchrow();
+ $dbresponse->finish();
+ return $temp;
+}
+
+sub country_exit_query {
+ my ($country) = @_;
+ $query = "SELECT count( * ) FROM NetworkStatus${descriptorTable} WHERE FRunning = '1' AND FExit = '1' AND CountryCode = '$country' ";
+ $dbresponse = $dbh->prepare($query);
+ $dbresponse->execute();
+ my $temp = $dbresponse->fetchrow();
+ $dbresponse->finish();
+ return $temp;
+}
+
+# Takes care of creatin the right graphs ...
+sub graph_multiplier {
+ my ($country) = @_;
+
+ &drawHistory_run($country, '6h');
+ &drawHistory_run($country, '1d');
+ &drawHistory_run($country, '1w');
+ &drawHistory_run($country, '1m');
+ &drawHistory_run($country, '3m');
+ &drawHistory_run($country, '1y');
+
+ &drawHistory_Exit_run($country, '6h');
+ &drawHistory_Exit_run($country, '1d');
+ &drawHistory_Exit_run($country, '1w');
+ &drawHistory_Exit_run($country, '1m');
+ &drawHistory_Exit_run($country, '3m');
+ &drawHistory_Exit_run($country, '1y');
+}
+
+# This draws overall Network History Graphs
+sub drawHistory {
+ my ($type, $time) = @_;
+ my $timeExt = "unknown";
+ if ($time eq '6h') {$timeExt = '6 Hours';};
+ if ($time eq '1d') {$timeExt = '24 Hours';};
+ if ($time eq '1w') {$timeExt = 'Week';};
+ if ($time eq '1m') {$timeExt = 'Month';};
+ if ($time eq '3m') {$timeExt = '3 Months';};
+ if ($time eq '1y') {$timeExt = 'Year';};
+
+ my $serverflagfile = $config{'TNS_Path'} . "serverflags.rrd";
+ my $graphfile = $config{'TNS_Path'} . "web/history/";
+
+ if ($type eq 'Running') {
+ print "DEBUG: creatin $type graph, time = $time\n";
+ RRDs::graph(
+ $graphfile . "running_" . $time . ".png",
+ "--title=Running Servers in the last " . $timeExt,
+ "--vertical-label=Number of Servers",
+ "--start=end-$time",
+ "DEF:myrun=$serverflagfile:run:AVERAGE",
+ "AREA:myrun#0000BF",
+ @RRDargs
+ );
+ }
+ else {
+ print "DEBUG: creatin $type graph, time = $time\n";
+ RRDs::graph(
+ $graphfile . "run$type" . "_" . $time . ".png",
+ "--title=Running $type Servers in the last " . $timeExt,
+ "--vertical-label=Number of $type Servers",
+ "--start=end-$time",
+ "DEF:myrun=$serverflagfile:run$type:AVERAGE",
+ "AREA:myrun#0000BF",
+ @RRDargs
+ );
+ }
+}
+
+
+# This draws custom RRD graphs for Network History
+sub drawHistory_run {
+ my ($country, $time) = @_;
+ my $timeExt = "unknown";
+ if ($time eq '6h') {$timeExt = "6 Hours";};
+ if ($time eq '1d') {$timeExt = "24 Hours";};
+ if ($time eq '1w') {$timeExt = "Week";};
+ if ($time eq '1m') {$timeExt = "Month";};
+ if ($time eq '3m') {$timeExt = "3 Months";};
+ if ($time eq '1y') {$timeExt = "Year";};
+
+ my $servernumberfile = $config{'TNS_Path'} . "servernumbers.rrd";
+ my $graphfile = $config{'TNS_Path'} . "web/history/";
+
+ RRDs::graph(
+ $graphfile . "countries/running_" . $country . "_" . $time . ".png",
+ "--title=Running $country Servers in the last " . $timeExt,
+ "--vertical-label=Number of Servers",
+ "--start=end-$time",
+ "DEF:myrun=$servernumberfile:run$country:AVERAGE",
+ "AREA:myrun#0000BF",
+ @RRDargs
+ );
+
+}
+
+# This draws custom Exit RRD graphs for Network History
+sub drawHistory_Exit_run {
+ my ($country, $time) = @_;
+ my $timeExt = "unknown";
+ if ($time eq '6h') {$timeExt = "6 Hours";};
+ if ($time eq '1d') {$timeExt = "24 Hours";};
+ if ($time eq '1w') {$timeExt = "Week";};
+ if ($time eq '1m') {$timeExt = "Month";};
+ if ($time eq '3m') {$timeExt = "3 Months";};
+ if ($time eq '1y') {$timeExt = "Year";};
+
+ my $servernumberfile = $config{'TNS_Path'} . "servernumbers.rrd";
+ my $graphfile = $config{'TNS_Path'} . "web/history/";
+
+ RRDs::graph(
+ $graphfile . "countries/runExit_" . $country . "_" . $time . ".png",
+ "--title=Running $country Exit Servers in the last " . $timeExt,
+ "--vertical-label=Number of Exit Servers",
+ "--start=end-$time",
+ "DEF:myrun=$servernumberfile:runExit$country:AVERAGE",
+ "AREA:myrun#0000BF",
+ @RRDargs
+ );
+
+}
+
+
# This updates the bandwidth history database for a given router
sub updateBandwidth {
my ($fingerprint, $write, $read, $inc, $name) = @_;
Modified: torstatus/trunk/web/config_template.php
===================================================================
--- torstatus/trunk/web/config_template.php 2008-12-19 17:11:37 UTC (rev 17699)
+++ torstatus/trunk/web/config_template.php 2008-12-19 17:22:53 UTC (rev 17700)
@@ -81,6 +81,12 @@
// }}}
+// +++++++++ Network History +++++++++ {{{
+// Comment the following line if you do not want to save Tor Network History
+$TorHistory = true;
+
+// }}}
+
// ++++++++++ Interface ++++++++++ {{{
// Set this to 0 if you wish to use JPGraph's libraries
Modified: torstatus/trunk/web/header.php
===================================================================
--- torstatus/trunk/web/header.php 2008-12-19 17:11:37 UTC (rev 17699)
+++ torstatus/trunk/web/header.php 2008-12-19 17:22:53 UTC (rev 17700)
@@ -111,7 +111,8 @@
<a class='plain' href='index.php#CustomQuery'>Advanced Query Options</a> |
<a class='plain' href='column_set.php'>Advanced Display Options</a> |
<a class='plain' href='index.php#Stats'>Network Statistic Summary</a> |
-<a class='plain' href='network_detail.php'>Network Statistic Graphs</a><br/>
+<a class='plain' href='network_detail.php'>Network Statistic Graphs</a> |
+<a class='plain' href='network_history.php'>Network History</a><br/>
<a class='plain' href='query_export.php/Tor_query_EXPORT.csv'>CSV List of Current Result Set</a> |
<a class='plain' href='ip_list_all.php/Tor_ip_list_ALL.csv'>CSV List of All Current Tor Server IP Addresses</a> |
<a class='plain' href='ip_list_exit.php/Tor_ip_list_EXIT.csv'>CSV List of All Current Tor Server Exit Node IP Addresses</a>
Modified: torstatus/trunk/web/index.php
===================================================================
--- torstatus/trunk/web/index.php 2008-12-19 17:11:37 UTC (rev 17699)
+++ torstatus/trunk/web/index.php 2008-12-19 17:22:53 UTC (rev 17700)
@@ -2235,7 +2235,8 @@
<a class='plain' href='#CustomQuery' onclick='javascript:caqoToggle = 0;toggleCAQO();'>Advanced Query Options</a> |
<a class='plain' href='column_set.php'>Advanced Display Options</a> |
<a class='plain' href='#Stats' onclick='javascript:anssToggle = 0;toggleANSS();'>Network Statistic Summary</a> |
-<a class='plain' href='network_detail.php'>Network Statistic Graphs</a><br/>
+<a class='plain' href='network_detail.php'>Network Statistic Graphs</a> |
+<a class='plain' href='network_history.php'>Network History</a><br/>
<a class='plain' href='query_export.php/Tor_query_EXPORT.csv'>CSV List of Current Result Set</a> |
<a class='plain' href='ip_list_all.php/Tor_ip_list_ALL.csv'>CSV List of All Current Tor Server IP Addresses</a> |
<a class='plain' href='ip_list_exit.php/Tor_ip_list_EXIT.csv'>CSV List of All Current Tor Server Exit Node IP Addresses</a>
Added: torstatus/trunk/web/network_history.php
===================================================================
--- torstatus/trunk/web/network_history.php (rev 0)
+++ torstatus/trunk/web/network_history.php 2008-12-19 17:22:53 UTC (rev 17700)
@@ -0,0 +1,187 @@
+<?php
+
+// See LICENSE for licensing information
+
+// Start new session
+session_start();
+
+// Include configuration settings
+include("config.php");
+
+$pageTitle = "Network History";
+include("header.php");
+
+?>
+
+<table width='100%' cellspacing='2' cellpadding='2' border='0'>
+<tr>
+
+<!-- Running Servers -->
+ <td>
+ <table class="displayTable" width='100%' cellspacing='0' cellpadding='0' align='center'>
+ <tr>
+ <td class="HRN">Running Servers</td>
+ </tr>
+ <tr>
+ <td class='TRSCN'>
+ <br/>
+ <table class="bwhistory">
+ <tr>
+ <td>
+ <img src="history/running_6h.png"; alt="Running Servers in the last 6 Hours"/>
+ </td>
+ <td>
+ <img src="history/running_1d.png"; alt="Running Servers in the last 24 Hours"/>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <img src="history/running_1w.png"; alt="Running Servers in the last Week"/>
+ </td>
+ <td>
+ <img src="history/running_1m.png"; alt="Running Servers in the last Month"/>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <img src="history/running_3m.png"; alt="Running Servers in the last 3 Months"/>
+ </td>
+ <td>
+ <img src="history/running_1y.png"; alt="Running Servers in the last Year"/>
+ </tr>
+ </table>
+ </tr>
+ </table>
+ </td>
+</tr>
+
+<!-- Running Exit Servers -->
+<tr>
+ <td>
+ <table class="displayTable" width='100%' cellspacing='0' cellpadding='0' align='center'>
+ <tr>
+ <td class="HRN">Running Exit Servers</td>
+ </tr>
+ <tr>
+ <td class='TRSCN'>
+ <br/>
+ <table class="bwhistory">
+ <tr>
+ <td>
+ <img src="history/runExit_6h.png"; alt="Running Exit Servers in the last 6 Hours"/>
+ </td>
+ <td>
+ <img src="history/runExit_1d.png"; alt="Running Exit Servers in the last 24 Hours"/>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <img src="history/runExit_1w.png"; alt="Running Exit Servers in the last Week"/>
+ </td>
+ <td>
+ <img src="history/runExit_1m.png"; alt="Running Exit Servers in the last Month"/>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <img src="history/runExit_3m.png"; alt="Running Exit Servers in the last 3 Months"/>
+ </td>
+ <td>
+ <img src="history/runExit_1y.png"; alt="Running Exit Servers in the last Year"/>
+ </td>
+ </table>
+ </tr>
+ </table>
+ </td>
+</tr>
+
+<!-- Running Guard Servers -->
+<tr>
+ <td>
+ <table class="displayTable" width='100%' cellspacing='0' cellpadding='0' align='center'>
+ <tr>
+ <td class="HRN">Running Guard Servers</td>
+ </tr>
+ <tr>
+ <td class='TRSCN'>
+ <br/>
+ <table class="bwhistory">
+ <tr>
+ <td>
+ <img src="history/runGuard_6h.png"; alt="Running Guard Servers in the last 6 Hours"/>
+ </td>
+ <td>
+ <img src="history/runGuard_1d.png"; alt="Running Guard Servers in the last 24 Hours"/>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <img src="history/runGuard_1w.png"; alt="Running Guard Servers in the last Week"/>
+ </td>
+ <td>
+ <img src="history/runGuard_1m.png"; alt="Running Guard Servers in the last Month"/>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <img src="history/runGuard_3m.png"; alt="Running Guard Servers in the last 3 Months"/>
+ </td>
+ <td>
+ <img src="history/runGuard_1y.png"; alt="Running Guard Servers in the last Year"/>
+ </td>
+ </table>
+ </tr>
+ </table>
+ </td>
+</tr>
+
+<!-- Running Fast Servers -->
+<tr>
+ <td>
+ <table class="displayTable" width='100%' cellspacing='0' cellpadding='0' align='center'>
+ <tr>
+ <td class="HRN">Running Fast Servers</td>
+ </tr>
+ <tr>
+ <td class='TRSCN'>
+ <br/>
+ <table class="bwhistory">
+ <tr>
+ <td>
+ <img src="history/runFast_6h.png"; alt="Running Fast Servers in the last 6 Hours"/>
+ </td>
+ <td>
+ <img src="history/runFast_1d.png"; alt="Running Fast Servers in the last 24 Hours"/>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <img src="history/runFast_1w.png"; alt="Running Fast Servers in the last Week"/>
+ </td>
+ <td>
+ <img src="history/runFast_1m.png"; alt="Running Fast Servers in the last Month"/>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <img src="history/runFast_3m.png"; alt="Running Fast Servers in the last 3 Months"/>
+ </td>
+ <td>
+ <img src="history/runFast_1y.png"; alt="Running Fast Servers in the last Year"/>
+ </td>
+ </table>
+ </tr>
+ </table>
+ </td>
+</tr>
+
+
+<!-- Footer -->
+ <br/>
+ <table width='70%' cellspacing='2' cellpadding='2' border='0' align='center'>
+ <tr>
+ <td class='TRC'><?php echo $footerText; ?></td>
+ </tr>
+ </table>
+</body>
+</html>