diff --git a/xCAT-server/lib/perl/xCAT/Goconserver.pm b/xCAT-server/lib/perl/xCAT/Goconserver.pm index b6a55a390..835ee4e3e 100644 --- a/xCAT-server/lib/perl/xCAT/Goconserver.pm +++ b/xCAT-server/lib/perl/xCAT/Goconserver.pm @@ -10,6 +10,7 @@ BEGIN use lib "$::XCATROOT/lib/perl"; use strict; use warnings "all"; +use File::Copy qw(move); use HTTP::Request; use HTTP::Headers; @@ -22,6 +23,7 @@ my $go_api_port = 12429; my $go_cons_port = 12430; use constant CONSOLE_LOG_DIR => "/var/log/consoles"; +use constant PRINT_FORMAT => "%-32s %-32s %-64s"; unless (-d CONSOLE_LOG_DIR) { mkpath(CONSOLE_LOG_DIR, 0, 0755); } @@ -115,6 +117,46 @@ sub create_nodes { return $ret; } +sub list_nodes { + my ($api_url, $node_map, $callback) = @_; + my $url = "$api_url/nodes"; + my $rsp; + my $response = http_request("GET", $url); + if (!defined($response)) { + $rsp->{data}->[0] = "Failed to send list request."; + xCAT::MsgUtils->message("E", $rsp, $callback); + return 1; + } + if (!$response->{nodes}) { + $rsp->{data}->[0] = "Could not find any node."; + xCAT::MsgUtils->message("I", $rsp, $callback); + return 0; + } + $rsp->{data}->[0] = sprintf("\n".PRINT_FORMAT, "NODE", "SERVER", "STATE"); + xCAT::MsgUtils->message("I", $rsp, $::callback); + foreach my $node (sort {$a->{name} cmp $b->{name}} @{$response->{nodes}}) { + if (!$node_map->{$node->{name}}) { + next; + } + $node_map->{$node->{name}}->{vis} = 1; + if (!$node->{host} || !$node->{state}) { + $rsp->{data}->[0] = sprintf(PRINT_FORMAT, $node->{name}, "", "Unable to parse the response message"); + xCAT::MsgUtils->message("E", $rsp, $callback); + next; + } + $rsp->{data}->[0] = sprintf(PRINT_FORMAT, $node->{name}, $node->{host}, $node->{state}); + xCAT::MsgUtils->message("I", $rsp, $::callback); + } + my %node_hash = %{$node_map}; + for my $node (sort keys %node_hash) { + if(!$node_hash{$node}->{vis}) { + $rsp->{data}->[0] = sprintf(PRINT_FORMAT, $node, "", "unregistered"); + xCAT::MsgUtils->message("I", $rsp, $callback); + } + } + return 0; +} + #------------------------------------------------------------------------------- =head3 is_xcat_conf_ready @@ -218,6 +260,8 @@ sub is_conserver_running { #------------------------------------------------------------------------------- sub build_conf { + # try to backup the original configuration file, no matter sunccess or not + move('/etc/goconserver/server.conf', '/etc/goconserver/server.conf.bak'); my $config = "#generated by xcat ".xCAT::Utils->Version()."\n". "global:\n". " host: 0.0.0.0\n". @@ -231,6 +275,8 @@ sub build_conf { " datadir: /var/lib/goconserver/ # the data file to save the hosts\n". " port: $go_cons_port # the port for console\n". " log_timestamp: true # log the timestamp at the beginning of line\n". + " # time precison for tcp or udp logger, precison for file logger is always second\n". + " time_precision: microsecond # Valid options: second, millisecond, microsecond, nanosecond\n". " reconnect_interval: 10 # retry interval in second if console could not be connected\n". " logger: # multiple logger targets could be specified\n". " file: # file logger, valid fields: name,logdir. Accept array in yaml format\n". diff --git a/xCAT-server/lib/xcat/plugins/goconserver.pm b/xCAT-server/lib/xcat/plugins/goconserver.pm index 2cc470b2e..7fb243168 100644 --- a/xCAT-server/lib/xcat/plugins/goconserver.pm +++ b/xCAT-server/lib/xcat/plugins/goconserver.pm @@ -19,8 +19,9 @@ my $isSN; my $host; my $bmc_cons_port = "2200"; my $usage_string =" makegocons [-V|--verbose] [-d|--delete] noderange - -h|--help Display this usage statement. - -v|--version Display the version number."; + -h|--help Display this usage statement. + -v|--version Display the version number. + -q|--query [noderange] Display the console connection status."; my $version_string = xCAT::Utils->Version(); @@ -86,13 +87,17 @@ sub preprocess_request { my $hmcache = $hmtab->getNodesAttribs($noderange, [ 'node', 'serialport', 'cons', 'conserver' ]); foreach my $node (@$noderange) { my $ent = $hmcache->{$node}->[0]; #$hmtab->getNodeAttribs($node,['node', 'serialport','cons', 'conserver']); - push @items, $ent; + if ($ent) { + push (@items, $ent); + } else { + my $rsp->{data}->[0] = $node .": ignore, cons attribute or serialport attribute is not specified."; + xCAT::MsgUtils->message("I", $rsp, $::callback); + } } } else { $allnodes = 1; @items = $hmtab->getAllNodeAttribs([ 'node', 'serialport', 'cons', 'conserver' ]); } - my @nodes = (); foreach (@items) { if (((!defined($_->{cons})) || ($_->{cons} eq "")) and !defined($_->{serialport})) { @@ -314,8 +319,9 @@ sub makegocons { } @ARGV = @exargs; $Getopt::Long::ignorecase = 0; - my $delmode; + my ($delmode, $querymode); GetOptions('d|delete' => \$delmode, + 'q|query' => \$querymode, ); my $svboot = 0; @@ -329,6 +335,11 @@ sub makegocons { xCAT::SvrUtils::sendmsg([ 1, "Could not get any console request entry" ], $::callback); return 1; } + my $api_url = "https://$host:". xCAT::Goconserver::get_api_port(); + if ($querymode) { + return xCAT::Goconserver::list_nodes($api_url, \%cons_map, $::callback) + } + my $ret = start_goconserver(); if ($ret != 0) { return 1; @@ -351,7 +362,6 @@ sub makegocons { xCAT::SvrUtils::sendmsg([ 1, "Could not generate the request data" ], $::callback); return 1; } - my $api_url = "https://$host:". xCAT::Goconserver::get_api_port(); $ret = xCAT::Goconserver::delete_nodes($api_url, $data, $delmode, $::callback); if ($delmode) { return $ret;