среда, 28 октября 2015 г.

Обход ограничения при переносе больших файлов плагином datadir в Rutorrent

Кто пользуется Rutorrent в 32 битных системах наверное сталкивались с проблемой, при которой нельзя переносить торренты размером больше 2/4 Gb. Все основные предложения по обходу этой проблемы заключались в переходе на 64 битную ОС. Я же не мог взять и так просто перейти (домашний шлюз вот уже долгое время крутился на 32 битной Ubuntu, а заниматься переустановкой и настройкой шлюза с нуля не было никакого желания). В одном из постов автор Rutorrent предложил заменить вызовы php функции переноса/копирования на sh. Но до дела так и не дошло. В итоге решил заняться этим сам (к слову с php до этого никогда не работал, поэтому код может быть не идеальным, но зато рабочий). Изменения надо вносить в файл util_rt.php, который находиться в директории ../rutorrent/plugins/datadir. Надо найти строки

function rtMoveFile( $src, $dst, $dbg = false )
{
 $ss = LFS::stat($src);
 if( !rename( $src, $dst ) )
 {
  if( $dbg ) rtDbg( __FUNCTION__, "from ".$src );
  if( $dbg ) rtDbg( __FUNCTION__, "to   ".$dst );
  if( $dbg ) rtDbg( __FUNCTION__, "move fail, try to copy" );
  if( !copy( $src, $dst ) )
  {
   if( $dbg ) rtDbg( __FUNCTION__, "copy fail" );
   return false;
  }
  if( !unlink( $src ) )
   if( $dbg ) rtDbg( __FUNCTION__, "delete fail (".$src.")" );
 }
 // there are problems here, if run-user is not file owner
 if($ss!==false)
  touch( $dst, $ss['mtime'], $ss['atime'] );
 return true;
}  
И привести к виду
function rtMoveFile( $src, $dst, $dbg = false )
{
$ss = LFS::stat($src);
     $src = escapeshellarg($src);
     $dst = escapeshellarg($dst);
     exec ("/bin/mv  -f $src $dst", $output, $retval);
     $err = implode ($output);
     if (!empty ($err))
     {
         if( $dbg ) rtDbg( __FUNCTION__, "from ".$src );
         if( $dbg ) rtDbg( __FUNCTION__, "to  ".$dst );
         if( $dbg ) rtDbg( __FUNCTION__, "erorr ".$err );
         if( $dbg ) rtDbg( __FUNCTION__, "move fail, try to copy" );
         exec ("/bin/cp -r -f $src $dst 2>&1", $output, $retval);
         $err = implode ($output);
         if (!empty ($err))
         {
             if( $dbg ) rtDbg( __FUNCTION__, "copy fail ".$err );
             return false;
         }
 }
 // there are problems here, if run-user is not file owner
 if($ss!==false)
  touch( $dst, $ss['mtime'], $ss['atime'] );
 return true;
}

Вот и все. Теперь плагин может переносить файлы любого размера.

Комментариев нет:

Отправить комментарий