use JSON;
use Time::HiRes qw(gettimeofday tv_interval);
+use Mojo::UserAgent;
use Mojo::IOLoop;
use Mojo::IOLoop::Subprocess;
-use Mojo::UserAgent;
+use DXSubprocess;
use strict;
use vars qw(%Cache %cmd_cache $errstr %aliases $scriptbase %nothereslug
return @out;
}
- my $fc = Mojo::IOLoop::Subprocess->new;
+ my $fc = DXSubprocess->new;
# $fc->serializer(\&encode_json);
# $fc->deserializer(\&decode_json);
$fc->run(
sub {
my $subpro = shift;
- if (isdbg('progress')) {
- my $s = qq{line: "$line"};
+ if (isdbg('spawn')) {
+ my $s = __PACKAGE__ . qq{ line: "$line"};
$s .= ", args: " . join(', ', map { defined $_ ? qq{'$_'} : q{'undef'} } @$args) if $args && @$args;
dbg($s);
}
$dxchan->send(@res);
}
}
- diffms("by $call", $line, $t0, scalar @res) if isdbg('progress');
+ diffms(__PACKAGE__, "by $call", $line, $t0, scalar @res) if isdbg('progress');
});
return @out;
use DXLog;
use Time::HiRes qw(gettimeofday tv_interval);
use Mojo::IOLoop::Subprocess;
+use DXSubprocess;
use strict;
my $t0 = [gettimeofday];
dbg("DXCron::spawn: $line") if isdbg("cron");
- my $fc = Mojo::IOLoop::Subprocess->new();
+ my $fc = DXSubprocess->new();
$fc->run(
sub {
my @res = `$line`;
-# diffms("DXCron spawn 1", $line, $t0, scalar @res) if isdbg('chan');
return @res
},
sub {
chomp;
dbg("DXCron::spawn: $_") if isdbg("cron");
}
- diffms("by DXCron::spawn", $line, $t0, scalar @res) if isdbg('progress');
+ diffms(__PACKAGE__, "::spawn", $line, $t0, scalar @res) if isdbg('progress');
}
);
}
sub spawn_cmd
{
my $line = shift;
+ my $chan = shift || $main::me;
+ my $pkg = ref $chan || __PACKAGE__;
my $t0 = [gettimeofday];
-
- dbg("DXCron::spawn_cmd run: $line") if isdbg('cron');
- my $fc = Mojo::IOLoop::Subprocess->new();
+
+ dbg("$pkg::spawn_cmd run: $line") if isdbg('cron');
+ my $fc = DXSubprocess->new;
$fc->run(
sub {
- $main::me->{_nospawn} = 1;
- my @res = $main::me->run_cmd($line);
- delete $main::me->{_nospawn};
-# diffms("DXCron spawn_cmd 1", $line, $t0, scalar @res) if isdbg('chan');
+ $chan->{_nospawn} = 1;
+ my @res = $chan->run_cmd($line);
+ delete $chan->{_nospawn};
return @res;
},
sub {
my ($fc, $err, @res) = @_;
if ($err) {
- my $s = "DXCron::spawn_cmd: error $err";
+ chomp $err;
+ my $s = "$pkg::spawn_cmd: error $err";
dbg($s);
}
for (@res) {
- chomp;
- dbg("DXCron::spawn_cmd: $_") if isdbg("cron");
+ if (ref $chan) {
+ dbg("send: $_");
+ $chan->send($_);
+ } elsif (isdbg('cron')) {
+ dbg("$pkg::spawn_cmd: $_");
+ } else {
+ last; # don't care
+ }
}
- diffms("by DXCron::spawn_cmd", $line, $t0, scalar @res) if isdbg('progress');
+ diffms($pkg, "::spawn_cmd", $line, $t0, scalar @res) if isdbg('progress');
}
);
}
use Time::HiRes qw(gettimeofday tv_interval);
use Mojo::IOLoop::Subprocess;
+use DXSubprocess;
use strict;
no strict 'refs';
- my $fc = Mojo::IOLoop::Subprocess->new;
+ my $fc = DXSubprocess->new;
# just behave normally if something has set the "one-shot" _nospawn in the channel
if ($self->{_nospawn}) {
$fc->run(
sub {
my $subpro = shift;
- if (isdbg('progress')) {
- my $s = qq{line: "$line"};
+ if (isdbg('spawn')) {
+ my $s = __PACKAGE__ . qq{ line: "$line"};
$s .= ", args: " . join(', ', map { defined $_ ? qq{'$_'} : q{'undef'} } @$args) if $args && @$args;
dbg($s);
}
$self->send(@res);
}
}
- diffms("rcmd from $user on $call", $line, $t0, scalar @res) if isdbg('progress');
+ diffms(__PACKAGE__, " rcmd from $user on $call", $line, $t0, scalar @res) if isdbg('progress');
});
return @out;
my $long = $user->long;
if (defined $lat && defined $long) {
$user->qra(DXBearing::lltoqra($lat, $long));
- $user->put;
+ $user->put unless $self->{_nospawn};
}
}
}
}
$user->lastoper($main::systime);
- $user->put;
+ $user->put unless $self->{_nospawn};
}
}
}
$user->homenode($parent->call) if !$user->homenode;
$user->node($parent->call);
$user->lastin($main::systime) unless DXChannel::get($call);
- $user->put;
+ $user->put unless $self->{_nospawn};
# send info to all logged in thingies
$self->tell_login('loginu', "$ncall: $call") if $user->is_local_node;
unless ($self->is_spider) {
dbg("Change U " . $self->user->sort . " C $self->{sort} -> S");
$self->user->sort('S');
- $self->user->put;
+ $self->user->put unless $self->{_nospawn};
$self->sort('S');
}
# $self->{handle_xml}++ if DXXml::available() && $pc->[1] =~ /\bxml/;
my $call = shift;
# add this station to the user database, if required (don't remove SSID from nodes)
- my $user = DXUser::get_current($call);
+ my $chan = DXChannel::get($call);
+ my $user = $chan->user || DXUser::get($call);
unless ($user) {
$user = DXUser->new($call);
$user->priv(1); # I have relented and defaulted nodes
$user->node($call);
$user->sort('A');
$user->lastin($main::systime); # this make it last longer than just this invocation
- $user->put; # just to make sure it gets written away!!!
+ $user->put unless $chan && $chan->{_nospawn}; # just to make sure it gets written away!!!
}
return $user;
}
$mref->stop_msg($call) if $mref;
$user->lastin($main::systime) unless DXChannel::get($call);
- $user->put;
+ $user->put unless $self->{_nospawn};
}
# we are not automatically sending out PC19s, we send out a composite PC21,PC19 instead
}
}
$user->lastoper($main::systime); # to cut down on excessive for/opers being generated
- $user->put;
+ $user->put unless $self->{_nospawn};
unless ($self->{isolate}) {
DXChannel::broadcast_nodes($line, $self); # send it to everyone but me
sub diffms
{
+ my $pkg = shift;
my $call = shift;
my $line = shift;
my $ta = shift;
my $msecs = _diffms($ta, $tb);
$line =~ s|\s+$||;
- my $s = "subprocess stats cmd: '$line' $call ${msecs}mS";
+ my $s = "$pkg subprocess stats cmd: '$line' $call ${msecs}mS";
$s .= " $no lines" if $no;
DXDebug::dbg($s);
}
my $u = DXUser::get_current($to);
if ($u) {
$u->lastping(($via || $from), $main::systime);
- $u->put;
+ $u->put unless $dxchan->{_nospawn};
}
}
sub _handle_believe
{
my ($from, $via) = @_;
-
- my $user = DXUser::get_current($from);
+
+ my $dxchan = DXChannel::get($from);
+ my $user = $dxchan->user || DXUser::get($from);
if ($user) {
$user->set_believe($via);
- $user->put;
+ $user->put unless $dxchan->{_nospawn};
}
}
1;