LINUX.ORG.RU
ФорумTalks

Взял тут себе DNS-327L...

 ,


1

2

Если вы заметили, то последние недели мой унылый инженерный бложик то косячил-косячил, а последнюю неделю вообще лежал отдавая честный 500. Так что вбрасываю в толксы.

Но, обо всем по порядку. Начались проблемы с того, что накрылся жесткий диск в RAID-1 зеркале. Причем из двух жестких дисков: ветеран и новичок накрылся сравнительно новый сигейт, а WDшка как работала, так и работает. Да, в гуано скатился сигейт. WDшка хоть и сильно горячее была, но жива.

Держать данные на вырожденном массиве как-то некомильфо, да и материночка на которой у меня был построен NAS держалась на ладан, тормозила. В общем напрашивался апгрейд.

Руки в ноги, поехал и прикупил я обнову. Жесткий диск на замену, да модную коробочку NAS - Dlink DNS-327L, с прицелом на OpenWRT. Помятуя о том, какие длинк ребята, блок питания 12в 3А я сразу отложил - запитал от своего... Жить я решил на стоковой прошивке, ибо пока не хотелось терять гарантию.

Тут-то и начались приключения. В общем, сначала, он захотел сам переформатить диск. Готовое зеркало он почему-то не подхватил. Окей, придется делать маневр данными. Ну, думаю, создам сейчас вырожденный raid-1 массив из одного диска, скопирую данные, потом воткну второй, синхронизирую... профит!

Благо, mdadm --create /dev/md0 -l raid1 -f -n 1 /dev/sda1 сделать просто. Фиг вам!

Оно не дает создать вырожденный массив из одного веника. Только из двух. Воткнуть в PC и создать там? Но я не знаю в каком виде этот NAS хочет его отформатировать. На тот момент я даже не знал, mdadm там используется или нет.

Почесав голову, решил сделать тупо: воткнул почти_что_умерший сигейт, с релокейтами в пару с новым WD, отформатировал их. Оказалось, эта хрень создает GPT таблицу разделов, на ней создает несколько томов, откусывая под свои нужды несколько гигабайт, а потом на одном из них уже создает запрошенный RAID1 через mdadm. Секрет был в GPT таблице разделов и служебных разделах.

Даже по гигабитной сети данные по NFS копировались долго. Больше 700 гиг, причем дофига мелких файлов. Заняло это часов эдак 18.

Довольный, вытаскиваю убитый сигейт, втыкаю на его место старичка WD, с которого все это копировалось и запускаю перестройку. Через два часа оно меня обрадовало, что перестройка завершена. Однако массив так и остался degraded, и оно настойчиво предлагало мне повторить операцию.

На третий раз Шаман Зоркий Глаз понял, что это косяк в прошивке. Очередной. Про периодически съезжающие таблички, вырвиглазный дизайн и рекомендацию использовать IE я молчу. Быстрый взгляд выявил, что внутри используется глобальный и надежный PHP + mysql прикрученные к lighttpd. Сразу бросаются в глаза процессы php-fcgi в настройках. При этом пути в ардресной строке к html файликам. nmap так же рассказал, что порт mysql торчит во внешний мир. Данные о происходящих операциях оно в жабоскрипт получает ajax'ом... В виде XML! JSON? Не, не слышали. Все это составляет очень странное впечатление.

Ах да, и еще если старт/стоп службы, о котором он кидает POST запрос занимает слишком долго - lighttpd падает.

Ладно, раз косяк в прошивке, значит надо обновиться. На железке 1.0, а на сайте 1.3 и мой баг в списке. Выкачиваю свежую прошивку с сайта dlink, заливаю...

413 - request entity too large.

Тут уже утро, пора на работу. Пробрасываю порт наружу, с работы решил попробовать еще раз, как выдалась минутка. При заливке удаленно с небольшой скоростью оно прошивку скушало!

Перестраиваю рейд, теперь оно ожило. Вечером настраиваю шары, попутно проклиная криворуких людей, писавших фирмварю, перезагружаю железку и...

После перезагрузки меня радует информация о том, что он собрался авто-ребилдить массив. Опять. На этот раз проблема оказалас в джампере «Enable 1.5Gbps phy» на одном из веников. При нем веник инициализируется немного дольше, и это (моя догадка) вызывает в скриптах дибилинка рейс, который заставляет его перестроить массив. После снятия джампера и перестройки массива все заработало.

Глюки тем временем продолжались, lighttpd после обновления прошивки стал падать на каждый чих. Быстро сообразил, что проблема в настройках. Сразу видно миграцию конфигурации из одной фирмвари в другую они не осилили. Сбрасываюсь на за заводские настройки - о чудо, половина косяков ушла!

Подключаю NFS шары, настраиваю... И тут замечаю, что что-то не то с правами. А именно - на все стоит 777. Чиню... В какой-то момент опять 777. Методом проб и ошибок выясняется, что чудные ребята из dlink делают chmod -Rf 777 /mnt/ при !каждой! перезагрузке. Причем не только на этой модели. Взял с полки баночку, натер лицо фейспальмовым маслом

К слову сказать, железка внутри весьма любопытная. Marvell Armada 370 (armv7 + VFP, без неона) @ 1.2Ghz, 512MB DDR3, 128Mb NAND. USB3.0, 2xSATA, и прочие радости. И судя по всему есть поддержка в OpenWRT.

В общем, сижу и думаю, обменять по гарантии как лютое гавно, или забить на гарантию, вкатить debian || openwrt и не знать проблем. В пользу второго говорит и то, что можно устроить народный код-ревью быдлокоду дибилинка. Мир должен знать героев. (Опытные веб-девы желающие вылить ушат дерьма на их веб-гуй есть?)

★★★★★

Последнее исправление: cetjs2 (всего исправлений: 2)
Ответ на: комментарий от ncrmnt

Правами должна рулить файловая система.

Натюрлих... Но с другой стороны, если к ФС не обращается никто кроме единственного (условно) приложения то разница, по большому счёту, не так велика. Всё таки это бытовая шарманка.

sin_a ★★★★★
()
Ответ на: комментарий от sin_a

Таки кроме CIFS существуют AFP, NFS, FTP. И не я, а они сами их включили в прошивку и заявили поддержку.

ncrmnt ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

Ты не поверишь, но на экзотику мне всегда везло.

ncrmnt ★★★★★
() автор топика
Ответ на: комментарий от ncrmnt

Да я согласен. Просто ситуация вполне объяснима. И для основного случая не только не катастрофична, но вообще совершенно нормальна и правильна.

sin_a ★★★★★
()
Ответ на: комментарий от sin_a

На затравку: upload.php из исходников их веб-интерфейса:

<?php
if (!empty($_FILES)) {
 //echo $_FILES['file']['tmp_name'];
 system("rm -f /tmp/import_users");
 move_uploaded_file($_FILES['fileToUpload']['tmp_name'],"/tmp/import_users");
}
?>
unlink? не, не слышали.

Их жe web_file.php. Опять загрузка файла:

<?php
//if(!isset($_REQUEST['name'])) throw new Exception('Name required');
//if(!preg_match('/^[-a-z0-9_][-a-z0-9_.]*$/i', $_REQUEST['name'])) throw new Exception('Name error');
//
//if(!isset($_REQUEST['index'])) throw new Exception('Index required');
//if(!preg_match('/^[0-9]+$/', $_REQUEST['index'])) throw new Exception('Index error');
//
//if(!isset($_FILES['file'])) throw new Exception('Upload required');
//if($_FILES['file']['error'] != 0) throw new Exception('Upload error');

//201308 Sean Add for upload security (Consumer Storage Security Vurnubility)
$ip = gethostbyaddr($_SERVER['SERVER_ADDR']);
$result = @stripslashes( @join( @file( "http://".$ip."/cgi-bin/nas_sharing.cgi?cmd=71&uuid=".$_SERVER['REMOTE_ADDR']),"" ));
$equal = strcmp($result, "success");
if ($equal != 0)
{
        header("HTTP/1.1 302 Found");
        exit();
}
//201308 Sean Add for upload security (Consumer Storage Security Vurnubility)


$path = str_replace('//','/',$_REQUEST['folder']);
$filename = str_replace('\\','',$_REQUEST['name']);
$target =  $path . $filename . '-' . $_REQUEST['index'];

//$target =  $_REQUEST['folder'] . $_REQUEST['name'] . '-' . $_REQUEST['index'];

move_uploaded_file($_FILES['file']['tmp_name'], $target);


//$handle = fopen("/tmp/debug.txt", "w+");
//fwrite($handle, $_FILES['file']['tmp_name']); 
//fwrite($handle, "\n"); 
//fwrite($handle, $target); 
//fclose($handle); 

// Might execute too quickly.
sleep(1);

?>

ncrmnt ★★★★★
() автор топика
Последнее исправление: ncrmnt (всего исправлений: 3)
Ответ на: комментарий от ncrmnt

И опять загрузка файла. Третья реализация, по ходу контуженный кем-то пример:

<?php
/*
Uploadify v2.1.4
Release Date: November 8, 2010

Copyright (c) 2010 Ronnie Garcia, Travis Nickels

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
// $fileTypes  = str_replace('*.','',$_REQUEST['fileext']);
        // $fileTypes  = str_replace(';','|',$fileTypes);
        // $typesArray = split('\|',$fileTypes);
        // $fileParts  = pathinfo($_FILES['Filedata']['name']);

        // if (in_array($fileParts['extension'],$typesArray)) {
                // Uncomment the following line if you want to make the directory if it doesn't exist
                // mkdir(str_replace('//','/',$targetPath), 0755, true);

//201308 Sean Add for upload security (Consumer Storage Security Vurnubility)
//$ip = gethostbyaddr($_SERVER['SERVER_ADDR']);
$result = "";
//$ip = system("xmldbc -g /network_mgr/lan0/ip");

if (strlen($_REQUEST['name']) == 0 )            //mobile
        //$result = @stripslashes( @join( @file( "http://".$ip."/cgi-bin/nas_sharing.cgi?cmd=71&uuid=".$_SERVER['REMOTE_ADDR']),"" ));
        $result = @stripslashes( @join( @file( "http://127.0.0.1/cgi-bin/nas_sharing.cgi?cmd=71&uuid=".$_SERVER['REMOTE_ADDR']),"" ));
else
        //$result = @stripslashes( @join( @file( "http://".$ip."/cgi-bin/login_mgr.cgi?cmd=ui_check_wto_by_name&username=".$_REQUEST['name']."&ip=".$_SERVER['REMOTE_ADDR']),"" ));
        $result = @stripslashes( @join( @file( "http://127.0.0.1/cgi-bin/login_mgr.cgi?cmd=ui_check_wto_by_name&username=".$_REQUEST['name']."&ip=".$_SERVER['REMOTE_ADDR']),"" ));

$equal = strcmp($result, "success");
if ($equal != 0)
{
        header("HTTP/1.1 302 Found");
        exit();
}
//201308 Sean Add for upload security (Consumer Storage Security Vurnubility)


if (!empty($_FILES)) {
        $tempFile = $_FILES['Filedata']['tmp_name'];
//      $targetPath = $_SERVER['DOCUMENT_ROOT'] . $_REQUEST['folder'] . '/';
        $targetPath =  $_REQUEST['folder'] . '/';

        $new_file_name =  str_replace('\\','',$_FILES['Filedata']['name']);  //amy++
        $targetFile =  str_replace('//','/',$targetPath) . $new_file_name; //amy++


        //$targetFile =  str_replace('//','/',$targetPath) . $_FILES['Filedata']['name'];

//      echo $tempFile;
//      echo $targetFile;

                //move_uploaded_file($tempFile,$targetFile);
                $isok=copy($tempFile , $targetFile);
                unlink($tempFile);
                chmod($targetFile,0777);

                //fish 20120824+ change owner for Quota
                $username = $_REQUEST['username'];
                if(!empty($username))
                {
                        chown($targetFile, $username);
                        $userinfo = posix_getpwnam($username);
                        chgrp($targetFile, (int)$userinfo['gid']);
                }
                system("sync");
                //end

                system("wto -r");// fish20120711+ timeout reset
                echo str_replace($_SERVER['DOCUMENT_ROOT'],'',$targetFile);

        // } else {
        //      echo 'Invalid file type.';
        // }
}


// $fileTypes  = str_replace('*.','',$_REQUEST['fileext']);
        // $fileTypes  = str_replace(';','|',$fileTypes);
        // $typesArray = split('\|',$fileTypes);
        // $fileParts  = pathinfo($_FILES['Filedata']['name']);

        // if (in_array($fileParts['extension'],$typesArray)) {
                // Uncomment the following line if you want to make the directory if it doesn't exist
                // mkdir(str_replace('//','/',$targetPath), 0755, true);

Особенно доставляет system(«sync»).

ncrmnt ★★★★★
() автор топика
Ответ на: комментарий от ncrmnt

Мне с месяца два назад за одну неделю пришлось 4 или 5 сигейтов 2-х терабайтовых поменять. Вообще скатился, поддерживаю.

turtle_bazon ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.