X-Git-Url: http://gb7djk.dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXCommandmode.pm;h=aef8d84c9bc048cc526bbfb9ffd4a2e05e98fc80;hb=4b49fe47b37249d748f0a52fe2a778d4bc27232f;hp=68027807da5075edbff3dcc962e3cc3ac22aab79;hpb=61e7e8734559481ea454bb3facca88139e51addd;p=spider.git diff --git a/perl/DXCommandmode.pm b/perl/DXCommandmode.pm index 68027807..aef8d84c 100644 --- a/perl/DXCommandmode.pm +++ b/perl/DXCommandmode.pm @@ -37,6 +37,11 @@ use DB_File; use VE7CC; use DXXml; use AsyncMsg; +use JSON; + +use Mojo::IOLoop; +use Mojo::IOLoop::ForkCall; +use Mojo::UserAgent; use strict; use vars qw(%Cache %cmd_cache $errstr %aliases $scriptbase %nothereslug @@ -118,6 +123,7 @@ sub start $self->{ann_talk} = $user->wantann_talk; $self->{here} = 1; $self->{prompt} = $user->prompt if $user->prompt; + $self->{lastmsgpoll} = 0; # sort out new dx spot stuff $user->wantdxcq(0) unless defined $user->{wantdxcq}; @@ -560,7 +566,7 @@ sub process my $dxchan; foreach $dxchan (@dxchan) { - next if $dxchan->sort ne 'U'; + next unless $dxchan->{sort} eq 'U'; # send a outstanding message prompt if required if ($t >= $dxchan->lastmsgpoll + $msgpolltime) { @@ -1086,7 +1092,7 @@ sub broadcast_debug { my $s = shift; # the line to be rebroadcast - foreach my $dxchan (DXChannel::get_all) { + foreach my $dxchan (DXChannel::get_all_users) { next unless $dxchan->{enhanced} && $dxchan->{senddbg}; if ($dxchan->{gtk}) { $dxchan->send_later('L', dd(['db', $s])); @@ -1162,6 +1168,9 @@ sub import_cmd my @names = readdir(DIR); closedir(DIR); my $name; + + return unless @names; + foreach $name (@names) { next if $name =~ /^\./; @@ -1194,7 +1203,7 @@ sub import_cmd $dxchan->{priv} = $u->priv; $dxchan->{user} = $u; @out = $s->run($dxchan, 1); - $dxchan->{call} = $call; + $dxchan->{call} = $old; $dxchan->{priv} = $priv; $dxchan->{user} = $user; } else { @@ -1241,5 +1250,63 @@ sub send_motd } $self->send_file($motd) if -e $motd; } + +# Punt off a long running command into a separate process +# +# This is called from commands to run some potentially long running +# function. The process forks and then runs the function and returns +# the result back to the cmd. +# +# NOTE: this merely forks the current process and then runs the cmd in that (current) context. +# IT DOES NOT START UP SOME NEW PROGRAM AND RELIES ON THE FACT THAT IT IS RUNNING DXSPIDER +# THE CURRENT CONTEXT!! +# +# call: $self->spawn_cmd(\, [cb => sub{...}], [prefix => "cmd> "], [progress => 0|1], [args => [...]]); +sub spawn_cmd +{ + my $self = shift; + my $cmdref = shift; + my $call = $self->{call}; + my %args = @_; + my @out; + + my $cb = delete $args{cb}; + my $prefix = delete $args{prefix}; + my $progress = delete $args{progress}; + my $args = delete $args{args} || []; + + no strict 'refs'; + + my $fc = Mojo::IOLoop::ForkCall->new; + $fc->serializer(\&encode_json); + $fc->deserializer(\&decode_json); + $fc->run( + sub {my @args = @_; my @res = $cmdref->(@args); return @res}, + $args, + sub { + my ($fc, $err, @res) = @_; + my $dxchan = DXChannel::get($call); + return unless $dxchan; + + if (defined $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; + if (defined $prefix) { + $dxchan->send(map {"$prefix$_"} @res); + } else { + $dxchan->send(@res); + } + } + }); + return @out; +} + 1; __END__