@ISA = qw(DXChannel);
-require 5.10.1;
+use 5.10.1;
use POSIX qw(:math_h);
use DXUtil;
use Time::HiRes qw(gettimeofday tv_interval);
use Mojo::IOLoop;
-use Mojo::IOLoop::Subprocess;
+use DXSubprocess;
use Mojo::UserAgent;
use strict;
use vars qw(%Cache %cmd_cache $errstr %aliases $scriptbase %nothereslug
- $maxbadcount $msgpolltime $default_pagelth $cmdimportdir);
+ $maxbadcount $msgpolltime $default_pagelth $cmdimportdir $users $maxusers);
%Cache = (); # cache of dynamically loaded routine's mod times
%cmd_cache = (); # cache of short names
$msgpolltime = 3600; # the time between polls for new messages
$cmdimportdir = "$main::root/cmd_import"; # the base directory for importing command scripts
# this does not exist as default, you need to create it manually
-#
+$users = 0; # no of users on this node currently
+$maxusers = 0; # max no users on this node for this run
#
# obtain a new connection this is derived from dxchannel
$script->run($self) if $script;
# send cluster info
- my $info = Route::cluster();
- $self->send("Cluster:$info");
+ $self->send($self->run_cmd("show/cluster"));
# send prompts for qth, name and things
$self->send($self->msg('namee1')) if !$user->name;
if ($package && $self->can("${package}::handle")) {
no strict 'refs';
dbg("cmd: package $package") if isdbg('command');
+ my $t0 = [gettimeofday];
eval { @ans = &{"${package}::handle"}($self, $args) };
- return (DXDebug::shortmess($@)) if $@;
+ if ($@) {
+ DXDebug::dbgprintring(25);
+ return (DXDebug::shortmess($@));
+ }
+ if (isdbg('progress')) {
+ my $msecs = _diffms($t0);
+ my $s = "CMD: '$cmd $args' by $call ip: $self->{hostname} ${msecs}mS";
+ dbg($s) if $cmd !~ /^(?:echo|blank)/ || isdbg('echo'); # cut down a bit on HRD and other clients' noise
+ }
} else {
dbg("cmd: $package not present") if isdbg('command');
return $self->_error_out('e1');
my $t = time;
my @dxchan = DXChannel::get_all();
my $dxchan;
-
+
+ $users = 0;
foreach $dxchan (@dxchan) {
next unless $dxchan->is_user;
$dxchan->prompt() if $dxchan->{state} =~ /^prompt/o;
$dxchan->t($t);
}
+ ++$users;
+ $maxusers = $users if $users > $maxusers;
}
while (my ($k, $v) = each %nothereslug) {
# gimme all the users
sub get_all
{
- return grep {$_->is_user} DXChannel::get_all();
+ goto &DXChannel::get_all_users;
}
# run a script for this user
};
#wrap the code into a subroutine inside our unique package
- my $eval = qq(package DXCommandmode::$package; use POSIX qw{:math_h}; use DXLog; use DXDebug; use DXUser; use DXUtil; our \@ISA = qw{DXCommandmode}; );
+ my $eval = qq(package DXCommandmode::$package; use 5.10.1; use POSIX qw{:math_h}; use DXLog; use DXDebug; use DXUser; use DXUtil; our \@ISA = qw{DXCommandmode}; );
if ($sub =~ m|\s*sub\s+handle\n|) {
my $loc = '';
my $clth = $self->{consort} eq 'local' ? 29 : 30;
my $comment = substr (($_[3] || ''), 0, $clth);
- $comment .= ' ' x ($clth - length($comment));
+ $comment .= ' ' x ($clth - (length($comment)));
+ if ($self->{user}->wantgrid) {
+ my $ref = DXUser::get_current($_[1]);
+ if ($ref && $ref->qra) {
+ $loc = ' ' . substr($ref->qra, 0, 4);
+ $comment = substr $comment, 0, ($clth - (length($comment)+length($loc)));
+ $comment .= $loc;
+ $loc = '';
+ }
+ }
+
if ($self->{user}->wantgrid) {
my $ref = DXUser::get_current($_[4]);
- if ($ref) {
- $loc = $ref->qra || '';
- $loc = ' ' . substr($loc, 0, 4) if $loc;
+ if ($ref && $ref->qra) {
+ $loc = ' ' . substr($ref->qra, 0, 4);
}
}
$self->send_file($motd) if -e $motd;
}
-sub _diffms
-{
- return unless isdbg('chan');
- my $call = shift;
- my $line = shift;
- my $ta = shift;
- my $tb = shift || [gettimeofday];
-
- my $a = int($ta->[0] * 1000) + int($ta->[1] / 1000);
- my $b = int($tb->[0] * 1000) + int($tb->[1] / 1000);
- my $msecs = $b - $a;
-
- my $s = "forkcall stats: $call '$line' ";
- $s .= "${msecs}mS";
- dbg($s);
-}
# Punt off a long running command into a separate process
#
no strict 'refs';
# 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;
+ }
- 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('spawn_cmd')) {
- 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);
+ }
+ eval { @out = $cmdref->(@$args); };
+ if ($@) {
+ DXDebug::dbgprintring(25);
+ push @out, DXDebug::shortmess($@);
}
- my @res = $cmdref->(@$args);
- return @res;
+ return @out;
},
# $args,
sub {
return unless $dxchan;
if ($err) {
- my $s = "DXCommand::spawn_cmd: call $call error $err";
+ my $s = "DXProt::spawn_cmd: call $call error $err";
dbg($s) if isdbg('chan');
$dxchan->send($s);
return;
$dxchan->send(@res);
}
}
- _diffms($call, $line, $t0);
+ diffms("by $call", $line, $t0, scalar @res) if isdbg('progress');
});
return @out;
}
+sub user_count
+{
+ return ($users, $maxusers);
+}
1;
__END__