mirror of
https://github.com/xcat2/xcat-core.git
synced 2025-05-30 01:26:38 +00:00
Discovery static check, check whether genesis files ready
This commit is contained in:
parent
1228478803
commit
6e2818ae6d
275
xCAT-probe/subcmds/discovery
Executable file
275
xCAT-probe/subcmds/discovery
Executable file
@ -0,0 +1,275 @@
|
||||
#! /usr/bin/perl
|
||||
# IBM(c) 2016 EPL license http://www.eclipse.org/legal/epl-v10.html
|
||||
|
||||
BEGIN { $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : -d '/opt/xcat' ? '/opt/xcat' : '/usr'; }
|
||||
|
||||
use lib "$::XCATROOT/probe/lib/perl";
|
||||
use probe_utils;
|
||||
use File::Basename;
|
||||
use Getopt::Long qw(:config no_ignore_case);
|
||||
|
||||
my $program_name = basename("$0");
|
||||
my $help;
|
||||
my $test;
|
||||
my $output = "stdout";
|
||||
my $verbose = 0;
|
||||
my $rst = 0;
|
||||
|
||||
$::USAGE = "Usage:
|
||||
$program_name -h
|
||||
$program_name -t
|
||||
$program_name [-V]
|
||||
$program_name -s
|
||||
|
||||
Description:
|
||||
Check discovery files or process.
|
||||
|
||||
Options:
|
||||
-h : Get usage information of $program_name
|
||||
-t : To verify if $program_name can work, reserve option for probe framework
|
||||
-V : Output more information for debug
|
||||
-s : Discovery static check, check whether genesis files are ready
|
||||
";
|
||||
|
||||
sub check_genesis_file {
|
||||
my $arch = shift;
|
||||
if (($arch ne "ppc64") and ($arch ne "x86_64")) {
|
||||
probe_utils->send_msg("$output", "f", "Please input correct arch type");
|
||||
return 1;
|
||||
}
|
||||
|
||||
my $rst_f = 0;
|
||||
probe_utils->send_msg("$output", "d", "Start to check genesis files for $arch...") if ($verbose);
|
||||
|
||||
my $os = probe_utils->get_os();
|
||||
my $genesis_base;
|
||||
my $genesis_scripts;
|
||||
|
||||
if ($arch eq "x86_64") {
|
||||
$arch_tmp = "amd64";
|
||||
} else {
|
||||
$arch_tmp = $arch;
|
||||
}
|
||||
|
||||
if ($os =~ "unknown") {
|
||||
probe_utils->send_msg("$output", "d", "The OS is not supported.") if ($verbose);
|
||||
return 1;
|
||||
} elsif ($os =~ "ubuntu") {
|
||||
$genesis_base = `dpkg -l | grep -i "xcat-genesis-base" | grep -i "$arch_tmp"`;
|
||||
$genesis_scripts = `dpkg -l | grep -i "xcat-genesis-scripts" | grep -i "$arch_tmp"`;
|
||||
} else {
|
||||
$genesis_base = `rpm -qa | grep -i "xcat-genesis-base" | grep -i "$arch"`;
|
||||
$genesis_scripts = `rpm -qa | grep -i "xcat-genesis-scripts" | grep -i "$arch"`;
|
||||
}
|
||||
unless ($genesis_base and $genesis_scripts) {
|
||||
probe_utils->send_msg("$output", "d", "xCAT-genesis for $arch did not be installed.") if ($verbose);
|
||||
return 1;
|
||||
}
|
||||
|
||||
probe_utils->send_msg("$output", "d", "xCAT-genesis for $arch installed, start to check files...") if ($verbose);
|
||||
|
||||
my $tftpdir = `tabdump site | grep "tftpdir" | awk -F "," '{print \$2}'`;
|
||||
chomp($tftpdir);
|
||||
$tftpdir =~ s/"//g;
|
||||
my $genesis_folder;
|
||||
my @genesis_files;
|
||||
my $genesis_line;
|
||||
my $wget_rst;
|
||||
|
||||
if ($arch eq "ppc64") {
|
||||
$genesis_folder = "$tftpdir/pxelinux.cfg/p";
|
||||
unless (-d "$genesis_folder") {
|
||||
probe_utils->send_msg("$output", "d", "There is no genesis file for $arch. Please run 'mknb ppc64' if you use ppc64/ppc64le machine.") if ($verbose);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@genesis_files = glob("$genesis_folder/*");
|
||||
|
||||
foreach (@genesis_files) {
|
||||
unless (open(FILE, $_)) {
|
||||
probe_utils->send_msg("$output", "d", "Cannot open file $_.") if ($verbose);
|
||||
$rst_f = 1;
|
||||
next;
|
||||
}
|
||||
|
||||
while ($genesis_line = <FILE>) {
|
||||
chomp($genesis_line);
|
||||
$genesis_line =~ s/^\s+|\s+$//g;
|
||||
|
||||
if ($genesis_line =~ /^initrd/) {
|
||||
@initrd_info = split(' ', $genesis_line);
|
||||
$initrd_path = $initrd_info[1];
|
||||
$wget_rst = system("wget -q --spider $initrd_path -T 0.5 -t 3");
|
||||
if ($wget_rst) {
|
||||
probe_utils->send_msg("$output", "d", "initrd cannot be downloaded from $initrd_path.") if ($verbose);
|
||||
$rst_f = 1;
|
||||
} else {
|
||||
probe_utils->send_msg("$output", "d", "Check initrd file: $initrd_path PASS.") if ($verbose);
|
||||
}
|
||||
}
|
||||
|
||||
if ($genesis_line =~ /^kernel/) {
|
||||
@kernel_info = split(' ', $genesis_line);
|
||||
$kernel_path = $kernel_info[1];
|
||||
$wget_rst = system("wget -q --spider $kernel_path -T 0.5 -t 3");
|
||||
if ($wget_rst) {
|
||||
probe_utils->send_msg("$output", "d", "kernel cannot be downloaded from $kernel_path.") if ($verbose);
|
||||
$rst_f = 1;
|
||||
} else {
|
||||
probe_utils->send_msg("$output", "d", "Check kernel file: $kernel_path PASS.") if ($verbose);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$genesis_folder = "$tftpdir/xcat/xnba/nets";
|
||||
unless (-d "$genesis_folder") {
|
||||
probe_utils->send_msg("$output", "d", "There is no genesis file for $arch. Please run 'mknb x86_64' if you use x86_64 machine.") if ($verbose);
|
||||
return 1;
|
||||
}
|
||||
|
||||
my @host_ip_arr = `ifconfig -a |awk -F" " '/inet / {gsub(/\w+:/,"",\$2);print \$2}'`;
|
||||
my @netmask_arr = `ifconfig -a |awk -F" " '/inet / {gsub(/\w+:/,"",\$4);print \$4}'`;
|
||||
|
||||
@genesis_files = glob("$genesis_folder/*");
|
||||
foreach (@genesis_files) {
|
||||
if ($_ =~ /uefi$/) {
|
||||
my $file_name = basename($_);
|
||||
my @tmp_ip = split('_', $file_name);
|
||||
my $ip_range = shift(@tmp_ip);
|
||||
my $host_ip;
|
||||
my $netmask_num = 0;
|
||||
foreach (@host_ip_arr) {
|
||||
chomp($_);
|
||||
if (probe_utils->is_ip_belong_to_net($ip_range, $netmask_arr[$netmask_num], $_)) {
|
||||
$host_ip = $_;
|
||||
}
|
||||
$netmask_num++;
|
||||
}
|
||||
|
||||
unless ($host_ip) {
|
||||
probe_utils->send_msg("$output", "d", "There is no ip for range $ip_range") if ($verbose);
|
||||
$rst_f = 1;
|
||||
next;
|
||||
}
|
||||
|
||||
unless (open(FILE, $_)) {
|
||||
probe_utils->send_msg("$output", "d", "Can not open file $_.");
|
||||
$rst_f = 1;
|
||||
next;
|
||||
}
|
||||
|
||||
$host_ip .= ":80";
|
||||
while ($genesis_line = <FILE>) {
|
||||
chomp($genesis_line);
|
||||
$genesis_line =~ s/^\s+|\s+$//g;
|
||||
if ($genesis_line =~ /^chain/) {
|
||||
my @file_path = split(' ', $genesis_line);
|
||||
my $elilo_efi = $file_path[1];
|
||||
my $elilo_path = $file_path[3];
|
||||
$elilo_efi =~ s/\${next-server}/$host_ip/i;
|
||||
|
||||
$wget_rst = system("wget -q --spider $elilo_efi -T 0.5 -t 3");
|
||||
if ($wget_rst) {
|
||||
probe_utils->send_msg("$output", "d", "elilo-x64.efi cannot be downloaded from $elilo_efi.") if ($verbose);
|
||||
$rst_f = 1;
|
||||
} else {
|
||||
probe_utils->send_msg("$output", "d", "Check elilo-x64.efi file: $elilo_efi PASS.") if ($verbose);
|
||||
}
|
||||
|
||||
my $elilo_http = "http://$host_ip/$elilo_path";
|
||||
$wget_rst = system("wget -q --spider $elilo_http -T 0.5 -t 3");
|
||||
if ($wget_rst) {
|
||||
probe_utils->send_msg("$output", "d", "elilo file cannot be downloaded from $elilo_http.") if ($verbose);
|
||||
$rst_f = 1;
|
||||
} else {
|
||||
probe_utils->send_msg("$output", "d", "Check elilo file: $elilo_http PASS.") if ($verbose);
|
||||
unless (open(FILE_ELILO, $elilo_path)) {
|
||||
probe_utils->send_msg("$output", "d", "Can not open file $_.") if ($verbose);
|
||||
$rst_f = 1;
|
||||
next;
|
||||
}
|
||||
|
||||
while ($line_elilo = <FILE_ELILO>) {
|
||||
chomp($line_elilo);
|
||||
$line_elilo =~ s/^\s+|\s+$//g;
|
||||
if ($line_elilo =~ /^image/) {
|
||||
my @image_info = split('=', $line_elilo);
|
||||
my $image_path = pop(@image_info);
|
||||
my $image_http = "http://$host_ip/$image_path";
|
||||
|
||||
$wget_rst = system("wget -q --spider $image_http -T 0.5 -t 3");
|
||||
if ($wget_rst) {
|
||||
probe_utils->send_msg("$output", "d", "image cannot be downloaded from $image_http.") if ($verbose);
|
||||
$rst_f = 1;
|
||||
} else {
|
||||
probe_utils->send_msg("$output", "d", "Check image file: $image_http PASS.") if ($verbose);
|
||||
}
|
||||
}
|
||||
if ($line_elilo =~ /^initrd/) {
|
||||
my @initrd_info = split('=', $line_elilo);
|
||||
my $initrd_path = pop(@initrd_info);
|
||||
my $initrd_http = "http://$host_ip/$initrd_path";
|
||||
|
||||
$wget_rst = system("wget -q --spider $initrd_http -T 0.5 -t 3");
|
||||
if ($wget_rst) {
|
||||
probe_utils->send_msg("$output", "d", "initrd cannot be downloaded from $initrd_http.") if ($verbose);
|
||||
$rst_f = 1;
|
||||
} else {
|
||||
probe_utils->send_msg("$output", "d", "Check initrd file: $initrd_http PASS.") if ($verbose);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return $rst_f;
|
||||
}
|
||||
|
||||
#-------------------------------------
|
||||
# main process
|
||||
#-------------------------------------
|
||||
if (
|
||||
!GetOptions("--help|h|?" => \$help,
|
||||
"t" => \$test,
|
||||
"V" => \$verbose,
|
||||
"s" => \$static))
|
||||
{
|
||||
probe_utils->send_msg("$output", "f", "Invalid parameter for $program_name");
|
||||
probe_utils->send_msg("$output", "d", "$::USAGE");
|
||||
exit 1;
|
||||
}
|
||||
|
||||
if ($help) {
|
||||
if ($output ne "stdout") {
|
||||
probe_utils->send_msg("$output", "d", "$::USAGE");
|
||||
} else {
|
||||
print "$::USAGE";
|
||||
}
|
||||
exit 0;
|
||||
}
|
||||
|
||||
if ($test) {
|
||||
probe_utils->send_msg("$output", "o", "Discovery Check.");
|
||||
exit 0;
|
||||
}
|
||||
|
||||
if ($static) {
|
||||
$rst = check_genesis_file("ppc64");
|
||||
if ($rst) {
|
||||
probe_utils->send_msg("$output", "f", "Genesis files for ppc64/ppc64le failed.");
|
||||
} else {
|
||||
probe_utils->send_msg("$output", "o", "Genesis files for ppc64/ppc64le success.");
|
||||
}
|
||||
$rst = check_genesis_file("x86_64");
|
||||
if ($rst) {
|
||||
probe_utils->send_msg("$output", "f", "Genesis files for x86_64 failed.");
|
||||
} else {
|
||||
probe_utils->send_msg("$output", "o", "Genesis files for x86_64 success.");
|
||||
}
|
||||
}
|
||||
|
||||
exit $rst;
|
Loading…
x
Reference in New Issue
Block a user