use AsyncMsg;
use JSON;
use Time::HiRes qw(gettimeofday tv_interval);
-use Regexp::IPv6 qw($IPv6_re);
use Mojo::IOLoop;
-use Mojo::IOLoop::ForkCall;
+use Mojo::IOLoop::Subprocess;
use Mojo::UserAgent;
use strict;
my $pkg = shift;
my $call = shift;
# my @rout = $main::routeroot->add_user($call, Route::here(1));
- DXProt::_add_thingy($main::routeroot, [$call, 0, 0, 1, undef, undef, $self->{conn}->peerhost], );
+ DXProt::_add_thingy($main::routeroot, [$call, 0, 0, 1, undef, undef, $self->hostname], );
# ALWAYS output the user
my $ref = Route::User::get($call);
my $host = $self->{conn}->peerhost;
$host ||= "AGW Port #$self->{conn}->{agwport}" if exists $self->{conn}->{agwport};
$host ||= "unknown";
- LogDbg('DXCommand', "$call connected from $host");
+ $self->{hostname} = $host;
$self->{name} = $name ? $name : $call;
$self->send($self->msg('l2',$self->{name}));
$self->{pagelth} = $pagelth;
($self->{width}) = $line =~ /width=(\d+)/; $line =~ s/\s*width=\d+\s*//;
if ($line =~ /host=/) {
- ($self->{hostname}) = $line =~ /host=(\d+\.\d+\.\d+\.\d+)/; $line =~ s/\s*host=\d+\.\d+\.\d+\.\d+//;
- unless ($self->{hostname}) {
- ($self->{hostname}) = $line =~ /host=($IPv6_re)/;
- $line =~ s/\s*host=$IPv6_re//;
+ my ($h) = $line =~ /host=(\d+\.\d+\.\d+\.\d+)/;
+ $line =~ s/\s*host=\d+\.\d+\.\d+\.\d+// if $h;
+ unless ($h) {
+ ($h) = $line =~ /host=([\da..fA..F:]+)/;
+ $line =~ s/\s*host=[\da..fA..F:]+// if $h;
}
+ $self->{hostname} = $h if $h;
}
$self->{width} = 80 unless $self->{width} && $self->{width} > 80;
$self->{consort} = $line; # save the connection type
-
+
+ LogDbg('DXCommand', "$call connected from $self->{hostname}");
+
# set some necessary flags on the user if they are connecting
$self->{beep} = $user->wantbeep;
$self->{ann} = $user->wantann;
$self->send_motd;
# sort out privilege reduction
- $self->{priv} = 0 if $line =~ /^(ax|te)/ && !$self->conn->{usedpasswd};
+ $self->{priv} = 0 unless $self->{hostname} eq '127.0.0.1' || $self->{hostname} eq '::1' || $self->conn->{usedpasswd};
# get the filters
my $nossid = $call;
}
#
-# this is the thing that runs the command, it is done like this for the
+# this is the thing that preps for running the command, it is done like this for the
# benefit of remote command execution
#
my $t0 = [gettimeofday];
no strict 'refs';
-
- my $fc = Mojo::IOLoop::ForkCall->new;
- $fc->serializer(\&encode_json);
- $fc->deserializer(\&decode_json);
+
+ # just behave normally if something has set the "one-shot" _nospawn in the channel
+ return ($cmdref->(@$args)) if $self->{_nospawn};
+
+ my $fc = Mojo::IOLoop::Subprocess->new;
+# $fc->serializer(\&encode_json);
+# $fc->deserializer(\&decode_json);
$fc->run(
- sub {my @args = @_; my @res = $cmdref->(@args); return @res},
- $args,
+ sub {
+ my $subpro = shift;
+ if (isdbg('spawn_cmd')) {
+ my $s = "line: $line";
+ $s .= ", args: " . join(', ', @$args) if $args && @$args;
+ }
+ my @res = $cmdref->(@$args);
+ return @res;
+ },
+# $args,
sub {
my ($fc, $err, @res) = @_;
my $dxchan = DXChannel::get($call);
return unless $dxchan;
- if (defined $err) {
+ if ($err) {
my $s = "DXCommand::spawn_cmd: call $call error $err";
dbg($s) if isdbg('chan');
$dxchan->send($s);
return;
}
if ($cb) {
- $cb->($dxchan, @res);
- } else {
- return unless @res;
+ # transform output if required
+ @res = $cb->($dxchan, @res);
+ }
+ if (@res) {
if (defined $prefix) {
$dxchan->send(map {"$prefix$_"} @res);
} else {