X-Git-Url: http://dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXProt.pm;h=4940c9102116050b86eae9604fafc732b34d849b;hb=c480ac94da7dbd5762fcd15aa556c874d223e14e;hp=8b9026c1f700e71945feda5329efcf9b2b431f95;hpb=f2c90f82509ae2be33216ebaed3bc9f8ea3f5f80;p=spider.git diff --git a/perl/DXProt.pm b/perl/DXProt.pm index 8b9026c1..4940c910 100644 --- a/perl/DXProt.pm +++ b/perl/DXProt.pm @@ -254,6 +254,7 @@ sub init $main::me->{version} = $main::version; $main::me->{build} = $main::build; $main::me->{do_pc9x} = 1; + $main::me->{hostname} = $main::clusteraddr; $main::me->update_pc92_next($pc92_short_update_period); $main::me->update_pc92_keepalive; } @@ -1118,6 +1119,7 @@ sub load_hops sub process_rcmd { my ($self, $tonode, $fromnode, $user, $cmd) = @_; + if ($tonode eq $main::mycall) { my $ref = DXUser::get_current($fromnode); unless ($ref && UNIVERSAL::isa($ref, 'DXUser')) { @@ -1125,13 +1127,13 @@ sub process_rcmd $self->send_rcmd_reply($main::mycall, $fromnode, $user, "sorry...!"); return; } + Log('rcmd', 'in', ($ref->{priv}||0), $fromnode, $cmd, $user); my $cref = Route::Node::get($fromnode); unless ($cref && UNIVERSAL::isa($cref, 'Route')) { dbg("DXProt process_rcmd: Route $fromnode isn't a reference (tell G1TLH)"); $self->send_rcmd_reply($main::mycall, $fromnode, $user, "sorry...!"); return; } - Log('rcmd', 'in', ($ref->{priv}||0), $fromnode, $cmd); if ($cmd !~ /^\s*rcmd/i && $ref->homenode && $cref->call eq $ref->homenode) { # not allowed to relay RCMDS! if ($ref->{priv}) { # you have to have SOME privilege, the commands have further filtering $self->{remotecmd} = 1; # for the benefit of any command that needs to know @@ -1173,7 +1175,7 @@ sub send_rcmd_reply while (@_) { my $line = shift; $line =~ s/\s*$//; - Log('rcmd', 'out', $fromnode, $line); + Log('rcmd', 'out', $fromnode, $line, $user); if ($self->is_clx) { $self->send(pc85($main::mycall, $fromnode, $user, "$main::mycall:$line")); } else { @@ -1217,20 +1219,31 @@ sub spawn_cmd my $fc = Mojo::IOLoop::Subprocess->new; # just behave normally if something has set the "one-shot" _nospawn in the channel - return ($cmdref->(@$args)) if $self->{_nospawn}; + if ($self->{_nospawn}) { + eval { @out = $cmdref->(@$args); }; + if ($@) { + DXDebug::dbgprintring(25); + push @out, DXDebug::shortmess($@); + } + return @out; + } # $fc->serializer(\&encode_json); # $fc->deserializer(\&decode_json); $fc->run( sub { my $subpro = shift; - if (isdbg('chan')) { - my $s = "line: $line"; - $s .= ", args: " . join(', ', @$args) if $args && @$args; + if (isdbg('progress')) { + my $s = qq{line: "$line"}; + $s .= ", args: " . join(', ', map { defined $_ ? qq{'$_'} : q{'undef'} } @$args) if $args && @$args; + dbg($s); } - - my @res = $cmdref->(@$args); - return @res; + eval { @out = $cmdref->(@$args); }; + if ($@) { + DXDebug::dbgprintring(25); + push @out, DXDebug::shortmess($@); + } + return @out; }, # $args, sub { @@ -1259,7 +1272,7 @@ sub spawn_cmd $self->send(@res); } } - DXCommandmode::_diffms($call, $line, $t0); + diffms("rcmd from $user on $call", $line, $t0, scalar @res) if isdbg('progress'); }); return @out;