summaryrefslogtreecommitdiff
path: root/Echolot/Storage
diff options
context:
space:
mode:
Diffstat (limited to 'Echolot/Storage')
-rw-r--r--Echolot/Storage/File.pm273
1 files changed, 191 insertions, 82 deletions
diff --git a/Echolot/Storage/File.pm b/Echolot/Storage/File.pm
index 61cca8e..b432a49 100644
--- a/Echolot/Storage/File.pm
+++ b/Echolot/Storage/File.pm
@@ -1,7 +1,7 @@
package Echolot::Storage::File;
# (c) 2002 Peter Palfrader <peter@palfrader.org>
-# $Id: File.pm,v 1.3 2002/06/10 06:25:04 weasel Exp $
+# $Id: File.pm,v 1.4 2002/06/11 10:01:55 weasel Exp $
#
=pod
@@ -54,8 +54,6 @@ delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};
my $METADATA_VERSION = 1;
-my $INTERNAL_COUNT = 1;
-
sub new {
my ($class, %params) = @_;
my $self = {};
@@ -113,6 +111,8 @@ sub finish($) {
};
+
+
sub metadata_open($) {
my ($self) = @_;
@@ -209,158 +209,204 @@ sub metadata_write($) {
};
+
+
+
+sub pingdata_open_one($$$$) {
+ my ($self, $remailer_addr, $type, $key) = @_;
+
+ defined ($self->{'METADATA'}->{'remailers'}->{$remailer_addr}) or
+ cluck ("$remailer_addr does not exist in Metadata"),
+ return 0;
+ defined ($self->{'METADATA'}->{'remailers'}->{$remailer_addr}->{'keys'}) or
+ cluck ("$remailer_addr has no keys in Metadata"),
+ return 0;
+ defined ($self->{'METADATA'}->{'remailers'}->{$remailer_addr}->{'keys'}->{$type}) or
+ cluck ("$remailer_addr type $type does not exist in Metadata"),
+ return 0;
+ defined ($self->{'METADATA'}->{'remailers'}->{$remailer_addr}->{'keys'}->{$type}->{$key}) or
+ cluck ("$remailer_addr type $type key $key does not exist in Metadata"),
+ return 0;
+
+
+ my $basename = $self->{'METADATA'}->{'remailers'}->{$remailer_addr}->{'stats'}->{$type}->{$key};
+ defined($basename) or
+ $basename = $self->{'METADATA'}->{'remailers'}->{$remailer_addr}->{'stats'}->{$type}->{$key} = $remailer_addr.'.'.$key.'.'.time.'.'.$PROCESS_ID.'_'.Echolot::Globals::get()->{'internalcounter'}++,
+ $self->commit();
+
+ my $filename = $self->{'datadir'} .'/'. $basename;
+
+ for my $direction ('out', 'done') {
+ my $fh = new IO::Handle;
+ if ( -e $filename.'.'.$direction ) {
+ open($fh, '+<' . $filename.'.'.$direction) or
+ cluck("Cannot open $filename.$direction for reading: $!"),
+ return 0;
+ $self->{'PING_FHS'}->{$remailer_addr}->{$type}->{$key}->{$direction} = $fh;
+ } else {
+ open($fh, '+>' . $filename.'.'.$direction) or
+ cluck("Cannot open $filename.$direction for reading: $!"),
+ return 0;
+ $self->{'PING_FHS'}->{$remailer_addr}->{$type}->{$key}->{$direction} = $fh;
+ };
+ flock($fh, LOCK_EX) or
+ cluck("Cannot get exclusive lock on $remailer_addr $type $key $direction pings: $!"),
+ return 0;
+ };
+
+ return 1;
+};
+
sub pingdata_open($) {
my ($self) = @_;
- for my $remailer_name ( keys %{$self->{'METADATA'}->{'remailers'}} ) {
- for my $key ( keys %{$self->{'METADATA'}->{'remailers'}->{$remailer_name}->{'keys'}} ) {
- my $basename = $self->{'METADATA'}->{'remailers'}->{$remailer_name}->{'stats'}->{$key};
- defined($basename) or
- $basename = $self->{'METADATA'}->{'remailers'}->{$remailer_name}->{'stats'}->{$key} = $remailer_name.'.'.$key.'.'.time.'.'.$PROCESS_ID.'_'.$INTERNAL_COUNT++,
- $self->commit();
-
- my $filename = $self->{'datadir'} .'/'. $basename;
-
- for my $type ('out', 'done') {
- my $fh = new IO::Handle;
- if ( -e $filename.'.'.$type ) {
- open($fh, '+<' . $filename.'.'.$type) or
- cluck("Cannot open $filename.$type for reading: $!"),
- return 0;
- $self->{'PING_FHS'}->{$remailer_name}->{$key}->{$type} = $fh;
- } else {
- open($fh, '+>' . $filename.'.'.$type) or
- cluck("Cannot open $filename.$type for reading: $!"),
- return 0;
- $self->{'PING_FHS'}->{$remailer_name}->{$key}->{$type} = $fh;
- };
- flock($fh, LOCK_EX) or
- cluck("Cannot get exclusive lock on $remailer_name $type pings: $!"),
- return 0;
+ for my $remailer_addr ( keys %{$self->{'METADATA'}->{'remailers'}} ) {
+ for my $type ( keys %{$self->{'METADATA'}->{'remailers'}->{$remailer_addr}->{'keys'}} ) {
+ for my $key ( keys %{$self->{'METADATA'}->{'remailers'}->{$remailer_addr}->{$type}->{'keys'}} ) {
+ $self->pingdata_open_one($remailer_addr, $type, $key);
};
};
};
return 1;
};
-sub get_pings($$$$) {
- my ($self, $remailer_name, $key, $type) = @_;
+sub get_ping_fh($$$$$) {
+ my ($self, $remailer_addr, $type, $key, $direction) = @_;
- defined ($self->{'METADATA'}->{'remailers'}->{$remailer_name}) or
- cluck ("$remailer_name does not exist in Metadata"),
+ defined ($self->{'METADATA'}->{'remailers'}->{$remailer_addr}) or
+ cluck ("$remailer_addr does not exist in Metadata"),
return 0;
my @pings;
- my $fh = $self->{'PING_FHS'}->{$remailer_name}->{$key}->{$type};
+ my $fh = $self->{'PING_FHS'}->{$remailer_addr}->{$type}->{$key}->{$direction};
defined ($fh) or
- cluck ("$remailer_name; key=$key has no assigned filehandle for $type pings"),
- return 0;
-
- seek($fh, 0, SEEK_SET) or
- cluck("Cannot seek to start of $remailer_name $type pings: $!"),
- return 0;
+ $self->pingdata_open_one($remailer_addr, $type, $key),
+ $fh = $self->{'PING_FHS'}->{$remailer_addr}->{$type}->{$key}->{$direction};
+ defined ($fh) or
+ cluck ("$remailer_addr; type=$type; key=$key has no assigned filehandle for $direction pings"),
+ return 0;
- if ($type eq 'out') {
- @pings = map {chomp; $_; } <$fh>;
- } elsif ($type eq 'done') {
- @pings = map {chomp; my @arr = split (/\s+/, $_, 2); \@arr; } <$fh>;
- } else {
- confess("What the hell am I doing here? $remailer_name; $key; $type"),
- return 0;
- };
- return \@pings;
+ return $fh;
};
sub pingdata_close() {
my ($self) = @_;
- for my $remailer_name ( keys %{$self->{'PING_FHS'}} ) {
- for my $key ( keys %{$self->{'PING_FHS'}->{$remailer_name}} ) {
- for my $type ('out', 'done') {
+ for my $remailer_addr ( keys %{$self->{'PING_FHS'}} ) {
+ for my $type ( keys %{$self->{'PING_FHS'}->{$remailer_addr}} ) {
+ for my $key ( keys %{$self->{'PING_FHS'}->{$remailer_addr}->{$type}} ) {
+ for my $direction ( keys %{$self->{'PING_FHS'}->{$remailer_addr}->{$type}->{$key}} ) {
- my $fh = $self->{'PING_FHS'}->{$remailer_name}->{$key}->{$type};
- flock($fh, LOCK_UN) or
- cluck("Error when releasing lock on $remailer_name $type pings: $!"),
- return 0;
- close ($self->{'PING_FHS'}->{$remailer_name}->{$key}->{$type}) or
- cluck("Error when closing $remailer_name $type pings: $!"),
+ my $fh = $self->{'PING_FHS'}->{$remailer_addr}->{$type}->{$key}->{$direction};
+ flock($fh, LOCK_UN) or
+ cluck("Error when releasing lock on $remailer_addr type $type key $key direction $direction pings: $!"),
return 0;
+ close ($fh) or
+ cluck("Error when closing $remailer_addr type $type key $key direction $direction pings: $!"),
+ return 0;
+ };
};
};
};
return 1;
};
+sub get_pings($$$$$) {
+ my ($self, $remailer_addr, $type, $key, $direction) = @_;
+
+ my @pings;
+
+ my $fh = $self->get_ping_fh($remailer_addr, $type, $key, $direction) or
+ cluck ("$remailer_addr; type=$type; key=$key has no assigned filehandle for $direction pings"),
+ return 0;
+
+ seek($fh, 0, SEEK_SET) or
+ cluck("Cannot seek to start of $remailer_addr type $type key $key direction $direction pings: $!"),
+ return 0;
+
+ if ($direction eq 'out') {
+ @pings = map {chomp; $_; } <$fh>;
+ } elsif ($direction eq 'done') {
+ @pings = map {chomp; my @arr = split (/\s+/, $_, 2); \@arr; } <$fh>;
+ } else {
+ confess("What the hell am I doing here? $remailer_addr; $type; $key; $direction"),
+ return 0;
+ };
+ return \@pings;
+};
+
+
sub register_pingout($$$$) {
- my ($self, $remailer_name, $key, $sent_time) = @_;
+ my ($self, $remailer_addr, $type, $key, $sent_time) = @_;
- defined ($self->{'METADATA'}->{'remailers'}->{$remailer_name}) or
- cluck ("$remailer_name does not exist in Metadata"),
- return 0;
+ #require Data::Dumper;
+ #print Data::Dumper->Dump( [ $self->{'PING_FHS'} ] );
- my $fh = $self->{'PING_FHS'}->{$remailer_name}->{$key}->{'out'};
- defined ($fh) or
- cluck ("$remailer_name; key=$key has no assigned filehandle for outgoing pings"),
+ my $fh = $self->get_ping_fh($remailer_addr, $type, $key, 'out') or
+ cluck ("$remailer_addr; type=$type; key=$key has no assigned filehandle for out pings"),
return 0;
+
seek($fh, 0, SEEK_END) or
- cluck("Cannot seek to end of $remailer_name out pings: $!"),
+ cluck("Cannot seek to end of $remailer_addr out pings: $!"),
return 0;
print($fh $sent_time."\n") or
- cluck("Error when writing to $remailer_name out pings: $!"),
+ cluck("Error when writing to $remailer_addr out pings: $!"),
return 0;
return 1;
};
sub register_pingdone($$$$$) {
- my ($self, $remailer_name, $key, $sent_time, $latency) = @_;
+ my ($self, $remailer_addr, $type, $key, $sent_time, $latency) = @_;
- defined ($self->{'METADATA'}->{'remailers'}->{$remailer_name}) or
- cluck ("$remailer_name does not exist in Metadata"),
+ defined ($self->{'METADATA'}->{'remailers'}->{$remailer_addr}) or
+ cluck ("$remailer_addr does not exist in Metadata"),
return 0;
- my $outpings = $self->get_pings($remailer_name, $key, 'out');
+ my $outpings = $self->get_pings($remailer_addr, $type, $key, 'out');
my $origlen = scalar (@$outpings);
@$outpings = grep { $_ != $sent_time } @$outpings;
($origlen == scalar (@$outpings)) and
- warn("No ping outstanding for $remailer_name, $key, $sent_time\n"),
+ warn("No ping outstanding for $remailer_addr, $key, $sent_time\n"),
return 1;
# write ping to done
- my $fh = $self->{'PING_FHS'}->{$remailer_name}->{$key}->{'done'};
- defined ($fh) or
- cluck ("$remailer_name; key=$key has no assigned filehandle for done pings"),
+ my $fh = $self->get_ping_fh($remailer_addr, $type, $key, 'done') or
+ cluck ("$remailer_addr; type=$type; key=$key has no assigned filehandle for done pings"),
return 0;
seek($fh, 0, SEEK_END) or
- cluck("Cannot seek to end of $remailer_name out pings: $!"),
+ cluck("Cannot seek to end of $remailer_addr out pings: $!"),
return 0;
print($fh $sent_time." ".$latency."\n") or
- cluck("Error when writing to $remailer_name out pings: $!"),
+ cluck("Error when writing to $remailer_addr out pings: $!"),
return 0;
# rewrite outstanding pings
- $fh = $self->{'PING_FHS'}->{$remailer_name}->{$key}->{'out'};
- defined ($fh) or
- cluck ("$remailer_name; key=$key has no assigned filehandle for out pings"),
+ $fh = $self->get_ping_fh($remailer_addr, $type, $key, 'out') or
+ cluck ("$remailer_addr; type=$type; key=$key has no assigned filehandle for out pings"),
return 0;
seek($fh, 0, SEEK_SET) or
- cluck("Cannot seek to start of outgoing pings file for remailer $remailer_name; key=$key: $!"),
+ cluck("Cannot seek to start of outgoing pings file for remailer $remailer_addr; key=$key: $!"),
return 0;
truncate($fh, 0) or
- cluck("Cannot truncate outgoing pings file for remailer $remailer_name; key=$key file to zero length: $!"),
+ cluck("Cannot truncate outgoing pings file for remailer $remailer_addr; key=$key file to zero length: $!"),
return 0;
print($fh (join "\n", @$outpings),"\n") or
- cluck("Error when writing to outgoing pings file for remailer $remailer_name; key=$key file: $!"),
+ cluck("Error when writing to outgoing pings file for remailer $remailer_addr; key=$key file: $!"),
return 0;
return 1;
};
+
+
+
+
sub add_prospective_address($$$$) {
my ($self, $addr, $reason, $additional) = @_;
@@ -482,6 +528,7 @@ sub set_key($$$$$$$$$) {
{
key => $key,
summary => $summary,
+ nick => $nick,
last_update => $timestamp
};
} else {
@@ -491,6 +538,10 @@ sub set_key($$$$$$$$$) {
return 1;
};
$keyref->{'last_update'} = $timestamp;
+ if ($keyref->{'nick'} ne $nick) {
+ warn ("$nick has a new key nick string '$nick' old: '".$keyref->{'nick'}."'\n");
+ $keyref->{'nick'} = $nick;
+ };
if ($keyref->{'summary'} ne $summary) {
warn ("$nick has a new key summary string '$summary' old: '".$keyref->{'summary'}."'\n");
$keyref->{'summary'} = $summary;
@@ -511,6 +562,64 @@ sub get_secret($) {
return $self->{'METADATA'}->{'secret'};
};
+sub get_remailers($) {
+ my ($self) = @_;
+
+ my @remailers = keys %{$self->{'METADATA'}->{'remailers'}};
+ return @remailers;
+};
+
+sub get_types($$) {
+ my ($self, $remailer) = @_;
+
+ defined ($self->{'METADATA'}->{'remailers'}->{$remailer}) or
+ cluck ("$remailer does not exist in Metadata remailer list"),
+ return 0;
+
+ return () unless defined $self->{'METADATA'}->{'remailers'}->{$remailer}->{'keys'};
+ my @types = keys %{$self->{'METADATA'}->{'remailers'}->{$remailer}->{'keys'}};
+ return @types;
+};
+
+sub get_keys($$) {
+ my ($self, $remailer, $type) = @_;
+
+ defined ($self->{'METADATA'}->{'remailers'}->{$remailer}) or
+ cluck ("$remailer does not exist in Metadata remailer list"),
+ return 0;
+
+ defined ($self->{'METADATA'}->{'remailers'}->{$remailer}->{'keys'}->{$type}) or
+ cluck ("$remailer does not have type '$type' in Metadata remailer list"),
+ return 0;
+
+ my @keys = keys %{$self->{'METADATA'}->{'remailers'}->{$remailer}->{'keys'}->{$type}};
+ return @keys;
+};
+
+sub get_key($$$$) {
+ my ($self, $remailer, $type, $key) = @_;
+
+ defined ($self->{'METADATA'}->{'remailers'}->{$remailer}) or
+ cluck ("$remailer does not exist in Metadata remailer list"),
+ return 0;
+
+ defined ($self->{'METADATA'}->{'remailers'}->{$remailer}->{'keys'}->{$type}) or
+ cluck ("$remailer does not have type '$type' in Metadata remailer list"),
+ return 0;
+
+ defined ($self->{'METADATA'}->{'remailers'}->{$remailer}->{'keys'}->{$type}->{$key}) or
+ cluck ("$remailer does not have key '$key' in type '$type' in Metadata remailer list"),
+ return 0;
+
+ my %result = (
+ summary => $self->{'METADATA'}->{'remailers'}->{$remailer}->{'keys'}->{$type}->{$key}->{'summary'},
+ key => $self->{'METADATA'}->{'remailers'}->{$remailer}->{'keys'}->{$type}->{$key}->{'key'},
+ nick => $self->{'METADATA'}->{'remailers'}->{$remailer}->{'keys'}->{$type}->{$key}->{'nick'}
+ );
+
+ return %result;
+};
+
=back
=cut