Subversion Repositories sysadmin_scripts

Rev

Rev 36 | Rev 40 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 36 Rev 38
Line 190... Line 190...
190
      warn "\t\t$folder not found in target and could not create it\n";
190
      warn "\t\t$folder not found in target and could not create it\n";
191
   }
191
   }
192
   return $numMessages;
192
   return $numMessages;
193
}
193
}
194
 
194
 
-
 
195
# this is an alternative to maintaining the hierarchy of the original system.
-
 
196
# instead, it will take 
-
 
197
 
-
 
198
sub processFolderByDate {
-
 
199
   my ( $sourceAccount, $targetAccount, $folder, $targetFormat, $dateBefore, $sourceDelimiter, $targetDelimiter, $deleteOnSuccess ) = @_;
-
 
200
   my $numMessages = 0;
-
 
201
   $sourceAccount->expunge_mailbox( $folder ); # clean it up so we don't copy deleted messages
-
 
202
   $sourceAccount->select( $folder ) or die "Could not connect to folder $folder\n"; # move into the correct folder for the source
-
 
203
   my @ids = $sourceAccount->search_sent_before( $dateBefore ); # use sent_before to get the sent date from message
-
 
204
#   print join( "\n\t\t\t", @ids ) . "\n";
-
 
205
   return 0 unless @ids; # we have nothing to copy, so exit
-
 
206
 
-
 
207
   if ( $sourceDelimiter ne $targetDelimiter ) { # different delimiters, so we have to change them in the folder def
-
 
208
      # they may contain meta chars, so escape them. We can use \Q \E in the pattern to match, but the 
-
 
209
      # second part of the s/// will substitute literal EXCEPT for the delimiter and the dollar sign
-
 
210
      # I'm escaping the double quote (what I'm using for the delimiter) "just in case" but I'm not doing
-
 
211
      # the dollar sign, so this will fail, fail, fail if there is an issue there.
-
 
212
      my $escapedTargetDelimiter = $targetDelimiter eq '"' ? '\\' .  $targetDelimiter : $targetDelimiter;
-
 
213
      $folder =~ s"\Q$sourceDelimiter\E"$escapedTargetDelimiter"g;
-
 
214
   }
-
 
215
   if ( $targetAccount->select( $folder ) || &makeFolder( $targetAccount, $folder, $targetDelimiter ) ) {
-
 
216
      foreach my $id ( @ids ) {
-
 
217
         my @flags = $sourceAccount->msg_flags( $id );
-
 
218
         my $message = $sourceAccount->get( $id ) or die $sourceAccount->errstr;
-
 
219
         if ( $targetAccount->put( $folder, $message, @flags ) ) {
-
 
220
            $sourceAccount->delete( $id ) if ( $deleteOnSuccess ) ;
-
 
221
            $numMessages++;
-
 
222
         } else {
-
 
223
            die "Could not write to target, aborting\n$targetAccount->errstr\n";
-
 
224
         }
-
 
225
      }
-
 
226
   } else {
-
 
227
      warn "\t\t$folder not found in target and could not create it\n";
-
 
228
   }
-
 
229
 
-
 
230
 
-
 
231
   return $numMessages;
-
 
232
}
-
 
233
 
195
#
234
#
196
# main processing loop to handle one account
235
# main processing loop to handle one account
197
#
236
#
198
sub processAccount {
237
sub processAccount {
199
   my ( $source, $target, $age, $ignore, $deleteOnSuccess, $deleteEmptyFolders ) = @_;
238
   my ( $source, $target, $age, $ignore, $deleteOnSuccess, $deleteEmptyFolders, $hierarchy ) = @_;
-
 
239
   $heirarchy = '' unless $hierarchy;
200
   
240
   
201
   my $date = getDate( $age );
241
   my $date = getDate( $age );
202
   print "\t" . ( $deleteOnSuccess ? 'Moving' : 'Copying' ) . " all messages before $date\n";
242
   print "\t" . ( $deleteOnSuccess ? 'Moving' : 'Copying' ) . " all messages before $date\n";
203
   
243
   
204
   # open and log into both source and target, and get the separator used
244
   # open and log into both source and target, and get the separator used
Line 214... Line 254...
214
   my $folderList = $$source{'folders'};
254
   my $folderList = $$source{'folders'};
215
   my $count = 0; # count the number of messages processed
255
   my $count = 0; # count the number of messages processed
216
   my $processedCount = 0; # count the number of folders processed
256
   my $processedCount = 0; # count the number of folders processed
217
   foreach my $folder ( @$folderList ) {
257
   foreach my $folder ( @$folderList ) {
218
      print "\t$folder";
258
      print "\t$folder";
-
 
259
      my $messages;
-
 
260
      if ( $heirarchy ) {
-
 
261
         $messages = &processFolderByDate( $sourceAccount, $targetAccount, $folder, $hierarchy, $date, $$source{'separator'}, $$target{'separator'}, $deleteOnSuccess );
-
 
262
      } else {
219
      my $messages = &processFolder( $sourceAccount, $targetAccount, $folder, $date, $$source{'separator'}, $$target{'separator'}, $deleteOnSuccess );
263
         $messages = &processFolder( $sourceAccount, $targetAccount, $folder, $date, $$source{'separator'}, $$target{'separator'}, $deleteOnSuccess );
-
 
264
      }
220
      $sourceAccount->expunge_mailbox( $folder );
265
      $sourceAccount->expunge_mailbox( $folder );
221
      # delete folder if empty and client has requested it.
266
      # delete folder if empty and client has requested it.
222
      &deleteAFolder( $sourceAccount, $folder, $$source{'separator'}, $$source{'systemfolder'} ) if ( $deleteEmptyFolders );
267
      &deleteAFolder( $sourceAccount, $folder, $$source{'separator'}, $$source{'systemfolder'} ) if ( $deleteEmptyFolders );
223
      print "\n\t\t$messages processed\n";
268
      print "\n\t\t$messages processed\n";
224
      $count += $messages;
269
      $count += $messages;