Add message expiry from cron (bug #388)
authorMark Spencer <markster@digium.com>
Wed, 22 Oct 2003 03:58:58 +0000 (03:58 +0000)
committerMark Spencer <markster@digium.com>
Wed, 22 Oct 2003 03:58:58 +0000 (03:58 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@1652 65c4cc65-6c06-0410-ace0-fbb531ad65f3

README.messages-expire [new file with mode: 0755]
contrib/scripts/README.messages-expire [new file with mode: 0755]
contrib/scripts/messages-expire.pl [new file with mode: 0755]
messages-expire.pl [new file with mode: 0755]

diff --git a/README.messages-expire b/README.messages-expire
new file mode 100755 (executable)
index 0000000..e9c5061
--- /dev/null
@@ -0,0 +1,20 @@
+expire-messages.pl
+
+expire-messages finds messages more than X days old and deletes them. 
+Because the older messages will be the lower numbers in the folder (msg0000
+will be older than msg0005), just deleting msg0000 will not work. 
+expire-messages then runs a routine that goes into every folder in every
+mailbox to reorganize.  If the folder contains msg0000, no action is taken. 
+If the folder does not, the rename routine takes the oldest message and
+names it msg0000, the next oldest message and names it msg0001 and so on.
+
+The file deletion is done by the -exec parameter to 'find'.  It would be far
+more efficient to take the output from 'find' and just reorganize the
+directories from which we deleted a file.  Something for the future...
+
+Keep in mind that messages are deleted at the beginning of the script you
+will have mailbox trouble if you check messages before the script
+reorganizes your mailbox.
+
+To use it, make sure the paths are right.  Adjust $age (originally set to
+31) if necessary.
diff --git a/contrib/scripts/README.messages-expire b/contrib/scripts/README.messages-expire
new file mode 100755 (executable)
index 0000000..e9c5061
--- /dev/null
@@ -0,0 +1,20 @@
+expire-messages.pl
+
+expire-messages finds messages more than X days old and deletes them. 
+Because the older messages will be the lower numbers in the folder (msg0000
+will be older than msg0005), just deleting msg0000 will not work. 
+expire-messages then runs a routine that goes into every folder in every
+mailbox to reorganize.  If the folder contains msg0000, no action is taken. 
+If the folder does not, the rename routine takes the oldest message and
+names it msg0000, the next oldest message and names it msg0001 and so on.
+
+The file deletion is done by the -exec parameter to 'find'.  It would be far
+more efficient to take the output from 'find' and just reorganize the
+directories from which we deleted a file.  Something for the future...
+
+Keep in mind that messages are deleted at the beginning of the script you
+will have mailbox trouble if you check messages before the script
+reorganizes your mailbox.
+
+To use it, make sure the paths are right.  Adjust $age (originally set to
+31) if necessary.
diff --git a/contrib/scripts/messages-expire.pl b/contrib/scripts/messages-expire.pl
new file mode 100755 (executable)
index 0000000..bb4fec5
--- /dev/null
@@ -0,0 +1,73 @@
+#!/usr/bin/perl
+#
+# Script to expire voicemail after a specified number of days
+# by Steve Creel <screel@turbs.com>
+# 
+
+# Directory housing the voicemail spool for asterisk
+$dir = "/var/spool/asterisk/voicemail";
+
+# Context for which the script should be running
+$context = "default";
+
+# Age (Delete files older than $age days old)
+$age = 31;
+
+# Delete all files older than $age (but named msg????.??? to be sure
+# we don't delete greetings or the user's name)
+
+system('find '.$dir.'/'.$context.' -name msg????.??? -mtime +'.$age.' -exec rm {} \; -exec echo Deleted {} \;');
+
+# For testing - what number to we start when we renumber?
+$start = "0";
+
+# Rename to msg and a 4 digit number, 0 padded.
+$fnbase = sprintf "msg%04d", $start;
+
+# Make $dir include the context too
+$dir.="/".$context;
+
+( -d $dir ) || die "Can't read list of mailboxes ($dir): $!\n"; 
+@mailboxes = `ls -A1 $dir`;
+chomp(@mailboxes);
+
+$save_fnbase = $fnbase;
+
+foreach $mailbox (@mailboxes) {
+
+  ( -d $dir."/".$mailbox) || die "Can't read list of folders (".$dir."/".$mailbox."): $!\n";
+  @folders = `ls -A1 $dir/$mailbox`;
+  chomp(@folders);
+
+  foreach $folder (@folders) {
+   if (-d $dir."/".$mailbox."/".$folder) {
+    ( -d $dir."/".$mailbox."/".$folder) || die "Can't read list of messages (".$dir."/".$mailbox."/".$folder.") $!\n";
+    @files = `ls -A1 $dir/$mailbox/$folder/`;
+
+    # Sort so everything is in proper order.
+    @files = sort @files;
+    chomp(@files);
+
+    # If there is still (after deleting old files earlier in the
+    # script) a msg0000.txt, we don't need to shuffle anything
+    # in this folder.
+    if (-f $dir."/".$mailbox."/".$folder."/msg0000.txt") { next; }
+
+    foreach $ext (("WAV", "wav", "gsm", "txt")) {
+      # Reset the fnbase for each file type
+      $fnbase = $save_fnbase;
+
+      foreach $file (@files) {
+       if ( $file =~ /$ext/ ) {
+               chdir($dir."/".$mailbox."/".$folder."/") || die "Can't change folder: $!";
+               print "Renaming: ".$dir."/".$mailbox."/".$folder."/".$file." to ".$fnbase.".".$ext."\n";
+               rename($file, $fnbase.".".$ext) || die "Cannot rename: $!";
+               $fnbase++;
+       }
+      }
+    }
+   }
+  }
+}
+
+__END__
\ No newline at end of file
diff --git a/messages-expire.pl b/messages-expire.pl
new file mode 100755 (executable)
index 0000000..bb4fec5
--- /dev/null
@@ -0,0 +1,73 @@
+#!/usr/bin/perl
+#
+# Script to expire voicemail after a specified number of days
+# by Steve Creel <screel@turbs.com>
+# 
+
+# Directory housing the voicemail spool for asterisk
+$dir = "/var/spool/asterisk/voicemail";
+
+# Context for which the script should be running
+$context = "default";
+
+# Age (Delete files older than $age days old)
+$age = 31;
+
+# Delete all files older than $age (but named msg????.??? to be sure
+# we don't delete greetings or the user's name)
+
+system('find '.$dir.'/'.$context.' -name msg????.??? -mtime +'.$age.' -exec rm {} \; -exec echo Deleted {} \;');
+
+# For testing - what number to we start when we renumber?
+$start = "0";
+
+# Rename to msg and a 4 digit number, 0 padded.
+$fnbase = sprintf "msg%04d", $start;
+
+# Make $dir include the context too
+$dir.="/".$context;
+
+( -d $dir ) || die "Can't read list of mailboxes ($dir): $!\n"; 
+@mailboxes = `ls -A1 $dir`;
+chomp(@mailboxes);
+
+$save_fnbase = $fnbase;
+
+foreach $mailbox (@mailboxes) {
+
+  ( -d $dir."/".$mailbox) || die "Can't read list of folders (".$dir."/".$mailbox."): $!\n";
+  @folders = `ls -A1 $dir/$mailbox`;
+  chomp(@folders);
+
+  foreach $folder (@folders) {
+   if (-d $dir."/".$mailbox."/".$folder) {
+    ( -d $dir."/".$mailbox."/".$folder) || die "Can't read list of messages (".$dir."/".$mailbox."/".$folder.") $!\n";
+    @files = `ls -A1 $dir/$mailbox/$folder/`;
+
+    # Sort so everything is in proper order.
+    @files = sort @files;
+    chomp(@files);
+
+    # If there is still (after deleting old files earlier in the
+    # script) a msg0000.txt, we don't need to shuffle anything
+    # in this folder.
+    if (-f $dir."/".$mailbox."/".$folder."/msg0000.txt") { next; }
+
+    foreach $ext (("WAV", "wav", "gsm", "txt")) {
+      # Reset the fnbase for each file type
+      $fnbase = $save_fnbase;
+
+      foreach $file (@files) {
+       if ( $file =~ /$ext/ ) {
+               chdir($dir."/".$mailbox."/".$folder."/") || die "Can't change folder: $!";
+               print "Renaming: ".$dir."/".$mailbox."/".$folder."/".$file." to ".$fnbase.".".$ext."\n";
+               rename($file, $fnbase.".".$ext) || die "Cannot rename: $!";
+               $fnbase++;
+       }
+      }
+    }
+   }
+  }
+}
+
+__END__
\ No newline at end of file