2
0
mirror of https://github.com/xcat2/xcat-core.git synced 2025-06-16 11:20:32 +00:00

Task 3406, add BMC MAC in bmcdiscover and discovery process

This commit is contained in:
XuWei
2017-07-21 03:39:01 -04:00
parent cac418514f
commit 4d54889a36
5 changed files with 95 additions and 34 deletions

View File

@ -141,10 +141,12 @@ if [ "$UUID" != "unknown" ]; then
echo "<uuid>$UUID</uuid>" >> /tmp/discopacket
fi
if [ "$MTM" != "unknown" ]; then
flag_mtm=`echo '$MTM' | sed 's/0//g'`
if [ $flag_mtm ] && [ "$MTM" != "unknown" ]; then
echo "<mtm>$MTM</mtm>" >> /tmp/discopacket
fi
if [ "$SERIAL" != "unknown" ]; then
flag_serial=`echo '$SERIAL' | sed 's/0//g'`
if [ $flag_serial ] && [ "$SERIAL" != "unknown" ]; then
echo "<serial>$SERIAL</serial>" >> /tmp/discopacket
fi
if [ "$PLATFORM" != "unknown" ]; then
@ -159,6 +161,11 @@ if [ "$IsStatic" ]; then
fi
fi
BMCMAC=`ipmitool lan print 1 | grep 'MAC Address' | cut -d ":" -f2-7 | sed 's/ //'`
if [ "$BMCMAC" ]; then
echo "<bmcmac>$BMCMAC</bmcmac>" >> /tmp/discopacket
fi
# Check whether the hardware support in-band BMC configuration with the IPMI device
if [ -r /dev/ipmi0 -o -r /dev/ipmi/0 -o -r /dev/ipmidev/0 ]; then
echo "<bmcinband>1</bmcinband>" >> /tmp/discopacket

View File

@ -35,6 +35,7 @@ use HTTP::Response;
use JSON;
my $nmap_path;
my %ipmac = ();
my $debianflag = 0;
my $tempstring = xCAT::Utils->osver();
@ -508,43 +509,56 @@ sub scan_process {
# Handle commas in $range for nmap
$range =~ tr/,/ /;
my $ip_list;
############################################################
# get live ip list
###########################################################
if ($method eq "nmap") {
#check nmap version first
my $nmap_version = xCAT::Utils->get_nmapversion();
# the output of nmap is different for version under 5.10
if (xCAT::Utils->version_cmp($nmap_version, "5.10") < 0) {
$bcmd = join(" ", $nmap_path, " -sP -n $range | grep \"appears to be up\" |cut -d ' ' -f2 |tr -s '\n' ' ' ");
} else {
$bcmd = join(" ", $nmap_path, " -sn -n $range | grep -B1 up | grep \"Nmap scan report\" |cut -d ' ' -f5 |tr -s '\n' ' ' ");
}
$ip_list = xCAT::Utils->runcmd("$bcmd", -1);
if ($::RUNCMD_RC != 0) {
my $rsp = {};
push @{ $rsp->{data} }, "Nmap scan is failed.\n";
xCAT::MsgUtils->message("E", $rsp, $::CALLBACK);
return 2;
}
}
else
{
if ($method ne "nmap") {
my $rsp = {};
push @{ $rsp->{data} }, "The bmcdiscover method should be nmap.\n";
xCAT::MsgUtils->message("E", $rsp, $::CALLBACK);
return 2;
}
my $live_ip = split_comma_delim_str($ip_list);
#check nmap version first
my $nmap_version = xCAT::Utils->get_nmapversion();
my $ip_info_list;
# the output of nmap is different for version under 5.10
if (xCAT::Utils->version_cmp($nmap_version, "5.10") < 0) {
$bcmd = join(" ", $nmap_path, " -sP -n $range");
} else {
$bcmd = join(" ", $nmap_path, " -sn -n $range");
}
$ip_info_list = xCAT::Utils->runcmd("$bcmd", -1);
if ($::RUNCMD_RC != 0) {
my $rsp = {};
push @{ $rsp->{data} }, "Nmap scan is failed.\n";
xCAT::MsgUtils->message("E", $rsp, $::CALLBACK);
return 2;
}
my $ip_list;
my $mac_list;
if (xCAT::Utils->version_cmp($nmap_version, "5.10") < 0) {
$ip_list = `echo -e "$ip_info_list" | grep \"appears to be up\" |cut -d ' ' -f2 |tr -s '\n' ' '`;
$mac_list = `echo -e "$ip_info_list" | grep -A1 up | grep "MAC Address" | cut -d ' ' -f3 | tr -s '\n' ' '`;
} else {
$ip_list = `echo -e "$ip_info_list" | grep -B1 up | grep "Nmap scan report" |cut -d ' ' -f5 | tr -s '\n' ' '`;
$mac_list = `echo -e "$ip_info_list" | grep -A1 up | grep "MAC Address" | cut -d ' ' -f3 | tr -s '\n' ' '`;
}
my $live_ip = split_comma_delim_str($ip_list);
my $live_mac = split_comma_delim_str($mac_list);
if (scalar(@{$live_ip}) > 0) {
foreach (@{$live_ip}) {
my $new_mac = lc(shift @{$live_mac});
$new_mac =~ s/\://g;
$ipmac{$_} = $new_mac;
}
if (scalar(@{$live_ip}) > 0)
{
###############################
# Set the signal handler for ^c
###############################
@ -984,8 +998,12 @@ sub bmcdiscovery_ipmi {
}
}
if ($mtm eq '' or $serial eq '') {
xCAT::MsgUtils->message("W", { data => ["BMC Type/Model and/or Serial is unavailable for $ip"] }, $::CALLBACK);
$mtm = '' if ($mtm =~ /^0+$/);
$serial = '' if ($serial =~ /^0+$/);
unless (($mtm or $serial) or $ipmac{$ip}) {
xCAT::MsgUtils->message("W", { data => ["BMC Type/Model and/or Serial and MAC Address is unavailable for $ip"] }, $::CALLBACK);
return;
}
@ -1005,6 +1023,8 @@ sub bmcdiscovery_ipmi {
$node = "node-$mtm-$serial";
$node =~ s/(.*)/\L$1/g;
$node =~ s/[\s:\._]/-/g;
} else {
$node = "node-$ipmac{$ip}";
}
} elsif ($output =~ /error : unauthorized name/) {
xCAT::MsgUtils->message("W", { data => ["BMC username is incorrect for $ip"] }, $::CALLBACK);
@ -1093,9 +1113,6 @@ sub bmcdiscovery_openbmc{
$mtm = "";
}
$serial = $response->{data}->{SerialNumber};
} else {
xCAT::MsgUtils->message("W", { data => ["Could not obtain Model Type and/or Serial Number for BMC at $ip"] }, $::CALLBACK);
return;
}
} else {
@ -1107,6 +1124,14 @@ sub bmcdiscovery_openbmc{
$mtm =~ s/^\s+|\s+$//g;
$serial =~ s/^\s+|\s+$//g;
$mtm = '' if ($mtm =~ /^0+$/);
$serial = '' if ($serial =~ /^0+$/);
unless (($mtm or $serial) or $ipmac{$ip}) {
xCAT::MsgUtils->message("W", { data => ["Could not obtain Valid Model Type and/or Serial Number and MAC Address for BMC at $ip"] }, $::CALLBACK);
return;
}
# format info string for format_stanza function
$node_data .= ",$mtm";
$node_data .= ",$serial";
@ -1124,6 +1149,8 @@ sub bmcdiscovery_openbmc{
$node = "node-$mtm-$serial";
$node =~ s/(.*)/\L$1/g;
$node =~ s/[\s:\._]/-/g;
} else {
$node = "node-$ipmac{$ip}";
}
} else {
if ($login_response->status_line =~ /401 Unauthorized/) {

View File

@ -141,6 +141,14 @@ sub findme {
}
}
unless ($bmc_node) {
if ($request->{'bmcmac'}->[0]) {
my $bmcmac = lc($request->{'bmcmac'}->[0]);
$bmcmac =~ s/\://g;
my $tmp_node = "node-$bmcmac";
$bmc_node = $tmp_node if ($::XCATMPHASH{$tmp_node});
}
}
if ($node) {
my $skiphostip;

View File

@ -346,6 +346,15 @@ sub process_request {
}
}
unless ($bmc_node) {
if ($req->{'bmcmac'}->[0]) {
my $bmcmac = lc($req->{'bmcmac'}->[0]);
$bmcmac =~ s/\://g;
my $tmp_node = "node-$bmcmac";
$bmc_node = $tmp_node if ($::XCATMPHASH{$tmp_node});
}
}
if ($node) {
xCAT::MsgUtils->message("S", "xcat.discovery.switch: ($req->{_xcat_clientmac}->[0]) Found node: $node");

View File

@ -34,6 +34,16 @@ sub findme {
push @nodes, $_;
}
}
unless ($bmc_node) {
if ($request->{'bmcmac'}->[0]) {
my $bmcmac = lc($request->{'bmcmac'}->[0]);
$bmcmac =~ s/\://g;
my $tmp_node = "node-$bmcmac";
$bmc_node = $tmp_node if ($::XCATMPHASH{$tmp_node});
}
}
my $nodenum = $#nodes;
if ($nodenum < 0) {
xCAT::MsgUtils->message("S", "xcat.discovery.mtms: ($request->{_xcat_clientmac}->[0]) Warning: Could not find any node for $mtms using mtms-based discovery");