X-Git-Url: http://dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXCommandmode.pm;h=1dd868c0aa79600c371307b1224513decb25e492;hb=c480ac94da7dbd5762fcd15aa556c874d223e14e;hp=74e53b10b1547a9af6cd729903b7397d33d26ea1;hpb=6e7d6f8695b2e3de7a7878fd23eb52ea22f0b875;p=spider.git diff --git a/perl/DXCommandmode.pm b/perl/DXCommandmode.pm index 74e53b10..1dd868c0 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 @@ -209,8 +210,7 @@ sub start $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; @@ -544,12 +544,12 @@ 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"; @@ -587,7 +587,8 @@ sub process my $t = time; my @dxchan = DXChannel::get_all(); my $dxchan; - + + $users = 0; foreach $dxchan (@dxchan) { next unless $dxchan->is_user; @@ -602,6 +603,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) { @@ -692,7 +695,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 @@ -1304,7 +1307,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); @@ -1312,13 +1322,17 @@ sub spawn_cmd $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); } - my @res = $cmdref->(@$args); -# diffms("rcmd from $call 1", $line, $t0, scalar @res) if isdbg('chan'); - return @res; + eval { @out = $cmdref->(@$args); }; + if ($@) { + DXDebug::dbgprintring(25); + push @out, DXDebug::shortmess($@); + } + return @out; }, # $args, sub { @@ -1349,5 +1363,9 @@ sub spawn_cmd return @out; } +sub user_count +{ + return ($users, $maxusers); +} 1; __END__