added synamic handling for node changes in the monitoring plug-in infrastructure. renamed the startmon to monstart, stopmon to monstop, lsmon to monls and added monaddnode and monrmnode commands
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@868 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
		@@ -1,18 +1,18 @@
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 
 | 
			
		||||
B<lsmon> - Lists monitoring plug-in modules that can be used to monitor the xCAT cluster.
 | 
			
		||||
B<monls> - Lists monitoring plug-in modules that can be used to monitor the xCAT cluster.
 | 
			
		||||
 | 
			
		||||
  
 | 
			
		||||
 
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 
 | 
			
		||||
I<lsmon [-h| --help]>
 | 
			
		||||
I<monls [-h| --help]>
 | 
			
		||||
 | 
			
		||||
I<lsmon  [-v| --version]>
 | 
			
		||||
I<monls  [-v| --version]>
 | 
			
		||||
 | 
			
		||||
I<lsmon I<name> [-d|--description]> 
 | 
			
		||||
I<monls I<name> [-d|--description]> 
 | 
			
		||||
 | 
			
		||||
I<lsmon [-a|--all] [-d|--description]> 
 | 
			
		||||
I<monls [-a|--all] [-d|--description]> 
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
@@ -49,7 +49,7 @@ B<-V | -verbose>       Verbose output.
 | 
			
		||||
 | 
			
		||||
1. To list the status of all the monitoring plug-in modules from the I<monitoring> table, enter:
 | 
			
		||||
 | 
			
		||||
  lsmon 
 | 
			
		||||
  monls 
 | 
			
		||||
 | 
			
		||||
The output looks like this:
 | 
			
		||||
  xcatmon         monitored       node-status-monitored
 | 
			
		||||
@@ -57,7 +57,7 @@ The output looks like this:
 | 
			
		||||
 | 
			
		||||
2. To list the status of all the monitoring plug-in modules including the ones that are not in the monitoring table, enter
 | 
			
		||||
 | 
			
		||||
  lsmon -a
 | 
			
		||||
  monls -a
 | 
			
		||||
 | 
			
		||||
The output looks like this:
 | 
			
		||||
  xcatmon         monitored       node-status-monitored
 | 
			
		||||
@@ -69,17 +69,17 @@ The output looks like this:
 | 
			
		||||
 | 
			
		||||
3. To list the status and the desciption for I<snmpmon> module, enter:
 | 
			
		||||
 | 
			
		||||
  lsmon snmpmon -d
 | 
			
		||||
  monls snmpmon -d
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=head1 FILES 
 | 
			
		||||
 
 | 
			
		||||
/opt/xcat/bin/lsmon
 | 
			
		||||
/opt/xcat/bin/monls
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=head1 NOTES
 | 
			
		||||
 | 
			
		||||
See stopmon startmon
 | 
			
		||||
See monstart monstop
 | 
			
		||||
 | 
			
		||||
This command is part of the xCAT software product.
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,17 +1,17 @@
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 
 | 
			
		||||
B<startmon> - Starts a plug-in module to monitor the xCAT cluster.
 | 
			
		||||
B<monstart> - Starts a plug-in module to monitor the xCAT cluster.
 | 
			
		||||
 | 
			
		||||
  
 | 
			
		||||
 
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 
 | 
			
		||||
I<startmon [-h| --help]>
 | 
			
		||||
I<monstart [-h| --help]>
 | 
			
		||||
 | 
			
		||||
I<startmon  [-v| --version]>
 | 
			
		||||
I<monstart  [-v| --version]>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
I<startmon I<name> [-n|--nodestatmon] [-s|--settings settings]> 
 | 
			
		||||
I<monstart I<name> [-n|--nodestatmon] [-s|--settings settings]> 
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
@@ -49,27 +49,27 @@ B<-V | -verbose>       Verbose output.
 | 
			
		||||
 | 
			
		||||
1. To start gangliamon plug-in module (which interacts with Ganglia monitoring software) to monitor the xCAT cluster, enter:
 | 
			
		||||
 | 
			
		||||
  startmon gangliamon
 | 
			
		||||
  monstart gangliamon
 | 
			
		||||
 | 
			
		||||
2. To start rmcmon plug-in module (which interacts with IBM's RSCT monitoring software) to monitor the xCAT cluster and have it feed the node liveness status to xCAT's I<nodelist> table, enter:
 | 
			
		||||
 | 
			
		||||
  startmon rmcmon -n 
 | 
			
		||||
  monstart rmcmon -n 
 | 
			
		||||
 | 
			
		||||
3. To start xcatmon plug-in module to feed the node liveness status to xCAT's I<nodelist> table, enter:
 | 
			
		||||
 | 
			
		||||
  startmon rmcmon -n -s [ping-interval=2]
 | 
			
		||||
  monstart rmcmon -n -s [ping-interval=2]
 | 
			
		||||
where 2 is the number of minutes between the pings.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=head1 FILES 
 | 
			
		||||
 
 | 
			
		||||
/opt/xcat/bin/startmon
 | 
			
		||||
/opt/xcat/bin/monstart
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=head1 NOTES
 | 
			
		||||
 | 
			
		||||
See stopmon lsmon
 | 
			
		||||
See monstop monls
 | 
			
		||||
 | 
			
		||||
This command is part of the xCAT software product.
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,16 +1,16 @@
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 
 | 
			
		||||
B<stopmon> -  Stops a monitoring plug-in module to monitor the xCAT cluster.
 | 
			
		||||
B<monstop> -  Stops a monitoring plug-in module to monitor the xCAT cluster.
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 
 | 
			
		||||
I<stopmon [-h| --help]>
 | 
			
		||||
I<monstop [-h| --help]>
 | 
			
		||||
 | 
			
		||||
I<stopmon  [-v| --version]>
 | 
			
		||||
I<monstop  [-v| --version]>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
I<stopmon name>
 | 
			
		||||
I<monstop name>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
@@ -41,7 +41,7 @@ B<-V | -verbose>       Verbose output.
 | 
			
		||||
 | 
			
		||||
1.To stop gangliamon plug-in module (which interacts with Ganglia monitoring software) to monitor the xCAT cluster, enter:
 | 
			
		||||
 | 
			
		||||
  stopmon gangliamon
 | 
			
		||||
  monstop gangliamon
 | 
			
		||||
 | 
			
		||||
Please note that gangliamon must have been registered in the xCAT I<monitoring> table. For a list of registered plug-in modules, use command I<tabdump monitoring>. 
 | 
			
		||||
 | 
			
		||||
@@ -49,12 +49,12 @@ Please note that gangliamon must have been registered in the xCAT I<monitoring>
 | 
			
		||||
 | 
			
		||||
=head1 FILES 
 | 
			
		||||
 
 | 
			
		||||
/opt/xcat/bin/stopmon
 | 
			
		||||
/opt/xcat/bin/monstop
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=head1 NOTES
 | 
			
		||||
 | 
			
		||||
See startmon
 | 
			
		||||
See monstart monls
 | 
			
		||||
 | 
			
		||||
This command is part of the xCAT software product.
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -134,10 +134,12 @@ ln -sf ../bin/xcatclientnnr $RPM_BUILD_ROOT/%{prefix}/sbin/makenetworks
 | 
			
		||||
ln -sf ../bin/xcatclientnnr $RPM_BUILD_ROOT/%{prefix}/sbin/copycds
 | 
			
		||||
ln -sf ../bin/xcatclientnnr $RPM_BUILD_ROOT/%{prefix}/bin/regnotif
 | 
			
		||||
ln -sf ../bin/xcatclientnnr $RPM_BUILD_ROOT/%{prefix}/bin/unregnotif
 | 
			
		||||
ln -sf ../bin/xcatclientnnr $RPM_BUILD_ROOT/%{prefix}/bin/startmon
 | 
			
		||||
ln -sf ../bin/xcatclientnnr $RPM_BUILD_ROOT/%{prefix}/bin/stopmon
 | 
			
		||||
ln -sf ../bin/xcatclientnnr $RPM_BUILD_ROOT/%{prefix}/bin/updatemon
 | 
			
		||||
ln -sf ../bin/xcatclientnnr $RPM_BUILD_ROOT/%{prefix}/bin/lsmon
 | 
			
		||||
ln -sf ../bin/xcatclientnnr $RPM_BUILD_ROOT/%{prefix}/bin/monstart
 | 
			
		||||
ln -sf ../bin/xcatclientnnr $RPM_BUILD_ROOT/%{prefix}/bin/monstop
 | 
			
		||||
ln -sf ../bin/xcatclientnnr $RPM_BUILD_ROOT/%{prefix}/bin/monls
 | 
			
		||||
ln -sf ../bin/xcatclientnnr $RPM_BUILD_ROOT/%{prefix}/sbin/monupdate
 | 
			
		||||
ln -sf ../bin/xcatclientnnr $RPM_BUILD_ROOT/%{prefix}/sbin/monaddnode
 | 
			
		||||
ln -sf ../bin/xcatclientnnr $RPM_BUILD_ROOT/%{prefix}/sbin/monrmnode
 | 
			
		||||
ln -sf ../bin/xcatDBcmds $RPM_BUILD_ROOT/%{prefix}/bin/mkdef
 | 
			
		||||
ln -sf ../bin/xcatDBcmds $RPM_BUILD_ROOT/%{prefix}/bin/chdef
 | 
			
		||||
ln -sf ../bin/xcatDBcmds $RPM_BUILD_ROOT/%{prefix}/bin/lsdef
 | 
			
		||||
 
 | 
			
		||||
@@ -264,13 +264,11 @@ sub stopNodeStatusMon {
 | 
			
		||||
=head3    addNodes
 | 
			
		||||
      This function adds the nodes into the RMC cluster.
 | 
			
		||||
    Arguments:
 | 
			
		||||
      nodes --nodes to be added. It is 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', 'active'], ['node2', 'switch', 'booting']...], ...} 
 | 
			
		||||
      verbose -- verbose mode. 1 for yes, 0 for no.
 | 
			
		||||
      nodes --nodes to be added. It is a pointer to an array with each element
 | 
			
		||||
        being a ref to an array of [nodes, nodetype, status]. For example: 
 | 
			
		||||
          [['node1', 'osi', 'active'], ['node2', 'switch', 'booting']..] 
 | 
			
		||||
    Returns:
 | 
			
		||||
       none
 | 
			
		||||
       (error code, error message)
 | 
			
		||||
=cut
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub addNodes {
 | 
			
		||||
@@ -283,7 +281,7 @@ sub addNodes {
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  my $ms_host_name=hostname();
 | 
			
		||||
  my $mon_nodes=$noderef->{$ms_host_name};
 | 
			
		||||
  my $mon_nodes=$noderef;
 | 
			
		||||
 | 
			
		||||
  my @nodes_to_add=();
 | 
			
		||||
  foreach(@$mon_nodes) {
 | 
			
		||||
@@ -316,7 +314,7 @@ sub addNodes {
 | 
			
		||||
    return addNodes_noChecking(@nodes_to_add);
 | 
			
		||||
  }
 | 
			
		||||
   
 | 
			
		||||
  return 0;
 | 
			
		||||
  return (0, "ok");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
@@ -326,7 +324,7 @@ sub addNodes {
 | 
			
		||||
    Arguments:
 | 
			
		||||
      nodes --an array of nodes to be added. 
 | 
			
		||||
    Returns:
 | 
			
		||||
       none
 | 
			
		||||
       (error code, error message)
 | 
			
		||||
=cut
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub addNodes_noChecking {
 | 
			
		||||
@@ -412,20 +410,18 @@ sub addNodes_noChecking {
 | 
			
		||||
    }
 | 
			
		||||
  } 
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
  return (0, "ok");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
=head3    removeNodes
 | 
			
		||||
      This function removes the nodes from the RMC cluster.
 | 
			
		||||
    Arguments:
 | 
			
		||||
      nodes --nodes to be removed. It is 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', 'active'], ['node2', 'switch', 'booting']...], ...} 
 | 
			
		||||
      verbose -- verbose mode. 1 for yes, 0 for no.
 | 
			
		||||
      nodes --nodes to be removed. It is a pointer to an array with each element
 | 
			
		||||
        being a ref to an array of [nodes, nodetype, status]. For example: 
 | 
			
		||||
          [['node1', 'osi', 'active'], ['node2', 'switch', 'booting']..] 
 | 
			
		||||
    Returns:
 | 
			
		||||
       none
 | 
			
		||||
       (error code, error message)
 | 
			
		||||
=cut
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub removeNodes {
 | 
			
		||||
@@ -436,7 +432,7 @@ sub removeNodes {
 | 
			
		||||
 | 
			
		||||
  #print "rmcmon::removeNodes called\n";
 | 
			
		||||
  my $ms_host_name=hostname();
 | 
			
		||||
  my $mon_nodes=$noderef->{$ms_host_name};
 | 
			
		||||
  my $mon_nodes=$noderef;
 | 
			
		||||
 | 
			
		||||
  my @nodes_to_remove=();
 | 
			
		||||
 | 
			
		||||
@@ -454,7 +450,7 @@ sub removeNodes {
 | 
			
		||||
    return removeNodes_noChecking(@nodes_to_remove);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
  return (0, "ok");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -464,7 +460,7 @@ sub removeNodes {
 | 
			
		||||
    Arguments:
 | 
			
		||||
      nodes --an array of node names to be removed. 
 | 
			
		||||
    Returns:
 | 
			
		||||
       none
 | 
			
		||||
      (error code, error message)
 | 
			
		||||
=cut
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub removeNodes_noChecking {
 | 
			
		||||
@@ -515,7 +511,7 @@ sub removeNodes_noChecking {
 | 
			
		||||
    }
 | 
			
		||||
  }           
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
  return (0, "ok";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
 
 | 
			
		||||
@@ -553,6 +553,9 @@ sub processTableChanges {
 | 
			
		||||
=cut
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub processNodelistTableChanges {
 | 
			
		||||
  #does not handle this function on a service node
 | 
			
		||||
  if (xCAT::Utils->isServiceNode()) { return 0;}
 | 
			
		||||
 | 
			
		||||
  my $action=shift;
 | 
			
		||||
  if ($action =~ /xCAT_monitoring::monitorctrl/) {
 | 
			
		||||
    $action=shift;
 | 
			
		||||
@@ -585,15 +588,6 @@ sub processNodelistTableChanges {
 | 
			
		||||
      my $status='';
 | 
			
		||||
      if (exists($new_data->{status})) {$status=$new_data->{status};}      
 | 
			
		||||
      push(@nodenames, [$new_data->{node}, $status]);
 | 
			
		||||
      my $hierarchy=getMonServerWithInfo(\@nodenames);
 | 
			
		||||
 | 
			
		||||
      #call each plug-in to add the nodes into the monitoring domain
 | 
			
		||||
      foreach(keys(%PRODUCT_LIST)) {
 | 
			
		||||
        my $aRef=$PRODUCT_LIST{$_};
 | 
			
		||||
        my $module_name=$aRef->[1];
 | 
			
		||||
        #print "moduel_name=$module_name\n";
 | 
			
		||||
        ${$module_name."::"}{addNodes}->($hierarchy, 1);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  elsif ($action eq "d") {
 | 
			
		||||
@@ -613,21 +607,47 @@ sub processNodelistTableChanges {
 | 
			
		||||
      for (my $j=1; $j<@$old_data; ++$j) {
 | 
			
		||||
        push(@nodenames, [$old_data->[$j]->[$node_i], $old_data->[$j]->[$status_i]]);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  else { return 0; }
 | 
			
		||||
 | 
			
		||||
      if (@nodenames > 0) {
 | 
			
		||||
        #print "monitorctrl:  nodenames=@nodenames\n";
 | 
			
		||||
        my $hierarchy=getMonServerWithInfo(\@nodenames);        
 | 
			
		||||
  if (@nodenames ==0) { return 0;}
 | 
			
		||||
 | 
			
		||||
        #call each plug-in to remove the nodes into the monitoring domain
 | 
			
		||||
        foreach(keys(%PRODUCT_LIST)) {
 | 
			
		||||
          my $aRef=$PRODUCT_LIST{$_};
 | 
			
		||||
          my $module_name=$aRef->[1];
 | 
			
		||||
          ${$module_name."::"}{removeNodes}->($hierarchy, 1); 
 | 
			
		||||
        }
 | 
			
		||||
  print "monitorctrl:  nodenames=@nodenames\n";
 | 
			
		||||
  my $hierarchy=getMonServerWithInfo(\@nodenames);        
 | 
			
		||||
 | 
			
		||||
  #get all possible ip and hostname for the local host
 | 
			
		||||
  my @hostinfo=xCAT::Utils->determinehostname();
 | 
			
		||||
  my %iphash=();
 | 
			
		||||
  foreach(@hostinfo) {$iphash{$_}=1;}
 | 
			
		||||
 | 
			
		||||
  foreach (keys(%$hierarchy)) {
 | 
			
		||||
    my $svname=$_;
 | 
			
		||||
    my $mon_nodes=$hierarchy->{$svname};
 | 
			
		||||
    if (($iphash{$svname}) || ($svname eq "noservicenode")) { #this is for ms
 | 
			
		||||
      #call each plug-in to add the nodes into the monitoring domain
 | 
			
		||||
      foreach(keys(%PRODUCT_LIST)) {
 | 
			
		||||
        my $aRef=$PRODUCT_LIST{$_};
 | 
			
		||||
        my $module_name=$aRef->[1]; 
 | 
			
		||||
        #print "moduel_name=$module_name\n";
 | 
			
		||||
        if ($action eq "a") {  ${$module_name."::"}{addNodes}->($mon_nodes);} 
 | 
			
		||||
        else { ${$module_name."::"}{removeNodes}->($mon_nodes);} }
 | 
			
		||||
    } else { #this is for a service node
 | 
			
		||||
      #call each service node to handle it
 | 
			
		||||
      my @noderange=();
 | 
			
		||||
      foreach my $nodetemp (@$mon_nodes) {
 | 
			
		||||
        push(@noderange, $nodetemp->[0]); 
 | 
			
		||||
      }       
 | 
			
		||||
      my $cmd;
 | 
			
		||||
      if ($action eq "a") { $cmd="psh $svname XCATBYPASS=Y monaddnode " . join(',', @noderange); }
 | 
			
		||||
      else { $cmd="psh $svname XCATBYPASS=Y monrmnode " . join(',', @noderange); }
 | 
			
		||||
      my $result=`$cmd 2>&1`;
 | 
			
		||||
      if ($?) {
 | 
			
		||||
        xCAT::MsgUtils->message('S', "[mon]:$cmd result=$result\n"); 
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  } 
 | 
			
		||||
  
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
  return 0;
 | 
			
		||||
} 
 | 
			
		||||
 | 
			
		||||
@@ -745,7 +765,7 @@ sub processNodeStatusChanges {
 | 
			
		||||
    }
 | 
			
		||||
  } 
 | 
			
		||||
  else {
 | 
			
		||||
    xCAT::MsgUtils->message("E", "Could not read the nodelist table\n");
 | 
			
		||||
    xCAT::MsgUtils->message("S", "Could not read the nodelist table\n");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  $tab->close;
 | 
			
		||||
@@ -970,10 +990,14 @@ 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', 'active'], ['node2', 'switch', 'booting']...], ...}
 | 
			
		||||
      If there is no service node for a node, the key will be "noservicenode".  
 | 
			
		||||
=cut
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub getMonServerWithInfo {
 | 
			
		||||
  my $p_input=shift;
 | 
			
		||||
  if ($p_input =~ /xCAT_monitoring::monitorctrl/) {
 | 
			
		||||
    $p_input=shift;
 | 
			
		||||
  }
 | 
			
		||||
  my @in_nodes=@$p_input;
 | 
			
		||||
 | 
			
		||||
  my $ret={};
 | 
			
		||||
@@ -982,8 +1006,6 @@ sub getMonServerWithInfo {
 | 
			
		||||
  #get all from the noderes table
 | 
			
		||||
  my $table2=xCAT::Table->new("noderes", -create =>0);
 | 
			
		||||
  my $table3=xCAT::Table->new("nodetype", -create =>0);
 | 
			
		||||
  my @hostinfo=xCAT::Utils->determinehostname();
 | 
			
		||||
  my $host=pop(@hostinfo);
 | 
			
		||||
  
 | 
			
		||||
  foreach (@in_nodes) {
 | 
			
		||||
    my $node=$_->[0];
 | 
			
		||||
@@ -995,12 +1017,13 @@ sub getMonServerWithInfo {
 | 
			
		||||
      if ($tmp3->{nodetype}) { $nodetype=$tmp3->{nodetype}; }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my $monserver=$host;
 | 
			
		||||
    my $monserver;
 | 
			
		||||
    my $tmp2=$table2->getNodeAttribs($node, ['monserver', 'servicenode']);
 | 
			
		||||
    if (defined($tmp2) && ($tmp2)) {
 | 
			
		||||
      if ($tmp2->{monserver}) {  $monserver=$tmp2->{monserver}; }
 | 
			
		||||
      elsif ($tmp2->{servicenode})  {  $monserver=$tmp2->{servicenode}; }
 | 
			
		||||
    }
 | 
			
		||||
    if (!$monserver) { $monserver="noservicenode"; }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    if (exists($ret->{$monserver})) {
 | 
			
		||||
@@ -1030,10 +1053,15 @@ sub getMonServerWithInfo {
 | 
			
		||||
      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', active'], ['node2', 'switch', booting']...], ...}
 | 
			
		||||
      If there is no service node for a node, the key will be "noservicenode".  
 | 
			
		||||
=cut
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub getMonServer {
 | 
			
		||||
  my $p_input=shift;
 | 
			
		||||
  if ($p_input =~ /xCAT_monitoring::monitorctrl/) {
 | 
			
		||||
    $p_input=shift;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  my @in_nodes=@$p_input;
 | 
			
		||||
 | 
			
		||||
  my $ret={};
 | 
			
		||||
@@ -1041,8 +1069,6 @@ sub getMonServer {
 | 
			
		||||
  my $table=xCAT::Table->new("nodelist", -create =>0);
 | 
			
		||||
  my $table2=xCAT::Table->new("noderes", -create =>0);
 | 
			
		||||
  my $table3=xCAT::Table->new("nodetype", -create =>0);
 | 
			
		||||
  my @hostinfo=xCAT::Utils->determinehostname();
 | 
			
		||||
  my $host=pop(@hostinfo);
 | 
			
		||||
  
 | 
			
		||||
  foreach (@in_nodes) {
 | 
			
		||||
    my @tmp1=$table->getAttribs({'node'=>$_}, ('node', 'status'));
 | 
			
		||||
@@ -1057,12 +1083,13 @@ sub getMonServer {
 | 
			
		||||
	if ($tmp3->{nodetype}) { $nodetype=$tmp3->{nodetype}; }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      my $monserver=$host;
 | 
			
		||||
      my $monserver;
 | 
			
		||||
      my $tmp2=$table2->getNodeAttribs($node, ['monserver', 'servicenode']);
 | 
			
		||||
      if (defined($tmp2) && ($tmp2)) {
 | 
			
		||||
        if ($tmp2->{monserver}) {  $monserver=$tmp2->{monserver}; }
 | 
			
		||||
        elsif ($tmp2->{servicenode})  {  $monserver=$tmp2->{servicenode}; }
 | 
			
		||||
      }
 | 
			
		||||
      if (!$monserver) { $monserver="noservicenode"; }
 | 
			
		||||
 | 
			
		||||
      if (exists($ret->{$monserver})) {
 | 
			
		||||
        my $pa=$ret->{$monserver};
 | 
			
		||||
@@ -1097,6 +1124,152 @@ sub nodeStatMonName {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
=head3    addNodes
 | 
			
		||||
      This function informs all the active monitoring plug-ins to add the given
 | 
			
		||||
     nodes to their monitoring domain. If the service node of the given nodes are
 | 
			
		||||
     not the localhost, the request will be sent to the conresponding service nodes. 
 | 
			
		||||
    Arguments:
 | 
			
		||||
        noderange  a pointer to an array of node names
 | 
			
		||||
    Returns:
 | 
			
		||||
        ret a hash with plug-in name as the keys and the an arry of 
 | 
			
		||||
        [return code, error message] as the values.
 | 
			
		||||
=cut
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub addNodes {
 | 
			
		||||
  my $p_input=shift;
 | 
			
		||||
  if ($p_input =~ /xCAT_monitoring::monitorctrl/) {
 | 
			
		||||
    $p_input=shift;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  my %ret=();
 | 
			
		||||
  my @nodenames=@$p_input;
 | 
			
		||||
  if (@nodenames == 0) { return %ret; }
 | 
			
		||||
 | 
			
		||||
  my $isSV=xCAT::Utils->isServiceNode();
 | 
			
		||||
  my @hostinfo=xCAT::Utils->determinehostname();
 | 
			
		||||
  %iphash=();
 | 
			
		||||
  foreach(@hostinfo) {$iphash{$_}=1;}
 | 
			
		||||
 | 
			
		||||
  my $hierachy=xCAT_monitoring::monitorctrl->getMonServer(\@nodenames);
 | 
			
		||||
  my @mon_servers=keys(%$hierachy); 
 | 
			
		||||
 | 
			
		||||
  foreach (@mon_servers) {
 | 
			
		||||
    my $svname=$_;
 | 
			
		||||
    my $mon_nodes=$hierachy->{$svname};
 | 
			
		||||
    if ($iphash{$_}) { 
 | 
			
		||||
      #let all actvie modules to process it
 | 
			
		||||
      foreach(keys(%PRODUCT_LIST)) {
 | 
			
		||||
        my $aRef=$PRODUCT_LIST{$_};
 | 
			
		||||
        my $module_name=$aRef->[1]; 
 | 
			
		||||
        my @ret1=${$module_name."::"}{addNodes}->($mon_nodes); 
 | 
			
		||||
        $ret{$svname}=\@ret1;
 | 
			
		||||
        
 | 
			
		||||
        #for service node, the error may not be get shown, log it
 | 
			
		||||
        if (($isSV) && ($ret1[0] >0)) {
 | 
			
		||||
	  xCAT::MsgUtils->message('S', "[mon]: $svname: $ret1[1]\n"); 
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    } elsif (!$isSV)  {
 | 
			
		||||
      if ($svname eq "noservicenode") {
 | 
			
		||||
        #let all actvie modules to process it
 | 
			
		||||
        foreach(keys(%PRODUCT_LIST)) {
 | 
			
		||||
          my $aRef=$PRODUCT_LIST{$_};
 | 
			
		||||
          my $module_name=$aRef->[1]; 
 | 
			
		||||
          my @ret1=${$module_name."::"}{addNodes}->($mon_nodes);
 | 
			
		||||
          $ret{$svname}=\@ret1;
 | 
			
		||||
        } 
 | 
			
		||||
      } else {
 | 
			
		||||
        #forward them to the service nodes
 | 
			
		||||
        my @noderange=();
 | 
			
		||||
        foreach my $nodetemp (@$mon_nodes) {
 | 
			
		||||
          push(@noderange, $nodetemp->[0]); 
 | 
			
		||||
        }   
 | 
			
		||||
        my $cmd="psh $svname XCATBYPASS=Y monaddnode " . join(',', @noderange); 
 | 
			
		||||
        my $result=`$cmd 2>&1`;
 | 
			
		||||
        if ($?) {
 | 
			
		||||
	  $ret{$svname}=[1, $result];
 | 
			
		||||
        }          
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }  
 | 
			
		||||
 | 
			
		||||
  return %ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
=head3    removeNodes
 | 
			
		||||
      This function informs all the active monitoring plug-ins to remove the given
 | 
			
		||||
     nodes to their monitoring domain. If the service node of the given nodes are
 | 
			
		||||
     not the localhost, the request will be sent to the conresponding service nodes. 
 | 
			
		||||
    Arguments:
 | 
			
		||||
        noderange  a pointer to an array of node names
 | 
			
		||||
    Returns:
 | 
			
		||||
        ret a hash with plug-in name as the keys and the an arry of 
 | 
			
		||||
        [return code, error message] as the values.
 | 
			
		||||
=cut
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub removeNodes {
 | 
			
		||||
  my $p_input=shift;
 | 
			
		||||
  if ($p_input =~ /xCAT_monitoring::monitorctrl/) {
 | 
			
		||||
    $p_input=shift;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  my %ret=();
 | 
			
		||||
  my @nodenames=@$p_input;
 | 
			
		||||
  if (@nodenames == 0) { return %ret; }
 | 
			
		||||
 | 
			
		||||
  my $isSV=xCAT::Utils->isServiceNode();
 | 
			
		||||
  my @hostinfo=xCAT::Utils->determinehostname();
 | 
			
		||||
  %iphash=();
 | 
			
		||||
  foreach(@hostinfo) {$iphash{$_}=1;}
 | 
			
		||||
 | 
			
		||||
  my $hierachy=xCAT_monitoring::monitorctrl->getMonServer(\@nodenames);
 | 
			
		||||
  my @mon_servers=keys(%$hierachy); 
 | 
			
		||||
 | 
			
		||||
  foreach (@mon_servers) {
 | 
			
		||||
    my $svname=$_;
 | 
			
		||||
    my $mon_nodes=$hierachy->{$svname};
 | 
			
		||||
    if ($iphash{$_}) { 
 | 
			
		||||
      #let all actvie modules to process it
 | 
			
		||||
      foreach(keys(%PRODUCT_LIST)) {
 | 
			
		||||
        my $aRef=$PRODUCT_LIST{$_};
 | 
			
		||||
        my $module_name=$aRef->[1]; 
 | 
			
		||||
        my @ret1=${$module_name."::"}{removeNodes}->($mon_nodes); 
 | 
			
		||||
        $ret{$svname}=\@ret1;
 | 
			
		||||
        
 | 
			
		||||
        #for service node, the error may not be get shown, log it
 | 
			
		||||
        if (($isSV) && ($ret1[0] >0)) {
 | 
			
		||||
	  xCAT::MsgUtils->message('S', "[mon]: $svname: $ret1[1]\n"); 
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    } elsif (!$isSV)  {
 | 
			
		||||
      if ($svname eq "noservicenode") {
 | 
			
		||||
        #let all actvie modules to process it
 | 
			
		||||
        foreach(keys(%PRODUCT_LIST)) {
 | 
			
		||||
          my $aRef=$PRODUCT_LIST{$_};
 | 
			
		||||
          my $module_name=$aRef->[1]; 
 | 
			
		||||
          my @ret1=${$module_name."::"}{removeNodes}->($mon_nodes);
 | 
			
		||||
          $ret{$svname}=\@ret1;
 | 
			
		||||
        } 
 | 
			
		||||
      } else {
 | 
			
		||||
        #forward them to the service nodes
 | 
			
		||||
        my @noderange=();
 | 
			
		||||
        foreach my $nodetemp (@$mon_nodes) {
 | 
			
		||||
          push(@noderange, $nodetemp->[0]); 
 | 
			
		||||
        }   
 | 
			
		||||
        my $cmd="psh $svname XCATBYPASS=Y monrmnode " . join(',', @noderange); 
 | 
			
		||||
        my $result=`$cmd 2>&1`;
 | 
			
		||||
        if ($?) {
 | 
			
		||||
	  $ret{$svname}=[1, $result];
 | 
			
		||||
        }          
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }  
 | 
			
		||||
 | 
			
		||||
  return %ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -155,32 +155,28 @@ sub stopNodeStatusMon {
 | 
			
		||||
      This function is called by the monitorctrl module when new nodes are added 
 | 
			
		||||
      to the xCAT cluster. It should add the nodes into the product for monitoring.
 | 
			
		||||
    Arguments:
 | 
			
		||||
      nodes --nodes to be added. It is 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', 'active'], ['node2', 'switch', 'bboting']...], ...} 
 | 
			
		||||
      nodes --nodes to be added. It is a pointer to an array with each element
 | 
			
		||||
        being a ref to an array of [nodes, nodetype, status]. For example: 
 | 
			
		||||
          [['node1', 'osi', 'active'], ['node2', 'switch', 'booting']..] 
 | 
			
		||||
    Returns:
 | 
			
		||||
       none
 | 
			
		||||
       (error code, error message)
 | 
			
		||||
=cut
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub addNodes {
 | 
			
		||||
  $noderef=shit;
 | 
			
		||||
  $noderef=shift;
 | 
			
		||||
  if ($noderef =~ /xCAT_monitoring::templatemon/) {
 | 
			
		||||
    $noderef=shift;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  #demo how you can parse the input. you may commnet it out.
 | 
			
		||||
  foreach (keys(%$noderef)) {
 | 
			
		||||
    print "  monitoring server: $_\n";
 | 
			
		||||
    my $mon_nodes=$noderef->{$_};
 | 
			
		||||
    foreach(@$mon_nodes) {
 | 
			
		||||
      my $node_info=$_;
 | 
			
		||||
      print "    node=$node_info->[0], nodetype=$node_info->[1], status=$node_info->[2]\n";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  foreach(@$noderef) {
 | 
			
		||||
    my $node_info=$_;
 | 
			
		||||
    print "    node=$node_info->[0], nodetype=$node_info->[1], status=$node_info->[2]\n";
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
   
 | 
			
		||||
  #TODO: include the nodes into the product for monitoring. 
 | 
			
		||||
  return;
 | 
			
		||||
  return (0, "0k");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
@@ -188,32 +184,28 @@ sub addNodes {
 | 
			
		||||
      This function is called by the monitorctrl module when nodes are removed 
 | 
			
		||||
      from the xCAT cluster. It should remove the nodes from the product for monitoring.
 | 
			
		||||
    Arguments:
 | 
			
		||||
      nodes --nodes to be removed. It is 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', 'active'], ['node2', 'switch', 'booting']...], ...} 
 | 
			
		||||
      nodes --nodes to be removed. It is a pointer to an array with each element
 | 
			
		||||
        being a ref to an array of [nodes, nodetype, status]. For example: 
 | 
			
		||||
          [['node1', 'osi', 'active'], ['node2', 'switch', 'booting']..] 
 | 
			
		||||
    Returns:
 | 
			
		||||
       none
 | 
			
		||||
       (error code, error message)
 | 
			
		||||
=cut
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub removeNodes {
 | 
			
		||||
  $noderef=shit;
 | 
			
		||||
  $noderef=shift;
 | 
			
		||||
  if ($noderef =~ /xCAT_monitoring::templatemon/) {
 | 
			
		||||
    $noderef=shift;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  #demo how you can parse the input. you may commnet it out.
 | 
			
		||||
  foreach (keys(%$noderef)) {
 | 
			
		||||
    print "  monitoring server: $_\n";
 | 
			
		||||
    my $mon_nodes=$noderef->{$_};
 | 
			
		||||
    foreach(@$mon_nodes) {
 | 
			
		||||
      my $node_info=$_;
 | 
			
		||||
      print "    node=$node_info->[0], nodetype=$node_info->[1], status=$node_info->[2]\n";
 | 
			
		||||
    }
 | 
			
		||||
  foreach(@$noderef) {
 | 
			
		||||
    my $node_info=$_;
 | 
			
		||||
    print "    node=$node_info->[0], nodetype=$node_info->[1], status=$node_info->[2]\n";
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
  #TODO: remove the nodes from the product for monitoring.
 | 
			
		||||
  return;
 | 
			
		||||
  return (0, "ok");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -346,36 +346,52 @@ sub stopNodeStatusMon {
 | 
			
		||||
=head3    addNodes
 | 
			
		||||
      This function adds the nodes into the  SNMP domain.
 | 
			
		||||
    Arguments:
 | 
			
		||||
      nodes --nodes to be added. It is 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', 'active'], ['node2', 'switch', 'booting']...], ...} 
 | 
			
		||||
      verbose -- verbose mode. 1 for yes, 0 for no.
 | 
			
		||||
      nodes --nodes to be added. It is a pointer to an array with each element
 | 
			
		||||
        being a ref to an array of [nodes, nodetype, status]. For example: 
 | 
			
		||||
          [['node1', 'osi', 'active'], ['node2', 'switch', 'booting']..] 
 | 
			
		||||
    Returns:
 | 
			
		||||
       none
 | 
			
		||||
       (error code, error message)
 | 
			
		||||
=cut
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub addNodes {
 | 
			
		||||
  print "snmpmon::addNodes\n";
 | 
			
		||||
  $noderef=shift;
 | 
			
		||||
  if ($noderef =~ /xCAT_monitoring::snmpmon/) {
 | 
			
		||||
    $noderef=shift;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  foreach(@$noderef) {
 | 
			
		||||
    my $node_info=$_;
 | 
			
		||||
    print "    node=$node_info->[0], nodetype=$node_info->[1], status=$node_info->[2]\n";
 | 
			
		||||
  }
 | 
			
		||||
    
 | 
			
		||||
  return 0;
 | 
			
		||||
  return (0, "ok");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
=head3    removeNodes
 | 
			
		||||
      This function removes the nodes from the SNMP domain.
 | 
			
		||||
    Arguments:
 | 
			
		||||
      nodes --nodes to be removed. It is 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', 'active'], ['node2', 'switch', 'booting']...], ...} 
 | 
			
		||||
      verbose -- verbose mode. 1 for yes, 0 for no.
 | 
			
		||||
      nodes --nodes to be removed. It is a pointer to an array with each element
 | 
			
		||||
        being a ref to an array of [nodes, nodetype, status]. For example: 
 | 
			
		||||
          [['node1', 'osi', 'active'], ['node2', 'switch', 'booting']..] 
 | 
			
		||||
    Returns:
 | 
			
		||||
       none
 | 
			
		||||
       (error code, error message)
 | 
			
		||||
=cut
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub removeNodes {
 | 
			
		||||
    print "snmpmon::removeNodes\n";
 | 
			
		||||
  $noderef=shift;
 | 
			
		||||
  if ($noderef =~ /xCAT_monitoring::snmpmon/) {
 | 
			
		||||
    $noderef=shift;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
  foreach(@$noderef) {
 | 
			
		||||
    my $node_info=$_;
 | 
			
		||||
    print "    node=$node_info->[0], nodetype=$node_info->[1], status=$node_info->[2]\n";
 | 
			
		||||
  }
 | 
			
		||||
    
 | 
			
		||||
  return (0, "ok");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
 
 | 
			
		||||
@@ -166,19 +166,18 @@ sub stopNodeStatusMon {
 | 
			
		||||
      This function is called by the monitorctrl module when new nodes are added 
 | 
			
		||||
      to the xCAT cluster. It should add the nodes into the product for monitoring.
 | 
			
		||||
    Arguments:
 | 
			
		||||
      nodes --nodes to be added. It is 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', 'active'], ['node2', 'switch', 'booting']...], ...} 
 | 
			
		||||
      nodes --nodes to be added. It is a pointer to an array with each element
 | 
			
		||||
        being a ref to an array of [nodes, nodetype, status]. For example: 
 | 
			
		||||
          [['node1', 'osi', 'active'], ['node2', 'switch', 'booting']..] 
 | 
			
		||||
    Returns:
 | 
			
		||||
       none
 | 
			
		||||
       (error code, error message)
 | 
			
		||||
=cut
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub addNodes {
 | 
			
		||||
 | 
			
		||||
  #print "xcatmon:addNodes called\n";
 | 
			
		||||
 
 | 
			
		||||
  return;
 | 
			
		||||
  return (0, "ok");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
@@ -186,19 +185,18 @@ sub addNodes {
 | 
			
		||||
      This function is called by the monitorctrl module when nodes are removed 
 | 
			
		||||
      from the xCAT cluster. It should remove the nodes from the product for monitoring.
 | 
			
		||||
    Arguments:
 | 
			
		||||
      nodes --nodes to be removed. It is a hash reference keyed by the monitoring server 
 | 
			
		||||
        nodes and each value is a ref to an array of [nodes, nodetype] arrays  monitored 
 | 
			
		||||
        by the server. So the format is:
 | 
			
		||||
        {monserver1=>[['node1', 'osi'], ['node2', 'switch']...], ...} 
 | 
			
		||||
      nodes --nodes to be removed. It is a pointer to an array with each element
 | 
			
		||||
        being a ref to an array of [nodes, nodetype, status]. For example: 
 | 
			
		||||
          [['node1', 'osi', 'active'], ['node2', 'switch', 'booting']..] 
 | 
			
		||||
    Returns:
 | 
			
		||||
       none
 | 
			
		||||
       (error code, error message)
 | 
			
		||||
=cut
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub removeNodes {
 | 
			
		||||
 | 
			
		||||
  #print "xcatmon:removeNodes called\n";
 | 
			
		||||
 | 
			
		||||
  return;
 | 
			
		||||
  return (0, "ok");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -36,10 +36,12 @@ use xCAT::Utils;
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub handled_commands {
 | 
			
		||||
  return {
 | 
			
		||||
    startmon => "monctrlcmds",
 | 
			
		||||
    stopmon => "monctrlcmds",
 | 
			
		||||
    updatemon => "monctrlcmds",
 | 
			
		||||
    lsmon => "monctrlcmds",
 | 
			
		||||
    monstart => "monctrlcmds",
 | 
			
		||||
    monstop => "monctrlcmds",
 | 
			
		||||
    monupdate => "monctrlcmds",
 | 
			
		||||
    monls => "monctrlcmds",
 | 
			
		||||
    monaddnode => "monctrlcmds",
 | 
			
		||||
    monrmnode => "monctrlcmds",
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -66,8 +68,8 @@ sub process_request {
 | 
			
		||||
  my $command = $request->{command}->[0];
 | 
			
		||||
  my $args=$request->{arg};
 | 
			
		||||
 | 
			
		||||
  if ($command eq "startmon") {
 | 
			
		||||
    my ($ret, $msg) = startmon($args, $callback);
 | 
			
		||||
  if ($command eq "monstart") {
 | 
			
		||||
    my ($ret, $msg) = monstart($args, $callback);
 | 
			
		||||
    if ($msg) {
 | 
			
		||||
      my %rsp=();
 | 
			
		||||
      $rsp->{dara}->[0]= $msg;
 | 
			
		||||
@@ -75,8 +77,8 @@ sub process_request {
 | 
			
		||||
    }
 | 
			
		||||
    return $ret;
 | 
			
		||||
  } 
 | 
			
		||||
  elsif ($command eq "stopmon") {
 | 
			
		||||
    my ($ret, $msg) = stopmon($args, $callback);
 | 
			
		||||
  elsif ($command eq "monstop") {
 | 
			
		||||
    my ($ret, $msg) = monstop($args, $callback);
 | 
			
		||||
    if ($msg) {
 | 
			
		||||
      my %rsp=();
 | 
			
		||||
      $rsp->{data}->[0]= $msg;
 | 
			
		||||
@@ -84,11 +86,29 @@ sub process_request {
 | 
			
		||||
    }
 | 
			
		||||
    return $ret;
 | 
			
		||||
  } 
 | 
			
		||||
  elsif ($command eq "updatemon") {
 | 
			
		||||
  elsif ($command eq "monupdate") {
 | 
			
		||||
    xCAT_monitoring::monitorctrl::sendMonSignal();
 | 
			
		||||
  }
 | 
			
		||||
  elsif ($command eq "lsmon") {
 | 
			
		||||
    my ($ret, $msg) = lsmon($args, $callback);
 | 
			
		||||
  elsif ($command eq "monls") {
 | 
			
		||||
    my ($ret, $msg) = monls($args, $callback);
 | 
			
		||||
    if ($msg) {
 | 
			
		||||
      my %rsp=();
 | 
			
		||||
      $rsp->{data}->[0]= $msg;
 | 
			
		||||
      $callback->($rsp);
 | 
			
		||||
    }
 | 
			
		||||
    return $ret;
 | 
			
		||||
  }
 | 
			
		||||
  elsif ($command eq "monaddnode") {
 | 
			
		||||
    my ($ret, $msg) = monaddnode($args, $callback);
 | 
			
		||||
    if ($msg) {
 | 
			
		||||
      my %rsp=();
 | 
			
		||||
      $rsp->{data}->[0]= $msg;
 | 
			
		||||
      $callback->($rsp);
 | 
			
		||||
    }
 | 
			
		||||
    return $ret;
 | 
			
		||||
  }
 | 
			
		||||
  elsif ($command eq "monrmnode") {
 | 
			
		||||
    my ($ret, $msg) = monrmnode($args, $callback);
 | 
			
		||||
    if ($msg) {
 | 
			
		||||
      my %rsp=();
 | 
			
		||||
      $rsp->{data}->[0]= $msg;
 | 
			
		||||
@@ -106,7 +126,7 @@ sub process_request {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
=head3   startmon
 | 
			
		||||
=head3   monstart
 | 
			
		||||
        This function registers the given monitoring plug-in to the 'monitoring' table.
 | 
			
		||||
        xCAT will invoke the monitoring plug-in to start the 3rd party software, which
 | 
			
		||||
        this plug-in connects to, to monitor the xCAT cluster. 
 | 
			
		||||
@@ -128,7 +148,7 @@ sub process_request {
 | 
			
		||||
        1. for unsuccess. The error messages are returns through the callback pointer.
 | 
			
		||||
=cut
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub startmon {
 | 
			
		||||
sub monstart {
 | 
			
		||||
  my $args=shift;
 | 
			
		||||
  my $callback=shift;
 | 
			
		||||
  my $VERSION;
 | 
			
		||||
@@ -143,19 +163,19 @@ sub startmon {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  # subroutine to display the usage
 | 
			
		||||
  sub startmon_usage
 | 
			
		||||
  sub monstart_usage
 | 
			
		||||
  {
 | 
			
		||||
    my %rsp;
 | 
			
		||||
    $rsp->{data}->[0]= "Usage:";
 | 
			
		||||
    $rsp->{data}->[1]= "  startmon name [-n|--nodestatmon] [-s|--settings settings]";
 | 
			
		||||
    $rsp->{data}->[2]= "  startmon [-h|--help|-v|--version]";
 | 
			
		||||
    $rsp->{data}->[1]= "  monstart name [-n|--nodestatmon] [-s|--settings settings]";
 | 
			
		||||
    $rsp->{data}->[2]= "  monstart [-h|--help|-v|--version]";
 | 
			
		||||
    $rsp->{data}->[3]= "     name is the name of the monitoring plug-in module to be registered and invoked.";
 | 
			
		||||
    $rsp->{data}->[4]= "       Use 'lsmon -a' command to list all the monitoring plug-in names.";
 | 
			
		||||
    $rsp->{data}->[4]= "       Use 'monls -a' command to list all the monitoring plug-in names.";
 | 
			
		||||
    $rsp->{data}->[5]= "     settings is used by the monitoring plug-in to customize its behavior.";
 | 
			
		||||
    $rsp->{data}->[6]= "       Format: [key1=value1],[key2=value2]... ";
 | 
			
		||||
    $rsp->{data}->[7]= "       Please note that the square brackets are needed. ";
 | 
			
		||||
    $rsp->{data}->[7]= "       Use 'lsmon name -d' command to look for the possible settings for a plug-in.";
 | 
			
		||||
    $rsp->{data}->[8]= "  Example: startmon xcatmon -n -s [ping-interval=10]";
 | 
			
		||||
    $rsp->{data}->[7]= "       Use 'monls name -d' command to look for the possible settings for a plug-in.";
 | 
			
		||||
    $rsp->{data}->[8]= "  Example: monstart xcatmon -n -s [ping-interval=10]";
 | 
			
		||||
    $callback->($rsp);
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
@@ -169,13 +189,13 @@ sub startmon {
 | 
			
		||||
      'n|nodestatmon'  => \$::NODESTATMON,
 | 
			
		||||
      's|settings=s'  => \$settings))
 | 
			
		||||
  {
 | 
			
		||||
    &startmon_usage;
 | 
			
		||||
    &monstart_usage;
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  # display the usage if -h or --help is specified
 | 
			
		||||
  if ($::HELP) { 
 | 
			
		||||
    &startmon_usage;
 | 
			
		||||
    &monstart_usage;
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -183,7 +203,7 @@ sub startmon {
 | 
			
		||||
  if ($::VERSION)
 | 
			
		||||
  {
 | 
			
		||||
    my %rsp;
 | 
			
		||||
    $rsp->{data}->[0]= "startmon version 1.0";
 | 
			
		||||
    $rsp->{data}->[0]= "monstart version 1.0";
 | 
			
		||||
    $callback->($rsp);
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
@@ -192,7 +212,7 @@ sub startmon {
 | 
			
		||||
  my $pname;
 | 
			
		||||
  if (@ARGV < 1)
 | 
			
		||||
  {
 | 
			
		||||
    &startmon_usage;
 | 
			
		||||
    &monstart_usage;
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
  else {
 | 
			
		||||
@@ -216,7 +236,7 @@ sub startmon {
 | 
			
		||||
      }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  #my %ret = xCAT_monitoring::monitorctrl::startMonitoring(@product_names);
 | 
			
		||||
  #my %ret = xCAT_monitoring::monitorctrl::startmonitoring(@product_names);
 | 
			
		||||
  
 | 
			
		||||
  #my %rsp;
 | 
			
		||||
  #$rsp->{data}->[0]= "starting @product_names";
 | 
			
		||||
@@ -282,7 +302,7 @@ sub startmon {
 | 
			
		||||
      my %rsp2;
 | 
			
		||||
      $rsp2->{data}->[0]="sending request to $_...";
 | 
			
		||||
      $callback->($rsp2);
 | 
			
		||||
      my $result=`psh --nonodecheck $_ updatemon 2>1&`;     
 | 
			
		||||
      my $result=`psh --nonodecheck $_ monupdate 2>1&`;     
 | 
			
		||||
      if ($result) {
 | 
			
		||||
        $rsp2->{data}->[0]="$result";
 | 
			
		||||
        $callback->($rsp2);
 | 
			
		||||
@@ -298,7 +318,7 @@ sub startmon {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
=head3   stopmon
 | 
			
		||||
=head3   monstop
 | 
			
		||||
        This function unregisters the given monitoring plug-in from the 'monitoring' table.
 | 
			
		||||
        xCAT will ask the monitoring plug-in to stop the 3rd party software, which
 | 
			
		||||
        this plug-in connects to, to monitor the xCAT cluster. 
 | 
			
		||||
@@ -316,7 +336,7 @@ sub startmon {
 | 
			
		||||
        1. for unsuccess. The error messages are returns through the callback pointer.
 | 
			
		||||
=cut
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub stopmon {
 | 
			
		||||
sub monstop {
 | 
			
		||||
  my $args=shift;
 | 
			
		||||
  my $callback=shift;
 | 
			
		||||
  my $VERSION;
 | 
			
		||||
@@ -330,12 +350,12 @@ sub stopmon {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  # subroutine to display the usage
 | 
			
		||||
  sub stopmon_usage
 | 
			
		||||
  sub monstop_usage
 | 
			
		||||
  {
 | 
			
		||||
    my %rsp;
 | 
			
		||||
    $rsp->{data}->[0]= "Usage:";
 | 
			
		||||
    $rsp->{data}->[1]= "  stopmon name";
 | 
			
		||||
    $rsp->{data}->[2]= "  stopmon [-h|--help|-v|--version]";
 | 
			
		||||
    $rsp->{data}->[1]= "  monstop name";
 | 
			
		||||
    $rsp->{data}->[2]= "  monstop [-h|--help|-v|--version]";
 | 
			
		||||
    $rsp->{data}->[3]= "      name is the name of the monitoring plug-in module registered in the monitoring table.";
 | 
			
		||||
    $callback->($rsp);
 | 
			
		||||
  }
 | 
			
		||||
@@ -346,13 +366,13 @@ sub stopmon {
 | 
			
		||||
      'h|help'     => \$::HELP,
 | 
			
		||||
      'v|version'  => \$::VERSION,))
 | 
			
		||||
  {
 | 
			
		||||
    &stopmon_usage;
 | 
			
		||||
    &monstop_usage;
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  # display the usage if -h or --help is specified
 | 
			
		||||
  if ($::HELP) { 
 | 
			
		||||
    &stopmon_usage;
 | 
			
		||||
    &monstop_usage;
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -360,7 +380,7 @@ sub stopmon {
 | 
			
		||||
  if ($::VERSION)
 | 
			
		||||
  {
 | 
			
		||||
    my %rsp;
 | 
			
		||||
    $rsp->{data}->[0]= "stopmon version 1.0";
 | 
			
		||||
    $rsp->{data}->[0]= "monstop version 1.0";
 | 
			
		||||
    $callback->($rsp);
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
@@ -370,7 +390,7 @@ sub stopmon {
 | 
			
		||||
  my $pname;
 | 
			
		||||
  if (@ARGV < 1)
 | 
			
		||||
  {
 | 
			
		||||
    &stopmon_usage;
 | 
			
		||||
    &monstop_usage;
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
  else {
 | 
			
		||||
@@ -423,7 +443,7 @@ sub stopmon {
 | 
			
		||||
      my %rsp2;
 | 
			
		||||
      $rsp2->{data}->[0]="sending request to $_...";
 | 
			
		||||
      $callback->($rsp2);
 | 
			
		||||
      my $result=`psh --nonodecheck $_ updatemon 2>1&`;     
 | 
			
		||||
      my $result=`psh --nonodecheck $_ monupdate 2>1&`;     
 | 
			
		||||
      if ($result) {
 | 
			
		||||
        $rsp2->{data}->[0]="$result";
 | 
			
		||||
        $callback->($rsp2);
 | 
			
		||||
@@ -440,7 +460,7 @@ sub stopmon {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
=head3   lsmon
 | 
			
		||||
=head3   monls
 | 
			
		||||
        This function list the monitoring plug-in module names, status and description. 
 | 
			
		||||
    Arguments:
 | 
			
		||||
      callback - the pointer to the callback function.
 | 
			
		||||
@@ -452,20 +472,20 @@ sub stopmon {
 | 
			
		||||
        1. for unsuccess. The error messages are returns through the callback pointer.
 | 
			
		||||
=cut
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub lsmon {
 | 
			
		||||
sub monls {
 | 
			
		||||
  my $args=shift;
 | 
			
		||||
  my $callback=shift;
 | 
			
		||||
  my $VERSION;
 | 
			
		||||
  my $HELP;
 | 
			
		||||
 | 
			
		||||
  # subroutine to display the usage
 | 
			
		||||
  sub lsmon_usage
 | 
			
		||||
  sub monls_usage
 | 
			
		||||
  {
 | 
			
		||||
    my %rsp;
 | 
			
		||||
    $rsp->{data}->[0]= "Usage:";
 | 
			
		||||
    $rsp->{data}->[1]= "  lsmon name [-d|--description]";
 | 
			
		||||
    $rsp->{data}->[2]= "  lsmon [-a|--all] [-d|--description]";
 | 
			
		||||
    $rsp->{data}->[3]= "  lsmon [-h|--help|-v|--version]";
 | 
			
		||||
    $rsp->{data}->[1]= "  monls name [-d|--description]";
 | 
			
		||||
    $rsp->{data}->[2]= "  monls [-a|--all] [-d|--description]";
 | 
			
		||||
    $rsp->{data}->[3]= "  monls [-h|--help|-v|--version]";
 | 
			
		||||
    $rsp->{data}->[4]= "     name is the name of the monitoring plug-in module.";
 | 
			
		||||
    $callback->($rsp);
 | 
			
		||||
  }
 | 
			
		||||
@@ -479,13 +499,13 @@ sub lsmon {
 | 
			
		||||
      'a|all'  => \$::ALL,
 | 
			
		||||
      'd|discription'  => \$::DESC))
 | 
			
		||||
  {
 | 
			
		||||
    &lsmon_usage;
 | 
			
		||||
    &monls_usage;
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  # display the usage if -h or --help is specified
 | 
			
		||||
  if ($::HELP) { 
 | 
			
		||||
    &lsmon_usage;
 | 
			
		||||
    &monls_usage;
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -493,7 +513,7 @@ sub lsmon {
 | 
			
		||||
  if ($::VERSION)
 | 
			
		||||
  {
 | 
			
		||||
    my %rsp;
 | 
			
		||||
    $rsp->{data}->[0]= "lsmon version 1.0";
 | 
			
		||||
    $rsp->{data}->[0]= "monls version 1.0";
 | 
			
		||||
    $callback->($rsp);
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
@@ -586,8 +606,184 @@ sub lsmon {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
=head3   monaddnode
 | 
			
		||||
        This function informs all the active monitoring plug-ins to add the given
 | 
			
		||||
     nodes to their monitoring domain 
 | 
			
		||||
    Arguments:
 | 
			
		||||
      callback - the pointer to the callback function.
 | 
			
		||||
      args - The format of the args is:
 | 
			
		||||
        [-h|--help|-v|--version] or
 | 
			
		||||
        noderange
 | 
			
		||||
    Returns:
 | 
			
		||||
        0 for success. The output is returned through the callback pointer.
 | 
			
		||||
        1. for unsuccess. The error messages are returns through the callback pointer.
 | 
			
		||||
=cut
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub monaddnode {
 | 
			
		||||
  my $args=shift;
 | 
			
		||||
  my $callback=shift;
 | 
			
		||||
  my $VERSION;
 | 
			
		||||
  my $HELP;
 | 
			
		||||
 | 
			
		||||
  # subroutine to display the usage
 | 
			
		||||
  sub monaddnode_usage
 | 
			
		||||
  {
 | 
			
		||||
    my %rsp;
 | 
			
		||||
    $rsp->{data}->[0]= "Usage:";
 | 
			
		||||
    $rsp->{data}->[1]= "  monaddnode noderange";
 | 
			
		||||
    $rsp->{data}->[2]= "  monaddnode [-h|--help|-v|--version]";
 | 
			
		||||
    $rsp->{data}->[3]= "      noderange is a list of comma separated node or node group names.";
 | 
			
		||||
    $callback->($rsp);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @ARGV=@{$args};
 | 
			
		||||
  # parse the options
 | 
			
		||||
  if(!GetOptions(
 | 
			
		||||
      'h|help'     => \$::HELP,
 | 
			
		||||
      'v|version'  => \$::VERSION,))
 | 
			
		||||
  {
 | 
			
		||||
    &monaddnode_usage;
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  # display the usage if -h or --help is specified
 | 
			
		||||
  if ($::HELP) { 
 | 
			
		||||
    &monaddnode_usage;
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  # display the version statement if -v or --verison is specified
 | 
			
		||||
  if ($::VERSION)
 | 
			
		||||
  {
 | 
			
		||||
    my %rsp;
 | 
			
		||||
    $rsp->{data}->[0]= "monaddnode version 1.0";
 | 
			
		||||
    $callback->($rsp);
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  my $noderange;
 | 
			
		||||
  if (@ARGV < 1)
 | 
			
		||||
  {
 | 
			
		||||
    &monaddnode_usage;
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
  else {
 | 
			
		||||
    $noderange=$ARGV[0];
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  my @nodenames=noderange($noderange);
 | 
			
		||||
  my @missed=nodesmissed();
 | 
			
		||||
  if (@missed > 0) {
 | 
			
		||||
    my %rsp1;
 | 
			
		||||
    $rsp1->{data}->[0]="Invalide nodes:@missed";
 | 
			
		||||
    $callback->($rsp1);
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  my %ret=xCAT_monitoring::monitorctrl->addNodes(\@nodenames);
 | 
			
		||||
 | 
			
		||||
  if (%ret) {
 | 
			
		||||
    foreach(keys(%ret)) {
 | 
			
		||||
      my $retstat=$ret{$_}; 
 | 
			
		||||
      my %rsp1;
 | 
			
		||||
      $rsp1->{data}->[0]="$_: @$retstat";
 | 
			
		||||
      $callback->($rsp1);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
  return 0;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
=head3   monrmnode
 | 
			
		||||
        This function informs all the active monitoring plug-ins to remove the given
 | 
			
		||||
     nodes to their monitoring domain 
 | 
			
		||||
    Arguments:
 | 
			
		||||
      callback - the pointer to the callback function.
 | 
			
		||||
      args - The format of the args is:
 | 
			
		||||
        [-h|--help|-v|--version] or
 | 
			
		||||
        noderange
 | 
			
		||||
    Returns:
 | 
			
		||||
        0 for success. The output is returned through the callback pointer.
 | 
			
		||||
        1. for unsuccess. The error messages are returns through the callback pointer.
 | 
			
		||||
=cut
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub monrmnode {
 | 
			
		||||
  my $args=shift;
 | 
			
		||||
  my $callback=shift;
 | 
			
		||||
  my $VERSION;
 | 
			
		||||
  my $HELP;
 | 
			
		||||
 | 
			
		||||
  # subroutine to display the usage
 | 
			
		||||
  sub monrmnode_usage
 | 
			
		||||
  {
 | 
			
		||||
    my %rsp;
 | 
			
		||||
    $rsp->{data}->[0]= "Usage:";
 | 
			
		||||
    $rsp->{data}->[1]= "  monrmnode noderange";
 | 
			
		||||
    $rsp->{data}->[2]= "  monrmnode [-h|--help|-v|--version]";
 | 
			
		||||
    $rsp->{data}->[3]= "      noderange is a list of comma separated node or node group names.";
 | 
			
		||||
    $callback->($rsp);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @ARGV=@{$args};
 | 
			
		||||
  # parse the options
 | 
			
		||||
  if(!GetOptions(
 | 
			
		||||
      'h|help'     => \$::HELP,
 | 
			
		||||
      'v|version'  => \$::VERSION,))
 | 
			
		||||
  {
 | 
			
		||||
    &monrmnode_usage;
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  # display the usage if -h or --help is specified
 | 
			
		||||
  if ($::HELP) { 
 | 
			
		||||
    &monrmnode_usage;
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  # display the version statement if -v or --verison is specified
 | 
			
		||||
  if ($::VERSION)
 | 
			
		||||
  {
 | 
			
		||||
    my %rsp;
 | 
			
		||||
    $rsp->{data}->[0]= "monrmnode version 1.0";
 | 
			
		||||
    $callback->($rsp);
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  my $noderange;
 | 
			
		||||
  if (@ARGV < 1)
 | 
			
		||||
  {
 | 
			
		||||
    &monrmnode_usage;
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
  else {
 | 
			
		||||
    $noderange=$ARGV[0];
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  my @nodenames=noderange($noderange, 0);
 | 
			
		||||
  if (@nodenames==0) { return 0;}
 | 
			
		||||
 | 
			
		||||
  my %ret=xCAT_monitoring::monitorctrl->removeNodes(\@nodenames);
 | 
			
		||||
  if (%ret) {
 | 
			
		||||
    foreach(keys(%ret)) {
 | 
			
		||||
      my $retstat=$ret{$_}; 
 | 
			
		||||
      my %rsp1;
 | 
			
		||||
      $rsp1->{data}->[0]="$_: @$retstat";
 | 
			
		||||
      $callback->($rsp1);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
  return 0;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user