diff --git a/perl-xCAT/xCAT/Client.pm b/perl-xCAT/xCAT/Client.pm index 70fdb8345..dbc4fc02b 100644 --- a/perl-xCAT/xCAT/Client.pm +++ b/perl-xCAT/xCAT/Client.pm @@ -8,9 +8,11 @@ BEGIN # if AIX - make sure we include perl 5.8.2 in INC path. # Needed to find perl dependencies shipped in deps tarball. +use Storable qw/nstore_fd fd_retrieve/; if ($^O =~ /^aix/i) { unshift(@INC, qw(/usr/opt/perl5/lib/5.8.2/aix-thread-multi /usr/opt/perl5/lib/5.8.2 /usr/opt/perl5/lib/site_perl/5.8.2/aix-thread-multi /usr/opt/perl5/lib/site_perl/5.8.2)); } +use IO::Handle; my $inet6support; if ($^O =~ /^aix/i) { # disable AIX IPV6 TODO fix @@ -77,6 +79,23 @@ sub rspclean { } return 0; } +sub send_request { + my $request = shift; + my $sock = shift; + my $encode = shift; + if ($encode eq "xml") { + my $msg=XMLout($request,RootName=>'xcatrequest',NoAttr=>1,KeyAttr=>[]); + if ($ENV{XCATXMLTRACE}) { print $msg; } + if($ENV{XCATXMLWARNING}) { + validateXML($msg); + } + print $sock $msg; + $sock->flush(); + } else { + nstore_fd($request,$sock); + $sock->flush(); + } +} ################################# # submit_request will take an xCAT command and pass it to the xCAT # server for execution. @@ -232,20 +251,23 @@ if (ref($request) eq 'HASH') { # the request is an array, not pure XML ); } my $msg; + my $encode = "storable"; + my $straightprint=0; + if ($ENV{XCATXMLTRACE} or $ENV{XCATXMLWARNING}) { $encode="xml"; } if (ref($request) eq 'HASH') { # the request is an array, not pure XML - $msg=XMLout($request,RootName=>'xcatrequest',NoAttr=>1,KeyAttr=>[]); + print $client "xcatencoding: $encode\n"; + my $encok=<$client>; + send_request($request,$client,$encode); } else { #XML + $straightprint=1; $msg=$request; + print $client $msg; } - if ($ENV{XCATXMLTRACE}) { print $msg; } - if($ENV{XCATXMLWARNING}) { - validateXML($msg); - } - $SIG{TERM} = $SIG{INT} = sub { print $client XMLout({abortcommand=>1},RootName=>'xcatrequest',NoAttr=>1,KeyAttr=>[]); exit 0; }; - print $client $msg; + $SIG{TERM} = $SIG{INT} = sub { send_request({abortcommand=>1},$client,$encode); exit 0; }; my $response; my $rsp; my $cleanexit=0; + if ($encode eq 'xml') { my $massresponse=""; my $nextcoalescetime=time()+1; my $coalescenow=0; @@ -299,6 +321,27 @@ if (ref($request) eq 'HASH') { # the request is an array, not pure XML $massresponse .= ""; $cleanexit = rspclean($massresponse,$callback); } + } else { #storable encode + my $rsp; + eval { $rsp = fd_retrieve($client); }; + while ($rsp) { + my @rsps; + if (ref $rsp eq 'ARRAY') { + @rsps = @$rsp; + } else { + @rsps = ($rsp); + } + foreach (@rsps) { + $callback->($_); + if ($_->{serverdone}) { + $cleanexit=1; + last; + } + } + $rsp = undef; + eval { $rsp = fd_retrieve($client); }; + } + } $massresponse=""; unless ($cleanexit) { print STDERR "ERROR/WARNING: communication with the xCAT server seems to have been ended prematurely\n"; diff --git a/xCAT-server/sbin/xcatd b/xCAT-server/sbin/xcatd index 4140dee55..860a83cb4 100755 --- a/xCAT-server/sbin/xcatd +++ b/xCAT-server/sbin/xcatd @@ -98,7 +98,7 @@ unless ($inet6support) { my $dispatch_requests = 1; # govern whether commands are dispatchable use IO::Socket; -#use IO::Handle; +use IO::Handle; use IO::Select; use XML::Simple; $XML::Simple::PREFERRED_PARSER='XML::Parser'; @@ -1993,7 +1993,11 @@ sub send_response { } }; } elsif ($encode eq "storable") { + if ($response->{xcatresponse}) { + $response = $response->{xcatresponse}; + } nstore_fd($response,$sock); + $sock->flush(); #otherwise, the response might actually get deferred until after the close_notify, crazy huh? } } sub get_request { @@ -2049,11 +2053,12 @@ sub service_connection { while (1) { unless ($clientsel->can_read(15)) { last; } #don't let an unresponsive client hold us up my $line = <$sock>; # grab one line, check for mode... - if ($line and $line =~ /^xcatencoding: (.*)\z/) { + if ($line and $line =~ /^xcatencoding: (.*)/) { unless ($supported_encodes{$1}) { print $sock "Unsupported encoding $1\n"; last; } + print $sock "Encoding accepted\n"; $globalencode=$1; $line = ""; }