From 725444cdd1bbd0bdb0408a45479cf64649e99084 Mon Sep 17 00:00:00 2001 From: immarvin Date: Fri, 21 Jul 2017 03:37:33 -0400 Subject: [PATCH 1/2] fix issue#3515: check the version of xCAT between MN and SN while processing the forwarded request --- xCAT-server/sbin/xcatd | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/xCAT-server/sbin/xcatd b/xCAT-server/sbin/xcatd index 99792c097..b86e523eb 100755 --- a/xCAT-server/sbin/xcatd +++ b/xCAT-server/sbin/xcatd @@ -2301,7 +2301,8 @@ sub dispatch_request { my $errstr; eval { undef $_->{'_xcatdest'}; - + #the xCAT version is included in the request which will be forwarded + $_->{'_xcatver'}=xCAT::Version->Version(); # mainly used by SN to filter out the incorrect module that xcat command came into $_->{'_modname'} = $modname; @@ -2803,6 +2804,23 @@ sub service_connection { delete($req->{tokenid}); } + #for xcat requests forwarded from other nodes, such as MN<-->SN + # compare the version of xCAT which forwarded the request and the + # one which processes the forwarded command + #if the 2 versions are different, a warning message is included in the response + if($req->{'_xcatver'} and $req->{'_xcatver'}->[0]){ + my $myxcatver=xCAT::Version->Version(); + if($req->{'_xcatver'}->[0] ne $myxcatver){ + require Sys::Hostname; + my $myhostname=Sys::Hostname::hostname; + my $resp = { warning => ["$myhostname: my xCAT version \"$myxcatver\" does not match the forwarder's xCAT version \"$req->{'_xcatver'}->[0]\" on $peerhost"]}; + $resp->{serverdone} = [undef]; + send_response($resp, $sock); + #return; + } + } + + # we have a full request.. #printf $request."\n"; $request = ""; From 8b31e6328704c0c3e52fa02e829eaed63ae96507 Mon Sep 17 00:00:00 2001 From: immarvin Date: Sun, 23 Jul 2017 23:26:03 -0400 Subject: [PATCH 2/2] load Sys::Hostname module with use intead of require to avoid performance decrease; refine the warning message;remove some commented out lines --- xCAT-server/sbin/xcatd | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/xCAT-server/sbin/xcatd b/xCAT-server/sbin/xcatd index b86e523eb..cc8303261 100755 --- a/xCAT-server/sbin/xcatd +++ b/xCAT-server/sbin/xcatd @@ -42,6 +42,7 @@ if ($^O =~ /^aix/i) { } use lib "$::XCATROOT/lib/perl"; use Storable qw(freeze thaw nstore_fd store_fd fd_retrieve); +use Sys::Hostname; use xCAT::Utils; use xCAT::TableUtils; use xCAT::NetworkUtils; @@ -2811,18 +2812,15 @@ sub service_connection { if($req->{'_xcatver'} and $req->{'_xcatver'}->[0]){ my $myxcatver=xCAT::Version->Version(); if($req->{'_xcatver'}->[0] ne $myxcatver){ - require Sys::Hostname; my $myhostname=Sys::Hostname::hostname; - my $resp = { warning => ["$myhostname: my xCAT version \"$myxcatver\" does not match the forwarder's xCAT version \"$req->{'_xcatver'}->[0]\" on $peerhost"]}; + my $resp = { warning => ["xCAT Version mismatch! \"$myxcatver\" on $myhostname does not match \"$req->{'_xcatver'}->[0]\" on $peerhost!"]}; $resp->{serverdone} = [undef]; send_response($resp, $sock); - #return; } } # we have a full request.. - #printf $request."\n"; $request = ""; if (xCAT::xcatd->validate($peername, $peerhost, $req, $peerhostorg, \@deferredmsgargs)) { $req->{'_xcat_authname'} = [$peername];