added Log Parsing
[spider.git] / perl / DXCommandmode.pm
index 522200da3b8249cb74f3bc492a92fa1862d17331..84d809fd257e730e30ed388dd324be25e3d93665 100644 (file)
@@ -17,6 +17,8 @@ use DXUser;
 use DXVars;
 use DXDebug;
 use DXM;
+use DXLog;
+use DXLogPrint;
 use CmdAlias;
 use FileHandle;
 use Carp;
@@ -46,18 +48,18 @@ sub new
 
 sub start
 { 
-  my ($self, $line) = @_;
+  my ($self, $line, $sort) = @_;
   my $user = $self->{user};
   my $call = $self->{call};
   my $name = $user->{name};
-
+  
   $self->{name} = $name ? $name : $call;
   $self->send($self->msg('l2',$self->{name}));
   $self->send_file($main::motd) if (-e $main::motd);
-  $self->send($self->msg('pr', $call));
   $self->state('prompt');                  # a bit of room for further expansion, passwords etc
   $self->{priv} = $user->priv;
   $self->{lang} = $user->lang;
+  $self->{pagelth} = 20;
   $self->{priv} = 0 if $line =~ /^(ax|te)/;     # set the connection priv to 0 - can be upgraded later
   $self->{consort} = $line;                # save the connection type
 
@@ -74,12 +76,83 @@ sub start
   my $nchan = DXChannel->get($main::mycall);
   my @pc16 = DXProt::pc16($nchan, $cuser);
   DXProt::broadcast_ak1a(@pc16);
+  Log('DXCommand', "$call connected");
+
+  # send prompts and things
+  my $info = DXCluster::cluster();
+  $self->send("Cluster:$info");
+  $self->send($self->msg('pr', $call));
 }
 
 #
 # This is the normal command prompt driver
 #
+
 sub normal
+{
+       my $self = shift;
+       my $cmdline = shift;
+       my @ans;
+       
+       # remove leading and trailing spaces
+       $cmdline =~ s/^\s*(.*)\s*$/$1/;
+       
+       if ($self->{state} eq 'prompt') {
+               @ans = run_cmd($self, $cmdline) if length $cmdline;
+       
+               if ($self->{pagelth} && @ans > $self->{pagelth}) {
+                       my $i;
+                       for ($i = $self->{pagelth}; $i-- > 0; ) {
+                               my $line = shift @ans;
+                               $line =~ s/\s+$//o;            # why am having to do this? 
+                               $self->send($line);
+                       }
+                       $self->{pagedata} =  \@ans;
+                       $self->state('page');
+                       $self->send($self->msg('page', scalar @ans));
+               } else {
+                       for (@ans) {
+                               s/\s+$//o;                     # why ?????????
+                               $self->send($_);
+                       }
+               } 
+       } elsif ($self->{state} eq 'page') {
+               my $i = $self->{pagelth};
+               my $ref = $self->{pagedata};
+               my $tot = @$ref;
+               
+               # abort if we get a line starting in with a
+               if ($cmdline =~ /^a/io) {
+                       undef $ref;
+                       $i = 0;
+               }
+        
+               # send a tranche of data
+               while ($i-- > 0 && @$ref) {
+                       my $line = shift @$ref;
+                       $line =~ s/\s+$//o;            # why am having to do this? 
+                       $self->send($line);
+               }
+
+               # reset state if none or else chuck out an intermediate prompt
+               if ($ref && @$ref) {
+                       $tot -= $self->{pagelth};
+                       $self->send($self->msg('page', $tot));
+               } else {
+                       $self->state('prompt');
+               }
+       }
+       
+       # send a prompt only if we are in a prompt state
+       $self->prompt() if $self->{state} =~ /^prompt/o;
+}
+
+# 
+# this is the thing that runs the command, it is done like this for the 
+# benefit of remote command execution
+#
+
+sub run_cmd
 {
   my $self = shift;
   my $user = $self->{user};
@@ -98,10 +171,10 @@ sub normal
   } else {
 
     # special case only \n input => " "
-    if ($cmdline eq " ") {
-         $self->prompt();
-         return;
-       }
+#    if ($cmdline eq " ") {
+#        $self->prompt();
+#        return;
+#      }
        
     # strip out //
     $cmdline =~ s|//|/|og;
@@ -139,18 +212,15 @@ sub normal
        
   if ($ans[0]) {
     shift @ans;
-       $self->send(@ans) if @ans > 0;
   } else {
     shift @ans;
        if (@ans > 0) {
-         $self->send($self->msg('e2'), @ans);
+               unshift @ans, $self->msg('e2');
        } else {
-      $self->send($self->msg('e1'));
+               @ans = $self->msg('e1');
        }
   }
-  
-  # send a prompt only if we are in a prompt state
-  $self->prompt() if $self->{state} =~ /^prompt/o;
+  return (@ans);
 }
 
 #
@@ -192,7 +262,8 @@ sub finish
   my $nchan = DXChannel->get($main::mycall);
   my $pc17 = $nchan->pc17($self);
   DXProt::broadcast_ak1a($pc17);
-  
+
+  Log('DXCommand', "$call disconnected");
   $ref->del() if $ref;
 }