X-Git-Url: http://gb7djk.dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=perl%2FDXProt.pm;h=f36127915acc0db69c9fa9e2cd6f8ef5cf70a00a;hb=69c8aeb338cc485103e289fbab7ec4e7e056ed20;hp=ec49fedd3e61069b5921ab3b4e26c37603182b91;hpb=4d3067793942b3f4518615906dde50db5b76464a;p=spider.git diff --git a/perl/DXProt.pm b/perl/DXProt.pm index ec49fedd..f3612791 100644 --- a/perl/DXProt.pm +++ b/perl/DXProt.pm @@ -37,7 +37,9 @@ $last_hour = time; # last time I did an hourly periodic update sub init { my $user = DXUser->get($main::mycall); + $DXProt::myprot_version += $main::version*100; $me = DXProt->new($main::mycall, undef, $user); + $me->{here} = 1; # $me->{sort} = 'M'; # M for me } @@ -66,6 +68,7 @@ sub start $self->{outbound} = $sort eq 'O'; $self->{priv} = $user->priv; $self->{lang} = $user->lang; + $self->{isolate} = $user->{isolate}; $self->{consort} = $line; # save the connection type $self->{here} = 1; @@ -79,6 +82,7 @@ sub start } $self->state('init'); $self->pc50_t(time); + Log('DXProt', "$call connected"); } @@ -159,7 +163,7 @@ sub normal my @list; if ($field[4] eq '*') { # sysops - $target = "Sysops"; + $target = "SYSOP"; @list = map { $_->priv >= 5 ? $_ : () } get_all_users(); } elsif ($field[4] gt ' ') { # speciality list handling my ($name) = split /\./, $field[4]; @@ -203,6 +207,7 @@ sub normal last SWITCH if !$node; # ignore if havn't seen a PC19 for this one yet my $i; + for ($i = 2; $i < $#field; $i++) { my ($call, $confmode, $here) = $field[$i] =~ /^(\S+) (-) (\d)/o; next if length $call < 3; @@ -217,8 +222,9 @@ sub normal $call =~ s/-\d+$//o; # remove ssid for users my $user = DXUser->get_current($call); $user = DXUser->new($call) if !$user; - $user->node($node->call); $user->homenode($node->call) if !$user->homenode; + $user->node($node->call); + $user->lastin($main::systime); $user->put; } @@ -266,14 +272,17 @@ sub normal if (!$user) { $user = DXUser->new($call); $user->sort('A'); - $user->node($call); + $user->priv(1); # I have relented and defaulted nodes + $self->{priv} = 1; # to user RCMDs allowed $user->homenode($call); - $user->put; + $user->node($call); } + $user->lastin($main::systime); + $user->put; } # queue up any messages - DXMsg::queue_msg() if $self->state eq 'normal'; + DXMsg::queue_msg() if $self->state eq 'normal'; last SWITCH; } @@ -320,7 +329,7 @@ sub normal last SWITCH; } - if (($pcno >= 28 && $pcno <= 33) || $pcno == 40 || $pcno == 42) { # mail/file handling + if (($pcno >= 28 && $pcno <= 33) || $pcno == 40 || $pcno == 42 || $pcno == 49) { # mail/file handling DXMsg::process($self, $line); return; } @@ -329,15 +338,19 @@ sub normal if ($field[1] eq $main::mycall) { my $ref = DXUser->get_current($field[2]); Log('rcmd', 'in', $ref->{priv}, $field[2], $field[3]); - if ($ref->{priv}) { # you have to have SOME privilege, the commands have further filtering - $self->{remotecmd} = 1; # for the benefit of any command that needs to know - my @in = (DXCommandmode::run_cmd($self, $field[3])); - for (@in) { - s/\s*$//og; - $self->send(pc35($main::mycall, $field[2], "$main::mycall:$_")); - Log('rcmd', 'out', $field[2], $_); + unless ($field[3] =~ /rcmd/i) { # not allowed to relay RCMDS! + if ($ref->{priv}) { # you have to have SOME privilege, the commands have further filtering + $self->{remotecmd} = 1; # for the benefit of any command that needs to know + my @in = (DXCommandmode::run_cmd($self, $field[3])); + for (@in) { + s/\s*$//og; + $self->send(pc35($main::mycall, $field[2], "$main::mycall:$_")); + Log('rcmd', 'out', $field[2], $_); + } + delete $self->{remotecmd}; } - delete $self->{remotecmd}; + } else { + $self->send(pc35($main::mycall, $field[2], "$main::mycall:Tut tut tut...!")); } } else { route($field[1], $line); @@ -387,13 +400,9 @@ sub normal } elsif ($field[2] == 2) { $user->qth($field[3]); } elsif ($field[2] == 3) { - my ($latd, $latm, $latl, $longd, $longm, $longl) = split /\s+/, $field[3]; - $longd += ($longm/60); - $longd = 0-$longd if (uc $longl) eq 'W'; - $user->long($longd); - $latd += ($latm/60); - $latd = 0-$latd if (uc $latl) eq 'S'; - $user->lat($latd); + my ($lat, $long) = DXBearing::stoll($field[3]); + $user->lat($lat); + $user->long($long); } elsif ($field[2] == 4) { $user->homenode($field[3]); } @@ -418,9 +427,6 @@ sub normal if ($pcno == 48) { last SWITCH; } - if ($pcno == 49) { - last SWITCH; - } if ($pcno == 50) { # keep alive/user list my $ref = DXCluster->get_exact($field[1]); @@ -461,8 +467,8 @@ sub normal # REBROADCAST!!!! # - my $hops; - if (($hops) = $line =~ /H(\d+)\^\~?$/o) { + my $hops; + if (!$self->{isolate} && (($hops) = $line =~ /H(\d+)\^\~?$/o)) { my $newhops = $hops - 1; if ($newhops > 0) { $line =~ s/\^H$hops(\^\~?)$/\^H$newhops$1/; # change the hop count @@ -522,7 +528,7 @@ sub finish foreach $node (@gonenodes) { next if $node->call eq $call; - broadcast_ak1a(pc21($node->call, 'Gone'), $self); # done like this 'cos DXNodes don't have a pc21 method + broadcast_ak1a(pc21($node->call, 'Gone'), $self) unless $self->{isolate}; # done like this 'cos DXNodes don't have a pc21 method $node->del(); } @@ -531,6 +537,7 @@ sub finish # now broadcast to all other ak1a nodes that I have gone broadcast_ak1a(pc21($call, 'Gone.'), $self); + Log('DXProt', $call . " Disconnected"); $ref->del() if $ref; } @@ -543,12 +550,16 @@ sub send_local_config { my $self = shift; my $n; + my @nodes; # send our nodes - my @nodes = DXNode::get_all(); - - # create a list of all the nodes that are not connected to this connection - @nodes = grep { $_->dxchan != $self } @nodes; + if ($self->{isolate}) { + @nodes = (DXCluster->get_exact($main::mycall)); + } else { + # create a list of all the nodes that are not connected to this connection + @nodes = DXNode::get_all(); + @nodes = grep { $_->dxchan != $self } @nodes; + } $self->send($me->pc19(@nodes)); # get all the users connected on the above nodes and send them out @@ -592,7 +603,7 @@ sub broadcast_ak1a foreach $chan (@chan) { next if grep $chan == $_, @except; - $chan->send($s); # send it if it isn't the except list + $chan->send($s) unless $chan->{isolate}; # send it if it isn't the except list } } @@ -606,7 +617,8 @@ sub broadcast_users foreach $chan (@chan) { next if grep $chan == $_, @except; - $chan->send($s); # send it if it isn't the except list + $s =~ s/\a//og if !$chan->{beep}; + $chan->send($s); # send it if it isn't the except list or hasn't a passout flag } }