mirror of
git://scm.dxcluster.org/scm/spider
synced 2024-09-21 07:47:10 +00:00
merged back NEW_ROUTE into trunk
This commit is contained in:
parent
ca8e84c32e
commit
6624dcdf07
72
Changes
72
Changes
@ -1,3 +1,75 @@
|
||||
02Aug01=======================================================================
|
||||
1. correct manual and help references on accept/route and reject/route. Thanks
|
||||
to ea1dav for pointing out the errors
|
||||
30Jul01=======================================================================
|
||||
1. changes to manuals to add links etc. (g0vgs)
|
||||
23Jul01=======================================================================
|
||||
1. made ann,dx spots,wwv,wcy,wx more 'object oriented'.
|
||||
2. allow for 'enhanced clients' and tell them what sort of thing is being
|
||||
sent.
|
||||
3. Allow debug info to be sent via interface to an enhanced client.
|
||||
21Jul01=======================================================================
|
||||
1. started a gtkconsole program. It appears to sort of work. Requires Gtk-
|
||||
Perl-0.7007.
|
||||
2. start doing some spot statistical stuff.
|
||||
19Jul01=======================================================================
|
||||
1. changes to Admin Manual to reflect route filtering. Some alterations to
|
||||
the help files (g0vgs)
|
||||
09Jul01=======================================================================
|
||||
1. fix cron so that it allows stuff to be executed on the hour (ie min=0)
|
||||
06Jul01=======================================================================
|
||||
1. fix talk and routing problems to mycall
|
||||
2. add unset/privilege command to relinquish any sysop privileges you might
|
||||
have for the current session.
|
||||
05Jul01=======================================================================
|
||||
1. disconnect channels whose route node has disappeared
|
||||
29Jun01=======================================================================
|
||||
1. fix merge command
|
||||
28Jun01=======================================================================
|
||||
1. fix problems with users on more than one node
|
||||
27Jun01=======================================================================
|
||||
1. try adding an ARC mail hack
|
||||
2. slug the not here messages so they can't loopback
|
||||
25Jun01=======================================================================
|
||||
1. added automatic 'not here' message
|
||||
21Jun01=======================================================================
|
||||
1. fix (some) problems with 'init'
|
||||
2. fix stat/msg a bit more
|
||||
3. small change to PC28 generation to make sure that the subject always
|
||||
contains at least a blank
|
||||
16Jun01=======================================================================
|
||||
1. fix talk
|
||||
2. fix stat/msg
|
||||
14Jun01=======================================================================
|
||||
1. changed debug api to (potentially) use less cpu time
|
||||
2. changed the spider.cgi in Arnold's borrowed java client to Ian's perl
|
||||
script
|
||||
3. Added input route filtering
|
||||
4. put back the set/isolate logic into routing which is now overridable with
|
||||
filters whcih means a default filter is no longer generated. If you want the
|
||||
OLD behaviour, do rm /spider/filter/route/*.pl*, restart and try again.
|
||||
5. Add http_proxy to Internet.pm and allow sh/qrz to use an HTTP Proxy
|
||||
13Jun01=======================================================================
|
||||
1. fix init cnd rinit cmds
|
||||
2. add missing clear/route cmd
|
||||
10Jun01=======================================================================
|
||||
1. fix set/here and unset/here
|
||||
2. fix indirect routing to users two hops away
|
||||
09Jun01=======================================================================
|
||||
1. more fixes
|
||||
2. add set/debug filter so that you can see why your filters aren't working
|
||||
(for sysops only)
|
||||
3. add ephemera deduping for all those PC41,24,50 etc etc broadcasts
|
||||
4. Fix a problem with the connect text being sent on outgoing connections
|
||||
(this confuses db0fhf amongst other things)
|
||||
5. catch deep recursion bugs before you run out of memory.
|
||||
6. Make sure that PC16|17|19|21 update as well as add and delete
|
||||
7. local announces by the sysop will always be displayed
|
||||
08Jun01=======================================================================
|
||||
1. first cut with new routing code. Created NEW_ROUTE branch
|
||||
2. added acc/route and rej/route commands
|
||||
3. added stat/route_node and stat/route_user commands to look at the routing
|
||||
table entities
|
||||
07Jun01=======================================================================
|
||||
1. move userconfig.pl and nodeconfig.pl to stat/
|
||||
2. fix problem with locally connected users not being removed from the
|
||||
|
@ -55,6 +55,34 @@ default for nodes and users eg:-
|
||||
accept/ann input node_default by G,M,2
|
||||
accept/ann user_default by G,M,2
|
||||
|
||||
=== 8^ACCEPT/ROUTE <call> [0-9] <pattern>^Set an 'accept' filter line for routing
|
||||
Create an 'accept this routing PC Protocol' line for a filter.
|
||||
|
||||
An accept filter line means that if a PC16/17/19/21/24/41/50 matches this filter
|
||||
it is passed thru that interface. See HELP FILTERING for more info. Please read this
|
||||
to understand how filters work - it will save a lot of grief later on.
|
||||
|
||||
You can use any of the following things in this line:-
|
||||
|
||||
call <prefixes> the callsign of the thingy
|
||||
call_dxcc <numbers> eg: 61,62 (from eg: sh/pre G)
|
||||
call_itu <numbers>
|
||||
call_zone <numbers>
|
||||
origin <prefixes> really the interface it came in on
|
||||
origin_dxcc <numbers> eg: 61,62 (from eg: sh/pre G)
|
||||
origin_itu <numbers>
|
||||
origin_zone <numbers>
|
||||
|
||||
some examples:-
|
||||
|
||||
acc/route gb7djk call_dxcc 61,38 (send only UK+EIRE nodes)
|
||||
acc/route gb7djk call gb7djk (equiv to SET/ISOLATE)
|
||||
|
||||
You can use the tag 'all' to accept everything eg:
|
||||
|
||||
acc/route all
|
||||
|
||||
|
||||
=== 0^ACCEPT/SPOTS [0-9] <pattern>^Set an 'accept' filter line for spots
|
||||
Create an 'accept this spot' line for a filter.
|
||||
|
||||
@ -95,6 +123,7 @@ You can use the tag 'all' to accept everything, eg:
|
||||
|
||||
but this probably for advanced users...
|
||||
|
||||
|
||||
=== 8^ACCEPT/SPOTS <call> [input] [0-9] <pattern>^Spot filter sysop version
|
||||
This version allows a sysop to set a filter for a callsign as well as the
|
||||
default for nodes and users eg:-
|
||||
@ -815,6 +844,32 @@ You can use the tag 'all' to reject everything eg:
|
||||
|
||||
but this probably for advanced users...
|
||||
|
||||
=== 8^REJECT/ROUTE <call> [0-9] <pattern>^Set an 'reject' filter line for routing
|
||||
Create an 'reject this routing PC Protocol' line for a filter.
|
||||
|
||||
An reject filter line means that if a PC16/17/19/21/24/41/50 matches this filter
|
||||
it is NOT passed thru that interface. See HELP FILTERING for more info. Please
|
||||
read this to understand how filters work - it will save a lot of grief later on.
|
||||
|
||||
You can use any of the following things in this line:-
|
||||
|
||||
call <prefixes> the callsign of the thingy
|
||||
call_dxcc <numbers> eg: 61,62 (from eg: sh/pre G)
|
||||
call_itu <numbers>
|
||||
call_zone <numbers>
|
||||
origin <prefixes> really the interface it came in on
|
||||
origin_dxcc <numbers> eg: 61,62 (from eg: sh/pre G)
|
||||
origin_itu <numbers>
|
||||
origin_zone <numbers>
|
||||
|
||||
some examples:-
|
||||
|
||||
rej/route gb7djk call_dxcc 61,38 (everything except UK+EIRE nodes)
|
||||
|
||||
You can use the tag 'all' to reject everything eg:
|
||||
|
||||
rej/route all (equiv to [very] restricted mode)
|
||||
|
||||
=== 8^REJECT/SPOTS <call> [input] [0-9] <pattern>^Spot filter sysop version
|
||||
This version allows a sysop to set a filter for a callsign as well as the
|
||||
default for nodes and users eg:-
|
||||
@ -1151,6 +1206,12 @@ to commands are as default:-
|
||||
If you are a sysop and you come in as a normal user on a remote connection
|
||||
your privilege will automatically be set to 0.
|
||||
|
||||
=== 0^UNSET/PRIVILEGE^Remove any privilege for this session
|
||||
You can use this command to 'protect' this session from unauthorised
|
||||
use. If you want to get your normal privilege back you will need to
|
||||
either logout and login again (if you are on a console) or use the
|
||||
SYSOP command.
|
||||
|
||||
=== 9^SET/PASSWORD <callsign> <string>^Set a users password
|
||||
The password for a user can only be set by a full sysop. The string
|
||||
can contain any characters but any spaces are removed (you can type in
|
||||
|
37
cmd/clear/route.pl
Normal file
37
cmd/clear/route.pl
Normal file
@ -0,0 +1,37 @@
|
||||
#
|
||||
# clear filters commands
|
||||
#
|
||||
# Copyright (c) 2000 Dirk Koopman G1TLH
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
my ($self, $line) = @_;
|
||||
my @f = split /\s+/, $line;
|
||||
my @out;
|
||||
my $dxchan = $self;
|
||||
my $sort = 'route';
|
||||
my $flag;
|
||||
my $fno = 1;
|
||||
my $call = $dxchan->call;
|
||||
|
||||
my $f = lc shift @f if @f;
|
||||
if ($self->priv >= 8) {
|
||||
if (is_callsign(uc $f)) {
|
||||
my $uref = DXUser->get(uc $f);
|
||||
$call = $uref->call if $uref;
|
||||
}
|
||||
if (@f) {
|
||||
$f = lc shift @f;
|
||||
if ($f eq 'input') {
|
||||
$flag = 'in';
|
||||
$f = shift @f if @f;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$fno = $f if $f;
|
||||
my $filter = Filter::read_in($sort, $call, $flag);
|
||||
Filter::delete($sort, $call, $flag, $fno);
|
||||
$flag = $flag ? "input " : "";
|
||||
push @out, $self->msg('filter4', $flag, $sort, $fno, $call);
|
||||
return (1, @out);
|
@ -6,3 +6,5 @@
|
||||
# for doing connections and things
|
||||
#
|
||||
1 0 * * 0 DXUser::export("$main::data/user_asc")
|
||||
0 3 * * * Spot::daily()
|
||||
|
||||
|
@ -24,7 +24,7 @@ foreach $n (@db) {
|
||||
if ($db->remote) {
|
||||
|
||||
# remote databases
|
||||
unless (DXCluster->get_exact($db->remote) || DXChannel->get($db->remote)) {
|
||||
unless (Route::Node::get($db->remote) || DXChannel->get($db->remote)) {
|
||||
push @out, $self->msg('db4', uc $name, $db->remote);
|
||||
last;
|
||||
}
|
||||
|
@ -26,12 +26,12 @@ foreach $call (@calls) {
|
||||
} elsif (my $conn = Msg->conns($call)) {
|
||||
$conn->disconnect;
|
||||
push @out, $self->msg('disc3', $call);
|
||||
} elsif (my $ref = DXCluster->get_exact($call)) {
|
||||
my $dxchancall = $ref->dxchancall;
|
||||
if ($dxchancall eq $main::mycall || !DXChannel->get($dxchancall)) {
|
||||
$ref->del;
|
||||
push @out, $self->msg('disc4', $call);
|
||||
}
|
||||
# } elsif (my $ref = DXCluster->get_exact($call)) {
|
||||
# my $dxchancall = $ref->dxchancall;
|
||||
# if ($dxchancall eq $main::mycall || !DXChannel->get($dxchancall)) {
|
||||
# $ref->del;
|
||||
# push @out, $self->msg('disc4', $call);
|
||||
# }
|
||||
} else {
|
||||
push @out, $self->msg('e10', $call);
|
||||
}
|
||||
|
@ -25,7 +25,7 @@ return (1, $self->msg('read2', $msgno)) unless $ref;
|
||||
if (-e $fn) {
|
||||
my $m = $self->msg('e16', $fn);
|
||||
Log('msg', $self->call . " tried to export $m");
|
||||
dbg('msg', $m);
|
||||
dbg($m) if isdbg('msg');
|
||||
return (1, $m);
|
||||
}
|
||||
|
||||
|
@ -30,10 +30,26 @@ foreach $call (@f) {
|
||||
my $long = $ref->long;
|
||||
my $node = $ref->homenode;
|
||||
my $latlong = DXBearing::lltos($lat, $long) if $lat && $long;
|
||||
DXProt::broadcast_all_ak1a(DXProt::pc41($call, 1, $name), $DXProt::me) if $name;
|
||||
DXProt::broadcast_all_ak1a(DXProt::pc41($call, 2, $qth), $DXProt::me) if $qth;
|
||||
DXProt::broadcast_all_ak1a(DXProt::pc41($call, 3, $latlong), $DXProt::me) if $latlong;
|
||||
DXProt::broadcast_all_ak1a(DXProt::pc41($call, 4, $node), $DXProt::me) if $node;
|
||||
if ($name) {
|
||||
my $l = DXProt::pc41($DXProt::me, $call, 1, $name);
|
||||
DXProt::eph_dup($l);
|
||||
DXProt::broadcast_all_ak1a($l, $DXProt::me) ;
|
||||
}
|
||||
if ($qth) {
|
||||
my $l = DXProt::pc41($call, 2, $qth);
|
||||
DXProt::eph_dup($l);
|
||||
DXProt::broadcast_all_ak1a($l, $DXProt::me) ;
|
||||
}
|
||||
if ($latlong) {
|
||||
my $l = DXProt::pc41($call, 3, $latlong);
|
||||
DXProt::eph_dup($l);
|
||||
DXProt::broadcast_all_ak1a($l, $DXProt::me) ;
|
||||
}
|
||||
if ($node) {
|
||||
my $l = DXProt::pc41($call, 4, $node);
|
||||
DXProt::eph_dup($l);
|
||||
DXProt::broadcast_all_ak1a($l, $DXProt::me) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
12
cmd/init.pl
12
cmd/init.pl
@ -18,16 +18,10 @@ foreach $call (@calls) {
|
||||
my $dxchan = DXChannel->get($call);
|
||||
if ($dxchan) {
|
||||
if ($dxchan->is_node) {
|
||||
|
||||
# first clear out any nodes on this dxchannel
|
||||
my @gonenodes = grep { $_->dxchan == $dxchan } DXNode::get_all();
|
||||
foreach my $node (@gonenodes) {
|
||||
next if $node->dxchan == $DXProt::me;
|
||||
next unless $node->dxchan == $dxchan;
|
||||
DXProt::broadcast_ak1a(DXProt::pc21($node->call, 'Gone, re-init') , $dxchan) unless $dxchan->{isolate};
|
||||
$node->del();
|
||||
}
|
||||
# $dxchan->send(DXProt::pc38());
|
||||
my $parent = Route::Node::get($call);
|
||||
my @rout = $parent->del_nodes;
|
||||
$dxchan->route_pc21($self, @rout) if @rout;
|
||||
$dxchan->send(DXProt::pc18());
|
||||
$dxchan->state('init');
|
||||
push @out, $self->msg('init1', $call);
|
||||
|
@ -16,10 +16,9 @@ return (1, $self->msg('e12')) if !$f[0];
|
||||
my $call = uc $f[0];
|
||||
return (1, $self->msg('e11')) if $call eq $main::mycall;
|
||||
|
||||
my $ref = DXCluster->get_exact($call);
|
||||
my $ref = Route::Node::get($call);
|
||||
my $dxchan = $ref->dxchan if $ref;
|
||||
return (1, $self->msg('e10', $call)) unless $ref;
|
||||
return (1, $self->msg('e13', $call)) unless $ref->isa('DXNode');
|
||||
|
||||
|
||||
my ($spots, $wwv) = $f[1] =~ m{(\d+)/(\d+)} if $f[1];
|
||||
|
@ -20,8 +20,7 @@ return (1, $self->msg('e6')) if !$call;
|
||||
return (1, $self->msg('pinge1')) if $call eq $main::mycall;
|
||||
|
||||
# can we see it? Is it a node?
|
||||
my $noderef = DXCluster->get_exact($call);
|
||||
$noderef = DXChannel->get($call) unless $noderef;
|
||||
my $noderef = Route::Node::get($call);
|
||||
|
||||
return (1, $self->msg('e7', $call)) unless $noderef;
|
||||
|
||||
|
@ -22,11 +22,7 @@ $line =~ s/^\s*$call\s+//;
|
||||
|
||||
# can we see it? Is it a node?
|
||||
$call = uc $call;
|
||||
my $noderef = DXCluster->get_exact($call);
|
||||
unless ($noderef) {
|
||||
$noderef = DXChannel->get($call);
|
||||
$noderef = undef unless $noderef && $noderef->is_node;
|
||||
}
|
||||
my $noderef = Route::Node::get($call);
|
||||
return (1, $self->msg('e7', $call)) unless $noderef;
|
||||
|
||||
# rcmd it
|
||||
|
14
cmd/rinit.pl
14
cmd/rinit.pl
@ -18,18 +18,10 @@ foreach $call (@calls) {
|
||||
my $dxchan = DXChannel->get($call);
|
||||
if ($dxchan) {
|
||||
if ($dxchan->is_node) {
|
||||
|
||||
# first clear out any nodes on this dxchannel
|
||||
my @gonenodes = grep { $_->dxchan == $dxchan } DXNode::get_all();
|
||||
foreach my $node (@gonenodes) {
|
||||
next if $node->dxchan == $DXProt::me;
|
||||
next unless $node->dxchan == $dxchan;
|
||||
DXProt::broadcast_ak1a(DXProt::pc21($node->call, 'Gone, re-init') , $dxchan) unless $dxchan->{isolate};
|
||||
$node->del();
|
||||
}
|
||||
# $dxchan->send(DXProt::pc38());
|
||||
$dxchan->send(DXProt::pc20());
|
||||
my $parent = Route::Node::get($call);
|
||||
$dxchan->state('init');
|
||||
$dxchan->send_local_config;
|
||||
$dxchan->send(DXProt::pc20());
|
||||
push @out, $self->msg('init1', $call);
|
||||
}
|
||||
} else {
|
||||
|
@ -14,17 +14,22 @@ my @out;
|
||||
@args = $self->call if (!@args || $self->priv < 9);
|
||||
|
||||
foreach $call (@args) {
|
||||
$call = uc $call;
|
||||
my $dxchan = DXChannel->get($call);
|
||||
my $ref = DXCluster->get_exact($call);
|
||||
if ($dxchan && $ref) {
|
||||
$dxchan->here(1);
|
||||
$ref->here(1);
|
||||
DXProt::broadcast_all_ak1a(DXProt::pc24($ref), $DXProt::me);
|
||||
push @out, $self->msg('heres', $call);
|
||||
} else {
|
||||
push @out, $self->msg('e3', "Set Here", $call);
|
||||
}
|
||||
$call = uc $call;
|
||||
my $dxchan = DXChannel->get($call);
|
||||
if ($dxchan) {
|
||||
$dxchan->here(1);
|
||||
push @out, $self->msg('heres', $call);
|
||||
my $ref = Route::User::get($call);
|
||||
$ref = Route::Node::get($call) unless $ref;
|
||||
if ($ref) {
|
||||
$ref->here(1);
|
||||
my $s = DXProt::pc24($ref);
|
||||
DXProt::eph_dup($s);
|
||||
DXProt::broadcast_all_ak1a($s, $DXProt::me) ;
|
||||
}
|
||||
} else {
|
||||
push @out, $self->msg('e3', "Set Here", $call);
|
||||
}
|
||||
}
|
||||
|
||||
return (1, @out);
|
||||
|
@ -22,7 +22,9 @@ if ($user) {
|
||||
$line = uc $line;
|
||||
$user->homenode($line);
|
||||
$user->put();
|
||||
DXProt::broadcast_all_ak1a(DXProt::pc41($call, 4, $line), $DXProt::me);
|
||||
my $s = DXProt::pc41($call, 4, $line);
|
||||
DXProt::eph_dup($s);
|
||||
DXProt::broadcast_all_ak1a($s, $DXProt::me) ;
|
||||
return (1, $self->msg('hnode', $line));
|
||||
} else {
|
||||
return (1, $self->msg('namee2', $call));
|
||||
|
@ -24,7 +24,9 @@ if ($user) {
|
||||
my ($lat, $long) = DXBearing::stoll($line);
|
||||
$user->lat($lat);
|
||||
$user->long($long);
|
||||
DXProt::broadcast_all_ak1a(DXProt::pc41($call, 3, $line), $DXProt::me);
|
||||
my $s = DXProt::pc41($call, 3, $line);
|
||||
DXProt::eph_dup($s);
|
||||
DXProt::broadcast_all_ak1a($s, $DXProt::me) ;
|
||||
unless ($user->qra && DXBearing::is_qra($user->qra) ) {
|
||||
my $qra = DXBearing::lltoqra($lat, $long);
|
||||
$user->qra($qra);
|
||||
|
@ -21,7 +21,9 @@ $user = DXUser->get_current($call);
|
||||
if ($user) {
|
||||
$user->name($line);
|
||||
$user->put();
|
||||
DXProt::broadcast_all_ak1a(DXProt::pc41($call, 1, $line), $DXProt::me);
|
||||
my $s = DXProt::pc41($call, 1, $line);
|
||||
DXProt::eph_dup($s);
|
||||
DXProt::broadcast_all_ak1a($s, $DXProt::me) ;
|
||||
return (1, $self->msg('name', $line));
|
||||
} else {
|
||||
return (1, $self->msg('namee2', $call));
|
||||
|
@ -26,7 +26,9 @@ if ($user) {
|
||||
$user->lat($lat);
|
||||
$user->long($long);
|
||||
my $s = DXBearing::lltos($lat, $long);
|
||||
DXProt::broadcast_all_ak1a(DXProt::pc41($call, 3, $s), $DXProt::me);
|
||||
my $l = DXProt::pc41($call, 3, $s);
|
||||
DXProt::eph_dup($l);
|
||||
DXProt::broadcast_all_ak1a($l, $DXProt::me) ;
|
||||
}
|
||||
|
||||
$user->put();
|
||||
|
@ -21,7 +21,9 @@ $user = DXUser->get_current($call);
|
||||
if ($user) {
|
||||
$user->qth($line);
|
||||
$user->put();
|
||||
DXProt::broadcast_all_ak1a(DXProt::pc41($call, 2, $line), $DXProt::me);
|
||||
my $s = DXProt::pc41($call, 2, $line);
|
||||
DXProt::eph_dup($s);
|
||||
DXProt::broadcast_all_ak1a($s, $DXProt::me) ;
|
||||
return (1, $self->msg('qth', $line));
|
||||
} else {
|
||||
return (1, $self->msg('namee2', $call));
|
||||
|
12
cmd/set/send_dbg.pl
Normal file
12
cmd/set/send_dbg.pl
Normal file
@ -0,0 +1,12 @@
|
||||
#
|
||||
# send debug information to this connection
|
||||
#
|
||||
# Copyright (c) 2001 - Dirk Koopman
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
my ($self, $line) = @_;
|
||||
return (1, $self->msg('e5')) if $self->priv < 8;
|
||||
$self->senddbg(1);
|
||||
return (1, $self->msg('done'));
|
@ -1,4 +1,4 @@
|
||||
#
|
||||
# show some statistics
|
||||
#
|
||||
return (1, DXCluster::cluster() );
|
||||
return (1, Route::cluster() );
|
||||
|
@ -9,7 +9,7 @@
|
||||
my ($self, $line) = @_;
|
||||
my @list = map { uc } split /\s+/, $line; # list of callsigns of nodes
|
||||
my @out;
|
||||
my @nodes = sort {$a->call cmp $b->call} (DXNode::get_all());
|
||||
my @nodes = sort {$a->call cmp $b->call} (Route::Node::get_all());
|
||||
my $node;
|
||||
my @l;
|
||||
my @val;
|
||||
@ -34,8 +34,8 @@ if ($list[0] && $list[0] =~ /^NOD/) {
|
||||
push @l, "";
|
||||
$i = 0;
|
||||
}
|
||||
my $s = $call->{call};
|
||||
$s = sprintf "(%s)", $s if $call->{here} == 0;
|
||||
my $s = $call->call;
|
||||
$s = sprintf "(%s)", $s unless $call->here;
|
||||
push @l, $s;
|
||||
$i++;
|
||||
}
|
||||
@ -46,15 +46,14 @@ if ($list[0] && $list[0] =~ /^NOD/) {
|
||||
foreach $node (@nodes) {
|
||||
next if scalar @list && !grep $node->call =~ /^$_/, @list;
|
||||
my $call = $node->call;
|
||||
$call = "($call)" if $node->here == 0;
|
||||
$call = "($call)" unless $node->here;
|
||||
@l = ();
|
||||
push @l, $call;
|
||||
my $nlist = $node->list;
|
||||
@val = sort {$a->call cmp $b->call} values %{$nlist};
|
||||
@val = sort $node->users;
|
||||
|
||||
my $i = 0;
|
||||
if (@val == 0 && $node->users) {
|
||||
push @l, sprintf "(%d users)", $node->users;
|
||||
if (@val == 0 && $node->usercount) {
|
||||
push @l, sprintf "(%d users)", $node->usercount;
|
||||
}
|
||||
foreach $call (@val) {
|
||||
if ($i >= 5) {
|
||||
@ -63,8 +62,13 @@ if ($list[0] && $list[0] =~ /^NOD/) {
|
||||
push @l, "";
|
||||
$i = 0;
|
||||
}
|
||||
my $s = $call->{call};
|
||||
$s = sprintf "(%s)", $s if $call->{here} == 0;
|
||||
my $uref = Route::User::get($call);
|
||||
my $s = $call;
|
||||
if ($uref) {
|
||||
$s = sprintf "(%s)", $call unless $uref->here;
|
||||
} else {
|
||||
$s = "$call?";
|
||||
}
|
||||
push @l, $s;
|
||||
$i++;
|
||||
}
|
||||
|
@ -24,7 +24,7 @@ my @in;
|
||||
if (@f) {
|
||||
push @in, @f;
|
||||
} else {
|
||||
push @in, qw(ann spots wcy wwv);
|
||||
push @in, qw(route ann spots wcy wwv);
|
||||
}
|
||||
|
||||
my $sort;
|
||||
|
@ -16,6 +16,6 @@ if (@list && $list[0] =~ /^NOD/) {
|
||||
shift @list;
|
||||
}
|
||||
|
||||
push @out, $main::routeroot->config($nodes_only, 0, @list);
|
||||
push @out, $main::routeroot->config($nodes_only, 0, [], @list);
|
||||
return (1, @out);
|
||||
|
||||
|
@ -24,8 +24,8 @@ my @out;
|
||||
my $count;
|
||||
|
||||
# search thru the user for nodes
|
||||
unless (@call) {
|
||||
|
||||
if ($call[0] eq 'ALL') {
|
||||
shift @call;
|
||||
my ($action, $key, $data) = (0,0,0);
|
||||
for ($action = DXUser::R_FIRST, $count = 0; !$DXUser::dbm->seq($key, $data, $action); $action = DXUser::R_NEXT) {
|
||||
if ($data =~ m{sort => '[ACRSX]'}) {
|
||||
@ -33,11 +33,13 @@ unless (@call) {
|
||||
++$count;
|
||||
}
|
||||
}
|
||||
} elsif (@call == 0) {
|
||||
@call = map {$_->call} DXChannel::get_all_nodes();
|
||||
}
|
||||
|
||||
my $call;
|
||||
foreach $call (@call) {
|
||||
my $clref = DXCluster->get_exact($call);
|
||||
my $clref = Route::Node::get($call);
|
||||
my $uref = DXUser->get_current($call);
|
||||
my ($sort, $ver);
|
||||
|
||||
@ -60,7 +62,7 @@ foreach $call (@call) {
|
||||
$sort = "Spider";
|
||||
$ver = $main::version;
|
||||
} else {
|
||||
$ver = $clref->pcversion if $clref && $clref->pcversion;
|
||||
$ver = $clref->version if $clref && $clref->version;
|
||||
}
|
||||
|
||||
my ($major, $minor, $subs) = unpack("AAA*", $ver) if $ver;
|
||||
|
@ -13,23 +13,27 @@ my @out;
|
||||
|
||||
return (1, $self->msg('e24')) unless $Internet::allow;
|
||||
return (1, "SHOW/QRZ <callsign>, e.g. SH/QRZ g1tlh") unless @list;
|
||||
my $target = $Internet::http_proxy || 'qrz.com';
|
||||
my $port = $Internet::http_proxy_port || 80;
|
||||
my $url = '';
|
||||
$url = 'http://qrz.com' if $Internet::http_proxy;
|
||||
|
||||
use Net::Telnet;
|
||||
|
||||
my $t = new Net::Telnet;
|
||||
|
||||
foreach $l (@list) {
|
||||
$t->open(Host => "qrz.com",
|
||||
Port => 80,
|
||||
$t->open(Host => $target,
|
||||
Port => $port,
|
||||
Timeout => 15);
|
||||
if ($t) {
|
||||
my $s = "GET /dxcluster.cgi?callsign=$l\&uid=$Internet::qrz_uid\&pw=$Internet::qrz_pw HTTP/1.0\n\n";
|
||||
my $s = "GET $url/dxcluster.cgi?callsign=$l\&uid=$Internet::qrz_uid\&pw=$Internet::qrz_pw HTTP/1.0\n\n";
|
||||
# print $s;
|
||||
$t->print($s);
|
||||
Log('call', "$call: show/qrz \U$l");
|
||||
my $state = "blank";
|
||||
while (my $result = $t->getline) {
|
||||
dbg('qrz', $result);
|
||||
dbg($result) if isdbg('qrz');
|
||||
if ($state eq 'blank' && $result =~ /^\s*Callsign\s*:/i) {
|
||||
$state = 'go';
|
||||
} elsif ($state eq 'go') {
|
||||
|
@ -14,9 +14,11 @@ return (1, $self->msg('e6')) unless @list;
|
||||
|
||||
my $l;
|
||||
foreach $l (@list) {
|
||||
my $ref = DXCluster->get_exact($l);
|
||||
my $ref = Route::get($l);
|
||||
if ($ref) {
|
||||
push @out, $self->msg('route', $l, $ref->mynode->call, $ref->dxchan->call);
|
||||
my $parents = join ',', $ref->parents;
|
||||
my $dxchan = $ref->dxchan;
|
||||
push @out, $self->msg('route', $l, $parents, $dxchan->call);
|
||||
} else {
|
||||
push @out, $self->msg('e7', $l);
|
||||
}
|
||||
|
@ -59,9 +59,8 @@ if (@f == 0) {
|
||||
$miles = $dx * 0.62133785;
|
||||
}
|
||||
|
||||
my $cref = DXCluster->get_exact($call);
|
||||
$cref = DXCluster->get($call) unless $cref;
|
||||
my $seek = $cref->mynode->call if $cref;
|
||||
my $cref = Route::get($call);
|
||||
my $seek = join(',', $cref->parents) if $cref;
|
||||
|
||||
if ($seek) {
|
||||
push @out, "User : $call (at $seek)";
|
||||
|
@ -7,29 +7,33 @@
|
||||
#
|
||||
|
||||
my ($self, $line) = @_;
|
||||
my @list = map { uc } split /\s+/, $line; # list of callsigns of nodes
|
||||
my @list = map { uc } split /\s+/, $line; # list of callsigns of nodes
|
||||
my @out;
|
||||
my $node = (DXNode->get($main::mycall));
|
||||
my $node = $main::routeroot;
|
||||
|
||||
push @out, "Callsigns connected to $main::mycall";
|
||||
my $call;
|
||||
my $i = 0;
|
||||
my @l;
|
||||
my $nlist = $node->list;
|
||||
my @val = sort {$a->call cmp $b->call} values %{$nlist};
|
||||
my @val = sort $node->users;
|
||||
foreach $call (@val) {
|
||||
if (@list) {
|
||||
next if !grep $call->call eq $_, @list;
|
||||
}
|
||||
if ($i >= 5) {
|
||||
push @out, sprintf "%-12s %-12s %-12s %-12s %-12s %-12s", @l;
|
||||
@l = ();
|
||||
$i = 0;
|
||||
}
|
||||
my $s = $call->{call};
|
||||
$s = sprintf "(%s)", $s if $call->{here} == 0;
|
||||
push @l, $s;
|
||||
$i++;
|
||||
if (@list) {
|
||||
next if !grep $call eq $_, @list;
|
||||
}
|
||||
if ($i >= 5) {
|
||||
push @out, sprintf "%-12s %-12s %-12s %-12s %-12s %-12s", @l;
|
||||
@l = ();
|
||||
$i = 0;
|
||||
}
|
||||
my $uref = Route::User::get($call);
|
||||
my $s = $call;
|
||||
if ($uref) {
|
||||
$s = sprintf "(%s)", $call unless $uref->here;
|
||||
} else {
|
||||
$s = "$call?";
|
||||
}
|
||||
push @l, $s;
|
||||
$i++;
|
||||
}
|
||||
push @out, sprintf "%-12s %-12s %-12s %-12s %-12s %-12s", @l;
|
||||
|
||||
|
@ -15,15 +15,18 @@ if (@list == 0) {
|
||||
push @out, "Work Queue Keys";
|
||||
push @out, map { " $_" } sort keys %DXMsg::work;
|
||||
push @out, "Busy Queue Data";
|
||||
foreach $ref (sort {$a->call cmp $b->call} DXMsg::get_all_busy) {
|
||||
foreach $ref (sort {$a->to cmp $b->to} DXMsg::get_all_busy) {
|
||||
my $msgno = $ref->msgno;
|
||||
my $stream = $ref->stream;
|
||||
my $lines = scalar $ref->lines;
|
||||
my $lref = $ref->lines;
|
||||
my $lines = 0;
|
||||
$lines = @$lref if $lref;
|
||||
my $count = $ref->count;
|
||||
my $to = $ref->to;
|
||||
my $lastt = $ref->lastt ? " Last Processed: " . cldatetime($ref->lastt) : "";
|
||||
my $waitt = $ref->waitt ? " Waiting since: " . cldatetime($ref->waitt) : "";
|
||||
|
||||
push @out, " $call -> msg: $msgno stream: $stream Count: $count Lines: $lines$lastt$waitt";
|
||||
push @out, " $call -> $to msg: $msgno stream: $stream Count: $count Lines: $lines$lastt$waitt";
|
||||
}
|
||||
} else {
|
||||
foreach my $msgno (@list) {
|
||||
|
@ -31,7 +31,7 @@ if ($via) {
|
||||
$to = uc $to if $to;
|
||||
$via = uc $via if $via;
|
||||
my $call = $via ? $via : $to;
|
||||
my $clref = DXCluster->get_exact($call); # try an exact call
|
||||
my $clref = Route::get($call); # try an exact call
|
||||
my $dxchan = $clref->dxchan if $clref;
|
||||
return (1, $self->msg('e7', $call)) unless $dxchan;
|
||||
|
||||
|
@ -14,16 +14,22 @@ my @out;
|
||||
@args = $self->call if (!@args || $self->priv < 9);
|
||||
|
||||
foreach $call (@args) {
|
||||
$call = uc $call;
|
||||
my $dxchan = DXChannel->get($call);
|
||||
my $ref = DXCluster->get_exact($call);
|
||||
if ($dxchan && $ref) {
|
||||
$dxchan->here(0);
|
||||
$ref->here(0);
|
||||
DXProt::broadcast_all_ak1a(DXProt::pc24($ref), $DXProt::me);
|
||||
push @out, $self->msg('hereu', $call);
|
||||
} else {
|
||||
push @out, $self->msg('e3', "Unset Here", $call);
|
||||
}
|
||||
$call = uc $call;
|
||||
my $dxchan = DXChannel->get($call);
|
||||
if ($dxchan) {
|
||||
$dxchan->here(0);
|
||||
push @out, $self->msg('hereu', $call);
|
||||
my $ref = Route::User::get($call);
|
||||
$ref = Route::Node::get($call) unless $ref;
|
||||
if ($ref) {
|
||||
$ref->here(0);
|
||||
my $s = DXProt::pc24($ref);
|
||||
DXProt::eph_dup($s);
|
||||
DXProt::broadcast_all_ak1a($s, $DXProt::me) ;
|
||||
}
|
||||
} else {
|
||||
push @out, $self->msg('e3', "Unset Here", $call);
|
||||
}
|
||||
}
|
||||
|
||||
return (1, @out);
|
||||
|
11
cmd/unset/privilege.pl
Normal file
11
cmd/unset/privilege.pl
Normal file
@ -0,0 +1,11 @@
|
||||
#
|
||||
# unset any privileges that the user might have for THIS SESSION only
|
||||
#
|
||||
# Copyright (c) 2001 Dirk Koopman G1TLH
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
my ($self, $line) = @_;
|
||||
$self->priv(0);
|
||||
return (1, $self->msg('done'));
|
||||
|
12
cmd/unset/send_dbg.pl
Normal file
12
cmd/unset/send_dbg.pl
Normal file
@ -0,0 +1,12 @@
|
||||
#
|
||||
# send debug information to this connection
|
||||
#
|
||||
# Copyright (c) 2001 - Dirk Koopman
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
my ($self, $line) = @_;
|
||||
return (1, $self->msg('e5')) if $self->priv < 8;
|
||||
$self->senddbg(0);
|
||||
return (1, $self->msg('done'));
|
115
gtkconsole/DebugHandler.pm
Normal file
115
gtkconsole/DebugHandler.pm
Normal file
@ -0,0 +1,115 @@
|
||||
#
|
||||
# Gtk Handler for Debug Files
|
||||
#
|
||||
|
||||
package DebugHandler;
|
||||
|
||||
use strict;
|
||||
|
||||
use Gtk;
|
||||
use DXVars;
|
||||
use DXLog;
|
||||
use DXUtil;
|
||||
|
||||
use vars qw(@ISA);
|
||||
@ISA = qw(Gtk::Window);
|
||||
|
||||
sub new
|
||||
{
|
||||
my $pkg = shift;
|
||||
my $parent = shift;
|
||||
my $regexp = shift || '';
|
||||
my $nolines = shift || 1;
|
||||
|
||||
my $self = new Gtk::Window;
|
||||
bless $self, $pkg;
|
||||
$self->set_default_size(400, 400);
|
||||
$self->set_transient_for($parent) if $parent;
|
||||
$self->signal_connect('destroy', sub {$self->destroy} );
|
||||
$self->signal_connect('delete_event', sub {$self->destroy; return undef;});
|
||||
$self->set_title("Debug Output - $regexp");
|
||||
$self->border_width(0);
|
||||
$self->show;
|
||||
|
||||
my $box1 = new Gtk::VBox(0, 0);
|
||||
$self->add($box1);
|
||||
$box1->show;
|
||||
|
||||
my $swin = new Gtk::ScrolledWindow(undef, undef);
|
||||
$swin->set_policy('automatic', 'automatic');
|
||||
$box1->pack_start($swin, 1, 1, 0);
|
||||
$swin->show;
|
||||
|
||||
my $button = new Gtk::Button('close');
|
||||
$button->signal_connect('clicked', sub {$self->destroy});
|
||||
$box1->pack_end($button, 0, 1, 0);
|
||||
$button->show;
|
||||
|
||||
my $clist = new_with_titles Gtk::CList('Time', 'Data');
|
||||
$swin->add($clist);
|
||||
$clist->show;
|
||||
|
||||
$self->{fp} = DXLog::new('debug', 'dat', 'd');
|
||||
|
||||
my @today = Julian::unixtoj(time);
|
||||
my $fh = $self->{fh} = $self->{fp}->open(@today);
|
||||
$fh->seek(0, 2);
|
||||
$self->{regexp} = $regexp if $regexp;
|
||||
$self->{nolines} = $nolines;
|
||||
$self->{clist} = $clist;
|
||||
|
||||
$self->{id} = Gtk::Gdk->input_add($fh->fileno, ['read'], sub {$self->handleinp(@_); 1;}, $fh);
|
||||
|
||||
$self->show_all;
|
||||
return $self;
|
||||
}
|
||||
|
||||
sub destroy
|
||||
{
|
||||
my $self = shift;
|
||||
$self->{fp}->close;
|
||||
Gtk::Gdk->input_remove($self->{id});
|
||||
delete $self->{clist};
|
||||
}
|
||||
|
||||
sub handleinp
|
||||
{
|
||||
my ($self, $socket, $fd, $flags) = @_;
|
||||
if ($flags->{read}) {
|
||||
my $offset = exists $self->{rbuf} ? length $self->{rbuf} : 0;
|
||||
my $l = sysread($socket, $self->{rbuf}, 1024, $offset);
|
||||
if (defined $l) {
|
||||
if ($l) {
|
||||
while ($self->{rbuf} =~ s/^([^\015\012]*)\015?\012//) {
|
||||
my $line = $1;
|
||||
if ($self->{regexp}) {
|
||||
push @{$self->{prev}}, $line;
|
||||
shift @{$self->{prev}} while @{$self->{prev}} > $self->{nolines};
|
||||
if ($line =~ m{$self->{regexp}}oi) {
|
||||
$self->printit(@{$self->{prev}});
|
||||
@{$self->{prev}} = [];
|
||||
}
|
||||
} else {
|
||||
$self->printit($line);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub printit
|
||||
{
|
||||
my $self = shift;
|
||||
my $clist = $self->{clist};
|
||||
while (@_) {
|
||||
my $line = shift;
|
||||
$line =~ s/([\x00-\x1f\x7f-\xff])/sprintf("\\x%02X", ord($1))/eg;
|
||||
my @line = split /\^/, $line, 2;
|
||||
my $t = shift @line;
|
||||
my ($sec,$min,$hour) = gmtime((defined $t) ? $t : time);
|
||||
my $buf = sprintf "%02d:%02d:%02d", $hour, $min, $sec;
|
||||
$clist->append($buf, @line);
|
||||
}
|
||||
}
|
||||
1;
|
53
gtkconsole/Text.pm
Normal file
53
gtkconsole/Text.pm
Normal file
@ -0,0 +1,53 @@
|
||||
#
|
||||
# create a text area with scroll bars
|
||||
#
|
||||
# Copyright (c) 2001 Dirk Koopman G1TLH
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
package Text;
|
||||
|
||||
use strict;
|
||||
use Gtk;
|
||||
|
||||
use vars qw(@ISA);
|
||||
@ISA = qw(Gtk::Text);
|
||||
|
||||
sub new
|
||||
{
|
||||
my $pkg = shift;
|
||||
my ($vbar, $hbar) = @_;
|
||||
|
||||
my $font = Gtk::Gdk::Font->load("-misc-fixed-medium-r-normal-*-*-130-*-*-c-*-koi8-r");
|
||||
my $text = new Gtk::Text(undef,undef);
|
||||
my $style = $text->style;
|
||||
$style->font($font);
|
||||
$text->set_style($style);
|
||||
$text->show;
|
||||
my $vscroll = new Gtk::VScrollbar($text->vadj);
|
||||
$vscroll->show;
|
||||
my $box = new Gtk::HBox();
|
||||
$box->add($text);
|
||||
$box->pack_start($vscroll, 0,0,0);
|
||||
$box->show;
|
||||
|
||||
my $self = bless $box, $pkg;
|
||||
$self->{text} = $text;
|
||||
$self->{text}->{font} = $font;
|
||||
return $self;
|
||||
}
|
||||
|
||||
sub destroy
|
||||
{
|
||||
my $self = shift;
|
||||
delete $self->{text}->{font};
|
||||
delete $self->{text};
|
||||
}
|
||||
|
||||
sub text
|
||||
{
|
||||
return shift->{text};
|
||||
}
|
||||
|
||||
1;
|
246
gtkconsole/gtkconsole
Executable file
246
gtkconsole/gtkconsole
Executable file
@ -0,0 +1,246 @@
|
||||
#!/usr/bin/perl -w
|
||||
#
|
||||
# A GTK based console program
|
||||
#
|
||||
# Copyright (c) 2001 Dirk Koopman G1TLH
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
# search local then perl directories
|
||||
BEGIN {
|
||||
# root of directory tree for this system
|
||||
$root = "/spider";
|
||||
$root = $ENV{'DXSPIDER_ROOT'} if $ENV{'DXSPIDER_ROOT'};
|
||||
|
||||
unshift @INC, "$root/perl"; # this IS the right way round!
|
||||
unshift @INC, "$root/gtkconsole";
|
||||
unshift @INC, "$root/local";
|
||||
}
|
||||
|
||||
use strict;
|
||||
|
||||
use Gtk qw(-init);
|
||||
|
||||
use vars qw(@modules $font);
|
||||
|
||||
@modules = (); # is the list of modules that need init calling
|
||||
# on them. It is set up by each 'use'ed module
|
||||
# that has Gtk stuff in it
|
||||
$font = Gtk::Gdk::Font->load("-misc-fixed-medium-r-normal-*-*-130-*-*-c-*-koi8-r");
|
||||
|
||||
use DXVars;
|
||||
use DXUtil;
|
||||
use IO::Socket::INET;
|
||||
use Text;
|
||||
use DebugHandler;
|
||||
|
||||
#
|
||||
# main initialisation
|
||||
#
|
||||
my $call = uc shift @ARGV if @ARGV;
|
||||
$call = uc $main::myalias unless $call;
|
||||
my ($scall, $ssid) = split /-/, $call;
|
||||
$ssid = undef unless $ssid && $ssid =~ /^\d+$/;
|
||||
if ($ssid) {
|
||||
$ssid = 15 if $ssid > 15;
|
||||
$call = "$scall-$ssid";
|
||||
}
|
||||
|
||||
die "You cannot connect as your cluster callsign ($main::mycall)\n" if $call eq $main::mycall;
|
||||
|
||||
|
||||
my $sock = IO::Socket::INET->new(PeerAddr=>$main::clusteraddr, PeerPort=>$main::clusterport);
|
||||
die "Cannot connect to $main::clusteraddr/$main::clusterport ($!)\n" unless $sock;
|
||||
sendmsg('A', 'local');
|
||||
sendmsg('G', '2');
|
||||
sendmsg('I', 'set/page 500');
|
||||
sendmsg('I', 'set/nobeep');
|
||||
|
||||
#
|
||||
# start of GTK stuff
|
||||
#
|
||||
|
||||
|
||||
# main window
|
||||
my $main = new Gtk::Window('toplevel');
|
||||
$main->set_default_size(600, 600);
|
||||
$main->set_policy(0, 1, 0);
|
||||
$main->signal_connect('destroy', sub { Gtk->exit(0); });
|
||||
$main->signal_connect('delete_event', sub { Gtk->exit(0); });
|
||||
$main->set_title("gtkconsole - The DXSpider Console - $call");
|
||||
|
||||
# the main vbox
|
||||
my $vbox = new Gtk::VBox(0, 1);
|
||||
$vbox->border_width(1);
|
||||
$main->add($vbox);
|
||||
|
||||
# the menu bar
|
||||
my @menu = (
|
||||
{path => '/_File', type => '<Branch>'},
|
||||
{path => '/_File/Quit', callback => sub {Gtk->exit(0)}},
|
||||
{path => '/_Help', type => '<LastBranch>'},
|
||||
{path => '/_Help/About'},
|
||||
);
|
||||
my $accel = new Gtk::AccelGroup();
|
||||
my $itemf = new Gtk::ItemFactory('Gtk::MenuBar', '<main>', $accel);
|
||||
$itemf->create_items(@menu);
|
||||
$main->add_accel_group($accel);
|
||||
my $menu = $itemf->get_widget('<main>');
|
||||
$vbox->pack_start($menu, 0, 1, 0);
|
||||
$menu->show;
|
||||
|
||||
|
||||
my $top = new Text(1);
|
||||
my $toplist = $top->text;
|
||||
$toplist->set_editable(0);
|
||||
$toplist->sensitive(0);
|
||||
|
||||
# add the handler for incoming messages from the node
|
||||
my $tophandler = Gtk::Gdk->input_add($sock->fileno, ['read'], \&tophandler, $sock);
|
||||
my $rbuf = ""; # used in handler
|
||||
|
||||
#$toplist->{signalid} = $toplist->signal_connect(insert_text => \&doinsert, $toplist);
|
||||
#$bot->{signalid} = $bot->signal_connect(insert_text => \&botinsert, $bot);
|
||||
$vbox->pack_start($top, 1, 1, 0);
|
||||
$vbox->show;
|
||||
|
||||
# the bottom handler
|
||||
my $bot = new Gtk::Entry;
|
||||
my $style = $toplist->style;
|
||||
$style->font($main::font);
|
||||
$bot->set_style($style);
|
||||
$bot->set_editable(1);
|
||||
$bot->signal_connect('activate', \&bothandler);
|
||||
$bot->can_default(1);
|
||||
$bot->grab_default;
|
||||
$bot->grab_focus;
|
||||
$bot->show;
|
||||
|
||||
# a horizontal box
|
||||
my $hbox = new Gtk::HBox;
|
||||
$hbox->show;
|
||||
|
||||
# callsign and current date and time
|
||||
my $calllabel = new Gtk::Label($call);
|
||||
my $date = new Gtk::Label(cldatetime(time));
|
||||
Gtk->timeout_add(1000, \&updatetime);
|
||||
$calllabel->show;
|
||||
$date->show;
|
||||
|
||||
$hbox->pack_start( $calllabel, 0, 1, 0 );
|
||||
$hbox->pack_end($date, 0, 1, 0);
|
||||
|
||||
|
||||
$vbox->pack_start($hbox, 0, 1, 0);
|
||||
|
||||
# nice little separator
|
||||
my $separator = new Gtk::HSeparator();
|
||||
$vbox->pack_start( $separator, 0, 1, 0 );
|
||||
$separator->show();
|
||||
$vbox->pack_start($bot, 0, 1, 0);
|
||||
|
||||
# the main loop
|
||||
$main->show_all;
|
||||
Gtk->main;
|
||||
|
||||
#
|
||||
# handlers
|
||||
#
|
||||
|
||||
sub updatetime
|
||||
{
|
||||
$date->set_text(cldatetime(time));
|
||||
1;
|
||||
}
|
||||
|
||||
sub doinsert {
|
||||
my ($self, $text) = @_;
|
||||
|
||||
# we temporarily block this handler to avoid recursion
|
||||
$self->signal_handler_block($self->{signalid});
|
||||
my $pos = $self->insert($self->{font}, $toplist->style->black, $toplist->style->white, $text);
|
||||
$self->signal_handler_unblock($self->{signalid});
|
||||
|
||||
# we already inserted the text if it was valid: no need
|
||||
# for the self to process this signal emission
|
||||
$self->signal_emit_stop_by_name('insert-text');
|
||||
1;
|
||||
}
|
||||
|
||||
sub bothandler
|
||||
{
|
||||
my ($self, $data) = @_;
|
||||
my $msg = $self->get_text;
|
||||
$msg =~ s/\r?\n$//;
|
||||
$self->set_text('');
|
||||
senddata($msg);
|
||||
}
|
||||
|
||||
sub tophandler
|
||||
{
|
||||
my ($socket, $fd, $flags) = @_;
|
||||
if ($flags->{read}) {
|
||||
my $offset = length $rbuf;
|
||||
my $l = sysread($socket, $rbuf, 1024, $offset);
|
||||
if (defined $l) {
|
||||
my $freeze;
|
||||
if ($l) {
|
||||
while ($rbuf =~ s/^([^\015\012]*)\015?\012//) {
|
||||
my $msg = $1;
|
||||
$msg =~ s/\%([0-9A-F][0-9A-F])/chr(hex($1))/eg;
|
||||
$msg =~ s/[\x00-\x08\x0a-\x19\x1b-\x1f\x80-\x9f]/./g; # immutable CSI sequence + control characters
|
||||
$toplist->freeze unless $freeze++;
|
||||
handlemsg($msg);
|
||||
}
|
||||
if ($freeze) {
|
||||
$toplist->thaw;
|
||||
$toplist->vadj->set_value($toplist->vadj->upper);
|
||||
$toplist->vadj->value_changed;
|
||||
}
|
||||
} else {
|
||||
Gtk->exit(0);
|
||||
}
|
||||
} else {
|
||||
Gtk->exit(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub handlemsg
|
||||
{
|
||||
my $msg = shift;
|
||||
my ($sort, $call, $line) = $msg =~ /^(\w)([^\|]+)\|(.*)$/;
|
||||
if ($sort eq 'D') {
|
||||
$toplist->insert($toplist->{font}, undef, undef, "$line\n");
|
||||
} elsif ($sort eq 'X') {
|
||||
$toplist->insert($toplist->{font}, undef, undef, "$line\n");
|
||||
} elsif ($sort eq 'Y') {
|
||||
$toplist->insert($toplist->{font}, undef, undef, "$line\n");
|
||||
} elsif ($sort eq 'V') {
|
||||
$toplist->insert($toplist->{font}, undef, undef, "$line\n");
|
||||
} elsif ($sort eq 'N') {
|
||||
$toplist->insert($toplist->{font}, undef, undef, "$line\n");
|
||||
} elsif ($sort eq 'W') {
|
||||
$toplist->insert($toplist->{font}, undef, undef, "$line\n");
|
||||
} elsif ($sort eq 'Z') {
|
||||
Gtk->exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
#
|
||||
# subroutine
|
||||
#
|
||||
|
||||
sub senddata
|
||||
{
|
||||
my $msg = shift;
|
||||
sendmsg('I', $msg);
|
||||
}
|
||||
|
||||
sub sendmsg
|
||||
{
|
||||
my ($let, $msg) = @_;
|
||||
$msg =~ s/([\%\x00-\x1f\x7f-\xff])/sprintf("%%%02X", ord($1))/eg;
|
||||
$sock->print("$let$call|$msg\n");
|
||||
}
|
@ -2,7 +2,7 @@
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
|
||||
<TITLE>The DXSpider Administration Manual v1.47: Hop control</TITLE>
|
||||
<TITLE>The DXSpider Administration Manual v1.48: Routing and Filtering</TITLE>
|
||||
<LINK HREF="adminmanual-2.html" REL=next>
|
||||
|
||||
<LINK HREF="adminmanual.html#toc1" REL=contents>
|
||||
@ -13,14 +13,348 @@
|
||||
Previous
|
||||
<A HREF="adminmanual.html#toc1">Contents</A>
|
||||
<HR>
|
||||
<H2><A NAME="s1">1. Hop control</A></H2>
|
||||
<H2><A NAME="s1">1. Routing and Filtering</A></H2>
|
||||
|
||||
<P>Starting with version 1.13 there is simple hop control available on a per
|
||||
node basis. Also it is possible to isolate a network completely so that you
|
||||
get all the benefits of being on that network, but can't pass on information
|
||||
from it to any other networks you may be connected to (or vice versa).
|
||||
<H2><A NAME="ss1.1">1.1 Introduction</A>
|
||||
</H2>
|
||||
|
||||
<P>From DXSpider version 1.48, major changes were introduced to the way
|
||||
node connections are treated. This is part of an ongoing process to
|
||||
remove problems with loops and to enable talk and other functions to
|
||||
propagate across the whole of the worldwide cluster network. In fact,
|
||||
in a Spider network, it would be useful, perhaps even necessary to
|
||||
have loops. This would give real resilience to the network, meaning
|
||||
that if a link dropped, the information flow would simply come in and
|
||||
go out via a different route. Of course, we do not have a complete
|
||||
network of Spider nodes, there are other programs out there. Some of
|
||||
these do not have any protection from loops. Certainly AK1A does not
|
||||
handle loops well at all. It is therefore necessary to have some form
|
||||
of protection for these nodes.
|
||||
<P>
|
||||
<H2><A NAME="ss1.1">1.1 Basic hop control</A>
|
||||
<P>This is achieved by using filtering on a route basis. There is a
|
||||
default setting to help to protect the network, especially useful for new
|
||||
and inexperienced SysOps. The idea is simple. When Spider is started
|
||||
for the first time and a connection is made to or from another node,
|
||||
the default is to only send the nodes you already have that are in your
|
||||
own zone. For example, in the UK the default setting would be to send
|
||||
only UK nodes to any connection. This can be filtered further (down to
|
||||
a single node if needed) or expanded as required.
|
||||
<P>
|
||||
<P>
|
||||
<H2><A NAME="ss1.2">1.2 Route Filters</A>
|
||||
</H2>
|
||||
|
||||
<P>As mentioned in the introduction, a default setting exists. If this is
|
||||
all you want to use then that is fine, you have nothing else to do.
|
||||
However, if you want to make any alterations then you need to know
|
||||
a bit about filters.
|
||||
<P>
|
||||
<P>It is possible to reset the default setting for node connections should
|
||||
you wish to do so, however this can be dangerous to the network unless
|
||||
you have some experience in how all this works.... be careful! It is
|
||||
also possible to change settings for one connection only. You can,
|
||||
therefore, have many different filters set dependent on the amount of
|
||||
node links you have.
|
||||
<P>
|
||||
<P>I should at this stage give a little bit of background on filters. All
|
||||
the filters in Spider work in basically the same way. You can either
|
||||
accept or reject various options in order to create the filter rules
|
||||
you wish to achieve. Some filters are user settable, others can only
|
||||
be altered by the sysop. Route filtering can only be done by the sysop.
|
||||
<P>
|
||||
<H2><A NAME="ss1.3">1.3 The default_node filter</A>
|
||||
</H2>
|
||||
|
||||
<P>As discussed previously, a default setting exists that only sends nodes
|
||||
from your own zone. This can be overridden by using the default_node
|
||||
filter option like this ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
reject/route default_node <filter_option>
|
||||
|
||||
or
|
||||
|
||||
accept/route default_node <filter_option>
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>
|
||||
<P>where filter_option is one of the following ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
call <prefixes>
|
||||
call_dxcc <numbers>
|
||||
call_itu <numbers>
|
||||
call_zone <numbers>
|
||||
origin <prefixes>
|
||||
origin_dxcc <numbers>
|
||||
origin_itu <numbers>
|
||||
origin_zone <numbers>
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>
|
||||
<P>Please be careful if you alter this setting, it will affect
|
||||
<B><I>ALL</I></B> your links!
|
||||
<P>
|
||||
<H2><A NAME="ss1.4">1.4 General route filtering</A>
|
||||
</H2>
|
||||
|
||||
<P>Exactly the same rules apply for general route filtering. You would
|
||||
use either an accept filter or a reject filter like this ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
reject/route <node_call> <filter_option>
|
||||
|
||||
or
|
||||
|
||||
accept/route <node_call> <filter_option>
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>
|
||||
<P>where filter_option is one of the following ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
call <prefixes>
|
||||
call_dxcc <numbers>
|
||||
call_itu <numbers>
|
||||
call_zone <numbers>
|
||||
origin <prefixes>
|
||||
origin_dxcc <numbers>
|
||||
origin_itu <numbers>
|
||||
origin_zone <numbers>
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>
|
||||
<P>Here are some examples of route filters ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
rej/route gb7djk call_dxcc 61,38 (everything except UK+EIRE nodes)
|
||||
rej/route all (equiv to [very] restricted mode)
|
||||
acc/route gb7djk call_dxcc 61,38 (send only UK+EIRE nodes)
|
||||
acc/route gb7djk call gb7djk (equiv to SET/ISOLATE)
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>
|
||||
<H2><A NAME="ss1.5">1.5 General filter rules</A>
|
||||
</H2>
|
||||
|
||||
<P>Upto v1.44 it was not possible for the user to set their own filters. From
|
||||
v1.45 though that has all changed. It is now possible to set filters for just
|
||||
about anything you wish. If you have just updated from an older version of
|
||||
DXSpider you will need to update your new filters. You do not need to do
|
||||
anything with your old filters, they will be renamed as you update.
|
||||
<P>
|
||||
<P>There are 3 basic commands involved in setting and manipulating filters. These
|
||||
are <EM>accept</EM>, <EM>reject</EM> and <EM>clear</EM>. First we will look
|
||||
generally at filtering. There are a number of things you can filter in the
|
||||
DXSpider system. They all use the same general mechanism.
|
||||
<P>
|
||||
<P>In general terms you can create a 'reject' or an 'accept' filter which can have
|
||||
up to 10 lines in it. You do this using, for example ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
|
||||
accept/spots .....
|
||||
reject/spots .....
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>where ..... are the specific commands for that type of filter. There are filters
|
||||
for spots, wwv, announce, wcy and (for sysops) connects. See each different
|
||||
accept or reject command reference for more details.
|
||||
<P>There is also a command to clear out one or more lines in a filter. They are ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
clear/spots 1
|
||||
clear/spots all
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>There is clear/xxxx command for each type of filter.
|
||||
<P>
|
||||
<P>and you can check that your filters have worked by the command ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
|
||||
show/filter
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>
|
||||
<P>For now we are going to use spots for the examples, but you can apply the same
|
||||
principles to all types of filter.
|
||||
<P>
|
||||
<H2><A NAME="ss1.6">1.6 Types of filter</A>
|
||||
</H2>
|
||||
|
||||
<P>There are two main types of filter, <EM>accept</EM> or <EM>reject</EM>. You
|
||||
can use either to achieve the result you want dependent on your own preference
|
||||
and which is more simple to do. It is pointless writing 8 lines of reject
|
||||
filters when 1 accept filter would do the same thing! Each filter has 10
|
||||
lines (of any length) which are tried in order. If a line matches then the
|
||||
action you have specified is taken (ie reject means ignore it and accept
|
||||
means take it)
|
||||
<P>
|
||||
<P>If you specify reject filters, then any lines that arrive that match the filter
|
||||
will be dumped but all else will be accepted. If you use an accept filter,
|
||||
then ONLY the lines in the filter will be accepted and all else will be dumped.
|
||||
For example if you have a single line <EM>accept</EM> filter ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
accept/spots on vhf and (by_zone 14,15,16 or call_zone 14,15,16)
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>then you will <EM>ONLY</EM> get VHF spots <EM>from</EM> or <EM>to</EM> CQ zones
|
||||
14, 15 and 16.
|
||||
<P>
|
||||
<P>If you set a reject filter like this ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
reject/spots on hf/cw
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>Then you will get everything <EM>EXCEPT</EM> HF CW spots. You could make this
|
||||
single filter even more flexible. For example, if you are interested in IOTA
|
||||
and will work it even on CW even though normally you are not interested in
|
||||
CW, then you could say ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
reject/spots on hf/cw and not info iota
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>But in that case you might only be interested in iota and say:-
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
accept/spots not on hf/cw or info iota
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>which achieves exactly the same thing. You should choose one or the other
|
||||
until you are comfortable with the way it works. You can mix them if you
|
||||
wish (actually you can have an accept AND a reject on the same line) but
|
||||
don't attempt this until you are sure you know what you are doing!
|
||||
<P>
|
||||
<P>You can arrange your filter lines into logical units, either for your own
|
||||
understanding or simply convenience. Here is an example ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
reject/spots 1 on hf/cw
|
||||
reject/spots 2 on 50000/1400000 not (by_zone 14,15,16 or call_zone 14,15,16)
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>What this does is to ignore all HF CW spots and also rejects any spots on VHF
|
||||
which don't either originate or spot someone in Europe.
|
||||
<P>
|
||||
<P>This is an example where you would use a line number (1 and 2 in this case), if
|
||||
you leave the digit out, the system assumes '1'. Digits '0'-'9' are available.
|
||||
This make it easier to see just what filters you have set. It also makes it
|
||||
more simple to remove individual filters, during a contest for example.
|
||||
<P>
|
||||
<P>You will notice in the above example that the second line has brackets. Look
|
||||
at the line logically. You can see there are 2 separate sections to it. We
|
||||
are saying reject spots that are VHF or above <EM>APART</EM> from those in
|
||||
zones 14, 15 and 16 (either spotted there or originated there). If you did
|
||||
not have the brackets to separate the 2 sections, then Spider would read it
|
||||
logically from the front and see a different expression entirely ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
(on 50000/1400000 and by_zone 14,15,16) or call_zone 14,15,16
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>The simple way to remember this is, if you use OR - use brackets. Whilst we are
|
||||
here CASE is not important. 'And BY_Zone' is just the same as 'and by_zone'.
|
||||
<P>As mentioned earlier, setting several filters can be more flexible than
|
||||
simply setting one complex one. Doing it in this way means that if you want
|
||||
to alter your filter you can just redefine or remove one or more lines of it or
|
||||
one line. For example ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
reject/spots 1 on hf/ssb
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>would redefine our earlier example, or
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
clear/spots 1
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>To remove all the filter lines in the spot filter ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
clear/spots all
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>
|
||||
<H2><A NAME="ss1.7">1.7 Filter options</A>
|
||||
</H2>
|
||||
|
||||
<P>You can filter in several different ways. The options are listed in the
|
||||
various helpfiles for accept, reject and filter.
|
||||
<P>
|
||||
<H2><A NAME="ss1.8">1.8 Default filters</A>
|
||||
</H2>
|
||||
|
||||
<P>Sometimes all that is needed is a general rule for node connects. This can
|
||||
be done with a node_default filter. This rule will always be followed, even
|
||||
if the link is isolated, unless another filter is set specifically. Default
|
||||
rules can be set for nodes and users. They can be set for spots, announces,
|
||||
WWV and WCY. They can also be used for hops. An example might look like
|
||||
this ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
accept/spot node_default by_zone 14,15,16,20,33
|
||||
set/hops node_default spot 50
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>This filter is for spots only, you could set others for announce, WWV and WCY.
|
||||
This filter would work for ALL nodes unless a specific filter is written to
|
||||
override it for a particular node. You can also set a user_default should
|
||||
you require. It is important to note that default filters should be
|
||||
considered to be "connected". By this I mean that should you override the
|
||||
default filter for spots, you need to add a rule for the hops for spots also.
|
||||
<P>
|
||||
<H2><A NAME="ss1.9">1.9 Advanced filtering</A>
|
||||
</H2>
|
||||
|
||||
<P>Once you are happy with the results you get, you may like to experiment.
|
||||
<P>
|
||||
<P>The previous example that filters hf/cw spots and accepts vhf/uhf spots from EU
|
||||
can be written with a mixed filter, for example ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
rej/spot on hf/cw
|
||||
acc/spot on 0/30000
|
||||
acc/spot 2 on 50000/1400000 and (by_zone 14,15,16 or call_zone 14,15,16)
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>Note that the first filter has not been specified with a number. This will
|
||||
automatically be assumed to be number 1. In this case, we have said <EM>reject all
|
||||
HF spots in the CW section of the bands but accept all others at HF. Also
|
||||
accept anything in VHF and above spotted in or by operators in the zones
|
||||
14, 15 and 16</EM>. Each filter slot actually has a 'reject' slot and
|
||||
an 'accept' slot. The reject slot is executed BEFORE the accept slot.
|
||||
<P>
|
||||
<P>It was mentioned earlier that after a reject test that doesn't match, the default
|
||||
for following tests is 'accept', the reverse is true for 'accept'. In the example
|
||||
what happens is that the reject is executed first, any non hf/cw spot is passed
|
||||
to the accept line, which lets through everything else on HF. The next filter line
|
||||
lets through just VHF/UHF spots from EU.
|
||||
<P>
|
||||
<H2><A NAME="ss1.10">1.10 Basic hop control</A>
|
||||
</H2>
|
||||
|
||||
<P>In /spider/data you will find a file called hop_table.pl. This is the file
|
||||
@ -92,14 +426,14 @@ are not exhaustive but should give you a good idea of how the file works.
|
||||
If you alter the file during runtime, the command <EM>load/hops</EM> will
|
||||
bring your changes into effect.
|
||||
<P>
|
||||
<H2><A NAME="ss1.2">1.2 Isolating networks</A>
|
||||
<H2><A NAME="ss1.11">1.11 Isolating networks</A>
|
||||
</H2>
|
||||
|
||||
<P>It is possible to isolate networks from each other on a "gateway" node using the
|
||||
<EM>set/isolate <node_call></EM> command.
|
||||
<P>
|
||||
<P>The effect of this is to partition an isolated network completely from another
|
||||
nodes connected to your node. Your node will appear on and otherwise behave
|
||||
node connected to your node. Your node will appear on and otherwise behave
|
||||
normally on every network to which you are connected, but data from an isolated
|
||||
network will not cross onto any other network or vice versa. However all the
|
||||
spot, announce and WWV traffic and personal messages will still be handled
|
||||
@ -130,8 +464,6 @@ $in = [
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>
|
||||
<P>There is a lot more on filtering in the next section.
|
||||
<P>
|
||||
<HR>
|
||||
<A HREF="adminmanual-2.html">Next</A>
|
||||
Previous
|
||||
|
@ -2,7 +2,7 @@
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
|
||||
<TITLE>The DXSpider Administration Manual v1.47: Filtering (Old Style upto v1.44)</TITLE>
|
||||
<TITLE>The DXSpider Administration Manual v1.48: Other filters</TITLE>
|
||||
<LINK HREF="adminmanual-3.html" REL=next>
|
||||
<LINK HREF="adminmanual-1.html" REL=previous>
|
||||
<LINK HREF="adminmanual.html#toc2" REL=contents>
|
||||
@ -13,231 +13,118 @@
|
||||
<A HREF="adminmanual-1.html">Previous</A>
|
||||
<A HREF="adminmanual.html#toc2">Contents</A>
|
||||
<HR>
|
||||
<H2><A NAME="s2">2. Filtering (Old Style upto v1.44)</A></H2>
|
||||
<H2><A NAME="s2">2. Other filters</A></H2>
|
||||
|
||||
<P>Filters can be set for spots, announcements and WWV. You will find the
|
||||
directories for these under /spider/filter. You will find some examples in
|
||||
the directories with the suffix <EM>.issue</EM>. There are two types of
|
||||
filter, one for incoming information and one for outgoing information.
|
||||
Outgoing filters are in the form <EM>CALLSIGN.pl</EM> and incoming filters
|
||||
are in the form <EM>in_CALLSIGN.pl</EM>. Filters can be set for both nodes
|
||||
and users.
|
||||
<P>
|
||||
<P>All filters work in basically the same way. There are several elements
|
||||
delimited by commas. There can be many lines in the filter and they are
|
||||
read from the top by the program. When writing a filter you need to think
|
||||
carefully about just what you want to achieve. You are either going to write
|
||||
a filter to <EM>accept</EM> or to <EM>reject</EM>. Think of a filter as
|
||||
having 2 main elements. For a reject filter, you would have a line or multiple
|
||||
lines rejecting the things you do not wish to receive and then a default line
|
||||
accepting everything else that is not included in the filter. Likewise, for an
|
||||
accept filter, you would have a line or multiple lines accepting the things you
|
||||
wish to receive and a default line rejecting everthing else.
|
||||
<P>
|
||||
<P>In the example below, a user requires a filter that would only return SSB spots
|
||||
posted in Europe on the HF bands. This is achieved by first rejecting the CW
|
||||
section of each HF band and rejecting all of VHF, UHF etc based on frequency.
|
||||
Secondly, a filter rule is set based on CQ zones to only accept spots posted in
|
||||
Europe. Lastly, a default filter rule is set to reject anything outside the filter.
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
$in = [
|
||||
[ 0, 0, 'r', # reject all CW spots
|
||||
[
|
||||
1800.0, 1850.0,
|
||||
3500.0, 3600.0,
|
||||
7000.0, 7040.0,
|
||||
14000.0, 14100.0,
|
||||
18068.0, 18110.0,
|
||||
21000.0, 21150.0,
|
||||
24890.0, 24930.0,
|
||||
28000.0, 28180.0,
|
||||
30000.0, 49000000000.0,
|
||||
] ,1 ],
|
||||
[ 1, 11, 'n', [ 14, 15, 16, 20, 33, ], 15 ], #accept EU
|
||||
[ 0, 0, 'd', 0, 1 ], # 1 = want, 'd' = everything else
|
||||
];
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>
|
||||
<P>The actual elements of each filter are described more fully in the following
|
||||
sections.
|
||||
<P>
|
||||
<H2><A NAME="ss2.1">2.1 Spots</A>
|
||||
</H2>
|
||||
|
||||
<P>The elements of the Spot filter are ....
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
[action, field_no, sort, possible_values, hops]
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>
|
||||
<P>There are 3 elements here to look at. Firstly, the action element. This is
|
||||
very simple and only 2 possible states exist, accept (1) or drop (0).
|
||||
<P>
|
||||
<P>The second element is the field_no. There are 13 possiblities to choose from
|
||||
here ....
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
0 = frequency
|
||||
1 = call
|
||||
2 = date in unix format
|
||||
3 = comment
|
||||
4 = spotter
|
||||
5 = spotted dxcc country
|
||||
6 = spotter's dxcc country
|
||||
7 = origin
|
||||
8 = spotted itu
|
||||
9 = spotted cq
|
||||
10 = spotter's itu
|
||||
11 = spotter's cq
|
||||
12 = callsign of the channel on which the spot has appeared
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>
|
||||
<P>The third element tells us what to expect in the fourth element. There are
|
||||
4 possibilities ....
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
n - numeric list of numbers e.g. [ 1,2,3 ]
|
||||
r - ranges of pairs of numbers e.g. between 2 and 4 or 10 to 17 - [ 2,4, 10,17 ]
|
||||
a - an alphanumeric regex
|
||||
d - the default rule
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>
|
||||
<P>The fifth element is simply the hops to set in this filter. This would only
|
||||
be used if the filter was for a node of course and overrides the hop count in
|
||||
hop_table.pl.
|
||||
<P>
|
||||
<P>So, let's look at an example spot filter. It does not matter in the example
|
||||
who the filter is to be used for. So, what do we need in the filter? We need
|
||||
to filter the spots the user/node requires and also set a default rule for
|
||||
anything else outside the filter. Below is a simple filter that stops spots
|
||||
arriving from outside Europe.
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
$in = [
|
||||
[ 0, 4, 'a', '^(K|N|A|W|VE|VA|J)'], # 0 = drop, 'a' = alphanumeric
|
||||
[ 1, 0, 'd', 0, 1 ], # 1 = want, 'd' = everything else
|
||||
];
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>
|
||||
<P>So the filter is wrapped in between a pair of square brackets. This tells
|
||||
Spider to look in between these limits. Then each line is contained within
|
||||
its own square brackets and ends with a comma. Lets look carefully at the first
|
||||
line. The first element is 0 (drop). Therefore anything we put on this line
|
||||
will not be accepted. The next element is 4. This means we are filtering by
|
||||
the spotter. The third element is the letter "a" which tells the program to
|
||||
expect an alphanumeric expression in the fourth element. The fourth element
|
||||
is a list of letters separated by the pipe symbol.
|
||||
<P>
|
||||
<P>What this line does is tell the program to drop any spots posted by anyone in
|
||||
the USA, Canada or Japan.
|
||||
<P>
|
||||
<P>The second line is the default rule for anything else. The "d" tells us this
|
||||
and the line simply reads... accept anything else.
|
||||
<P>
|
||||
<P>You can add as many lines as you need to complete the filter but if there are
|
||||
several lines of the same type it is neater to enclose them all as one line.
|
||||
An example of this is where specific bands are set. We could write this like
|
||||
this ....
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
[ 0,0,'r',[1800.0, 2000.0], 1],
|
||||
[ 0,0,'r',[10100.0, 10150.0], 1],
|
||||
[ 0,0,'r',[14000.0, 14350.0], 1],
|
||||
[ 0,0,'r',[18000.0, 18200.0], 1],
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>
|
||||
<P>But the line below achieves the same thing and is more efficient ....
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
[ 0, 0, 'r',
|
||||
[
|
||||
1800.0, 2000.0, # top band
|
||||
10100.0, 10150.0, # WARC
|
||||
14000.0, 14350.0, # 20m
|
||||
18000.0, 18200.0, # WARC
|
||||
[ ,1 ],
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>
|
||||
<P>
|
||||
<H2><A NAME="ss2.2">2.2 Announcements</A>
|
||||
<H2><A NAME="ss2.1">2.1 Filtering Mail</A>
|
||||
</H2>
|
||||
|
||||
<P>In the /spider/msg directory you will find a file called badmsg.pl.issue. Rename
|
||||
this to badmsg.pl and edit the file. The original looks something like this ....
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
|
||||
# This is an example announce or filter allowing only West EU announces
|
||||
# the list of regexes for messages that we won't store having
|
||||
# received them (bear in mind that we must receive them fully before
|
||||
# we can bin them)
|
||||
|
||||
|
||||
# The format of each line is as follows
|
||||
|
||||
# type source pattern
|
||||
# P/B/F T/F/O/S regex
|
||||
|
||||
# type: P - private, B - bulletin (msg), F - file (ak1a bull)
|
||||
# source: T - to field, F - from field, O - origin, S - subject
|
||||
# pattern: a perl regex on the field requested
|
||||
|
||||
# Currently only type B and P msgs are affected by this code.
|
||||
#
|
||||
# The element list is:-
|
||||
# 0 - callsign of announcer
|
||||
# 1 - destination * = all, <callsign> = routed to the node
|
||||
# 2 - text
|
||||
# 3 - * - sysop, <some text> - special list eg 6MUK, ' ', normal announce
|
||||
# 4 - origin
|
||||
# 5 - 0 - announce, 1 - wx
|
||||
# 6 - channel callsign (the interface from which this spot came)
|
||||
# The list is read from the top down, the first pattern that matches
|
||||
# causes the action to be taken.
|
||||
|
||||
$in = [
|
||||
[ 1, 0, 'a', '^(P[ABCDE]|DK0WCY|G|M|2|EI|F|ON)' ],
|
||||
[ 0, 0, 'd', 0 ]
|
||||
];
|
||||
# The pattern can be undef or 0 in which case it will always be selected
|
||||
# for the action specified
|
||||
|
||||
|
||||
|
||||
package DXMsg;
|
||||
|
||||
@badmsg = (
|
||||
'B', 'T', 'SALE',
|
||||
'B', 'T', 'WANTED',
|
||||
'B', 'S', 'WANTED',
|
||||
'B', 'S', 'SALE',
|
||||
'B', 'S', 'WTB',
|
||||
'B', 'S', 'WTS',
|
||||
'B', 'T', 'FS',
|
||||
);
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>In this example, only the prefixes listed will be allowed. It is possible to
|
||||
be quite specific. The Dutch prefix "P" is followed by several secondary
|
||||
identifiers which are allowed. So, in the example, "PA" or "PE" would be ok
|
||||
but not "PG". It is even possible to allow information from a single callsign.
|
||||
In the example this is DK0WCY, to allow the posting of his Aurora Beacon.
|
||||
<P>
|
||||
<H2><A NAME="ss2.3">2.3 WWV</A>
|
||||
<P>I think this is fairly self explanatory. It is simply a list of subject
|
||||
headers that we do not want to pass on to either the users of the cluster or
|
||||
the other cluster nodes that we are linked to. This is usually because of
|
||||
rules and regulations pertaining to items for sale etc in a particular country.
|
||||
<P>
|
||||
<H2><A NAME="ss2.2">2.2 Filtering DX callouts (Depricated)</A>
|
||||
</H2>
|
||||
|
||||
<P><B><I>From version 1.47, this method is replaced by the command set/baddx</I></B>
|
||||
<P>
|
||||
<P>In the same way as mail, there are some types of spot we do not wish to pass on
|
||||
to users or linked cluster nodes. In the /spider/data directory you will find
|
||||
a file called baddx.pl.issue. Rename this to baddx.pl and edit the file. The
|
||||
original looks like this ....
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
|
||||
# This is an example WWV filter
|
||||
#
|
||||
# The element list is:-
|
||||
# 0 - nominal unix date of spot (ie the day + hour:13)
|
||||
# 1 - the hour
|
||||
# 2 - SFI
|
||||
# 3 - K
|
||||
# 4 - I
|
||||
# 5 - text
|
||||
# 6 - spotter
|
||||
# 7 - origin
|
||||
# 8 - incoming interface callsign
|
||||
# the list of dx spot addresses that we don't store and don't pass on
|
||||
|
||||
# this one doesn't filter, it just sets the hop count to 6 and is
|
||||
# used mainly just to override any isolation from WWV coming from
|
||||
# the internet.
|
||||
|
||||
$in = [
|
||||
[ 1, 0, 'd', 0, 6 ]
|
||||
];
|
||||
package DXProt;
|
||||
|
||||
@baddx = qw
|
||||
|
||||
FROG
|
||||
SALE
|
||||
FORSALE
|
||||
WANTED
|
||||
P1RATE
|
||||
PIRATE
|
||||
TEST
|
||||
DXTEST
|
||||
NIL
|
||||
NOCALL
|
||||
);
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>
|
||||
<P>It should be noted that the filter will start to be used only once a user/node
|
||||
has logged out and back in again.
|
||||
<P>I am not going to spend any more time on these filters now as they will become
|
||||
more "comprehensive" in the near future.
|
||||
<P>Again, this is simply a list of names we do not want to see in the spotted
|
||||
field of a DX callout.
|
||||
<P>
|
||||
<P>
|
||||
<H2><A NAME="ss2.3">2.3 Filtering words from text fields in Announce, Talk and DX spots</A>
|
||||
</H2>
|
||||
|
||||
<P>Create a file in /spider/data called <EM>badwords</EM>. The format is quite
|
||||
simple. Lines beginning with # are ignored so comments can be added. An
|
||||
example file is below ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
# Below is a list of words we do not wish to see on the cluster
|
||||
grunge grunged grunging
|
||||
splodge splodger splodging
|
||||
grince
|
||||
fluffle
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>Multiple words can be used on the same line as shown. Obviously these
|
||||
are just examples :-)
|
||||
<P>
|
||||
<P>You can reload the file from the cluster prompt as sysop with load/badwords.
|
||||
<P>
|
||||
<HR>
|
||||
<A HREF="adminmanual-3.html">Next</A>
|
||||
|
@ -2,7 +2,7 @@
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
|
||||
<TITLE>The DXSpider Administration Manual v1.47: Filtering (New Style v1.45 and later)</TITLE>
|
||||
<TITLE>The DXSpider Administration Manual v1.48: Mail</TITLE>
|
||||
<LINK HREF="adminmanual-4.html" REL=next>
|
||||
<LINK HREF="adminmanual-2.html" REL=previous>
|
||||
<LINK HREF="adminmanual.html#toc3" REL=contents>
|
||||
@ -13,223 +13,198 @@
|
||||
<A HREF="adminmanual-2.html">Previous</A>
|
||||
<A HREF="adminmanual.html#toc3">Contents</A>
|
||||
<HR>
|
||||
<H2><A NAME="s3">3. Filtering (New Style v1.45 and later)</A></H2>
|
||||
<H2><A NAME="s3">3. Mail</A></H2>
|
||||
|
||||
<H2><A NAME="ss3.1">3.1 General filter rules</A>
|
||||
<P>DXSpider deals seamlessly with standard AK1A type mail. It supports both
|
||||
personal and bulletin mail and the sysop has additional commands to ensure
|
||||
that mail gets to where it is meant. DXSpider will send mail almost
|
||||
immediately, assuming that the target is on line. However, only one
|
||||
mail message is dealt with at any one time. If a mail message is already
|
||||
being sent or recieved, then the new message will be queued until it has
|
||||
finished.
|
||||
<P>The cluster mail is automatically deleted after 30 days unless the sysop
|
||||
sets the "keep" flag using the <EM>msg</EM> command.
|
||||
<P>
|
||||
<H2><A NAME="ss3.1">3.1 Personal mail</A>
|
||||
</H2>
|
||||
|
||||
<P>Upto v1.44 it was not possible for the user to set their own filters. From
|
||||
v1.45 though that has all changed. It is now possible to set filters for just
|
||||
about anything you wish. If you have just updated from an older version of
|
||||
DXSpider you will need to update your new filters. You do not need to do
|
||||
anything with your old filters, they will be renamed as you update.
|
||||
<P>Personal mail is sent using the <EM>sp</EM> command. This is actually the
|
||||
default method of sending mail and so a simple <EM>s</EM> for send will do.
|
||||
A full list of the send commands and options is in the <EM>command set</EM>
|
||||
section, so I will not duplicate them here.
|
||||
<P>
|
||||
<P>There are 3 basic commands involved in setting and manipulating filters. These
|
||||
are <EM>accept</EM>, <EM>reject</EM> and <EM>clear</EM>. First we will look
|
||||
generally at filtering. There are a number of things you can filter in the
|
||||
DXSpider system. They all use the same general mechanism.
|
||||
<P>
|
||||
<P>In general terms you can create a 'reject' or an 'accept' filter which can have
|
||||
up to 10 lines in it. You do this using, for example ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
|
||||
accept/spots .....
|
||||
reject/spots .....
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>where ..... are the specific commands for that type of filter. There are filters
|
||||
for spots, wwv, announce, wcy and (for sysops) connects. See each different
|
||||
accept or reject command reference for more details.
|
||||
<P>There is also a command to clear out one or more lines in a filter. They are ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
clear/spots 1
|
||||
clear/spots all
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>There is clear/xxxx command for each type of filter.
|
||||
<P>
|
||||
<P>and you can check that your filters have worked by the command ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
|
||||
show/filter
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>
|
||||
<P>For now we are going to use spots for the examples, but you can apply the same
|
||||
principles to all types of filter.
|
||||
<P>
|
||||
<H2><A NAME="ss3.2">3.2 Types of filter</A>
|
||||
<H2><A NAME="ss3.2">3.2 Bulletin mail</A>
|
||||
</H2>
|
||||
|
||||
<P>There are two main types of filter, <EM>accept</EM> or <EM>reject</EM>. You
|
||||
can use either to achieve the result you want dependent on your own preference
|
||||
and which is more simple to do. It is pointless writing 8 lines of reject
|
||||
filters when 1 accept filter would do the same thing! Each filter has 10
|
||||
lines (of any length) which are tried in order. If a line matches then the
|
||||
action you have specified is taken (ie reject means ignore it and accept
|
||||
means take it)
|
||||
<P>Bulletin mail is sent by using the <EM>sb</EM> command. This is one of the
|
||||
most common mistakes users make when sending mail. They send a bulletin
|
||||
mail with <EM>s</EM> or <EM>sp</EM> instead of <EM>sb</EM> and of course
|
||||
the message never leaves the cluster. This can be rectified by the sysop
|
||||
by using the <EM>msg</EM> command.
|
||||
<P>
|
||||
<P>If you specify reject filters, then any lines that arrive that match the filter
|
||||
will be dumped but all else will be accepted. If you use an accept filter,
|
||||
then ONLY the lines in the filter will be accepted and all else will be dumped.
|
||||
For example if you have a single line <EM>accept</EM> filter ...
|
||||
<P>Bulletin addresses can be set using the Forward.pl file.
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
accept/spots on vhf and (by_zone 14,15,16 or call_zone 14,15,16)
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>then you will <EM>ONLY</EM> get VHF spots <EM>from</EM> or <EM>to</EM> CQ zones
|
||||
14, 15 and 16.
|
||||
<P>
|
||||
<P>If you set a reject filter like this ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
reject/spots on hf/cw
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>Then you will get everything <EM>EXCEPT</EM> HF CW spots. You could make this
|
||||
single filter even more flexible. For example, if you are interested in IOTA
|
||||
and will work it even on CW even though normally you are not interested in
|
||||
CW, then you could say ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
reject/spots on hf/cw and not info iota
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>But in that case you might only be interested in iota and say:-
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
accept/spots not on hf/cw or info iota
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>which achieves exactly the same thing. You should choose one or the other
|
||||
until you are comfortable with the way it works. You can mix them if you
|
||||
wish (actually you can have an accept AND a reject on the same line) but
|
||||
don't attempt this until you are sure you know what you are doing!
|
||||
<P>
|
||||
<P>You can arrange your filter lines into logical units, either for your own
|
||||
understanding or simply convenience. Here is an example ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
reject/spots 1 on hf/cw
|
||||
reject/spots 2 on 50000/1400000 not (by_zone 14,15,16 or call_zone 14,15,16)
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>What this does is to ignore all HF CW spots and also rejects any spots on VHF
|
||||
which don't either originate or spot someone in Europe.
|
||||
<P>
|
||||
<P>This is an example where you would use a line number (1 and 2 in this case), if
|
||||
you leave the digit out, the system assumes '1'. Digits '0'-'9' are available.
|
||||
This make it easier to see just what filters you have set. It also makes it
|
||||
more simple to remove individual filters, during a contest for example.
|
||||
<P>
|
||||
<P>You will notice in the above example that the second line has brackets. Look
|
||||
at the line logically. You can see there are 2 separate sections to it. We
|
||||
are saying reject spots that are VHF or above <EM>APART</EM> from those in
|
||||
zones 14, 15 and 16 (either spotted there or originated there). If you did
|
||||
not have the brackets to separate the 2 sections, then Spider would read it
|
||||
logically from the front and see a different expression entirely ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
(on 50000/1400000 and by_zone 14,15,16) or call_zone 14,15,16
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>The simple way to remember this is, if you use OR - use brackets. Whilst we are
|
||||
here CASE is not important. 'And BY_Zone' is just the same as 'and by_zone'.
|
||||
<P>As mentioned earlier, setting several filters can be more flexible than
|
||||
simply setting one complex one. Doing it in this way means that if you want
|
||||
to alter your filter you can just redefine or remove one or more lines of it or
|
||||
one line. For example ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
reject/spots 1 on hf/ssb
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>would redefine our earlier example, or
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
clear/spots 1
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>To remove all the filter lines in the spot filter ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
clear/spots all
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>
|
||||
<H2><A NAME="ss3.3">3.3 Filter options</A>
|
||||
<H2><A NAME="ss3.3">3.3 Forward.pl</A>
|
||||
</H2>
|
||||
|
||||
<P>You can filter in several different ways. The options are listed in the
|
||||
various helpfiles for accept, reject and filter.
|
||||
<P>
|
||||
<H2><A NAME="ss3.4">3.4 Default filters</A>
|
||||
</H2>
|
||||
|
||||
<P>Sometimes all that is needed is a general rule for node connects. This can
|
||||
be done with a node_default filter. This rule will always be followed, even
|
||||
if the link is isolated, unless another filter is set specifically. Default
|
||||
rules can be set for nodes and users. They can be set for spots, announces,
|
||||
WWV and WCY. They can also be used for hops. An example might look like
|
||||
this ...
|
||||
<P>DXSpider receives all and any mail sent to it without any alterations needed
|
||||
in files. Because personal and bulletin mail are treated differently, there
|
||||
is no need for a list of accepted bulletin addresses. It is necessary, however,
|
||||
to tell the program which links accept which bulletins. For example, it is
|
||||
pointless sending bulletins addresses to "UK" to any links other than UK
|
||||
ones. The file that does this is called forward.pl and lives in /spider/msg.
|
||||
At default, like other spider files it is named forward.pl.issue. Rename it
|
||||
to forward.pl and edit the file to match your requirements.
|
||||
The format is below ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
accept/spot node_default by_zone 14,15,16,20,33
|
||||
set/hops node_default spot 50
|
||||
#
|
||||
# this is an example message forwarding file for the system
|
||||
#
|
||||
# The format of each line is as follows
|
||||
#
|
||||
# type to/from/at pattern action destinations
|
||||
# P/B/F T/F/A regex I/F [ call [, call ...] ]
|
||||
#
|
||||
# type: P - private, B - bulletin (msg), F - file (ak1a bull)
|
||||
# to/from/at: T - to field, F - from field, A - home bbs, O - origin
|
||||
# pattern: a perl regex on the field requested
|
||||
# action: I - ignore, F - forward
|
||||
# destinations: a reference to an array containing node callsigns
|
||||
#
|
||||
# if it is non-private and isn't in here then it won't get forwarded
|
||||
#
|
||||
# Currently only type B msgs are affected by this code.
|
||||
#
|
||||
# The list is read from the top down, the first pattern that matches
|
||||
# causes the action to be taken.
|
||||
#
|
||||
# The pattern can be undef or 0 in which case it will always be selected
|
||||
# for the action specified
|
||||
#
|
||||
# If the BBS list is undef or 0 and the action is 'F' (and it matches the
|
||||
# pattern) then it will always be forwarded to every node that doesn't have
|
||||
# it (I strongly recommend you don't use this unless you REALLY mean it, if
|
||||
# you allow a new link with this on EVERY bull will be forwarded immediately
|
||||
# on first connection)
|
||||
#
|
||||
|
||||
package DXMsg;
|
||||
|
||||
@forward = (
|
||||
'B', 'T', 'LOCAL', 'F', [ qw(GB7MBC) ],
|
||||
'B', 'T', 'ALL', 'F', [ qw(GB7BAA GB7ADX PA4AB-14) ],
|
||||
'B', 'T', 'UK', 'F', [ qw(GB7BAA GB7ADX) ],
|
||||
'B', 'T', 'QSL', 'F', [ qw(GB7BAA GB7ADX PA4AB-14) ],
|
||||
'B', 'T', 'QSLINF', 'F', [ qw(GB7BAA GB7ADX PA4AB-14) ],
|
||||
'B', 'T', 'DX', 'F', [ qw(GB7BAA GB7ADX PA4AB-14) ],
|
||||
'B', 'T', 'DXINFO', 'F', [ qw(GB7BAA GB7ADX PA4AB-14) ],
|
||||
'B', 'T', 'DXNEWS', 'F', [ qw(GB7BAA GB7ADX PA4AB-14) ],
|
||||
'B', 'T', 'DXQSL', 'F', [ qw(GB7BAA GB7ADX PA4AB-14) ],
|
||||
'B', 'T', 'SYSOP', 'F', [ qw(GB7BAA GB7ADX) ],
|
||||
'B', 'T', '50MHZ', 'F', [ qw(GB7BAA GB7ADX PA4AB-14) ],
|
||||
);
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>This filter is for spots only, you could set others for announce, WWV and WCY.
|
||||
This filter would work for ALL nodes unless a specific filter is written to
|
||||
override it for a particular node. You can also set a user_default should
|
||||
you require. It is important to note that default filters should be
|
||||
considered to be "connected". By this I mean that should you override the
|
||||
default filter for spots, you need to add a rule for the hops for spots also.
|
||||
<P>Simply insert a bulletin address and state in the brackets where you wish
|
||||
that mail to go. For example, you can see here that mail sent to "UK" will
|
||||
only be sent to the UK links and not to PA4AB-14.
|
||||
<P>
|
||||
<H2><A NAME="ss3.5">3.5 Advanced filtering</A>
|
||||
<P>To force the cluster to reread the file use load/forward
|
||||
<P>
|
||||
<P>
|
||||
<H2><A NAME="ss3.4">3.4 The msg command</A>
|
||||
</H2>
|
||||
|
||||
<P>Once you are happy with the results you get, you may like to experiment.
|
||||
<P>
|
||||
<P>The previous example that filters hf/cw spots and accepts vhf/uhf spots from EU
|
||||
can be written with a mixed filter, for example ...
|
||||
<P>The <EM>msg</EM> command is a very powerful and flexible tool for the
|
||||
sysop. It allows the sysop to alter to and from fields and make other
|
||||
changes to manage the cluster mail.
|
||||
<P>Here is a full list of the various options ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
rej/spot on hf/cw
|
||||
acc/spot on 0/30000
|
||||
acc/spot 2 on 50000/1400000 and (by_zone 14,15,16 or call_zone 14,15,16)
|
||||
MSG TO <msgno> <call> - change TO callsign to <call>
|
||||
MSG FRom <msgno> <call> - change FROM callsign to <call>
|
||||
MSG PRrivate <msgno> - set private flag
|
||||
MSG NOPRrivate <msgno> - unset private flag
|
||||
MSG RR <msgno> - set RR flag
|
||||
MSG NORR <msgno> - unset RR flag
|
||||
MSG KEep <msgno> - set the keep flag (message won't be deleted ever)
|
||||
MSG NOKEep <msgno> - unset the keep flag
|
||||
MSG SUbject <msgno> <new> - change the subject to <new>
|
||||
MSG WAittime <msgno> - remove any waiting time for this message
|
||||
MSG NOREad <msgno> - mark message as unread
|
||||
MSG REad <msgno> - mark message as read
|
||||
MSG QUeue - queue any outstanding bulletins
|
||||
MSG QUeue 1 - queue any outstanding private messages
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>Note that the first filter has not been specified with a number. This will
|
||||
automatically be assumed to be number 1. In this case, we have said <EM>reject all
|
||||
HF spots in the CW section of the bands but accept all others at HF. Also
|
||||
accept anything in VHF and above spotted in or by operators in the zones
|
||||
14, 15 and 16</EM>. Each filter slot actually has a 'reject' slot and
|
||||
an 'accept' slot. The reject slot is executed BEFORE the accept slot.
|
||||
<P>These commands are simply typed from within the cluster as the sysop user.
|
||||
<P>
|
||||
<P>It was mentioned earlier that after a reject test that doesn't match, the default
|
||||
for following tests is 'accept', the reverse is true for 'accept'. In the example
|
||||
what happens is that the reject is executed first, any non hf/cw spot is passed
|
||||
to the accept line, which lets through everything else on HF. The next filter line
|
||||
lets through just VHF/UHF spots from EU.
|
||||
<H2><A NAME="ss3.5">3.5 Message status</A>
|
||||
</H2>
|
||||
|
||||
<P>You can check on a message from within the cluster by using the command
|
||||
<EM>stat/msg</EM>. This will give you additional information on the
|
||||
message number including which nodes have received it, which node it
|
||||
was received from and when etc. Here is an example of the output of
|
||||
the command ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
G0VGS de GB7MBC 28-Jan-2001 1308Z >
|
||||
stat/msg 6869
|
||||
From: GB7DJK
|
||||
Msg Time: 26-Jan-2001 1302Z
|
||||
Msgno: 6869
|
||||
Origin: GB7DJK
|
||||
Size: 8012
|
||||
Subject: AMSAT 2line KEPS 01025.AMSAT
|
||||
To: UK
|
||||
Got it Nodes: GB7BAA, GB7ADX
|
||||
Private: 0
|
||||
Read Confirm: 0
|
||||
Times read: 0
|
||||
G0VGS de GB7MBC 28-Jan-2001 1308Z >
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>
|
||||
<H2><A NAME="ss3.6">3.6 Filtering mail</A>
|
||||
</H2>
|
||||
|
||||
<P>This is described in the section on <EM>Other filters</EM> so I will not
|
||||
duplicate it here.
|
||||
<P>
|
||||
<H2><A NAME="ss3.7">3.7 Distribution lists</A>
|
||||
</H2>
|
||||
|
||||
<P>Distribution lists are simply a list of users to send certain types of
|
||||
mail to. An example of this is mail you only wish to send to other
|
||||
sysops. In /spider/msg there is a directory called <EM>distro</EM>. You
|
||||
put any distibution lists in here. For example, here is a file called
|
||||
SYSOP.pl that caters for the UK sysops.
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
qw(GB7TLH GB7DJK GB7DXM GB7CDX GB7BPQ GB7DXN GB7MBC GB7MBC-6 GB7MDX
|
||||
GB7NDX GB7SDX GB7TDX GB7UDX GB7YDX GB7ADX GB7BAA GB7DXA GB7DXH
|
||||
GB7DXK GB7DXI GB7DXS)
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>Any mail sent to "sysop" would only be sent to the callsigns in this list.
|
||||
<P>
|
||||
<H2><A NAME="ss3.8">3.8 BBS interface</A>
|
||||
</H2>
|
||||
|
||||
<P>Spider provides a simple BBS interface. No input is required from the sysop
|
||||
of the cluster at all. The BBS simply sets the cluster as a BBS and pushes
|
||||
any required mail to the cluster. No mail can flow from Spider to the BBS,
|
||||
the interface is one-way.
|
||||
<P>
|
||||
<P>Please be careful not to flood the cluster network with unnecessary mail.
|
||||
Make sure you only send mail to the clusters that want it by using the
|
||||
Forward.pl file very carefully.
|
||||
<P>
|
||||
<HR>
|
||||
<A HREF="adminmanual-4.html">Next</A>
|
||||
|
@ -2,7 +2,7 @@
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
|
||||
<TITLE>The DXSpider Administration Manual v1.47: Other filters</TITLE>
|
||||
<TITLE>The DXSpider Administration Manual v1.48: Databases</TITLE>
|
||||
<LINK HREF="adminmanual-5.html" REL=next>
|
||||
<LINK HREF="adminmanual-3.html" REL=previous>
|
||||
<LINK HREF="adminmanual.html#toc4" REL=contents>
|
||||
@ -13,118 +13,129 @@
|
||||
<A HREF="adminmanual-3.html">Previous</A>
|
||||
<A HREF="adminmanual.html#toc4">Contents</A>
|
||||
<HR>
|
||||
<H2><A NAME="s4">4. Other filters</A></H2>
|
||||
<H2><A NAME="s4">4. Databases</A></H2>
|
||||
|
||||
<H2><A NAME="ss4.1">4.1 Filtering Mail</A>
|
||||
<P>Spider allows the creation of local or remote databases. It supports
|
||||
chained databases, allowing several different databases to be scanned
|
||||
with one simple command. Importing of databases is limited at present
|
||||
to the standard AK1A databases such as OBLAST and the DB0SDX QSL
|
||||
database but will expand with time.
|
||||
<P>
|
||||
<H2><A NAME="ss4.1">4.1 Creating databases</A>
|
||||
</H2>
|
||||
|
||||
<P>In the /spider/msg directory you will find a file called badmsg.pl.issue. Rename
|
||||
this to badmsg.pl and edit the file. The original looks something like this ....
|
||||
<P>Creating a database could not be more simple. All the commands are
|
||||
sent from the cluster prompt as the <EM>sysop</EM> user.
|
||||
<P>To create a database you use the command <EM>dbcreate</EM>. It can
|
||||
be used in 3 different ways like so ..
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
|
||||
# the list of regexes for messages that we won't store having
|
||||
# received them (bear in mind that we must receive them fully before
|
||||
# we can bin them)
|
||||
|
||||
|
||||
# The format of each line is as follows
|
||||
|
||||
# type source pattern
|
||||
# P/B/F T/F/O/S regex
|
||||
|
||||
# type: P - private, B - bulletin (msg), F - file (ak1a bull)
|
||||
# source: T - to field, F - from field, O - origin, S - subject
|
||||
# pattern: a perl regex on the field requested
|
||||
|
||||
# Currently only type B and P msgs are affected by this code.
|
||||
#
|
||||
# The list is read from the top down, the first pattern that matches
|
||||
# causes the action to be taken.
|
||||
|
||||
# The pattern can be undef or 0 in which case it will always be selected
|
||||
# for the action specified
|
||||
|
||||
|
||||
|
||||
package DXMsg;
|
||||
|
||||
@badmsg = (
|
||||
'B', 'T', 'SALE',
|
||||
'B', 'T', 'WANTED',
|
||||
'B', 'S', 'WANTED',
|
||||
'B', 'S', 'SALE',
|
||||
'B', 'S', 'WTB',
|
||||
'B', 'S', 'WTS',
|
||||
'B', 'T', 'FS',
|
||||
);
|
||||
dbcreate <name>
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>
|
||||
<P>I think this is fairly self explanatory. It is simply a list of subject
|
||||
headers that we do not want to pass on to either the users of the cluster or
|
||||
the other cluster nodes that we are linked to. This is usually because of
|
||||
rules and regulations pertaining to items for sale etc in a particular country.
|
||||
<P>
|
||||
<H2><A NAME="ss4.2">4.2 Filtering DX callouts (Depricated)</A>
|
||||
</H2>
|
||||
|
||||
<P><B><I>From version 1.47, this method is replaced by the command set/baddx</I></B>
|
||||
<P>
|
||||
<P>In the same way as mail, there are some types of spot we do not wish to pass on
|
||||
to users or linked cluster nodes. In the /spider/data directory you will find
|
||||
a file called baddx.pl.issue. Rename this to baddx.pl and edit the file. The
|
||||
original looks like this ....
|
||||
<P>To simply create a database locally, you just tell the command the
|
||||
name of the database. This does not create the actual database, it
|
||||
simply defines it to say that it exists.
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
|
||||
# the list of dx spot addresses that we don't store and don't pass on
|
||||
|
||||
|
||||
package DXProt;
|
||||
|
||||
@baddx = qw
|
||||
|
||||
FROG
|
||||
SALE
|
||||
FORSALE
|
||||
WANTED
|
||||
P1RATE
|
||||
PIRATE
|
||||
TEST
|
||||
DXTEST
|
||||
NIL
|
||||
NOCALL
|
||||
);
|
||||
dbcreate <name> chain <name> [<name>...]
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>
|
||||
<P>Again, this is simply a list of names we do not want to see in the spotted
|
||||
field of a DX callout.
|
||||
<P>
|
||||
<P>
|
||||
<H2><A NAME="ss4.3">4.3 Filtering words from text fields in Announce, Talk and DX spots</A>
|
||||
</H2>
|
||||
|
||||
<P>Create a file in /spider/data called <EM>badwords</EM>. The format is quite
|
||||
simple. Lines beginning with # are ignored so comments can be added. An
|
||||
example file is below ...
|
||||
<P>This creates a chained database entry. The first database will be
|
||||
scanned, then the second, the third etc...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
# Below is a list of words we do not wish to see on the cluster
|
||||
grunge grunged grunging
|
||||
splodge splodger splodging
|
||||
grince
|
||||
fluffle
|
||||
dbcreate <name> remote <name>
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>Multiple words can be used on the same line as shown. Obviously these
|
||||
are just examples :-)
|
||||
<P>This creates a remote entry. the first name field is the database
|
||||
name at the remote node, then the remote switch, then the actual
|
||||
node_call of the remote node, for example...
|
||||
<P>
|
||||
<P>You can reload the file from the cluster prompt as sysop with load/badwords.
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
dbcreate buckmaster remote gb7dxc
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>Remote databases cannot be chained, however, the last database in a
|
||||
chain can be a remote database.
|
||||
<P>
|
||||
<H2><A NAME="ss4.2">4.2 Importing databases</A>
|
||||
</H2>
|
||||
|
||||
<P>The only databases that Spider can currently import are the standard
|
||||
AK1A databases such as OBLAST or the DB0SDX qsl and address database.
|
||||
This will be added to with time.
|
||||
<P>To import such a database, first put the file somewhere useful like /tmp
|
||||
and then issue the following command ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
dbimport oblast /tmp/OBLAST.FUL
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>This will update the existing local oblast database or create it if
|
||||
it does not exist.
|
||||
<P>
|
||||
<H2><A NAME="ss4.3">4.3 Checking available databases</A>
|
||||
</H2>
|
||||
|
||||
<P>Once a database is created, you will want to check that it has been
|
||||
added. To do this use the <EM>dbavail</EM> command. This will
|
||||
output the available databases. For example ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
dbavail
|
||||
DB Name Location Chain
|
||||
qsl Local
|
||||
buck GB7ADX
|
||||
hftest GB7DXM
|
||||
G0VGS de GB7MBC 3-Feb-2001 1925Z >
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>
|
||||
<H2><A NAME="ss4.4">4.4 Looking up databases</A>
|
||||
</H2>
|
||||
|
||||
<P>To look for information in a defined database, simply use the <EM>dbshow</EM>
|
||||
command, for example ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
dbshow buckmaster G0YLM
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>will show the information for the callsign G0YLM from the buckmaster
|
||||
database if it exists. To make things more standard for the users
|
||||
you can add an entry in the Aliases file so that it looks like a standard
|
||||
<EM>show</EM> command like this ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
'^sh\w*/buc', 'dbshow buckmaster', 'dbshow',
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>Now you can simply use show/buckmaster or an abreviation.
|
||||
<P>
|
||||
<H2><A NAME="ss4.5">4.5 Removing databases</A>
|
||||
</H2>
|
||||
|
||||
<P>To delete an existing database you use the <EM>dbremove</EM> command.
|
||||
For example ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
dbremove oblast
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>would remove the oblast database and its associated datafile from the
|
||||
system. There are no warnings or recovery possible from this command.
|
||||
If you remove a database it ceases to exist and would have to be created
|
||||
from scratch if you still required it.
|
||||
<P>
|
||||
<HR>
|
||||
<A HREF="adminmanual-5.html">Next</A>
|
||||
|
@ -2,7 +2,7 @@
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
|
||||
<TITLE>The DXSpider Administration Manual v1.47: Mail</TITLE>
|
||||
<TITLE>The DXSpider Administration Manual v1.48: Information, files and useful programs</TITLE>
|
||||
<LINK HREF="adminmanual-6.html" REL=next>
|
||||
<LINK HREF="adminmanual-4.html" REL=previous>
|
||||
<LINK HREF="adminmanual.html#toc5" REL=contents>
|
||||
@ -13,198 +13,333 @@
|
||||
<A HREF="adminmanual-4.html">Previous</A>
|
||||
<A HREF="adminmanual.html#toc5">Contents</A>
|
||||
<HR>
|
||||
<H2><A NAME="s5">5. Mail</A></H2>
|
||||
<H2><A NAME="s5">5. Information, files and useful programs</A></H2>
|
||||
|
||||
<P>DXSpider deals seamlessly with standard AK1A type mail. It supports both
|
||||
personal and bulletin mail and the sysop has additional commands to ensure
|
||||
that mail gets to where it is meant. DXSpider will send mail almost
|
||||
immediately, assuming that the target is on line. However, only one
|
||||
mail message is dealt with at any one time. If a mail message is already
|
||||
being sent or recieved, then the new message will be queued until it has
|
||||
finished.
|
||||
<P>The cluster mail is automatically deleted after 30 days unless the sysop
|
||||
sets the "keep" flag using the <EM>msg</EM> command.
|
||||
<P>
|
||||
<H2><A NAME="ss5.1">5.1 Personal mail</A>
|
||||
<H2><A NAME="ss5.1">5.1 MOTD</A>
|
||||
</H2>
|
||||
|
||||
<P>Personal mail is sent using the <EM>sp</EM> command. This is actually the
|
||||
default method of sending mail and so a simple <EM>s</EM> for send will do.
|
||||
A full list of the send commands and options is in the <EM>command set</EM>
|
||||
section, so I will not duplicate them here.
|
||||
<P>One of the more important things a cluster sysop needs to do is to get
|
||||
information to his users. The simplest way to do this is to have a banner
|
||||
that is sent to the user on login. This is know as a "message of the day"
|
||||
or "motd". To set this up, simply create a file in /spider/data called motd
|
||||
and edit it to say whatever you want. It is purely a text file and will be
|
||||
sent automatically to anyone logging in to the cluster.
|
||||
<P>
|
||||
<H2><A NAME="ss5.2">5.2 Bulletin mail</A>
|
||||
<H2><A NAME="ss5.2">5.2 Downtime message</A>
|
||||
</H2>
|
||||
|
||||
<P>Bulletin mail is sent by using the <EM>sb</EM> command. This is one of the
|
||||
most common mistakes users make when sending mail. They send a bulletin
|
||||
mail with <EM>s</EM> or <EM>sp</EM> instead of <EM>sb</EM> and of course
|
||||
the message never leaves the cluster. This can be rectified by the sysop
|
||||
by using the <EM>msg</EM> command.
|
||||
<P>If for any reason the cluster is down, maybe for upgrade or maintenance but
|
||||
the machine is still running, a message can be sent to the user advising them
|
||||
of the fact. This message lives in the /spider/data directory and is called
|
||||
"offline". Simply create the file and edit it to say whatever you wish.
|
||||
This file will be sent to a user attempting to log into the cluster when
|
||||
DXSpider is not actually running.
|
||||
<P>
|
||||
<P>Bulletin addresses can be set using the Forward.pl file.
|
||||
<P>
|
||||
<H2><A NAME="ss5.3">5.3 Forward.pl</A>
|
||||
<H2><A NAME="ss5.3">5.3 Other text messages</A>
|
||||
</H2>
|
||||
|
||||
<P>DXSpider receives all and any mail sent to it without any alterations needed
|
||||
in files. Because personal and bulletin mail are treated differently, there
|
||||
is no need for a list of accepted bulletin addresses. It is necessary, however,
|
||||
to tell the program which links accept which bulletins. For example, it is
|
||||
pointless sending bulletins addresses to "UK" to any links other than UK
|
||||
ones. The file that does this is called forward.pl and lives in /spider/msg.
|
||||
At default, like other spider files it is named forward.pl.issue. Rename it
|
||||
to forward.pl and edit the file to match your requirements.
|
||||
The format is below ...
|
||||
<P>You can set other text messages to be read by the user if they input the file
|
||||
name. This could be for news items or maybe information for new users.
|
||||
To set this up, make a directory under /spider called <EM>packclus</EM>.
|
||||
Under this directory you can create files called <EM>news</EM> or <EM>newuser</EM>
|
||||
for example. In fact you can create files with any names you like. These can
|
||||
be listed by the user with the command ....
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
#
|
||||
# this is an example message forwarding file for the system
|
||||
#
|
||||
# The format of each line is as follows
|
||||
#
|
||||
# type to/from/at pattern action destinations
|
||||
# P/B/F T/F/A regex I/F [ call [, call ...] ]
|
||||
#
|
||||
# type: P - private, B - bulletin (msg), F - file (ak1a bull)
|
||||
# to/from/at: T - to field, F - from field, A - home bbs, O - origin
|
||||
# pattern: a perl regex on the field requested
|
||||
# action: I - ignore, F - forward
|
||||
# destinations: a reference to an array containing node callsigns
|
||||
#
|
||||
# if it is non-private and isn't in here then it won't get forwarded
|
||||
#
|
||||
# Currently only type B msgs are affected by this code.
|
||||
#
|
||||
# The list is read from the top down, the first pattern that matches
|
||||
# causes the action to be taken.
|
||||
#
|
||||
# The pattern can be undef or 0 in which case it will always be selected
|
||||
# for the action specified
|
||||
#
|
||||
# If the BBS list is undef or 0 and the action is 'F' (and it matches the
|
||||
# pattern) then it will always be forwarded to every node that doesn't have
|
||||
# it (I strongly recommend you don't use this unless you REALLY mean it, if
|
||||
# you allow a new link with this on EVERY bull will be forwarded immediately
|
||||
# on first connection)
|
||||
#
|
||||
|
||||
package DXMsg;
|
||||
|
||||
@forward = (
|
||||
'B', 'T', 'LOCAL', 'F', [ qw(GB7MBC) ],
|
||||
'B', 'T', 'ALL', 'F', [ qw(GB7BAA GB7ADX PA4AB-14) ],
|
||||
'B', 'T', 'UK', 'F', [ qw(GB7BAA GB7ADX) ],
|
||||
'B', 'T', 'QSL', 'F', [ qw(GB7BAA GB7ADX PA4AB-14) ],
|
||||
'B', 'T', 'QSLINF', 'F', [ qw(GB7BAA GB7ADX PA4AB-14) ],
|
||||
'B', 'T', 'DX', 'F', [ qw(GB7BAA GB7ADX PA4AB-14) ],
|
||||
'B', 'T', 'DXINFO', 'F', [ qw(GB7BAA GB7ADX PA4AB-14) ],
|
||||
'B', 'T', 'DXNEWS', 'F', [ qw(GB7BAA GB7ADX PA4AB-14) ],
|
||||
'B', 'T', 'DXQSL', 'F', [ qw(GB7BAA GB7ADX PA4AB-14) ],
|
||||
'B', 'T', 'SYSOP', 'F', [ qw(GB7BAA GB7ADX) ],
|
||||
'B', 'T', '50MHZ', 'F', [ qw(GB7BAA GB7ADX PA4AB-14) ],
|
||||
);
|
||||
show/files
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>Simply insert a bulletin address and state in the brackets where you wish
|
||||
that mail to go. For example, you can see here that mail sent to "UK" will
|
||||
only be sent to the UK links and not to PA4AB-14.
|
||||
<P>
|
||||
<P>To force the cluster to reread the file use load/forward
|
||||
<P>
|
||||
<P>
|
||||
<H2><A NAME="ss5.4">5.4 The msg command</A>
|
||||
</H2>
|
||||
|
||||
<P>The <EM>msg</EM> command is a very powerful and flexible tool for the
|
||||
sysop. It allows the sysop to alter to and from fields and make other
|
||||
changes to manage the cluster mail.
|
||||
<P>Here is a full list of the various options ...
|
||||
<P>They can be read by the user by typing the command ....
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
MSG TO <msgno> <call> - change TO callsign to <call>
|
||||
MSG FRom <msgno> <call> - change FROM callsign to <call>
|
||||
MSG PRrivate <msgno> - set private flag
|
||||
MSG NOPRrivate <msgno> - unset private flag
|
||||
MSG RR <msgno> - set RR flag
|
||||
MSG NORR <msgno> - unset RR flag
|
||||
MSG KEep <msgno> - set the keep flag (message won't be deleted ever)
|
||||
MSG NOKEep <msgno> - unset the keep flag
|
||||
MSG SUbject <msgno> <new> - change the subject to <new>
|
||||
MSG WAittime <msgno> - remove any waiting time for this message
|
||||
MSG NOREad <msgno> - mark message as unread
|
||||
MSG REad <msgno> - mark message as read
|
||||
MSG QUeue - queue any outstanding bulletins
|
||||
MSG QUeue 1 - queue any outstanding private messages
|
||||
type news
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>These commands are simply typed from within the cluster as the sysop user.
|
||||
<P>If the file they want to read is called <EM>news</EM>. You could also set
|
||||
an alias for this in the Alias file to allow them just to type <EM>news</EM>
|
||||
<P>
|
||||
<H2><A NAME="ss5.5">5.5 Message status</A>
|
||||
</H2>
|
||||
|
||||
<P>You can check on a message from within the cluster by using the command
|
||||
<EM>stat/msg</EM>. This will give you additional information on the
|
||||
message number including which nodes have received it, which node it
|
||||
was received from and when etc. Here is an example of the output of
|
||||
the command ...
|
||||
<P>You can also store other information in this directory, either directly or
|
||||
nested under directories. One use for this would be to store DX bulletins
|
||||
such as the OPDX bulletins. These can be listed and read by the user.
|
||||
To keep things tidy, make a directory under /spider/packclus called
|
||||
<EM>bulletin</EM>. Now copy any OPDX or similar bulletins into it. These
|
||||
can be listed by the user in the same way as above using the <EM>show/files</EM>
|
||||
command with an extension for the bulletin directory you have just created,
|
||||
like this ....
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
G0VGS de GB7MBC 28-Jan-2001 1308Z >
|
||||
stat/msg 6869
|
||||
From: GB7DJK
|
||||
Msg Time: 26-Jan-2001 1302Z
|
||||
Msgno: 6869
|
||||
Origin: GB7DJK
|
||||
Size: 8012
|
||||
Subject: AMSAT 2line KEPS 01025.AMSAT
|
||||
To: UK
|
||||
Got it Nodes: GB7BAA, GB7ADX
|
||||
Private: 0
|
||||
Read Confirm: 0
|
||||
Times read: 0
|
||||
G0VGS de GB7MBC 28-Jan-2001 1308Z >
|
||||
show/files bulletin
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>
|
||||
<H2><A NAME="ss5.6">5.6 Filtering mail</A>
|
||||
</H2>
|
||||
|
||||
<P>This is described in the section on <EM>Other filters</EM> so I will not
|
||||
duplicate it here.
|
||||
<P>
|
||||
<H2><A NAME="ss5.7">5.7 Distribution lists</A>
|
||||
</H2>
|
||||
|
||||
<P>Distribution lists are simply a list of users to send certain types of
|
||||
mail to. An example of this is mail you only wish to send to other
|
||||
sysops. In /spider/msg there is a directory called <EM>distro</EM>. You
|
||||
put any distibution lists in here. For example, here is a file called
|
||||
SYSOP.pl that caters for the UK sysops.
|
||||
<P>An example would look like this ....
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
qw(GB7TLH GB7DJK GB7DXM GB7CDX GB7BPQ GB7DXN GB7MBC GB7MBC-6 GB7MDX
|
||||
GB7NDX GB7SDX GB7TDX GB7UDX GB7YDX GB7ADX GB7BAA GB7DXA GB7DXH
|
||||
GB7DXK GB7DXI GB7DXS)
|
||||
sh/files
|
||||
bulletin DIR 20-Dec-1999 1715Z news 1602 14-Dec-1999 1330Z
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>Any mail sent to "sysop" would only be sent to the callsigns in this list.
|
||||
<P>You can see that in the files area (basically the packclus directory) there is a
|
||||
file called <EM>news</EM> and a directory called <EM>bulletin</EM>. You can
|
||||
also see that dates they were created. In the case of the file <EM>news</EM>,
|
||||
you can also see the time it was last modified, a good clue as to whether the
|
||||
file has been updated since you last read it. To read the file called
|
||||
<EM>news</EM> you would simply issue the command ....
|
||||
<P>
|
||||
<H2><A NAME="ss5.8">5.8 BBS interface</A>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
type news
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>To look what is in the bulletin directory you issue the command ....
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
show/files bulletin
|
||||
opdx390 21381 29-Nov-1999 1621Z opdx390.1 1670 29-Nov-1999 1621Z
|
||||
opdx390.2 2193 29-Nov-1999 1621Z opdx391 25045 29-Nov-1999 1621Z
|
||||
opdx392 35969 29-Nov-1999 1621Z opdx393 15023 29-Nov-1999 1621Z
|
||||
opdx394 33429 29-Nov-1999 1621Z opdx394.1 3116 29-Nov-1999 1621Z
|
||||
opdx395 24319 29-Nov-1999 1621Z opdx396 32647 29-Nov-1999 1621Z
|
||||
opdx396.1 5537 29-Nov-1999 1621Z opdx396.2 6242 29-Nov-1999 1621Z
|
||||
opdx397 18433 29-Nov-1999 1621Z opdx398 19961 29-Nov-1999 1621Z
|
||||
opdx399 17719 29-Nov-1999 1621Z opdx400 19600 29-Nov-1999 1621Z
|
||||
opdx401 27738 29-Nov-1999 1621Z opdx402 18698 29-Nov-1999 1621Z
|
||||
opdx403 24994 29-Nov-1999 1621Z opdx404 15685 29-Nov-1999 1621Z
|
||||
opdx405 13984 29-Nov-1999 1621Z opdx405.1 4166 29-Nov-1999 1621Z
|
||||
opdx406 28934 29-Nov-1999 1621Z opdx407 24153 29-Nov-1999 1621Z
|
||||
opdx408 15081 29-Nov-1999 1621Z opdx409 23234 29-Nov-1999 1621Z
|
||||
Press Enter to continue, A to abort (16 lines) >
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>You can now read any file in this directory using the type command, like this ....
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
type bulletin/opdx391
|
||||
Ohio/Penn DX Bulletin No. 391
|
||||
The Ohio/Penn Dx PacketCluster
|
||||
DX Bulletin No. 391
|
||||
BID: $OPDX.391
|
||||
January 11, 1999
|
||||
Editor Tedd Mirgliotta, KB8NW
|
||||
Provided by BARF-80 BBS Cleveland, Ohio
|
||||
Online at 440-237-8208 28.8k-1200 Baud 8/N/1 (New Area Code!)
|
||||
Thanks to the Northern Ohio Amateur Radio Society, Northern Ohio DX
|
||||
Association, Ohio/Penn PacketCluster Network, K1XN & Golist, WB2RAJ/WB2YQH
|
||||
& The 59(9) DXReport, W3UR & The Daily DX, K3TEJ, KN4UG, W4DC, NC6J, N6HR,
|
||||
Press Enter to continue, A to abort (508 lines) >
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>The page length will of course depend on what you have it set to!
|
||||
<P>
|
||||
<H2><A NAME="ss5.4">5.4 The Aliases file</A>
|
||||
</H2>
|
||||
|
||||
<P>Spider provides a simple BBS interface. No input is required from the sysop
|
||||
of the cluster at all. The BBS simply sets the cluster as a BBS and pushes
|
||||
any required mail to the cluster. No mail can flow from Spider to the BBS,
|
||||
the interface is one-way.
|
||||
<P>You will find a file in /spider/cmd/ called Aliases. First, copy this file to
|
||||
/spider/local_cmd/Aliases and edit this file. You will see something like this ...
|
||||
<P>
|
||||
<P>Please be careful not to flood the cluster network with unnecessary mail.
|
||||
Make sure you only send mail to the clusters that want it by using the
|
||||
Forward.pl file very carefully.
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
|
||||
#!/usr/bin/perl
|
||||
|
||||
# provide some standard aliases for commands for terminally
|
||||
# helpless ak1a user (helpless in the sense that they never
|
||||
# read nor understand help files)
|
||||
|
||||
# This file is automagically reloaded if its modification time is
|
||||
# later than the one stored in CmdAlias.pm
|
||||
|
||||
# PLEASE make this file consistant with reality! (the patterns MUST
|
||||
# match the filenames!)
|
||||
|
||||
# Don't alter this file, copy it into the local_cmd tree and modify it.
|
||||
# This file will be replaced everytime I issue a new release.
|
||||
|
||||
# You only need to put aliases in here for commands that don't work as
|
||||
# you desire naturally, e.g sh/dx on its own just works as you expect
|
||||
# so you need not add it as an alias.
|
||||
|
||||
|
||||
|
||||
package CmdAlias;
|
||||
|
||||
%alias = (
|
||||
'?' => [
|
||||
'^\?', 'apropos', 'apropos',
|
||||
],
|
||||
'a' => [
|
||||
'^ann.*/full', 'announce full', 'announce',
|
||||
'^ann.*/sysop', 'announce sysop', 'announce',
|
||||
'^ann.*/(.*)$', 'announce $1', 'announce',
|
||||
],
|
||||
'b' => [
|
||||
],
|
||||
'c' => [
|
||||
],
|
||||
'd' => [
|
||||
'^del', 'kill', 'kill',
|
||||
'^del\w*/fu', 'kill full', 'kill',
|
||||
'^di\w*/a\w*', 'directory all', 'directory',
|
||||
'^di\w*/b\w*', 'directory bulletins', 'directory',
|
||||
'^di\w*/n\w*', 'directory new', 'directory',
|
||||
'^di\w*/o\w*', 'directory own', 'directory',
|
||||
'^di\w*/s\w*', 'directory subject', 'directory',
|
||||
'^di\w*/t\w*', 'directory to', 'directory',
|
||||
'^di\w*/f\w*', 'directory from', 'directory',
|
||||
'^di\w*/(\d+)', 'directory $1', 'directory',
|
||||
],
|
||||
'e' => [
|
||||
],
|
||||
'f' => [
|
||||
],
|
||||
'g' => [
|
||||
],
|
||||
'h' => [
|
||||
],
|
||||
'i' => [
|
||||
],
|
||||
'j' => [
|
||||
],
|
||||
'k' => [
|
||||
],
|
||||
'l' => [
|
||||
'^l$', 'directory', 'directory',
|
||||
'^ll$', 'directory', 'directory',
|
||||
'^ll/(\d+)', 'directory $1', 'directory',
|
||||
],
|
||||
'm' => [
|
||||
],
|
||||
'n' => [
|
||||
'^news', 'type news', 'type',
|
||||
],
|
||||
'o' => [
|
||||
],
|
||||
'p' => [
|
||||
],
|
||||
'q' => [
|
||||
'^q', 'bye', 'bye',
|
||||
],
|
||||
'r' => [
|
||||
'^r$', 'read', 'read',
|
||||
'^rcmd/(\S+)', 'rcmd $1', 'rcmd',
|
||||
],
|
||||
's' => [
|
||||
'^s/p$', 'send', 'send',
|
||||
'^sb$', 'send noprivate', 'send',
|
||||
'^set/home$', 'set/homenode', 'set/homenode',
|
||||
'^set/nobe', 'unset/beep', 'unset/beep',
|
||||
'^set/nohe', 'unset/here', 'unset/here',
|
||||
'^set/noan', 'unset/announce', 'unset/announce',
|
||||
'^set/nodx', 'unset/dx', 'unset/dx',
|
||||
'^set/nota', 'unset/talk', 'unset/talk',
|
||||
'^set/noww', 'unset/wwv', 'unset/wwv',
|
||||
'^set/nowx', 'unset/wx', 'unset/wx',
|
||||
'^sh$', 'show', 'show',
|
||||
'^sh\w*/buck', 'dbshow buck', 'dbshow',
|
||||
'^sh\w*/bu', 'show/files bulletins', 'show/files',
|
||||
'^sh\w*/c/n', 'show/configuration nodes', 'show/configuration',
|
||||
'^sh\w*/c$', 'show/configuration', 'show/configuration',
|
||||
'^sh\w*/com', 'dbavail', 'dbavail',
|
||||
'^sh\w*/dx/(\d+)-(\d+)', 'show/dx $1-$2', 'show/dx',
|
||||
'^sh\w*/dx/(\d+)', 'show/dx $1', 'show/dx',
|
||||
'^sh\w*/dx/d(\d+)', 'show/dx from $1', 'show/dx',
|
||||
'^sh\w*/email', 'dbshow email', 'dbshow',
|
||||
'^sh\w*/hftest', 'dbshow hftest', 'dbshow',
|
||||
'^sh\w*/vhftest', 'dbshow vhftest', 'dbshow',
|
||||
'^sh\w*/qsl', 'dbshow qsl', 'dbshow',
|
||||
'^sh\w*/tnc', 'who', 'who',
|
||||
'^sh\w*/up', 'show/cluster', 'show/cluster',
|
||||
'^sh\w*/w\w*/(\d+)-(\d+)', 'show/wwv $1-$2', 'show/wwv',
|
||||
'^sh\w*/w\w*/(\d+)', 'show/wwv $1', 'show/wwv',
|
||||
'^sp$', 'send', 'send',
|
||||
|
||||
],
|
||||
't' => [
|
||||
'^ta$', 'talk', 'talk',
|
||||
'^t$', 'talk', 'talk',
|
||||
],
|
||||
'u' => [
|
||||
],
|
||||
'v' => [
|
||||
],
|
||||
'w' => [
|
||||
'^wx/full', 'wx full', 'wx',
|
||||
'^wx/sysop', 'wx sysop', 'wx',
|
||||
],
|
||||
'x' => [
|
||||
],
|
||||
'y' => [
|
||||
],
|
||||
'z' => [
|
||||
],
|
||||
)
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>You can create aliases for commands at will. Beware though, these may not
|
||||
always turn out as you think. Care is needed and you need to test the
|
||||
results once you have set an alias.
|
||||
<P>
|
||||
<H2><A NAME="ss5.5">5.5 Console.pl</A>
|
||||
</H2>
|
||||
|
||||
<P>In later versions of Spider a simple console program is provided for the sysop.
|
||||
This has a type ahead buffer with line editing facilities and colour for spots,
|
||||
announces etc. To use this program, simply use console.pl instead of client.
|
||||
<P>
|
||||
<P>To edit the colours, copy /spider/perl/Console.pl to /spider/local and edit the
|
||||
file with your favourite editor.
|
||||
<P>
|
||||
<H2><A NAME="ss5.6">5.6 Updating kepler data</A>
|
||||
</H2>
|
||||
|
||||
<P>Spider has a powerful and flexible show/satellite command. In order for
|
||||
this to be accurate, the kepler data has to be updated regularly. In
|
||||
general, this data is available as an email or via cluster mail.
|
||||
Updating it is simple. First you need to export the mail message as a
|
||||
file. You do this with the <EM>export</EM> command from the cluster prompt
|
||||
as the sysop. For example ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
export 5467 /spider/perl/keps.in
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>would export message number 5467 as a file called keps.in in the
|
||||
/spider/perl directory.
|
||||
<P>Now login to a VT as sysop and cd /spider/perl. There is a command in
|
||||
the perl directory called <EM>convkeps.pl</EM>. All we need to do now is
|
||||
convert the file like so ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
./convkeps.pl keps.in
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>Now go back to the cluster and issue the command ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
load/keps
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>That is it! the kepler data has been updated.
|
||||
<P>
|
||||
<H2><A NAME="ss5.7">5.7 The QRZ callbook</A>
|
||||
</H2>
|
||||
|
||||
<P>The command <EM>sh/qrz</EM> will only work once you have followed a few
|
||||
simple steps. First you need to get a user ID and password from qrz.com.
|
||||
Simply go to the site and create one. Secondly you need to copy the file
|
||||
/spider/perl/Internet.pm to /spider/local and alter it to match your user
|
||||
ID and password. You also at this point need to set $allow=1 to complete
|
||||
the setup. Many thanks to Fred Lloyd, the proprieter of
|
||||
<A HREF="http://www.qrz.com">qrz.com</A> for allowing this access.
|
||||
<P>
|
||||
<HR>
|
||||
<A HREF="adminmanual-6.html">Next</A>
|
||||
|
@ -2,7 +2,7 @@
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
|
||||
<TITLE>The DXSpider Administration Manual v1.47: Databases</TITLE>
|
||||
<TITLE>The DXSpider Administration Manual v1.48: CVS</TITLE>
|
||||
<LINK HREF="adminmanual-7.html" REL=next>
|
||||
<LINK HREF="adminmanual-5.html" REL=previous>
|
||||
<LINK HREF="adminmanual.html#toc6" REL=contents>
|
||||
@ -13,129 +13,98 @@
|
||||
<A HREF="adminmanual-5.html">Previous</A>
|
||||
<A HREF="adminmanual.html#toc6">Contents</A>
|
||||
<HR>
|
||||
<H2><A NAME="s6">6. Databases</A></H2>
|
||||
<H2><A NAME="s6">6. CVS</A></H2>
|
||||
|
||||
<P>Spider allows the creation of local or remote databases. It supports
|
||||
chained databases, allowing several different databases to be scanned
|
||||
with one simple command. Importing of databases is limited at present
|
||||
to the standard AK1A databases such as OBLAST and the DB0SDX QSL
|
||||
database but will expand with time.
|
||||
<P>CVS stands for "Concurrent Versions System" and the CVS for DXSpider is held
|
||||
at
|
||||
<A HREF="http://www.sourceforge.net">Sourceforge</A>. This means
|
||||
that it is possible to update your DXSpider installation to the latest
|
||||
sources by using a few simple commands.
|
||||
<P>
|
||||
<H2><A NAME="ss6.1">6.1 Creating databases</A>
|
||||
</H2>
|
||||
|
||||
<P>Creating a database could not be more simple. All the commands are
|
||||
sent from the cluster prompt as the <EM>sysop</EM> user.
|
||||
<P>To create a database you use the command <EM>dbcreate</EM>. It can
|
||||
be used in 3 different ways like so ..
|
||||
<P>THIS IS NOT FOR THE FAINT HEARTED!!! ONLY DO THIS IF YOU HAVE A TEST
|
||||
INSTALLATION OR ARE WILLING TO HAVE YOUR CLUSTER CRASH ON YOU!!!
|
||||
THIS MUST BE CONSIDERED AT LEAST BETA TESTING AND MAYBE EVEN ALPHA!!
|
||||
YOU HAVE BEEN WARNED!!!
|
||||
<P>
|
||||
<P>DID I MENTION..... ONLY DO THIS IF YOU ARE WILLING TO ACCEPT THE
|
||||
CONSEQUENCES!!!
|
||||
<P>
|
||||
<P>I am of course assuming that you have a machine with both DXSpider and
|
||||
Internet access running.
|
||||
<P>
|
||||
<P>BEFORE YOU EVEN CONSIDER STARTING WITH THIS MAKE A BACKUP OF YOUR
|
||||
ENTIRE SPIDER TREE!!
|
||||
<P>
|
||||
<P>Assuming you are connected to the Internet, you need to login to the
|
||||
CVS repository and then update your Spider source. There are several
|
||||
steps which are listed below ...
|
||||
<P>
|
||||
<P>First login as the user <EM>sysop</EM>. Next you need to connect to the CVS
|
||||
repository. You do this with the command below ...
|
||||
<P>
|
||||
<PRE>
|
||||
cvs -d:pserver:anonymous@cvs.DXSpider.sourceforge.net:/cvsroot/dxspider login
|
||||
</PRE>
|
||||
<P>You will get a password prompt. Simply hit return here and your machine should
|
||||
return to a normal linux prompt.
|
||||
<P>
|
||||
<P>What happens next depends on whether you have an existing installation that
|
||||
you want to update with the latest and greatest or whether you just want
|
||||
to see what is there and/or run it on a new machine for testing.
|
||||
<P>If you are installing Spider from CVS then change directory to /home/sysop
|
||||
<P>If you are wanting to update Spider then cd to /tmp
|
||||
<P>
|
||||
<P>The next step will create a brand new 'spider' directory in your current
|
||||
directory.
|
||||
<P>
|
||||
<PRE>
|
||||
cvs -z3 -d:pserver:anonymous@cvs.DXSpider.sourceforge.net:/cvsroot/dxspider co spider
|
||||
</PRE>
|
||||
<P>This command is all on one line.
|
||||
<P>
|
||||
<P>Hopefully your screen should show you downloading files. The -z3 simply compresses
|
||||
the download to improve speed.
|
||||
When this has finished, you will have exactly the same as if you had untarred a full
|
||||
tarball PLUS some extra directories and files that CVS needs to do the magic that
|
||||
it does.
|
||||
<P>
|
||||
<P>Now if you are doing a new installation, that's it. Carry on as if you have
|
||||
just downloaded and untarred the lastest tarball.
|
||||
<P>
|
||||
<P>If you want to upgrade your current installation then do this ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
dbcreate <name>
|
||||
tar cvfz /tmp/s.tgz spider
|
||||
cd /
|
||||
tar xvfzp /tmp/s.tgz
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>To simply create a database locally, you just tell the command the
|
||||
name of the database. This does not create the actual database, it
|
||||
simply defines it to say that it exists.
|
||||
<P>This is assuming you downloaded to the /tmp directory of course.
|
||||
<P>
|
||||
<P>NOTE: the 'p' on the end of the 'xvfz' is IMPORTANT! It keeps the permissions
|
||||
correct. YOU WERE LOGGED IN AS THE USER SYSOP WEREN'T YOU?????
|
||||
<P>Remember to recompile the C client (cd /spider/src; make)
|
||||
<P>
|
||||
<P>At this point the files have been upgraded. You can (usually) restart the cluster
|
||||
in your own time. However, if you attempt to use any new commands or features
|
||||
expect it to be fatal! At least your cluster will have been restarted then so it
|
||||
will be too late to worry about it!
|
||||
<P>
|
||||
<P>Now the magic part! From now on when you want to update, simply connect to the
|
||||
Internet and then, as the user <EM>sysop</EM> ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
dbcreate <name> chain <name> [<name>...]
|
||||
cd /spider
|
||||
cvs -z3 update -d
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>This creates a chained database entry. The first database will be
|
||||
scanned, then the second, the third etc...
|
||||
<P>and your files will be updated. As above, remember to recompile the "C" client
|
||||
if it has been updated (CVS will tell you) and restart if any of the perl scripts
|
||||
have been altered or added, again, CVS will tell you.
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
dbcreate <name> remote <name>
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>This creates a remote entry. the first name field is the database
|
||||
name at the remote node, then the remote switch, then the actual
|
||||
node_call of the remote node, for example...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
dbcreate buckmaster remote gb7dxc
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>Remote databases cannot be chained, however, the last database in a
|
||||
chain can be a remote database.
|
||||
<P>
|
||||
<H2><A NAME="ss6.2">6.2 Importing databases</A>
|
||||
</H2>
|
||||
|
||||
<P>The only databases that Spider can currently import are the standard
|
||||
AK1A databases such as OBLAST or the DB0SDX qsl and address database.
|
||||
This will be added to with time.
|
||||
<P>To import such a database, first put the file somewhere useful like /tmp
|
||||
and then issue the following command ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
dbimport oblast /tmp/OBLAST.FUL
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>This will update the existing local oblast database or create it if
|
||||
it does not exist.
|
||||
<P>
|
||||
<H2><A NAME="ss6.3">6.3 Checking available databases</A>
|
||||
</H2>
|
||||
|
||||
<P>Once a database is created, you will want to check that it has been
|
||||
added. To do this use the <EM>dbavail</EM> command. This will
|
||||
output the available databases. For example ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
dbavail
|
||||
DB Name Location Chain
|
||||
qsl Local
|
||||
buck GB7ADX
|
||||
hftest GB7DXM
|
||||
G0VGS de GB7MBC 3-Feb-2001 1925Z >
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>
|
||||
<H2><A NAME="ss6.4">6.4 Looking up databases</A>
|
||||
</H2>
|
||||
|
||||
<P>To look for information in a defined database, simply use the <EM>dbshow</EM>
|
||||
command, for example ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
dbshow buckmaster G0YLM
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>will show the information for the callsign G0YLM from the buckmaster
|
||||
database if it exists. To make things more standard for the users
|
||||
you can add an entry in the Aliases file so that it looks like a standard
|
||||
<EM>show</EM> command like this ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
'^sh\w*/buc', 'dbshow buckmaster', 'dbshow',
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>Now you can simply use show/buckmaster or an abreviation.
|
||||
<P>
|
||||
<H2><A NAME="ss6.5">6.5 Removing databases</A>
|
||||
</H2>
|
||||
|
||||
<P>To delete an existing database you use the <EM>dbremove</EM> command.
|
||||
For example ...
|
||||
<P>
|
||||
<BLOCKQUOTE><CODE>
|
||||
<PRE>
|
||||
dbremove oblast
|
||||
</PRE>
|
||||
</CODE></BLOCKQUOTE>
|
||||
<P>would remove the oblast database and its associated datafile from the
|
||||
system. There are no warnings or recovery possible from this command.
|
||||
If you remove a database it ceases to exist and would have to be created
|
||||
from scratch if you still required it.
|
||||
<P>You will find any changes documented in the /spider/Changes file.
|
||||
<P>
|
||||
<HR>
|
||||
<A HREF="adminmanual-7.html">Next</A>
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -2,7 +2,7 @@
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
|
||||
<TITLE>The DXSpider Administration Manual v1.47</TITLE>
|
||||
<TITLE>The DXSpider Administration Manual v1.48</TITLE>
|
||||
<LINK HREF="adminmanual-1.html" REL=next>
|
||||
|
||||
|
||||
@ -13,228 +13,224 @@
|
||||
Previous
|
||||
Contents
|
||||
<HR>
|
||||
<H1>The DXSpider Administration Manual v1.47</H1>
|
||||
<H1>The DXSpider Administration Manual v1.48</H1>
|
||||
|
||||
<H2>Ian Maude, G0VGS, (ianmaude@btinternet.com)</H2>Version 1.47 April 2001 revision 1.0
|
||||
<H2>Ian Maude, G0VGS, (ianmaude@btinternet.com)</H2>Version 1.48 August 2001 revision 1.1
|
||||
<P><HR>
|
||||
<EM>A reference for SysOps of the DXSpider DXCluster program.</EM>
|
||||
<HR>
|
||||
<P>
|
||||
<H2><A NAME="toc1">1.</A> <A HREF="adminmanual-1.html">Hop control</A></H2>
|
||||
<H2><A NAME="toc1">1.</A> <A HREF="adminmanual-1.html">Routing and Filtering</A></H2>
|
||||
|
||||
<UL>
|
||||
<LI><A HREF="adminmanual-1.html#ss1.1">1.1 Basic hop control</A>
|
||||
<LI><A HREF="adminmanual-1.html#ss1.2">1.2 Isolating networks</A>
|
||||
<LI><A HREF="adminmanual-1.html#ss1.1">1.1 Introduction</A>
|
||||
<LI><A HREF="adminmanual-1.html#ss1.2">1.2 Route Filters</A>
|
||||
<LI><A HREF="adminmanual-1.html#ss1.3">1.3 The default_node filter</A>
|
||||
<LI><A HREF="adminmanual-1.html#ss1.4">1.4 General route filtering</A>
|
||||
<LI><A HREF="adminmanual-1.html#ss1.5">1.5 General filter rules</A>
|
||||
<LI><A HREF="adminmanual-1.html#ss1.6">1.6 Types of filter</A>
|
||||
<LI><A HREF="adminmanual-1.html#ss1.7">1.7 Filter options</A>
|
||||
<LI><A HREF="adminmanual-1.html#ss1.8">1.8 Default filters</A>
|
||||
<LI><A HREF="adminmanual-1.html#ss1.9">1.9 Advanced filtering</A>
|
||||
<LI><A HREF="adminmanual-1.html#ss1.10">1.10 Basic hop control</A>
|
||||
<LI><A HREF="adminmanual-1.html#ss1.11">1.11 Isolating networks</A>
|
||||
</UL>
|
||||
<P>
|
||||
<H2><A NAME="toc2">2.</A> <A HREF="adminmanual-2.html">Filtering (Old Style upto v1.44)</A></H2>
|
||||
<H2><A NAME="toc2">2.</A> <A HREF="adminmanual-2.html">Other filters</A></H2>
|
||||
|
||||
<UL>
|
||||
<LI><A HREF="adminmanual-2.html#ss2.1">2.1 Spots</A>
|
||||
<LI><A HREF="adminmanual-2.html#ss2.2">2.2 Announcements</A>
|
||||
<LI><A HREF="adminmanual-2.html#ss2.3">2.3 WWV</A>
|
||||
<LI><A HREF="adminmanual-2.html#ss2.1">2.1 Filtering Mail</A>
|
||||
<LI><A HREF="adminmanual-2.html#ss2.2">2.2 Filtering DX callouts (Depricated)</A>
|
||||
<LI><A HREF="adminmanual-2.html#ss2.3">2.3 Filtering words from text fields in Announce, Talk and DX spots</A>
|
||||
</UL>
|
||||
<P>
|
||||
<H2><A NAME="toc3">3.</A> <A HREF="adminmanual-3.html">Filtering (New Style v1.45 and later)</A></H2>
|
||||
<H2><A NAME="toc3">3.</A> <A HREF="adminmanual-3.html">Mail</A></H2>
|
||||
|
||||
<UL>
|
||||
<LI><A HREF="adminmanual-3.html#ss3.1">3.1 General filter rules</A>
|
||||
<LI><A HREF="adminmanual-3.html#ss3.2">3.2 Types of filter</A>
|
||||
<LI><A HREF="adminmanual-3.html#ss3.3">3.3 Filter options</A>
|
||||
<LI><A HREF="adminmanual-3.html#ss3.4">3.4 Default filters</A>
|
||||
<LI><A HREF="adminmanual-3.html#ss3.5">3.5 Advanced filtering</A>
|
||||
<LI><A HREF="adminmanual-3.html#ss3.1">3.1 Personal mail</A>
|
||||
<LI><A HREF="adminmanual-3.html#ss3.2">3.2 Bulletin mail</A>
|
||||
<LI><A HREF="adminmanual-3.html#ss3.3">3.3 Forward.pl</A>
|
||||
<LI><A HREF="adminmanual-3.html#ss3.4">3.4 The msg command</A>
|
||||
<LI><A HREF="adminmanual-3.html#ss3.5">3.5 Message status</A>
|
||||
<LI><A HREF="adminmanual-3.html#ss3.6">3.6 Filtering mail</A>
|
||||
<LI><A HREF="adminmanual-3.html#ss3.7">3.7 Distribution lists</A>
|
||||
<LI><A HREF="adminmanual-3.html#ss3.8">3.8 BBS interface</A>
|
||||
</UL>
|
||||
<P>
|
||||
<H2><A NAME="toc4">4.</A> <A HREF="adminmanual-4.html">Other filters</A></H2>
|
||||
<H2><A NAME="toc4">4.</A> <A HREF="adminmanual-4.html">Databases</A></H2>
|
||||
|
||||
<UL>
|
||||
<LI><A HREF="adminmanual-4.html#ss4.1">4.1 Filtering Mail</A>
|
||||
<LI><A HREF="adminmanual-4.html#ss4.2">4.2 Filtering DX callouts (Depricated)</A>
|
||||
<LI><A HREF="adminmanual-4.html#ss4.3">4.3 Filtering words from text fields in Announce, Talk and DX spots</A>
|
||||
<LI><A HREF="adminmanual-4.html#ss4.1">4.1 Creating databases</A>
|
||||
<LI><A HREF="adminmanual-4.html#ss4.2">4.2 Importing databases</A>
|
||||
<LI><A HREF="adminmanual-4.html#ss4.3">4.3 Checking available databases</A>
|
||||
<LI><A HREF="adminmanual-4.html#ss4.4">4.4 Looking up databases</A>
|
||||
<LI><A HREF="adminmanual-4.html#ss4.5">4.5 Removing databases</A>
|
||||
</UL>
|
||||
<P>
|
||||
<H2><A NAME="toc5">5.</A> <A HREF="adminmanual-5.html">Mail</A></H2>
|
||||
<H2><A NAME="toc5">5.</A> <A HREF="adminmanual-5.html">Information, files and useful programs</A></H2>
|
||||
|
||||
<UL>
|
||||
<LI><A HREF="adminmanual-5.html#ss5.1">5.1 Personal mail</A>
|
||||
<LI><A HREF="adminmanual-5.html#ss5.2">5.2 Bulletin mail</A>
|
||||
<LI><A HREF="adminmanual-5.html#ss5.3">5.3 Forward.pl</A>
|
||||
<LI><A HREF="adminmanual-5.html#ss5.4">5.4 The msg command</A>
|
||||
<LI><A HREF="adminmanual-5.html#ss5.5">5.5 Message status</A>
|
||||
<LI><A HREF="adminmanual-5.html#ss5.6">5.6 Filtering mail</A>
|
||||
<LI><A HREF="adminmanual-5.html#ss5.7">5.7 Distribution lists</A>
|
||||
<LI><A HREF="adminmanual-5.html#ss5.8">5.8 BBS interface</A>
|
||||
<LI><A HREF="adminmanual-5.html#ss5.1">5.1 MOTD</A>
|
||||
<LI><A HREF="adminmanual-5.html#ss5.2">5.2 Downtime message</A>
|
||||
<LI><A HREF="adminmanual-5.html#ss5.3">5.3 Other text messages</A>
|
||||
<LI><A HREF="adminmanual-5.html#ss5.4">5.4 The Aliases file</A>
|
||||
<LI><A HREF="adminmanual-5.html#ss5.5">5.5 Console.pl</A>
|
||||
<LI><A HREF="adminmanual-5.html#ss5.6">5.6 Updating kepler data</A>
|
||||
<LI><A HREF="adminmanual-5.html#ss5.7">5.7 The QRZ callbook</A>
|
||||
</UL>
|
||||
<P>
|
||||
<H2><A NAME="toc6">6.</A> <A HREF="adminmanual-6.html">Databases</A></H2>
|
||||
|
||||
<UL>
|
||||
<LI><A HREF="adminmanual-6.html#ss6.1">6.1 Creating databases</A>
|
||||
<LI><A HREF="adminmanual-6.html#ss6.2">6.2 Importing databases</A>
|
||||
<LI><A HREF="adminmanual-6.html#ss6.3">6.3 Checking available databases</A>
|
||||
<LI><A HREF="adminmanual-6.html#ss6.4">6.4 Looking up databases</A>
|
||||
<LI><A HREF="adminmanual-6.html#ss6.5">6.5 Removing databases</A>
|
||||
</UL>
|
||||
<P>
|
||||
<H2><A NAME="toc7">7.</A> <A HREF="adminmanual-7.html">Information, files and useful programs</A></H2>
|
||||
|
||||
<UL>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.1">7.1 MOTD</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.2">7.2 Downtime message</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.3">7.3 Other text messages</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.4">7.4 The Aliases file</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.5">7.5 Console.pl</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.6">7.6 Updating kepler data</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.7">7.7 The QRZ callbook</A>
|
||||
</UL>
|
||||
<P>
|
||||
<H2><A NAME="toc8">8.</A> <A HREF="adminmanual-8.html">CVS</A></H2>
|
||||
<H2><A NAME="toc6">6.</A> <A HREF="adminmanual-6.html">CVS</A></H2>
|
||||
|
||||
<P>
|
||||
<H2><A NAME="toc9">9.</A> <A HREF="adminmanual-9.html">The DXSpider command set</A></H2>
|
||||
<H2><A NAME="toc7">7.</A> <A HREF="adminmanual-7.html">The DXSpider command set</A></H2>
|
||||
|
||||
<UL>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.1">9.1 accept/announce (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.2">9.2 accept/announce (extended for sysops) (8)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.3">9.3 accept/spots (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.4">9.4 accept/spots (extended for sysops) (8)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.5">9.5 accept/wcy (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.6">9.6 accept/wcy (extended for sysops) (8)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.7">9.7 accept/wwv (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.8">9.8 accept/wwv (extended for sysops) (8)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.9">9.9 announce (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.10">9.10 announce full (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.11">9.11 announce sysop (5)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.12">9.12 apropos (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.13">9.13 bye (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.14">9.14 catchup (5)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.15">9.15 clear/spots (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.16">9.16 connect (5) </A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.17">9.17 dbavail (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.18">9.18 dbcreate (9)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.19">9.19 dbimport (9)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.20">9.20 dbremove (9)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.21">9.21 dbshow (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.22">9.22 debug (9)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.23">9.23 directory (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.24">9.24 directory (extended for sysops) (5)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.25">9.25 disconnect (8)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.26">9.26 dx (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.27">9.27 export (9)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.28">9.28 export_users (9)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.29">9.29 forward/latlong (8)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.30">9.30 forward/opername (1)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.31">9.31 help (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.32">9.32 init (5)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.33">9.33 kill (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.34">9.34 kill (5)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.35">9.35 kill full (5)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.36">9.36 links (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.37">9.37 load/aliases (9)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.38">9.38 load/baddx (9)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.39">9.39 load/badmsg (9)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.40">9.40 load/badwords (9)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.41">9.41 load/bands (9)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.42">9.42 load/cmd_cache (9)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.43">9.43 load/forward (9)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.44">9.44 load/messages (9)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.45">9.45 load/prefixes (9)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.46">9.46 merge (5)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.47">9.47 msg (9)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.48">9.48 pc (8)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.49">9.49 ping (1)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.50">9.50 rcmd (1)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.51">9.51 read (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.52">9.52 read (extended for sysops) (5) </A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.53">9.53 reject/announce</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.54">9.54 reject/announce (extended for sysops) (8)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.55">9.55 reject/spots (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.56">9.56 reject/spots (extended for sysops) (8)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.57">9.57 reject/wcy (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.58">9.58 reject/wcy (extended for sysops) (8)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.59">9.59 reject/wwv (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.60">9.60 reject/wwv (extended for sysops) (8)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.61">9.61 reply (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.62">9.62 send (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.63">9.63 set/address (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.64">9.64 set/announce (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.65">9.65 set/arcluster (5)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.66">9.66 set/baddx (8)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.67">9.67 set/badnode (6)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.68">9.68 set/badspotter (8)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.69">9.69 set/beep (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.70">9.70 set/clx (5)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.71">9.71 set/debug (9)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.72">9.72 set/dx (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.73">9.73 set/dxgrid (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.74">9.74 set/dxnet (5)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.75">9.75 set/echo (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.76">9.76 set/here (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.77">9.77 set/homenode (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.78">9.78 set/hops (8)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.79">9.79 set/isolate (9)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.80">9.80 set/language (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.81">9.81 set/location (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.82">9.82 set/sys_location (9)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.83">9.83 set/logininfo (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.84">9.84 set/lockout (9)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.85">9.85 set/name (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.86">9.86 set/node (9)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.87">9.87 set/obscount (9)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.88">9.88 set/page (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.89">9.89 set/password (9)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.90">9.90 set/pinginterval (9)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.91">9.91 set/privilege (9)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.92">9.92 set/spider (5)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.93">9.93 set/sys_qra (9)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.94">9.94 set/qra (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.95">9.95 set/qth (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.96">9.96 set/talk (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.97">9.97 set/wcy (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.98">9.98 set/wwv (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.99">9.99 set/wx (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.100">9.100 show/baddx (1)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.101">9.101 show/badnode (6)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.102">9.102 show/badspotter (1)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.103">9.103 show/configuration (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.104">9.104 show/configuration/node (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.105">9.105 show/connect (1)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.106">9.106 show/date (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.107">9.107 show/debug (9)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.108">9.108 show/dx (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.109">9.109 show/dxcc (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.110">9.110 show/files (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.111">9.111 show/filter (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.112">9.112 show/filter (extended for sysops) (5)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.113">9.113 show/hops (8)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.114">9.114 show/isolate (1)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.115">9.115 show/lockout (9)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.116">9.116 show/log (8)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.117">9.117 show/moon (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.118">9.118 show/muf (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.119">9.119 show/node (1)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.120">9.120 show/prefix (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.121">9.121 show/program (5)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.122">9.122 show/qra (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.123">9.123 show/qrz (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.124">9.124 show/route (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.125">9.125 show/satellite (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.126">9.126 show/sun (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.127">9.127 show/time (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.128">9.128 show/wcy (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.129">9.129 show/wwv (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.130">9.130 shutdown (5)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.131">9.131 spoof (9)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.132">9.132 stat/db (5)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.133">9.133 stat/channel (5)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.134">9.134 stat/msg (5)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.135">9.135 stat/user (5)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.136">9.136 sysop (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.137">9.137 talk (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.138">9.138 type (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.139">9.139 who (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.140">9.140 wx (0)</A>
|
||||
<LI><A HREF="adminmanual-9.html#ss9.141">9.141 wx (enhanced for sysops) (5)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.1">7.1 accept/announce (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.2">7.2 accept/announce (extended for sysops) (8)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.3">7.3 accept/route (8)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.4">7.4 accept/spots (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.5">7.5 accept/spots (extended for sysops) (8)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.6">7.6 accept/wcy (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.7">7.7 accept/wcy (extended for sysops) (8)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.8">7.8 accept/wwv (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.9">7.9 accept/wwv (extended for sysops) (8)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.10">7.10 announce (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.11">7.11 announce full (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.12">7.12 announce sysop (5)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.13">7.13 apropos (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.14">7.14 bye (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.15">7.15 catchup (5)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.16">7.16 clear/spots (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.17">7.17 connect (5) </A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.18">7.18 dbavail (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.19">7.19 dbcreate (9)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.20">7.20 dbimport (9)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.21">7.21 dbremove (9)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.22">7.22 dbshow (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.23">7.23 debug (9)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.24">7.24 directory (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.25">7.25 directory (extended for sysops) (5)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.26">7.26 disconnect (8)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.27">7.27 dx (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.28">7.28 export (9)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.29">7.29 export_users (9)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.30">7.30 forward/latlong (8)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.31">7.31 forward/opername (1)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.32">7.32 help (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.33">7.33 init (5)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.34">7.34 kill (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.35">7.35 kill (5)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.36">7.36 kill full (5)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.37">7.37 links (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.38">7.38 load/aliases (9)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.39">7.39 load/baddx (9)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.40">7.40 load/badmsg (9)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.41">7.41 load/badwords (9)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.42">7.42 load/bands (9)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.43">7.43 load/cmd_cache (9)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.44">7.44 load/forward (9)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.45">7.45 load/messages (9)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.46">7.46 load/prefixes (9)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.47">7.47 merge (5)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.48">7.48 msg (9)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.49">7.49 pc (8)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.50">7.50 ping (1)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.51">7.51 rcmd (1)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.52">7.52 read (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.53">7.53 read (extended for sysops) (5) </A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.54">7.54 reject/announce</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.55">7.55 reject/announce (extended for sysops) (8)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.56">7.56 reject/route (8)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.57">7.57 reject/spots (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.58">7.58 reject/spots (extended for sysops) (8)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.59">7.59 reject/wcy (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.60">7.60 reject/wcy (extended for sysops) (8)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.61">7.61 reject/wwv (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.62">7.62 reject/wwv (extended for sysops) (8)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.63">7.63 reply (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.64">7.64 send (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.65">7.65 set/address (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.66">7.66 set/announce (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.67">7.67 set/arcluster (5)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.68">7.68 set/baddx (8)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.69">7.69 set/badnode (6)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.70">7.70 set/badspotter (8)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.71">7.71 set/beep (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.72">7.72 set/bbs (5)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.73">7.73 set/clx (5)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.74">7.74 set/debug (9)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.75">7.75 set/dx (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.76">7.76 set/dxgrid (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.77">7.77 set/dxnet (5)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.78">7.78 set/echo (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.79">7.79 set/here (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.80">7.80 set/homenode (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.81">7.81 set/hops (8)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.82">7.82 set/isolate (9)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.83">7.83 set/language (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.84">7.84 set/location (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.85">7.85 set/sys_location (9)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.86">7.86 set/logininfo (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.87">7.87 set/lockout (9)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.88">7.88 set/name (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.89">7.89 set/node (9)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.90">7.90 set/obscount (9)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.91">7.91 set/page (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.92">7.92 set/password (9)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.93">7.93 set/pinginterval (9)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.94">7.94 set/privilege (9)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.95">7.95 set/spider (5)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.96">7.96 set/sys_qra (9)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.97">7.97 set/qra (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.98">7.98 set/qth (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.99">7.99 set/talk (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.100">7.100 set/wcy (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.101">7.101 set/wwv (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.102">7.102 set/wx (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.103">7.103 show/baddx (1)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.104">7.104 show/badnode (6)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.105">7.105 show/badspotter (1)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.106">7.106 show/configuration (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.107">7.107 show/configuration/node (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.108">7.108 show/connect (1)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.109">7.109 show/date (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.110">7.110 show/debug (9)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.111">7.111 show/dx (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.112">7.112 show/dxcc (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.113">7.113 show/files (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.114">7.114 show/filter (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.115">7.115 show/filter (extended for sysops) (5)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.116">7.116 show/hops (8)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.117">7.117 show/isolate (1)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.118">7.118 show/lockout (9)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.119">7.119 show/log (8)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.120">7.120 show/moon (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.121">7.121 show/muf (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.122">7.122 show/node (1)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.123">7.123 show/prefix (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.124">7.124 show/program (5)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.125">7.125 show/qra (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.126">7.126 show/qrz (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.127">7.127 show/route (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.128">7.128 show/satellite (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.129">7.129 show/sun (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.130">7.130 show/time (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.131">7.131 show/wcy (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.132">7.132 show/wwv (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.133">7.133 shutdown (5)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.134">7.134 spoof (9)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.135">7.135 stat/db (5)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.136">7.136 stat/channel (5)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.137">7.137 stat/msg (5)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.138">7.138 stat/route_node (5)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.139">7.139 stat/route_user (5)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.140">7.140 stat/user (5)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.141">7.141 sysop (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.142">7.142 talk (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.143">7.143 type (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.144">7.144 who (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.145">7.145 wx (0)</A>
|
||||
<LI><A HREF="adminmanual-7.html#ss7.146">7.146 wx (enhanced for sysops) (5)</A>
|
||||
</UL>
|
||||
<HR>
|
||||
<A HREF="adminmanual-1.html">Next</A>
|
||||
|
@ -2,7 +2,7 @@
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
|
||||
<TITLE>The DXSpider Installation Manual v1.47: Linux Installation </TITLE>
|
||||
<TITLE>The DXSpider Installation Manual v1.48: Linux Installation </TITLE>
|
||||
<LINK HREF="installation-2.html" REL=next>
|
||||
|
||||
<LINK HREF="installation.html#toc1" REL=contents>
|
||||
@ -40,16 +40,70 @@ following modules from
|
||||
<P>
|
||||
<P>
|
||||
<UL>
|
||||
<LI> Data-Dumper-2.101.tar.gz</LI>
|
||||
<LI> TimeDate-1.10.tar.gz</LI>
|
||||
<LI> IO-1.20.tar.gz (for perl 5.00403 and lower)</LI>
|
||||
<LI> Net-Telnet-3.02.tar.gz</LI>
|
||||
<LI> Curses-1.05.tar.gz</LI>
|
||||
<LI> Time-HiRes-01.20.tar.gz</LI>
|
||||
<LI>
|
||||
<A HREF="http://www.cpan.org/modules/by-module/Data/Data-Dumper-2.10.tar.gz">Data-Dumper-2.10.tar.gz</A></LI>
|
||||
<LI>
|
||||
<A HREF="http://www.cpan.org/modules/by-module/Date/TimeDate-1.10.tar.gz">TimeDate-1.10.tar.gz</A></LI>
|
||||
<LI>
|
||||
<A HREF="http://www.cpan.org/modules/by-module/IO/IO-1.20.tar.gz">IO-1.20.tar.gz (for perl 5.00403 and lower)</A></LI>
|
||||
<LI>
|
||||
<A HREF="http://www.cpan.org/modules/by-module/Net/Net-Telnet-3.02.tar.gz">Net-Telnet-3.02.tar.gz</A></LI>
|
||||
<LI>
|
||||
<A HREF="http://www.cpan.org/modules/by-module/Curses/Curses-1.05.tar.gz">Curses-1.05.tar.gz</A></LI>
|
||||
<LI>
|
||||
<A HREF="http://www.cpan.org/modules/by-module/Time/Time-HiRes-01.20.tar.gz">Time-HiRes-01.20.tar.gz</A></LI>
|
||||
</UL>
|
||||
<P>
|
||||
<P><EM>Do</EM> get the latest versions of these packages and install them
|
||||
but use the above list as the earliest versions usable.
|
||||
<P>Copy the CPAN modules listed above to a convenient place on your computer. One good place would be /usr/local/packages, and the instructions which follow will assume that that's where you have put them.
|
||||
<P>
|
||||
<P>Log in as 'root', and make sure you're at '/root' before you continue. Here are exactly the commands you must issue next: -
|
||||
<P>
|
||||
<PRE>
|
||||
# tar xvfz /usr/local/packages/Data-Dumper-2.10.tar.gz
|
||||
# cd Data-Dumper-2.10
|
||||
# perl Makefile.PL
|
||||
# make test
|
||||
# make install
|
||||
# cd ..
|
||||
#
|
||||
# tar xvfz /usr/local/packages/TimeDate-1.10.tar.gz
|
||||
# cd TimeDate-1.10
|
||||
# perl Makefile.PL
|
||||
# make test
|
||||
# make install
|
||||
# cd ..
|
||||
#
|
||||
# tar xvfz /usr/local/packages/IO-1.20.tar.gz
|
||||
# cd IO-1.20
|
||||
# perl Makefile.PL
|
||||
# make test
|
||||
# make install UNINST=1
|
||||
# cd ..
|
||||
#
|
||||
# tar xvfz /usr/local/packages/Net-Telnet-3.02.tar.gz
|
||||
# cd Net-Telnet-3.02
|
||||
# perl Makefile.PL
|
||||
# make test
|
||||
# make install
|
||||
# cd ..
|
||||
#
|
||||
# tar xvfz /usr/local/packages/Curses-1.05.tar.gz
|
||||
# cd Curses-1.05
|
||||
# perl Makefile.PL
|
||||
# make test
|
||||
# make install
|
||||
# cd ..
|
||||
#
|
||||
# tar xvfz /usr/local/packages/Time-HiRes-01.20.tar.gz
|
||||
# cd Time-HiRes-01.20
|
||||
# perl Makefile.PL
|
||||
# make test
|
||||
# make install
|
||||
# cd ..
|
||||
</PRE>
|
||||
<P>
|
||||
<P>Do not fall into the trap of thinking they're all the same, just because they nearly are! Pay particular attention to the instructions of IO, above.
|
||||
<P>
|
||||
<P>
|
||||
<H2><A NAME="ss1.2">1.2 Preparation</A>
|
||||
</H2>
|
||||
|
@ -2,7 +2,7 @@
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
|
||||
<TITLE>The DXSpider Installation Manual v1.47: Linux quick installation guide</TITLE>
|
||||
<TITLE>The DXSpider Installation Manual v1.48: Linux quick installation guide</TITLE>
|
||||
<LINK HREF="installation-3.html" REL=next>
|
||||
<LINK HREF="installation-1.html" REL=previous>
|
||||
<LINK HREF="installation.html#toc2" REL=contents>
|
||||
|
@ -2,7 +2,7 @@
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
|
||||
<TITLE>The DXSpider Installation Manual v1.47: Configuration</TITLE>
|
||||
<TITLE>The DXSpider Installation Manual v1.48: Configuration</TITLE>
|
||||
<LINK HREF="installation-4.html" REL=next>
|
||||
<LINK HREF="installation-2.html" REL=previous>
|
||||
<LINK HREF="installation.html#toc3" REL=contents>
|
||||
|
@ -2,7 +2,7 @@
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
|
||||
<TITLE>The DXSpider Installation Manual v1.47: Microsoft Windows Installation</TITLE>
|
||||
<TITLE>The DXSpider Installation Manual v1.48: Microsoft Windows Installation</TITLE>
|
||||
<LINK HREF="installation-5.html" REL=next>
|
||||
<LINK HREF="installation-3.html" REL=previous>
|
||||
<LINK HREF="installation.html#toc4" REL=contents>
|
||||
|
@ -2,7 +2,7 @@
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
|
||||
<TITLE>The DXSpider Installation Manual v1.47: Installing the software</TITLE>
|
||||
<TITLE>The DXSpider Installation Manual v1.48: Installing the software</TITLE>
|
||||
<LINK HREF="installation-6.html" REL=next>
|
||||
<LINK HREF="installation-4.html" REL=previous>
|
||||
<LINK HREF="installation.html#toc5" REL=contents>
|
||||
|
@ -2,7 +2,7 @@
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
|
||||
<TITLE>The DXSpider Installation Manual v1.47: General Information</TITLE>
|
||||
<TITLE>The DXSpider Installation Manual v1.48: General Information</TITLE>
|
||||
<LINK HREF="installation-5.html" REL=previous>
|
||||
<LINK HREF="installation.html#toc6" REL=contents>
|
||||
<link rel=stylesheet href="style.css" type="text/css" title="default stylesheet">
|
||||
|
@ -2,7 +2,7 @@
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
|
||||
<TITLE>The DXSpider Installation Manual v1.47</TITLE>
|
||||
<TITLE>The DXSpider Installation Manual v1.48</TITLE>
|
||||
<LINK HREF="installation-1.html" REL=next>
|
||||
|
||||
|
||||
@ -13,10 +13,10 @@
|
||||
Previous
|
||||
Contents
|
||||
<HR>
|
||||
<H1>The DXSpider Installation Manual v1.47</H1>
|
||||
<H1>The DXSpider Installation Manual v1.48</H1>
|
||||
|
||||
<H2>Iain Philipps, G0RDI (g0rdi@77hz.com) and
|
||||
Ian Maude, G0VGS, (ianmaude@btinternet.com)</H2>Version 1.47, April 2001 revision 1.0
|
||||
Ian Maude, G0VGS, (ianmaude@btinternet.com)</H2>Version 1.48, July 2001 revision 1.1
|
||||
<P><HR>
|
||||
<EM>A reference for SysOps of the DXSpider DXCluster program.</EM>
|
||||
<HR>
|
||||
|
@ -50,10 +50,10 @@ sub init
|
||||
$rproc = shift;
|
||||
|
||||
finish();
|
||||
dbg('err', "AGW initialising and connecting to $addr/$port ...");
|
||||
dbg("AGW initialising and connecting to $addr/$port ...");
|
||||
$sock = IO::Socket::INET->new(PeerAddr => $addr, PeerPort => $port, Proto=>'tcp', Timeout=>15);
|
||||
unless ($sock) {
|
||||
dbg('err', "Cannot connect to AGW Engine at $addr/$port $!");
|
||||
dbg("Cannot connect to AGW Engine at $addr/$port $!");
|
||||
return;
|
||||
}
|
||||
Msg::blocking($sock, 0);
|
||||
@ -83,7 +83,7 @@ sub finish
|
||||
return if $finishing;
|
||||
if ($sock) {
|
||||
$finishing = 1;
|
||||
dbg('err', "AGW ending...");
|
||||
dbg("AGW ending...");
|
||||
for (values %circuit) {
|
||||
&{$_->{eproc}}() if $_->{eproc};
|
||||
$_->disconnect;
|
||||
@ -114,15 +114,15 @@ sub _sendf
|
||||
|
||||
$len = length $data;
|
||||
if ($sort eq 'y' || $sort eq 'H') {
|
||||
dbg('agwpoll', "AGW sendf: $sort '${from}'->'${to}' port: $port pid: $pid \"$data\"");
|
||||
dbg("AGW sendf: $sort '${from}'->'${to}' port: $port pid: $pid \"$data\"") if isdbg('agwpoll');
|
||||
} elsif ($sort eq 'D') {
|
||||
if (isdbg('agw')) {
|
||||
my $d = $data;
|
||||
$d =~ s/\cM$//;
|
||||
dbg('agw', "AGW sendf: $sort '${from}'->'${to}' port: $port pid: $pid \"$d\"");
|
||||
dbg("AGW sendf: $sort '${from}'->'${to}' port: $port pid: $pid \"$d\"") if isdbg('agw');
|
||||
}
|
||||
} else {
|
||||
dbg('agw', "AGW sendf: $sort '${from}'->'${to}' port: $port pid: $pid \"$data\"");
|
||||
dbg("AGW sendf: $sort '${from}'->'${to}' port: $port pid: $pid \"$data\"") if isdbg('agw');
|
||||
}
|
||||
push @outqueue, pack('C x3 a1 x1 C x1 a10 a10 V x4 a*', $port, $sort, $pid, $from, $to, $len, $data);
|
||||
Msg::set_event_handler($sock, write=>\&_send);
|
||||
@ -213,7 +213,7 @@ FINISH:
|
||||
|
||||
sub _error
|
||||
{
|
||||
dbg('err', "error on AGW connection $addr/$port $!");
|
||||
dbg("error on AGW connection $addr/$port $!");
|
||||
Msg::set_event_handler($sock, read=>undef, write=>undef, error=>undef);
|
||||
$sock = undef;
|
||||
for (%circuit) {
|
||||
@ -233,7 +233,7 @@ sub _decode
|
||||
|
||||
# do a sanity check on the length
|
||||
if ($len > 2000) {
|
||||
dbg('err', "AGW: invalid length $len > 2000 received ($sort $port $pid '$from'->'$to')");
|
||||
dbg("AGW: invalid length $len > 2000 received ($sort $port $pid '$from'->'$to')");
|
||||
finish();
|
||||
return;
|
||||
}
|
||||
@ -261,13 +261,13 @@ sub _decode
|
||||
if ($sort eq 'D') {
|
||||
my $d = unpack "Z*", $data;
|
||||
$d =~ s/\cM$//;
|
||||
dbg('agw', "AGW Data In port: $port pid: $pid '$from'->'$to' length: $len \"$d\"");
|
||||
dbg("AGW Data In port: $port pid: $pid '$from'->'$to' length: $len \"$d\"") if isdbg('agw');
|
||||
my $conn = _find($from eq $main::mycall ? $to : $from);
|
||||
if ($conn) {
|
||||
if ($conn->{state} eq 'WC') {
|
||||
if (exists $conn->{cmd}) {
|
||||
if (@{$conn->{cmd}}) {
|
||||
dbg('connect', $d);
|
||||
dbg($d) if isdbg('connect');
|
||||
$conn->_docmd($d);
|
||||
}
|
||||
}
|
||||
@ -285,7 +285,7 @@ sub _decode
|
||||
}
|
||||
}
|
||||
} else {
|
||||
dbg('err', "AGW error Unsolicited Data!");
|
||||
dbg("AGW error Unsolicited Data!");
|
||||
}
|
||||
} elsif ($sort eq 'I' || $sort eq 'S' || $sort eq 'U' || $sort eq 'M' || $sort eq 'T') {
|
||||
my $d = unpack "Z*", $data;
|
||||
@ -294,12 +294,12 @@ sub _decode
|
||||
|
||||
for (@lines) {
|
||||
s/([\x00-\x1f\x7f-\xff])/sprintf("%%%02X", ord($1))/eg;
|
||||
dbg('agw', "AGW Monitor port: $port \"$_\"");
|
||||
dbg("AGW Monitor port: $port \"$_\"") if isdbg('agw');
|
||||
}
|
||||
} elsif ($sort eq 'C') {
|
||||
my $d = unpack "Z*", $data;
|
||||
$d =~ s/\cM$//;
|
||||
dbg('agw', "AGW Connect port: $port pid: $pid '$from'->'$to' \"$d\"");
|
||||
dbg("AGW Connect port: $port pid: $pid '$from'->'$to' \"$d\"") if isdbg('agw');
|
||||
my $call = $from eq $main::mycall ? $to : $from;
|
||||
my $conn = _find($call);
|
||||
if ($conn) {
|
||||
@ -334,7 +334,7 @@ sub _decode
|
||||
} elsif ($sort eq 'd') {
|
||||
my $d = unpack "Z*", $data;
|
||||
$d =~ s/\cM$//;
|
||||
dbg('agw', "AGW '$from'->'$to' port: $port Disconnected ($d)");
|
||||
dbg("AGW '$from'->'$to' port: $port Disconnected ($d)") if isdbg('agw');
|
||||
my $conn = _find($from eq $main::mycall ? $to : $from);
|
||||
if ($conn) {
|
||||
&{$conn->{eproc}}() if $conn->{eproc};
|
||||
@ -342,36 +342,36 @@ sub _decode
|
||||
}
|
||||
} elsif ($sort eq 'y') {
|
||||
my ($frames) = unpack "V", $data;
|
||||
dbg('agwpollans', "AGW Frames Outstanding on port $port = $frames");
|
||||
dbg("AGW Frames Outstanding on port $port = $frames") if isdbg('agwpollans');
|
||||
my $conn = _find($from);
|
||||
$conn->{oframes} = $frames if $conn;
|
||||
} elsif ($sort eq 'Y') {
|
||||
my ($frames) = unpack "V", $data;
|
||||
dbg('agw', "AGW Frames Outstanding on circuit '$from'->'$to' = $frames");
|
||||
dbg("AGW Frames Outstanding on circuit '$from'->'$to' = $frames") if isdbg('agw');
|
||||
my $conn = _find($from eq $main::mycall ? $to : $from);
|
||||
$conn->{oframes} = $frames if $conn;
|
||||
} elsif ($sort eq 'H') {
|
||||
unless ($from =~ /^\s+$/) {
|
||||
my $d = unpack "Z*", $data;
|
||||
$d =~ s/\cM$//;
|
||||
dbg('agw', "AGW Heard port: $port \"$d\"");
|
||||
dbg("AGW Heard port: $port \"$d\"") if isdbg('agw');
|
||||
}
|
||||
} elsif ($sort eq 'X') {
|
||||
my ($r) = unpack "C", $data;
|
||||
$r = $r ? "Successful" : "Failed";
|
||||
dbg('err', "AGW Register $from $r");
|
||||
dbg("AGW Register $from $r");
|
||||
finish() unless $r;
|
||||
} elsif ($sort eq 'R') {
|
||||
my ($major, $minor) = unpack "v x2 v x2", $data;
|
||||
dbg('agw', "AGW Version $major.$minor");
|
||||
dbg("AGW Version $major.$minor") if isdbg('agw');
|
||||
} elsif ($sort eq 'G') {
|
||||
my @ports = split /;/, $data;
|
||||
$noports = shift @ports || '0';
|
||||
dbg('agw', "AGW $noports Ports available");
|
||||
dbg("AGW $noports Ports available") if isdbg('agw');
|
||||
pop @ports while @ports > $noports;
|
||||
for (@ports) {
|
||||
next unless $_;
|
||||
dbg('agw', "AGW Port: $_");
|
||||
dbg("AGW Port: $_") if isdbg('agw');
|
||||
}
|
||||
for (my $i = 0; $i < $noports; $i++) {
|
||||
_sendf('y', undef, undef, $i);
|
||||
@ -379,7 +379,7 @@ sub _decode
|
||||
}
|
||||
} else {
|
||||
my $d = unpack "Z*", $data;
|
||||
dbg('agw', "AGW decode $sort port: $port pid: $pid '$from'->'$to' length: $len \"$d\"");
|
||||
dbg("AGW decode $sort port: $port pid: $pid '$from'->'$to' length: $len \"$d\"") if isdbg('agw');
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -436,7 +436,7 @@ sub enqueue
|
||||
# _sendf('Y', $main::mycall, $conn->{call}, $conn->{agwport}, $conn->{agwpid});
|
||||
_sendf('D', $main::mycall, $conn->{agwcall}, $conn->{agwport}, $conn->{agwpid}, $msg . $conn->{lineend});
|
||||
my $len = length($msg) + 1;
|
||||
dbg('agw', "AGW Data Out port: $conn->{agwport} pid: $conn->{agwpid} '$main::mycall'->'$conn->{agwcall}' length: $len \"$msg\"");
|
||||
dbg("AGW Data Out port: $conn->{agwport} pid: $conn->{agwpid} '$main::mycall'->'$conn->{agwcall}' length: $len \"$msg\"") if isdbg('agw');
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -31,9 +31,9 @@ $filterdef = bless ([
|
||||
['by_dxcc', 'n', 7],
|
||||
['by_itu', 'n', 8],
|
||||
['by_zone', 'n', 9],
|
||||
['origin_dxcc', 'c', 10],
|
||||
['origin_itu', 'c', 11],
|
||||
['origin_itu', 'c', 12],
|
||||
['origin_dxcc', 'n', 10],
|
||||
['origin_itu', 'n', 11],
|
||||
['origin_itu', 'n', 12],
|
||||
], 'Filter::Cmd');
|
||||
|
||||
|
||||
|
@ -31,6 +31,7 @@ use DXUtil;
|
||||
use DXVars;
|
||||
use DXDebug;
|
||||
use Filter;
|
||||
use Prefix;
|
||||
|
||||
use strict;
|
||||
use vars qw(%channels %valid @ISA $count);
|
||||
@ -58,7 +59,7 @@ $count = 0;
|
||||
talk => '0,Want Talk,yesno',
|
||||
ann => '0,Want Announce,yesno',
|
||||
here => '0,Here?,yesno',
|
||||
confmode => '0,In Conference?,yesno',
|
||||
conf => '0,In Conference?,yesno',
|
||||
dx => '0,DX Spots,yesno',
|
||||
redirect => '0,Redirect messages to',
|
||||
lang => '0,Language',
|
||||
@ -77,10 +78,12 @@ $count = 0;
|
||||
wwvfilter => '5,WWV Filter',
|
||||
wcyfilter => '5,WCY Filter',
|
||||
spotsfilter => '5,Spot Filter',
|
||||
routefilter => '5,route Filter',
|
||||
inannfilter => '5,Input Ann Filter',
|
||||
inwwvfilter => '5,Input WWV Filter',
|
||||
inwcyfilter => '5,Input WCY Filter',
|
||||
inspotsfilter => '5,Input Spot Filter',
|
||||
inroutefilter => '5,Input Route Filter',
|
||||
passwd => '9,Passwd List,parray',
|
||||
pingint => '5,Ping Interval ',
|
||||
nopings => '5,Ping Obs Count',
|
||||
@ -93,6 +96,11 @@ $count = 0;
|
||||
isbasic => '9,Internal Connection',
|
||||
errors => '9,Errors',
|
||||
route => '9,Route Data',
|
||||
dxcc => '0,Country Code',
|
||||
itu => '0,ITU Zone',
|
||||
cq => '0,CQ Zone',
|
||||
enhanced => '5,Enhanced Client,yesno',
|
||||
senddbg => '8,Sending Debug,yesno',
|
||||
);
|
||||
|
||||
# object destruction
|
||||
@ -104,7 +112,7 @@ sub DESTROY
|
||||
delete $self->{$_};
|
||||
}
|
||||
}
|
||||
dbg('chan', "DXChannel $self->{call} destroyed ($count)");
|
||||
dbg("DXChannel $self->{call} destroyed ($count)") if isdbg('chan');
|
||||
$count--;
|
||||
}
|
||||
|
||||
@ -131,8 +139,16 @@ sub alloc
|
||||
$self->{lang} = $main::lang if !$self->{lang};
|
||||
$self->{func} = "";
|
||||
|
||||
# add in all the dxcc, itu, zone info
|
||||
my @dxcc = Prefix::extract($call);
|
||||
if (@dxcc > 0) {
|
||||
$self->{dxcc} = $dxcc[1]->dxcc;
|
||||
$self->{itu} = $dxcc[1]->itu;
|
||||
$self->{cq} = $dxcc[1]->cq;
|
||||
}
|
||||
|
||||
$count++;
|
||||
dbg('chan', "DXChannel $self->{call} created ($count)");
|
||||
dbg("DXChannel $self->{call} created ($count)") if isdbg('chan');
|
||||
bless $self, $pkg;
|
||||
return $channels{$call} = $self;
|
||||
}
|
||||
@ -283,7 +299,30 @@ sub send_now
|
||||
my @lines = split /\n/;
|
||||
for (@lines) {
|
||||
$conn->send_now("$sort$call|$_");
|
||||
dbg('chan', "-> $sort $call $_");
|
||||
dbg("-> $sort $call $_") if isdbg('chan');
|
||||
}
|
||||
}
|
||||
$self->{t} = time;
|
||||
}
|
||||
|
||||
#
|
||||
# send later with letter (more control)
|
||||
#
|
||||
|
||||
sub send_later
|
||||
{
|
||||
my $self = shift;
|
||||
my $conn = $self->{conn};
|
||||
return unless $conn;
|
||||
my $sort = shift;
|
||||
my $call = $self->{call};
|
||||
|
||||
for (@_) {
|
||||
# chomp;
|
||||
my @lines = split /\n/;
|
||||
for (@lines) {
|
||||
$conn->send_later("$sort$call|$_");
|
||||
dbg("-> $sort $call $_") if isdbg('chan');
|
||||
}
|
||||
}
|
||||
$self->{t} = time;
|
||||
@ -304,7 +343,7 @@ sub send # this is always later and always data
|
||||
my @lines = split /\n/;
|
||||
for (@lines) {
|
||||
$conn->send_later("D$call|$_");
|
||||
dbg('chan', "-> D $call $_");
|
||||
dbg("-> D $call $_") if isdbg('chan');
|
||||
}
|
||||
}
|
||||
$self->{t} = time;
|
||||
@ -352,7 +391,7 @@ sub state
|
||||
$self->{oldstate} = $self->{state};
|
||||
$self->{state} = shift;
|
||||
$self->{func} = '' unless defined $self->{func};
|
||||
dbg('state', "$self->{call} channel func $self->{func} state $self->{oldstate} -> $self->{state}\n");
|
||||
dbg("$self->{call} channel func $self->{func} state $self->{oldstate} -> $self->{state}\n") if isdbg('state');
|
||||
|
||||
# if there is any queued up broadcasts then splurge them out here
|
||||
if ($self->{delayed} && ($self->{state} eq 'prompt' || $self->{state} eq 'talk')) {
|
||||
@ -439,12 +478,12 @@ sub decode_input
|
||||
# the above regexp must work
|
||||
unless (defined $sort && defined $call && defined $line) {
|
||||
# $data =~ s/([\x00-\x1f\x7f-\xff])/uc sprintf("%%%02x",ord($1))/eg;
|
||||
dbg('err', "DUFF Line on $chcall: $data");
|
||||
dbg("DUFF Line on $chcall: $data") if isdbg('err');
|
||||
return ();
|
||||
}
|
||||
|
||||
if(ref($dxchan) && $call ne $chcall) {
|
||||
dbg('err', "DUFF Line come in for $call on wrong channel $chcall" );
|
||||
dbg("DUFF Line come in for $call on wrong channel $chcall") if isdbg('err');
|
||||
return();
|
||||
}
|
||||
|
||||
|
@ -155,7 +155,7 @@ sub mynode
|
||||
unless ($noderef) {
|
||||
my $mynode = $self->{mynode};
|
||||
my $call = $self->{call};
|
||||
dbg('err', "parent node $mynode has disappeared from $call" );
|
||||
dbg("parent node $mynode has disappeared from $call") if isdbg('err');
|
||||
}
|
||||
}
|
||||
return $noderef;
|
||||
@ -173,7 +173,7 @@ sub dxchan
|
||||
unless ($dxchan) {
|
||||
my $dxcall = $self->{dxchancall};
|
||||
my $call = $self->{call};
|
||||
dbg('err', "parent dxchan $dxcall has disappeared from $call" );
|
||||
dbg("parent dxchan $dxcall has disappeared from $call") if isdbg('err');
|
||||
}
|
||||
}
|
||||
return $dxchan;
|
||||
@ -216,7 +216,7 @@ sub new
|
||||
my $self = $pkg->alloc($dxchan, $call, $confmode, $here);
|
||||
$self->{mynode} = $node->call;
|
||||
$node->add_user($call, $self);
|
||||
dbg('cluster', "allocating user $call to $node->{call} in cluster\n");
|
||||
dbg("allocating user $call to $node->{call} in cluster\n") if isdbg('cluster');
|
||||
return $self;
|
||||
}
|
||||
|
||||
@ -227,7 +227,7 @@ sub del
|
||||
my $node = $self->mynode;
|
||||
|
||||
$node->del_user($call);
|
||||
dbg('cluster', "deleting user $call from $node->{call} in cluster\n");
|
||||
dbg("deleting user $call from $node->{call} in cluster\n") if isdbg('cluster');
|
||||
}
|
||||
|
||||
sub count
|
||||
@ -264,7 +264,7 @@ sub new
|
||||
$self->{mynode} = $self->call; # for sh/station
|
||||
$self->{users} = 0;
|
||||
$nodes++;
|
||||
dbg('cluster', "allocating node $call to cluster\n");
|
||||
dbg("allocating node $call to cluster\n") if isdbg('cluster');
|
||||
return $self;
|
||||
}
|
||||
|
||||
@ -290,7 +290,7 @@ sub del
|
||||
$ref->del(); # this also takes them out of this list
|
||||
}
|
||||
delete $DXCluster::cluster{$call}; # remove me from the cluster table
|
||||
dbg('cluster', "deleting node $call from cluster\n");
|
||||
dbg("deleting node $call from cluster\n") if isdbg('cluster');
|
||||
$users -= $self->{users}; # it may be PC50 updated only therefore > 0
|
||||
$users = 0 if $users < 0;
|
||||
$nodes--;
|
||||
|
@ -32,7 +32,7 @@ use Sun;
|
||||
use Internet;
|
||||
|
||||
use strict;
|
||||
use vars qw(%Cache %cmd_cache $errstr %aliases $scriptbase $maxerrors);
|
||||
use vars qw(%Cache %cmd_cache $errstr %aliases $scriptbase $maxerrors %nothereslug);
|
||||
|
||||
%Cache = (); # cache of dynamically loaded routine's mod times
|
||||
%cmd_cache = (); # cache of short names
|
||||
@ -48,6 +48,13 @@ $maxerrors = 20; # the maximum number of concurrent errors allowed before dis
|
||||
sub new
|
||||
{
|
||||
my $self = DXChannel::alloc(@_);
|
||||
|
||||
# routing, this must go out here to prevent race condx
|
||||
my $pkg = shift;
|
||||
my $call = shift;
|
||||
my @rout = $main::routeroot->add_user($call, Route::here(1));
|
||||
DXProt::route_pc16($DXProt::me, $main::routeroot, @rout) if @rout;
|
||||
|
||||
return $self;
|
||||
}
|
||||
|
||||
@ -98,26 +105,10 @@ sub start
|
||||
$user->qra(DXBearing::lltoqra($lat, $long)) if (defined $lat && defined $long);
|
||||
}
|
||||
|
||||
# add yourself to the database
|
||||
my $node = DXNode->get($main::mycall) or die "$main::mycall not allocated in DXNode database";
|
||||
my $cuser = DXNodeuser->new($self, $node, $call, 0, 1);
|
||||
$node->dxchan($self) if $call eq $main::myalias; # send all output for mycall to myalias
|
||||
|
||||
# routing version
|
||||
my $pref = Route::Node::get($main::mycall) or die "$main::mycall not allocated in Route database";
|
||||
$pref->add_user($call, Route::here($self->{here}));
|
||||
dbg('route', "B/C PC16 on $main::mycall for: $call");
|
||||
|
||||
# issue a pc16 to everybody interested
|
||||
my $nchan = DXChannel->get($main::mycall);
|
||||
my @pc16 = DXProt::pc16($nchan, $cuser);
|
||||
for (@pc16) {
|
||||
DXProt::broadcast_all_ak1a($_);
|
||||
}
|
||||
Log('DXCommand', "$call connected");
|
||||
|
||||
# send prompts and things
|
||||
my $info = DXCluster::cluster();
|
||||
my $info = Route::cluster();
|
||||
$self->send("Cluster:$info");
|
||||
$self->send($self->msg('namee1')) if !$user->name;
|
||||
$self->send($self->msg('qthe1')) if !$user->qth;
|
||||
@ -227,7 +218,7 @@ sub send_talks
|
||||
my ($to, $via) = $ent =~ /(\S+)>(\S+)/;
|
||||
$to = $ent unless $to;
|
||||
my $call = $via ? $via : $to;
|
||||
my $clref = DXCluster->get_exact($call);
|
||||
my $clref = Route::get($call);
|
||||
my $dxchan = $clref->dxchan if $clref;
|
||||
if ($dxchan) {
|
||||
$dxchan->talk($self->{call}, $to, $via, $line);
|
||||
@ -276,7 +267,11 @@ sub send_ans
|
||||
$self->send($self->msg('page', scalar @_));
|
||||
} else {
|
||||
for (@_) {
|
||||
$self->send($_) if $_;
|
||||
if (defined $_) {
|
||||
$self->send($_);
|
||||
} else {
|
||||
$self->send('');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -295,7 +290,7 @@ sub run_cmd
|
||||
|
||||
if ($self->{func}) {
|
||||
my $c = qq{ \@ans = $self->{func}(\$self, \$cmdline) };
|
||||
dbg('eval', "stored func cmd = $c\n");
|
||||
dbg("stored func cmd = $c\n") if isdbg('eval');
|
||||
eval $c;
|
||||
if ($@) {
|
||||
return ("Syserr: Eval err $errstr on stored func $self->{func}", $@);
|
||||
@ -315,14 +310,14 @@ sub run_cmd
|
||||
|
||||
my ($path, $fcmd);
|
||||
|
||||
dbg('command', "cmd: $cmd");
|
||||
dbg("cmd: $cmd") if isdbg('command');
|
||||
|
||||
# alias it if possible
|
||||
my $acmd = CmdAlias::get_cmd($cmd);
|
||||
if ($acmd) {
|
||||
($cmd, $args) = split /\s+/, "$acmd $args", 2;
|
||||
$args = "" unless defined $args;
|
||||
dbg('command', "aliased cmd: $cmd $args");
|
||||
dbg("aliased cmd: $cmd $args") if isdbg('command');
|
||||
}
|
||||
|
||||
# first expand out the entry to a command
|
||||
@ -330,13 +325,13 @@ sub run_cmd
|
||||
($path, $fcmd) = search($main::cmd, $cmd, "pl") if !$path || !$fcmd;
|
||||
|
||||
if ($path && $cmd) {
|
||||
dbg('command', "path: $cmd cmd: $fcmd");
|
||||
dbg("path: $cmd cmd: $fcmd") if isdbg('command');
|
||||
|
||||
my $package = find_cmd_name($path, $fcmd);
|
||||
@ans = (0) if !$package ;
|
||||
|
||||
if ($package) {
|
||||
dbg('command', "package: $package");
|
||||
dbg("package: $package") if isdbg('command');
|
||||
my $c;
|
||||
unless (exists $Cache{$package}->{'sub'}) {
|
||||
$c = eval $Cache{$package}->{'eval'};
|
||||
@ -356,7 +351,7 @@ sub run_cmd
|
||||
};
|
||||
}
|
||||
} else {
|
||||
dbg('command', "cmd: $cmd not found");
|
||||
dbg("cmd: $cmd not found") if isdbg('command');
|
||||
if (++$self->{errors} > $maxerrors) {
|
||||
$self->send($self->msg('e26'));
|
||||
$self->disconnect;
|
||||
@ -400,6 +395,12 @@ sub process
|
||||
$dxchan->t($t);
|
||||
}
|
||||
}
|
||||
|
||||
while (my ($k, $v) = each %nothereslug) {
|
||||
if ($main::systime >= $v + 300) {
|
||||
delete $nothereslug{$k};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#
|
||||
@ -409,30 +410,21 @@ sub disconnect
|
||||
{
|
||||
my $self = shift;
|
||||
my $call = $self->call;
|
||||
|
||||
# reset the redirection of messages back to 'normal' if we are the sysop
|
||||
if ($call eq $main::myalias) {
|
||||
my $node = DXNode->get($main::mycall) or die "$main::mycall not allocated in DXNode database";
|
||||
$node->dxchan($DXProt::me);
|
||||
}
|
||||
delete $self->{senddbg};
|
||||
|
||||
my @rout = $main::routeroot->del_user($call);
|
||||
dbg('route', "B/C PC17 on $main::mycall for: $call");
|
||||
dbg("B/C PC17 on $main::mycall for: $call") if isdbg('route');
|
||||
|
||||
# issue a pc17 to everybody interested
|
||||
DXProt::route_pc17($DXProt::me, $main::routeroot, @rout) if @rout;
|
||||
|
||||
# I was the last node visited
|
||||
$self->user->node($main::mycall);
|
||||
|
||||
# issue a pc17 to everybody interested
|
||||
my $nchan = DXChannel->get($main::mycall);
|
||||
my $pc17 = $nchan->pc17($self);
|
||||
DXProt::broadcast_all_ak1a($pc17);
|
||||
|
||||
# send info to all logged in thingies
|
||||
$self->tell_login('logoutu');
|
||||
|
||||
Log('DXCommand', "$call disconnected");
|
||||
my $ref = DXCluster->get_exact($call);
|
||||
$ref->del() if $ref;
|
||||
|
||||
$self->SUPER::disconnect;
|
||||
}
|
||||
@ -452,15 +444,10 @@ sub broadcast
|
||||
{
|
||||
my $pkg = shift; # ignored
|
||||
my $s = shift; # the line to be rebroadcast
|
||||
my @except = @_; # to all channels EXCEPT these (dxchannel refs)
|
||||
my @list = DXChannel->get_all(); # just in case we are called from some funny object
|
||||
my ($dxchan, $except);
|
||||
|
||||
L: foreach $dxchan (@list) {
|
||||
next if !$dxchan->sort eq 'U'; # only interested in user channels
|
||||
foreach $except (@except) {
|
||||
next L if $except == $dxchan; # ignore channels in the 'except' list
|
||||
}
|
||||
foreach my $dxchan (DXChannel->get_all()) {
|
||||
next unless $dxchan->{sort} eq 'U'; # only interested in user channels
|
||||
next if grep $dxchan == $_, @_;
|
||||
$dxchan->send($s); # send it
|
||||
}
|
||||
}
|
||||
@ -468,13 +455,7 @@ sub broadcast
|
||||
# gimme all the users
|
||||
sub get_all
|
||||
{
|
||||
my @list = DXChannel->get_all();
|
||||
my $ref;
|
||||
my @out;
|
||||
foreach $ref (@list) {
|
||||
push @out, $ref if $ref->sort eq 'U';
|
||||
}
|
||||
return @out;
|
||||
return grep {$_->{sort} eq 'U'} DXChannel->get_all();
|
||||
}
|
||||
|
||||
# run a script for this user
|
||||
@ -496,7 +477,7 @@ sub search
|
||||
|
||||
# commands are lower case
|
||||
$short_cmd = lc $short_cmd;
|
||||
dbg('command', "command: $path $short_cmd\n");
|
||||
dbg("command: $path $short_cmd\n") if isdbg('command');
|
||||
|
||||
# do some checking for funny characters
|
||||
return () if $short_cmd =~ /\/$/;
|
||||
@ -504,7 +485,7 @@ sub search
|
||||
# return immediately if we have it
|
||||
($apath, $acmd) = split ',', $cmd_cache{$short_cmd} if $cmd_cache{$short_cmd};
|
||||
if ($apath && $acmd) {
|
||||
dbg('command', "cached $short_cmd = ($apath, $acmd)\n");
|
||||
dbg("cached $short_cmd = ($apath, $acmd)\n") if isdbg('command');
|
||||
return ($apath, $acmd);
|
||||
}
|
||||
|
||||
@ -526,7 +507,7 @@ sub search
|
||||
next if $l =~ /^\./;
|
||||
if ($i < $#parts) { # we are dealing with directories
|
||||
if ((-d "$curdir/$l") && $p eq substr($l, 0, length $p)) {
|
||||
dbg('command', "got dir: $curdir/$l\n");
|
||||
dbg("got dir: $curdir/$l\n") if isdbg('command');
|
||||
$dirfn .= "$l/";
|
||||
$curdir .= "/$l";
|
||||
last;
|
||||
@ -540,7 +521,7 @@ sub search
|
||||
# chop $dirfn; # remove trailing /
|
||||
$dirfn = "" unless $dirfn;
|
||||
$cmd_cache{"$short_cmd"} = join(',', ($path, "$dirfn$l")); # cache it
|
||||
dbg('command', "got path: $path cmd: $dirfn$l\n");
|
||||
dbg("got path: $path cmd: $dirfn$l\n") if isdbg('command');
|
||||
return ($path, "$dirfn$l");
|
||||
}
|
||||
}
|
||||
@ -639,7 +620,7 @@ sub find_cmd_name {
|
||||
my @list = split /\n/, $eval;
|
||||
my $line;
|
||||
for (@list) {
|
||||
dbg('eval', $_, "\n");
|
||||
dbg($_ . "\n") if isdbg('eval');
|
||||
}
|
||||
}
|
||||
|
||||
@ -649,26 +630,138 @@ sub find_cmd_name {
|
||||
return $package;
|
||||
}
|
||||
|
||||
sub local_send
|
||||
{
|
||||
my ($self, $let, $buf) = @_;
|
||||
if ($self->{state} eq 'prompt' || $self->{state} eq 'talk') {
|
||||
if ($self->{enhanced}) {
|
||||
$self->send_later($let, $buf);
|
||||
} else {
|
||||
$self->send($buf);
|
||||
}
|
||||
} else {
|
||||
$self->delay($buf);
|
||||
}
|
||||
}
|
||||
|
||||
# send a talk message here
|
||||
sub talk
|
||||
{
|
||||
my ($self, $from, $to, $via, $line) = @_;
|
||||
$line =~ s/\\5E/\^/g;
|
||||
$self->send("$to de $from: $line") if $self->{talk};
|
||||
$self->send_later('T', "$to de $from: $line") if $self->{talk};
|
||||
Log('talk', $to, $from, $main::mycall, $line);
|
||||
# send a 'not here' message if required
|
||||
unless ($self->{here} && $from ne $to) {
|
||||
my $key = "$to$from";
|
||||
unless (exists $nothereslug{$key}) {
|
||||
my ($ref, $dxchan);
|
||||
if (($ref = Route::get($from)) && ($dxchan = $ref->dxchan)) {
|
||||
my $name = $self->user->name || $to;
|
||||
my $s = $self->user->nothere || $dxchan->msg('nothere', $name);
|
||||
$nothereslug{$key} = $main::systime;
|
||||
$dxchan->talk($to, $from, undef, $s);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# send an announce
|
||||
sub announce
|
||||
{
|
||||
my $self = shift;
|
||||
my $line = shift;
|
||||
my $isolate = shift;
|
||||
my $to = shift;
|
||||
my $target = shift;
|
||||
my $text = shift;
|
||||
my ($filter, $hops);
|
||||
|
||||
if ($self->{annfilter}) {
|
||||
($filter, $hops) = $self->{annfilter}->it(@_ );
|
||||
return unless $filter;
|
||||
}
|
||||
|
||||
unless ($self->{ann}) {
|
||||
return if $_[0] ne $main::myalias && $_[0] ne $main::mycall;
|
||||
}
|
||||
return if $target eq 'SYSOP' && $self->{priv} < 5;
|
||||
my $buf = "$to$target de $_[0]: $text";
|
||||
$buf =~ s/\%5E/^/g;
|
||||
$buf .= "\a\a" if $self->{beep};
|
||||
$self->local_send($target eq 'WX' ? 'W' : 'N', $buf);
|
||||
}
|
||||
|
||||
# send a dx spot
|
||||
sub dx_spot
|
||||
{
|
||||
my $self = shift;
|
||||
my $line = shift;
|
||||
my $isolate = shift;
|
||||
my ($filter, $hops);
|
||||
|
||||
return unless $self->{dx};
|
||||
|
||||
if ($self->{spotsfilter}) {
|
||||
($filter, $hops) = $self->{spotsfilter}->it(@_ );
|
||||
return unless $filter;
|
||||
}
|
||||
|
||||
my $buf = Spot::formatb($self->{user}->wantgrid, $_[0], $_[1], $_[2], $_[3], $_[4]);
|
||||
$buf .= "\a\a" if $self->{beep};
|
||||
$buf =~ s/\%5E/^/g;
|
||||
$self->local_send('X', $buf);
|
||||
}
|
||||
|
||||
sub wwv
|
||||
{
|
||||
my $self = shift;
|
||||
my $line = shift;
|
||||
my $isolate = shift;
|
||||
my ($filter, $hops);
|
||||
|
||||
return unless $self->{wwv};
|
||||
|
||||
if ($self->{wwvfilter}) {
|
||||
($filter, $hops) = $self->{wwvfilter}->it(@_ );
|
||||
return unless $filter;
|
||||
}
|
||||
|
||||
my $buf = "WWV de $_[6] <$_[1]>: SFI=$_[2], A=$_[3], K=$_[4], $_[5]";
|
||||
$buf .= "\a\a" if $self->{beep};
|
||||
$self->local_send('V', $buf);
|
||||
}
|
||||
|
||||
sub wcy
|
||||
{
|
||||
my $self = shift;
|
||||
my $line = shift;
|
||||
my $isolate = shift;
|
||||
my ($filter, $hops);
|
||||
|
||||
return unless $self->{wcy};
|
||||
|
||||
if ($self->{wcyfilter}) {
|
||||
($filter, $hops) = $self->{wcyfilter}->it(@_ );
|
||||
return unless $filter;
|
||||
}
|
||||
|
||||
my $buf = "WCY de $_[10] <$_[1]> : K=$_[4] expK=$_[5] A=$_[3] R=$_[6] SFI=$_[2] SA=$_[7] GMF=$_[8] Au=$_[9]";
|
||||
$buf .= "\a\a" if $self->{beep};
|
||||
$self->local_send('Y', $buf);
|
||||
}
|
||||
|
||||
# broadcast debug stuff to all interested parties
|
||||
sub broadcast_debug
|
||||
{
|
||||
my $s = shift; # the line to be rebroadcast
|
||||
|
||||
foreach my $dxchan (DXChannel->get_all) {
|
||||
next unless $dxchan->{enhanced} && $dxchan->{senddbg};
|
||||
$dxchan->send_later('L', $s);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
@ -16,9 +16,8 @@ use IO::File;
|
||||
|
||||
use strict;
|
||||
|
||||
use vars qw{@crontab $mtime $lasttime $lastmin};
|
||||
use vars qw{@crontab @lcrontab @scrontab $mtime $lasttime $lastmin};
|
||||
|
||||
@crontab = ();
|
||||
$mtime = 0;
|
||||
$lasttime = 0;
|
||||
$lastmin = 0;
|
||||
@ -33,13 +32,11 @@ sub init
|
||||
if ((-e $localfn && -M $localfn < $mtime) || (-e $fn && -M $fn < $mtime) || $mtime == 0) {
|
||||
my $t;
|
||||
|
||||
@crontab = ();
|
||||
|
||||
# first read in the standard one
|
||||
if (-e $fn) {
|
||||
$t = -M $fn;
|
||||
|
||||
cread($fn);
|
||||
@scrontab = cread($fn);
|
||||
$mtime = $t if !$mtime || $t <= $mtime;
|
||||
}
|
||||
|
||||
@ -47,9 +44,10 @@ sub init
|
||||
if (-e $localfn) {
|
||||
$t = -M $localfn;
|
||||
|
||||
cread($localfn);
|
||||
@lcrontab = cread($localfn);
|
||||
$mtime = $t if $t <= $mtime;
|
||||
}
|
||||
@crontab = (@scrontab, @lcrontab);
|
||||
}
|
||||
}
|
||||
|
||||
@ -59,15 +57,16 @@ sub cread
|
||||
my $fn = shift;
|
||||
my $fh = new IO::File;
|
||||
my $line = 0;
|
||||
my @out;
|
||||
|
||||
dbg('cron', "cron: reading $fn\n");
|
||||
dbg("cron: reading $fn\n") if isdbg('cron');
|
||||
open($fh, $fn) or confess("cron: can't open $fn $!");
|
||||
while (<$fh>) {
|
||||
$line++;
|
||||
chomp;
|
||||
next if /^\s*#/o or /^\s*$/o;
|
||||
my ($min, $hour, $mday, $month, $wday, $cmd) = /^\s*(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(.+)$/o;
|
||||
next if !$min;
|
||||
next unless defined $min;
|
||||
my $ref = bless {};
|
||||
my $err;
|
||||
|
||||
@ -78,13 +77,14 @@ sub cread
|
||||
$err |= parse($ref, 'wday', $wday, 0, 6, "sun", "mon", "tue", "wed", "thu", "fri", "sat");
|
||||
if (!$err) {
|
||||
$ref->{cmd} = $cmd;
|
||||
push @crontab, $ref;
|
||||
dbg('cron', "cron: adding $_\n");
|
||||
push @out, $ref;
|
||||
dbg("cron: adding $_\n") if isdbg('cron');
|
||||
} else {
|
||||
dbg('cron', "cron: error on line $line '$_'\n");
|
||||
dbg("cron: error on line $line '$_'\n") if isdbg('cron');
|
||||
}
|
||||
}
|
||||
close($fh);
|
||||
return @out;
|
||||
}
|
||||
|
||||
sub parse
|
||||
@ -147,9 +147,9 @@ sub process
|
||||
(!$cron->{wday} || grep $_ eq $wday, @{$cron->{wday}}) ){
|
||||
|
||||
if ($cron->{cmd}) {
|
||||
dbg('cron', "cron: $min $hour $mday $mon $wday -> doing '$cron->{cmd}'");
|
||||
dbg("cron: $min $hour $mday $mon $wday -> doing '$cron->{cmd}'") if isdbg('cron');
|
||||
eval "$cron->{cmd}";
|
||||
dbg('cron', "cron: cmd error $@") if $@;
|
||||
dbg("cron: cmd error $@") if $@ && isdbg('cron');
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -175,32 +175,43 @@ sub connected
|
||||
sub present
|
||||
{
|
||||
my $call = uc shift;
|
||||
return DXCluster->get_exact($call);
|
||||
return Route::get($call);
|
||||
}
|
||||
|
||||
# is it remotely connected anywhere (ignoring SSIDS)?
|
||||
sub presentish
|
||||
{
|
||||
my $call = uc shift;
|
||||
return DXCluster->get($call);
|
||||
my $c = Route::get($call);
|
||||
unless ($c) {
|
||||
for (1..15) {
|
||||
$c = Route::get("$call-$_");
|
||||
last if $c;
|
||||
}
|
||||
}
|
||||
return $c;
|
||||
}
|
||||
|
||||
# is it remotely connected anywhere (with exact callsign) and on node?
|
||||
sub present_on
|
||||
{
|
||||
my $call = uc shift;
|
||||
my $node = uc shift;
|
||||
my $ref = DXCluster->get_exact($call);
|
||||
return ($ref && $ref->mynode) ? $ref->mynode->call eq $node : undef;
|
||||
my $ncall = uc shift;
|
||||
my $node = Route::Node::get($ncall);
|
||||
return ($node) ? grep $call eq $_, $node->users : undef;
|
||||
}
|
||||
|
||||
# is it remotely connected anywhere (ignoring SSIDS) and on node?
|
||||
# is it remotely connected (ignoring SSIDS) and on node?
|
||||
sub presentish_on
|
||||
{
|
||||
my $call = uc shift;
|
||||
my $node = uc shift;
|
||||
my $ref = DXCluster->get($call);
|
||||
return ($ref && $ref->mynode) ? $ref->mynode->call eq $node : undef;
|
||||
my $ncall = uc shift;
|
||||
my $node = Route::Node::get($ncall);
|
||||
my $present;
|
||||
if ($node) {
|
||||
$present = grep {/^$call/ } $node->users;
|
||||
}
|
||||
return $present;
|
||||
}
|
||||
|
||||
# last time this thing was connected
|
||||
@ -247,11 +258,11 @@ sub spawn
|
||||
$SIG{CHLD} = $SIG{TERM} = $SIG{INT} = $SIG{__WARN__} = 'DEFAULT';
|
||||
alarm(0);
|
||||
}
|
||||
exec "$line" or dbg('cron', "exec '$line' failed $!");
|
||||
exec "$line" or dbg("exec '$line' failed $!") if isdbg('cron');
|
||||
}
|
||||
dbg('cron', "spawn of $line started");
|
||||
dbg("spawn of $line started") if isdbg('cron');
|
||||
} else {
|
||||
dbg('cron', "can't fork for $line $!");
|
||||
dbg("can't fork for $line $!") if isdbg('cron');
|
||||
}
|
||||
|
||||
# coordinate
|
||||
@ -265,8 +276,8 @@ sub rcmd
|
||||
my $line = shift;
|
||||
|
||||
# can we see it? Is it a node?
|
||||
my $noderef = DXCluster->get_exact($call);
|
||||
return if !$noderef || !$noderef->pcversion;
|
||||
my $noderef = Route::Node::get($call);
|
||||
return unless $noderef && $noderef->version;
|
||||
|
||||
# send it
|
||||
DXProt::addrcmd($DXProt::me, $call, $line);
|
||||
@ -276,10 +287,10 @@ sub run_cmd
|
||||
{
|
||||
my $line = shift;
|
||||
my @in = DXCommandmode::run_cmd($DXProt::me, $line);
|
||||
dbg('cron', "cmd run: $line");
|
||||
dbg("cmd run: $line") if isdbg('cron');
|
||||
for (@in) {
|
||||
s/\s*$//og;
|
||||
dbg('cron', "cmd out: $_");
|
||||
dbg("cmd out: $_") if isdbg('cron');
|
||||
}
|
||||
}
|
||||
1;
|
||||
|
@ -11,10 +11,10 @@ package DXDebug;
|
||||
|
||||
require Exporter;
|
||||
@ISA = qw(Exporter);
|
||||
@EXPORT = qw(dbginit dbgstore dbg dbgadd dbgsub dbglist dbgdump isdbg dbgclose confess croak cluck);
|
||||
@EXPORT = qw(dbginit dbg dbgadd dbgsub dbglist dbgdump isdbg dbgclose confess croak cluck);
|
||||
|
||||
use strict;
|
||||
use vars qw(%dbglevel $fp);
|
||||
use vars qw(%dbglevel $fp $callback);
|
||||
|
||||
use DXUtil;
|
||||
use DXLog ();
|
||||
@ -22,6 +22,7 @@ use Carp ();
|
||||
|
||||
%dbglevel = ();
|
||||
$fp = undef;
|
||||
$callback = undef;
|
||||
|
||||
# Avoid generating "subroutine redefined" warnings with the following
|
||||
# hack (from CGI::Carp):
|
||||
@ -29,29 +30,33 @@ if (!defined $DB::VERSION) {
|
||||
local $^W=0;
|
||||
eval qq( sub confess {
|
||||
\$SIG{__DIE__} = 'DEFAULT';
|
||||
DXDebug::dbgstore(\$@, Carp::shortmess(\@_));
|
||||
DXDebug::dbg(\$@);
|
||||
DXDebug::dbg(Carp::shortmess(\@_));
|
||||
exit(-1);
|
||||
}
|
||||
sub croak {
|
||||
\$SIG{__DIE__} = 'DEFAULT';
|
||||
DXDebug::dbgstore(\$@, Carp::longmess(\@_));
|
||||
DXDebug::dbg(\$@);
|
||||
DXDebug::dbg(Carp::longmess(\@_));
|
||||
exit(-1);
|
||||
}
|
||||
sub carp { DXDebug::dbgstore(Carp::shortmess(\@_)); }
|
||||
sub cluck { DXDebug::dbgstore(Carp::longmess(\@_)); }
|
||||
sub carp { DXDebug::dbg(Carp::shortmess(\@_)); }
|
||||
sub cluck { DXDebug::dbg(Carp::longmess(\@_)); }
|
||||
);
|
||||
|
||||
CORE::die(Carp::shortmess($@)) if $@;
|
||||
} else {
|
||||
eval qq( sub confess { Carp::confess(\@_); };
|
||||
sub croak { Carp::croak(\@_); };
|
||||
sub cluck { Carp::cluck(\@_); };
|
||||
eval qq( sub confess { die Carp::longmess(\@_); };
|
||||
sub croak { die Carp::shortmess(\@_); };
|
||||
sub cluck { warn Carp::longmess(\@_); };
|
||||
sub carp { warn Carp::shortmess(\@_); };
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
sub dbgstore
|
||||
sub dbg($)
|
||||
{
|
||||
return unless $fp;
|
||||
my $t = time;
|
||||
for (@_) {
|
||||
my $r = $_;
|
||||
@ -60,17 +65,31 @@ sub dbgstore
|
||||
for (@l) {
|
||||
s/([\x00-\x08\x0B-\x1f\x7f-\xff])/uc sprintf("%%%02x",ord($1))/eg;
|
||||
print "$_\n" if defined \*STDOUT;
|
||||
$fp->writeunix($t, "$t^$_");
|
||||
my $str = "$t^$_";
|
||||
&$callback($str) if $callback;
|
||||
$fp->writeunix($t, $str);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub dbginit
|
||||
{
|
||||
$callback = shift;
|
||||
|
||||
# add sig{__DIE__} handling
|
||||
if (!defined $DB::VERSION) {
|
||||
$SIG{__WARN__} = sub { dbgstore($@, Carp::shortmess(@_)); };
|
||||
$SIG{__DIE__} = sub { dbgstore($@, Carp::longmess(@_)); };
|
||||
$SIG{__WARN__} = sub {
|
||||
if ($_[0] =~ /Deep\s+recursion/i) {
|
||||
dbg($@);
|
||||
dbg(Carp::longmess(@_));
|
||||
CORE::die;
|
||||
} else {
|
||||
dbg($@);
|
||||
dbg(Carp::shortmess(@_));
|
||||
}
|
||||
};
|
||||
|
||||
$SIG{__DIE__} = sub { dbg($@); dbg(Carp::longmess(@_)); };
|
||||
}
|
||||
|
||||
$fp = DXLog::new('debug', 'dat', 'd');
|
||||
@ -83,14 +102,6 @@ sub dbgclose
|
||||
undef $fp;
|
||||
}
|
||||
|
||||
sub dbg
|
||||
{
|
||||
my $l = shift;
|
||||
if ($fp && ($dbglevel{$l} || $l eq 'err')) {
|
||||
dbgstore(@_);
|
||||
}
|
||||
}
|
||||
|
||||
sub dbgdump
|
||||
{
|
||||
my $l = shift;
|
||||
@ -103,7 +114,7 @@ sub dbgdump
|
||||
$c =~ s/[\x00-\x1f\x7f-\xff]/./g;
|
||||
my $left = 16 - length $c;
|
||||
$h .= ' ' x (2 * $left) if $left > 0;
|
||||
dbgstore($m . sprintf("%4d:", $o) . "$h $c");
|
||||
dbg($m . sprintf("%4d:", $o) . "$h $c");
|
||||
$m = ' ' x (length $m);
|
||||
}
|
||||
}
|
||||
@ -133,10 +144,10 @@ sub dbglist
|
||||
return keys (%dbglevel);
|
||||
}
|
||||
|
||||
sub isdbg
|
||||
sub isdbg($)
|
||||
{
|
||||
my $s = shift;
|
||||
return $dbglevel{$s};
|
||||
return unless $fp;
|
||||
return $dbglevel{$_[0]};
|
||||
}
|
||||
|
||||
sub shortmess
|
||||
|
@ -30,7 +30,7 @@ sub new
|
||||
my ($pkg, $name) = @_;
|
||||
my $s = readfilestr($main::data, $name);
|
||||
my $self = eval $s if $s;
|
||||
dbg('err', "error in reading $name in DXHash $@") if $@;
|
||||
dbg("error in reading $name in DXHash $@") if $@;
|
||||
$self = bless {name => $name}, $pkg unless $self;
|
||||
return $self;
|
||||
}
|
||||
|
@ -83,11 +83,21 @@ sub open
|
||||
$self->{year} = $year;
|
||||
$self->{thing} = $thing;
|
||||
|
||||
# DXDebug::dbg("dxlog", "opening $self->{fn}\n");
|
||||
# DXDebug::dbg("opening $self->{fn}\n") if isdbg("dxlog");
|
||||
|
||||
return $self->{fh};
|
||||
}
|
||||
|
||||
sub mtime
|
||||
{
|
||||
my ($self, $year, $thing) = @_;
|
||||
|
||||
my $fn = sprintf "$self->{prefix}/$year/%02d", $thing if $self->{'sort'} eq 'm';
|
||||
$fn = sprintf "$self->{prefix}/$year/%03d", $thing if $self->{'sort'} eq 'd';
|
||||
$fn .= ".$self->{suffix}" if $self->{suffix};
|
||||
return (stat $fn)[9];
|
||||
}
|
||||
|
||||
# open the previous log file in sequence
|
||||
sub openprev
|
||||
{
|
||||
|
117
perl/DXMsg.pm
117
perl/DXMsg.pm
@ -19,7 +19,6 @@ use DXUtil;
|
||||
use DXChannel;
|
||||
use DXUser;
|
||||
use DXM;
|
||||
use DXCluster;
|
||||
use DXProtVars;
|
||||
use DXProtout;
|
||||
use DXDebug;
|
||||
@ -169,7 +168,7 @@ sub process
|
||||
if (exists $busy{$fromnode}) {
|
||||
my $ref = $busy{$fromnode};
|
||||
my $tonode = $ref->{tonode};
|
||||
dbg('msg', "Busy, stopping msgno: $ref->{msgno} -> $fromnode");
|
||||
dbg("Busy, stopping msgno: $ref->{msgno} -> $fromnode") if isdbg('msg');
|
||||
$ref->stop_msg($self->call);
|
||||
}
|
||||
|
||||
@ -184,7 +183,7 @@ sub process
|
||||
$ref->{linesreq} = $f[10];
|
||||
$ref->{stream} = $stream;
|
||||
$ref->{count} = 0; # no of lines between PC31s
|
||||
dbg('msg', "new message from $f[4] to $f[3] '$f[8]' stream $stream\n");
|
||||
dbg("new message from $f[4] to $f[3] '$f[8]' stream $fromnode/$stream\n") if isdbg('msg');
|
||||
Log('msg', "Incoming message $f[4] to $f[3] '$f[8]'" );
|
||||
$work{"$fromnode$stream"} = $ref; # store in work
|
||||
$busy{$fromnode} = $ref; # set interlock
|
||||
@ -195,7 +194,7 @@ sub process
|
||||
my $uref = DXUser->get_current($ref->{to});
|
||||
if (is_callsign($ref->{to}) && !$ref->{private} && $uref && $uref->homenode) {
|
||||
$ref->{private} = 1;
|
||||
dbg('msg', "set bull to $ref->{to} to private");
|
||||
dbg("set bull to $ref->{to} to private") if isdbg('msg');
|
||||
}
|
||||
last SWITCH;
|
||||
}
|
||||
@ -208,12 +207,12 @@ sub process
|
||||
$ref->{count}++;
|
||||
if ($ref->{count} >= $ref->{linesreq}) {
|
||||
$self->send(DXProt::pc31($f[2], $f[1], $f[3]));
|
||||
dbg('msg', "stream $f[3]: $ref->{count} lines received\n");
|
||||
dbg("stream $f[3]: $ref->{count} lines received\n") if isdbg('msg');
|
||||
$ref->{count} = 0;
|
||||
}
|
||||
$ref->{lastt} = $main::systime;
|
||||
} else {
|
||||
dbg('msg', "PC29 from unknown stream $f[3] from $f[2]" );
|
||||
dbg("PC29 from unknown stream $f[3] from $f[2]") if isdbg('msg');
|
||||
$self->send(DXProt::pc42($f[2], $f[1], $f[3])); # unknown stream
|
||||
}
|
||||
last SWITCH;
|
||||
@ -227,13 +226,13 @@ sub process
|
||||
$ref->{count} = 0;
|
||||
$ref->{linesreq} = 5;
|
||||
$work{"$f[2]$f[3]"} = $ref; # new ref
|
||||
dbg('msg', "incoming subject ack stream $f[3]\n");
|
||||
dbg("incoming subject ack stream $f[3]\n") if isdbg('msg');
|
||||
$busy{$f[2]} = $ref; # interlock
|
||||
push @{$ref->{lines}}, ($ref->read_msg_body);
|
||||
$ref->send_tranche($self);
|
||||
$ref->{lastt} = $main::systime;
|
||||
} else {
|
||||
dbg('msg', "PC30 from unknown stream $f[3] from $f[2]" );
|
||||
dbg("PC30 from unknown stream $f[3] from $f[2]") if isdbg('msg');
|
||||
$self->send(DXProt::pc42($f[2], $f[1], $f[3])); # unknown stream
|
||||
}
|
||||
last SWITCH;
|
||||
@ -242,18 +241,18 @@ sub process
|
||||
if ($pcno == 31) { # acknowledge a tranche of lines
|
||||
my $ref = $work{"$f[2]$f[3]"};
|
||||
if ($ref) {
|
||||
dbg('msg', "tranche ack stream $f[3]\n");
|
||||
dbg("tranche ack stream $f[3]\n") if isdbg('msg');
|
||||
$ref->send_tranche($self);
|
||||
$ref->{lastt} = $main::systime;
|
||||
} else {
|
||||
dbg('msg', "PC31 from unknown stream $f[3] from $f[2]" );
|
||||
dbg("PC31 from unknown stream $f[3] from $f[2]") if isdbg('msg');
|
||||
$self->send(DXProt::pc42($f[2], $f[1], $f[3])); # unknown stream
|
||||
}
|
||||
last SWITCH;
|
||||
}
|
||||
|
||||
if ($pcno == 32) { # incoming EOM
|
||||
dbg('msg', "stream $f[3]: EOM received\n");
|
||||
dbg("stream $f[3]: EOM received\n") if isdbg('msg');
|
||||
my $ref = $work{"$f[2]$f[3]"};
|
||||
if ($ref) {
|
||||
$self->send(DXProt::pc33($f[2], $f[1], $f[3])); # acknowledge it
|
||||
@ -274,7 +273,7 @@ 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('msg', "duplicate message from $ref->{from} -> $ref->{to} to $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");
|
||||
return;
|
||||
}
|
||||
@ -286,7 +285,7 @@ sub process
|
||||
# look for 'bad' to addresses
|
||||
if ($ref->dump_it) {
|
||||
$ref->stop_msg($self->call);
|
||||
dbg('msg', "'Bad' message $ref->{to}");
|
||||
dbg("'Bad' message $ref->{to}") if isdbg('msg');
|
||||
Log('msg', "'Bad' message $ref->{to}");
|
||||
return;
|
||||
}
|
||||
@ -302,7 +301,7 @@ sub process
|
||||
}
|
||||
$ref->stop_msg($self->call);
|
||||
} else {
|
||||
dbg('msg', "PC32 from unknown stream $f[3] from $f[2]" );
|
||||
dbg("PC32 from unknown stream $f[3] from $f[2]") if isdbg('msg');
|
||||
$self->send(DXProt::pc42($f[2], $f[1], $f[3])); # unknown stream
|
||||
}
|
||||
# queue_msg(0);
|
||||
@ -322,7 +321,7 @@ sub process
|
||||
}
|
||||
$ref->stop_msg($self->call);
|
||||
} else {
|
||||
dbg('msg', "PC33 from unknown stream $f[3] from $f[2]" );
|
||||
dbg("PC33 from unknown stream $f[3] from $f[2]") if isdbg('msg');
|
||||
$self->send(DXProt::pc42($f[2], $f[1], $f[3])); # unknown stream
|
||||
}
|
||||
|
||||
@ -336,7 +335,7 @@ sub process
|
||||
$f[3] =~ s/\.//og; # remove dots
|
||||
$f[3] =~ s/^\///o; # remove the leading /
|
||||
$f[3] = lc $f[3]; # to lower case;
|
||||
dbg('msg', "incoming file $f[3]\n");
|
||||
dbg("incoming file $f[3]\n") if isdbg('msg');
|
||||
$f[3] = 'packclus/' . $f[3] unless $f[3] =~ /^packclus\//o;
|
||||
|
||||
# create any directories
|
||||
@ -348,7 +347,7 @@ sub process
|
||||
$fn .= "/$part";
|
||||
next if -e $fn;
|
||||
last SWITCH if !mkdir $fn, 0777;
|
||||
dbg('msg', "created directory $fn\n");
|
||||
dbg("created directory $fn\n") if isdbg('msg');
|
||||
}
|
||||
my $stream = next_transno($f[2]);
|
||||
my $ref = DXMsg->alloc($stream, "$main::root/$f[3]", $self->call, time, !$f[4], $f[3], ' ', '0', '0');
|
||||
@ -368,7 +367,7 @@ sub process
|
||||
}
|
||||
|
||||
if ($pcno == 42) { # abort transfer
|
||||
dbg('msg', "stream $f[3]: abort received\n");
|
||||
dbg("stream $f[3]: abort received\n") if isdbg('msg');
|
||||
my $ref = $work{"$f[2]$f[3]"};
|
||||
if ($ref) {
|
||||
$ref->stop_msg($self->call);
|
||||
@ -399,7 +398,7 @@ sub store
|
||||
my $lines = shift;
|
||||
|
||||
if ($ref->{file}) { # a file
|
||||
dbg('msg', "To be stored in $ref->{to}\n");
|
||||
dbg("To be stored in $ref->{to}\n") if isdbg('msg');
|
||||
|
||||
my $fh = new IO::File "$ref->{to}", "w";
|
||||
if (defined $fh) {
|
||||
@ -408,7 +407,7 @@ sub store
|
||||
print $fh "$line\n";
|
||||
}
|
||||
$fh->close;
|
||||
dbg('msg', "file $ref->{to} stored\n");
|
||||
dbg("file $ref->{to} stored\n") if isdbg('msg');
|
||||
Log('msg', "file $ref->{to} from $ref->{from} stored" );
|
||||
} else {
|
||||
confess "can't open file $ref->{to} $!";
|
||||
@ -418,7 +417,7 @@ sub store
|
||||
# attempt to open the message file
|
||||
my $fn = filename($ref->{msgno});
|
||||
|
||||
dbg('msg', "To be stored in $fn\n");
|
||||
dbg("To be stored in $fn\n") if isdbg('msg');
|
||||
|
||||
# now save the file, overwriting what's there, YES I KNOW OK! (I will change it if it's a problem)
|
||||
my $fh = new IO::File "$fn", "w";
|
||||
@ -434,7 +433,7 @@ sub store
|
||||
print $fh "$line\n";
|
||||
}
|
||||
$fh->close;
|
||||
dbg('msg', "msg $ref->{msgno} stored\n");
|
||||
dbg("msg $ref->{msgno} stored\n") if isdbg('msg');
|
||||
Log('msg', "msg $ref->{msgno} from $ref->{from} to $ref->{to} stored" );
|
||||
} else {
|
||||
confess "can't open msg file $fn $!";
|
||||
@ -448,13 +447,13 @@ sub del_msg
|
||||
my $self = shift;
|
||||
|
||||
# remove it from the active message list
|
||||
dbg('msg', "\@msg = " . scalar @msg . " before delete");
|
||||
dbg("\@msg = " . scalar @msg . " before delete") if isdbg('msg');
|
||||
@msg = grep { $_ != $self } @msg;
|
||||
|
||||
# remove the file
|
||||
unlink filename($self->{msgno});
|
||||
dbg('msg', "deleting $self->{msgno}\n");
|
||||
dbg('msg', "\@msg = " . scalar @msg . " after delete");
|
||||
dbg("deleting $self->{msgno}\n") if isdbg('msg');
|
||||
dbg("\@msg = " . scalar @msg . " after delete") if isdbg('msg');
|
||||
}
|
||||
|
||||
# clean out old messages from the message queue
|
||||
@ -463,18 +462,18 @@ sub clean_old
|
||||
my $ref;
|
||||
|
||||
# mark old messages for deletion
|
||||
dbg('msg', "\@msg = " . scalar @msg . " before delete");
|
||||
dbg("\@msg = " . scalar @msg . " before delete") if isdbg('msg');
|
||||
foreach $ref (@msg) {
|
||||
if (ref($ref) && !$ref->{keep} && $ref->{t} < $main::systime - $maxage) {
|
||||
$ref->{deleteme} = 1;
|
||||
unlink filename($ref->{msgno});
|
||||
dbg('msg', "deleting old $ref->{msgno}\n");
|
||||
dbg("deleting old $ref->{msgno}\n") if isdbg('msg');
|
||||
}
|
||||
}
|
||||
|
||||
# remove them all from the active message list
|
||||
@msg = grep { !$_->{deleteme} } @msg;
|
||||
dbg('msg', "\@msg = " . scalar @msg . " after delete");
|
||||
dbg("\@msg = " . scalar @msg . " after delete") if isdbg('msg');
|
||||
$last_clean = $main::systime;
|
||||
}
|
||||
|
||||
@ -490,21 +489,21 @@ sub read_msg_header
|
||||
|
||||
$file = new IO::File "$fn";
|
||||
if (!$file) {
|
||||
dbg('err', "Error reading $fn $!");
|
||||
dbg("Error reading $fn $!");
|
||||
Log('err', "Error reading $fn $!");
|
||||
return undef;
|
||||
}
|
||||
$size = -s $fn;
|
||||
$line = <$file>; # first line
|
||||
if ($size == 0 || !$line) {
|
||||
dbg('err', "Empty $fn $!");
|
||||
dbg("Empty $fn $!");
|
||||
Log('err', "Empty $fn $!");
|
||||
return undef;
|
||||
}
|
||||
chomp $line;
|
||||
$size -= length $line;
|
||||
if (! $line =~ /^===/o) {
|
||||
dbg('err', "corrupt first line in $fn ($line)");
|
||||
dbg("corrupt first line in $fn ($line)");
|
||||
Log('err', "corrupt first line in $fn ($line)");
|
||||
return undef;
|
||||
}
|
||||
@ -516,7 +515,7 @@ sub read_msg_header
|
||||
chomp $line;
|
||||
$size -= length $line;
|
||||
if (! $line =~ /^===/o) {
|
||||
dbg('err', "corrupt second line in $fn ($line)");
|
||||
dbg("corrupt second line in $fn ($line)");
|
||||
Log('err', "corrupt second line in $fn ($line)");
|
||||
return undef;
|
||||
}
|
||||
@ -543,7 +542,7 @@ sub read_msg_body
|
||||
|
||||
$file = new IO::File;
|
||||
if (!open($file, $fn)) {
|
||||
dbg('err' ,"Error reading $fn $!");
|
||||
dbg("Error reading $fn $!");
|
||||
Log('err' ,"Error reading $fn $!");
|
||||
return undef;
|
||||
}
|
||||
@ -587,7 +586,7 @@ sub queue_msg
|
||||
# bat down the message list looking for one that needs to go off site and whose
|
||||
# nearest node is not busy.
|
||||
|
||||
dbg('msg', "queue msg ($sort)\n");
|
||||
dbg("queue msg ($sort)\n") if isdbg('msg');
|
||||
my @nodelist = DXChannel::get_all_nodes;
|
||||
foreach $ref (@msg) {
|
||||
|
||||
@ -600,7 +599,7 @@ sub queue_msg
|
||||
# any time outs?
|
||||
if (exists $ref->{lastt} && $main::systime >= $ref->{lastt} + $timeout) {
|
||||
my $node = $ref->{tonode};
|
||||
dbg('msg', "Timeout, stopping msgno: $ref->{msgno} -> $node");
|
||||
dbg("Timeout, stopping msgno: $ref->{msgno} -> $node") if isdbg('msg');
|
||||
Log('msg', "Timeout, stopping msgno: $ref->{msgno} -> $node");
|
||||
$ref->stop_msg($node);
|
||||
|
||||
@ -617,16 +616,22 @@ sub queue_msg
|
||||
my $dxchan;
|
||||
if ($ref->{private}) {
|
||||
next if $ref->{'read'}; # if it is read, it is stuck here
|
||||
$clref = DXCluster->get_exact($ref->{to});
|
||||
unless ($clref) { # otherwise look for a homenode
|
||||
my $uref = DXUser->get_current($ref->{to});
|
||||
my $hnode = $uref->homenode if $uref;
|
||||
$clref = DXCluster->get_exact($hnode) if $hnode;
|
||||
}
|
||||
if ($clref && !grep { $clref->dxchan == $_ } DXCommandmode::get_all()) {
|
||||
next if $clref->call eq $main::mycall; # i.e. it lives here
|
||||
$clref = Route::get($ref->{to});
|
||||
# unless ($clref) { # otherwise look for a homenode
|
||||
# my $uref = DXUser->get_current($ref->{to});
|
||||
# my $hnode = $uref->homenode if $uref;
|
||||
# $clref = Route::Node::get($hnode) if $hnode;
|
||||
# }
|
||||
if ($clref) {
|
||||
$dxchan = $clref->dxchan;
|
||||
$ref->start_msg($dxchan) if $dxchan && !get_busy($dxchan->call) && $dxchan->state eq 'normal';
|
||||
if ($dxchan) {
|
||||
if ($dxchan->is_node) {
|
||||
next if $clref->call eq $main::mycall; # i.e. it lives here
|
||||
$ref->start_msg($dxchan) if !get_busy($dxchan->call) && $dxchan->state eq 'normal';
|
||||
}
|
||||
} else {
|
||||
dbg("Route: No dxchan for $ref->{to} " . ref($clref) ) if isdbg('msg');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -672,7 +677,7 @@ sub start_msg
|
||||
{
|
||||
my ($self, $dxchan) = @_;
|
||||
|
||||
dbg('msg', "start msg $self->{msgno}\n");
|
||||
dbg("start msg $self->{msgno}\n") if isdbg('msg');
|
||||
$self->{linesreq} = 10;
|
||||
$self->{count} = 0;
|
||||
$self->{tonode} = $dxchan->call;
|
||||
@ -710,7 +715,7 @@ sub stop_msg
|
||||
my $stream = $self->{stream} if exists $self->{stream};
|
||||
|
||||
|
||||
dbg('msg', "stop msg $self->{msgno} -> node $node\n");
|
||||
dbg("stop msg $self->{msgno} -> node $node\n") if isdbg('msg');
|
||||
delete $work{$node};
|
||||
delete $work{"$node$stream"} if $stream;
|
||||
$self->workclean;
|
||||
@ -728,12 +733,12 @@ sub next_transno
|
||||
my $fh = new IO::File;
|
||||
if (sysopen($fh, $fn, O_RDWR|O_CREAT, 0666)) {
|
||||
$fh->autoflush(1);
|
||||
$msgno = $fh->getline;
|
||||
$msgno = $fh->getline || '0';
|
||||
chomp $msgno;
|
||||
$msgno++;
|
||||
seek $fh, 0, 0;
|
||||
$fh->print("$msgno\n");
|
||||
dbg('msg', "msgno $msgno allocated for $name\n");
|
||||
dbg("msgno $msgno allocated for $name\n") if isdbg('msg');
|
||||
$fh->close;
|
||||
} else {
|
||||
confess "can't open $fn $!";
|
||||
@ -749,9 +754,9 @@ sub init
|
||||
my $ref;
|
||||
|
||||
# load various control files
|
||||
dbg('err', "load badmsg: " . (load_badmsg() or "Ok"));
|
||||
dbg('err', "load forward: " . (load_forward() or "Ok"));
|
||||
dbg('err', "load swop: " . (load_swop() or "Ok"));
|
||||
dbg("load badmsg: " . (load_badmsg() or "Ok"));
|
||||
dbg("load forward: " . (load_forward() or "Ok"));
|
||||
dbg("load swop: " . (load_swop() or "Ok"));
|
||||
|
||||
# read in the directory
|
||||
opendir($dir, $msgdir) or confess "can't open $msgdir $!";
|
||||
@ -764,7 +769,7 @@ sub init
|
||||
|
||||
$ref = read_msg_header("$msgdir/$_");
|
||||
unless ($ref) {
|
||||
dbg('err', "Deleting $_");
|
||||
dbg("Deleting $_");
|
||||
Log('err', "Deleting $_");
|
||||
unlink "$msgdir/$_";
|
||||
next;
|
||||
@ -772,7 +777,7 @@ sub init
|
||||
|
||||
# delete any messages to 'badmsg.pl' places
|
||||
if ($ref->dump_it) {
|
||||
dbg('msg', "'Bad' TO address $ref->{to}");
|
||||
dbg("'Bad' TO address $ref->{to}") if isdbg('msg');
|
||||
Log('msg', "'Bad' TO address $ref->{to}");
|
||||
$ref->del_msg;
|
||||
next;
|
||||
@ -1064,7 +1069,7 @@ sub import_msgs
|
||||
# are there any to do in this directory?
|
||||
return unless -d $importfn;
|
||||
unless (opendir(DIR, $importfn)) {
|
||||
dbg('msg', "can\'t open $importfn $!");
|
||||
dbg("can\'t open $importfn $!") if isdbg('msg');
|
||||
Log('msg', "can\'t open $importfn $!");
|
||||
return;
|
||||
}
|
||||
@ -1078,7 +1083,7 @@ sub import_msgs
|
||||
my $fn = "$importfn/$name";
|
||||
next unless -f $fn;
|
||||
unless (open(MSG, $fn)) {
|
||||
dbg('msg', "can\'t open import file $fn $!");
|
||||
dbg("can\'t open import file $fn $!") if isdbg('msg');
|
||||
Log('msg', "can\'t open import file $fn $!");
|
||||
unlink($fn);
|
||||
next;
|
||||
@ -1111,7 +1116,7 @@ sub import_one
|
||||
my @f = split /\s+/, $line;
|
||||
unless (@f && $f[0] =~ /^(:?S|SP|SB|SEND)$/ ) {
|
||||
my $m = "invalid first line in import '$line'";
|
||||
dbg('MSG', $m );
|
||||
dbg($m) if isdbg('msg');
|
||||
return (1, $m);
|
||||
}
|
||||
while (@f) {
|
||||
|
987
perl/DXProt.pm
987
perl/DXProt.pm
File diff suppressed because it is too large
Load Diff
@ -67,36 +67,42 @@ sub pc12
|
||||
|
||||
#
|
||||
# add one or more users (I am expecting references that have 'call',
|
||||
# 'confmode' & 'here' method)
|
||||
# 'conf' & 'here' method)
|
||||
#
|
||||
# this will create a list of PC16 with up pc16_max_users in each
|
||||
# called $self->pc16(..)
|
||||
#
|
||||
sub pc16
|
||||
{
|
||||
my $self = shift;
|
||||
my $node = shift;
|
||||
my $ncall = $node->call;
|
||||
my @out;
|
||||
my $i;
|
||||
|
||||
for ($i = 0; @_; ) {
|
||||
my $str = "PC16^$self->{call}";
|
||||
for ( ; @_ && length $str < 200; $i++) {
|
||||
while (@_) {
|
||||
my $str = "PC16^$ncall";
|
||||
for ( ; @_ && length $str < 200; ) {
|
||||
my $ref = shift;
|
||||
$str .= sprintf "^%s %s %d", $ref->call, $ref->confmode ? '*' : '-', $ref->here;
|
||||
$str .= sprintf "^%s %s %d", $ref->call, $ref->conf ? '*' : '-', $ref->here;
|
||||
}
|
||||
$str .= sprintf "^%s^", get_hops(16);
|
||||
push @out, $str;
|
||||
$i = 0;
|
||||
}
|
||||
return (@out);
|
||||
return @out;
|
||||
}
|
||||
|
||||
# remove a local user
|
||||
sub pc17
|
||||
{
|
||||
my ($self, $ref) = @_;
|
||||
my $hops = get_hops(17);
|
||||
return "PC17^$ref->{call}^$self->{call}^$hops^";
|
||||
my @out;
|
||||
while (@_) {
|
||||
my $node = shift;
|
||||
my $ref = shift;
|
||||
my $hops = get_hops(17);
|
||||
my $ncall = $node->call;
|
||||
my $ucall = $ref->call;
|
||||
push @out, "PC17^$ucall^$ncall^$hops^";
|
||||
}
|
||||
return @out;
|
||||
}
|
||||
|
||||
# Request init string
|
||||
@ -110,22 +116,20 @@ sub pc18
|
||||
#
|
||||
sub pc19
|
||||
{
|
||||
my $self = shift;
|
||||
my @out;
|
||||
my $i;
|
||||
|
||||
|
||||
for ($i = 0; @_; ) {
|
||||
while(@_) {
|
||||
my $str = "PC19";
|
||||
for (; @_ && length $str < 200; $i++) {
|
||||
for (; @_ && length $str < 200;) {
|
||||
my $ref = shift;
|
||||
my $here = $ref->{here} ? '1' : '0';
|
||||
my $confmode = $ref->{confmode} ? '1' : '0';
|
||||
$str .= "^$here^$ref->{call}^$confmode^$ref->{pcversion}";
|
||||
my $call = $ref->call;
|
||||
my $here = $ref->here;
|
||||
my $conf = $ref->conf;
|
||||
my $version = $ref->version;
|
||||
$str .= "^$here^$call^$conf^$version";
|
||||
}
|
||||
$str .= sprintf "^%s^", get_hops(19);
|
||||
push @out, $str;
|
||||
$i = 0;
|
||||
}
|
||||
return @out;
|
||||
}
|
||||
@ -139,10 +143,14 @@ sub pc20
|
||||
# delete a node
|
||||
sub pc21
|
||||
{
|
||||
my ($call, $reason) = @_;
|
||||
my $hops = get_hops(21);
|
||||
$reason = "Gone." if !$reason;
|
||||
return "PC21^$call^$reason^$hops^";
|
||||
my @out;
|
||||
while (@_) {
|
||||
my $node = shift;
|
||||
my $hops = get_hops(21);
|
||||
my $call = $node->call;
|
||||
push @out, "PC21^$call^Gone^$hops^";
|
||||
}
|
||||
return @out;
|
||||
}
|
||||
|
||||
# end of init phase
|
||||
@ -157,7 +165,7 @@ sub pc24
|
||||
my $self = shift;
|
||||
my $call = $self->call;
|
||||
my $flag = $self->here ? '1' : '0';
|
||||
my $hops = get_hops(24);
|
||||
my $hops = shift || get_hops(24);
|
||||
|
||||
return "PC24^$call^$flag^$hops^";
|
||||
}
|
||||
@ -187,6 +195,7 @@ sub pc28
|
||||
my $time = ztime($t);
|
||||
$private = $private ? '1' : '0';
|
||||
$rr = $rr ? '1' : '0';
|
||||
$subject ||= ' ';
|
||||
return "PC28^$tonode^$fromnode^$to^$from^$date^$time^$private^$subject^ ^5^$rr^ ^$origin^~";
|
||||
}
|
||||
|
||||
@ -244,8 +253,7 @@ sub pc35
|
||||
# send all the DX clusters I reckon are connected
|
||||
sub pc38
|
||||
{
|
||||
my @nodes = map { ($_->dxchan && $_->dxchan->isolate) ? () : $_->call } DXNode->get_all();
|
||||
return "PC38^" . join(',', @nodes) . "^~";
|
||||
return join '^', "PC38", map {$_->call} Route::Node::get_all();
|
||||
}
|
||||
|
||||
# tell the local node to discconnect
|
||||
@ -268,9 +276,12 @@ sub pc40
|
||||
# user info
|
||||
sub pc41
|
||||
{
|
||||
my ($call, $sort, $info) = @_;
|
||||
my $hops = get_hops(41);
|
||||
$sort = $sort ? "$sort" : '0';
|
||||
my $call = shift;
|
||||
$call = shift if ref $call;
|
||||
|
||||
my $sort = shift || '0';
|
||||
my $info = shift || ' ';
|
||||
my $hops = shift || get_hops(41);
|
||||
return "PC41^$call^$sort^$info^$hops^~";
|
||||
}
|
||||
|
||||
@ -314,9 +325,11 @@ sub pc49
|
||||
# periodic update of users, plus keep link alive device (always H99)
|
||||
sub pc50
|
||||
{
|
||||
my $n = shift;
|
||||
$n = 0 unless $n >= 0;
|
||||
return "PC50^$main::mycall^$n^H99^";
|
||||
my $self = shift;
|
||||
my $call = $self->call;
|
||||
my $n = shift || '0';
|
||||
my $hops = shift || 'H99';
|
||||
return "PC50^$call^$n^$hops^";
|
||||
}
|
||||
|
||||
# generate pings
|
||||
|
@ -63,8 +63,9 @@ $lasttime = 0;
|
||||
pingint => '9,Node Ping interval',
|
||||
nopings => '9,Ping Obs Count',
|
||||
wantlogininfo => '9,Login info req,yesno',
|
||||
wantgrid => '0,DX Grid Info,yesno',
|
||||
wantgrid => '0,DX Grid Info,yesno',
|
||||
lastoper => '9,Last for/oper,cldatetime',
|
||||
nothere => '0,Not Here Text',
|
||||
);
|
||||
|
||||
no strict;
|
||||
@ -243,8 +244,8 @@ sub decode
|
||||
my $ref;
|
||||
eval '$ref = ' . $s;
|
||||
if ($@) {
|
||||
dbg('err', $@) if $@;
|
||||
Log('err', $@) if $@;
|
||||
dbg($@);
|
||||
Log('err', $@);
|
||||
$ref = undef;
|
||||
}
|
||||
return $ref;
|
||||
|
@ -50,7 +50,7 @@ sub send_raw
|
||||
my $sock = $conn->{sock};
|
||||
return unless defined($sock);
|
||||
push (@{$conn->{outqueue}}, $msg);
|
||||
dbg('connect', "connect $conn->{cnum}: $msg") unless $conn->{state} eq 'C';
|
||||
dbg("connect $conn->{cnum}: $msg") if $conn->{state} ne 'C' && isdbg('connect');
|
||||
Msg::set_event_handler ($sock, "write" => sub {$conn->_send(0)});
|
||||
}
|
||||
|
||||
@ -65,7 +65,7 @@ sub dequeue
|
||||
if ($conn->{state} eq 'WC') {
|
||||
if (exists $conn->{cmd}) {
|
||||
if (@{$conn->{cmd}}) {
|
||||
dbg('connect', "connect $conn->{cnum}: $conn->{msg}");
|
||||
dbg("connect $conn->{cnum}: $conn->{msg}") if isdbg('connect');
|
||||
$conn->_docmd($conn->{msg});
|
||||
}
|
||||
}
|
||||
@ -80,7 +80,7 @@ sub dequeue
|
||||
$conn->{msg} = pop @lines;
|
||||
}
|
||||
while (defined ($msg = shift @lines)) {
|
||||
dbg('connect', "connect $conn->{cnum}: $msg") unless $conn->{state} eq 'C';
|
||||
dbg("connect $conn->{cnum}: $msg") if $conn->{state} ne 'C' && isdbg('connect');
|
||||
|
||||
$msg =~ s/\xff\xfa.*\xff\xf0|\xff[\xf0-\xfe].//g; # remove telnet options
|
||||
$msg =~ s/[\x00-\x08\x0a-\x19\x1b-\x1f\x80-\x9f]/./g; # immutable CSI sequence + control characters
|
||||
@ -118,7 +118,7 @@ sub to_connected
|
||||
$conn->{timeout}->del if $conn->{timeout};
|
||||
delete $conn->{timeout};
|
||||
&{$conn->{rproc}}($conn, "$dir$call|$sort");
|
||||
$conn->_send_file("$main::data/connected");
|
||||
$conn->_send_file("$main::data/connected") unless $conn->{outgoing};
|
||||
}
|
||||
|
||||
sub new_client {
|
||||
@ -131,13 +131,13 @@ sub new_client {
|
||||
$conn->{blocking} = 0;
|
||||
eval {$conn->{peerhost} = $sock->peerhost};
|
||||
if ($@) {
|
||||
dbg('conn', $@);
|
||||
dbg($@) if isdbg('connll');
|
||||
$conn->disconnect;
|
||||
} else {
|
||||
eval {$conn->{peerport} = $sock->peerport};
|
||||
$conn->{peerport} = 0 if $@;
|
||||
my ($rproc, $eproc) = &{$server_conn->{rproc}} ($conn, $conn->{peerhost}, $conn->{peerport});
|
||||
dbg('connll', "accept $conn->{cnum} from $conn->{peerhost} $conn->{peerport}");
|
||||
dbg("accept $conn->{cnum} from $conn->{peerhost} $conn->{peerport}") if isdbg('connll');
|
||||
if ($eproc) {
|
||||
$conn->{eproc} = $eproc;
|
||||
Msg::set_event_handler ($sock, "error" => $eproc);
|
||||
@ -160,7 +160,7 @@ sub new_client {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
dbg('err', "ExtMsg: error on accept ($!)");
|
||||
dbg("ExtMsg: error on accept ($!)") if isdbg('err');
|
||||
}
|
||||
}
|
||||
|
||||
@ -169,6 +169,7 @@ sub start_connect
|
||||
my $call = shift;
|
||||
my $fn = shift;
|
||||
my $conn = ExtMsg->new(\&main::new_channel);
|
||||
$conn->{outgoing} = 1;
|
||||
$conn->conns($call);
|
||||
|
||||
my $f = new IO::File $fn;
|
||||
@ -217,16 +218,16 @@ sub _doconnect
|
||||
my $r;
|
||||
|
||||
$sort = lc $sort;
|
||||
dbg('connect', "CONNECT $conn->{cnum} sort: $sort command: $line");
|
||||
dbg("CONNECT $conn->{cnum} sort: $sort command: $line") if isdbg('connect');
|
||||
if ($sort eq 'telnet') {
|
||||
# this is a straight network connect
|
||||
my ($host, $port) = split /\s+/, $line;
|
||||
$port = 23 if !$port;
|
||||
$r = $conn->connect($host, $port);
|
||||
if ($r) {
|
||||
dbg('connect', "Connected $conn->{cnum} to $host $port");
|
||||
dbg("Connected $conn->{cnum} to $host $port") if isdbg('connect');
|
||||
} else {
|
||||
dbg('connect', "***Connect $conn->{cnum} Failed to $host $port $!");
|
||||
dbg("***Connect $conn->{cnum} Failed to $host $port $!") if isdbg('connect');
|
||||
}
|
||||
} elsif ($sort eq 'agw') {
|
||||
# turn it into an AGW object
|
||||
@ -251,7 +252,7 @@ sub _doconnect
|
||||
my $callback = sub {$conn->_rcv};
|
||||
Msg::set_event_handler ($a, read => $callback);
|
||||
}
|
||||
dbg('connect', "connect $conn->{cnum}: started pid: $conn->{pid} as $line");
|
||||
dbg("connect $conn->{cnum}: started pid: $conn->{pid} as $line") if isdbg('connect');
|
||||
} else {
|
||||
$^W = 0;
|
||||
dbgclose();
|
||||
@ -267,17 +268,17 @@ sub _doconnect
|
||||
$SIG{HUP} = $SIG{CHLD} = $SIG{TERM} = $SIG{INT} = 'DEFAULT';
|
||||
alarm(0);
|
||||
}
|
||||
exec "$line" or dbg('err', "exec '$line' failed $!");
|
||||
exec "$line" or dbg("exec '$line' failed $!");
|
||||
}
|
||||
} else {
|
||||
dbg('err', "cannot fork");
|
||||
dbg("cannot fork");
|
||||
$r = undef;
|
||||
}
|
||||
} else {
|
||||
dbg('err', "no socket pair $!");
|
||||
dbg("no socket pair $!");
|
||||
}
|
||||
} else {
|
||||
dbg('err', "invalid type of connection ($sort)");
|
||||
dbg("invalid type of connection ($sort)");
|
||||
}
|
||||
$conn->disconnect unless $r;
|
||||
return $r;
|
||||
@ -287,7 +288,7 @@ sub _doabort
|
||||
{
|
||||
my $conn = shift;
|
||||
my $string = shift;
|
||||
dbg('connect', "connect $conn->{cnum}: abort $string");
|
||||
dbg("connect $conn->{cnum}: abort $string") if isdbg('connect');
|
||||
$conn->{abort} = $string;
|
||||
}
|
||||
|
||||
@ -295,7 +296,7 @@ sub _dotimeout
|
||||
{
|
||||
my $conn = shift;
|
||||
my $val = shift;
|
||||
dbg('connect', "connect $conn->{cnum}: timeout set to $val");
|
||||
dbg("connect $conn->{cnum}: timeout set to $val") if isdbg('connect');
|
||||
$conn->{timeout}->del if $conn->{timeout};
|
||||
$conn->{timeval} = $val;
|
||||
$conn->{timeout} = Timer->new($val, sub{ &_timedout($conn) });
|
||||
@ -305,7 +306,7 @@ sub _dolineend
|
||||
{
|
||||
my $conn = shift;
|
||||
my $val = shift;
|
||||
dbg('connect', "connect $conn->{cnum}: lineend set to $val ");
|
||||
dbg("connect $conn->{cnum}: lineend set to $val ") if isdbg('connect');
|
||||
$val =~ s/\\r/\r/g;
|
||||
$val =~ s/\\n/\n/g;
|
||||
$conn->{lineend} = $val;
|
||||
@ -320,16 +321,16 @@ sub _dochat
|
||||
if ($line) {
|
||||
my ($expect, $send) = $cmd =~ /^\s*\'(.*)\'\s+\'(.*)\'/;
|
||||
if ($expect) {
|
||||
dbg('connect', "connect $conn->{cnum}: expecting: \"$expect\" received: \"$line\"");
|
||||
dbg("connect $conn->{cnum}: expecting: \"$expect\" received: \"$line\"") if isdbg('connect');
|
||||
if ($conn->{abort} && $line =~ /\Q$conn->{abort}/i) {
|
||||
dbg('connect', "connect $conn->{cnum}: aborted on /$conn->{abort}/");
|
||||
dbg("connect $conn->{cnum}: aborted on /$conn->{abort}/") if isdbg('connect');
|
||||
$conn->disconnect;
|
||||
delete $conn->{cmd};
|
||||
return;
|
||||
}
|
||||
if ($line =~ /\Q$expect/i) {
|
||||
if (length $send) {
|
||||
dbg('connect', "connect $conn->{cnum}: got: \"$expect\" sending: \"$send\"");
|
||||
dbg("connect $conn->{cnum}: got: \"$expect\" sending: \"$send\"") if isdbg('connect');
|
||||
$conn->send_later("D$conn->{call}|$send");
|
||||
}
|
||||
delete $conn->{msg}; # get rid any input if a match
|
||||
@ -344,7 +345,7 @@ sub _dochat
|
||||
sub _timedout
|
||||
{
|
||||
my $conn = shift;
|
||||
dbg('connect', "connect $conn->{cnum}: timed out after $conn->{timeval} seconds");
|
||||
dbg("connect $conn->{cnum}: timed out after $conn->{timeval} seconds") if isdbg('connect');
|
||||
$conn->disconnect;
|
||||
}
|
||||
|
||||
@ -374,7 +375,7 @@ sub _send_file
|
||||
while (<$f>) {
|
||||
chomp;
|
||||
my $l = $_;
|
||||
dbg('connll', "connect $conn->{cnum}: $l");
|
||||
dbg("connect $conn->{cnum}: $l") if isdbg('connll');
|
||||
$conn->send_raw($l . $conn->{lineend});
|
||||
}
|
||||
$f->close;
|
||||
|
@ -89,7 +89,7 @@ sub compile
|
||||
if ($@) {
|
||||
my $sort = $ref->{sort};
|
||||
my $name = $ref->{name};
|
||||
dbg('err', "Error compiling $ar $sort $name: $@");
|
||||
dbg("Error compiling $ar $sort $name: $@");
|
||||
Log('err', "Error compiling $ar $sort $name: $@");
|
||||
}
|
||||
$rr = $@;
|
||||
@ -107,7 +107,7 @@ sub read_in
|
||||
$in = undef;
|
||||
my $s = readfilestr($fn);
|
||||
my $newin = eval $s;
|
||||
dbg('conn', "$@") if $@;
|
||||
dbg($@) if $@;
|
||||
if ($in) {
|
||||
$newin = new('Filter::Old', $sort, $call, $flag);
|
||||
$newin->{filter} = $in;
|
||||
@ -187,10 +187,15 @@ sub it
|
||||
my $filter;
|
||||
my @keys = sort $self->getfilkeys;
|
||||
my $key;
|
||||
my $type = 'Dunno';
|
||||
my $asc = '?';
|
||||
|
||||
my $r = @keys > 0 ? 0 : 1;
|
||||
foreach $key (@keys) {
|
||||
$filter = $self->{$key};
|
||||
if ($filter->{reject} && exists $filter->{reject}->{code}) {
|
||||
$type = 'reject';
|
||||
$asc = $filter->{reject}->{user};
|
||||
if (&{$filter->{reject}->{code}}(\@_)) {
|
||||
$r = 0;
|
||||
last;
|
||||
@ -199,6 +204,8 @@ sub it
|
||||
}
|
||||
}
|
||||
if ($filter->{accept} && exists $filter->{accept}->{code}) {
|
||||
$type = 'accept';
|
||||
$asc = $filter->{accept}->{user};
|
||||
if (&{$filter->{accept}->{code}}(\@_)) {
|
||||
$r = 1;
|
||||
last;
|
||||
@ -211,6 +218,15 @@ sub it
|
||||
# hops are done differently (simply)
|
||||
my $hops = $self->{hops} if exists $self->{hops};
|
||||
|
||||
if (isdbg('filter')) {
|
||||
my $args = join '\',\'', @_;
|
||||
my $true = $r ? "OK " : "REJ";
|
||||
my $sort = $self->{sort};
|
||||
my $dir = $self->{name} =~ /^in_/i ? "IN " : "OUT";
|
||||
|
||||
my $h = $hops || '';
|
||||
dbg("$true $dir: $type/$sort with $asc on '$args' $h") if isdbg('filter');
|
||||
}
|
||||
return ($r, $hops);
|
||||
}
|
||||
|
||||
@ -271,7 +287,8 @@ sub install
|
||||
my $remove = shift;
|
||||
my $name = uc $self->{name};
|
||||
my $sort = $self->{sort};
|
||||
my $in = "in" if $name =~ s/^IN_//;
|
||||
my $in = "";
|
||||
$in = "in" if $name =~ s/^IN_//;
|
||||
$name =~ s/.PL$//;
|
||||
|
||||
my $dxchan = DXChannel->get($name);
|
||||
|
@ -40,6 +40,25 @@ $qrz_uid = undef;
|
||||
|
||||
$qrz_pw = undef;
|
||||
|
||||
#
|
||||
# the address of any HTTP proxy you might be using
|
||||
#
|
||||
# leave as is unless you need one
|
||||
#
|
||||
# eg: $http_proxy = 'wwwcache.demon.co.uk';
|
||||
#
|
||||
|
||||
$http_proxy = undef;
|
||||
|
||||
#
|
||||
# HTTP proxy port - again leave alone unless you need this
|
||||
#
|
||||
# eg: $http_proxy_port = 8080;
|
||||
#
|
||||
|
||||
$http_proxy_port = undef;
|
||||
|
||||
|
||||
#
|
||||
# end
|
||||
#
|
||||
|
@ -172,6 +172,7 @@ package DXM;
|
||||
nodeu => '$_[0] set back as a User',
|
||||
nodee1 => 'You cannot use this command whilst your target ($_[0]) is on-line',
|
||||
notdone => 'NOT Done',
|
||||
nothere => 'Sorry, but $_[0] isn\'t here at the moment, please try later',
|
||||
obscount => 'Ping obsolescence count on $_[0] set to $_[1]',
|
||||
ok => 'Operation successful',
|
||||
outconn => 'Outstanding connect to $_[0]',
|
||||
|
12
perl/Msg.pm
12
perl/Msg.pm
@ -80,7 +80,7 @@ sub new
|
||||
|
||||
$noconns++;
|
||||
|
||||
dbg('connll', "Connection created ($noconns)");
|
||||
dbg("Connection created ($noconns)") if isdbg('connll');
|
||||
return bless $conn, $class;
|
||||
}
|
||||
|
||||
@ -122,11 +122,11 @@ sub conns
|
||||
if (ref $pkg) {
|
||||
$call = $pkg->{call} unless $call;
|
||||
return undef unless $call;
|
||||
dbg('connll', "changing $pkg->{call} to $call") if exists $pkg->{call} && $call ne $pkg->{call};
|
||||
dbg("changing $pkg->{call} to $call") if isdbg('connll') && exists $pkg->{call} && $call ne $pkg->{call};
|
||||
delete $conns{$pkg->{call}} if exists $pkg->{call} && exists $conns{$pkg->{call}} && $pkg->{call} ne $call;
|
||||
$pkg->{call} = $call;
|
||||
$ref = $conns{$call} = $pkg;
|
||||
dbg('connll', "Connection $pkg->{cnum} $call stored");
|
||||
dbg("Connection $pkg->{cnum} $call stored") if isdbg('connll');
|
||||
} else {
|
||||
$ref = $conns{$call};
|
||||
}
|
||||
@ -199,7 +199,7 @@ sub disconnect {
|
||||
delete $conns{$call} if $ref && $ref == $conn;
|
||||
}
|
||||
$call ||= 'unallocated';
|
||||
dbg('connll', "Connection $conn->{cnum} $call disconnected");
|
||||
dbg("Connection $conn->{cnum} $call disconnected") if isdbg('connll');
|
||||
|
||||
unless ($main::is_win) {
|
||||
kill 'TERM', $conn->{pid} if exists $conn->{pid};
|
||||
@ -427,7 +427,7 @@ sub new_client {
|
||||
$conn->disconnect();
|
||||
}
|
||||
} else {
|
||||
dbg('err', "Msg: error on accept ($!)");
|
||||
dbg("Msg: error on accept ($!)") if isdbg('err');
|
||||
}
|
||||
}
|
||||
|
||||
@ -536,7 +536,7 @@ sub DESTROY
|
||||
my $call = $conn->{call} || 'unallocated';
|
||||
my $host = $conn->{peerhost} || '';
|
||||
my $port = $conn->{peerport} || '';
|
||||
dbg('connll', "Connection $conn->{cnum} $call [$host $port] being destroyed");
|
||||
dbg("Connection $conn->{cnum} $call [$host $port] being destroyed") if isdbg('connll');
|
||||
$noconns--;
|
||||
}
|
||||
|
||||
|
144
perl/Route.pm
144
perl/Route.pm
@ -15,23 +15,52 @@
|
||||
package Route;
|
||||
|
||||
use DXDebug;
|
||||
use DXChannel;
|
||||
use Prefix;
|
||||
|
||||
use strict;
|
||||
|
||||
use vars qw(%list %valid);
|
||||
use vars qw(%list %valid $filterdef);
|
||||
|
||||
%valid = (
|
||||
call => "0,Callsign",
|
||||
flags => "0,Flags,phex",
|
||||
dxcc => '0,Country Code',
|
||||
itu => '0,ITU Zone',
|
||||
cq => '0,CQ Zone',
|
||||
);
|
||||
|
||||
$filterdef = bless ([
|
||||
# tag, sort, field, priv, special parser
|
||||
['channel', 'c', 0],
|
||||
['channel_dxcc', 'n', 1],
|
||||
['channel_itu', 'n', 2],
|
||||
['channel_zone', 'n', 3],
|
||||
['call', 'c', 4],
|
||||
['call_dxcc', 'n', 5],
|
||||
['call_itu', 'n', 6],
|
||||
['call_zone', 'n', 7],
|
||||
], 'Filter::Cmd');
|
||||
|
||||
|
||||
sub new
|
||||
{
|
||||
my ($pkg, $call) = @_;
|
||||
$pkg = ref $pkg if ref $pkg;
|
||||
|
||||
dbg('routelow', "create " . (ref($pkg) || $pkg) ." with $call");
|
||||
my $self = bless {call => $call}, $pkg;
|
||||
dbg("create $pkg with $call") if isdbg('routelow');
|
||||
|
||||
# add in all the dxcc, itu, zone info
|
||||
my @dxcc = Prefix::extract($call);
|
||||
if (@dxcc > 0) {
|
||||
$self->{dxcc} = $dxcc[1]->dxcc;
|
||||
$self->{itu} = $dxcc[1]->itu;
|
||||
$self->{cq} = $dxcc[1]->cq;
|
||||
}
|
||||
$self->{flags} = here(1);
|
||||
|
||||
return bless {call => $call}, (ref $pkg || $pkg);
|
||||
return $self;
|
||||
}
|
||||
|
||||
#
|
||||
@ -60,7 +89,7 @@ sub _addlist
|
||||
my $call = _getcall($c);
|
||||
unless (grep {$_ eq $call} @{$self->{$field}}) {
|
||||
push @{$self->{$field}}, $call;
|
||||
dbg('routelow', ref($self) . " adding $call to " . $self->{call} . "->\{$field\}");
|
||||
dbg(ref($self) . " adding $call to " . $self->{call} . "->\{$field\}") if isdbg('routelow');
|
||||
}
|
||||
}
|
||||
return $self->{$field};
|
||||
@ -74,7 +103,7 @@ sub _dellist
|
||||
my $call = _getcall($c);
|
||||
if (grep {$_ eq $call} @{$self->{$field}}) {
|
||||
$self->{$field} = [ grep {$_ ne $call} @{$self->{$field}} ];
|
||||
dbg('routelow', ref($self) . " deleting $call from " . $self->{call} . "->\{$field\}");
|
||||
dbg(ref($self) . " deleting $call from " . $self->{call} . "->\{$field\}") if isdbg('routelow');
|
||||
}
|
||||
}
|
||||
return $self->{$field};
|
||||
@ -83,15 +112,21 @@ sub _dellist
|
||||
#
|
||||
# flag field constructors/enquirers
|
||||
#
|
||||
# These can be called in various ways:-
|
||||
#
|
||||
# Route::here or $ref->here returns 1 or 0 depending on value of the here flag
|
||||
# Route::here(1) returns 2 (the bit value of the here flag)
|
||||
# $ref->here(1) or $ref->here(0) sets the here flag
|
||||
#
|
||||
|
||||
sub here
|
||||
{
|
||||
my $self = shift;
|
||||
my $r = shift;
|
||||
return $self ? 2 : 0 unless ref $self;
|
||||
return $self->{flags} & 2 unless $r;
|
||||
return ($self->{flags} & 2) ? 1 : 0 unless defined $r;
|
||||
$self->{flags} = (($self->{flags} & ~2) | ($r ? 2 : 0));
|
||||
return $r;
|
||||
return $r ? 1 : 0;
|
||||
}
|
||||
|
||||
sub conf
|
||||
@ -99,9 +134,15 @@ sub conf
|
||||
my $self = shift;
|
||||
my $r = shift;
|
||||
return $self ? 1 : 0 unless ref $self;
|
||||
return $self->{flags} & 1 unless $r;
|
||||
return ($self->{flags} & 1) ? 1 : 0 unless defined $r;
|
||||
$self->{flags} = (($self->{flags} & ~1) | ($r ? 1 : 0));
|
||||
return $r;
|
||||
return $r ? 1 : 0;
|
||||
}
|
||||
|
||||
sub parents
|
||||
{
|
||||
my $self = shift;
|
||||
return @{$self->{parent}};
|
||||
}
|
||||
|
||||
#
|
||||
@ -120,6 +161,7 @@ sub config
|
||||
my $self = shift;
|
||||
my $nodes_only = shift;
|
||||
my $level = shift;
|
||||
my $seen = shift;
|
||||
my @out;
|
||||
my $line;
|
||||
my $call = $self->user_call;
|
||||
@ -133,6 +175,16 @@ sub config
|
||||
if ($printit) {
|
||||
$line = ' ' x ($level*2) . "$call";
|
||||
$call = ' ' x length $call;
|
||||
|
||||
# recursion detector
|
||||
if ((DXChannel->get($self->{call}) && $level > 1) || grep $self->{call} eq $_, @$seen) {
|
||||
$line .= ' ...';
|
||||
push @out, $line;
|
||||
return @out;
|
||||
}
|
||||
push @$seen, $self->{call};
|
||||
|
||||
# print users
|
||||
unless ($nodes_only) {
|
||||
if (@{$self->{users}}) {
|
||||
$line .= '->';
|
||||
@ -149,7 +201,7 @@ sub config
|
||||
} else {
|
||||
$line =~ s/\s+$//;
|
||||
push @out, $line;
|
||||
$line = ' ' x ($level*2) . "$call->";
|
||||
$line = ' ' x ($level*2) . "$call->$c ";
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -159,12 +211,14 @@ sub config
|
||||
push @out, $line if length $line;
|
||||
}
|
||||
|
||||
# deal with more nodes
|
||||
foreach my $ncall (sort @{$self->{nodes}}) {
|
||||
my $nref = Route::Node::get($ncall);
|
||||
|
||||
if ($nref) {
|
||||
my $c = $nref->user_call;
|
||||
push @out, $nref->config($nodes_only, $level+1, @_);
|
||||
# dbg("recursing from $call -> $c") if isdbg('routec');
|
||||
push @out, $nref->config($nodes_only, $level+1, $seen, @_);
|
||||
} else {
|
||||
push @out, ' ' x (($level+1)*2) . "$ncall?" if @_ == 0 || (@_ && grep $ncall =~ m|$_|, @_);
|
||||
}
|
||||
@ -173,10 +227,76 @@ sub config
|
||||
return @out;
|
||||
}
|
||||
|
||||
sub cluster
|
||||
{
|
||||
my $nodes = Route::Node::count();
|
||||
my $tot = Route::User::count();
|
||||
my $users = scalar DXCommandmode::get_all();
|
||||
my $maxusers = Route::User::max();
|
||||
my $uptime = main::uptime();
|
||||
|
||||
return " $nodes nodes, $users local / $tot total users Max users $maxusers Uptime $uptime";
|
||||
}
|
||||
|
||||
#
|
||||
# routing things
|
||||
#
|
||||
|
||||
sub get
|
||||
{
|
||||
my $call = shift;
|
||||
return Route::Node::get($call) || Route::User::get($call);
|
||||
}
|
||||
|
||||
# find all the possible dxchannels which this object might be on
|
||||
sub alldxchan
|
||||
{
|
||||
my $self = shift;
|
||||
my @dxchan;
|
||||
# dbg("Trying node $self->{call}") if isdbg('routech');
|
||||
my $dxchan = DXChannel->get($self->{call});
|
||||
push @dxchan, $dxchan if $dxchan;
|
||||
|
||||
# it isn't, build up a list of dxchannels and possible ping times
|
||||
# for all the candidates.
|
||||
unless (@dxchan) {
|
||||
foreach my $p (@{$self->{parent}}) {
|
||||
# dbg("Trying parent $p") if isdbg('routech');
|
||||
next if $p eq $main::mycall; # the root
|
||||
my $dxchan = DXChannel->get($p);
|
||||
if ($dxchan) {
|
||||
push @dxchan, $dxchan unless grep $dxchan == $_, @dxchan;
|
||||
} else {
|
||||
next if grep $p eq $_, @_;
|
||||
my $ref = Route::Node::get($p);
|
||||
# dbg("Next node $p " . ($ref ? 'Found' : 'NOT Found') if isdbg('routech') );
|
||||
push @dxchan, $ref->alldxchan($self->{call}, @_) if $ref;
|
||||
}
|
||||
}
|
||||
}
|
||||
# dbg('routech', "Got dxchan: " . join(',', (map{ $_->call } @dxchan)) );
|
||||
return @dxchan;
|
||||
}
|
||||
|
||||
sub dxchan
|
||||
{
|
||||
my $self = shift;
|
||||
my @dxchan = $self->alldxchan;
|
||||
return undef unless @dxchan;
|
||||
|
||||
# determine the minimum ping channel
|
||||
my $minping = 99999999;
|
||||
my $dxchan;
|
||||
foreach my $dxc (@dxchan) {
|
||||
my $p = $dxc->pingave;
|
||||
if (defined $p && $p < $minping) {
|
||||
$minping = $p;
|
||||
$dxchan = $dxc;
|
||||
}
|
||||
}
|
||||
$dxchan = shift @dxchan unless $dxchan;
|
||||
return $dxchan;
|
||||
}
|
||||
|
||||
#
|
||||
# track destruction
|
||||
@ -187,7 +307,7 @@ sub DESTROY
|
||||
my $self = shift;
|
||||
my $pkg = ref $self;
|
||||
|
||||
dbg('routelow', "$pkg $self->{call} destroyed");
|
||||
dbg("$pkg $self->{call} destroyed") if isdbg('routelow');
|
||||
}
|
||||
|
||||
no strict;
|
||||
|
@ -14,22 +14,24 @@ use Route::User;
|
||||
|
||||
use strict;
|
||||
|
||||
use vars qw(%list %valid @ISA $max);
|
||||
use vars qw(%list %valid @ISA $max $filterdef);
|
||||
@ISA = qw(Route);
|
||||
|
||||
%valid = (
|
||||
parent => '0,Parent Calls,parray',
|
||||
nodes => '0,Nodes,parray',
|
||||
users => '0,Users,parray',
|
||||
usercount => '0,User Count',
|
||||
version => '0,Version',
|
||||
);
|
||||
|
||||
$filterdef = $Route::filterdef;
|
||||
%list = ();
|
||||
$max = 0;
|
||||
|
||||
sub count
|
||||
{
|
||||
my $n = scalar %list;
|
||||
my $n = scalar (keys %list);
|
||||
$max = $n if $n > $max;
|
||||
return $n;
|
||||
}
|
||||
@ -55,9 +57,11 @@ sub add
|
||||
{
|
||||
my $parent = shift;
|
||||
my $call = uc shift;
|
||||
confess "Route::add trying to add $call to myself" if $call eq $parent->{call};
|
||||
my $self = get($call);
|
||||
if ($self) {
|
||||
$self->_addparent($parent->{call});
|
||||
$parent->_addnode($call);
|
||||
return undef;
|
||||
}
|
||||
$parent->_addnode($call);
|
||||
@ -79,19 +83,35 @@ sub del
|
||||
|
||||
# delete parent from this call's parent list
|
||||
my $pcall = $pref->{call};
|
||||
my $ncall = $self->{call};
|
||||
$pref->_delnode($ncall);;
|
||||
my $ref = $self->_delparent($pcall);
|
||||
my @nodes;
|
||||
|
||||
# is this the last connection?
|
||||
$self->_del_users;
|
||||
# is this the last connection, I have no parents anymore?
|
||||
unless (@$ref) {
|
||||
push @nodes, $self->del_nodes;
|
||||
foreach my $rcall (@{$self->{nodes}}) {
|
||||
next if grep $rcall eq $_, @_;
|
||||
my $r = Route::Node::get($rcall);
|
||||
push @nodes, $r->del($self, $ncall, @_) if $r;
|
||||
}
|
||||
$self->_del_users;
|
||||
delete $list{$self->{call}};
|
||||
push @nodes, $self;
|
||||
}
|
||||
push @nodes, $self;
|
||||
return @nodes;
|
||||
}
|
||||
|
||||
sub del_nodes
|
||||
{
|
||||
my $parent = shift;
|
||||
my @out;
|
||||
foreach my $rcall (@{$parent->{nodes}}) {
|
||||
my $r = get($rcall);
|
||||
push @out, $r->del($parent, $parent->{call}, @_) if $r;
|
||||
}
|
||||
return @out;
|
||||
}
|
||||
|
||||
sub _del_users
|
||||
{
|
||||
@ -103,28 +123,25 @@ sub _del_users
|
||||
$self->{users} = [];
|
||||
}
|
||||
|
||||
# remove all sub nodes from this parent
|
||||
sub del_nodes
|
||||
{
|
||||
my $self = shift;
|
||||
my @nodes;
|
||||
|
||||
for (@{$self->{nodes}}) {
|
||||
next if $self->{call} eq $_;
|
||||
push @nodes, $self->del_node($_);
|
||||
}
|
||||
return @nodes;
|
||||
}
|
||||
|
||||
# add a user to this node
|
||||
sub add_user
|
||||
{
|
||||
my $self = shift;
|
||||
my $ucall = shift;
|
||||
|
||||
confess "Trying to add NULL User call to routing tables" unless $ucall;
|
||||
|
||||
$self->_adduser($ucall);
|
||||
|
||||
|
||||
$self->{usercount} = scalar @{$self->{users}};
|
||||
my $uref = Route::User::get($ucall);
|
||||
return $uref ? () : (Route::User->new($ucall, $self->{call}, @_));
|
||||
my @out;
|
||||
if ($uref) {
|
||||
$uref->addparent($self->{call});
|
||||
} else {
|
||||
@out = Route::User->new($ucall, $self->{call}, @_);
|
||||
}
|
||||
return @out;
|
||||
}
|
||||
|
||||
# delete a user from this node
|
||||
@ -134,21 +151,45 @@ sub del_user
|
||||
my $ucall = shift;
|
||||
my $ref = Route::User::get($ucall);
|
||||
$self->_deluser($ucall);
|
||||
return ($ref->del($self)) if $ref;
|
||||
return ();
|
||||
my @out = $ref->del($self) if $ref;
|
||||
return @out;
|
||||
}
|
||||
|
||||
# delete a node from this node (ie I am a parent)
|
||||
sub del_node
|
||||
sub usercount
|
||||
{
|
||||
my $self = shift;
|
||||
my $ncall = shift;
|
||||
$self->_delnode($ncall);
|
||||
my $ref = get($ncall);
|
||||
return ($ref->del($self)) if $ref;
|
||||
return ();
|
||||
if (@_ && @{$self->{users}} == 0) {
|
||||
$self->{usercount} = shift;
|
||||
}
|
||||
return $self->{usercount};
|
||||
}
|
||||
|
||||
sub users
|
||||
{
|
||||
my $self = shift;
|
||||
return @{$self->{users}};
|
||||
}
|
||||
|
||||
sub nodes
|
||||
{
|
||||
my $self = shift;
|
||||
return @{$self->{nodes}};
|
||||
}
|
||||
|
||||
sub rnodes
|
||||
{
|
||||
my $self = shift;
|
||||
my @out;
|
||||
foreach my $call (@{$self->{nodes}}) {
|
||||
next if grep $call eq $_, @_;
|
||||
push @out, $call;
|
||||
my $r = get($call);
|
||||
push @out, $r->rnodes($call, @_) if $r;
|
||||
}
|
||||
return @out;
|
||||
}
|
||||
|
||||
|
||||
sub new
|
||||
{
|
||||
my $pkg = shift;
|
||||
@ -172,7 +213,14 @@ sub get
|
||||
{
|
||||
my $call = shift;
|
||||
$call = shift if ref $call;
|
||||
return $list{uc $call};
|
||||
my $ref = $list{uc $call};
|
||||
dbg("Failed to get Node $call" ) if !$ref && isdbg('routerr');
|
||||
return $ref;
|
||||
}
|
||||
|
||||
sub get_all
|
||||
{
|
||||
return values %list;
|
||||
}
|
||||
|
||||
sub _addparent
|
||||
@ -219,7 +267,7 @@ sub DESTROY
|
||||
my $pkg = ref $self;
|
||||
my $call = $self->{call} || "Unknown";
|
||||
|
||||
dbg('route', "destroying $pkg with $call");
|
||||
dbg("destroying $pkg with $call") if isdbg('routelow');
|
||||
}
|
||||
|
||||
#
|
||||
|
@ -13,19 +13,20 @@ use Route;
|
||||
|
||||
use strict;
|
||||
|
||||
use vars qw(%list %valid @ISA $max);
|
||||
use vars qw(%list %valid @ISA $max $filterdef);
|
||||
@ISA = qw(Route);
|
||||
|
||||
%valid = (
|
||||
parent => '0,Parent Calls,parray',
|
||||
);
|
||||
|
||||
$filterdef = $Route::filterdef;
|
||||
%list = ();
|
||||
$max = 0;
|
||||
|
||||
sub count
|
||||
{
|
||||
my $n = scalar %list;
|
||||
my $n = scalar(keys %list);
|
||||
$max = $n if $n > $max;
|
||||
return $n;
|
||||
}
|
||||
@ -57,15 +58,17 @@ sub del
|
||||
my $pref = shift;
|
||||
my $ref = $self->delparent($pref->{call});
|
||||
return () if @$ref;
|
||||
delete $list{$self->{call}};
|
||||
return ($ref);
|
||||
my @out = delete $list{$self->{call}};
|
||||
return @out;
|
||||
}
|
||||
|
||||
sub get
|
||||
{
|
||||
my $call = shift;
|
||||
$call = shift if ref $call;
|
||||
return $list{uc $call};
|
||||
my $ref = $list{uc $call};
|
||||
dbg("Failed to get User $call" ) if !$ref && isdbg('routerr');
|
||||
return $ref;
|
||||
}
|
||||
|
||||
sub addparent
|
||||
|
88
perl/Spot.pm
88
perl/Spot.pm
@ -16,11 +16,13 @@ use DXLog;
|
||||
use Julian;
|
||||
use Prefix;
|
||||
use DXDupe;
|
||||
use Data::Dumper;
|
||||
|
||||
use strict;
|
||||
use vars qw($fp $maxspots $defaultspots $maxdays $dirprefix $duplth $dupage $filterdef);
|
||||
use vars qw($fp $statp $maxspots $defaultspots $maxdays $dirprefix $duplth $dupage $filterdef);
|
||||
|
||||
$fp = undef;
|
||||
$statp = undef;
|
||||
$maxspots = 50; # maximum spots to return
|
||||
$defaultspots = 10; # normal number of spots to return
|
||||
$maxdays = 100; # normal maximum no of days to go back
|
||||
@ -88,6 +90,7 @@ sub init
|
||||
{
|
||||
mkdir "$dirprefix", 0777 if !-e "$dirprefix";
|
||||
$fp = DXLog::new($dirprefix, "dat", 'd');
|
||||
$statp = DXLog::new($dirprefix, "bys", 'd');
|
||||
}
|
||||
|
||||
sub prefix
|
||||
@ -183,7 +186,7 @@ sub search
|
||||
$expr =~ s/\$f(\d)/\$ref->[$1]/g; # swap the letter n for the correct field name
|
||||
# $expr =~ s/\$f(\d)/\$spots[$1]/g; # swap the letter n for the correct field name
|
||||
|
||||
dbg("search", "hint='$hint', expr='$expr', spotno=$from-$to, day=$dayfrom-$dayto\n");
|
||||
dbg("hint='$hint', expr='$expr', spotno=$from-$to, day=$dayfrom-$dayto\n") if isdbg('search');
|
||||
|
||||
# build up eval to execute
|
||||
$eval = qq(
|
||||
@ -313,6 +316,87 @@ sub listdups
|
||||
{
|
||||
return DXDupe::listdups('X', $dupage, @_);
|
||||
}
|
||||
|
||||
sub genstats
|
||||
{
|
||||
my @date = @_;
|
||||
my $in = $fp->open(@date);
|
||||
my $out = $statp->open(@date, 'w');
|
||||
my @freq = (
|
||||
[0, Bands::get_freq('160m')],
|
||||
[1, Bands::get_freq('80m')],
|
||||
[2, Bands::get_freq('40m')],
|
||||
[3, Bands::get_freq('30m')],
|
||||
[4, Bands::get_freq('20m')],
|
||||
[5, Bands::get_freq('17m')],
|
||||
[6, Bands::get_freq('15m')],
|
||||
[7, Bands::get_freq('12m')],
|
||||
[8, Bands::get_freq('10m')],
|
||||
[9, Bands::get_freq('6m')],
|
||||
[10, Bands::get_freq('4m')],
|
||||
[11, Bands::get_freq('2m')],
|
||||
[12, Bands::get_freq('70cm')],
|
||||
[13, Bands::get_freq('13cm')],
|
||||
[14, Bands::get_freq('9cm')],
|
||||
[15, Bands::get_freq('6cm')],
|
||||
[16, Bands::get_freq('3cm')],
|
||||
[17, Bands::get_freq('12mm')],
|
||||
[18, Bands::get_freq('6cm')],
|
||||
);
|
||||
my %list;
|
||||
my @tot;
|
||||
|
||||
if ($in && $out) {
|
||||
while (<$in>) {
|
||||
chomp;
|
||||
my ($freq, $by, $dxcc) = (split /\^/)[0,4,6];
|
||||
my $ref = $list{$by} || [0, $dxcc];
|
||||
for (@freq) {
|
||||
if ($freq >= $_->[1] && $freq <= $_->[2]) {
|
||||
$$ref[$_->[0]+2]++;
|
||||
$tot[$_->[0]+2]++;
|
||||
$$ref[0]++;
|
||||
$tot[0]++;
|
||||
$list{$by} = $ref;
|
||||
last;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
my $i;
|
||||
for ($i = 0; $i < @freq+2; $i++) {
|
||||
$tot[$i] ||= 0;
|
||||
}
|
||||
$out->write(join('^', 'TOTALS', @tot) . "\n");
|
||||
|
||||
for (sort {$list{$b}->[0] <=> $list{$a}->[0]} keys %list) {
|
||||
my $ref = $list{$_};
|
||||
my $call = $_;
|
||||
for ($i = 0; $i < @freq+2; ++$i) {
|
||||
$ref->[$i] ||= 0;
|
||||
}
|
||||
$out->write(join('^', $call, @$ref) . "\n");
|
||||
}
|
||||
$out->close;
|
||||
}
|
||||
}
|
||||
|
||||
# return true if the stat file is newer than than the spot file
|
||||
sub checkstats
|
||||
{
|
||||
my @date = @_;
|
||||
my $in = $fp->mtime(@date);
|
||||
my $out = $statp->mtime(@date);
|
||||
return defined $out && defined $in && $out >= $in;
|
||||
}
|
||||
|
||||
# daily processing
|
||||
sub daily
|
||||
{
|
||||
my @date = Julian::unixtoj($main::systime);
|
||||
@date = Julian::sub(@date, 1);
|
||||
genstats(@date) unless checkstats(@date);
|
||||
}
|
||||
1;
|
||||
|
||||
|
||||
|
@ -25,7 +25,7 @@ sub new
|
||||
$self->{interval} = $time if $recur;
|
||||
push @timerchain, $self;
|
||||
$notimers++;
|
||||
dbg('connll', "Timer created ($notimers)");
|
||||
dbg("Timer created ($notimers)") if isdbg('connll');
|
||||
return $self;
|
||||
}
|
||||
|
||||
@ -52,7 +52,7 @@ sub handler
|
||||
|
||||
sub DESTROY
|
||||
{
|
||||
dbg('connll', "timer destroyed ($Timer::notimers)");
|
||||
dbg("timer destroyed ($Timer::notimers)") if isdbg('connll');
|
||||
$Timer::notimers--;
|
||||
}
|
||||
1;
|
||||
|
@ -61,7 +61,6 @@ use DXProtVars;
|
||||
use DXProtout;
|
||||
use DXProt;
|
||||
use DXMsg;
|
||||
use DXCluster;
|
||||
use DXCron;
|
||||
use DXConnect;
|
||||
use DXBearing;
|
||||
@ -115,7 +114,7 @@ sub already_conn
|
||||
my ($conn, $call, $mess) = @_;
|
||||
|
||||
$conn->disable_read(1);
|
||||
dbg('chan', "-> D $call $mess\n");
|
||||
dbg("-> D $call $mess\n") if isdbg('chan');
|
||||
$conn->send_now("D$call|$mess");
|
||||
sleep(2);
|
||||
$conn->disconnect;
|
||||
@ -145,24 +144,9 @@ sub new_channel
|
||||
return;
|
||||
}
|
||||
|
||||
# is there one already connected elsewhere in the cluster?
|
||||
if ($user) {
|
||||
if (($user->is_node || $call eq $myalias) && !DXCluster->get_exact($call)) {
|
||||
;
|
||||
} else {
|
||||
if (my $ref = DXCluster->get_exact($call)) {
|
||||
my $mess = DXM::msg($lang, 'concluster', $call, $ref->mynode->dxchancall);
|
||||
already_conn($conn, $call, $mess);
|
||||
return;
|
||||
}
|
||||
}
|
||||
$user->{lang} = $main::lang if !$user->{lang}; # to autoupdate old systems
|
||||
} else {
|
||||
if (my $ref = DXCluster->get_exact($call)) {
|
||||
my $mess = DXM::msg($lang, 'concluster', $call, $ref->mynode->dxchancall);
|
||||
already_conn($conn, $call, $mess);
|
||||
return;
|
||||
}
|
||||
$user = DXUser->new($call);
|
||||
}
|
||||
|
||||
@ -221,7 +205,7 @@ sub cease
|
||||
eval {
|
||||
Local::finish(); # end local processing
|
||||
};
|
||||
dbg('local', "Local::finish error $@") if $@;
|
||||
dbg("Local::finish error $@") if $@;
|
||||
|
||||
# disconnect nodes
|
||||
foreach $dxchan (DXChannel->get_all_nodes) {
|
||||
@ -250,7 +234,7 @@ sub cease
|
||||
$l->close_server;
|
||||
}
|
||||
|
||||
dbg('chan', "DXSpider version $version, build $build ended");
|
||||
dbg("DXSpider version $version, build $build ended") if isdbg('chan');
|
||||
Log('cluster', "DXSpider V$version, build $build ended");
|
||||
dbgclose();
|
||||
Logclose();
|
||||
@ -264,11 +248,11 @@ sub reap
|
||||
{
|
||||
my $cpid;
|
||||
while (($cpid = waitpid(-1, WNOHANG)) > 0) {
|
||||
dbg('reap', "cpid: $cpid");
|
||||
dbg("cpid: $cpid") if isdbg('reap');
|
||||
# Msg->pid_gone($cpid);
|
||||
$zombies-- if $zombies > 0;
|
||||
}
|
||||
dbg('reap', "cpid: $cpid");
|
||||
dbg("cpid: $cpid") if isdbg('reap');
|
||||
}
|
||||
|
||||
# this is where the input queue is dealt with and things are dispatched off to other parts of
|
||||
@ -285,7 +269,7 @@ sub process_inqueue
|
||||
return unless defined $sort;
|
||||
|
||||
# do the really sexy console interface bit! (Who is going to do the TK interface then?)
|
||||
dbg('chan', "<- $sort $call $line\n") unless $sort eq 'D';
|
||||
dbg("<- $sort $call $line\n") if $sort ne 'D' && isdbg('chan');
|
||||
|
||||
# handle A records
|
||||
my $user = $dxchan->user;
|
||||
@ -300,6 +284,8 @@ sub process_inqueue
|
||||
$dxchan->disconnect;
|
||||
} elsif ($sort eq 'D') {
|
||||
; # ignored (an echo)
|
||||
} elsif ($sort eq 'G') {
|
||||
$dxchan->enhanced($line);
|
||||
} else {
|
||||
print STDERR atime, " Unknown command letter ($sort) received from $call\n";
|
||||
}
|
||||
@ -331,7 +317,7 @@ $starttime = $systime = time;
|
||||
$lang = 'en' unless $lang;
|
||||
|
||||
# open the debug file, set various FHs to be unbuffered
|
||||
dbginit();
|
||||
dbginit(\&DXCommandmode::broadcast_debug);
|
||||
foreach (@debug) {
|
||||
dbgadd($_);
|
||||
}
|
||||
@ -347,51 +333,55 @@ while (<CL>) {
|
||||
push @fn, $1;
|
||||
}
|
||||
close CL;
|
||||
my $subbuild;
|
||||
foreach my $fn (@fn) {
|
||||
$fn =~ s|::|/|g;
|
||||
open(CL, "$main::root/perl/${fn}.pm") or next;
|
||||
while (<CL>) {
|
||||
if (/^#\s+\$Id:\s+[\w\._]+,v\s+(\d+\.\d+)/ ) {
|
||||
if (/^#\s+\$Id:\s+[\w\._]+,v\s+(\d+\.\d+)\.?(\d+.\d+)?/ ) {
|
||||
$build += $1;
|
||||
$subbuild += $2 if $2;
|
||||
last;
|
||||
}
|
||||
}
|
||||
close CL;
|
||||
}
|
||||
$build = "$build.$subbuild" if $subbuild;
|
||||
|
||||
Log('cluster', "DXSpider V$version, build $build started");
|
||||
|
||||
# banner
|
||||
dbg('err', "DXSpider Version $version, build $build started", "Copyright (c) 1998-2001 Dirk Koopman G1TLH");
|
||||
dbg("Copyright (c) 1998-2001 Dirk Koopman G1TLH");
|
||||
dbg("DXSpider Version $version, build $build started");
|
||||
|
||||
# load Prefixes
|
||||
dbg('err', "loading prefixes ...");
|
||||
dbg("loading prefixes ...");
|
||||
Prefix::load();
|
||||
|
||||
# load band data
|
||||
dbg('err', "loading band data ...");
|
||||
dbg("loading band data ...");
|
||||
Bands::load();
|
||||
|
||||
# initialise User file system
|
||||
dbg('err', "loading user file system ...");
|
||||
dbg("loading user file system ...");
|
||||
DXUser->init($userfn, 1);
|
||||
|
||||
# start listening for incoming messages/connects
|
||||
dbg('err', "starting listeners ...");
|
||||
dbg("starting listeners ...");
|
||||
my $conn = IntMsg->new_server($clusteraddr, $clusterport, \&login);
|
||||
$conn->conns("Server $clusteraddr/$clusterport");
|
||||
push @listeners, $conn;
|
||||
dbg('err', "Internal port: $clusteraddr $clusterport");
|
||||
dbg("Internal port: $clusteraddr $clusterport");
|
||||
foreach my $l (@main::listen) {
|
||||
$conn = ExtMsg->new_server($l->[0], $l->[1], \&login);
|
||||
$conn->conns("Server $l->[0]/$l->[1]");
|
||||
push @listeners, $conn;
|
||||
dbg('err', "External Port: $l->[0] $l->[1]");
|
||||
dbg("External Port: $l->[0] $l->[1]");
|
||||
}
|
||||
AGWrestart();
|
||||
|
||||
# load bad words
|
||||
dbg('err', "load badwords: " . (BadWords::load or "Ok"));
|
||||
dbg("load badwords: " . (BadWords::load or "Ok"));
|
||||
|
||||
# prime some signals
|
||||
unless ($DB::VERSION) {
|
||||
@ -402,15 +392,15 @@ unless ($is_win) {
|
||||
$SIG{HUP} = 'IGNORE';
|
||||
$SIG{CHLD} = sub { $zombies++ };
|
||||
|
||||
$SIG{PIPE} = sub { dbg('err', "Broken PIPE signal received"); };
|
||||
$SIG{IO} = sub { dbg('err', "SIGIO received"); };
|
||||
$SIG{PIPE} = sub { dbg("Broken PIPE signal received"); };
|
||||
$SIG{IO} = sub { dbg("SIGIO received"); };
|
||||
$SIG{WINCH} = $SIG{STOP} = $SIG{CONT} = 'IGNORE';
|
||||
$SIG{KILL} = 'DEFAULT'; # as if it matters....
|
||||
|
||||
# catch the rest with a hopeful message
|
||||
for (keys %SIG) {
|
||||
if (!$SIG{$_}) {
|
||||
# dbg('chan', "Catching SIG $_");
|
||||
# dbg("Catching SIG $_") if isdbg('chan');
|
||||
$SIG{$_} = sub { my $sig = shift; DXDebug::confess("Caught signal $sig"); };
|
||||
}
|
||||
}
|
||||
@ -433,38 +423,43 @@ WCY->init();
|
||||
Spot->init();
|
||||
|
||||
# initialise the protocol engine
|
||||
dbg('err', "reading in duplicate spot and WWV info ...");
|
||||
dbg("reading in duplicate spot and WWV info ...");
|
||||
DXProt->init();
|
||||
|
||||
# put in a DXCluster node for us here so we can add users and take them away
|
||||
DXNode->new($DXProt::me, $mycall, 0, 1, $DXProt::myprot_version);
|
||||
$routeroot = Route::Node->new($mycall, $version, Route::here($DXProt::me->here)|Route::conf($DXProt::me->confmode));
|
||||
$routeroot = Route::Node->new($mycall, $version*100+5300, Route::here($DXProt::me->here)|Route::conf($DXProt::me->conf));
|
||||
|
||||
# make sure that there is a routing OUTPUT node default file
|
||||
#unless (Filter::read_in('route', 'node_default', 0)) {
|
||||
# my $dxcc = $DXProt::me->dxcc;
|
||||
# $Route::filterdef->cmd($DXProt::me, 'route', 'accept', "node_default call $mycall" );
|
||||
#}
|
||||
|
||||
# read in any existing message headers and clean out old crap
|
||||
dbg('err', "reading existing message headers ...");
|
||||
dbg("reading existing message headers ...");
|
||||
DXMsg->init();
|
||||
DXMsg::clean_old();
|
||||
|
||||
# read in any cron jobs
|
||||
dbg('err', "reading cron jobs ...");
|
||||
dbg("reading cron jobs ...");
|
||||
DXCron->init();
|
||||
|
||||
# read in database descriptors
|
||||
dbg('err', "reading database descriptors ...");
|
||||
dbg("reading database descriptors ...");
|
||||
DXDb::load();
|
||||
|
||||
# starting local stuff
|
||||
dbg('err', "doing local initialisation ...");
|
||||
dbg("doing local initialisation ...");
|
||||
eval {
|
||||
Local::init();
|
||||
};
|
||||
dbg('local', "Local::init error $@") if $@;
|
||||
dbg("Local::init error $@") if $@;
|
||||
|
||||
# print various flags
|
||||
#dbg('err', "seful info - \$^D: $^D \$^W: $^W \$^S: $^S \$^P: $^P");
|
||||
#dbg("seful info - \$^D: $^D \$^W: $^W \$^S: $^S \$^P: $^P");
|
||||
|
||||
# this, such as it is, is the main loop!
|
||||
dbg('err', "orft we jolly well go ...");
|
||||
dbg("orft we jolly well go ...");
|
||||
|
||||
#open(DB::OUT, "|tee /tmp/aa");
|
||||
|
||||
@ -493,7 +488,7 @@ for (;;) {
|
||||
eval {
|
||||
Local::process(); # do any localised processing
|
||||
};
|
||||
dbg('local', "Local::process error $@") if $@;
|
||||
dbg("Local::process error $@") if $@;
|
||||
}
|
||||
if ($decease) {
|
||||
last if --$decease <= 0;
|
||||
|
@ -87,7 +87,7 @@ for (@in) {
|
||||
sub doconnect
|
||||
{
|
||||
my ($sort, $line) = @_;
|
||||
dbg('connect', "CONNECT sort: $sort command: $line");
|
||||
dbg("CONNECT sort: $sort command: $line") if isdbg('connect');
|
||||
if ($sort eq 'net') {
|
||||
# this is a straight network connect
|
||||
my ($host) = $line =~ /host\s+(\w+)/o;
|
||||
@ -100,7 +100,7 @@ sub doconnect
|
||||
} elsif ($sort eq 'ax25') {
|
||||
my @args = split /\s+/, $line;
|
||||
$pid = open2(\*R, \*W, "$line") or die "can't do $line $!";
|
||||
dbg('connect', "got pid $pid");
|
||||
dbg("got pid $pid") if isdbg('connect');
|
||||
W->autoflush(1);
|
||||
} else {
|
||||
die "can't get here";
|
||||
@ -111,21 +111,21 @@ sub doconnect
|
||||
sub doabort
|
||||
{
|
||||
my $string = shift;
|
||||
dbg('connect', "abort $string");
|
||||
dbg("abort $string") if isdbg('connect');
|
||||
$abort = $string;
|
||||
}
|
||||
|
||||
sub dotimeout
|
||||
{
|
||||
my $val = shift;
|
||||
dbg('connect', "timeout set to $val");
|
||||
dbg("timeout set to $val") if isdbg('connect');
|
||||
alarm($timeout = $val);
|
||||
}
|
||||
|
||||
sub dochat
|
||||
{
|
||||
my ($expect, $send) = @_;
|
||||
dbg('connect', "CHAT \"$expect\" -> \"$send\"");
|
||||
dbg("CHAT \"$expect\" -> \"$send\"") if isdbg('connect');
|
||||
my $line;
|
||||
|
||||
alarm($timeout);
|
||||
@ -139,9 +139,9 @@ sub dochat
|
||||
$line = <R>;
|
||||
$line =~ s/\r//og;
|
||||
}
|
||||
dbg('connect', "received \"$line\"");
|
||||
dbg("received \"$line\"") if isdbg('connect');
|
||||
if ($abort && $line =~ /$abort/i) {
|
||||
dbg('connect', "aborted on /$abort/");
|
||||
dbg("aborted on /$abort/") if isdbg('connect');
|
||||
exit(11);
|
||||
}
|
||||
}
|
||||
@ -152,18 +152,18 @@ sub dochat
|
||||
local $\ = "\r";
|
||||
W->print("$send\r");
|
||||
}
|
||||
dbg('connect', "sent \"$send\"");
|
||||
dbg("sent \"$send\"") if isdbg('connect');
|
||||
}
|
||||
}
|
||||
|
||||
sub doclient
|
||||
{
|
||||
my ($cl, $args) = @_;
|
||||
dbg('connect', "client: $cl args: $args");
|
||||
dbg("client: $cl args: $args") if isdbg('connect');
|
||||
my @args = split /\s+/, $args;
|
||||
|
||||
# if (!defined ($pid = fork())) {
|
||||
# dbg('connect', "can't fork");
|
||||
# dbg("can't fork") if isdbg('connect');
|
||||
# exit(13);
|
||||
# }
|
||||
# if ($pid) {
|
||||
@ -182,7 +182,7 @@ sub doclient
|
||||
open STDOUT, ">&W";
|
||||
exec $cl, @args;
|
||||
} else {
|
||||
dbg('connect', "client can't get here");
|
||||
dbg("client can't get here") if isdbg('connect');
|
||||
exit(13);
|
||||
}
|
||||
# }
|
||||
@ -190,13 +190,13 @@ sub doclient
|
||||
|
||||
sub timeout
|
||||
{
|
||||
dbg('connect', "timed out after $timeout seconds");
|
||||
dbg("timed out after $timeout seconds") if isdbg('connect');
|
||||
exit(10);
|
||||
}
|
||||
|
||||
sub term
|
||||
{
|
||||
dbg('connect', "caught INT or TERM signal");
|
||||
dbg("caught INT or TERM signal") if isdbg('connect');
|
||||
kill $pid if $pid;
|
||||
sleep(2);
|
||||
exit(12);
|
||||
@ -205,5 +205,5 @@ sub term
|
||||
sub reap
|
||||
{
|
||||
my $wpid = wait;
|
||||
dbg('connect', "pid $wpid has died");
|
||||
dbg("pid $wpid has died") if isdbg('connect');
|
||||
}
|
||||
|
@ -4,9 +4,9 @@
|
||||
|
||||
<!-- Title information -->
|
||||
|
||||
<title>The DXSpider Administration Manual v1.47</title>
|
||||
<title>The DXSpider Administration Manual v1.48</title>
|
||||
<author>Ian Maude, G0VGS, (ianmaude@btinternet.com)</author>
|
||||
<date>Version 1.47 April 2001 revision 1.0</date>
|
||||
<date>Version 1.48 August 2001 revision 1.1</date>
|
||||
|
||||
<abstract>
|
||||
A reference for SysOps of the DXSpider DXCluster program.
|
||||
@ -17,353 +17,129 @@ A reference for SysOps of the DXSpider DXCluster program.
|
||||
|
||||
<!-- Begin the document -->
|
||||
|
||||
<sect>Hop control
|
||||
<sect>Routing and Filtering
|
||||
|
||||
<sect1>Introduction
|
||||
|
||||
<P>
|
||||
Starting with version 1.13 there is simple hop control available on a per
|
||||
node basis. Also it is possible to isolate a network completely so that you
|
||||
get all the benefits of being on that network, but can't pass on information
|
||||
from it to any other networks you may be connected to (or vice versa).
|
||||
|
||||
<sect1>Basic hop control
|
||||
From DXSpider version 1.48, major changes were introduced to the way
|
||||
node connections are treated. This is part of an ongoing process to
|
||||
remove problems with loops and to enable talk and other functions to
|
||||
propagate across the whole of the worldwide cluster network. In fact,
|
||||
in a Spider network, it would be useful, perhaps even necessary to
|
||||
have loops. This would give real resilience to the network, meaning
|
||||
that if a link dropped, the information flow would simply come in and
|
||||
go out via a different route. Of course, we do not have a complete
|
||||
network of Spider nodes, there are other programs out there. Some of
|
||||
these do not have any protection from loops. Certainly AK1A does not
|
||||
handle loops well at all. It is therefore necessary to have some form
|
||||
of protection for these nodes.
|
||||
|
||||
<P>
|
||||
In /spider/data you will find a file called hop_table.pl. This is the file
|
||||
that controls your hop count settings. It has a set of default hops on the
|
||||
various PC frames and also a set for each node you want to alter the hops for.
|
||||
You may be happy with the default settings of course, but this powerful tool
|
||||
can help to protect and improve the network. The file will look something
|
||||
like this ...
|
||||
This is achieved by using filtering on a route basis. There is a
|
||||
default setting to help to protect the network, especially useful for new
|
||||
and inexperienced SysOps. The idea is simple. When Spider is started
|
||||
for the first time and a connection is made to or from another node,
|
||||
the default is to only send the nodes you already have that are in your
|
||||
own zone. For example, in the UK the default setting would be to send
|
||||
only UK nodes to any connection. This can be filtered further (down to
|
||||
a single node if needed) or expanded as required.
|
||||
|
||||
|
||||
<sect1>Route Filters
|
||||
|
||||
<P>
|
||||
As mentioned in the introduction, a default setting exists. If this is
|
||||
all you want to use then that is fine, you have nothing else to do.
|
||||
However, if you want to make any alterations then you need to know
|
||||
a bit about filters.
|
||||
|
||||
<P>
|
||||
It is possible to reset the default setting for node connections should
|
||||
you wish to do so, however this can be dangerous to the network unless
|
||||
you have some experience in how all this works.... be careful! It is
|
||||
also possible to change settings for one connection only. You can,
|
||||
therefore, have many different filters set dependent on the amount of
|
||||
node links you have.
|
||||
|
||||
<P>
|
||||
I should at this stage give a little bit of background on filters. All
|
||||
the filters in Spider work in basically the same way. You can either
|
||||
accept or reject various options in order to create the filter rules
|
||||
you wish to achieve. Some filters are user settable, others can only
|
||||
be altered by the sysop. Route filtering can only be done by the sysop.
|
||||
|
||||
<sect1>The default_node filter
|
||||
|
||||
<P>
|
||||
As discussed previously, a default setting exists that only sends nodes
|
||||
from your own zone. This can be overridden by using the default_node
|
||||
filter option like this ...
|
||||
|
||||
<tscreen><verb>
|
||||
#
|
||||
# hop table construction
|
||||
#
|
||||
reject/route default_node <filter_option>
|
||||
|
||||
package DXProt;
|
||||
or
|
||||
|
||||
# default hopcount to use
|
||||
$def_hopcount = 5;
|
||||
|
||||
# some variable hop counts based on message type
|
||||
%hopcount =
|
||||
(
|
||||
11 => 10,
|
||||
16 => 10,
|
||||
17 => 10,
|
||||
19 => 10,
|
||||
21 => 10,
|
||||
);
|
||||
|
||||
|
||||
# the per node hop control thingy
|
||||
|
||||
|
||||
%nodehops =
|
||||
|
||||
GB7ADX => { 11 => 8,
|
||||
12 => 8,
|
||||
16 => 8,
|
||||
17 => 8,
|
||||
19 => 8,
|
||||
21 => 8,
|
||||
},
|
||||
|
||||
GB7UDX => { 11 => 8,
|
||||
12 => 8,
|
||||
16 => 8,
|
||||
17 => 8,
|
||||
19 => 8,
|
||||
21 => 8,
|
||||
},
|
||||
GB7BAA => {
|
||||
11 => 5,
|
||||
12 => 8,
|
||||
16 => 8,
|
||||
17 => 8,
|
||||
19 => 8,
|
||||
21 => 8,
|
||||
},
|
||||
};
|
||||
accept/route default_node <filter_option>
|
||||
</verb></tscreen>
|
||||
|
||||
<P>
|
||||
Each set of hops is contained within a pair of curly braces and contains a
|
||||
series of PC frame types. PC11 for example is a DX spot. The figures here
|
||||
are not exhaustive but should give you a good idea of how the file works.
|
||||
|
||||
<P>
|
||||
You can alter this file at any time, including whilst the cluster is running.
|
||||
If you alter the file during runtime, the command <em>load/hops</em> will
|
||||
bring your changes into effect.
|
||||
|
||||
<sect1>Isolating networks
|
||||
|
||||
<P>
|
||||
It is possible to isolate networks from each other on a "gateway" node using the
|
||||
<em>set/isolate <node_call></em> command.
|
||||
|
||||
<P>
|
||||
The effect of this is to partition an isolated network completely from another
|
||||
nodes connected to your node. Your node will appear on and otherwise behave
|
||||
normally on every network to which you are connected, but data from an isolated
|
||||
network will not cross onto any other network or vice versa. However all the
|
||||
spot, announce and WWV traffic and personal messages will still be handled
|
||||
locally (because you are a real node on all connected networks), that is locally
|
||||
connected users will appear on all networks and will be able to access and
|
||||
receive information from all networks transparently. All routed messages will
|
||||
be sent as normal, so if a user on one network knows that you are a gateway for
|
||||
another network, he can still still send a talk/announce etc message via your
|
||||
node and it will be routed across.
|
||||
|
||||
<P>
|
||||
The only limitation currently is that non-private messages cannot be passed down
|
||||
isolated links regardless of whether they are generated locally. This will change
|
||||
when the bulletin routing facility is added.
|
||||
|
||||
<P>
|
||||
If you use isolate on a node connection you will continue to receive all
|
||||
information from the isolated partner, however you will not pass any information
|
||||
back to the isolated node. There are times when you would like to forward only
|
||||
spots across a link (maybe during a contest for example). To do this, isolate
|
||||
the node in the normal way and put in a filter in the /spider/filter/spots
|
||||
directory to override the isolate. This filter can be very simple and consists
|
||||
of just one line ....
|
||||
where filter_option is one of the following ...
|
||||
|
||||
<tscreen><verb>
|
||||
$in = [
|
||||
[ 1, 0, 'd', 0, 3] # The last figure (3) is the hop count
|
||||
];
|
||||
call <prefixes>
|
||||
call_dxcc <numbers>
|
||||
call_itu <numbers>
|
||||
call_zone <numbers>
|
||||
origin <prefixes>
|
||||
origin_dxcc <numbers>
|
||||
origin_itu <numbers>
|
||||
origin_zone <numbers>
|
||||
</verb></tscreen>
|
||||
|
||||
<P>
|
||||
There is a lot more on filtering in the next section.
|
||||
Please be careful if you alter this setting, it will affect
|
||||
<bf><it>ALL</it></bf> your links!
|
||||
|
||||
<sect>Filtering (Old Style upto v1.44)
|
||||
<sect1>General route filtering
|
||||
|
||||
<P>
|
||||
Filters can be set for spots, announcements and WWV. You will find the
|
||||
directories for these under /spider/filter. You will find some examples in
|
||||
the directories with the suffix <em>.issue</em>. There are two types of
|
||||
filter, one for incoming information and one for outgoing information.
|
||||
Outgoing filters are in the form <em>CALLSIGN.pl</em> and incoming filters
|
||||
are in the form <em>in_CALLSIGN.pl</em>. Filters can be set for both nodes
|
||||
and users.
|
||||
|
||||
<P>
|
||||
All filters work in basically the same way. There are several elements
|
||||
delimited by commas. There can be many lines in the filter and they are
|
||||
read from the top by the program. When writing a filter you need to think
|
||||
carefully about just what you want to achieve. You are either going to write
|
||||
a filter to <em>accept</em> or to <em>reject</em>. Think of a filter as
|
||||
having 2 main elements. For a reject filter, you would have a line or multiple
|
||||
lines rejecting the things you do not wish to receive and then a default line
|
||||
accepting everything else that is not included in the filter. Likewise, for an
|
||||
accept filter, you would have a line or multiple lines accepting the things you
|
||||
wish to receive and a default line rejecting everthing else.
|
||||
|
||||
<P>
|
||||
In the example below, a user requires a filter that would only return SSB spots
|
||||
posted in Europe on the HF bands. This is achieved by first rejecting the CW
|
||||
section of each HF band and rejecting all of VHF, UHF etc based on frequency.
|
||||
Secondly, a filter rule is set based on CQ zones to only accept spots posted in
|
||||
Europe. Lastly, a default filter rule is set to reject anything outside the filter.
|
||||
Exactly the same rules apply for general route filtering. You would
|
||||
use either an accept filter or a reject filter like this ...
|
||||
|
||||
<tscreen><verb>
|
||||
$in = [
|
||||
[ 0, 0, 'r', # reject all CW spots
|
||||
[
|
||||
1800.0, 1850.0,
|
||||
3500.0, 3600.0,
|
||||
7000.0, 7040.0,
|
||||
14000.0, 14100.0,
|
||||
18068.0, 18110.0,
|
||||
21000.0, 21150.0,
|
||||
24890.0, 24930.0,
|
||||
28000.0, 28180.0,
|
||||
30000.0, 49000000000.0,
|
||||
] ,1 ],
|
||||
[ 1, 11, 'n', [ 14, 15, 16, 20, 33, ], 15 ], #accept EU
|
||||
[ 0, 0, 'd', 0, 1 ], # 1 = want, 'd' = everything else
|
||||
];
|
||||
reject/route <node_call> <filter_option>
|
||||
|
||||
or
|
||||
|
||||
accept/route <node_call> <filter_option>
|
||||
</verb></tscreen>
|
||||
|
||||
<P>
|
||||
The actual elements of each filter are described more fully in the following
|
||||
sections.
|
||||
|
||||
<sect1>Spots
|
||||
|
||||
<P>
|
||||
The elements of the Spot filter are ....
|
||||
where filter_option is one of the following ...
|
||||
|
||||
<tscreen><verb>
|
||||
[action, field_no, sort, possible_values, hops]
|
||||
call <prefixes>
|
||||
call_dxcc <numbers>
|
||||
call_itu <numbers>
|
||||
call_zone <numbers>
|
||||
origin <prefixes>
|
||||
origin_dxcc <numbers>
|
||||
origin_itu <numbers>
|
||||
origin_zone <numbers>
|
||||
</verb></tscreen>
|
||||
|
||||
<P>
|
||||
There are 3 elements here to look at. Firstly, the action element. This is
|
||||
very simple and only 2 possible states exist, accept (1) or drop (0).
|
||||
|
||||
<P>
|
||||
The second element is the field_no. There are 13 possiblities to choose from
|
||||
here ....
|
||||
Here are some examples of route filters ...
|
||||
|
||||
<tscreen><verb>
|
||||
0 = frequency
|
||||
1 = call
|
||||
2 = date in unix format
|
||||
3 = comment
|
||||
4 = spotter
|
||||
5 = spotted dxcc country
|
||||
6 = spotter's dxcc country
|
||||
7 = origin
|
||||
8 = spotted itu
|
||||
9 = spotted cq
|
||||
10 = spotter's itu
|
||||
11 = spotter's cq
|
||||
12 = callsign of the channel on which the spot has appeared
|
||||
rej/route gb7djk call_dxcc 61,38 (everything except UK+EIRE nodes)
|
||||
rej/route all (equiv to [very] restricted mode)
|
||||
acc/route gb7djk call_dxcc 61,38 (send only UK+EIRE nodes)
|
||||
acc/route gb7djk call gb7djk (equiv to SET/ISOLATE)
|
||||
</verb></tscreen>
|
||||
|
||||
<P>
|
||||
The third element tells us what to expect in the fourth element. There are
|
||||
4 possibilities ....
|
||||
|
||||
<tscreen><verb>
|
||||
n - numeric list of numbers e.g. [ 1,2,3 ]
|
||||
r - ranges of pairs of numbers e.g. between 2 and 4 or 10 to 17 - [ 2,4, 10,17 ]
|
||||
a - an alphanumeric regex
|
||||
d - the default rule
|
||||
</verb></tscreen>
|
||||
|
||||
<P>
|
||||
The fifth element is simply the hops to set in this filter. This would only
|
||||
be used if the filter was for a node of course and overrides the hop count in
|
||||
hop_table.pl.
|
||||
|
||||
<P>
|
||||
So, let's look at an example spot filter. It does not matter in the example
|
||||
who the filter is to be used for. So, what do we need in the filter? We need
|
||||
to filter the spots the user/node requires and also set a default rule for
|
||||
anything else outside the filter. Below is a simple filter that stops spots
|
||||
arriving from outside Europe.
|
||||
|
||||
<tscreen><verb>$in = [
|
||||
[ 0, 4, 'a', '^(K|N|A|W|VE|VA|J)'], # 0 = drop, 'a' = alphanumeric
|
||||
[ 1, 0, 'd', 0, 1 ], # 1 = want, 'd' = everything else
|
||||
];
|
||||
</verb></tscreen>
|
||||
|
||||
<P>
|
||||
So the filter is wrapped in between a pair of square brackets. This tells
|
||||
Spider to look in between these limits. Then each line is contained within
|
||||
its own square brackets and ends with a comma. Lets look carefully at the first
|
||||
line. The first element is 0 (drop). Therefore anything we put on this line
|
||||
will not be accepted. The next element is 4. This means we are filtering by
|
||||
the spotter. The third element is the letter "a" which tells the program to
|
||||
expect an alphanumeric expression in the fourth element. The fourth element
|
||||
is a list of letters separated by the pipe symbol.
|
||||
|
||||
<P>
|
||||
What this line does is tell the program to drop any spots posted by anyone in
|
||||
the USA, Canada or Japan.
|
||||
|
||||
<P>
|
||||
The second line is the default rule for anything else. The "d" tells us this
|
||||
and the line simply reads... accept anything else.
|
||||
|
||||
<P>
|
||||
You can add as many lines as you need to complete the filter but if there are
|
||||
several lines of the same type it is neater to enclose them all as one line.
|
||||
An example of this is where specific bands are set. We could write this like
|
||||
this ....
|
||||
|
||||
<tscreen><verb>
|
||||
[ 0,0,'r',[1800.0, 2000.0], 1],
|
||||
[ 0,0,'r',[10100.0, 10150.0], 1],
|
||||
[ 0,0,'r',[14000.0, 14350.0], 1],
|
||||
[ 0,0,'r',[18000.0, 18200.0], 1],
|
||||
</verb></tscreen>
|
||||
|
||||
<P>
|
||||
But the line below achieves the same thing and is more efficient ....
|
||||
|
||||
<tscreen><verb>
|
||||
[ 0, 0, 'r',
|
||||
[
|
||||
1800.0, 2000.0, # top band
|
||||
10100.0, 10150.0, # WARC
|
||||
14000.0, 14350.0, # 20m
|
||||
18000.0, 18200.0, # WARC
|
||||
[ ,1 ],
|
||||
</verb></tscreen>
|
||||
|
||||
|
||||
<sect1>Announcements
|
||||
|
||||
<P>
|
||||
<tscreen><verb>
|
||||
|
||||
# This is an example announce or filter allowing only West EU announces
|
||||
#
|
||||
# The element list is:-
|
||||
# 0 - callsign of announcer
|
||||
# 1 - destination * = all, <callsign> = routed to the node
|
||||
# 2 - text
|
||||
# 3 - * - sysop, <some text> - special list eg 6MUK, ' ', normal announce
|
||||
# 4 - origin
|
||||
# 5 - 0 - announce, 1 - wx
|
||||
# 6 - channel callsign (the interface from which this spot came)
|
||||
|
||||
$in = [
|
||||
[ 1, 0, 'a', '^(P[ABCDE]|DK0WCY|G|M|2|EI|F|ON)' ],
|
||||
[ 0, 0, 'd', 0 ]
|
||||
];
|
||||
</verb></tscreen>
|
||||
|
||||
In this example, only the prefixes listed will be allowed. It is possible to
|
||||
be quite specific. The Dutch prefix "P" is followed by several secondary
|
||||
identifiers which are allowed. So, in the example, "PA" or "PE" would be ok
|
||||
but not "PG". It is even possible to allow information from a single callsign.
|
||||
In the example this is DK0WCY, to allow the posting of his Aurora Beacon.
|
||||
|
||||
<sect1>WWV
|
||||
|
||||
<P>
|
||||
<tscreen><verb>
|
||||
|
||||
# This is an example WWV filter
|
||||
#
|
||||
# The element list is:-
|
||||
# 0 - nominal unix date of spot (ie the day + hour:13)
|
||||
# 1 - the hour
|
||||
# 2 - SFI
|
||||
# 3 - K
|
||||
# 4 - I
|
||||
# 5 - text
|
||||
# 6 - spotter
|
||||
# 7 - origin
|
||||
# 8 - incoming interface callsign
|
||||
|
||||
# this one doesn't filter, it just sets the hop count to 6 and is
|
||||
# used mainly just to override any isolation from WWV coming from
|
||||
# the internet.
|
||||
|
||||
$in = [
|
||||
[ 1, 0, 'd', 0, 6 ]
|
||||
];
|
||||
|
||||
</verb></tscreen>
|
||||
|
||||
<P>
|
||||
It should be noted that the filter will start to be used only once a user/node
|
||||
has logged out and back in again.
|
||||
<P>
|
||||
I am not going to spend any more time on these filters now as they will become
|
||||
more "comprehensive" in the near future.
|
||||
|
||||
<sect>Filtering (New Style v1.45 and later)
|
||||
|
||||
<sect1>General filter rules
|
||||
|
||||
<P>
|
||||
@ -574,6 +350,116 @@ what happens is that the reject is executed first, any non hf/cw spot is passed
|
||||
to the accept line, which lets through everything else on HF. The next filter line
|
||||
lets through just VHF/UHF spots from EU.
|
||||
|
||||
<sect1>Basic hop control
|
||||
|
||||
<P>
|
||||
In /spider/data you will find a file called hop_table.pl. This is the file
|
||||
that controls your hop count settings. It has a set of default hops on the
|
||||
various PC frames and also a set for each node you want to alter the hops for.
|
||||
You may be happy with the default settings of course, but this powerful tool
|
||||
can help to protect and improve the network. The file will look something
|
||||
like this ...
|
||||
|
||||
<tscreen><verb>
|
||||
#
|
||||
# hop table construction
|
||||
#
|
||||
|
||||
package DXProt;
|
||||
|
||||
# default hopcount to use
|
||||
$def_hopcount = 5;
|
||||
|
||||
# some variable hop counts based on message type
|
||||
%hopcount =
|
||||
(
|
||||
11 => 10,
|
||||
16 => 10,
|
||||
17 => 10,
|
||||
19 => 10,
|
||||
21 => 10,
|
||||
);
|
||||
|
||||
|
||||
# the per node hop control thingy
|
||||
|
||||
|
||||
%nodehops =
|
||||
|
||||
GB7ADX => { 11 => 8,
|
||||
12 => 8,
|
||||
16 => 8,
|
||||
17 => 8,
|
||||
19 => 8,
|
||||
21 => 8,
|
||||
},
|
||||
|
||||
GB7UDX => { 11 => 8,
|
||||
12 => 8,
|
||||
16 => 8,
|
||||
17 => 8,
|
||||
19 => 8,
|
||||
21 => 8,
|
||||
},
|
||||
GB7BAA => {
|
||||
11 => 5,
|
||||
12 => 8,
|
||||
16 => 8,
|
||||
17 => 8,
|
||||
19 => 8,
|
||||
21 => 8,
|
||||
},
|
||||
};
|
||||
</verb></tscreen>
|
||||
|
||||
<P>
|
||||
Each set of hops is contained within a pair of curly braces and contains a
|
||||
series of PC frame types. PC11 for example is a DX spot. The figures here
|
||||
are not exhaustive but should give you a good idea of how the file works.
|
||||
|
||||
<P>
|
||||
You can alter this file at any time, including whilst the cluster is running.
|
||||
If you alter the file during runtime, the command <em>load/hops</em> will
|
||||
bring your changes into effect.
|
||||
|
||||
<sect1>Isolating networks
|
||||
|
||||
<P>
|
||||
It is possible to isolate networks from each other on a "gateway" node using the
|
||||
<em>set/isolate <node_call></em> command.
|
||||
|
||||
<P>
|
||||
The effect of this is to partition an isolated network completely from another
|
||||
node connected to your node. Your node will appear on and otherwise behave
|
||||
normally on every network to which you are connected, but data from an isolated
|
||||
network will not cross onto any other network or vice versa. However all the
|
||||
spot, announce and WWV traffic and personal messages will still be handled
|
||||
locally (because you are a real node on all connected networks), that is locally
|
||||
connected users will appear on all networks and will be able to access and
|
||||
receive information from all networks transparently. All routed messages will
|
||||
be sent as normal, so if a user on one network knows that you are a gateway for
|
||||
another network, he can still still send a talk/announce etc message via your
|
||||
node and it will be routed across.
|
||||
|
||||
<P>
|
||||
The only limitation currently is that non-private messages cannot be passed down
|
||||
isolated links regardless of whether they are generated locally. This will change
|
||||
when the bulletin routing facility is added.
|
||||
|
||||
<P>
|
||||
If you use isolate on a node connection you will continue to receive all
|
||||
information from the isolated partner, however you will not pass any information
|
||||
back to the isolated node. There are times when you would like to forward only
|
||||
spots across a link (maybe during a contest for example). To do this, isolate
|
||||
the node in the normal way and put in a filter in the /spider/filter/spots
|
||||
directory to override the isolate. This filter can be very simple and consists
|
||||
of just one line ....
|
||||
|
||||
<tscreen><verb>
|
||||
$in = [
|
||||
[ 1, 0, 'd', 0, 3] # The last figure (3) is the hop count
|
||||
];
|
||||
</verb></tscreen>
|
||||
|
||||
<sect>Other filters
|
||||
|
||||
@ -1509,6 +1395,50 @@ default for nodes and users eg:-
|
||||
accept/ann user_default by G,M,2
|
||||
</verb></tscreen>
|
||||
|
||||
<sect1>accept/route (8)
|
||||
|
||||
<P>
|
||||
<tt>
|
||||
<bf>accept/route <call> [0-9] <pattern></bf> Set an 'accept' filter line for routing
|
||||
</tt>
|
||||
|
||||
<P>
|
||||
Create an 'accept this routing PC Protocol' line for a filter.
|
||||
|
||||
<P>
|
||||
An accept filter line means that if a PC16/17/19/21/24/41/50 matches this filter
|
||||
it is passed thru that interface. See HELP FILTERING for more info. Please read this
|
||||
to understand how filters work - it will save a lot of grief later on.
|
||||
|
||||
<P>
|
||||
You can use any of the following things in this line:-
|
||||
|
||||
<tscreen><verb>
|
||||
call <prefixes> the callsign of the thingy
|
||||
call_dxcc <numbers> eg: 61,62 (from eg: sh/pre G)
|
||||
call_itu <numbers>
|
||||
call_zone <numbers>
|
||||
origin <prefixes> really the interface it came in on
|
||||
origin_dxcc <numbers> eg: 61,62 (from eg: sh/pre G)
|
||||
origin_itu <numbers>
|
||||
origin_zone <numbers>
|
||||
</verb></tscreen>
|
||||
|
||||
<P>
|
||||
some examples:-
|
||||
|
||||
<tscreen><verb>
|
||||
acc/route gb7djk call_dxcc 61,38 (send only UK+EIRE nodes)
|
||||
acc/route gb7djk call gb7djk (equiv to SET/ISOLATE)
|
||||
</verb></tscreen>
|
||||
|
||||
<P>
|
||||
You can use the tag 'all' to accept everything eg:
|
||||
|
||||
<tscreen><verb>
|
||||
acc/route all
|
||||
</verb></tscreen>
|
||||
|
||||
<sect1>accept/spots (0)
|
||||
|
||||
<P>
|
||||
@ -1695,7 +1625,9 @@ default for nodes and users eg:-
|
||||
|
||||
<P>
|
||||
Send an announcement to LOCAL users only, where <text> is the text
|
||||
of the announcement you wish to broadcast
|
||||
of the announcement you wish to broadcast. If you do not wish to receive
|
||||
announces, use the <em>set/noannounce</em> command. Any announces made by
|
||||
a sysop will override set/noannounce.
|
||||
|
||||
<sect1>announce full (0)
|
||||
|
||||
@ -2534,6 +2466,47 @@ default for nodes and users eg:-
|
||||
reject/ann user_default by G,M,2
|
||||
</verb></tscreen>
|
||||
|
||||
<sect1>reject/route (8)
|
||||
|
||||
<P>
|
||||
<tt>
|
||||
<bf>reject/route <call> [0-9] <pattern></bf> Set an 'reject' filter line for routing
|
||||
</tt>
|
||||
|
||||
<P>
|
||||
Create an 'reject this routing PC Protocol' line for a filter.
|
||||
|
||||
<P>
|
||||
An reject filter line means that if a PC16/17/19/21/24/41/50 matches this filter
|
||||
it is NOT passed thru that interface. See HELP FILTERING for more info. Please
|
||||
read this to understand how filters work - it will save a lot of grief later on.
|
||||
You can use any of the following things in this line:-
|
||||
|
||||
<tscreen><verb>
|
||||
call <prefixes> the callsign of the thingy
|
||||
call_dxcc <numbers> eg: 61,62 (from eg: sh/pre G)
|
||||
call_itu <numbers>
|
||||
call_zone <numbers>
|
||||
origin <prefixes> really the interface it came in on
|
||||
origin_dxcc <numbers> eg: 61,62 (from eg: sh/pre G)
|
||||
origin_itu <numbers>
|
||||
origin_zone <numbers>
|
||||
</verb></tscreen>
|
||||
|
||||
<P>
|
||||
some examples:-
|
||||
|
||||
<tscreen><verb>
|
||||
rej/route gb7djk call_dxcc 61,38 (everything except UK+EIRE nodes)
|
||||
</verb></tscreen>
|
||||
|
||||
<P>
|
||||
You can use the tag 'all' to reject everything eg:
|
||||
|
||||
<tscreen><verb>
|
||||
rej/route all (equiv to [very] restricted mode)
|
||||
</verb></tscreen>
|
||||
|
||||
<sect1>reject/spots (0)
|
||||
|
||||
<P>
|
||||
@ -2884,6 +2857,13 @@ Use with extreme care. This command may well be superceded by FILTERing.
|
||||
<P>
|
||||
Add a beep to DX and other terminal messages.
|
||||
|
||||
<sect1>set/bbs (5)
|
||||
|
||||
<P>
|
||||
<tt>
|
||||
<bf>set/bbs <call> [<call>..]</bf>Make <call> a BBS
|
||||
</tt>
|
||||
|
||||
<sect1>set/clx (5)
|
||||
|
||||
<P>
|
||||
@ -3975,6 +3955,24 @@ Only the fields that are defined (in perl term) will be displayed.
|
||||
This command shows the internal status of a message and includes information
|
||||
such as to whom it has been forwarded, its size, origin etc etc.
|
||||
|
||||
<P>
|
||||
If no message number is given then the status of the message system is
|
||||
displayed.
|
||||
|
||||
<sect1>stat/route_node (5)
|
||||
|
||||
<P>
|
||||
<tt>
|
||||
<bf>stat/route_node <callsign></bf> Show the data in a Route::Node object
|
||||
</tt>
|
||||
|
||||
<sect1>stat/route_user (5)
|
||||
|
||||
<P>
|
||||
<tt>
|
||||
<bf>stat/route_user <callsign></bf> Show the data in a Route::User object
|
||||
</tt>
|
||||
|
||||
<sect1>stat/user (5)
|
||||
|
||||
<P>
|
||||
|
@ -4,10 +4,10 @@
|
||||
|
||||
<!-- Title information -->
|
||||
|
||||
<title>The DXSpider Installation Manual v1.47</title>
|
||||
<title>The DXSpider Installation Manual v1.48</title>
|
||||
<author>Iain Philipps, G0RDI (g0rdi@77hz.com) and
|
||||
Ian Maude, G0VGS, (ianmaude@btinternet.com)</author>
|
||||
<date>Version 1.47, April 2001 revision 1.0</date>
|
||||
<date>Version 1.48, July 2001 revision 1.1</date>
|
||||
|
||||
<abstract>
|
||||
A reference for SysOps of the DXSpider DXCluster program.
|
||||
@ -46,17 +46,67 @@ following modules from <htmlurl url="http://www.cpan.org/CPAN.html" name="http:/
|
||||
|
||||
<P>
|
||||
<itemize>
|
||||
<item> Data-Dumper-2.101.tar.gz
|
||||
<item> TimeDate-1.10.tar.gz
|
||||
<item> IO-1.20.tar.gz (for perl 5.00403 and lower)
|
||||
<item> Net-Telnet-3.02.tar.gz
|
||||
<item> Curses-1.05.tar.gz
|
||||
<item> Time-HiRes-01.20.tar.gz
|
||||
<item> <htmlurl url="http://www.cpan.org/modules/by-module/Data/Data-Dumper-2.10.tar.gz" name="Data-Dumper-2.10.tar.gz">
|
||||
<item> <htmlurl url="http://www.cpan.org/modules/by-module/Date/TimeDate-1.10.tar.gz" name="TimeDate-1.10.tar.gz">
|
||||
<item> <htmlurl url="http://www.cpan.org/modules/by-module/IO/IO-1.20.tar.gz" name="IO-1.20.tar.gz (for perl 5.00403 and lower)">
|
||||
<item> <htmlurl url="http://www.cpan.org/modules/by-module/Net/Net-Telnet-3.02.tar.gz" name="Net-Telnet-3.02.tar.gz">
|
||||
<item> <htmlurl url="http://www.cpan.org/modules/by-module/Curses/Curses-1.05.tar.gz" name="Curses-1.05.tar.gz">
|
||||
<item> <htmlurl url="http://www.cpan.org/modules/by-module/Time/Time-HiRes-01.20.tar.gz" name="Time-HiRes-01.20.tar.gz">
|
||||
</itemize>
|
||||
|
||||
<P>
|
||||
<em>Do</em> get the latest versions of these packages and install them
|
||||
but use the above list as the earliest versions usable.
|
||||
Copy the CPAN modules listed above to a convenient place on your computer. One good place would be /usr/local/packages, and the instructions which follow will assume that that's where you have put them.
|
||||
|
||||
<P>
|
||||
Log in as 'root', and make sure you're at '/root' before you continue. Here are exactly the commands you must issue next: -
|
||||
|
||||
<verb>
|
||||
# tar xvfz /usr/local/packages/Data-Dumper-2.10.tar.gz
|
||||
# cd Data-Dumper-2.10
|
||||
# perl Makefile.PL
|
||||
# make test
|
||||
# make install
|
||||
# cd ..
|
||||
#
|
||||
# tar xvfz /usr/local/packages/TimeDate-1.10.tar.gz
|
||||
# cd TimeDate-1.10
|
||||
# perl Makefile.PL
|
||||
# make test
|
||||
# make install
|
||||
# cd ..
|
||||
#
|
||||
# tar xvfz /usr/local/packages/IO-1.20.tar.gz
|
||||
# cd IO-1.20
|
||||
# perl Makefile.PL
|
||||
# make test
|
||||
# make install UNINST=1
|
||||
# cd ..
|
||||
#
|
||||
# tar xvfz /usr/local/packages/Net-Telnet-3.02.tar.gz
|
||||
# cd Net-Telnet-3.02
|
||||
# perl Makefile.PL
|
||||
# make test
|
||||
# make install
|
||||
# cd ..
|
||||
#
|
||||
# tar xvfz /usr/local/packages/Curses-1.05.tar.gz
|
||||
# cd Curses-1.05
|
||||
# perl Makefile.PL
|
||||
# make test
|
||||
# make install
|
||||
# cd ..
|
||||
#
|
||||
# tar xvfz /usr/local/packages/Time-HiRes-01.20.tar.gz
|
||||
# cd Time-HiRes-01.20
|
||||
# perl Makefile.PL
|
||||
# make test
|
||||
# make install
|
||||
# cd ..
|
||||
</verb>
|
||||
|
||||
<P>
|
||||
Do not fall into the trap of thinking they're all the same, just because they nearly are! Pay particular attention to the instructions of IO, above.
|
||||
|
||||
|
||||
<sect1>Preparation
|
||||
|
||||
|
@ -1,79 +1,91 @@
|
||||
#! /bin/sh
|
||||
#
|
||||
###################################################
|
||||
#
|
||||
# Edit the following lines
|
||||
#
|
||||
#
|
||||
portnumber=$"1407"
|
||||
tempdir=$"/usr/local/httpd/spider/client/"
|
||||
clustercall=$"PA4AB-15"
|
||||
#
|
||||
#
|
||||
#
|
||||
# End of configurable part
|
||||
#
|
||||
####################################################
|
||||
hostname=$"localhost"
|
||||
#!/usr/bin/perl
|
||||
|
||||
echo "Content-type: text/html"
|
||||
echo
|
||||
echo "<HTML><HEAD>"
|
||||
echo "<TITLE>Spider DX Cluster</TITLE>"
|
||||
echo "</HEAD><BODY>"
|
||||
echo '<BODY BGCOLOR="#d8d0c8">'
|
||||
echo "<PRE>"
|
||||
# cluster-web.pl - perl login script for cluster web interface.
|
||||
# @author Ian Norton
|
||||
# - Based on clx-web by DL6DBH (ftp://clx.muc.de/pub/clx/clx-java_10130001.tgz)
|
||||
# - Modified by PA4AB
|
||||
# @version 0.1 beta. 20010610.
|
||||
|
||||
pattern=$(echo ${QUERY_STRING} | sed -e s,'call=',, | sed -e s/"&passwd="/" "/)
|
||||
call=$(echo $pattern | cut -d' ' -f1)
|
||||
passwd=$(echo $pattern | cut -s -d' ' -f2)
|
||||
# Work out the hostname of this server.
|
||||
use Sys::Hostname;
|
||||
my $HOSTNAME = hostname();
|
||||
|
||||
# Set the hostname manually here if the above fails.
|
||||
# $HOSTNAME = "gb7mbc.spoo.org" ;
|
||||
$PORT = "8000" ;
|
||||
|
||||
if [ ${call} = ""] ; then
|
||||
echo "<BR>"
|
||||
echo "<CENTER>"
|
||||
echo "<STRONG><FONT SIZE=5>Welcome to the Spider DX Cluster</FONT></STRONG>"
|
||||
echo "<STRONG><FONT SIZE=5>"
|
||||
echo ${clustercall}
|
||||
echo "</FONT></STRONG>"
|
||||
echo "<P> </P>"
|
||||
echo '<FORM action="/cgi-bin/spider.cgi" method=get>'
|
||||
echo "<STRONG>Your Call Please: </STRONG> "
|
||||
echo '<INPUT name="call" size=10> '
|
||||
echo '<INPUT type=submit value="Click here to Login">'
|
||||
echo "</CENTER>"
|
||||
echo "<BR>"
|
||||
# Send text/html header to the browser.
|
||||
print "Content-type: text/html\n\n";
|
||||
|
||||
# Get the parameters passed to the script.
|
||||
read (STDIN, $post_data, $ENV{CONTENT_LENGTH});
|
||||
@call = split (/=/, $post_data) ;
|
||||
|
||||
# Print the page header.
|
||||
|
||||
print <<'EOF';
|
||||
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
|
||||
<HTML LANG="EN">
|
||||
<HEAD>
|
||||
<TITLE>Cluster Web - DX Cluster Web Interface.</TITLE>
|
||||
<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=ISO-8859-1">
|
||||
<META NAME="Author" CONTENT="Ian Norton.">
|
||||
<META NAME="DESCRIPTION" CONTENT="DX Cluster web interface">
|
||||
</HEAD>
|
||||
|
||||
<BODY BGCOLOR="#FFFFFF" LINK="#008080" ALINK="#000099" VLINK="#000099">
|
||||
|
||||
<H1>
|
||||
<CENTER>
|
||||
<FONT FACE="arial, helvicta" COLOR="#008080" SIZE=+2>
|
||||
<B><BR>Cluster Web - DX Cluster Web Interface.</B><BR>
|
||||
EOF
|
||||
|
||||
print("Welcome to $HOSTNAME<BR>") ;
|
||||
|
||||
print <<'EOF';
|
||||
</FONT>
|
||||
</CENTER>
|
||||
</H1>
|
||||
|
||||
<BR CLEAR="ALL">
|
||||
|
||||
<HR>
|
||||
EOF
|
||||
|
||||
if($ENV{CONTENT_LENGTH} > 0)
|
||||
{
|
||||
# Callsign is set - print the whole <APPLET> stuff....
|
||||
# print("Callsign is $call[1]<BR>\n") ;
|
||||
|
||||
print("<CENTER>\n") ;
|
||||
print(" <APPLET CODE=\"spiderclient.class\" CODEBASE=\"/client/\" width=800 height=130>\n") ;
|
||||
print(" <PARAM NAME=\"CALL\" VALUE=\"$call[1]\">\n") ;
|
||||
print(" <PARAM NAME=\"HOSTNAME\" VALUE=\"$HOSTNAME\">\n") ;
|
||||
print(" <PARAM NAME=\"PORT\" VALUE=\"$PORT\">\n") ;
|
||||
print(" </APPLET>\n") ;
|
||||
print("</CENTER>\n") ;
|
||||
}
|
||||
else
|
||||
echo "<HTML>" > ${tempfile}${call}.html
|
||||
echo "<HEAD>" >> ${tempfile}${call}.html
|
||||
echo "</HEAD>" >> ${tempfile}${call}.html
|
||||
echo "<BODY>" >> ${tempfile}${call}.html
|
||||
echo '<APPLET code="spiderclient.class" width=800 height=130>' >> ${tempdir}${call}.html
|
||||
echo '<PARAM NAME="CALL" VALUE=' >> ${tempdir}${call}.html
|
||||
echo ${call} >> ${tempdir}${call}.html
|
||||
echo ">" >> ${tempdir}${call}.html
|
||||
echo ">" >> ${tempdir}${call}.html
|
||||
echo '<PARAM NAME="HOSTNAME" VALUE="' >> ${tempdir}${call}.html
|
||||
echo ${hostname} >> ${tempdir}${call}.html
|
||||
echo '">' >> ${tempdir}${call}.html
|
||||
echo '<PARAM NAME="PORT" VALUE="' >> ${tempdir}${call}.html
|
||||
echo ${portnumber} >> ${tempdir}${call}.html
|
||||
echo '">' >> ${tempdir}${call}.html
|
||||
echo "</APPLET>" >> ${tempdir}${call}.html
|
||||
echo "</BODY>" >> ${tempdir}${call}.html
|
||||
echo "</HTML>" >> ${tempdir}${call}.html
|
||||
GOTO='<meta http-equiv="refresh"content="0;URL=http://'${hostname}'/client/'
|
||||
GOTO=$GOTO$call.html
|
||||
GOTO=$GOTO'">'
|
||||
echo ${GOTO}
|
||||
{
|
||||
# Callsign isn't set - print the login page.
|
||||
print <<'EOF';
|
||||
<CENTER>
|
||||
<FORM METHOD=POST>
|
||||
<STRONG>Please enter your callsign: </STRONG><BR>
|
||||
<INPUT name="call" size=10><BR>
|
||||
<INPUT type=submit value="Click here to Login">
|
||||
</FORM>
|
||||
</CENTER>
|
||||
EOF
|
||||
}
|
||||
|
||||
fi
|
||||
echo "</PRE>"
|
||||
echo "</BODY></HTML>"
|
||||
print <<'EOF';
|
||||
<HR>
|
||||
|
||||
# all *.html tempory files remove older than 10 min
|
||||
#
|
||||
cd ${tempdir}
|
||||
files=$(find *.html -mmin +10)
|
||||
rm ${files}
|
||||
<ADDRESS>
|
||||
<A HREF="http://www.dxcluster.org/">Spider Homepage</A>.
|
||||
</HTML>
|
||||
|
||||
EOF
|
||||
|
2012
txt/adminmanual.txt
2012
txt/adminmanual.txt
File diff suppressed because it is too large
Load Diff
@ -1,7 +1,7 @@
|
||||
The DXSpider Installation Manual v1.47
|
||||
The DXSpider Installation Manual v1.48
|
||||
Iain Philipps, G0RDI (g0rdi@77hz.com) and Ian Maude, G0VGS,
|
||||
(ianmaude@btinternet.com)
|
||||
Version 1.47, April 2001 revision 1.0
|
||||
Version 1.48, July 2001 revision 1.1
|
||||
|
||||
A reference for SysOps of the DXSpider DXCluster program.
|
||||
______________________________________________________________________
|
||||
@ -83,7 +83,7 @@
|
||||
|
||||
|
||||
|
||||
o Data-Dumper-2.101.tar.gz
|
||||
o Data-Dumper-2.10.tar.gz
|
||||
|
||||
o TimeDate-1.10.tar.gz
|
||||
|
||||
@ -96,8 +96,89 @@
|
||||
o Time-HiRes-01.20.tar.gz
|
||||
|
||||
|
||||
Do get the latest versions of these packages and install them but use
|
||||
the above list as the earliest versions usable.
|
||||
Copy the CPAN modules listed above to a convenient place on your
|
||||
computer. One good place would be /usr/local/packages, and the
|
||||
instructions which follow will assume that that's where you have put
|
||||
them.
|
||||
|
||||
|
||||
Log in as 'root', and make sure you're at '/root' before you continue.
|
||||
Here are exactly the commands you must issue next: -
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# tar xvfz /usr/local/packages/Data-Dumper-2.10.tar.gz
|
||||
# cd Data-Dumper-2.10
|
||||
# perl Makefile.PL
|
||||
# make test
|
||||
# make install
|
||||
# cd ..
|
||||
#
|
||||
# tar xvfz /usr/local/packages/TimeDate-1.10.tar.gz
|
||||
# cd TimeDate-1.10
|
||||
# perl Makefile.PL
|
||||
# make test
|
||||
# make install
|
||||
# cd ..
|
||||
#
|
||||
# tar xvfz /usr/local/packages/IO-1.20.tar.gz
|
||||
# cd IO-1.20
|
||||
# perl Makefile.PL
|
||||
# make test
|
||||
# make install UNINST=1
|
||||
# cd ..
|
||||
#
|
||||
# tar xvfz /usr/local/packages/Net-Telnet-3.02.tar.gz
|
||||
# cd Net-Telnet-3.02
|
||||
# perl Makefile.PL
|
||||
# make test
|
||||
# make install
|
||||
# cd ..
|
||||
#
|
||||
# tar xvfz /usr/local/packages/Curses-1.05.tar.gz
|
||||
# cd Curses-1.05
|
||||
# perl Makefile.PL
|
||||
# make test
|
||||
# make install
|
||||
# cd ..
|
||||
#
|
||||
# tar xvfz /usr/local/packages/Time-HiRes-01.20.tar.gz
|
||||
# cd Time-HiRes-01.20
|
||||
# perl Makefile.PL
|
||||
# make test
|
||||
# make install
|
||||
# cd ..
|
||||
|
||||
|
||||
|
||||
|
||||
Do not fall into the trap of thinking they're all the same, just
|
||||
because they nearly are! Pay particular attention to the instructions
|
||||
of IO, above.
|
||||
|
||||
|
||||
|
||||
1.2. Preparation
|
||||
@ -115,8 +196,6 @@
|
||||
your own choice.
|
||||
|
||||
|
||||
|
||||
|
||||
# adduser -m sysop
|
||||
|
||||
|
||||
@ -127,13 +206,10 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# passwd sysop
|
||||
# New UNIX password:
|
||||
# Retype new UNIX password:
|
||||
passwd: all authentication tokens updated successfully
|
||||
# passwd sysop
|
||||
# New UNIX password:
|
||||
# Retype new UNIX password:
|
||||
passwd: all authentication tokens updated successfully
|
||||
|
||||
|
||||
|
||||
@ -195,9 +271,8 @@
|
||||
|
||||
|
||||
|
||||
|
||||
# chown root ax25_call netrom_call
|
||||
# chmod 4775 ax25_call netrom_call
|
||||
# chown root ax25_call netrom_call
|
||||
# chmod 4775 ax25_call netrom_call
|
||||
|
||||
|
||||
|
||||
@ -253,16 +328,12 @@
|
||||
$ cd ../perl
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Now type the following command which creates the basic user file with
|
||||
you as the sysop.
|
||||
|
||||
|
||||
|
||||
|
||||
$ ./create_sysop.pl
|
||||
$ ./create_sysop.pl
|
||||
|
||||
|
||||
|
||||
@ -323,11 +394,9 @@
|
||||
shutdown
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
and both the cluster and the client should return to Linux prompts.
|
||||
|
||||
|
||||
1.6. The Client program
|
||||
|
||||
In earlier versions of Spider, all the processes were Perl scripts.
|
||||
@ -390,6 +459,7 @@
|
||||
|
||||
o Login as root
|
||||
|
||||
|
||||
o Enter the correct line in ax25d.conf (root)
|
||||
|
||||
o Enter the correct line in /etc/services (root)
|
||||
@ -455,8 +525,11 @@
|
||||
|
||||
|
||||
|
||||
GB7DJK-2 * * * * * * - sysop /spider/src/client client gb7djk-2 ax25
|
||||
default * * * * * * - sysop /spider/src/client client %u ax25
|
||||
|
||||
GB7DJK-2 * * * * * * - sysop /spider/src/client client gb7djk-2 ax25
|
||||
default * * * * * * - sysop /spider/src/client client %u ax25
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -519,7 +592,6 @@
|
||||
Assuming all is well, then try a telnet from your linux console ....
|
||||
|
||||
|
||||
|
||||
telnet localhost 8000
|
||||
|
||||
|
||||
@ -651,6 +723,7 @@
|
||||
an AK1A type node.
|
||||
|
||||
|
||||
|
||||
Start up the cluster as you did before and login as the sysop with
|
||||
client. The cluster node I am wanting to make a connection to is
|
||||
GB7BAA but you would obviously use whatever callsign you required. At
|
||||
@ -658,7 +731,7 @@
|
||||
|
||||
|
||||
|
||||
set/node gb7baa
|
||||
set/node gb7baa
|
||||
|
||||
|
||||
|
||||
@ -716,6 +789,7 @@
|
||||
connections is therefore relatively simple.
|
||||
|
||||
|
||||
|
||||
The connect scripts consist of lines which start with the following
|
||||
keywords or symbols:-
|
||||
|
||||
@ -724,6 +798,7 @@
|
||||
# All lines starting with a # are ignored, as are completely blank
|
||||
lines.
|
||||
|
||||
|
||||
timeout
|
||||
timeout followed by a number is the number of seconds to wait
|
||||
for a command to complete. If there is no timeout specified in
|
||||
@ -775,15 +850,6 @@
|
||||
|
||||
|
||||
|
||||
timeout 60
|
||||
abort (Busy|Sorry|Fail)
|
||||
# don't forget to chmod 4775 netrom_call!
|
||||
connect ax25 /usr/sbin/netrom_call bbs gb7djk g1tlh
|
||||
# you can leave this out if you call the script 'gb7dxm'
|
||||
client gb7dxm ax25
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -792,9 +858,8 @@
|
||||
|
||||
timeout 60
|
||||
abort (Busy|Sorry|Fail)
|
||||
# this does exactly the same as the previous example
|
||||
# the '1' is the AGW port number to connect thru for g1tlh
|
||||
connect agw 1 g1tlh
|
||||
# don't forget to chmod 4775 netrom_call!
|
||||
connect ax25 /usr/sbin/netrom_call bbs gb7djk g1tlh
|
||||
# you can leave this out if you call the script 'gb7dxm'
|
||||
client gb7dxm ax25
|
||||
|
||||
@ -805,6 +870,21 @@
|
||||
|
||||
|
||||
|
||||
timeout 60
|
||||
abort (Busy|Sorry|Fail)
|
||||
# this does exactly the same as the previous example
|
||||
# the '1' is the AGW port number to connect thru for g1tlh
|
||||
connect agw 1 g1tlh
|
||||
# you can leave this out if you call the script 'gb7dxm'
|
||||
client gb7dxm ax25
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
timeout 15
|
||||
connect telnet dirkl.tobit.co.uk
|
||||
# tell GB7DJK-1 that it is connected to GB7DJK
|
||||
@ -842,20 +922,6 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<- D G1TLH connect gb7djk-1
|
||||
-> D G1TLH connection to GB7DJK-1 started
|
||||
-> D G1TLH G1TLH de GB7DJK 13-Dec-1998 2046Z >
|
||||
|
Loading…
Reference in New Issue
Block a user