2
0
mirror of https://github.com/xcat2/xcat-core.git synced 2025-05-29 09:13:08 +00:00

Task 4472, Allow rspconfig to set NTP servers for OpenBMC (#4493)

* Task 4472, rspconfig ntpservers for OpenBMC
This commit is contained in:
xuweibj 2017-12-15 16:09:39 +08:00 committed by Bin Xu
parent 1b57b4cb35
commit ec4e31ce46
3 changed files with 164 additions and 45 deletions

View File

@ -366,6 +366,13 @@ my %status_info = (
RSPCONFIG_GET_RESPONSE => {
process => \&rspconfig_response,
},
RSPCONFIG_GET_NIC_REQUEST => {
method => "GET",
init_url => "$openbmc_project_url/network/enumerate",
},
RSPCONFIG_GET_NIC_RESPONSE => {
process => \&rspconfig_response,
},
RSPCONFIG_SET_PASSWD_REQUEST => {
method => "POST",
init_url => "/xyz/openbmc_project/user/root/action/SetPassword",
@ -379,6 +386,11 @@ my %status_info = (
init_url => "$openbmc_project_url/network/config/attr/HostName",
data => "[]",
},
RSPCONFIG_SET_NTPSERVERS_REQUEST => {
method => "PUT",
init_url => "$openbmc_project_url/network/#NIC#/attr/NTPServers",
data => "[]",
},
RSPCONFIG_SET_RESPONSE => {
process => \&rspconfig_response,
},
@ -1049,8 +1061,8 @@ sub parse_args {
my $key = $1;
my $value = $2;
return ([ 1, "Changing ipsrc value is currently not supported." ]) if ($key eq "ipsrc");
return ([ 1, "Unsupported command: $command $key" ]) unless ($key =~ /^ip$|^netmask$|^gateway$|^hostname$|^vlan$|^admin_passwd$/);
return ([ 1, "The option '$key' can not work with other options." ]) if ($key =~ /^hostname$|^admin_passwd$/ and $num_subcommand > 1);
return ([ 1, "Unsupported command: $command $key" ]) unless ($key =~ /^ip$|^netmask$|^gateway$|^hostname$|^vlan$|^admin_passwd$|^ntpservers$/);
return ([ 1, "The option '$key' can not work with other options." ]) if ($key =~ /^hostname$|^admin_passwd$|^ntpservers$/ and $num_subcommand > 1);
if ($key eq "admin_passwd") {
my $comma_num = $value =~ tr/,/,/;
return ([ 1, "Invalid parameter for option $key: $value" ]) if ($comma_num != 1);
@ -1060,7 +1072,7 @@ sub parse_args {
}
my $nodes_num = @$noderange;
return ([ 1, "Invalid parameter for option $key" ]) unless ($value);
return ([ 1, "Invalid parameter for option $key" ]) if (!$value and $key ne ("ntpservers"));
return ([ 1, "Invalid parameter for option $key: $value" ]) if (($key eq "netmask") and !xCAT::NetworkUtils->isIpaddr($value));
return ([ 1, "Invalid parameter for option $key: $value" ]) if (($key eq "gateway") and ($value !~ "0.0.0.0" and !xCAT::NetworkUtils->isIpaddr($value)));
if ($key eq "ip") {
@ -1078,7 +1090,7 @@ sub parse_args {
$all_subcommand .= $key . ",";
}
$setorget = "set";
} elsif ($subcommand =~ /^ip$|^netmask$|^gateway$|^hostname$|^vlan$|^ipsrc$/) {
} elsif ($subcommand =~ /^ip$|^netmask$|^gateway$|^hostname$|^vlan$|^ipsrc$|^ntpservers$/) {
return ([ 1, "Can not set and query OpenBMC information at the same time" ]) if ($setorget and $setorget eq "set");
$setorget = "get";
} elsif ($subcommand =~ /^sshcfg$/) {
@ -1470,6 +1482,19 @@ sub parse_command_status {
$status_info{RSPCONFIG_GET_RESPONSE}{argv} = "hostname";
return 0;
}
if ($subcommand =~ /^ntpservers=(.*)/) {
$next_status{LOGIN_RESPONSE} = "RSPCONFIG_GET_NIC_REQUEST";
$next_status{RSPCONFIG_GET_NIC_REQUEST} = "RSPCONFIG_GET_NIC_RESPONSE";
$next_status{RSPCONFIG_GET_NIC_RESPONSE} = "RSPCONFIG_SET_NTPSERVERS_REQUEST";
$next_status{RSPCONFIG_SET_NTPSERVERS_REQUEST} = "RSPCONFIG_SET_RESPONSE";
$next_status{RSPCONFIG_SET_RESPONSE} = "RSPCONFIG_GET_REQUEST";
$next_status{RSPCONFIG_GET_REQUEST} = "RSPCONFIG_GET_RESPONSE";
$status_info{RSPCONFIG_GET_RESPONSE}{argv} = "ntpservers";
$status_info{RSPCONFIG_SET_RESPONSE}{argv} = "NTPServers";
$status_info{RSPCONFIG_SET_NTPSERVERS_REQUEST}{data} = "[\"$1\"]";
return 0;
}
}
$subcommand = $$subcommands[0];
@ -1539,7 +1564,7 @@ sub parse_command_status {
my $type = "obj";
my %tmp_hash = ();
foreach $subcommand (@$subcommands) {
if ($subcommand =~ /^ip$|^netmask$|^gateway$|^hostname$|^vlan$|^ipsrc$/) {
if ($subcommand =~ /^ip$|^netmask$|^gateway$|^hostname$|^vlan$|^ipsrc$|^ntpservers$/) {
$type = "get";
push @options, $subcommand;
} elsif ($subcommand =~ /^(\w+)=(.+)/) {
@ -2900,11 +2925,11 @@ sub rspconfig_response {
my $response_info;
$response_info = decode_json $response->content if ($response);
if ($node_info{$node}{cur_status} eq "RSPCONFIG_GET_RESPONSE") {
if ($node_info{$node}{cur_status} eq "RSPCONFIG_GET_RESPONSE" or $node_info{$node}{cur_status} eq "RSPCONFIG_GET_NIC_RESPONSE") {
my $hostname = "";
my $default_gateway = "n/a";
my %nicinfo = ();
my $error;
my $multiple_error = "";
my @output;
my $grep_string = $status_info{RSPCONFIG_GET_RESPONSE}{argv};
foreach my $key_url (keys %{$response_info->{data}}) {
@ -2935,79 +2960,99 @@ sub rspconfig_response {
my $nic = $path;
$nic =~ s/(.*\/)//g;
unless (defined($nicinfo{$nic}{address})) {
$nicinfo{$nic}{address} = "n/a";
$nicinfo{$nic}{gateway} = "n/a";
$nicinfo{$nic}{ipsrc} = "n/a";
$nicinfo{$nic}{netmask} = "n/a";
$nicinfo{$nic}{prefix} = "n/a";
$nicinfo{$nic}{address} = ();
$nicinfo{$nic}{gateway} = ();
$nicinfo{$nic}{ipsrc} = ();
$nicinfo{$nic}{netmask} = ();
$nicinfo{$nic}{prefix} = ();
$nicinfo{$nic}{vlan} = "Disable";
}
if (defined($content{Address}) and $content{Address}) {
unless ($nicinfo{$nic}{address} =~ /n\/a/) {
# We have already processed an entry with adapter information.
# This must be a second entry. Display an error. Currently only supporting
# an adapter with a single IP address set.
$error = "Interfaces with multiple IP addresses are not supported";
$node_info{$node}{cur_status} = "";
# Terminate loop on this error unless we are looking for hostname to display
last unless ($grep_string =~ /(.*)hostname(.*)/);
if ($content{Address} eq $node_info{$node}{bmcip} and $node_info{$node}{cur_status} eq "RSPCONFIG_GET_NIC_RESPONSE") {
$status_info{RSPCONFIG_SET_NTPSERVERS_REQUEST}{init_url} =~ s/#NIC#/$nic/g;
if ($next_status{"RSPCONFIG_GET_NIC_RESPONSE"}) {
$node_info{$node}{cur_status} = $next_status{"RSPCONFIG_GET_NIC_RESPONSE"};
gen_send_request($node);
return;
}
}
$nicinfo{$nic}{address} = $content{Address};
if ($nicinfo{$nic}{address}) {
$multiple_error = "Interfaces with multiple IP addresses are not supported";
}
push @{ $nicinfo{$nic}{address} }, $content{Address};
}
if (defined($content{Gateway}) and $content{Gateway}) {
$nicinfo{$nic}{gateway} = $content{Gateway};
push @{ $nicinfo{$nic}{gateway} }, $content{Gateway};
}
if (defined($content{PrefixLength}) and $content{PrefixLength}) {
$nicinfo{$nic}{prefix} = $content{PrefixLength};
push @{ $nicinfo{$nic}{prefix} }, $content{PrefixLength};
}
if (defined($content{Origin})) {
$nicinfo{$nic}{ipsrc} = $content{Origin};
$nicinfo{$nic}{ipsrc} =~ s/^.*\.(\w+)/$1/;
my $ipsrc_tmp = $content{Origin};
$ipsrc_tmp =~ s/^.*\.(\w+)/$1/;
push @{ $nicinfo{$nic}{ipsrc} }, $ipsrc_tmp;
}
if (defined($response_info->{data}->{$path}->{Id})) {
$nicinfo{$nic}{vlan} = $response_info->{data}->{$path}->{Id};
}
if (defined($response_info->{data}->{$path}->{NTPServers})) {
$nicinfo{$nic}{ntpservers} = join(",", @{ $response_info->{data}->{$path}->{NTPServers} });
}
}
}
if ($grep_string =~ /(.*)hostname(.*)/) {
xCAT::SvrUtils::sendmsg("BMC hostname: $hostname", $callback, $node);
unless ($1 or $2) {
$wait_node_num--;
return;
}
}
if (scalar (keys %nicinfo) == 0) {
$error = "No valid BMC network information";
my $error = "No valid BMC network information";
xCAT::SvrUtils::sendmsg([1, "$error"], $callback, $node);
$node_info{$node}{cur_status} = "";
}
if ($error) {
xCAT::SvrUtils::sendmsg([1,"$error"], $callback, $node);
} else {
my @address = ();
my @ipsrc = ();
my @netmask = ();
my @gateway = ();
my @vlan = ();
my @ntpservers = ();
my @nics = keys %nicinfo;
foreach my $nic (@nics) {
my $addon_info = '';
if ($#nics > 1) {
$addon_info = " for $nic";
}
push @address, "BMC IP$addon_info: $nicinfo{$nic}{address}";
push @ipsrc, "BMC IP Source$addon_info: $nicinfo{$nic}{ipsrc}";
if ($nicinfo{$nic}{ntpservers}) {
push @ntpservers, "BMC NTP Servers$addon_info: $nicinfo{$nic}{ntpservers}";
} else {
push @ntpservers, "BMC NTP Servers$addon_info: None";
}
next if ($multiple_error);
push @address, "BMC IP$addon_info: ${ $nicinfo{$nic}{address} }[0]";
push @ipsrc, "BMC IP Source$addon_info: ${ $nicinfo{$nic}{ipsrc} }[0]";
if ($nicinfo{$nic}{address}) {
my $mask_shift = 32 - $nicinfo{$nic}{prefix};
my $decimal_mask = (2 ** $nicinfo{$nic}{prefix} - 1) << $mask_shift;
my $mask_shift = 32 - ${ $nicinfo{$nic}{prefix} }[0];
my $decimal_mask = (2 ** ${ $nicinfo{$nic}{prefix} }[0] - 1) << $mask_shift;
push @netmask, "BMC Netmask$addon_info: " . join('.', unpack("C4", pack("N", $decimal_mask)));
}
push @gateway, "BMC Gateway$addon_info: $nicinfo{$nic}{gateway} (default: $default_gateway)";
push @gateway, "BMC Gateway$addon_info: ${ $nicinfo{$nic}{gateway} }[0] (default: $default_gateway)";
push @vlan, "BMC VLAN ID$addon_info: $nicinfo{$nic}{vlan}";
}
my $mul_out = 0;
foreach my $opt (split /,/,$grep_string) {
if ($opt eq "hostname") {
push @output, "BMC Hostname: $hostname";
} elsif ($opt eq "ntpservers") {
push @output, @ntpservers;
}
if ($multiple_error and ($opt =~ /^ip$|^ipsrc$|^netmask$|^gateway$|^vlan$/)) {
$mul_out = 1;
next;
}
if ($opt eq "ip") {
push @output, @address;
} elsif ($opt eq "ipsrc") {
@ -3020,7 +3065,13 @@ sub rspconfig_response {
push @output, @vlan;
}
}
xCAT::SvrUtils::sendmsg("$_", $callback, $node) foreach (@output);
if ($multiple_error and $mul_out) {
xCAT::SvrUtils::sendmsg([1, "$multiple_error"], $callback, $node);
$wait_node_num--;
return;
}
if ($grep_string eq "all") {
# If all current values equal the input, just print out message
@ -3033,9 +3084,9 @@ sub rspconfig_response {
my ($check_ip,$check_netmask,$check_gateway) = @checks;
my $the_nic_to_config = undef;
foreach my $nic (@nics) {
my $address = $nicinfo{$nic}{address};
my $prefix = $nicinfo{$nic}{prefix};
my $gateway = $nicinfo{$nic}{gateway};
my $address = ${ $nicinfo{$nic}{address} }[0];
my $prefix = ${ $nicinfo{$nic}{prefix} }[0];
my $gateway = ${ $nicinfo{$nic}{gateway} }[0];
if ($check_ip eq $address and $check_netmask eq $prefix and $check_gateway eq $gateway) {
if (($check_vlan and $check_vlan eq $nicinfo{$nic}{vlan}) or !$check_vlan) {
$next_status{ $node_info{$node}{cur_status} } = "RSPCONFIG_PRINT_BMCINFO";

View File

@ -41,6 +41,21 @@ check:rc==0
check:output=~__GETNODEATTR($$CN,hcp)__: \w+
end
start:rspconfig_list_ntpservers
description: rspconfig list ntpservers info
Attribute: $$CN-The operation object of rspconfig command
cmd:rspconfig $$CN ntpservers
check:rc==0
check:output=~$$CN: BMC NTP Servers
end
start:rspconfig_set_ntpservers
description: rspconfig set ntpservers
Attribute: $$CN-The operation object of rspconfig command
cmd:/opt/xcat/share/xcat/tools/autotest/testcase/rspconfig/rspconfig_ntp.sh $$CN $$MN
check:rc==0
end
start:rspconfig_set_ip
description:rspconfig change openbmc ip
Attribute: $$CN-The operation object of rspconfig command

View File

@ -0,0 +1,53 @@
#!/bin/bash
cn=$1
mn=$2
ntpservers=`rspconfig $cn ntpservers | awk -F":" '{print $3}' | sed 's/^ //;s/ $//'`
if [ $? -ne 0 ]; then
echo "rspconfig $cn ntpservers failed"
exit 1
fi
echo "The original BMC NTP Servers is $ntpservers"
if [ $ntpservers != "None" ]; then
new_ntpservers=$ntpservers"_test"
else
new_ntpservers=$mn
fi
output=`rspconfig $cn ntpservers=$new_ntpservers`
if [ $? -ne 0 ]; then
echo "rspconfig $cn ntpservers=$new_ntpservers failed"
exit 1
fi
if [[ $output =~ "$cn: BMC NTP Servers" ]] && [[ $output =~ "$new_ntpservers" ]]; then
echo "Setting NTPServers as $new_ntpservers success"
else
echo "Setting NTPServers as $new_ntpservers failed, the output is $output"
exit 1
fi
echo "To clear environment"
if [ $ntpservers != "None" ]; then
original_ntpservers="$ntpservers"
else
original_ntpservers=""
fi
output=`rspconfig $cn ntpservers=$original_ntpservers`
if [ $? -ne 0 ]; then
echo "rspconfig $cn ntpservers=$ntpservers failed when clearing environment"
exit 1
fi
if [[ "$output" =~ "$cn: BMC NTP Servers" ]] && [[ $output =~ "$ntpservers" ]]; then
echo "Setting NTPServers as $ntpservers success when clearing environment"
exit 0
fi
echo "Setting NTPServers as $ntpservers failed when clearing environment"
exit 1