added supported in monitoring plug-in to allow customize the plug-ins. settings column is added to the monitoring table. now xcatmon ping interval can be adjusted by command 'startmon xcatmon -n -s ping-interval=2'
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@552 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
		@@ -93,15 +93,16 @@ mac => {
 | 
			
		||||
	},
 | 
			
		||||
  },
 | 
			
		||||
monitoring => {
 | 
			
		||||
    cols => [qw(name nodestatmon comments disable)],
 | 
			
		||||
    cols => [qw(name nodestatmon settings comments disable)],
 | 
			
		||||
    keys => [qw(name)],
 | 
			
		||||
    required => [qw(name)],
 | 
			
		||||
    table_desc => 'Controls what external monitoring tools xCAT sets up and uses.  Entries should be added and removed from this table using the provided xCAT commands startmon and stopmon.',
 | 
			
		||||
	descriptions => {
 | 
			
		||||
		name => "The name of the mornitoring plug-in module.  The plug-in must be put in $ENV{XCATROOT}/lib/perl/xCAT_monitoring/.  See the man page for startmon for details.",
 | 
			
		||||
		nodestatmon => 'Specifies if the monitoring plug-in is used to feed the node status to the xCAT cluster.  Any one of the following values indicates "yes":  y, Y, yes, Yes, YES, 1.  Any other value or blank (default), indicates "no".',
 | 
			
		||||
    	comments => 'Any user-written notes.',
 | 
			
		||||
    	disable => "Set to 'yes' or '1' to comment out this row.",
 | 
			
		||||
		settings => 'Specifies the plug-in specific settings. These setting will be used by the plug-in to customize certain entities for the plug-in or the third party monitoring software. e.g. mon_interval=10,toggle=1',    	
 | 
			
		||||
                comments => 'Any user-written notes.',
 | 
			
		||||
    	        disable => "Set to 'yes' or '1' to comment out this row.",
 | 
			
		||||
	},
 | 
			
		||||
  },
 | 
			
		||||
mp => {
 | 
			
		||||
@@ -1152,6 +1153,10 @@ push(@{$defspec{group}->{'attrs'}}, @nodeattrs);
 | 
			
		||||
                 tabentry => 'monitoring.nodestatmon',
 | 
			
		||||
                 access_tabentry => 'monitoring.name=attr:name',
 | 
			
		||||
                 },
 | 
			
		||||
        {attr_name => 'settings',
 | 
			
		||||
                 tabentry => 'monitoring.settings',
 | 
			
		||||
                 access_tabentry => 'monitoring.name=attr:name',
 | 
			
		||||
                 },
 | 
			
		||||
        {attr_name => 'comments',
 | 
			
		||||
                 tabentry => 'monitoring.comments',
 | 
			
		||||
                 access_tabentry => 'monitoring.name=attr:name',
 | 
			
		||||
 
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							@@ -18,7 +18,7 @@ use xCAT_monitoring::montbhandler;
 | 
			
		||||
 | 
			
		||||
#the list store the names of the monitoring plug-in and the file name and module names.
 | 
			
		||||
#the names are stored in the "name" column of the monitoring table. 
 | 
			
		||||
#the format is: (name=>[filename, modulename], ...)
 | 
			
		||||
#the format is: (name=>[filename, modulename, settings], ...)
 | 
			
		||||
%PRODUCT_LIST;
 | 
			
		||||
 | 
			
		||||
#stores the module name and the method that is used for the node status monitoring
 | 
			
		||||
@@ -343,10 +343,11 @@ sub startMonitoring {
 | 
			
		||||
    my $aRef=$PRODUCT_LIST{$_};
 | 
			
		||||
    if ($aRef) {
 | 
			
		||||
      my $module_name=$aRef->[1];
 | 
			
		||||
      my $settings=$aRef->[2];
 | 
			
		||||
 | 
			
		||||
      undef $SIG{CHLD};
 | 
			
		||||
      #initialize and start monitoring
 | 
			
		||||
      my @ret1 = ${$module_name."::"}{start}->($monservers);
 | 
			
		||||
      my @ret1 = ${$module_name."::"}{start}->($monservers, $settings);
 | 
			
		||||
      $ret{$_}=\@ret1;
 | 
			
		||||
    } else {
 | 
			
		||||
       $ret{$_}=[1, "Monitoring plug-in module $_ is not registered."];
 | 
			
		||||
@@ -383,12 +384,13 @@ sub startNodeStatusMonitoring {
 | 
			
		||||
    my $aRef=$PRODUCT_LIST{$pname};
 | 
			
		||||
    if ($aRef) {
 | 
			
		||||
      my $module_name=$aRef->[1];
 | 
			
		||||
      my $settings=$aRef->[2];
 | 
			
		||||
      undef $SIG{CHLD};
 | 
			
		||||
      my $method = ${$module_name."::"}{supportNodeStatusMon}->();
 | 
			
		||||
      # return value 0 means not support. 1 means yes. 
 | 
			
		||||
      if ($method > 0) {
 | 
			
		||||
        #start nodes tatus monitoring
 | 
			
		||||
        my @ret2 = ${$module_name."::"}{startNodeStatusMon}->(getMonHierarchy()); 
 | 
			
		||||
        my @ret2 = ${$module_name."::"}{startNodeStatusMon}->(getMonHierarchy(), $settings); 
 | 
			
		||||
        return @ret2;
 | 
			
		||||
      }         
 | 
			
		||||
      else {
 | 
			
		||||
@@ -772,7 +774,7 @@ sub refreshProductList {
 | 
			
		||||
  #get the monitoring plug-in list from the monitoring table
 | 
			
		||||
  my $table=xCAT::Table->new("monitoring", -create =>1);
 | 
			
		||||
  if ($table) {
 | 
			
		||||
    my @tmp1=$table->getAllAttribs(('name','nodestatmon'));
 | 
			
		||||
    my @tmp1=$table->getAllAttribs(('name','nodestatmon', 'settings'));
 | 
			
		||||
    if (defined(@tmp1) && (@tmp1 > 0)) {
 | 
			
		||||
      foreach(@tmp1) {
 | 
			
		||||
        my $pname=$_->{name};
 | 
			
		||||
@@ -784,15 +786,16 @@ sub refreshProductList {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        #find out the monitoring plugin file and module name for the product
 | 
			
		||||
        $file_name="$::XCATROOT/lib/perl/xCAT_monitoring/$pname.pm";
 | 
			
		||||
        $module_name="xCAT_monitoring::$pname";
 | 
			
		||||
        my $file_name="$::XCATROOT/lib/perl/xCAT_monitoring/$pname.pm";
 | 
			
		||||
        my $module_name="xCAT_monitoring::$pname";
 | 
			
		||||
        my $settings=$_->{settings};
 | 
			
		||||
        #load the module in memory
 | 
			
		||||
        eval {require($file_name)};
 | 
			
		||||
        if ($@) {   
 | 
			
		||||
          print "The file $file_name cannot be located or has compiling errors.\n"; 
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
          my @a=($file_name, $module_name);
 | 
			
		||||
          my @a=($file_name, $module_name, $settings);
 | 
			
		||||
          $PRODUCT_LIST{$pname}=\@a;
 | 
			
		||||
        }
 | 
			
		||||
      } 
 | 
			
		||||
 
 | 
			
		||||
@@ -36,6 +36,7 @@ package xCAT_monitoring::templatemon;
 | 
			
		||||
         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']...], ...}   
 | 
			
		||||
      settings -- ping-interval=x,   x is in number of minutes   
 | 
			
		||||
    Returns:
 | 
			
		||||
      (return code, message)      
 | 
			
		||||
=cut
 | 
			
		||||
@@ -45,6 +46,7 @@ sub start {
 | 
			
		||||
  if ($monservers =~ /xCAT_monitoring::templatemon/) {
 | 
			
		||||
    $monservers=shift;
 | 
			
		||||
  }
 | 
			
		||||
  my $setting=shift;
 | 
			
		||||
 | 
			
		||||
  #demo how you can parse the input. you may commnet it out.
 | 
			
		||||
  my $monservers=shift;
 | 
			
		||||
@@ -114,6 +116,7 @@ sub supportNodeStatusMon {
 | 
			
		||||
         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']...], ...}   
 | 
			
		||||
      settings -- ping-interval=x,   x is in number of minutes   
 | 
			
		||||
    Returns:
 | 
			
		||||
        (return code, message)
 | 
			
		||||
 | 
			
		||||
@@ -124,6 +127,7 @@ sub startNodeStatusMon {
 | 
			
		||||
  if ($monservers =~ /xCAT_monitoring::templatemon/) {
 | 
			
		||||
    $monservers=shift;
 | 
			
		||||
  }
 | 
			
		||||
  my $setting=shift;
 | 
			
		||||
 | 
			
		||||
  #demo how you can parse the input. you may commnet it out.
 | 
			
		||||
  my $monservers=shift;
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,8 @@ use Sys::Hostname;
 | 
			
		||||
      monservers --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']...], ...}   
 | 
			
		||||
           {monserver1=>[['node1', 'osi', 'active'], ['node2', 'switch', 'booting']...], ...}
 | 
			
		||||
      settings -- ping-interval=x,   x is in number of minutes   
 | 
			
		||||
    Returns:
 | 
			
		||||
      (return code, message)      
 | 
			
		||||
=cut
 | 
			
		||||
@@ -89,26 +90,40 @@ sub supportNodeStatusMon {
 | 
			
		||||
         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']...], ...}   
 | 
			
		||||
      settings -- ping-interval=x,   x is in number of minutes   
 | 
			
		||||
    Returns:
 | 
			
		||||
        (return code, message)
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
#--------------------------------------------------------------------------------
 | 
			
		||||
sub startNodeStatusMon {
 | 
			
		||||
  my $temp=shift;
 | 
			
		||||
  if ($temp =~ /xCAT_plugin::xcatmon/) {
 | 
			
		||||
    $temp=shift;
 | 
			
		||||
  }
 | 
			
		||||
  my $setting=shift;
 | 
			
		||||
 | 
			
		||||
  #print "xcatmon.startNodeStatusMon\n";
 | 
			
		||||
 | 
			
		||||
  #run the command first to update the status, 
 | 
			
		||||
  my $cmd="$::XCATROOT/sbin/xcatnodemon";
 | 
			
		||||
  $output=`$cmd 2>&1`;
 | 
			
		||||
  if ($?) {
 | 
			
		||||
    print "xcatmon: $output\n";
 | 
			
		||||
  #$output=`$cmd 2>&1`;
 | 
			
		||||
  #if ($?) {
 | 
			
		||||
  #  print "xcatmon: $output\n";
 | 
			
		||||
  #}
 | 
			
		||||
  
 | 
			
		||||
  #figure out the ping-intercal setting
 | 
			
		||||
  my $value=3;
 | 
			
		||||
  if ($setting) {
 | 
			
		||||
    if ($setting =~ /ping-interval=(\d+)/) { $value= ($1>0) ? $1 : 3; }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
  #create the cron job, it will run the command every 3 minutes.
 | 
			
		||||
  my $newentry="*/3 * * * * XCATROOT=$::XCATROOT $cmd";
 | 
			
		||||
  my $newentry="*/$value * * * * XCATROOT=$::XCATROOT $cmd";
 | 
			
		||||
  my ($code, $msg)=xCAT::Utils::add_cron_job($newentry);
 | 
			
		||||
  if ($code==0) { return (0, "started"); }
 | 
			
		||||
  else {  return ($code, $msg); }
 | 
			
		||||
  else {  return ($code, $msg); } 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -127,19 +127,21 @@ sub startmon {
 | 
			
		||||
  {
 | 
			
		||||
    my %rsp;
 | 
			
		||||
    $rsp->{data}->[0]= "Usage:";
 | 
			
		||||
    $rsp->{data}->[1]= "  startmon name [-n|--nodestatmon]";
 | 
			
		||||
    $rsp->{data}->[1]= "  startmon name [-n|--nodestatmon] [-s|--settings]";
 | 
			
		||||
    $rsp->{data}->[2]= "  startmon [-h|--help|-v|--version]";
 | 
			
		||||
    $rsp->{data}->[3]= "     name is the name of the monitoring plug-in to be registered and invoked.";
 | 
			
		||||
    $callback->($rsp);
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  @ARGV=@{$args};
 | 
			
		||||
  my $settings;
 | 
			
		||||
 | 
			
		||||
  # parse the options
 | 
			
		||||
  if(!GetOptions(
 | 
			
		||||
      'h|help'     => \$::HELP,
 | 
			
		||||
      'v|version'  => \$::VERSION,
 | 
			
		||||
      'n|nodestatmon'  => \$::NODESTATMON))
 | 
			
		||||
      'n|nodestatmon'  => \$::NODESTATMON,
 | 
			
		||||
      's|settings=s'  => \$settings))
 | 
			
		||||
  {
 | 
			
		||||
    &startmon_usage;
 | 
			
		||||
    return;
 | 
			
		||||
@@ -223,8 +225,12 @@ sub startmon {
 | 
			
		||||
	$nstat='Y';
 | 
			
		||||
      }
 | 
			
		||||
      my %tb_cols=(nodestatmon=>$nstat);
 | 
			
		||||
      if ($settings) {
 | 
			
		||||
	$tb_cols{settings}=$settings;
 | 
			
		||||
      }
 | 
			
		||||
      $table->setAttribs(\%key_col, \%tb_cols);
 | 
			
		||||
    }   
 | 
			
		||||
    }  
 | 
			
		||||
    $table->close(); 
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  my %rsp1;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user