The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Мониторинг дискового пространства Windows с помощью Perl (perl disk monitoring wmi)


<< Предыдущая ИНДЕКС Исправить src / Печать Следующая >>
Ключевые слова: perl, disk, monitoring, wmi,  (найти похожие документы)
From: Pavel Ustyugov Date: Mon, 27 Apr 2008 17:02:14 +0000 (UTC) Subject: Мониторинг дискового пространства Windows с помощью Perl Данный скрипт позволет мониторить свободное пространство логических дисков на Windows машинах, с отправкой уведомления на email в случае малогого количества свободного места на одном из дисков. Нормально работает под XP(SP2) и W2003 SERVER. На других системах не тестировался. В принципе, должен работать везде где есть поддержка WMI. Идея взята от сюда. Для работы скрипта необходим: ActivePerl В принципе, данный способ предоставляет широкие возможности по мониторингу Windows серверов. Доступные классы WMI можно глянуть тут. 1) Настраиваем параметры SMTP. 2) Настраиваем порограммы предупреждения. 3) Загоняем в шедуллер и вперед. # Win32 disk space monitor # Tested on ActivePerl # CopyLeft Pavel Ustyugov aka Pahanivo # Usage: script.pl [force] # force - force send report (if warning not found) my $_script_name = "Win32 disk space monitor"; my $_script_version = "0.3.3"; ################################################################################ use strict; use Win32::OLE qw(in); use Net::SMTP; sub result_out($); sub mail_out($); sub b_to_G ($); ################################################################################ # Configure - setup you own parameters below my $Out_Target = "smtp"; #stdout - on screen, email notify don't send; smtp - by mail notify my $Force_Notify = 0; #0 - send notify by email if warnings found, 1 - send notify by email always my @Mail_To_List = ( 'admin1@test.ru', 'admin2@test.ru', 'admin3@test.ru' ); #list of recipients my $Mail_From = 'file-server@test.ru'; my $Mail_LocalName = 'localhost'; #change this if have problem with SMTP `helo/ehlo` my $Mail_SMTP_server = '195.195.195.195'; my @FreeSpaceThreshold = ( ["ALERT" , 536870912 ], #(512M) ["CRITICAL" , 1073741824], #(1G) ["WARNING" , 2147483648] #(2G) ); #Threshold must be ascending series! ################################################################################ my $arg; while ($arg = shift @ARGV) { if ($arg eq "force") {$Force_Notify = 1;} } my $WMIServices; my $Namespace = "\\root\\cimv2"; my $DriveCollection; my $Drive; my $Machine = "."; #local machine my $Result; my $Status = 0; #warning counter my $i; my ($Dsec,$Dmin,$Dhour,$Dmday,$Dmon,$Dyear) = (localtime(time))[0,1,2,3,4,5]; $Dmon++; $Dyear+=1900; $WMIServices = Win32::OLE->GetObject( "winmgmts://" . $Machine . $Namespace ); if (!defined($WMIServices)) { $Result = "Critical error: WMI service connect problem\n"; $Status ++; result_out($Result); exit(1); } $DriveCollection = $WMIServices->ExecQuery("SELECT * FROM Win32_LogicalDisk WHERE DriveType=3" ); $Result .= "System Disk FS Size(Gb) Free(Gb) Usage Status\n"; foreach $Drive ( in( $DriveCollection ) ) { my $DiskUsage; if (defined($Drive->{Size}) ) { $DiskUsage = (($Drive->{Size} - $Drive->{FreeSpace}) / $Drive->{Size}) * 100; } else { $DiskUsage = 0 ; } my $Disk_status = "OK"; for ($i = 0; $i <= $#FreeSpaceThreshold; $i++) { if ($Drive->{FreeSpace} < $FreeSpaceThreshold[$i][1] ) { $Disk_status = $FreeSpaceThreshold[$i][0]; $Status ++; last; } } $Result .= sprintf ("%-11s %-6s %-7s %8.3f %8.3f %05.2f%% %-6s\n", substr ($Drive->{SystemName}, 0, 10), $Drive->{Name}, $Drive->{FileSystem}, b_to_G($Drive->{Size}), b_to_G($Drive->{FreeSpace}), $DiskUsage, $Disk_status ); } result_out($Result); exit(0); ################################################################################ sub result_out($) { my $Text = shift @_; $Text = "Date: " . sprintf ("%04d-%02d-%02d %02d:%02d:%02d", $Dyear, $Dmon, $Dmday, $Dhour, $Dmin, $Dsec) . "\n" . ($Status ? "Warnings found: ${Status}\n\n" : "Warnings not found\n\n") . $Text; if ($Force_Notify || $Status || $Out_Target eq "stdout") { if ($Out_Target eq "smtp") { mail_out($Text); } else { print $Text; } } } sub mail_out($) { my $Text = shift @_; my $Mail_Text; my $Mail_Subject = "Disk space monitor report (DO NOT REPLY)"; if ($Status) {$Mail_Subject = "!!!WARNING!!! LOW DISK SPACE (DO NOT REPLY)"; } for ($i = 0; $i <= $#Mail_To_List; $i++) { #header $Mail_Text = qq|From: ${Mail_From}\n| . qq|To: ${Mail_To_List[$i]}\n| . qq|Subject: ${Mail_Subject}\n\n|; #body $Mail_Text .= $Text; $Mail_Text .= qq|\n${_script_name} v. ${_script_version}\n|; my $SMTP = Net::SMTP->new( Host => $Mail_SMTP_server, Hello => $Mail_LocalName, Timeout => 60, Debug => 0 ); $SMTP->mail($Mail_From); $SMTP->to($Mail_To_List[$i]); $SMTP->data(); $SMTP->datasend("${Mail_Text}"); $SMTP->dataend(); $SMTP->quit; } } sub b_to_G ($) { return ((shift @_) / 1024 /1024 /1024); }

<< Предыдущая ИНДЕКС Исправить src / Печать Следующая >>

Обсуждение [ RSS ]
  • 1, CSX (ok), 10:18, 22/05/2008 [ответить]  
  • +/
    Ну это клево конечно, но зачем, если есть Nagios + NRPE ?
     
     
  • 2, Pahanivo (ok), 11:51, 26/05/2008 [^] [^^] [^^^] [ответить]  
  • +/
    Затем что надо:
    Установить ActivePerl (3 минуты)
    Установить скрипт (1 минута)
    Все. Больше ничего не надо.
    + Имеем все что доступно через WMI.
     

  • 3, НиколайМишин (?), 17:54, 09/12/2008 [ответить]  
  • +/
    Отлично, спасибо, сейчас перепишу немного, чтобы еще перезапускал нужные службы
     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру