X-Git-Url: http://dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXProt.pm;h=48410eb2ffb50082c87320193086e67b9237dea6;hb=d7c0e5450bfc963d1adb291611dd5b3664f9069d;hp=e6f98c95197b106fd57430b0784f5c5a60144aed;hpb=6bcc8c5655882b27482f538335ba6e0083f3f3cc;p=spider.git diff --git a/perl/DXProt.pm b/perl/DXProt.pm index e6f98c95..48410eb2 100644 --- a/perl/DXProt.pm +++ b/perl/DXProt.pm @@ -34,6 +34,8 @@ use Route; use Route::Node; use Script; use Investigate; +use RouteDB; + use strict; @@ -45,8 +47,8 @@ $main::branch += $BRANCH; use vars qw($pc11_max_age $pc23_max_age $last_pc50 $eph_restime $eph_info_restime $eph_pc34_restime $last_hour $last10 %eph %pings %rcmds $ann_to_talk - $pingint $obscount %pc19list $chatdupeage - $investigation_int $pc19_version + $pingint $obscount %pc19list $chatdupeage $chatimportfn + $investigation_int $pc19_version %nodehops $baddx $badspotter $badnode $censorpc $rspfcheck $allowzero $decode_dk0wcy $send_opernam @checklist); @@ -73,6 +75,7 @@ $eph_pc34_restime = 30; $pingint = 5*60; $obscount = 2; $chatdupeage = 20 * 60 * 60; +$chatimportfn = "$main::root/chat_import"; $investigation_int = 12*60*60; # time between checks to see if we can see this node $pc19_version = 5466; # the visible version no for outgoing PC19s generated from pc59 @@ -415,6 +418,10 @@ sub handle_10 } } + # remember a route to this node and also the node on which this user is + RouteDB::update($_[6], $self->{call}); +# RouteDB::update($to, $_[6]); + # it is here and logged on $dxchan = DXChannel->get($main::myalias) if $to eq $main::mycall; $dxchan = DXChannel->get($to) unless $dxchan; @@ -435,6 +442,8 @@ sub handle_10 return; } + # can we see an interface to send it down? + # not visible here, send a message of condolence $vref = undef; $ref = Route::get($from); @@ -507,7 +516,10 @@ sub handle_11 } } - + # remember a route +# RouteDB::update($_[7], $self->{call}); +# RouteDB::update($_[6], $_[7]); + my @spot = Spot::prepare($_[1], $_[2], $d, $_[5], $_[6], $_[7]); # global spot filtering on INPUT if ($self->{inspotsfilter}) { @@ -633,12 +645,17 @@ sub handle_12 return; } + my $dxchan; if ((($dxchan = DXChannel->get($_[2])) && $dxchan->is_user) || $_[4] =~ /^[\#\w.]+$/){ $self->send_chat($line, @_[1..6]); } elsif ($_[2] eq '*' || $_[2] eq $main::mycall) { + # remember a route +# RouteDB::update($_[5], $self->{call}); +# RouteDB::update($_[1], $_[5]); + # ignore something that looks like a chat line coming in with sysop # flag - this is a kludge... if ($_[3] =~ /^\#\d+ / && $_[4] eq '*') { @@ -691,12 +708,15 @@ sub handle_16 return; } + RouteDB::update($ncall, $self->{call}); + # do we believe this call? unless ($ncall eq $self->{call} || $self->is_believed($ncall)) { if (my $ivp = Investigate::get($ncall, $self->{call})) { $ivp->store_pcxx($pcno,$line,$origin,@_); + } else { + dbg("PCPROT: We don't believe $ncall on $self->{call}") if isdbg('chanerr'); } - dbg("PCPROT: We don't believe $ncall on $self->{call}"); return; } @@ -844,12 +864,15 @@ sub handle_17 return; } + RouteDB::delete($ncall, $self->{call}); + # do we believe this call? unless ($ncall eq $self->{call} || $self->is_believed($ncall)) { if (my $ivp = Investigate::get($ncall, $self->{call})) { $ivp->store_pcxx($pcno,$line,$origin,@_); + } else { + dbg("PCPROT: We don't believe $ncall on $self->{call}") if isdbg('chanerr'); } - dbg("PCPROT: We don't believe $ncall on $self->{call}"); return; } @@ -995,6 +1018,8 @@ sub handle_19 } $user->sort('A') unless $user->is_node; + RouteDB::update($call, $self->{call}); + # do we believe this call? my $genline = "PC19^$here^$call^$conf^$ver^$_[-1]^"; unless ($call eq $self->{call} || $self->is_believed($call)) { @@ -1005,7 +1030,7 @@ sub handle_19 $ivp->here($here); $ivp->store_pcxx($pcno,$genline,$origin,'PC19',$here,$call,$conf,$ver,$_[-1]); } else { - dbg("PCPROT: We don't believe $call on $self->{call}"); + dbg("PCPROT: We don't believe $call on $self->{call}") if isdbg('chanerr'); } $user->put; next; @@ -1097,12 +1122,15 @@ sub handle_21 return; } + RouteDB::delete($call, $self->{call}); + # check if we believe this unless ($call eq $self->{call} || $self->is_believed($call)) { if (my $ivp = Investigate::get($call, $self->{call})) { $ivp->store_pcxx($pcno,$line,$origin,@_); + } else { + dbg("PCPROT: We don't believe $call on $self->{call}") if isdbg('chanerr'); } - dbg("PCPROT: We don't believe $call on $self->{call}"); return; } @@ -1471,6 +1499,9 @@ sub handle_50 my $origin = shift; my $call = $_[1]; + + RouteDB::update($call, $self->{call}); + my $node = Route::Node::get($call); if ($node) { return unless $node->call eq $self->{call}; @@ -1544,6 +1575,9 @@ sub handle_51 } } } else { + + RouteDB::update($from, $self->{call}); + if (eph_dup($line)) { dbg("PCPROT: dup PC51 detected") if isdbg('chanerr'); return; @@ -1688,6 +1722,8 @@ sub process # clean out ephemera eph_clean(); + import_chat(); + $last10 = $t; } @@ -2023,6 +2059,7 @@ sub send_local_config # # is called route(to, pcline); # + sub route { my ($self, $call, $line) = @_; @@ -2034,7 +2071,9 @@ sub route # always send it down the local interface if available my $dxchan = DXChannel->get($call); - unless ($dxchan) { + if ($dxchan) { + dbg("route: $call -> $dxchan->{call} direct" ) if isdbg('route'); + } else { my $cl = Route::get($call); $dxchan = $cl->dxchan if $cl; if (ref $dxchan) { @@ -2042,8 +2081,23 @@ sub route dbg("PCPROT: Trying to route back to source, dropped") if isdbg('chanerr'); return; } + dbg("route: $call -> $dxchan->{call} using normal route" ) if isdbg('route'); } } + + # try the backstop method + unless ($dxchan) { + my $rcall = RouteDB::get($call); + if ($rcall) { + if ($self && $rcall eq $self->{call}) { + dbg("PCPROT: Trying to route back to source, dropped") if isdbg('chanerr'); + return; + } + $dxchan = DXChannel->get($rcall); + dbg("route: $call -> $rcall using RouteDB" ) if isdbg('route') && $dxchan; + } + } + if ($dxchan) { my $routeit = adjust_hops($dxchan, $line); # adjust its hop count by node name if ($routeit) { @@ -2256,6 +2310,8 @@ sub disconnect eph_del_regex("^PC1[679].*$c"); } } + + RouteDB::delete_interface($call); # remove them from the pc19list as well while (my ($k,$v) = each %pc19list) { @@ -2455,7 +2511,7 @@ sub eph_dup $s =~ s/\^H\d\d?\^?\~?$//; $r = 1 if exists $eph{$s}; # pump up the dup if it keeps circulating $eph{$s} = $main::systime + $t; - dbg("PCPROT: emphemeral duplicate") if $r && isdbg('chan'); + dbg("PCPROT: emphemeral duplicate") if $r && isdbg('chanerr'); return $r; } @@ -2496,5 +2552,69 @@ sub run_cmd { goto &DXCommandmode::run_cmd; } + + +# import any msgs in the chat directory +# the messages are sent to the chat group which forms the +# the first part of the name (eg: solar.1243.txt would be +# sent to chat group SOLAR) +# +# Each message found is sent: one non-blank line to one chat +# message. So 4 lines = 4 chat messages. +# +# The special name LOCAL is for local users ANN +# The special name ALL is for ANN/FULL +# The special name SYSOP is for ANN/SYSOP +# +sub import_chat +{ + # are there any to do in this directory? + return unless -d $chatimportfn; + unless (opendir(DIR, $chatimportfn)) { + dbg("can\'t open $chatimportfn $!") if isdbg('msg'); + Log('msg', "can\'t open $chatimportfn $!"); + return; + } + + my @names = readdir(DIR); + closedir(DIR); + my $name; + foreach $name (@names) { + next if $name =~ /^\./; + my $splitit = $name =~ /^split/; + my $fn = "$chatimportfn/$name"; + next unless -f $fn; + unless (open(MSG, $fn)) { + dbg("can\'t open import file $fn $!") if isdbg('msg'); + Log('msg', "can\'t open import file $fn $!"); + unlink($fn); + next; + } + my @msg = map { s/\r?\n$//; $_ } ; + close(MSG); + unlink($fn); + + my @cat = split /\./, $name; + my $target = uc $cat[0]; + + foreach my $text (@msg) { + next unless $text && $text !~ /^\s*#/; + if ($target eq 'ALL' || $target eq 'LOCAL' || $target eq 'SYSOP') { + my $sysopflag = $target eq 'SYSOP' ? '*' : ' '; + if ($target ne 'LOCAL') { + send_announce($main::me, pc12($main::mycall, $text, '*', $sysopflag), $main::mycall, '*', $text, $sysopflag, $main::mycall, '0'); + } else { + Log('ann', 'LOCAL', $main::mycall, $text); + DXChannel::broadcast_list("To LOCAL de ${main::mycall}: $text\a", 'ann', undef, DXCommandmode->get_all()); + } + } else { + my $msgid = nextchatmsgid(); + $text = "#$msgid $text"; + send_chat($main::me, pc12($main::mycall, $text, '*', $target), $main::mycall, '*', $text, $target, $main::mycall, '0'); + } + } + } +} + 1; __END__