Qattiq disklar shunchaki sarflanadigan materiallardan boshqa narsa emas. Hech bo’lmaganda, bu katta disk massivlari, ayniqsa og’ir yuk ostida ishlaydiganlar bilan ishlayotganingizda, albatta to’g’ri. Mening holatimda, bu apparat RAID kontrolleri bo’lmagan korpuslardir. Shunday qilib, men hamma narsa parchalanib keta boshlamasdan oldin massivdagi «charchagan» elementni almashtirish vaqti kelgan paytni aniqlashga yordam beradigan oddiy disk holatini monitoring qilish tizimini amalga oshirish tajribam bilan o’rtoqlashmoqchiman. (Va, aytmoqchi, menda ham bunday holat ilgari sodir bo’lgan.) Ba’zan oddiy va tushunarli narsa yaratishim kerak bo’lganda tayyor yechimlarni qidirishga juda dangasa bo’laman. Bu holda, men uchun shunchaki o’zimnikini yaratish osonroq bo’ladi. Hech bo’lmaganda, shunda men ishlamayotgan holat uchun kim aybdor ekanligini aniq bilib olaman. ;)) Maqsad: barcha boshqariladigan saqlash qurilmalaridan barcha qattiq disklarning holatini aniq ko’rsatadigan oddiy sahifa yaratish. Bizga php5-cli, php5-curl va smartmontools paketlari kerak bo’ladi. Endi HDD haqida ma’lumotni tahlil qilish skriptini ko’rib chiqaylik
#!/usr/bin/php $sname = 'server_name'; exec("ls /dev/sd*|grep -v [0-9]", $out); #Ищем что-нибудь похожее на винты foreach($out as $entry){ $arr[] = smart($entry); } $data = base64_encode(json_encode($arr)); # Тут, внезапно, мы отправляем данные, получение которых описано ниже. # Дабы не просрать ничего, упаковываем всё в json и в base64 if( $curl = curl_init() ) { curl_setopt($curl, CURLOPT_URL, 'http://192.168.10.10/hdd.php'); curl_setopt($curl, CURLOPT_RETURNTRANSFER,true); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, "server=".$sname."&status=".$data."&s=".md5($data)); $out = curl_exec($curl); echo $out; curl_close($curl); } function smart($dev,$atr = true){ # непосредственно чтение и парсинг $cmd = '/usr/sbin/smartctl -AHi '.$dev; # получаем данные об устройстве exec($cmd, $out); # massiv katakchalarini belgilaydi $kw = 'Serial Number'; $serial = array_values(preg_grep("/{$kw}/i",$out)); $kw = 'SMART overall-health self-assessment test result'; $health = array_values(preg_grep("/{$kw}/i",$out)); $serial = substr(strrchr(str_replace(' ', '', $serial[0]),":"),1); $health = substr(strrchr(str_replace(' ', '', $health[0]),":"),1); $diag['DEV'] = str_replace('/dev/','',$dev); $diag['SN'] = $serial; $diag['HT'] = $health; $kw = 'ATTRIBUTE_NAME'; $lstr = array_keys(preg_grep("/{$kw}/i",$out)); $table = explode(' ', preg_replace('/\s\s+/', ' ', ltrim($out[$lstr[0]]))); $i=0; # aqlli atributlarni o'qish foreach($out as $string){ if($i > $lstr[0]){ $arr = explode(' ', preg_replace('/\s\s+/', ' ', ltrim($string))); if(count($arr) == count ($table)) $attribs[] = array_combine($table,$arr); } $i++; } if($atr == true) $diag['ATTR'] = $attribs; return $diag; } ?> [quads id=2] Ko'rib turganingizdek, skript topilgan blok qurilmalari haqidagi barcha ma'lumotlarni (ularning bo'limlarisiz) to'playdi va uni ikkinchi qism, ya'ni qabul qiluvchi skript joylashgan serverga yuboradi. Va mana uning mazmuni if($_POST['s'] == md5($_POST['status'])){ $body = "
".$_POST['server']." HDD monitor ( ".date('d.m.Y H:i:s')." )
"; $data = base64_decode($_POST['status']); $data = json_decode($data); foreach($data as $hdd){ if($hdd->HT == "PASSED"){ $color = 'green'; } else { $color = 'red'; } $info =''; foreach($hdd->ATTR as $attrib){ $info .= $attrib->ATTRIBUTE_NAME.": ".$attrib->RAW_VALUE."\n"; } $body .= "
DEV: ".$hdd->DEV."
".$hdd->SN."
";
} $body .= "
";
file_put_contents("/var/www/status/".$_POST['server'].".html", $body); } ?> Sensor deb ataladigan qurilma tomonidan so'ralganda, qabul qilgich holat papkasida so'rovning o'zidan olingan server nomlari bilan sahifalar yaratadi. CRONga "sensor" skriptini qo'shing va zavqlaning. BO'LDI! :)