summaryrefslogtreecommitdiff
path: root/other/tor/bin/rrd-update
diff options
context:
space:
mode:
Diffstat (limited to 'other/tor/bin/rrd-update')
-rwxr-xr-xother/tor/bin/rrd-update59
1 files changed, 46 insertions, 13 deletions
diff --git a/other/tor/bin/rrd-update b/other/tor/bin/rrd-update
index c7062f7..30e5466 100755
--- a/other/tor/bin/rrd-update
+++ b/other/tor/bin/rrd-update
@@ -7,7 +7,7 @@ use Digest::SHA1 qw(sha1_hex);
use Time::ParseDate;
my $NOW = time;
-my $VERBOSE = 1;
+my $VERBOSE = 0;
my $RRD = '/home/weasel/www/www.noreply.org/Build/other/tor/rrd/running_Routers.rrd';
my $RRD_DIR = '/home/weasel/www/www.noreply.org/Build/other/tor/rrd/nodes';
my $INDEX_DIR = '/home/weasel/www/www.noreply.org/Build/other/tor/index';
@@ -85,15 +85,32 @@ sub get_last($) {
check_exists_running($RRD, 1);
my $last = get_last($RRD);
-opendir(DIR, $RRD_DIR) || die ("Cannot opendir $RRD_DIR: $!\n");
-my @rrdfiles = grep { /\.rrd$/ } readdir (DIR);
-closedir(DIR);
my %last_node;
-for my $rrdfile (@rrdfiles) {
- my $nodename = $rrdfile;
- $nodename =~ s/\.rrd$//;
- $last_node{$nodename} = get_last($RRD_DIR.'/'.$rrdfile);
-}
+sub fetch_last_node($) {
+ my ($hash) = @_;
+
+ my ($subdir) = $hash =~ /^([A-F0-9]{2})/;
+ die "Unknown subdir for router $hash" unless defined $subdir;
+ return unless -d $RRD_DIR.'/'.$subdir;
+ my $rrd = $RRD_DIR.'/'.$subdir.'/'.$hash.'.rrd';
+ $last_node{$hash} = get_last($rrd);
+ $rrd = $RRD_DIR.'/'.$subdir.'/TRAF-'.$hash.'.rrd';
+ $last_node{'TRAF-'.$hash} = get_last($rrd);
+};
+#opendir(DIR, $RRD_DIR) || die ("Cannot opendir $RRD_DIR: $!\n");
+#my @subdirs = grep { -d $RRD_DIR.'/'.$_ && $_ =~ /^[A-F0-9]{2}$/} readdir (DIR);
+#closedir(DIR);
+
+#for my $dir (@subdirs) {
+# opendir(DIR, $RRD_DIR.'/'.$dir) || die ("Cannot opendir $RRD_DIR/$dir: $!\n");
+# my @rrdfiles = grep { /\.rrd$/ } readdir (DIR);
+# closedir(DIR);
+# for my $rrdfile (@rrdfiles) {
+# my $nodename = $rrdfile;
+# $nodename =~ s/\.rrd$//;
+# $last_node{$nodename} = get_last($RRD_DIR.'/'.$dir.'/'.$rrdfile);
+# };
+#};
my @dirfiles;
if (scalar @ARGV) {
@@ -169,9 +186,12 @@ for my $dir (@dirfiles) {
my $current_write_history = undef;
my $current_read_history = undef;
my $current_port80 = undef;
+ my $last_was_empty = 0;
while (<DIRECTORY>) {
$linenr++;
chomp;
+ next if ($last_was_empty == 1 && /^\s*$/);
+ $last_was_empty = 0;
if (/^router\s+(\S+)\s/) {
if (!defined $current_router) {
$current_router = $1;
@@ -315,6 +335,8 @@ for my $dir (@dirfiles) {
$current_hash = undef;
$current_write_history = undef;
$current_read_history = undef;
+
+ $last_was_empty = 1
}
}
close (DIRECTORY);
@@ -367,6 +389,7 @@ for my $dir (@dirfiles) {
push @fast_verified_routers_port80, $hash if ($router_desc{$hash}->{'port80'} && $fast);
}
+ fetch_last_node($hash) unless (defined $last_node{$hash});
if (!defined $last_node{$hash} || $dir_published > $last_node{$hash}) {
push @{$updates{$hash}}, $dir_published.':'.
($router =~ /^\$/ ? '0:1' : '1:0').':'.
@@ -394,7 +417,7 @@ for my $dir (@dirfiles) {
if (defined $hist) {
# 2004-09-26 01:45:45 (900 s) 9619165,12880477,10591411...
my ($time, $interval, $values) =
- $hist =~ /(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) \((\d+) s\)\s?((?:\d+,)*\d+)?$/;
+ $hist =~ /(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) \((\d+) s\)\s?((?:-?\d+,)*-?\d+)?$/;
warn ("Could not parse history '$hist'\n"),next
unless defined $time;
my $stamp = parsedate($time);
@@ -403,11 +426,15 @@ for my $dir (@dirfiles) {
next unless defined $values;
my @values = split /,/, $values;
for my $v (@values) {
+ if ($v < 0) {
+ $v += 4294967296; # work around bug in tor, that has history as signed 32 bit integer.
+ };
$hist{$stamp}->{$inout} = $v;
$stamp -= $interval;
};
};
};
+ fetch_last_node($hash) unless (defined $last_node{'TRAF-'.$hash});
for my $stamp (sort {$a <=> $b} keys %hist) {
if (!defined $last_node{'TRAF-'.$hash} || $stamp > $last_node{'TRAF-'.$hash}) {
push @{$updates_traffic{$hash}}, $stamp.':'.
@@ -428,7 +455,9 @@ if (scalar @updateGlobal != 0) {
for my $router (keys %updates) {
next unless exists $hashes_router{$router};
- my $rrd = $RRD_DIR.'/'.$router.'.rrd';
+ my ($subdir) = substr($router,0,2);
+ mkdir($RRD_DIR.'/'.$subdir) unless -d $RRD_DIR.'/'.$subdir;
+ my $rrd = $RRD_DIR.'/'.$subdir.'/'.$router.'.rrd';
check_exists_running($rrd, 0);
RRDs::update( $rrd, @{$updates{$router}} );
my $err=RRDs::error;
@@ -441,7 +470,9 @@ for my $router (keys %updates) {
for my $router (keys %updates_traffic) {
next unless exists $hashes_router{$router};
- my $rrd = $RRD_DIR.'/TRAF-'.$router.'.rrd';
+ my ($subdir) = substr($router,0,2);
+ mkdir($RRD_DIR.'/'.$subdir) unless -d $RRD_DIR.'/'.$subdir;
+ my $rrd = $RRD_DIR.'/'.$subdir.'/TRAF-'.$router.'.rrd';
check_exists_traffic($rrd);
RRDs::update( $rrd, @{$updates_traffic{$router}} );
my $err=RRDs::error;
@@ -455,7 +486,9 @@ for my $router (keys %updates_traffic) {
for my $hash (keys %hashes_router) {
- my $f = $INDEX_DIR.'/'.$hash.".name";
+ my ($subdir) = substr($hash,0,2);
+ mkdir($INDEX_DIR.'/'.$subdir) unless -d $INDEX_DIR.'/'.$subdir;
+ my $f = $INDEX_DIR.'/'.$subdir.'/'.$hash.".name";
open(I, ">$f") or warn ("Cannot open $f: $!\n"), next;
print I $hashes_router{$hash}->{'name'},"\n";
print I $hashes_router{$hash}->{'platform'},"\n";