mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-11-03 21:02:34 +00:00 
			
		
		
		
	Check for service node pools for monitoring
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@2927 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
		@@ -300,6 +300,11 @@ sub stop {
 | 
			
		||||
 | 
			
		||||
  if ($scope) {
 | 
			
		||||
    my $pPairHash=xCAT_monitoring::monitorctrl->getMonServer($noderef);
 | 
			
		||||
    if (ref($pPairHash) eq 'ARRAY') {
 | 
			
		||||
	reportError($pPairHash->[1], $callback);
 | 
			
		||||
	return (1, "");	
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
    #the identification of this node
 | 
			
		||||
    my @hostinfo=xCAT::Utils->determinehostname();
 | 
			
		||||
@@ -309,10 +314,10 @@ sub stop {
 | 
			
		||||
    if (!$isSV) { $iphash{'noservicenode'}=1;}
 | 
			
		||||
 | 
			
		||||
    foreach my $key (keys (%$pPairHash)) {
 | 
			
		||||
      my @key_a=split(',', $key);
 | 
			
		||||
      if (! $iphash{$key_a[0]}) { next;}   
 | 
			
		||||
      my @key_a=split(':', $key);
 | 
			
		||||
      if (! $iphash{$key_a[0]}) { next;}  
 | 
			
		||||
      my $mon_nodes=$pPairHash->{$key};
 | 
			
		||||
 | 
			
		||||
      
 | 
			
		||||
      #figure out what nodes to stop
 | 
			
		||||
      my @nodes_to_stop=();
 | 
			
		||||
      if ($mon_nodes) {
 | 
			
		||||
@@ -398,6 +403,11 @@ sub config {
 | 
			
		||||
  `/usr/bin/rmcctrl -p`;
 | 
			
		||||
  
 | 
			
		||||
  my $pPairHash=xCAT_monitoring::monitorctrl->getMonServer($noderef);
 | 
			
		||||
  if (ref($pPairHash) eq 'ARRAY') {
 | 
			
		||||
      reportError($pPairHash->[1], $callback);
 | 
			
		||||
      return (1, "");	
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
  #the identification of this node
 | 
			
		||||
  my @hostinfo=xCAT::Utils->determinehostname();
 | 
			
		||||
@@ -407,9 +417,10 @@ sub config {
 | 
			
		||||
  if (!$isSV) { $iphash{'noservicenode'}=1;}
 | 
			
		||||
 | 
			
		||||
  foreach my $key (keys (%$pPairHash)) {
 | 
			
		||||
    my @key_a=split(',', $key);
 | 
			
		||||
    if (! $iphash{$key_a[0]}) { next;}   
 | 
			
		||||
    my @key_a=split(':', $key);
 | 
			
		||||
    if (! $iphash{$key_a[0]}) { next;} 
 | 
			
		||||
    my $mon_nodes=$pPairHash->{$key};
 | 
			
		||||
 | 
			
		||||
    my $master=$key_a[1];
 | 
			
		||||
 | 
			
		||||
    #figure out what nodes to add
 | 
			
		||||
@@ -491,6 +502,10 @@ sub deconfig {
 | 
			
		||||
  my $callback=shift;
 | 
			
		||||
  my $localhostname=hostname();
 | 
			
		||||
  my $pPairHash=xCAT_monitoring::monitorctrl->getMonServer($noderef);
 | 
			
		||||
  if (ref($pPairHash) eq 'ARRAY') {
 | 
			
		||||
      reportError($pPairHash->[1], $callback);
 | 
			
		||||
      return (1, "");	
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
  #the identification of this node
 | 
			
		||||
  my @hostinfo=xCAT::Utils->determinehostname();
 | 
			
		||||
@@ -500,9 +515,10 @@ sub deconfig {
 | 
			
		||||
  if (!$isSV) { $iphash{'noservicenode'}=1;}
 | 
			
		||||
 | 
			
		||||
  foreach my $key (keys (%$pPairHash)) {
 | 
			
		||||
    my @key_a=split(',', $key);
 | 
			
		||||
    if (! $iphash{$key_a[0]}) { next;}   
 | 
			
		||||
    my @key_a=split(':', $key);
 | 
			
		||||
    if (! $iphash{$key_a[0]}) { next;}  
 | 
			
		||||
    my $mon_nodes=$pPairHash->{$key};
 | 
			
		||||
 | 
			
		||||
    my $master=$key_a[1];
 | 
			
		||||
 | 
			
		||||
    #figure out what nodes to remove
 | 
			
		||||
@@ -585,6 +601,10 @@ sub startNodeStatusMon {
 | 
			
		||||
  #get all the nodes status from IBM.MngNode class of local host and 
 | 
			
		||||
  #the identification of this node
 | 
			
		||||
  my $pPairHash=xCAT_monitoring::monitorctrl->getMonServer($noderef);
 | 
			
		||||
  if (ref($pPairHash) eq 'ARRAY') {
 | 
			
		||||
      reportError($pPairHash->[1], $callback);
 | 
			
		||||
      return (1, "");	
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  my @hostinfo=xCAT::Utils->determinehostname();
 | 
			
		||||
  my %iphash=();
 | 
			
		||||
@@ -594,9 +614,10 @@ sub startNodeStatusMon {
 | 
			
		||||
  my @servicenodes=();
 | 
			
		||||
  my %status_hash=();
 | 
			
		||||
  foreach my $key (keys (%$pPairHash)) {
 | 
			
		||||
    my @key_a=split(',', $key);
 | 
			
		||||
    if (! $iphash{$key_a[0]}) { next; } 
 | 
			
		||||
    my @key_a=split(':', $key);
 | 
			
		||||
    if (! $iphash{$key_a[0]}) { next;}
 | 
			
		||||
    my $mon_nodes=$pPairHash->{$key};
 | 
			
		||||
 | 
			
		||||
    foreach(@$mon_nodes) {
 | 
			
		||||
      my $nodetype=$_->[1];
 | 
			
		||||
      if ($nodetype) {
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -789,14 +789,16 @@ sub getPluginSettings {
 | 
			
		||||
sub isMonServer {
 | 
			
		||||
  my $pHash=getNodeMonServerPair([], 1);
 | 
			
		||||
 | 
			
		||||
  if (ref($pHash) eq 'ARRAY') { return 0; }
 | 
			
		||||
 | 
			
		||||
  my @hostinfo=xCAT::Utils->determinehostname();
 | 
			
		||||
  my $isSV=xCAT::Utils->isServiceNode();
 | 
			
		||||
  my  %iphash=();
 | 
			
		||||
  foreach(@hostinfo) {$iphash{$_}=1;}
 | 
			
		||||
  if (!$isSV) { $iphash{'noservicenode'}=1;}
 | 
			
		||||
  
 | 
			
		||||
 
 | 
			
		||||
  foreach my $pair (keys(%$pHash)) {
 | 
			
		||||
    my @a=split(',', $pair);
 | 
			
		||||
    my @a=split(':', $pair);
 | 
			
		||||
    if ($iphash{$a[0]} || $iphash{$a[1]}) { return 1;}
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
@@ -810,10 +812,10 @@ sub isMonServer {
 | 
			
		||||
            nodelist table will be used.
 | 
			
		||||
       retfromat 0-- A pointer to a hash table with node as the key and a the monserver pairs
 | 
			
		||||
                     string as the value.  
 | 
			
		||||
                     For example: { node1=>"sv1,ma1", node2=>"sv1,ma1", node3=>"sv2,ma2"...}
 | 
			
		||||
                     For example: { node1=>"sv1:ma1", node2=>"sv2:ma2", node3=>"sv2:ma2"...}
 | 
			
		||||
                 1-- A pointer to a hash table with monserver pairs as the key and an array
 | 
			
		||||
                     pointer of nodes as the value. 
 | 
			
		||||
                     For example: { "sv1,ma1"=>[node1,node2], "sv2,ma2"=>node3...}
 | 
			
		||||
                     For example: { "sv1:ma1"=>[node1,node2], "sv2:ma2"=>node3...}
 | 
			
		||||
                   
 | 
			
		||||
         The pair is in the format of "monserver,monmaser". First one is the monitoring service 
 | 
			
		||||
      node ip/hostname that faces the mn and the second one is the monitoring service 
 | 
			
		||||
@@ -822,6 +824,7 @@ sub isMonServer {
 | 
			
		||||
      for that node. In this case the second one is the site master. 
 | 
			
		||||
   Returns: 
 | 
			
		||||
      An pointer to a hash.
 | 
			
		||||
      It retuens a pointer to an array if there is an error. Format is [code, message].
 | 
			
		||||
=cut
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub getNodeMonServerPair {
 | 
			
		||||
@@ -852,9 +855,10 @@ sub getNodeMonServerPair {
 | 
			
		||||
    my $tmp2 = $tabdata->{$node}->[0];
 | 
			
		||||
    if ($tmp2 && $tmp2->{monserver}) {
 | 
			
		||||
        $pairs=$tmp2->{monserver}; 
 | 
			
		||||
        $pairs =~ s/,/:/;  #for backward conmpatibility. used to be aa,bb not the format is aa:bb
 | 
			
		||||
        #when there is only one hostname specified in noderes.monserver, 
 | 
			
		||||
        #both monserver and monmaster take the same hostname.
 | 
			
		||||
        if ($pairs !~ /,/) { $pairs=$tmp2->{monserver}.','.$tmp2->{monserver}; } 
 | 
			
		||||
        if ($pairs !~ /:/) { $pairs=$tmp2->{monserver}.':'.$tmp2->{monserver}; } 
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!$pairs) {
 | 
			
		||||
@@ -862,10 +866,14 @@ sub getNodeMonServerPair {
 | 
			
		||||
      if ($tmp2->{xcatmaster})  {  $monmaster=$tmp2->{xcatmaster}; } 
 | 
			
		||||
      if (!$monserver) { $monserver="noservicenode"; }
 | 
			
		||||
      if (!$monmaster) { $monmaster=xCAT::Utils->get_site_attribute('master'); }
 | 
			
		||||
      $pairs="$monserver,$monmaster";
 | 
			
		||||
      $pairs="$monserver:$monmaster";
 | 
			
		||||
    } 
 | 
			
		||||
    #print "node=$node, pairs=$pairs\n";
 | 
			
		||||
 | 
			
		||||
    if ($monserver =~ /,/) { #monserver in noderes table must be defined in the service node pool case
 | 
			
		||||
	return [1, "Please specify 'monserver' on the noderes table for the node $node because the service node pools are used."]; 
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ($retformat) {
 | 
			
		||||
      if (exists($ret->{$pairs})) {
 | 
			
		||||
        my $pa=$ret->{$pairs};
 | 
			
		||||
@@ -896,6 +904,7 @@ sub getNodeMonServerPair {
 | 
			
		||||
      that faces the mn and the second one being the service node ip/hostname that faces the cn. 
 | 
			
		||||
      The value of the first one can be "noservicenode" meaning that there is no service node 
 | 
			
		||||
      for that node. In this case the second one is the site master.  
 | 
			
		||||
      It returns a pointer to an array if there is an error. Format is [code, message].
 | 
			
		||||
=cut
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub getMonHierarchy {
 | 
			
		||||
@@ -938,9 +947,10 @@ sub getMonHierarchy {
 | 
			
		||||
      if (defined($row2) && ($row2)) {
 | 
			
		||||
	if ($row2->{monserver}) {
 | 
			
		||||
          $pairs=$row2->{monserver}; 
 | 
			
		||||
	  $pairs =~ s/,/:/;  #for backward conmpatibility. used to be aa,bb not the format is aa:bb
 | 
			
		||||
          #when there is only one hostname specified in noderes.monserver, 
 | 
			
		||||
          #both monserver and monmaster take the same hostname.
 | 
			
		||||
          if ($pairs !~ /,/) { $pairs=$row2->{monserver}.','.$row2->{monserver}; } 
 | 
			
		||||
          if ($pairs !~ /:/) { $pairs=$row2->{monserver}.':'.$row2->{monserver}; } 
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      
 | 
			
		||||
@@ -948,8 +958,12 @@ sub getMonHierarchy {
 | 
			
		||||
        if ($row2->{servicenode}) {  $monserver=$row2->{servicenode}; }
 | 
			
		||||
        if ($row2->{xcatmaster})  {  $monmaster=$row2->{xcatmaster}; } 
 | 
			
		||||
        if (!$monserver) { $monserver="noservicenode"; }
 | 
			
		||||
        if (!$monmaster) { $monmaster=$sitemaster; }
 | 
			
		||||
        $pairs="$monserver,$monmaster";
 | 
			
		||||
	if(!$monmaster) { $monmaster=$sitemaster; }
 | 
			
		||||
        $pairs="$monserver:$monmaster";
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if ($monserver =~ /,/) { #monserver in noderes table must be defined in the service node pool case
 | 
			
		||||
	  return [1, "Please specify 'monserver' on the noderes table for the node $node because the service node pools are used."]; 
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      #print "node=$node, pairs=$pairs\n";
 | 
			
		||||
@@ -984,10 +998,12 @@ sub getMonHierarchy {
 | 
			
		||||
      A hash reference keyed by the monitoring server nodes and each value is a ref to
 | 
			
		||||
      an array of [nodes, nodetype, status] arrays  monitored by the server. So the format is:
 | 
			
		||||
      {monserver1=>[['node1', 'osi', 'alive'], ['node2', 'switch', 'booting']...], ...} 
 | 
			
		||||
      A key is a pair of hostnames with the first one being the service node ip/hostname 
 | 
			
		||||
      A key is pair of hostnames with the first one being the service node ip/hostname 
 | 
			
		||||
      that faces the mn and the second one being the service node ip/hostname that faces the cn. 
 | 
			
		||||
      The value of the first one can be "noservicenode" meaning that there is no service node 
 | 
			
		||||
      for that node. In this case the second one is the site master.  
 | 
			
		||||
      It retuens a pointer to an array if there is an error. Format is [code, message].
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub getMonServerWithInfo {
 | 
			
		||||
@@ -1009,6 +1025,8 @@ sub getMonServerWithInfo {
 | 
			
		||||
  my $tabdata=$table3->getNodesAttribs(\@allnodes,['nodetype']);
 | 
			
		||||
  my $pPairHash=getNodeMonServerPair(\@allnodes, 0);
 | 
			
		||||
 | 
			
		||||
  if (ref($pPairHash) eq 'ARRAY') { return $pPairHash; } 
 | 
			
		||||
 | 
			
		||||
  foreach (@in_nodes) {
 | 
			
		||||
    my $node=$_->[0];
 | 
			
		||||
    my $status=$_->[2];
 | 
			
		||||
@@ -1051,6 +1069,7 @@ sub getMonServerWithInfo {
 | 
			
		||||
      that faces the mn and the second one being the service node ip/hostname that faces the cn. 
 | 
			
		||||
      The value of the first one can be "noservicenode" meaning that there is no service node 
 | 
			
		||||
      for that node. In this case the second one is the site master.  
 | 
			
		||||
      It retuens a pointer to an array if there is an error. Format is [code, message].
 | 
			
		||||
=cut
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub getMonServer {
 | 
			
		||||
@@ -1061,6 +1080,10 @@ sub getMonServer {
 | 
			
		||||
 | 
			
		||||
  my @allnodes=@$p_input;
 | 
			
		||||
  my $pPairHash=getNodeMonServerPair(\@allnodes, 0);
 | 
			
		||||
 | 
			
		||||
  if (ref($pPairHash) eq 'ARRAY') { return $pPairHash; } 
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  if (@allnodes==0) {
 | 
			
		||||
    @allnodes= keys(%$pPairHash);
 | 
			
		||||
  }
 | 
			
		||||
@@ -1302,7 +1325,7 @@ sub  getNodeConfData {
 | 
			
		||||
  my %ret=();
 | 
			
		||||
  #get monitoring server
 | 
			
		||||
  my $pHash=xCAT_monitoring::monitorctrl->getNodeMonServerPair([$node], 0);
 | 
			
		||||
  my @pair_array=split(',', $pHash->{$node});
 | 
			
		||||
  my @pair_array=split(':', $pHash->{$node});
 | 
			
		||||
  my $monserver=$pair_array[0];
 | 
			
		||||
  if ($monserver eq 'noservicenode') { $monserver=hostname(); }
 | 
			
		||||
  $ret{MONSERVER}=$monserver;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,437 +1,422 @@
 | 
			
		||||
#!/usr/bin/env perl 
 | 
			
		||||
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
 | 
			
		||||
package xCAT_monitoring::pcpmon;
 | 
			
		||||
BEGIN
 | 
			
		||||
{
 | 
			
		||||
  $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat';
 | 
			
		||||
}
 | 
			
		||||
use lib "$::XCATROOT/lib/perl";
 | 
			
		||||
use xCAT::NodeRange;
 | 
			
		||||
use Sys::Hostname;
 | 
			
		||||
use Socket;
 | 
			
		||||
use xCAT::Utils;
 | 
			
		||||
use xCAT::GlobalDef;
 | 
			
		||||
use xCAT_monitoring::monitorctrl;
 | 
			
		||||
use xCAT::MsgUtils;
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
1;
 | 
			
		||||
 | 
			
		||||
#-------------------------------------------------------------------------------
 | 
			
		||||
=head1  xCAT_monitoring:pcpmon  
 | 
			
		||||
=head2    Package Description
 | 
			
		||||
  xCAT monitoring plugin package to handle PCP monitoring.
 | 
			
		||||
=cut
 | 
			
		||||
#-------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
=head3    start
 | 
			
		||||
      This function gets called by the monitorctrl module when xcatd starts and 
 | 
			
		||||
      when monstart command is issued by the user. It starts the daemons and 
 | 
			
		||||
      does necessary startup process for the PCP monitoring. 
 | 
			
		||||
       p_nodes -- a pointer to an arrays of nodes to be monitored. null means all.
 | 
			
		||||
       scope -- the action scope, it indicates the node type the action will take place.
 | 
			
		||||
                0 means localhost only.
 | 
			
		||||
                2 means both localhost and nodes,
 | 
			
		||||
       callback -- the callback pointer for error and status displaying. It can be null.
 | 
			
		||||
    Returns:
 | 
			
		||||
      (return code, message)
 | 
			
		||||
      if the callback is set, use callback to display the status and error.
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub start 
 | 
			
		||||
    { # starting sub routine
 | 
			
		||||
      print "pcp::start called\n";
 | 
			
		||||
      my $noderef=shift;
 | 
			
		||||
      if ($noderef =~ /xCAT_monitoring::pcpmon/)
 | 
			
		||||
        {
 | 
			
		||||
         $noderef=shift;
 | 
			
		||||
        }
 | 
			
		||||
      my $scope=shift;
 | 
			
		||||
      print "scope is: $scope \n";
 | 
			
		||||
      my $callback=shift;
 | 
			
		||||
      
 | 
			
		||||
	    my $cmd="$::XCATROOT/sbin/pcp_collect";
 | 
			
		||||
  #figure out the ping-intercal setting
 | 
			
		||||
  my $value=5; #default
 | 
			
		||||
  my %settings=xCAT_monitoring::monitorctrl->getPluginSettings("pcpmon");
 | 
			
		||||
 | 
			
		||||
  my $reading=$settings{'ping-interval'};
 | 
			
		||||
  print "reading is $reading \n";
 | 
			
		||||
  if ($reading>0) { $value=$reading;}
 | 
			
		||||
   
 | 
			
		||||
  #create the cron job, it will run the command every 5 minutes(default and can be changed).
 | 
			
		||||
  my $newentry;
 | 
			
		||||
  if (xCAT::Utils->isAIX()) {
 | 
			
		||||
    #AIX does not support */value format, have to list them all.
 | 
			
		||||
    my $minutes;
 | 
			
		||||
    if ($value==1) { $minutes='*';}
 | 
			
		||||
    elsif ($value<=30) {
 | 
			
		||||
      my @temp_a=(0..59);
 | 
			
		||||
      foreach (@temp_a) {
 | 
			
		||||
        if (($_ % $value) == 0) { $minutes .= "$_,";}
 | 
			
		||||
      }
 | 
			
		||||
      chop($minutes);
 | 
			
		||||
    } else {
 | 
			
		||||
      $minutes="0";
 | 
			
		||||
    }
 | 
			
		||||
    $newentry="$minutes * * * * XCATROOT=$::XCATROOT PATH=$ENV{'PATH'} XCATCFG='$ENV{'XCATCFG'}' $cmd";
 | 
			
		||||
  } else {
 | 
			
		||||
    $newentry="*/$value * * * * XCATROOT=$::XCATROOT PATH=$ENV{'PATH'} XCATCFG='$ENV{'XCATCFG'}' $cmd";
 | 
			
		||||
  }
 | 
			
		||||
  my ($code, $msg)=xCAT::Utils::add_cron_job($newentry);
 | 
			
		||||
  my $localhostname=hostname(); 
 | 
			
		||||
  if ($code==0) { 
 | 
			
		||||
    if ($callback) {
 | 
			
		||||
      my $rsp={};
 | 
			
		||||
      $rsp->{data}->[0]="$localhostname: started. Refresh interval is $value minute(s)";
 | 
			
		||||
      $callback->($rsp);
 | 
			
		||||
    }
 | 
			
		||||
    #return (0, "started"); 
 | 
			
		||||
	}
 | 
			
		||||
  else {
 | 
			
		||||
    if ($callback) {
 | 
			
		||||
      my $rsp={};
 | 
			
		||||
      $rsp->{data}->[0]="$localhostname: $code  $msg";
 | 
			
		||||
      $callback->($rsp);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	 #return ($code, $msg);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
	  my $localhost=hostname();
 | 
			
		||||
      print "local host is $localhost \n";
 | 
			
		||||
      print "starting pcp locally \n";
 | 
			
		||||
      my $res_pcp = `/etc/init.d/pcp restart 2>&1`;
 | 
			
		||||
      print "res_pcp=$res_pcp\n";
 | 
			
		||||
      print "the result cp before  is $? \n";
 | 
			
		||||
      if ($?)
 | 
			
		||||
       {
 | 
			
		||||
         print "pcp result after is $? \n";
 | 
			
		||||
         if ($callback)
 | 
			
		||||
            {
 | 
			
		||||
             my $resp={};
 | 
			
		||||
             $resp->{data}->[0]="$localhost: PCP not started successfully: $res_pcp \n";
 | 
			
		||||
             $callback->($resp);
 | 
			
		||||
            }  
 | 
			
		||||
          else
 | 
			
		||||
           {
 | 
			
		||||
            xCAT::MsgUtils->message('S', "[mon]: $res_pcp \n");
 | 
			
		||||
           }
 | 
			
		||||
 
 | 
			
		||||
           return(1,"PCP not started successfully. \n");
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
        if ($scope)
 | 
			
		||||
         { #opening if scope
 | 
			
		||||
           print "opening scope \n";
 | 
			
		||||
           print "inside scope is:$scope";
 | 
			
		||||
           print "noderef is: @$noderef \n"; 
 | 
			
		||||
           my $pPairHash=xCAT_monitoring::monitorctrl->getMonServer($noderef);
 | 
			
		||||
  	   print "pairhash: $pPairHash\n";
 | 
			
		||||
	   #identification of this node
 | 
			
		||||
	   my @hostinfo=xCAT::Utils->determinehostname();
 | 
			
		||||
	   print "host:@hostinfo\n";
 | 
			
		||||
	   my $isSV=xCAT::Utils->isServiceNode();
 | 
			
		||||
	   print "is sv is:$isSV \n";
 | 
			
		||||
           my %iphash=();	
 | 
			
		||||
	   foreach(@hostinfo) {$iphash{$_}=1;}
 | 
			
		||||
	   if (!$isSV) { $iphash{'noservicenode'}=1;}
 | 
			
		||||
        
 | 
			
		||||
           my @children;
 | 
			
		||||
	   foreach my $key (keys (%$pPairHash))
 | 
			
		||||
            { #opening foreach1
 | 
			
		||||
              print "opening foreach1 \n";
 | 
			
		||||
              print "key is: $key \n";
 | 
			
		||||
              my @key_a=split(',', $key);
 | 
			
		||||
              print "a[0] is: $key_a[0] \n";
 | 
			
		||||
              print "a[1] is: $key_a[1] \n";
 | 
			
		||||
              if (! $iphash{$key_a[0]}) { next;}   
 | 
			
		||||
	      my $mon_nodes=$pPairHash->{$key};
 | 
			
		||||
 | 
			
		||||
	      foreach(@$mon_nodes)
 | 
			
		||||
	        { #opening foreach2
 | 
			
		||||
	          my $node=$_->[0];
 | 
			
		||||
	          my $nodetype=$_->[1];
 | 
			
		||||
                  print "node=$node, nodetype=$nodetype\n";
 | 
			
		||||
	          if (($nodetype) && ($nodetype =~ /$::NODETYPE_OSI/))
 | 
			
		||||
	           { 
 | 
			
		||||
                    push(@children,$node);
 | 
			
		||||
	           }
 | 
			
		||||
  	        } #closing foreach2
 | 
			
		||||
            }  #closing foreach1
 | 
			
		||||
          print "children:@children\n";
 | 
			
		||||
          my $rec = join(',',@children);
 | 
			
		||||
          print "the string is $rec";
 | 
			
		||||
     print "XCATBYPASS=Y $::XCATROOT/bin/xdsh  $rec /etc/init.d/pcp restart 2>& \n"; 
 | 
			
		||||
      my $result=`XCATBYPASS=Y $::XCATROOT/bin/xdsh  $rec /etc/init.d/pcp restart 2>&1`;
 | 
			
		||||
       if ($result)
 | 
			
		||||
        {
 | 
			
		||||
         if ($callback)
 | 
			
		||||
           {
 | 
			
		||||
            my $resp={};
 | 
			
		||||
            $resp->{data}->[0]="$localhost: $result\n";
 | 
			
		||||
            $callback->($resp);
 | 
			
		||||
           }
 | 
			
		||||
        else 
 | 
			
		||||
           {
 | 
			
		||||
            xCAT::MsgUtils->message('S', "[mon]: $result\n");
 | 
			
		||||
           }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      } #closing if scope
 | 
			
		||||
 | 
			
		||||
   if ($callback)
 | 
			
		||||
    {
 | 
			
		||||
     my $resp={};
 | 
			
		||||
     $resp->{data}->[0]="$localhost: started. \n";
 | 
			
		||||
     $callback->($resp);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return (0, "started");
 | 
			
		||||
 | 
			
		||||
 } # closing sub routine
 | 
			
		||||
#--------------------------------------------------------------
 | 
			
		||||
=head3    config
 | 
			
		||||
      This function configures the cluster for the given nodes. This function is called 
 | 
			
		||||
      when moncfg command is issued or when xcatd starts on the service node. 
 | 
			
		||||
       Returns: 1
 | 
			
		||||
=cut 
 | 
			
		||||
#--------------------------------------------------------------
 | 
			
		||||
sub config
 | 
			
		||||
   {
 | 
			
		||||
    return 1;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#--------------------------------------------------------------
 | 
			
		||||
=head3    deconfig
 | 
			
		||||
      	This function de-configures the cluster for the given nodes. This function is called 
 | 
			
		||||
	when mondecfg command is issued by the user. 
 | 
			
		||||
      Returns: 1
 | 
			
		||||
=cut 
 | 
			
		||||
#--------------------------------------------------------------
 | 
			
		||||
sub deconfig
 | 
			
		||||
   {
 | 
			
		||||
     return 1;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
=head3    stop
 | 
			
		||||
      This function gets called by the monitorctrl module when
 | 
			
		||||
      xcatd stops or when monstop command is issued by the user.
 | 
			
		||||
      It stops the monitoring on all nodes, stops
 | 
			
		||||
      the daemons and does necessary cleanup process for the
 | 
			
		||||
      PCP monitoring.
 | 
			
		||||
    Arguments:
 | 
			
		||||
       p_nodes -- a pointer to an arrays of nodes to be stoped for monitoring. null means all.
 | 
			
		||||
       scope -- the action scope, it indicates the node type the action will take place.
 | 
			
		||||
                0 means localhost only.
 | 
			
		||||
                2 means both monservers and nodes,
 | 
			
		||||
       callback -- the callback pointer for error and status displaying. It can be null.
 | 
			
		||||
    Returns:
 | 
			
		||||
      (return code, message)
 | 
			
		||||
      if the callback is set, use callback to display the status and error.
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub stop
 | 
			
		||||
    { # starting sub routine
 | 
			
		||||
            print "pcpmon::stop called\n";
 | 
			
		||||
      my $noderef=shift;
 | 
			
		||||
      if ($noderef =~ /xCAT_monitoring::pcpmon/)
 | 
			
		||||
        {
 | 
			
		||||
         $noderef=shift;
 | 
			
		||||
        }
 | 
			
		||||
      my $scope=shift;
 | 
			
		||||
      my $callback=shift;
 | 
			
		||||
 | 
			
		||||
        my $job="$::XCATROOT/sbin/pcp_collect";
 | 
			
		||||
  my ($code, $msg)=xCAT::Utils::remove_cron_job($job);
 | 
			
		||||
  my $localhostname=hostname(); 
 | 
			
		||||
  if ($code==0) { 
 | 
			
		||||
    if ($callback) {
 | 
			
		||||
      my $rsp={};
 | 
			
		||||
      $rsp->{data}->[0]="$localhostname: stopped.";
 | 
			
		||||
      $callback->($rsp);
 | 
			
		||||
    }
 | 
			
		||||
    #return (0, "stopped"); 
 | 
			
		||||
	}
 | 
			
		||||
  else {
 | 
			
		||||
    if ($callback) {
 | 
			
		||||
      my $rsp={};
 | 
			
		||||
      $rsp->{data}->[0]="$localhostname: $code  $msg";
 | 
			
		||||
      $callback->($rsp);
 | 
			
		||||
    }
 | 
			
		||||
    #return ($code, $msg); 
 | 
			
		||||
  } 
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
      my $localhost=hostname();
 | 
			
		||||
      print "local host is $localhost \n";
 | 
			
		||||
      print "stopping pcp locally \n";
 | 
			
		||||
      my $res_pcp = `/etc/init.d/pcp stop 2>&1`;
 | 
			
		||||
      print "res_pcp=$res_pcp\n";
 | 
			
		||||
      print "the result pcp before  is $? \n";
 | 
			
		||||
      if ($?)
 | 
			
		||||
       {
 | 
			
		||||
         print "pcp result after is $? \n";
 | 
			
		||||
         if ($callback)
 | 
			
		||||
            {
 | 
			
		||||
             my $resp={};
 | 
			
		||||
             $resp->{data}->[0]="$localhost: PCP not stopped successfully: $res_pcp \n";
 | 
			
		||||
             $callback->($resp);
 | 
			
		||||
            }
 | 
			
		||||
          else
 | 
			
		||||
           {
 | 
			
		||||
            xCAT::MsgUtils->message('S', "[mon]: $res_pcp \n");
 | 
			
		||||
           }
 | 
			
		||||
 | 
			
		||||
           return(1,"PCP not stopped successfully. \n");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
        if ($scope)
 | 
			
		||||
         { #opening if scope
 | 
			
		||||
           print "opening scope \n";
 | 
			
		||||
           print "noderef is: @$noderef \n";
 | 
			
		||||
           my $pPairHash=xCAT_monitoring::monitorctrl->getMonServer($noderef);
 | 
			
		||||
           print "pairhash: $pPairHash\n";
 | 
			
		||||
           #identification of this node
 | 
			
		||||
           my @hostinfo=xCAT::Utils->determinehostname();
 | 
			
		||||
           print "host:@hostinfo\n";
 | 
			
		||||
           my $isSV=xCAT::Utils->isServiceNode();
 | 
			
		||||
           print "is sv is:$isSV \n";
 | 
			
		||||
           my %iphash=();
 | 
			
		||||
           foreach(@hostinfo) {$iphash{$_}=1;}
 | 
			
		||||
           if (!$isSV) { $iphash{'noservicenode'}=1;}
 | 
			
		||||
 | 
			
		||||
           my @children;
 | 
			
		||||
           foreach my $key (keys (%$pPairHash))
 | 
			
		||||
            { #opening foreach1
 | 
			
		||||
              print "opening foreach1 \n";
 | 
			
		||||
              print "key is: $key \n";
 | 
			
		||||
              my @key_a=split(',', $key);
 | 
			
		||||
              print "a[1] is: $key_a[1] \n";
 | 
			
		||||
              if (! $iphash{$key_a[0]}) { next;}
 | 
			
		||||
              my $mon_nodes=$pPairHash->{$key};
 | 
			
		||||
 | 
			
		||||
              foreach(@$mon_nodes)
 | 
			
		||||
                { #opening foreach2
 | 
			
		||||
                  my $node=$_->[0];
 | 
			
		||||
                  my $nodetype=$_->[1];
 | 
			
		||||
                  print "node=$node, nodetype=$nodetype\n";
 | 
			
		||||
                  if (($nodetype) && ($nodetype =~ /$::NODETYPE_OSI/))
 | 
			
		||||
                   {
 | 
			
		||||
                    push(@children,$node);
 | 
			
		||||
                   }
 | 
			
		||||
                } #closing foreach2
 | 
			
		||||
            }  #closing foreach1
 | 
			
		||||
          print "children:@children\n";
 | 
			
		||||
          my $rec = join(',',@children);
 | 
			
		||||
          print "the string is $rec";
 | 
			
		||||
     print "XCATBYPASS=Y $::XCATROOT/bin/xdsh  $rec /etc/init.d/pcp stop 2>& \n";
 | 
			
		||||
       my $result=`XCATBYPASS=Y $::XCATROOT/bin/xdsh  $rec /etc/init.d/pcp stop 2>&1`;
 | 
			
		||||
       if ($result)
 | 
			
		||||
        {
 | 
			
		||||
         if ($callback)
 | 
			
		||||
           {
 | 
			
		||||
            my $resp={};
 | 
			
		||||
            $resp->{data}->[0]="$localhost: $result\n";
 | 
			
		||||
            $callback->($resp);
 | 
			
		||||
           }
 | 
			
		||||
        else
 | 
			
		||||
           {
 | 
			
		||||
            xCAT::MsgUtils->message('S', "[mon]: $result\n");
 | 
			
		||||
           }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      } #closing if scope
 | 
			
		||||
 | 
			
		||||
   if ($callback)
 | 
			
		||||
    {
 | 
			
		||||
     my $resp={};
 | 
			
		||||
     $resp->{data}->[0]="$localhost: stopped. \n";
 | 
			
		||||
     $callback->($resp);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 return (0, "stopped");
 | 
			
		||||
 }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
=head3    supportNodeStatusMon
 | 
			
		||||
    This function is called by the monitorctrl module to check
 | 
			
		||||
    if PCP can help monitoring and returning the node status.
 | 
			
		||||
    
 | 
			
		||||
    Arguments:
 | 
			
		||||
        none
 | 
			
		||||
    Returns:
 | 
			
		||||
         1  
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub supportNodeStatusMon {
 | 
			
		||||
  #print "pcpmon::supportNodeStatusMon called\n";
 | 
			
		||||
  return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
=head3   startNodeStatusMon
 | 
			
		||||
    This function is called by the monitorctrl module to tell
 | 
			
		||||
    PCP to start monitoring the node status and feed them back
 | 
			
		||||
    to xCAT. PCP will start setting up the condition/response 
 | 
			
		||||
    to monitor the node status changes.  
 | 
			
		||||
 | 
			
		||||
    Arguments:
 | 
			
		||||
       None.
 | 
			
		||||
    Returns:
 | 
			
		||||
        (return code, message)
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub startNodeStatusMon {
 | 
			
		||||
  #print "pcpmon::startNodeStatusMon called\n";
 | 
			
		||||
  return (0, "started");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
=head3   stopNodeStatusMon
 | 
			
		||||
    This function is called by the monitorctrl module to tell
 | 
			
		||||
    PCP to stop feeding the node status info back to xCAT. It will
 | 
			
		||||
    stop the condition/response that is monitoring the node status.
 | 
			
		||||
 | 
			
		||||
    Arguments:
 | 
			
		||||
        none
 | 
			
		||||
    Returns:
 | 
			
		||||
        (return code, message)
 | 
			
		||||
=cut
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub stopNodeStatusMon {
 | 
			
		||||
  #print "pcpmon::stopNodeStatusMon called\n";
 | 
			
		||||
  return (0, "stopped");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
=head3    getDiscription
 | 
			
		||||
      This function returns the detailed description of the plugin inluding the
 | 
			
		||||
     valid values for its settings in the monsetting tabel. 
 | 
			
		||||
     Arguments:
 | 
			
		||||
        none
 | 
			
		||||
    Returns:
 | 
			
		||||
        The description.
 | 
			
		||||
=cut
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub getDescription 
 | 
			
		||||
{
 | 
			
		||||
  return "Description: This plugin will help interface the xCAT cluster with PCP monitoring software 
 | 
			
		||||
       ping-interval:  the number of minutes between  the metric collection operation. 
 | 
			
		||||
        The default value is 5 \n ";
 | 
			
		||||
}
 | 
			
		||||
#!/usr/bin/env perl 
 | 
			
		||||
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
 | 
			
		||||
package xCAT_monitoring::pcpmon;
 | 
			
		||||
BEGIN
 | 
			
		||||
{
 | 
			
		||||
  $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat';
 | 
			
		||||
}
 | 
			
		||||
use lib "$::XCATROOT/lib/perl";
 | 
			
		||||
use xCAT::NodeRange;
 | 
			
		||||
use Sys::Hostname;
 | 
			
		||||
use Socket;
 | 
			
		||||
use xCAT::Utils;
 | 
			
		||||
use xCAT::GlobalDef;
 | 
			
		||||
use xCAT_monitoring::monitorctrl;
 | 
			
		||||
use xCAT::MsgUtils;
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
1;
 | 
			
		||||
 | 
			
		||||
#-------------------------------------------------------------------------------
 | 
			
		||||
=head1  xCAT_monitoring:pcpmon  
 | 
			
		||||
=head2    Package Description
 | 
			
		||||
  xCAT monitoring plugin package to handle PCP monitoring.
 | 
			
		||||
=cut
 | 
			
		||||
#-------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
=head3    start
 | 
			
		||||
      This function gets called by the monitorctrl module when xcatd starts and 
 | 
			
		||||
      when monstart command is issued by the user. It starts the daemons and 
 | 
			
		||||
      does necessary startup process for the PCP monitoring. 
 | 
			
		||||
       p_nodes -- a pointer to an arrays of nodes to be monitored. null means all.
 | 
			
		||||
       scope -- the action scope, it indicates the node type the action will take place.
 | 
			
		||||
                0 means localhost only.
 | 
			
		||||
                2 means both localhost and nodes,
 | 
			
		||||
       callback -- the callback pointer for error and status displaying. It can be null.
 | 
			
		||||
    Returns:
 | 
			
		||||
      (return code, message)
 | 
			
		||||
      if the callback is set, use callback to display the status and error.
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub start 
 | 
			
		||||
{ # starting sub routine
 | 
			
		||||
    print "pcp::start called\n";
 | 
			
		||||
    my $noderef=shift;
 | 
			
		||||
    if ($noderef =~ /xCAT_monitoring::pcpmon/)
 | 
			
		||||
    {
 | 
			
		||||
	$noderef=shift;
 | 
			
		||||
    }
 | 
			
		||||
    my $scope=shift;
 | 
			
		||||
    my $callback=shift;
 | 
			
		||||
    
 | 
			
		||||
    my $cmd="$::XCATROOT/sbin/pcp_collect";
 | 
			
		||||
    #figure out the ping-intercal setting
 | 
			
		||||
    my $value=5; #default
 | 
			
		||||
    my %settings=xCAT_monitoring::monitorctrl->getPluginSettings("pcpmon");
 | 
			
		||||
    
 | 
			
		||||
    my $reading=$settings{'ping-interval'};
 | 
			
		||||
    if ($reading>0) { $value=$reading;}
 | 
			
		||||
    
 | 
			
		||||
    #create the cron job, it will run the command every 5 minutes(default and can be changed).
 | 
			
		||||
    my $newentry;
 | 
			
		||||
    if (xCAT::Utils->isAIX()) {
 | 
			
		||||
	#AIX does not support */value format, have to list them all.
 | 
			
		||||
	my $minutes;
 | 
			
		||||
	if ($value==1) { $minutes='*';}
 | 
			
		||||
	elsif ($value<=30) {
 | 
			
		||||
	    my @temp_a=(0..59);
 | 
			
		||||
	    foreach (@temp_a) {
 | 
			
		||||
		if (($_ % $value) == 0) { $minutes .= "$_,";}
 | 
			
		||||
	    }
 | 
			
		||||
	    chop($minutes);
 | 
			
		||||
	} else {
 | 
			
		||||
	    $minutes="0";
 | 
			
		||||
	}
 | 
			
		||||
	$newentry="$minutes * * * * XCATROOT=$::XCATROOT PATH=$ENV{'PATH'} XCATCFG='$ENV{'XCATCFG'}' $cmd";
 | 
			
		||||
    } else {
 | 
			
		||||
	$newentry="*/$value * * * * XCATROOT=$::XCATROOT PATH=$ENV{'PATH'} XCATCFG='$ENV{'XCATCFG'}' $cmd";
 | 
			
		||||
    }
 | 
			
		||||
    my ($code, $msg)=xCAT::Utils::add_cron_job($newentry);
 | 
			
		||||
    my $localhostname=hostname(); 
 | 
			
		||||
    if ($code==0) { 
 | 
			
		||||
	if ($callback) {
 | 
			
		||||
	    my $rsp={};
 | 
			
		||||
	    $rsp->{data}->[0]="$localhostname: started. Refresh interval is $value minute(s)";
 | 
			
		||||
	    $callback->($rsp);
 | 
			
		||||
	}
 | 
			
		||||
	#return (0, "started"); 
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
	if ($callback) {
 | 
			
		||||
	    my $rsp={};
 | 
			
		||||
	    $rsp->{data}->[0]="$localhostname: $code  $msg";
 | 
			
		||||
	    $callback->($rsp);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	#return ($code, $msg);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    my $localhost=hostname();
 | 
			
		||||
    my $res_pcp = `/etc/init.d/pcp restart 2>&1`;
 | 
			
		||||
    if ($?)
 | 
			
		||||
    {
 | 
			
		||||
	if ($callback)
 | 
			
		||||
	{
 | 
			
		||||
	    my $resp={};
 | 
			
		||||
	    $resp->{data}->[0]="$localhost: PCP not started successfully: $res_pcp \n";
 | 
			
		||||
	    $callback->($resp);
 | 
			
		||||
	}  
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
            xCAT::MsgUtils->message('S', "[mon]: $res_pcp \n");
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	return(1,"PCP not started successfully. \n");
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    if ($scope)
 | 
			
		||||
    { #opening if scope
 | 
			
		||||
	my $pPairHash=xCAT_monitoring::monitorctrl->getMonServer($noderef);
 | 
			
		||||
        if (ref($pPairHash) eq 'ARRAY') {
 | 
			
		||||
	    if ($callback) {
 | 
			
		||||
		my $resp={};
 | 
			
		||||
		$resp->{data}->[0]=$pPairHash->[1];
 | 
			
		||||
		$callback->($resp);
 | 
			
		||||
	    } else {
 | 
			
		||||
		xCAT::MsgUtils->message('S', "[mon]: " . $pPairHash->[1]);
 | 
			
		||||
	    }
 | 
			
		||||
	    return (1, "");	
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	#identification of this node
 | 
			
		||||
	my @hostinfo=xCAT::Utils->determinehostname();
 | 
			
		||||
	my $isSV=xCAT::Utils->isServiceNode();
 | 
			
		||||
	my %iphash=();	
 | 
			
		||||
	foreach(@hostinfo) {$iphash{$_}=1;}
 | 
			
		||||
	if (!$isSV) { $iphash{'noservicenode'}=1;}
 | 
			
		||||
        
 | 
			
		||||
	my @children;
 | 
			
		||||
	foreach my $key (keys (%$pPairHash))
 | 
			
		||||
	{ #opening foreach1
 | 
			
		||||
	    my @key_a=split(':', $key);
 | 
			
		||||
	    if (! $iphash{$key_a[0]}) {  next; }
 | 
			
		||||
	    my $mon_nodes=$pPairHash->{$key};
 | 
			
		||||
    
 | 
			
		||||
	    foreach(@$mon_nodes)
 | 
			
		||||
	    { #opening foreach2
 | 
			
		||||
		my $node=$_->[0];
 | 
			
		||||
		my $nodetype=$_->[1];
 | 
			
		||||
		if (($nodetype) && ($nodetype =~ /$::NODETYPE_OSI/))
 | 
			
		||||
		{ 
 | 
			
		||||
                    push(@children,$node);
 | 
			
		||||
		}
 | 
			
		||||
	    } #closing foreach2
 | 
			
		||||
	}  #closing foreach1
 | 
			
		||||
	my $rec = join(',',@children);
 | 
			
		||||
	my $result=`XCATBYPASS=Y $::XCATROOT/bin/xdsh  $rec /etc/init.d/pcp restart 2>&1`;
 | 
			
		||||
	if ($result)
 | 
			
		||||
        {
 | 
			
		||||
	    if ($callback)
 | 
			
		||||
	    {
 | 
			
		||||
		my $resp={};
 | 
			
		||||
		$resp->{data}->[0]="$localhost: $result\n";
 | 
			
		||||
		$callback->($resp);
 | 
			
		||||
	    }
 | 
			
		||||
	    else 
 | 
			
		||||
	    {
 | 
			
		||||
		xCAT::MsgUtils->message('S', "[mon]: $result\n");
 | 
			
		||||
	    }
 | 
			
		||||
        }
 | 
			
		||||
	
 | 
			
		||||
    } #closing if scope
 | 
			
		||||
    
 | 
			
		||||
    if ($callback)
 | 
			
		||||
    {
 | 
			
		||||
	my $resp={};
 | 
			
		||||
	$resp->{data}->[0]="$localhost: started. \n";
 | 
			
		||||
	$callback->($resp);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    return (0, "started");
 | 
			
		||||
    
 | 
			
		||||
} # closing sub routine
 | 
			
		||||
#--------------------------------------------------------------
 | 
			
		||||
=head3    config
 | 
			
		||||
      This function configures the cluster for the given nodes. This function is called 
 | 
			
		||||
      when moncfg command is issued or when xcatd starts on the service node. 
 | 
			
		||||
       Returns: 1
 | 
			
		||||
=cut 
 | 
			
		||||
#--------------------------------------------------------------
 | 
			
		||||
sub config
 | 
			
		||||
   {
 | 
			
		||||
    return 1;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#--------------------------------------------------------------
 | 
			
		||||
=head3    deconfig
 | 
			
		||||
      	This function de-configures the cluster for the given nodes. This function is called 
 | 
			
		||||
	when mondecfg command is issued by the user. 
 | 
			
		||||
      Returns: 1
 | 
			
		||||
=cut 
 | 
			
		||||
#--------------------------------------------------------------
 | 
			
		||||
sub deconfig
 | 
			
		||||
   {
 | 
			
		||||
     return 1;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
=head3    stop
 | 
			
		||||
      This function gets called by the monitorctrl module when
 | 
			
		||||
      xcatd stops or when monstop command is issued by the user.
 | 
			
		||||
      It stops the monitoring on all nodes, stops
 | 
			
		||||
      the daemons and does necessary cleanup process for the
 | 
			
		||||
      PCP monitoring.
 | 
			
		||||
    Arguments:
 | 
			
		||||
       p_nodes -- a pointer to an arrays of nodes to be stoped for monitoring. null means all.
 | 
			
		||||
       scope -- the action scope, it indicates the node type the action will take place.
 | 
			
		||||
                0 means localhost only.
 | 
			
		||||
                2 means both monservers and nodes,
 | 
			
		||||
       callback -- the callback pointer for error and status displaying. It can be null.
 | 
			
		||||
    Returns:
 | 
			
		||||
      (return code, message)
 | 
			
		||||
      if the callback is set, use callback to display the status and error.
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub stop
 | 
			
		||||
    { # starting sub routine
 | 
			
		||||
            print "pcpmon::stop called\n";
 | 
			
		||||
      my $noderef=shift;
 | 
			
		||||
      if ($noderef =~ /xCAT_monitoring::pcpmon/)
 | 
			
		||||
        {
 | 
			
		||||
         $noderef=shift;
 | 
			
		||||
        }
 | 
			
		||||
      my $scope=shift;
 | 
			
		||||
      my $callback=shift;
 | 
			
		||||
 | 
			
		||||
        my $job="$::XCATROOT/sbin/pcp_collect";
 | 
			
		||||
  my ($code, $msg)=xCAT::Utils::remove_cron_job($job);
 | 
			
		||||
  my $localhostname=hostname(); 
 | 
			
		||||
  if ($code==0) { 
 | 
			
		||||
    if ($callback) {
 | 
			
		||||
      my $rsp={};
 | 
			
		||||
      $rsp->{data}->[0]="$localhostname: stopped.";
 | 
			
		||||
      $callback->($rsp);
 | 
			
		||||
    }
 | 
			
		||||
    #return (0, "stopped"); 
 | 
			
		||||
	}
 | 
			
		||||
  else {
 | 
			
		||||
    if ($callback) {
 | 
			
		||||
      my $rsp={};
 | 
			
		||||
      $rsp->{data}->[0]="$localhostname: $code  $msg";
 | 
			
		||||
      $callback->($rsp);
 | 
			
		||||
    }
 | 
			
		||||
    #return ($code, $msg); 
 | 
			
		||||
  } 
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
      my $localhost=hostname();
 | 
			
		||||
      my $res_pcp = `/etc/init.d/pcp stop 2>&1`;
 | 
			
		||||
      if ($?)
 | 
			
		||||
       {
 | 
			
		||||
         if ($callback)
 | 
			
		||||
            {
 | 
			
		||||
             my $resp={};
 | 
			
		||||
             $resp->{data}->[0]="$localhost: PCP not stopped successfully: $res_pcp \n";
 | 
			
		||||
             $callback->($resp);
 | 
			
		||||
            }
 | 
			
		||||
          else
 | 
			
		||||
           {
 | 
			
		||||
            xCAT::MsgUtils->message('S', "[mon]: $res_pcp \n");
 | 
			
		||||
           }
 | 
			
		||||
 | 
			
		||||
           return(1,"PCP not stopped successfully. \n");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
        if ($scope)
 | 
			
		||||
         { #opening if scope
 | 
			
		||||
           my $pPairHash=xCAT_monitoring::monitorctrl->getMonServer($noderef);
 | 
			
		||||
	   if (ref($pPairHash) eq 'ARRAY') {
 | 
			
		||||
	       if ($callback) {
 | 
			
		||||
		   my $resp={};
 | 
			
		||||
		   $resp->{data}->[0]=$pPairHash->[1];
 | 
			
		||||
		   $callback->($resp);
 | 
			
		||||
	       } else {
 | 
			
		||||
		   xCAT::MsgUtils->message('S', "[mon]: " . $pPairHash->[1]);
 | 
			
		||||
	       }
 | 
			
		||||
	       return (1, "");	
 | 
			
		||||
	   }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
           #identification of this node
 | 
			
		||||
           my @hostinfo=xCAT::Utils->determinehostname();
 | 
			
		||||
           my $isSV=xCAT::Utils->isServiceNode();
 | 
			
		||||
           my %iphash=();
 | 
			
		||||
           foreach(@hostinfo) {$iphash{$_}=1;}
 | 
			
		||||
           if (!$isSV) { $iphash{'noservicenode'}=1;}
 | 
			
		||||
 | 
			
		||||
           my @children;
 | 
			
		||||
           foreach my $key (keys (%$pPairHash))
 | 
			
		||||
            { #opening foreach1
 | 
			
		||||
              my @key_a=split(':', $key);
 | 
			
		||||
	      if (! $iphash{$key_a[0]}) {  next; }
 | 
			
		||||
              my $mon_nodes=$pPairHash->{$key};
 | 
			
		||||
 | 
			
		||||
              foreach(@$mon_nodes)
 | 
			
		||||
                { #opening foreach2
 | 
			
		||||
                  my $node=$_->[0];
 | 
			
		||||
                  my $nodetype=$_->[1];
 | 
			
		||||
                  if (($nodetype) && ($nodetype =~ /$::NODETYPE_OSI/))
 | 
			
		||||
                   {
 | 
			
		||||
                    push(@children,$node);
 | 
			
		||||
                   }
 | 
			
		||||
                } #closing foreach2
 | 
			
		||||
            }  #closing foreach1
 | 
			
		||||
          my $rec = join(',',@children);
 | 
			
		||||
       my $result=`XCATBYPASS=Y $::XCATROOT/bin/xdsh  $rec /etc/init.d/pcp stop 2>&1`;
 | 
			
		||||
       if ($result)
 | 
			
		||||
        {
 | 
			
		||||
         if ($callback)
 | 
			
		||||
           {
 | 
			
		||||
            my $resp={};
 | 
			
		||||
            $resp->{data}->[0]="$localhost: $result\n";
 | 
			
		||||
            $callback->($resp);
 | 
			
		||||
           }
 | 
			
		||||
        else
 | 
			
		||||
           {
 | 
			
		||||
            xCAT::MsgUtils->message('S', "[mon]: $result\n");
 | 
			
		||||
           }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      } #closing if scope
 | 
			
		||||
 | 
			
		||||
   if ($callback)
 | 
			
		||||
    {
 | 
			
		||||
     my $resp={};
 | 
			
		||||
     $resp->{data}->[0]="$localhost: stopped. \n";
 | 
			
		||||
     $callback->($resp);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 return (0, "stopped");
 | 
			
		||||
 }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
=head3    supportNodeStatusMon
 | 
			
		||||
    This function is called by the monitorctrl module to check
 | 
			
		||||
    if PCP can help monitoring and returning the node status.
 | 
			
		||||
    
 | 
			
		||||
    Arguments:
 | 
			
		||||
        none
 | 
			
		||||
    Returns:
 | 
			
		||||
         1  
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub supportNodeStatusMon {
 | 
			
		||||
  #print "pcpmon::supportNodeStatusMon called\n";
 | 
			
		||||
  return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
=head3   startNodeStatusMon
 | 
			
		||||
    This function is called by the monitorctrl module to tell
 | 
			
		||||
    PCP to start monitoring the node status and feed them back
 | 
			
		||||
    to xCAT. PCP will start setting up the condition/response 
 | 
			
		||||
    to monitor the node status changes.  
 | 
			
		||||
 | 
			
		||||
    Arguments:
 | 
			
		||||
       None.
 | 
			
		||||
    Returns:
 | 
			
		||||
        (return code, message)
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub startNodeStatusMon {
 | 
			
		||||
  #print "pcpmon::startNodeStatusMon called\n";
 | 
			
		||||
  return (0, "started");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
=head3   stopNodeStatusMon
 | 
			
		||||
    This function is called by the monitorctrl module to tell
 | 
			
		||||
    PCP to stop feeding the node status info back to xCAT. It will
 | 
			
		||||
    stop the condition/response that is monitoring the node status.
 | 
			
		||||
 | 
			
		||||
    Arguments:
 | 
			
		||||
        none
 | 
			
		||||
    Returns:
 | 
			
		||||
        (return code, message)
 | 
			
		||||
=cut
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub stopNodeStatusMon {
 | 
			
		||||
  #print "pcpmon::stopNodeStatusMon called\n";
 | 
			
		||||
  return (0, "stopped");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
=head3    getDiscription
 | 
			
		||||
      This function returns the detailed description of the plugin inluding the
 | 
			
		||||
     valid values for its settings in the monsetting tabel. 
 | 
			
		||||
     Arguments:
 | 
			
		||||
        none
 | 
			
		||||
    Returns:
 | 
			
		||||
        The description.
 | 
			
		||||
=cut
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub getDescription 
 | 
			
		||||
{
 | 
			
		||||
  return "Description: This plugin will help interface the xCAT cluster with PCP monitoring software 
 | 
			
		||||
       ping-interval:  the number of minutes between  the metric collection operation. 
 | 
			
		||||
        The default value is 5 \n ";
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,7 @@ BEGIN
 | 
			
		||||
use lib "$::XCATROOT/lib/perl";
 | 
			
		||||
use strict;
 | 
			
		||||
use xCAT_monitoring::monitorctrl;
 | 
			
		||||
use xCAT::Utils;
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
#-------------------------------------------------------------------------------
 | 
			
		||||
@@ -101,12 +102,22 @@ sub start {
 | 
			
		||||
    foreach(@hostinfo) {$iphash{$_}=1;}
 | 
			
		||||
    if (!$isSV) { $iphash{'noservicenode'}=1;}
 | 
			
		||||
    my $pPairHash=xCAT_monitoring::monitorctrl->getMonServer($noderef);
 | 
			
		||||
    if (ref($pPairHash) eq 'ARRAY') {
 | 
			
		||||
	if ($callback) {
 | 
			
		||||
	    my $resp={};
 | 
			
		||||
	    $resp->{data}->[0]=$pPairHash->[1];
 | 
			
		||||
	    $callback->($resp);
 | 
			
		||||
	} else {
 | 
			
		||||
	    xCAT::MsgUtils->message('S', "[mon]: " . $pPairHash->[1]);
 | 
			
		||||
	}
 | 
			
		||||
	return (1, "");	
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $key (keys(%$pPairHash)) {
 | 
			
		||||
      my @key_a=split(',', $key);
 | 
			
		||||
      if (! $iphash{$key_a[0]}) { next;} 
 | 
			
		||||
  
 | 
			
		||||
      my @key_a=split(':', $key);
 | 
			
		||||
      if (! $iphash{$key_a[0]}) {  next; }
 | 
			
		||||
      my $mon_nodes=$pPairHash->{$key};
 | 
			
		||||
 | 
			
		||||
      foreach(@$mon_nodes) {
 | 
			
		||||
        my $node_info=$_;
 | 
			
		||||
        print "    node=$node_info->[0], nodetype=$node_info->[1], status=$node_info->[2]\n";
 | 
			
		||||
@@ -159,12 +170,22 @@ sub stop {
 | 
			
		||||
    foreach(@hostinfo) {$iphash{$_}=1;}
 | 
			
		||||
    if (!$isSV) { $iphash{'noservicenode'}=1;}
 | 
			
		||||
    my $pPairHash=xCAT_monitoring::monitorctrl->getMonServer($noderef);
 | 
			
		||||
    if (ref($pPairHash) eq 'ARRAY') {
 | 
			
		||||
	if ($callback) {
 | 
			
		||||
	    my $resp={};
 | 
			
		||||
	    $resp->{data}->[0]=$pPairHash->[1];
 | 
			
		||||
	    $callback->($resp);
 | 
			
		||||
	} else {
 | 
			
		||||
	    xCAT::MsgUtils->message('S', "[mon]: " . $pPairHash->[1]);
 | 
			
		||||
	}
 | 
			
		||||
	return (1, "");	
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $key (keys(%$pPairHash)) {
 | 
			
		||||
      my @key_a=split(',', $key);
 | 
			
		||||
      if (! $iphash{$key_a[0]}) { next;} 
 | 
			
		||||
  
 | 
			
		||||
      my @key_a=split(':', $key); 
 | 
			
		||||
      if (! $iphash{$key_a[0]}) {  next; }
 | 
			
		||||
      my $mon_nodes=$pPairHash->{$key};
 | 
			
		||||
 | 
			
		||||
      foreach(@$mon_nodes) {
 | 
			
		||||
        my $node_info=$_;
 | 
			
		||||
        print "    node=$node_info->[0], nodetype=$node_info->[1], status=$node_info->[2]\n";
 | 
			
		||||
@@ -373,6 +394,7 @@ sub getDescription {
 | 
			
		||||
      node ip/hostname that faces the cn. 
 | 
			
		||||
      The value of the first one can be "noservicenode" meaning that there is no service node 
 | 
			
		||||
      for that node. In this case the second one is the site master. 
 | 
			
		||||
      It returns a pointer to an array if there is an error. Format is [code, message].
 | 
			
		||||
=cut
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub getNodesMonServers
 | 
			
		||||
 
 | 
			
		||||
@@ -368,6 +368,19 @@ sub configBMC {
 | 
			
		||||
  if (!$isSV) { $iphash{'noservicenode'}=1;}
 | 
			
		||||
 
 | 
			
		||||
  my $pPairHash=xCAT_monitoring::monitorctrl->getNodeMonServerPair($noderef, 0);
 | 
			
		||||
  if (ref($pPairHash) eq 'ARRAY') { 
 | 
			
		||||
      if ($callback) {
 | 
			
		||||
	  my $rsp={};
 | 
			
		||||
	  if ($ret_val) {
 | 
			
		||||
	      $rsp->{data}->[0]=$pPairHash->[1];
 | 
			
		||||
	  } 
 | 
			
		||||
	  $callback->($rsp);
 | 
			
		||||
      } else {
 | 
			
		||||
	  xCAT::MsgUtils->message('S', "[mon]: " . $pPairHash->[1]);
 | 
			
		||||
      } 
 | 
			
		||||
      return (0, "");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
  my %masterhash=();
 | 
			
		||||
  my @node_a=();
 | 
			
		||||
@@ -381,7 +394,7 @@ sub configBMC {
 | 
			
		||||
        if (! exists($pPairHash->{$node})) {next;}
 | 
			
		||||
        
 | 
			
		||||
        my $pairs=$pPairHash->{$node};
 | 
			
		||||
        my @a_temp=split(',',$pairs); 
 | 
			
		||||
        my @a_temp=split(':',$pairs); 
 | 
			
		||||
        my $monserver=$a_temp[0];
 | 
			
		||||
        my $master=$a_temp[1];
 | 
			
		||||
 | 
			
		||||
@@ -510,8 +523,21 @@ sub configMPA {
 | 
			
		||||
        $mpa_hash{$mpa}=1;
 | 
			
		||||
        
 | 
			
		||||
        my $pHash=xCAT_monitoring::monitorctrl->getNodeMonServerPair([$mpa], 0);
 | 
			
		||||
	if (ref($pHash) eq 'ARRAY') { 
 | 
			
		||||
	    if ($callback) {
 | 
			
		||||
		my $rsp={};
 | 
			
		||||
		if ($ret_val) {
 | 
			
		||||
		    $rsp->{data}->[0]=$pHash->[1];
 | 
			
		||||
		} 
 | 
			
		||||
		$callback->($rsp);
 | 
			
		||||
	    } else {
 | 
			
		||||
		xCAT::MsgUtils->message('S', "[mon]: " . $pHash->[1]);
 | 
			
		||||
	    } 
 | 
			
		||||
	    return (0, "");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
        my $pairs=$pHash->{$mpa}; 
 | 
			
		||||
        my @a_temp=split(',',$pairs); 
 | 
			
		||||
        my @a_temp=split(':',$pairs); 
 | 
			
		||||
        my $monserver=$a_temp[0];
 | 
			
		||||
        my $master=$a_temp[1];
 | 
			
		||||
 | 
			
		||||
@@ -791,6 +817,7 @@ sub getDescription {
 | 
			
		||||
      node ip/hostname that faces the cn. 
 | 
			
		||||
      The value of the first one can be "noservicenode" meaning that there is no service node 
 | 
			
		||||
      for that node. In this case the second one is the site master. 
 | 
			
		||||
      It retuens a pointer to an array if there is an error. Format is [code, message].
 | 
			
		||||
=cut
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub getNodesMonServers
 | 
			
		||||
@@ -806,6 +833,11 @@ sub getNodesMonServers
 | 
			
		||||
  my $localhostname=hostname();
 | 
			
		||||
  my $pPairHash=xCAT_monitoring::monitorctrl->getNodeMonServerPair($noderef, 0);
 | 
			
		||||
 | 
			
		||||
  if (ref($pPairHash) eq 'ARRAY') { 
 | 
			
		||||
      return $pPairHash;               
 | 
			
		||||
  } 
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  #check for blades, only returns the MPAs and their monservers
 | 
			
		||||
  my %mpa_hash=();
 | 
			
		||||
  my $table=xCAT::Table->new("mp");
 | 
			
		||||
@@ -827,6 +859,10 @@ sub getNodesMonServers
 | 
			
		||||
          $pairs=$pPairHash->{$mpa}; 
 | 
			
		||||
        } else {
 | 
			
		||||
          my $pHash=xCAT_monitoring::monitorctrl->getNodeMonServerPair([$mpa], 0);
 | 
			
		||||
	  if (ref($pHash) eq 'ARRAY') { 
 | 
			
		||||
	      return $pHash;               
 | 
			
		||||
	  } 
 | 
			
		||||
 | 
			
		||||
          $pairs=$pHash->{$mpa};
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -283,6 +283,12 @@ sub getMonNodesStatus {
 | 
			
		||||
  my @unknown_nodes=();
 | 
			
		||||
 | 
			
		||||
  my $hierachy=xCAT_monitoring::monitorctrl->getMonHierarchy();
 | 
			
		||||
  if (ref($hierachy) eq 'ARRAY') {
 | 
			
		||||
      xCAT::MsgUtils->message('S', "[mon]: " . $hierachy->[1]);
 | 
			
		||||
      return %status;	
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
  my @mon_servers=keys(%$hierachy); 
 | 
			
		||||
  my $isSV=xCAT::Utils->isServiceNode(); 
 | 
			
		||||
  
 | 
			
		||||
 
 | 
			
		||||
@@ -97,7 +97,16 @@ sub preprocess_request
 | 
			
		||||
      } else {
 | 
			
		||||
        $mon_hierachy=xCAT_monitoring::monitorctrl->getNodeMonServerPair($allnodes, 1);
 | 
			
		||||
      }
 | 
			
		||||
      
 | 
			
		||||
      if (ref($mon_hierachy) eq 'ARRAY') { 
 | 
			
		||||
          my $rsp2={};
 | 
			
		||||
          $rsp2->{data}->[0]=$mon_hierachy->[1];
 | 
			
		||||
          $callback->($rsp2);
 | 
			
		||||
	  $req = {};
 | 
			
		||||
	  return;               
 | 
			
		||||
      } 
 | 
			
		||||
 | 
			
		||||
     
 | 
			
		||||
      my @mon_servers=keys(%$mon_hierachy); 
 | 
			
		||||
      my @hostinfo=xCAT::Utils->determinehostname();
 | 
			
		||||
      #print "hostinfo=@hostinfo\n";
 | 
			
		||||
@@ -109,7 +118,7 @@ sub preprocess_request
 | 
			
		||||
      foreach (@mon_servers) {
 | 
			
		||||
        #service node come in pairs, the first one is the monserver adapter that facing the mn,
 | 
			
		||||
        # the second one is facing the cn. we use the first one here
 | 
			
		||||
        my @server_pair=split(',', $_); 
 | 
			
		||||
        my @server_pair=split(':', $_); 
 | 
			
		||||
        my $sv=$server_pair[0];
 | 
			
		||||
        my $mon_nodes=$mon_hierachy->{$_};
 | 
			
		||||
        if ((!$mon_nodes) || (@$mon_nodes ==0)) { next; }
 | 
			
		||||
@@ -117,12 +126,11 @@ sub preprocess_request
 | 
			
		||||
 | 
			
		||||
        my $reqcopy = {%$req};
 | 
			
		||||
	if (! $iphash{$sv}) {
 | 
			
		||||
	  if ($isSV) { next; } #if the command is issued on the monserver, 
 | 
			
		||||
                              # only handle its children.
 | 
			
		||||
          $reqcopy->{'_xcatdest'}=$sv;
 | 
			
		||||
          my $rsp2={};
 | 
			
		||||
          $rsp2->{data}->[0]="sending request to $sv...";
 | 
			
		||||
          $callback->($rsp2);
 | 
			
		||||
	  if ($isSV) { next; } #if the command is issued on the monserver, only handle its children.
 | 
			
		||||
	  $reqcopy->{'_xcatdest'}=$sv;
 | 
			
		||||
	  my $rsp2={};
 | 
			
		||||
	  $rsp2->{data}->[0]="sending request to $sv...";
 | 
			
		||||
	  $callback->($rsp2);
 | 
			
		||||
        } 
 | 
			
		||||
 | 
			
		||||
        push @{$reqcopy->{module}}, $a_ret[1];
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user