2
0
mirror of https://github.com/xcat2/xcat-core.git synced 2025-05-22 11:42:05 +00:00

fix probe bugs

This commit is contained in:
hu-weihua 2016-08-15 04:00:03 -04:00
parent 1b48a107ad
commit d7a683b200
5 changed files with 104 additions and 81 deletions

View File

@ -5,6 +5,7 @@ package probe_utils;
use strict;
use File::Path;
use File::Copy;
use Time::Local;
use Socket;
#-----------------------------------------
@ -439,4 +440,80 @@ sub get_hostname_from_ip {
return $hostname;
}
#------------------------------------------
=head3
Description:
Check if the free space of specific directory is more than expected value
Arguments:
targetdir: The directory needed to be checked
expect_free_space: the expected free space for above directory
Returns:
0: the free space of specific directory is less than expected value
1: the free space of specific directory is more than expected value
2: the specific directory isn't mounted on standalone disk. it is a part of "/"
=cut
#------------------------------------------
sub is_dir_has_enough_space{
my $targetdir=shift;
$targetdir = shift if (($targetdir) && ($targetdir =~ /probe_utils/));
my $expect_free_space = shift;
my @output = `df -k`;
foreach my $line (@output){
chomp($line);
my @line_array = split(/\s+/, $line);
if($line_array[5] =~ /^$targetdir$/){
my $left_space = $line_array[3]/1048576;
if($left_space >= $expect_free_space){
return 1;
}else{
return 0;
}
}
}
return 2;
}
#------------------------------------------
=head3
Description:
Convert input time format to the number of non-leap seconds since whatever time the system considers to be the epoch
the format of input time are two kinds
one like "Aug 15 02:43:31", another likes "15/Aug/2016:01:10:24"
Arguments:
timestr: the time format need to be converted
yday: the year of current time.
Returns:
the number of non-leap seconds since whatever time the system considers to be the epoch
=cut
#------------------------------------------
sub convert_to_epoch_seconds {
my $timestr=shift;
$timestr = shift if (($timestr) && ($timestr =~ /probe_utils/));
my $yday=shift;
my $ref_seconds=shift;
my $mday;
my $dday;
my $h;
my $m;
my $s;
my $epoch_seconds=-1;
my %monthsmap = ("Jan"=>0,"Feb"=>1,"Mar"=>2,"Apr"=>3,"May"=>4,"Jun"=>5,"Jul"=>6,"Aug"=>7,"Sep"=>8,"Oct"=>9,"Nov"=>10,"Dec"=>11);
if($timestr =~/(\w+)\s+(\d+)\s+(\d+):(\d+):(\d+)/){
($mday,$dday,$h,$m,$s)=($1,$2,$3,$4,$5);
$epoch_seconds = timelocal($s,$m,$h,$dday,$monthsmap{$mday},$yday);
if($epoch_seconds>$ref_seconds){
$yday-=1;
$epoch_seconds = timelocal($s,$m,$h,$dday,$monthsmap{$mday},$yday);
}
}elsif($timestr =~ /(\d+)\/(\w+)\/(\d+):(\d+):(\d+):(\d+)/){
$epoch_seconds = timelocal($6,$5,$4,$1,$monthsmap{$2},($3-1900));
}
return $epoch_seconds;
}
1;

View File

@ -363,68 +363,23 @@ sub do_main_job {
}
}
my $expected = 10;
$msg = "The free space of / directory is more than $expected G";
my $diskspace = `df -h|awk '{print \$4,\$6}'|grep -E "/\$"`;
if ($?) {
probe_utils->send_msg($outputtarget, "d", "There isn't any filesystem mount on / directory");
probe_utils->send_msg($outputtarget, "f", "$msg");
$rst = 1;
} else {
chomp($diskspace);
my ($size, $dir) = split(" ", $diskspace);
$size =~ s/G//g;
probe_utils->send_msg($outputtarget, "d", "The free space of / is $size G") if ($verbose);
if ($size < $expected) {
probe_utils->send_msg($outputtarget, "w", "The free space of / is less than $expected G");
} else {
probe_utils->send_msg($outputtarget, "o", "$msg");
#check the free space of specific directory
#if "/var" is mounted on standalone disk, more than 1G free space is expected
#if "/tmp" is mounted on standalone disk, more than 1G free space is expected
#if installdir is mounted on standalone disk, more than 10G free space is expected.
#if any one of above three directories hasn't standalone disk, "/" directory should cover its space requirement.
my @dir_expectedspace_list = (["/var", "1"], ["/tmp", "1"], ["$installdir", "10"], ["/" , "0"]);
foreach my $dir (@dir_expectedspace_list){
next if($dir->[0] eq "/" && $dir->[1] == 0);
my $checkrst = probe_utils->is_dir_has_enough_space($dir->[0], $dir->[1]);
if($checkrst == 2){
$dir_expectedspace_list[$#dir_expectedspace_list][1] += $dir->[1];
}elsif($checkrst == 1){
probe_utils->send_msg($outputtarget, "o", "The free space of '$dir->[0]' directory is more than $dir->[1] G");
}elsif($checkrst == 0){
probe_utils->send_msg($outputtarget, "w", "The free space of '$dir->[0]' is less than $dir->[1] G");
}
}
$expected = 1;
$msg = "The free space of /var directory is more than $expected G";
$diskspace = `df -h|awk '{print \$4,\$6}'|grep -E "/var\$"`;
if (!$?) {
chomp($diskspace);
my ($size, $dir) = split(" ", $diskspace);
$size =~ s/G//g;
probe_utils->send_msg($outputtarget, "d", "The free space of /var is $size G") if ($verbose);
if ($size < $expected) {
probe_utils->send_msg($outputtarget, "w", "The free space of /var is less than $expected G");
} else {
probe_utils->send_msg($outputtarget, "o", "$msg");
}
}
$expected = 1;
$msg = "The free space of /tmp directory is more than $expected G";
$diskspace = `df -h|awk '{print \$4,\$6}'|grep -E "/tmp\$"`;
if (!$?) {
chomp($diskspace);
my ($size, $dir) = split(" ", $diskspace);
$size =~ s/G//g;
probe_utils->send_msg($outputtarget, "d", "The free space of /tmp is $size G") if ($verbose);
if ($size < $expected) {
probe_utils->send_msg($outputtarget, "w", "The free space of /tmp is less than $expected G");
} else {
probe_utils->send_msg($outputtarget, "o", "$msg");
}
}
$expected = 10;
$msg = "The free space of $installdir directory is more than $expected G";
$diskspace = `df -h|awk '{print \$4,\$6}'|grep -E "$installdir\$"`;
if (!$?) {
chomp($diskspace);
my ($size, $dir) = split(" ", $diskspace);
$size =~ s/G//g;
probe_utils->send_msg($outputtarget, "d", "The free space of /install is $size G") if ($verbose);
if ($size < $expected) {
probe_utils->send_msg($outputtarget, "w", "The free space of /install is less than $expected G");
} else {
probe_utils->send_msg($outputtarget, "o", "$msg");
}
}
$msg = "SELinux is disabled on current server";
@ -444,8 +399,7 @@ sub do_main_job {
`which wget > /dev/null 2>&1`;
if ($?) {
probe_utils->send_msg($outputtarget, "w", "wget tool isn't installed on current server, skip checking HTTP service.");
probe_utils->send_msg($outputtarget, "d", "Please do probe again after installing wget");
probe_utils->send_msg($outputtarget, "w", "'wget' tool isn't installed, skip checking HTTP service. please install wget then try again");
} else {
$msg = "HTTP service is ready on $serverip";
if (probe_utils->is_http_ready("$serverip")) {
@ -472,8 +426,7 @@ sub do_main_job {
if ($checktftp) {
`which tftp > /dev/null 2>&1`;
if ($?) {
probe_utils->send_msg($outputtarget, "w", "tftp tool isn't installed on current server, skip checking tftp service.");
probe_utils->send_msg($outputtarget, "d", "Please do probe again after installing tftp");
probe_utils->send_msg($outputtarget, "w", "'tftp' tool isn't installed, skip checking tftp service. Please install tftp then try again");
} else {
$msg = "TFTP service is ready on $serverip";
if (probe_utils->is_tftp_ready("$serverip")) {
@ -499,14 +452,12 @@ sub do_main_job {
if ($checkdns) {
`which nslookup > /dev/null 2>&1`;
if ($?) {
probe_utils->send_msg($outputtarget, "w", "nslookup tool isn't installed in current server, skip checking DNS service.");
probe_utils->send_msg($outputtarget, "d", "Please do probe again after installing nslookup");
probe_utils->send_msg($outputtarget, "w", "'nslookup' tool isn't installed, skip checking DNS service. please install nslookup then try again");
} else {
$msg = "DNS server is ready on $serverip";
probe_utils->send_msg($outputtarget, "d", "Domain used to check DNS is $domain") if ($verbose);
my $rc = 0;
if (!$is_sn) {
# if this is a hierarchical cluster, nslookup one of sn to check DNS service
@ -517,7 +468,7 @@ sub do_main_job {
if ($sninfo =~ /(\d+).(\d+).(\d+).(\d+)/) {
my $snip = "$1.$2.$3.$4";
if (!probe_utils->is_dns_ready("$snip", "$serverip", "$sntmp", "$domain")) {
probe_utils->send_msg("$outputtarget", "d", "nslookup $sntmp $snip failed");
probe_utils->send_msg("$outputtarget", "d", "nslookup $sntmp $snip failed") if($verbose);
$rc = 1;
}
}
@ -525,17 +476,11 @@ sub do_main_job {
# if there is no sn, nslookup mnip
my $nslkp = `nslookup $serverip $serverip 2>&1`;
if ($?) {
probe_utils->send_msg($outputtarget, "d", "nslookup $serverip $serverip failed");
chomp($nslkp);
my $tmp = grep {$_ =~ "Server:[\t\s]*$serverip"} split (/\n/, $nslkp);
if (!$tmp) {
probe_utils->send_msg($outputtarget, "d", "nslookup $serverip $serverip failed") if($verbose);
$rc = 1;
} else {
chomp($nslkp);
my $tmp = grep {$_ =~ "Server:[\t\s]*$serverip"} split (/\n/, $output);
if (!$tmp) {
probe_utils->send_msg($outputtarget, "d", "nslookup $serverip $serverip failed");
$rc = 1;
}
}
}
if ($rc) {
@ -861,7 +806,7 @@ sub send_sn_msg {
if ($line =~ /^(\[\w+\]\s*):\s*(.*)/) {
print "$1:[SN:$node]: $2\n";
} else {
print "[failed] :$node: $line\n";
print "[failed] :[SN:$node]: $line\n";
}
}
}

View File

@ -31,6 +31,7 @@ Options:
-h : get usage information of $program_name
-l : list all valid sub commands
-V : print verbose information of $program_name
-w : show each line completely. by default if one is too long, the long part will be omitted.
";
#-----------------------------------

View File

@ -7,7 +7,7 @@ Standards-Version: 3.7.2
Package: xcatsn
Architecture: all
Depends: ${perl:Depends}, xcat-server, perl-xcat, xcat-client, libdbd-sqlite3-perl, libxml-parser-perl, tftpd-hpa, tftp-hpa, conserver-xcat, libnet-telnet-perl, dhcp3-server, apache2, expect, nfs-kernel-server, nmap, bind9, ipmitool-xcat (>=1.8.15-2), syslinux-xcat, xnba-undi, xcat-genesis-scripts-ppc64, xcat-genesis-scripts-amd64, elilo-xcat,libsys-virt-perl
Depends: ${perl:Depends}, xcat-server, perl-xcat, xcat-client, libdbd-sqlite3-perl, libxml-parser-perl, tftpd-hpa, tftp-hpa, conserver-xcat, libnet-telnet-perl, dhcp3-server, apache2, expect, nfs-kernel-server, nmap, bind9, ipmitool-xcat (>=1.8.15-2), syslinux-xcat, xnba-undi, xcat-genesis-scripts-ppc64, xcat-genesis-scripts-amd64, elilo-xcat,libsys-virt-perl, xcat-probe (>=2.12)
Recommends: yaboot-xcat
Description: Metapackage for a common, default xCAT service node setup
xCATsn is a service node management package intended for at-scale management, including hardware management and software management.

View File

@ -17,7 +17,7 @@ Source3: xCATSN
Source5: templates.tar.gz
Source6: xcat.conf.apach24
Provides: xCATsn = %{version}
Requires: xCAT-server xCAT-client perl-DBD-SQLite xCAT-genesis-scripts-x86_64 xCAT-genesis-scripts-ppc64
Requires: xCAT-server xCAT-client perl-DBD-SQLite xCAT-genesis-scripts-x86_64 xCAT-genesis-scripts-ppc64 xCAT-probe >= 2.12.2
Conflicts: xCAT