Ключевые слова: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);
}