diff options
Diffstat (limited to 'other/tor/bin/rrd-update')
-rwxr-xr-x | other/tor/bin/rrd-update | 59 |
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"; |