00001 #!/usr/bin/perl -w
00002
00003 my $verbose = 1;
00004 my $directory;
00005 my $file;
00006 my $title = ""; # for display purposes only
00007 my $archiveDir;
00008
00009 use Getopt::Long;
00010
00011 GetOptions( "verbose!" => \$verbose,
00012 "directory=s" => \$directory,
00013 "file=s" => \$file,
00014 "title=s" => \$title,
00015 "archivedir=s" => \$archiveDir
00016 );
00017
00018 #
00019 # Values are: "DIRECTORY:FREESPACE"
00020 #
00021 # Free Space is in Megabytes
00022 #
00023 my( @ArchiveDirEntries ) = (
00024 "/usr2/video/archive/1/:3072",
00025 "/usr2/video/archive/2/:3072",
00026 "/usr2/video/archive/3/:3072",
00027 );
00028
00029 if ( ! $directory || ! $file ) {
00030 printf( "USAGE: myth_archive_job.pl --directory RECORDINGDIR --file " .
00031 "VIDEOFILE <OPTIONS>\n" );
00032 printf( "\n" );
00033 printf( " OPTIONS:\n" );
00034 printf( " --archivedir ARCHIVEDIR Force archive to go to " .
00035 "ARCHIVEDIR\n" );
00036 exit(-1);
00037 }
00038
00039 if ( ! -r "$directory/$file" ) {
00040 die( "ERROR: $directory/$file is not readable or does not exist: $!" );
00041 }
00042
00043 my( $dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size, $atime,
00044 $mtime, $ctime, $blksize, $blocks) = stat("$directory/$file");
00045 $size = $size * 1.0 / 1024 / 1024;
00046
00047 if ( $verbose ) {
00048 printf( "+-----------------------+\n" );
00049 printf( "| Myth 'Archive' Script |\n" );
00050 printf( "+-----------------------+\n" );
00051 printf( "Title : %s\n", $title ) if ($title ne "");
00052 printf( "Source Dir: %s\n", $directory );
00053 printf( "Filename : %s\n", $file );
00054 printf( "Filesize : %d MB\n", $size );
00055
00056 printf( "\n" );
00057 }
00058
00059 if ( $archiveDir ) {
00060 if (MoveFileToArchiveDir( $file, $directory, $archiveDir )) {
00061 exit(0);
00062 }
00063 } else {
00064 my( $dirEntry);
00065 foreach $dirEntry ( @ArchiveDirEntries ) {
00066 my( $archiveDir, $keepFree ) = split( ':', $dirEntry );
00067 my( $freeSpace ) = GetFreeSpace( $archiveDir );
00068
00069 if ( $verbose ) {
00070 printf( "Trying Dir: %s\n", $archiveDir );
00071 printf( " Keep Free: %6d MB\n", $keepFree );
00072 printf( " Curr Free: %6d MB\n", $freeSpace );
00073 }
00074
00075 if (( $freeSpace - $size) > $keepFree ) {
00076 printf( "Attempting archive to %s\nStatus: ", $archiveDir );
00077 if (MoveFileToArchiveDir( $file, $directory, $archiveDir )) {
00078 printf( "Success.\n" );
00079 exit(0);
00080 }
00081 printf( "ERROR!\n" );
00082 }
00083 }
00084 }
00085
00086 if ( $verbose ) {
00087 printf( "ERROR: Unable to find a directory with enough free space!!\n" );
00088 }
00089
00090 exit(-1);
00091
00092
00093 # Don't like doing this, but it was easier than requiring Filesys::Statfs
00094 sub GetFreeSpace {
00095 my( $dir ) = shift;
00096
00097 if ( ! -r $dir ) {
00098 return 0;
00099 } else {
00100 my( $freeSpace ) = `df -Pm $dir | grep -v Available | awk '{print \$4}'`;
00101
00102 return $freeSpace;
00103 }
00104 }
00105
00106 sub MoveFileToArchiveDir {
00107 my( $file, $oldDir, $newDir ) = @_;
00108
00109 $oldDir =~ s/\/$
00110 $newDir =~ s/\/$
00111
00112 my( $old ) = "$oldDir/$file";
00113 my( $new ) = "$newDir/$file";
00114
00115 if ( -l $old ) {
00116 printf( "ERROR: The original '$file' is already a link, will not archive to '$new'!\n" );
00117 return(1);
00118 }
00119
00120 # don't like doing this this way, but this is an example script that
00121 # people can enhance if they want
00122 my( $cmd ) = sprintf( "mv %s %s && ln -s %s %s", $old, $new, $new, $old );
00123
00124 #printf( "Archiving by running '%s'\n", $cmd );
00125
00126 return (system( $cmd ) == 0);
00127 }
00128