diff --git a/perl-xCAT/xCAT/GlobalDef.pm b/perl-xCAT/xCAT/GlobalDef.pm index f2a882be4..14237e81f 100644 --- a/perl-xCAT/xCAT/GlobalDef.pm +++ b/perl-xCAT/xCAT/GlobalDef.pm @@ -33,6 +33,12 @@ $::NODETYPE_PPC="ppc"; $::NODETYPE_ZVM="zvm"; $::NODETYPE_MP="mp"; +#valid values for nodelist.updatestatus +$::STATUS_SYNCING="syncing"; +$::STATUS_OUT_OF_SYNC="out-of-sync"; +$::STATUS_SYNCED="synced"; + + # valid values for nodelist.status columns or other status $::STATUS_ACTIVE="alive"; $::STATUS_INACTIVE="unreachable"; @@ -65,6 +71,10 @@ $::STATUS_FAILED="failed"; $::STATUS_DEFINED=>1, $::STATUS_UNKNOWN=>1, $::STATUS_FAILED=>1, + + $::STATUS_SYNCING=>1, + $::STATUS_OUT_OF_SYNC=>1, + $::STATUS_SYNCED=>1, ); #defined->[discovering]->[configuring]->[standingby]->installing->[installed]->booting->alive, defined->[discovering]->[configuring]-[standingby]->netbooting->booted->alive, alive/unreachable->booting->alive, powering-off->unreachable, alive->unreachable diff --git a/perl-xCAT/xCAT/TableUtils.pm b/perl-xCAT/xCAT/TableUtils.pm index 39b4e3441..0499b48b8 100644 --- a/perl-xCAT/xCAT/TableUtils.pm +++ b/perl-xCAT/xCAT/TableUtils.pm @@ -854,6 +854,70 @@ sub setAppStatus } +#------------------------------------------------------------------------------- + +=head3 setUpdateStatus + Description: + Set the updatestatus attribute for a list of nodes during "updatenode" + Arguments: + @nodes + $status + Returns: + none + + Globals: + none + Error: + none + Example: + xCAT::TableUtils->setUpdateStatus(\@nodes,$status); + Comments: + +=cut + +#----------------------------------------------------------------------------- + +sub setUpdateStatus +{ + require xCAT::Table; + + + my ($class, $nodes_ref, $status) = @_; + my @nodes = @$nodes_ref; + + + + #get current local time to set in Updatestatustime attribute + my ( + $sec, $min, $hour, $mday, $mon, + $year, $wday, $yday, $isdst + ) + = localtime(time); + my $currtime = sprintf("%02d-%02d-%04d %02d:%02d:%02d", + $mon + 1, $mday, $year + 1900, + $hour, $min, $sec); + + my $nltab = xCAT::Table->new('nodelist'); + if($nltab){ + if(@nodes>0){ + my %updates; + + $updates{'updatestatus'} = $status; + $updates{'updatestatustime'} = $currtime; + my $where_clause; + my $dbname=xCAT::Utils->get_DBName() ; + if ($dbname eq 'DB2') { + $where_clause="\"node\" in ('" . join("','", @nodes) . "')"; + } else { + $where_clause="node in ('" . join("','", @nodes) . "')"; + } + print "$where_clause"; + $nltab->setAttribsWhere($where_clause, \%updates ); + } + $nltab->close; + } + return; +} #------------------------------------------------------------------------------- diff --git a/xCAT-server/lib/xcat/plugins/updatenode.pm b/xCAT-server/lib/xcat/plugins/updatenode.pm index 654b1cce6..534da5154 100644 --- a/xCAT-server/lib/xcat/plugins/updatenode.pm +++ b/xCAT-server/lib/xcat/plugins/updatenode.pm @@ -60,7 +60,8 @@ sub handled_commands updatenode => "updatenode", updatenodestat => "updatenode", updatemynodestat => "updatenode", - updatenodeappstat => "updatenode" + updatenodeappstat => "updatenode", + updatenodeupdatestat => "updatenode" }; } @@ -101,6 +102,10 @@ sub preprocess_request { return [$request]; } + elsif ($command eq "updatenodeupdatestat") + { + return [$request]; + } else { my $rsp = {}; @@ -154,6 +159,10 @@ sub process_request { return updatenodeappstat($request, $callback); } + elsif ($command eq "updatenodeupdatestat") + { + return updatenodeupdatestat($request, $callback); + } else { my $rsp = {}; @@ -341,6 +350,8 @@ sub preprocess_updatenode } my $nodes = $request->{node}; + + if (!$nodes) { my $rsp = {}; @@ -495,6 +506,7 @@ sub preprocess_updatenode } } + # if not -S or -P or --security unless (defined($::SWMAINTENANCE) || defined($::RERUNPS) || $::SECURITY) { @@ -884,7 +896,7 @@ sub updatenode #print Dumper($request); my $nodes = $request->{node}; my $localhostname = hostname(); - + #xCAT::TableUtils->setUpdateStatus($nodes,$::STATUS_SYNCING); # in a mixed cluster we could potentially have both AIX and Linux # nodes provided on the command line ???? my ($rc, $AIXnodes, $Linuxnodes) = xCAT::InstUtils->getOSnodes($nodes); @@ -1333,7 +1345,6 @@ sub updatenode }, \&getdata ); - } } @@ -1620,6 +1631,64 @@ sub updatenodestat #------------------------------------------------------------------------------- +=head3 updatenodeupdatestat + +update the nodelist.updatestatus and nodelist.updatestatustime during updatenode + + Arguments: + Returns: + 0 - for success. + 1 - for error. + +=cut + +#----------------------------------------------------------------------------- +sub updatenodeupdatestat +{ + my $request = shift; + my $callback = shift; + my @nodes = (); + my @args = (); + if (ref($request->{node})) + { + @nodes = @{$request->{node}}; + } + else + { + if ($request->{node}) { @nodes = ($request->{node}); } + else + { #client asking to update its own status... + unless (ref $request->{username}) + { + return; + } #TODO: log an attempt without credentials? + @nodes = @{$request->{username}}; + } + } + if (ref($request->{arg})) + { + @args = @{$request->{arg}}; + } + else + { + @args = ($request->{arg}); + } + + if ((@nodes > 0) && (@args > 0)) + { + my $stat = $args[0]; + unless ($::VALID_STATUS_VALUES{$stat}) + { + return; + } #don't accept just any string, see GlobalDef for updates + + xCAT::TableUtils->setUpdateStatus(\@nodes,$stat); + } + + return 0; +} +#------------------------------------------------------------------------------- + =head3 doAIXcopy Copy software update files to SNs - if needed. diff --git a/xCAT-server/sbin/xcatd b/xCAT-server/sbin/xcatd index 90f815e63..b8d6580c9 100755 --- a/xCAT-server/sbin/xcatd +++ b/xCAT-server/sbin/xcatd @@ -369,6 +369,24 @@ if ($inet6support) { #} } close($conn); + } elsif ($text =~ /updatestatus/) { +#update nodelist.updatestatus according to the message from cn + my @tmpa=split(' ', $text); + for (my $i = 1; $i <= @tmpa-1; $i++) { + my $newstat=$tmpa[$i]; + my %request = ( + command => [ 'updatenodeupdatestat' ], + node => [ $node ], + arg => [ "$newstat" ], + ); + #node should be blocked, race condition may occur otherwise + #my $pid=xCAT::Utils->xfork(); + #unless ($pid) { #fork off the nodeset and potential slowness + plugin_command(\%request,undef,\&build_response); + # exit(0); + #} + } + close($conn); } elsif ($text =~ /^unlocktftpdir/) { #TODO: only nodes in install state should be allowed mkpath("$tftpdir/xcat/$node"); chmod 01777,"$tftpdir/xcat/$node"; diff --git a/xCAT/postscripts/xcatdsklspost b/xCAT/postscripts/xcatdsklspost index 3ace9e172..6a0475fb6 100755 --- a/xCAT/postscripts/xcatdsklspost +++ b/xCAT/postscripts/xcatdsklspost @@ -269,7 +269,7 @@ if [ -x /usr/bin/openssl ]; then export USEOPENSSLFORXCAT fi -/xcatpost/getpostscript.awk | sed -e 's/<[^>]*>//g'|egrep -v '^ *$'|sed -e 's/^ *//' > /xcatpost/mypostscript; +/xcatpost/getpostscript.awk | egrep '' | sed -e 's/<[^>]*>//g'|egrep -v '^ *$'|sed -e 's/^ *//' > /xcatpost/mypostscript; MYCONT=`grep MASTER /xcatpost/mypostscript` #echo "MYCONT=$MYCONT" #if getpostscript.awk fails, the postscript will fall into infinit loop @@ -280,14 +280,17 @@ while [ -z "$MYCONT" ]; do RETRY=$(($RETRY+1)) if [ $RETRY -eq $MAX_RETRIES ] then - break +# break + echo "xcatdsklspost: failed to getpostscript from $XCATSERVER" + logger -t xcat -p local4.err "xcatdsklspost: failed to getpostscript from $XCATSERVER" + exit 1 fi #SLI=$(awk 'BEGIN{srand(); printf("%d\n",rand()*10)}') #SLI=$((10 + $SLI)) #sleep $SLI - /xcatpost/getpostscript.awk | sed -e 's/<[^>]*>//g'|egrep -v '^ *$'|sed -e 's/^ *//' > /xcatpost/mypostscript; + /xcatpost/getpostscript.awk | egrep '' | sed -e 's/<[^>]*>//g'|egrep -v '^ *$'|sed -e 's/^ *//' > /xcatpost/mypostscript; MYCONT=`grep MASTER /xcatpost/mypostscript` if [ ! -z "$MYCONT" ]; then break; @@ -339,6 +342,9 @@ if [ "$MODE" = "6" ]; then #remove all the postscripts TMP=`sed "/postbootscripts-start-here/,/postbootscripts-end-here/ d" /xcatpost/mypostscript` echo "$TMP" > /xcatpost/mypostscript + + #TMP=`sed "/postbootscripts-start-here/,/postbootscripts-end-here/ d" /xcatpost/mypostscript.post` + #echo "$TMP" > /xcatpost/mypostscript.post fi fi @@ -354,6 +360,9 @@ if [ "XX$POSTSCRIPTS" != "XX" ]; then #add requested postscripts in echo "$POSTSCRIPTS" | tr "," "\n" >> /xcatpost/mypostscript echo "# postscripts-end-here" >> /xcatpost/mypostscript + + + fi #ADDSITEYUM is set by post.rh and post.rh.iscsi for full installtion @@ -386,6 +395,7 @@ run_ps () { if [ \"\$ret_local\" -ne \"0\" ]; then return_value=\$ret_local fi + echo \"Postscript: \$@ exited with code \$ret_local\" else echo \"\`date\` Postscript \$1 does NOT exist.\" | tee -a \$logfile return_value=-1 @@ -426,9 +436,28 @@ if [ "$CLEANUPXCATPOST" = "'1'" ] || [ "$CLEANUPXCATPOST" = "'yes'" ]; then echo "rm -rf /xcatpost/*" >> /xcatpost/mypostscript fi + + +if [ "$MODE" = "1" ] || [ "$MODE" = "2" ] || [ "$MODE" = "5" ]; then + #notify the server that we are done with updatenode + CNS=`grep NODESTATUS= /xcatpost/mypostscript |awk -F = '{print $2}'` + if [ -z "$CNS" ] || [ "$CNS" != "'0'" -a "$CNS" != "'N'" -a "$CNS" != "'n'" ]; then + echo " +if [ \"\$return_value\" -eq \"0\" ]; then + updateflag.awk \$MASTER 3002 \"updatestatus synced\" +else + updateflag.awk \$MASTER 3002 \"updatestatus out-of-sync\" +fi + " >> /xcatpost/mypostscript + fi + + echo "exit \$return_value" >> /xcatpost/mypostscript +fi + chmod +x /xcatpost/mypostscript if [ -x /xcatpost/mypostscript ];then /xcatpost/mypostscript + VRET_POST=$? fi #rm -f /xcatpost/mypostscript @@ -437,3 +466,4 @@ if [ "$MODE" = "1" ] || [ "$MODE" = "2" ] || [ "$MODE" = "5" ]; then echo "returned from postscript" fi +exit $VRET_POST