Как расшарить ISO по Сети?

Вот, подвернулась даже не задача, а так, вопрос, решил написать и заодно доделать свой старый скрипт.

Вопрос вроде бы не такой уже и сложный. Есть масса iso-файлов. На каждом соответственно драйвера, ну или «операционки». Надо сделать их доступными по Сети. То есть, например, по «самбе».

Как решается эта задача. Обычно народ начинает искать какой-то софт, который бы сделал это и на том конец. Но, даже если вспомнить, про то, что за каждый «поворот головы» в среде «виндовс» следует заплатить денег, и притом иногда — немалых, а средства на «ай-ти» пока выделяются по остаточному принципу, есть смысл поискать что-то альтернативное.

Вот собственно способ, который может привлечет ваше внимание, а может покажется излишне громоздким. Лично мне как программисту он кажется наиболее оптимальным, быстрым и дешевым. Однако, следует учесть, что для успешного решения такой задачи, необходим UNIX-сервер. Я традиционно для себя использую «АльтЛинукс», 4х версии.

Итак, идея состоит в том, чтобы в составе внутреннего веб-сервера отобразить все доступные для подключения образы дисков (iso). И дать возможность пользователю выбрать, какой из них он хочет подключить.

Далее, скрипт на сервере должен выполнить запись в таблицу базы данных, где указать, что необходимо выполнить монтирование такого-то файла в таком то каталоге. Ну и предварительно создает каталог. Вот собственно часть рабочего кода:

/*-----------------------------------------------------------------
*  ==[ Date: 15.12.2010]== Programmer: Arsen Kirillov)
*  ==[ Note: Process mount
*------------------------------------------------------------------*/
if ( $g_mount && file_exists( $g_mount ) )
{
  // 1 . create folder  - with file name in /data/iso's
  if ( !file_exists ( $fn = ("/data/ISOS/" . basename($g_mount))) )
  {
    mkdir( $fn );
    // here mount
    $comm = "/bin/mount  -t iso9660 '$g_mount' '$fn' -o loop";             
 
    $mdb->query( "                                                        
 
        INSERT INTO
            " . ibase_table( "isos" ) . "                                 
 
        SET
            name='".mysql_escape_string( $comm )."',
            isofile='".mysql_escape_string( $g_mount )."',
            mounted = 0                                                   
 
       " );
  }
 
  //
}

Здесь — $g_mount, это переменная $_GET[ «mount» ] в которой передается полное имя файла для подмонтирования. Поскольку такие системы итак предназначены для внутреннего пользования то вопрос безопасности решается обработки этого параметра, на предмет его соответствия каталогу с исо-образами.

Собственно, когда в указанной таблице MySQL появляется такая запись, уже другой (крон) скрипт, от имени «рута» выполняет команду на монтирование. Этот скрипт также проверяет соответствие команды, на предмет легитимности и синтаксиса. Опять же это вопрос безопасности.

После монтирования, все «поднятые» образы показываются в в списке и пользователь может их размонтировать. Ну или размонтирование выполняет скрипт по тайм-ауту. Для этого в таблице «заданий» есть поле timestamp, в которое заноситься последнее время изменения записи.

Вот собственно как выглядит интерфейс:

Интерфейс для сетевого монтирования

Интерфейс для сетевого монтирования

А таким вот образом наполняется список файлов для монтирования:

 //search all iso in /data
 $arr = array();
 
 $dir_iterator = new RecursiveDirectoryIterator( "/data" );
 $iterator = new RecursiveIteratorIterator($dir_iterator, RecursiveIteratorIterator::SELF_FIRST);
 
 foreach ($iterator as $fname )
 {
    if ( !preg_match( "~\.iso$~msi", $fname ) )
      continue;
    $arr[] = $fname;
 }
 
 $smarty->assign( "isos", $arr );
 $i= 0;
// What is already mounted
 $arr = array();
 $res = $mdb->query( "SELECT * FROM  " . ibase_table( "isos" ) . " " );
 while ( $o = mysql_fetch_object( $res ) )
 {
    $arr[ $i ][ "obj" ] = $o;
    $i++;
 
 }
 $smarty->assign( "mounted", $arr );

Конечно, в проекте использована Smarty.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *