X-Git-Url: http://dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=perl%2FDXCommandmode.pm;h=6306b7fbed905902abea96f23d9a14c219e98e31;hb=00795f6a9d8fe391fe636e124e366547886a61c2;hp=d5271313960a1f6f42f6142a883923aa7e9afabd;hpb=f2c90f82509ae2be33216ebaed3bc9f8ea3f5f80;p=spider.git diff --git a/perl/DXCommandmode.pm b/perl/DXCommandmode.pm index d5271313..6306b7fb 100644 --- a/perl/DXCommandmode.pm +++ b/perl/DXCommandmode.pm @@ -48,7 +48,7 @@ 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 @@ -59,7 +59,8 @@ $maxbadcount = 3; # no of bad words allowed before disconnection $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 @@ -544,8 +545,20 @@ sub run_cmd if ($package && $self->can("${package}::handle")) { no strict 'refs'; dbg("cmd: package $package") if isdbg('command'); + if (isdbg('progress')) { + my $s = "CMD: '$cmd' by $call ip $self->{hostname}"; + } + my $t0 = [gettimeofday]; eval { @ans = &{"${package}::handle"}($self, $args) }; - return (DXDebug::shortmess($@)) if $@; + if ($@) { + 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); + } } else { dbg("cmd: $package not present") if isdbg('command'); return $self->_error_out('e1'); @@ -578,7 +591,8 @@ sub process my $t = time; my @dxchan = DXChannel::get_all(); my $dxchan; - + + $users = 0; foreach $dxchan (@dxchan) { next unless $dxchan->is_user; @@ -593,6 +607,8 @@ sub process $dxchan->prompt() if $dxchan->{state} =~ /^prompt/o; $dxchan->t($t); } + ++$users; + $maxusers = $users if $users > $maxusers; } while (my ($k, $v) = each %nothereslug) { @@ -683,7 +699,7 @@ sub broadcast # 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 @@ -1265,22 +1281,6 @@ sub send_motd $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 # @@ -1311,7 +1311,14 @@ sub spawn_cmd 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; # $fc->serializer(\&encode_json); @@ -1319,12 +1326,17 @@ sub spawn_cmd $fc->run( sub { my $subpro = shift; - if (isdbg('spawn_cmd')) { + if (isdbg('progress')) { my $s = "line: $line"; $s .= ", args: " . join(', ', @$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 { @@ -1333,7 +1345,7 @@ sub spawn_cmd 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; @@ -1349,11 +1361,15 @@ sub spawn_cmd $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__