mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-11-03 21:02:34 +00:00 
			
		
		
		
	fix issue 4008, modify rsetboot command logic (#4017)
This commit is contained in:
		@@ -252,9 +252,17 @@ my %status_info = (
 | 
			
		||||
        process        => \&rpower_response,
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    RSETBOOT_ENABLE_REQUEST => {
 | 
			
		||||
        method         => "PUT",
 | 
			
		||||
        init_url       => "$openbmc_project_url/control/host0/boot/one_time/attr/Enabled",
 | 
			
		||||
        data           => '1',
 | 
			
		||||
    },
 | 
			
		||||
    RSETBOOT_ENABLE_RESPONSE => {
 | 
			
		||||
        process        => \&rsetboot_response,
 | 
			
		||||
    },
 | 
			
		||||
    RSETBOOT_SET_REQUEST => {
 | 
			
		||||
        method         => "PUT",
 | 
			
		||||
        init_url       => "$openbmc_project_url/control/host0/$::RSETBOOT_URL_PATH/attr/BootSource",
 | 
			
		||||
        init_url       => "$openbmc_project_url/control/host0/boot/one_time/attr/BootSource",
 | 
			
		||||
        data           => "xyz.openbmc_project.Control.Boot.Source.Sources.",
 | 
			
		||||
    },
 | 
			
		||||
    RSETBOOT_SET_RESPONSE => {
 | 
			
		||||
@@ -262,7 +270,7 @@ my %status_info = (
 | 
			
		||||
    },
 | 
			
		||||
    RSETBOOT_STATUS_REQUEST  => {
 | 
			
		||||
        method         => "GET",
 | 
			
		||||
        init_url       => "$openbmc_project_url/control/host0/$::RSETBOOT_URL_PATH",
 | 
			
		||||
        init_url       => "$openbmc_project_url/control/host0/enumerate",
 | 
			
		||||
    },
 | 
			
		||||
    RSETBOOT_STATUS_RESPONSE => {
 | 
			
		||||
        process        => \&rsetboot_response,
 | 
			
		||||
@@ -766,10 +774,10 @@ sub parse_command_status {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ($command eq "rsetboot") {
 | 
			
		||||
        if ($$subcommands[-1] and $$subcommands[-1] eq "-o") {
 | 
			
		||||
        if ($$subcommands[-1] and $$subcommands[-1] eq "-p") {
 | 
			
		||||
            pop(@$subcommands);
 | 
			
		||||
            $status_info{RSETBOOT_SET_REQUEST}{init_url} = "$openbmc_project_url/control/host0/$::RSETBOOT_URL_PATH/attr/BootSource";
 | 
			
		||||
            $status_info{RSETBOOT_STATUS_REQUEST}{init_url} = "$openbmc_project_url/control/host0/$::RSETBOOT_URL_PATH";
 | 
			
		||||
            $status_info{RSETBOOT_ENABLE_REQUEST}{data} = '0';
 | 
			
		||||
            $status_info{RSETBOOT_SET_REQUEST}{init_url} = "$openbmc_project_url/control/host0/boot/attr/BootSource";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (defined($$subcommands[0])) {
 | 
			
		||||
@@ -786,8 +794,12 @@ sub parse_command_status {
 | 
			
		||||
                $::RSETBOOT_URL_PATH = "boot_source";
 | 
			
		||||
                $status_info{RSETBOOT_SET_REQUEST}{init_url} = "$openbmc_project_url/control/host0/$::RSETBOOT_URL_PATH/attr/BootSource";
 | 
			
		||||
                $status_info{RSETBOOT_STATUS_REQUEST}{init_url} = "$openbmc_project_url/control/host0/$::RSETBOOT_URL_PATH";
 | 
			
		||||
                $next_status{LOGIN_RESPONSE} = "RSETBOOT_SET_REQUEST";
 | 
			
		||||
            } else {
 | 
			
		||||
                $next_status{LOGIN_RESPONSE} = "RSETBOOT_ENABLE_REQUEST";
 | 
			
		||||
                $next_status{RSETBOOT_ENABLE_REQUEST} = "RSETBOOT_ENABLE_RESPONSE";
 | 
			
		||||
                $next_status{RSETBOOT_ENABLE_RESPONSE} = "RSETBOOT_SET_REQUEST";
 | 
			
		||||
            }
 | 
			
		||||
            $next_status{LOGIN_RESPONSE} = "RSETBOOT_SET_REQUEST";
 | 
			
		||||
            $next_status{RSETBOOT_SET_REQUEST} = "RSETBOOT_SET_RESPONSE";
 | 
			
		||||
            if ($subcommand eq "net") {
 | 
			
		||||
                $status_info{RSETBOOT_SET_REQUEST}{data} .= "Network";
 | 
			
		||||
@@ -1112,7 +1124,7 @@ sub gen_send_request {
 | 
			
		||||
        $method = $status_info{ $node_info{$node}{cur_status} }{method};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ($status_info{ $node_info{$node}{cur_status} }{data}) {
 | 
			
		||||
    if (defined($status_info{ $node_info{$node}{cur_status} }{data})) {
 | 
			
		||||
        # Handle boolean values by create the json objects without wrapping with quotes
 | 
			
		||||
        if ($status_info{ $node_info{$node}{cur_status} }{data} =~ /^1$|^true$|^True$|^0$|^false$|^False$/) {
 | 
			
		||||
            $content = '{"data":' . $status_info{ $node_info{$node}{cur_status} }{data} . '}';
 | 
			
		||||
@@ -1572,13 +1584,29 @@ sub rsetboot_response {
 | 
			
		||||
    my $response_info = decode_json $response->content;    
 | 
			
		||||
 | 
			
		||||
    if ($node_info{$node}{cur_status} eq "RSETBOOT_STATUS_RESPONSE") {
 | 
			
		||||
        if ($response_info->{'data'}->{BootSource} =~ /Disk$/) {
 | 
			
		||||
        my $one_time_enabled;
 | 
			
		||||
        my $bootsource;
 | 
			
		||||
        if (defined($::OPENBMC_FW) && ($::OPENBMC_FW < 1738)) {
 | 
			
		||||
            $bootsource = $response_info->{'data'}->{BootSource};
 | 
			
		||||
        } else {
 | 
			
		||||
            foreach my $key_url (keys %{$response_info->{data}}) {
 | 
			
		||||
                my %content = %{ ${ $response_info->{data} }{$key_url} };
 | 
			
		||||
                if ($key_url =~ /boot\/one_time/) {
 | 
			
		||||
                    $one_time_enabled = $content{Enabled};
 | 
			
		||||
                    $bootsource = $content{BootSource} if ($one_time_enabled);
 | 
			
		||||
                } elsif ($key_url =~ /\/boot$/) {
 | 
			
		||||
                    $bootsource = $content{BootSource} unless ($one_time_enabled);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($bootsource =~ /Disk$/) {
 | 
			
		||||
            xCAT::SvrUtils::sendmsg("Hard Drive", $callback, $node);
 | 
			
		||||
        } elsif ($response_info->{'data'}->{BootSource} =~ /Network$/) {
 | 
			
		||||
        } elsif ($bootsource =~ /Network$/) {
 | 
			
		||||
            xCAT::SvrUtils::sendmsg("Network", $callback, $node);
 | 
			
		||||
        } elsif ($response_info->{'data'}->{BootSource} =~ /ExternalMedia$/) {
 | 
			
		||||
        } elsif ($bootsource =~ /ExternalMedia$/) {
 | 
			
		||||
            xCAT::SvrUtils::sendmsg("CD/DVD", $callback, $node);
 | 
			
		||||
        } elsif ($response_info->{'data'}->{BootSource} =~ /Default$/) {
 | 
			
		||||
        } elsif ($bootsource =~ /Default$/) {
 | 
			
		||||
            xCAT::SvrUtils::sendmsg("Default", $callback, $node);
 | 
			
		||||
        } else {
 | 
			
		||||
            my $error_msg = "Can not get valid rsetboot status, the data is " . $response_info->{'data'}->{BootSource};
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user