X-Git-Url: http://dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXMsg.pm;h=45de0f9fa3d6a5682c52d0ee412e2805aa4df076;hb=7346d1f8129457eee2e602b36e27435141533049;hp=f136b16e7b23750192b817f27055caf0592e8fef;hpb=77fd72a34c14013dcb9430408e83cb30581f7cc2;p=spider.git diff --git a/perl/DXMsg.pm b/perl/DXMsg.pm index f136b16e..45de0f9f 100644 --- a/perl/DXMsg.pm +++ b/perl/DXMsg.pm @@ -27,6 +27,13 @@ use IO::File; use Fcntl; use strict; + +use vars qw($VERSION $BRANCH); +$VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ ); +$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/ ) || 0; +$main::build += $VERSION; +$main::branch += $BRANCH; + use vars qw(%work @msg $msgdir %valid %busy $maxage $last_clean @badmsg @swop $swopfn $badmsgfn $forwardfn @forward $timeout $waittime $queueinterval $lastq $importfn $minchunk $maxchunk $bulltopriv); @@ -168,7 +175,7 @@ sub process if (exists $busy{$fromnode}) { my $ref = $busy{$fromnode}; - my $tonode = $ref->{tonode}; + my $tonode = $ref->{tonode} || "unknown"; dbg("Busy, stopping msgno: $ref->{msgno} $fromnode->$tonode") if isdbg('msg'); $ref->stop_msg($self->call); } @@ -274,8 +281,8 @@ sub process if ($ref->{subject} eq $m->{subject} && $ref->{t} == $m->{t} && $ref->{from} eq $m->{from} && $ref->{to} eq $m->{to}) { $ref->stop_msg($self->call); my $msgno = $m->{msgno}; - dbg("duplicate message from $ref->{from} -> $ref->{to} to $msgno") if isdbg('msg'); - Log('msg', "duplicate message from $ref->{from} -> $ref->{to} to $msgno"); + dbg("duplicate message from $ref->{from} -> $ref->{to} to msg: $msgno") if isdbg('msg'); + Log('msg', "duplicate message from $ref->{from} -> $ref->{to} to msg: $msgno"); return; } } @@ -284,7 +291,7 @@ sub process $ref->swop_it($self->call); # look for 'bad' to addresses - if ($ref->dump_it) { + if ($ref->dump_it($self->call)) { $ref->stop_msg($self->call); dbg("'Bad' message $ref->{to}") if isdbg('msg'); Log('msg', "'Bad' message $ref->{to}"); @@ -382,7 +389,7 @@ sub process if ($_->{from} eq $f[1] && $_->{subject} eq $f[2]) { $_->del_msg(); Log('msg', "Message $_->{msgno} from $_->{from} ($_->{subject}) fully deleted"); - DXProt::broadcast_ak1a($line, $self); + DXChannel::broadcast_nodes($line, $self); } } } @@ -580,7 +587,6 @@ sub send_tranche sub queue_msg { my $sort = shift; - my $call = shift; my $ref; my $clref; @@ -634,23 +640,26 @@ sub queue_msg dbg("Route: No dxchan for $ref->{to} " . ref($clref) ) if isdbg('msg'); } } - } - - # otherwise we are dealing with a bulletin or forwarded private message - # compare the gotit list with - # the nodelist up above, if there are sites that haven't got it yet - # then start sending it - what happens when we get loops is anyone's - # guess, use (to, from, time, subject) tuple? - foreach $dxchan (@nodelist) { - my $call = $dxchan->call; - next unless $call; - next if $call eq $main::mycall; - next if ref $ref->{gotit} && grep $_ eq $call, @{$ref->{gotit}}; - next unless $ref->forward_it($call); # check the forwarding file - - # if we are here we have a node that doesn't have this message - $ref->start_msg($dxchan) if !get_busy($call) && $dxchan->state eq 'normal'; - last; + } else { + + # otherwise we are dealing with a bulletin or forwarded private message + # compare the gotit list with + # the nodelist up above, if there are sites that haven't got it yet + # then start sending it - what happens when we get loops is anyone's + # guess, use (to, from, time, subject) tuple? + foreach $dxchan (@nodelist) { + my $call = $dxchan->call; + next unless $call; + next if $call eq $main::mycall; + next if ref $ref->{gotit} && grep $_ eq $call, @{$ref->{gotit}}; + next unless $ref->forward_it($call); # check the forwarding file + + # if we are here we have a node that doesn't have this message + if (!get_busy($call) && $dxchan->state eq 'normal') { + $ref->start_msg($dxchan); + last; + } + } } # if all the available nodes are busy then stop @@ -686,7 +695,15 @@ sub start_msg $busy{$self->{tonode}} = $self; $work{$self->{tonode}} = $self; $self->{lastt} = $main::systime; - $dxchan->send(DXProt::pc28($self->{tonode}, $self->{fromnode}, $self->{to}, $self->{from}, $self->{t}, $self->{private}, $self->{subject}, $self->{origin}, $self->{rrreq})); + my ($fromnode, $origin); + if ($dxchan->is_arcluster) { + $fromnode = $self->{origin}; + $origin = $self->{fromnode}; + } else { + $fromnode = $self->{fromnode}; + $origin = $self->{origin}; + } + $dxchan->send(DXProt::pc28($self->{tonode}, $fromnode, $self->{to}, $self->{from}, $self->{t}, $self->{private}, $self->{subject}, $origin, $self->{rrreq})); } # get the ref of a busy node @@ -777,7 +794,7 @@ sub init } # delete any messages to 'badmsg.pl' places - if ($ref->dump_it) { + if ($ref->dump_it('')) { dbg("'Bad' TO address $ref->{to}") if isdbg('msg'); Log('msg', "'Bad' TO address $ref->{to}"); $ref->del_msg; @@ -992,6 +1009,7 @@ sub forward_it sub dump_it { my $ref = shift; + my $call = shift; my $i; for ($i = 0; $i < @badmsg; $i += 3) { @@ -1007,6 +1025,7 @@ sub dump_it $tested = $ref->{from} if $field eq 'F'; $tested = $ref->{origin} if $field eq 'O'; $tested = $ref->{subject} if $field eq 'S'; + $tested = $call if $field eq 'I'; if (!$pattern || $tested =~ m{$pattern}i) { return 1; @@ -1092,7 +1111,7 @@ sub import_msgs my @msg = map { chomp; $_ } ; close(MSG); unlink($fn); - my @out = import_one($DXProt::me, \@msg, $splitit); + my @out = import_one($main::me, \@msg, $splitit); Log('msg', @out); } }