2
0
mirror of https://github.com/xcat2/xcat-core.git synced 2025-05-30 17:46:38 +00:00

Merge pull request #3694 from immarvin/ondiscovery

fix issue xCAT install failed on sles11.4 & rhels6.9 in automation #3693;move send_tcp_msg from Utils.pm to NetworkUtils.pm
This commit is contained in:
zet809 2017-08-17 16:43:55 +08:00 committed by GitHub
commit fc07c02e74
4 changed files with 54 additions and 65 deletions

View File

@ -2778,4 +2778,35 @@ sub gen_net_boot_params
return $net_params;
}
#--------------------------------------------------------------------------------
=head3 send_tcp_msg
establish a tcp socket to the specified IP address and port, then send the specifid message via the socket
Arguments:
$destip : the destination IP address
$destport: the destination TCP port
$msg : the message to send
Returns:
0 on success, 1 on fail
=cut
#--------------------------------------------------------------------------------
sub send_tcp_msg {
my $self=shift;
my $destip=shift;
my $destport=shift;
my $msg=shift;
my $sock = new IO::Socket::INET(
PeerAddr => $destip,
PeerPort => $destport,
Timeout => '1',
Proto => 'tcp'
);
if ($sock) {
print $sock $msg;
close($sock);
return 0;
}else{
return 1;
}
}
1;

View File

@ -4903,39 +4903,5 @@ sub acquire_lock_imageop {
return (0,$lock);
}
#--------------------------------------------------------------------------------
=head3 send_tcp_msg
establish a tcp socket to the specified IP address and port, then send the specifid message via the socket
Arguments:
$destip : the destination IP address
$destport: the destination TCP port
$msg : the message to send
Returns:
0 on success, 1 on fail
=cut
#--------------------------------------------------------------------------------
sub send_tcp_msg {
my $self=shift;
my $destip=shift;
my $destport=shift;
my $msg=shift;
my $sock = new IO::Socket::INET(
PeerAddr => $destip,
PeerPort => $destport,
Timeout => '1',
Proto => 'tcp'
);
if ($sock) {
print $sock $msg;
close($sock);
return 0;
}else{
return 1;
}
}
1;

View File

@ -7,7 +7,7 @@ BEGIN
$::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat';
}
use lib "$::XCATROOT/lib/perl";
use xCAT::Utils;
use xCAT::NetworkUtils;
sub handled_commands {
@ -32,7 +32,7 @@ sub process_request {
my $client_ip = $req->{'_xcat_clientip'};
xCAT::MsgUtils->message("S","xcat.discovery.zzzdiscovery: Notify $client_ip that its findme request has been processed");
#notify the client that its request is been processing
my $ret=xCAT::Utils->send_tcp_msg($client_ip,3001,"processed");
my $ret=xCAT::NetworkUtils->send_tcp_msg($client_ip,3001,"processed");
if($ret){
xCAT::MsgUtils->message("S", "xcat.discovery.zzzdiscovery: Failed to notify $client_ip that its findme request has been processed");
}

View File

@ -636,25 +636,9 @@ sub do_discovery_process {
$vintage = time();
} # site table reread every 15 second
my $data;
my $client;
my $clientn;
my $clientip;
if (ref $msg eq 'HASH') { $data = $msg->{data}; } else { die "incorrect code to disco"; }
my $saddr = $msg->{sockaddr};
if ($inet6support) {
($client, $sport) = Socket6::getnameinfo($saddr);
($clientip, $sport) = Socket6::getnameinfo($saddr, Socket6::NI_NUMERICHOST());
if ($clientip =~ /::ffff:.*\..*\./) {
$clientip =~ s/^::ffff://;
}
if ($client =~ /::ffff:.*\..*\./) {
$client =~ s/^::ffff://;
}
} else {
($sport, $clientn) = sockaddr_in($saddr);
$clientip = inet_ntoa($clientn);
$client = gethostbyaddr($clientn, AF_INET);
}
my $clientip = $msg->{sockaddr};
$sport=$msg->{sport};
if ($data =~ /^\037\213/) { # per rfc 1952, these two bytes are gzip, and they are invalid for
# xcatrequest xml, so go ahead and decompress it
my $bigdata;
@ -663,12 +647,10 @@ sub do_discovery_process {
}
my $req = eval { XMLin($data, SuppressEmpty => undef, ForceArray => 1) };
if ($req and $req->{command} and ($req->{command}->[0] eq "findme" and $sport < 1000)) { # only consider priveleged port requests to start with
$req->{'_xcat_clienthost'} = $client;
$req->{'_xcat_clientip'} = $clientip;
$req->{'_xcat_clientport'} = $sport;
if (defined($cmd_handlers{"findme"}) and xCAT::NetworkUtils->nodeonmynet($clientip)) { # only discover from ips that appear to be on a managed network
xCAT::MsgUtils->message("S", "xcatd: Processing discovery request from " . $req->{'_xcat_clientip'});
# Using cacheonly will cause the discovery processing running 2 times, cacheonly seems useless for switch.pm, so remove it
#$req->{cacheonly}->[0] = 1;
#plugin_command($req,undef,\&build_response);
@ -678,7 +660,7 @@ sub do_discovery_process {
#}
} else {
xCAT::MsgUtils->message("S", "xcatd: Skipping discovery from " . $client . " because we either have no discovery plugins or the client address does not match an IP network that xCAT is managing");
xCAT::MsgUtils->message("S", "xcatd: Skipping discovery from " . $clientip . " because we either have no discovery plugins or the client address does not match an IP network that xCAT is managing");
}
}
}
@ -801,21 +783,31 @@ sub do_udp_service { # This function opens up a UDP port
foreach my $pkey (keys %packets) {
my $saddr = $packets{$pkey}->[0];
$data = $packets{$pkey}->[1];
my ($err, $srcip, $servicename) = Socket::getnameinfo($saddr,Socket::NI_NUMERICHOST,Socket::NIx_NOSERV);
my $sport;
my $clientip;
my $clientn;
if ($inet6support) {
($clientip, $sport) = Socket6::getnameinfo($saddr, Socket6::NI_NUMERICHOST());
if ($clientip =~ /::ffff:.*\..*\./) {
$clientip =~ s/^::ffff://;
}
} else {
($sport, $clientn) = sockaddr_in($saddr);
$clientip = inet_ntoa($clientn);
}
if ($data =~ /^\037\213/) { # per rfc 1952, these two bytes are gzip, and they are invalid for
store_fd({ data => $data, sockaddr => $saddr }, $discoctl); # for now, punt the gunzip to the worker process
store_fd({ data => $data, sockaddr => $clientip, sport => $sport }, $discoctl); # for now, punt the gunzip to the worker process
#notify the client that its request is been processing
my $ret=xCAT::Utils->send_tcp_msg($srcip,3001,"processing");
my $ret=xCAT::NetworkUtils->send_tcp_msg($clientip,3001,"processing");
if($ret){
xCAT::MsgUtils->message("S", "INFO xcatd: fail to notify $srcip that its 'findme' request is been processing");
xCAT::MsgUtils->message("S", "INFO xcatd: fail to notify $clientip that its 'findme' request is been processing");
}
} elsif ($data =~ /^<xcat/) { # xml format
store_fd({ data => $data, sockaddr => $saddr }, $discoctl);
store_fd({ data => $data, sockaddr => $clientip, sport => $sport }, $discoctl);
#notify the client that its request is been processing
my $ret=xCAT::Utils->send_tcp_msg($srcip,3001,"processing");
my $ret=xCAT::NetworkUtils->send_tcp_msg($clientip,3001,"processing");
if($ret){
xCAT::MsgUtils->message("S", "INFO xcatd: fail to notify $srcip that its 'findme' request is been processing");
xCAT::MsgUtils->message("S", "INFO xcatd: fail to notify $clientip that its 'findme' request is been processing");
}
} else { # for *now*, we'll do a tiny YAML subset