package main;
require 5.10.1;
+
use warnings;
use vars qw($root $is_win $systime $lockfn @inqueue $starttime $lockfn @outstanding_connects
$no = 'No'; # ditto for no
$user_interval = 11*60; # the interval between unsolicited prompts if no traffic
+
# make sure that modules are searched in the order local then perl
BEGIN {
umask 002;
-
+ $SIG{'__WARN__'} = sub { warn $_[0] if $DOWARN };
+
# take into account any local::lib that might be present
eval {
require local::lib;
use DXVars;
use SysVar;
-use strict;
-
# order here is important - DXDebug snarfs Carp et al so that Mojo errors go into the debug log
-use DXDebug;
-
use Mojolicious 7.26;
use Mojo::IOLoop;
+$DOWARN = 1;
+use DXDebug;
use Msg;
use IntMsg;
use Internet;
use DXSql;
use IsoTime;
use BPQMsg;
-
+use RBN;
use Data::Dumper;
use vars qw($version $build $gitversion $gitbranch);
+use strict;
+
use Local;
our $broadcast_debug; # allow broadcasting of debug info down "enhanced" user connections
our $clssecs; # the amount of cpu time the DXSpider process have consumed
our $cldsecs; # the amount of cpu time any child processes have consumed
+our $allowslashcall; # Allow / in connecting callsigns (ie PA0/G1TLH, or even PA0/G1TLH/2)
# send a message to call on conn and disconnect
}
# is he locked out ?
+ $user = DXUser::get_current($call);
my $basecall = $call;
$basecall =~ s/-\d+$//; # remember this for later multiple user processing
- my $baseuser = DXUser::get_current($basecall);
- my $lock = $user->lockout if $user;
- if ($baseuser && $baseuser->lockout || $lock) {
- if (!$user || !defined $lock || $lock) {
- my $host = $conn->peerhost;
- LogDbg('DXCommand', "$call on $host is locked out, disconnected");
- $conn->disconnect;
- return;
- }
+ my $lock;
+ if ($user) {
+ # make sure we act on any locked status that the actual incoming call has.
+ $lock = $user->lockout;
+ } elsif ($allowmultiple && $call ne $basecall) {
+ # if we are allowing multiple connections and there is a basecall minus incoming ssid, use the basecall's lock status
+ $user = DXUser::get_current($basecall);
+ $lock = $user->lockout if $user;
+ }
+
+ # now deal with the lock
+ if ($lock) {
+ my $host = $conn->peerhost;
+ LogDbg('', "$call on $host is locked out, disconnected");
+ $conn->disconnect;
+ return;
}
# set up the basic channel info for "Normal" Users
# is there one already connected to me - locally?
- $user = DXUser::get_current($call);
$dxchan = DXChannel::get($call);
my $newcall = $call;
if ($dxchan) {
my $allow = 0;
if (@lastconns >= $DXUser::maxconnlist) {
$allow = $lastconns[-1]->[0] - $lastconns[0]->[0] < $min_reconnection_rate;
- }
+ }
# search for a spare ssid
L1: for (my $count = $call =~ /-\d+$/?0:1; $allow && $count < $allowmultiple; ) { # remember we have one call already
my $lastid = 1;
if ($bumpexisting) {
my $ip = $dxchan->hostname;
$dxchan->send_now('D', DXM::msg($lang, 'conbump', $call, $ip));
- LogDbg('DXCommand', "$call bumped off by $ip, disconnected");
+ LogDbg('', "$call bumped off by $ip, disconnected");
$dxchan->disconnect;
} else {
already_conn($conn, $call, DXM::msg($lang, 'conother', $call, $main::mycall));
$v = defined $c ? $c : $m;
if ($v && @n >= $v+$allowmultiple) {
my $nodes = join ',', @n;
- LogDbg('DXCommand', "$call has too many connections ($v) at $nodes - disconnected");
+ LogDbg('', "$call has too many connections ($v) at $nodes - disconnected");
already_conn($conn, $call, DXM::msg($lang, 'contomany', $call, $v, $nodes));
return;
}
$user->startt($systime); # mark the start time of this connection
if ($user->is_node) {
- $dxchan = DXProt->new($call, $conn, $user);
+ $dxchan = DXProt->new($call, $conn, $user);
+ } elsif ($user->is_rbn) {
+ $dxchan = RBN->new($newcall, $conn, $user);
} elsif ($user->is_user) {
$dxchan = DXCommandmode->new($newcall, $conn, $user);
} else {
# set callbacks
- $conn->set_error(sub {my $err = shift; LogDbg('DXCommand', "Comms error '$err' received for call $dxchan->{call}"); $dxchan->disconnect(1);});
+ $conn->set_error(sub {my $err = shift; LogDbg('', "Comms error '$err' received for call $dxchan->{call}"); $dxchan->disconnect(1);});
$conn->set_on_eof(sub {$dxchan->disconnect});
$conn->set_rproc(sub {my ($conn,$msg) = @_; $dxchan->rec($msg);});
if ($sort eq 'W') {
if ($desc) {
my ($v, $s, $b, $g) = $desc =~ /^([\d.]+)(?:\.(\d+))?-(\d+)-g([0-9a-f]+)/;
$s ||= '';
- dbg("Git: $desc");
- dbg("Git: V=$v S=$s B=$b g=$g");
+ dbg("Git: $desc") if isdbg('git');
+ dbg("Git: V=$v S=$s B=$b g=$g") if isdbg('git');
$version = $v;
$build = $b || 0;
$gitversion = "$g\[r]";
my $oldsort = $ref->sort;
if ($oldsort ne 'S') {
$ref->sort('S');
- dbg "Resetting node type from $oldsort -> DXSpider ('S')";
+ dbg("Resetting node type from $oldsort -> DXSpider ('S')");
}
$ref = DXUser::get($myalias);
die "$myalias missing, run the create_sysop.pl script and please RTFM" unless $ref && $ref->priv == 9;
$oldsort = $ref->sort;
if ($oldsort ne 'U') {
$ref->sort('U');
- dbg "Resetting sysop user type from $oldsort -> User ('U')";
+ dbg("Resetting sysop user type from $oldsort -> User ('U')");
}
}