release 1.5
[spider.git] / perl / DXMsg.pm
index 9316c374444ca0eff24087994b181f17c1fb7978..bbda05cb5571c5c8718e28708c6456350a9a87d7 100644 (file)
@@ -19,16 +19,19 @@ use DXCluster;
 use DXProtVars;
 use DXProtout;
 use DXDebug;
+use DXLog;
 use FileHandle;
 use Carp;
 
 use strict;
-use vars qw(%work @msg $msgdir %valid %busy);
+use vars qw(%work @msg $msgdir %valid %busy $maxage $last_clean);
 
 %work = ();                # outstanding jobs
 @msg = ();                 # messages we have
 %busy = ();                # station interlocks
 $msgdir = "$main::root/msg";              # directory contain the msgs
+$maxage = 30 * 86400;      # the maximum age that a message shall live for if not marked 
+$last_clean = 0;           # last time we did a clean
 
 %valid = (
   fromnode => '9,From Node',
@@ -50,6 +53,7 @@ $msgdir = "$main::root/msg";              # directory contain the msgs
   read => '9,Times read',
   size => '0,Size',
   msgno => '0,Msgno',
+  keep => '0,Keep this?,yesno',
 );
 
 # allocate a new object
@@ -169,6 +173,7 @@ sub process
                  add_dir($ref);
                  my $dxchan = DXChannel->get($ref->{to});
                  $dxchan->send("New mail has arrived for you") if $dxchan;
+                 Log('msg', "Message $ref->{msgno} from $ref->{from} received from $f[2] for $ref->{to}");
                }
                $ref->stop_msg($self);
                queue_msg();
@@ -183,10 +188,12 @@ sub process
          my $ref = $work{"$f[2]$f[3]"};
          if ($ref) {
                if ($ref->{private}) {                   # remove it if it private and gone off site#
-             $ref->del_msg;
+                       Log('msg', "Message $ref->{msgno} from $ref->{from} sent to $f[2] and deleted");
+                       $ref->del_msg;
            } else {
-             push @{$ref->{gotit}}, $f[2];           # mark this up as being received
-                 $ref->store($ref->{lines});             # re- store the file
+                       Log('msg', "Message $ref->{msgno} from $ref->{from} sent to $f[2]");
+                       push @{$ref->{gotit}}, $f[2];           # mark this up as being received
+                       $ref->store($ref->{lines});             # re- store the file
            }
        $ref->stop_msg($self);
          } else {
@@ -241,6 +248,8 @@ sub process
          last SWITCH;
        }
   }
+
+  clean_old() if $main::systime - $last_clean > 3600 ;    # clean the message queue
 }
 
 
@@ -268,6 +277,7 @@ sub store
          }
          $fh->close;
          dbg('msg', "file $ref->{to} stored\n");
+         Log('msg', "file $ref->{to} from $ref->{from} stored" );
     } else {
       confess "can't open file $ref->{to} $!";  
     }
@@ -294,6 +304,7 @@ sub store
          }
          $fh->close;
          dbg('msg', "msg $ref->{msgno} stored\n");
+         Log('msg', "msg $ref->{msgno} from $ref->{from} to $ref->{to} stored" );
     } else {
       confess "can't open msg file $fn $!";  
     }
@@ -317,6 +328,27 @@ sub del_msg
   dbg('msg', "deleting $self->{msgno}\n");
 }
 
+# clean out old messages from the message queue
+sub clean_old
+{
+       my $ref;
+       
+       # mark old messages for deletion
+       foreach $ref (@msg) {
+               if (!$ref->{keep} && $ref->{t} < $main::systime - $maxage) {
+                       $ref->{deleteme} = 1;
+                       delete $ref->{gotit};
+                       delete $ref->{list};
+                       unlink filename($ref->{msgno});
+                       dbg('msg', "deleting old $ref->{msgno}\n");
+               }
+       }
+
+       # remove them all from the active message list
+       @msg = map { $_->{deleteme} ? () : $_ } @msg;
+       $last_clean = $main::systime;
+}
+
 # read in a message header
 sub read_msg_header
 {