From 9f2e8a975faaf254d0be52153bc34468cf57e989 Mon Sep 17 00:00:00 2001 From: phamt Date: Wed, 12 Oct 2011 04:22:25 +0000 Subject: [PATCH] Change start/stop subrouting so that when monstart/monstop gangliamon -r is invoked, gmetad/gmond on the localhost does not restart. If you invoke monstart/monstop gangliamon -r for one node, gmetad/gmond restarts on that one node, BUT gmetad/gmond is also restarted on the localhost. This causes all data to be lost for other nodes being monitored. With this change, monstart/monstop gangliamon -r will ONLY start/stop monitor on given nodes and NOT on localhost. monstart/monstop gangliamon without the "-r" will start/stop the monitoring on the localhost. git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@10748 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd --- xCAT-server/lib/xcat/monitoring/gangliamon.pm | 1700 +++++++++-------- 1 file changed, 859 insertions(+), 841 deletions(-) diff --git a/xCAT-server/lib/xcat/monitoring/gangliamon.pm b/xCAT-server/lib/xcat/monitoring/gangliamon.pm index 778ffca5d..025fe5ddb 100755 --- a/xCAT-server/lib/xcat/monitoring/gangliamon.pm +++ b/xCAT-server/lib/xcat/monitoring/gangliamon.pm @@ -1,9 +1,9 @@ -#!/usr/bin/env perl +#!/usr/bin/env perl # IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html package xCAT_monitoring::gangliamon; -BEGIN -{ - $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat'; + +BEGIN { + $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat'; } use lib "$::XCATROOT/lib/perl"; use xCAT::NodeRange; @@ -18,918 +18,927 @@ use warnings; 1; #------------------------------------------------------------------------------- + =head1 xCAT_monitoring:gangliamon =head2 Package Description xCAT monitoring plugin package to handle Ganglia 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 Ganglia 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 +=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 Ganglia 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 all nodes (except localhost), + 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 "gangliamon::start called\n"; - my $noderef=shift; - if ($noderef =~ /xCAT_monitoring::gangliamon/) - { - $noderef=shift; - } - my $scope=shift; - my $callback=shift; - my $localhost=hostname(); - my $OS=`uname`; - my $res_gmond; - if ( $OS =~ /AIX/ ) - { - $res_gmond = `/etc/rc.d/init.d/gmond restart 2>&1`; - } - else - { - $res_gmond = `/etc/init.d/gmond restart 2>&1`; - } - if ($?) - { - if ($callback) - { - my $resp={}; - $resp->{data}->[0]="$localhost: Ganglia Gmond not started successfully: $res_gmond \n"; - $callback->($resp); - } - else - { - xCAT::MsgUtils->message('S', "[mon]: $res_gmond \n"); - } - - return(1,"Ganglia Gmond not started successfully. \n"); - } - - my $res_gmetad; - if ( $OS =~ /AIX/ ) - { - $res_gmetad = `/etc/rc.d/init.d/gmetad restart 2>&1`; - } - else - { - $res_gmetad = `/etc/init.d/gmetad restart 2>&1`; - } +sub start { + print "gangliamon::start called\n"; + my $noderef = shift; + if ( $noderef =~ /xCAT_monitoring::gangliamon/ ) { + $noderef = shift; + } - if ($?) - { - if ($callback) - { - my $resp={}; - $resp->{data}->[0]="$localhost: Ganglia Gmetad not started successfully:$res_gmetad \n"; - $callback->($resp); - } - else - { - xCAT::MsgUtils->message('S', "[mon]: $res_gmetad \n"); - } + my $scope = shift; + my $callback = shift; + my $localhost = hostname(); + my $OS = `uname`; - return(1,"Ganglia Gmetad not started successfully. \n"); - } - + # Handle starting monitoring for localhost + # monstart gangliamon + if (!$scope) { + my $res_gmond = ''; + if ( $OS =~ /AIX/ ) { + $res_gmond = `/etc/rc.d/init.d/gmond restart 2>&1`; + } + else { + $res_gmond = `/etc/init.d/gmond restart 2>&1`; + } + + my $tmp; + if ($?) { + if ($callback) { + my $resp = {}; + $resp->{data}->[0] = "$localhost: Ganglia Gmond not started successfully: $res_gmond\n"; + $callback->($resp); + } + else { + xCAT::MsgUtils->message( 'S', "[mon]: $res_gmond\n" ); + } + + return ( 1, "Ganglia Gmond not started successfully.\n" ); + } + + my $res_gmetad = ''; + if ( $OS =~ /AIX/ ) { + + # Do not restart gmetad while it is running, else you will lose all data in the database + $tmp = `/etc/rc.d/init.d/gmetad status | grep running`; + if ( !$tmp ) { + $res_gmetad = `/etc/rc.d/init.d/gmetad restart 2>&1`; + } + } + else { + $tmp = `/etc/init.d/gmetad status | grep running`; + if ( !$tmp ) { + $res_gmetad = `/etc/init.d/gmetad restart 2>&1`; + } + } + + if ($?) { + if ($callback) { + my $resp = {}; + $resp->{data}->[0] = "$localhost: Ganglia Gmetad not started successfully:$res_gmetad\n"; + $callback->($resp); + } + else { + xCAT::MsgUtils->message( 'S', "[mon]: $res_gmetad\n" ); + } + + return ( 1, "Ganglia Gmetad not started successfully.\n" ); + } + } else { + # Handle starting monitoring for localhost + # monstart gangliamon -r + + #opening if scope + my $OS = `uname`; + 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, "" ); + } - - if ($scope) - { #opening if scope - my $OS=`uname`; - 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; + } - #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}; + if ( !$isSV ) { + $iphash{'noservicenode'} = 1; + } + my @children; + foreach my $key ( keys(%$pPairHash) ) { - 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 = undef; - my $result = undef; - if(exists($children[0])){ - $rec = join(',',@children); - } - if($rec){ - if ( $OS =~ /AIX/ ) - { - $result = `XCATBYPASS=Y $::XCATROOT/bin/xdsh $rec /etc/rc.d/init.d/gmond restart 2>&1`; - } - else - { - $result = `XCATBYPASS=Y $::XCATROOT/bin/xdsh $rec /etc/init.d/gmond restart 2>&1`; - } - } + #opening foreach1 + my @key_a = split( ':', $key ); + if ( !$iphash{ $key_a[0] } ) { + next; + } + my $mon_nodes = $pPairHash->{$key}; - if ($result) - { - if ($callback) - { - my $resp={}; - $resp->{data}->[0]="$localhost: $result\n"; - $callback->($resp); - } - else - { - xCAT::MsgUtils->message('S', "[mon]: $result\n"); - } - } + foreach (@$mon_nodes) { #opening foreach2 + my $node = $_->[0]; + my $nodetype = $_->[1]; + if ( ($nodetype) && ( $nodetype =~ /$::NODETYPE_OSI/ ) ) { + push( @children, $node ); + } + } #closing foreach2 + } #closing foreach1 - } #closing if scope + my $rec = undef; + my $result = undef; + if ( exists( $children[0] ) ) { + $rec = join( ',', @children ); + } - if ($callback) - { - my $resp={}; - $resp->{data}->[0]="$localhost: started. \n"; - $callback->($resp); - } + if ($rec) { + if ( $OS =~ /AIX/ ) { + $result = `XCATBYPASS=Y $::XCATROOT/bin/xdsh $rec /etc/rc.d/init.d/gmond restart 2>&1`; + } + else { + $result = `XCATBYPASS=Y $::XCATROOT/bin/xdsh $rec /etc/init.d/gmond restart 2>&1`; + } + } - return (0, "started"); + 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. It will - configure the cluster to include the given nodes within the monitoring domain. This - calls two other functions called as confGmond and confGmetad which are used for configuring - the Gmond and Gmetad configuration files respectively. + 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. It will + configure the cluster to include the given nodes within the monitoring domain. This + calls two other functions called as confGmond and confGmetad which are used for configuring + the Gmond and Gmetad configuration files respectively. + Arguments: - p_nodes -- a pointer to an arrays of nodes to be added for monitoring. none means all. - scope -- the action scope, it indicates the node type the action will take place. - 0 means localhost only. - 2 means localhost and nodes, - callback -- the callback pointer for error and status displaying. It can be null. - Returns: - (error code, error message) + p_nodes -- a pointer to an arrays of nodes to be added for monitoring. none means all. + scope -- the action scope, it indicates the node type the action will take place. + 0 means localhost only. + 2 means localhost and nodes, + callback -- the callback pointer for error and status displaying. It can be null. + Returns: + (error code, error message) =cut -#-------------------------------------------------------------- -sub config - { - print "gangliamon:config called\n"; - my $noderef=shift; - if ($noderef =~ /xCAT_monitoring::gangliamon/) { - $noderef=shift; - } - my $scope=shift; - my $callback=shift; - - confGmond($noderef,$scope,$callback); - confGmetad($noderef,$scope,$callback); - } - #-------------------------------------------------------------- +sub config { + print "gangliamon:config called\n"; + my $noderef = shift; + if ( $noderef =~ /xCAT_monitoring::gangliamon/ ) { + $noderef = shift; + } + + my $scope = shift; + my $callback = shift; + + confGmond( $noderef, $scope, $callback ); + confGmetad( $noderef, $scope, $callback ); +} + +#-------------------------------------------------------------- + =head3 confGmond This function is called by the config() function. It configures the Gmond - configuration files for the given nodes - Arguments: - p_nodes -- a pointer to an arrays of nodes to be added for monitoring. none means all. - scope -- the action scope, it indicates the node type the action will take place. - 0 means localhost only. - 2 means localhost and nodes, - callback -- the callback pointer for error and status displaying. It can be null. - Returns: none -=cut -#-------------------------------------------------------------- - -sub confGmond -{ - print "gangliamon:confGmond called \n"; - no warnings; - # no strict 'vars'; - my $noderef=shift; - if ($noderef =~ /xCAT_monitoring::gangliamon/) { - $noderef=shift; - } - - my $scope=shift; - my $callback=shift; - my $configure_file = ''; - my $localhost=hostname(); - chomp(my $hostname = `hostname`); + configuration files for the given nodes - #version 3.1.0 - if (-e "/etc/ganglia/gmond.conf"){ - $configure_file = '/etc/ganglia/gmond.conf'; + Arguments: + p_nodes -- a pointer to an arrays of nodes to be added for monitoring. none means all. + scope -- the action scope, it indicates the node type the action will take place. + 0 means localhost only. + 2 means localhost and nodes, + callback -- the callback pointer for error and status displaying. It can be null. + Returns: none +=cut + +#-------------------------------------------------------------- +sub confGmond { + print "gangliamon:confGmond called \n"; + no warnings; + + # no strict 'vars'; + my $noderef = shift; + if ( $noderef =~ /xCAT_monitoring::gangliamon/ ) { + $noderef = shift; } + + my $scope = shift; + my $callback = shift; + my $configure_file = ''; + my $localhost = hostname(); + chomp( my $hostname = `hostname` ); + + #version 3.1.0 + if ( -e "/etc/ganglia/gmond.conf" ) { + $configure_file = '/etc/ganglia/gmond.conf'; + } + #version 3.0.7 - elsif (-e "/etc/gmond.conf"){ + elsif ( -e "/etc/gmond.conf" ) { $configure_file = '/etc/gmond.conf'; } + #non should install - else - { - if ($callback){ - my $resp={}; - $resp->{data}->[0]="gangliamon: Please install Ganglia."; - $callback->($resp); - } - else{ - xCAT::MsgUtils->message('E', "gangliamon: Please install Ganglia. \n"); - } - return; - } - - 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;} - - #check the configure file - my $tmp = `/bin/grep "xCAT gmond settings done" $configure_file`; - if ($tmp) { #openinf if ? - if($callback) { - my $resp={}; - $resp->{data}->[0]="$localhost: $tmp"; + else { + if ($callback) { + my $resp = {}; + $resp->{data}->[0] = "gangliamon: Please install Ganglia."; $callback->($resp); } else { - xCAT::MsgUtils->message('S', "Gmond not configured $tmp\n"); + xCAT::MsgUtils->message( 'E', + "gangliamon: Please install Ganglia. \n" ); } - - #backup the original file - `/bin/cp -f $configure_file $configure_file.orig`; - `/bin/rm -f $configure_file`; - `/bin/touch $configure_file`; - open(FILE, "+>>$configure_file"); - my $fname = "$configure_file.orig"; - unless ( open( CONF, $fname )) - { - return(0); - } - - my @raw_data = ; - close( CONF ); - my $str = join('', @raw_data); - $str =~ s/setuid = yes/setuid = no/; - if ( !($str =~ m/#bind/) ) { - $str =~ s/bind/#bind/; # Comment out bind - } - $str =~ s/mcast_join = .*/host = $hostname/; - - # my @children; - foreach my $key (keys (%$pPairHash)) - { #opening for each - my @key_a=split(':', $key); - if (! $iphash{$key_a[0]}) { next; } - my $pattern = '^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'; - if ( $key_a[0]!~/$pattern/ ){ - my $cluster = $key_a[0]; - if (-e "/etc/xCATSN") - { - $str =~ s/name = "unspecified"/name="$cluster"/; - } - } - } #closing for each - - $str =~ s/name = "unspecified"/name="$hostname"/; - - if ( !($str =~ m/#mcast_join/) ) { - $str =~ s/mcast_join/#mcast_join/; # Comment out mcast_join - } - $str =~ s/# xCAT gmond settings done//; # Remove old message - print FILE $str; - print FILE "# xCAT gmond settings done\n"; - close(FILE); - } #closing if ? - - if ($scope) - {#opening if scope of confGmond - my @children; - my $install_root = xCAT::Utils->getInstallDir(); - foreach my $key (keys (%$pPairHash)) { #opening for each - 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]; - #print "node=$node, nodetype=$nodetype\n"; - if (($nodetype) && ($nodetype =~ /$::NODETYPE_OSI/)) - { - push(@children,$node); - } - } #closing foreach2 - - my $node = join(',',@children); - my $res_cp = `XCATBYPASS=Y $::XCATROOT/bin/xdcp $node $install_root/postscripts/confGang /tmp 2>&1`; - if($?) - { #openinf if ? - if($callback) { - my $resp={}; - $resp->{data}->[0]="$localhost: $res_cp"; - $callback->($resp); - } - else { - xCAT::MsgUtils->message('S', "Cannot copy confGang into /tmp: $res_cp \n"); - } - } #closing if ? - - my $res_conf; - if ( $key_a[0] =~ /noservicenode/ ){ - $res_conf=`XCATBYPASS=Y $::XCATROOT/bin/xdsh $node MONSERVER=$hostname MONMASTER=$key_a[1] /tmp/confGang 2>&1`; - } - else { - $res_conf=`XCATBYPASS=Y $::XCATROOT/bin/xdsh $node MONSERVER=$key_a[0] MONMASTER=$key_a[1] /tmp/confGang 2>&1`; - } - if($?) - { #openinf if ? - if($callback) - { - my $resp={}; - $resp->{data}->[0]="$localhost: $res_conf"; - $callback->($resp); - } - else { - xCAT::MsgUtils->message('S', "Cannot configure gmond in nodes: $res_conf \n"); - } - } #closing if ? - } #closing for each - - }#closing if scope -} # closing subroutine - -#-------------------------------------------------------------- -=head3 confGmetad - This function is called by the config() function. It configures the Gmetad - configuration files for the given nodes - Arguments: - p_nodes -- a pointer to an arrays of nodes to be added for monitoring. none means all. - scope -- the action scope, it indicates the node type the action will take place. - 0 means localhost only. - 2 means localhost and nodes, - callback -- the callback pointer for error and status displaying. It can be null. - Returns : none -=cut -#-------------------------------------------------------------- - -sub confGmetad - { - print "gangliamon:confGmetad called \n"; - # no warnings; - my $noderef=shift; - if ($noderef =~ /xCAT_monitoring::gangliamon/) { - $noderef=shift; - } - my $scope=shift; - my $callback=shift; - my $configure_file = ''; - my $localhost=hostname(); - - chomp(my $hostname = `hostname`); - - #version 3.1.0 - if (-e "/etc/ganglia/gmetad.conf"){ - $configure_file = '/etc/ganglia/gmetad.conf'; - } - #version 3.0.7 - elsif (-e "/etc/gmetad.conf"){ - $configure_file = '/etc/gmetad.conf'; - } - #non should install - else - { return; } - - my $tmp = `/bin/grep "xCAT gmetad settings done" $configure_file`; - if ($tmp) - { #openinf if ? - if($callback) { - my $resp={}; - $resp->{data}->[0]="$localhost: $tmp"; + + 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', "Gmetad not configured $tmp\n"); } - + 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; + } + + #check the configure file + my $tmp = `/bin/grep "xCAT gmond settings done" $configure_file`; + if ($tmp) { #openinf if ? + if ($callback) { + my $resp = {}; + $resp->{data}->[0] = "$localhost: $tmp"; + $callback->($resp); + } + else { + xCAT::MsgUtils->message( 'S', "Gmond not configured $tmp\n" ); + } + + #backup the original file + `/bin/cp -f $configure_file $configure_file.orig`; + `/bin/rm -f $configure_file`; + `/bin/touch $configure_file`; + open( FILE, "+>>$configure_file" ); + my $fname = "$configure_file.orig"; + unless ( open( CONF, $fname ) ) { + return (0); + } + + my @raw_data = ; + close(CONF); + my $str = join( '', @raw_data ); + $str =~ s/setuid = yes/setuid = no/; + if ( !( $str =~ m/#bind/ ) ) { + $str =~ s/bind/#bind/; # Comment out bind + } + $str =~ s/mcast_join = .*/host = $hostname/; + + # my @children; + foreach my $key ( keys(%$pPairHash) ) { #opening for each + my @key_a = split( ':', $key ); + if ( !$iphash{ $key_a[0] } ) { + next; + } + my $pattern = '^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'; + if ( $key_a[0] !~ /$pattern/ ) { + my $cluster = $key_a[0]; + if ( -e "/etc/xCATSN" ) { + $str =~ s/name = "unspecified"/name="$cluster"/; + } + } + } #closing for each + + $str =~ s/name = "unspecified"/name="$hostname"/; + + if ( !( $str =~ m/#mcast_join/ ) ) { + $str =~ s/mcast_join/#mcast_join/; # Comment out mcast_join + } + $str =~ s/# xCAT gmond settings done//; # Remove old message + print FILE $str; + print FILE "# xCAT gmond settings done\n"; + close(FILE); + } #closing if ? + + if ($scope) { #opening if scope of confGmond + my @children; + my $install_root = xCAT::Utils->getInstallDir(); + foreach my $key ( keys(%$pPairHash) ) { #opening for each + 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]; + + #print "node=$node, nodetype=$nodetype\n"; + if ( ($nodetype) && ( $nodetype =~ /$::NODETYPE_OSI/ ) ) { + push( @children, $node ); + } + } #closing foreach2 + + my $node = join( ',', @children ); + my $res_cp = `XCATBYPASS=Y $::XCATROOT/bin/xdcp $node $install_root/postscripts/confGang /tmp 2>&1`; + if ($?) { #openinf if ? + if ($callback) { + my $resp = {}; + $resp->{data}->[0] = "$localhost: $res_cp"; + $callback->($resp); + } + else { + xCAT::MsgUtils->message( 'S', + "Cannot copy confGang into /tmp: $res_cp \n" ); + } + } #closing if ? + + my $res_conf; + if ( $key_a[0] =~ /noservicenode/ ) { + $res_conf = `XCATBYPASS=Y $::XCATROOT/bin/xdsh $node MONSERVER=$hostname MONMASTER=$key_a[1] /tmp/confGang 2>&1`; + } + else { + $res_conf = `XCATBYPASS=Y $::XCATROOT/bin/xdsh $node MONSERVER=$key_a[0] MONMASTER=$key_a[1] /tmp/confGang 2>&1`; + } + + if ($?) { #openinf if ? + if ($callback) { + my $resp = {}; + $resp->{data}->[0] = "$localhost: $res_conf"; + $callback->($resp); + } + else { + xCAT::MsgUtils->message( 'S', + "Cannot configure gmond in nodes: $res_conf \n" ); + } + } #closing if ? + } #closing for each + + } #closing if scope +} # closing subroutine + +#-------------------------------------------------------------- + +=head3 confGmetad + This function is called by the config() function. It configures the Gmetad + configuration files for the given nodes + + Arguments: + p_nodes -- a pointer to an arrays of nodes to be added for monitoring. none means all. + scope -- the action scope, it indicates the node type the action will take place. + 0 means localhost only. + 2 means localhost and nodes, + callback -- the callback pointer for error and status displaying. It can be null. + Returns : none +=cut + +#-------------------------------------------------------------- +sub confGmetad { + print "gangliamon:confGmetad called \n"; + + # no warnings; + my $noderef = shift; + if ( $noderef =~ /xCAT_monitoring::gangliamon/ ) { + $noderef = shift; + } + my $scope = shift; + my $callback = shift; + my $configure_file = ''; + my $localhost = hostname(); + + chomp( my $hostname = `hostname` ); + + #version 3.1.0 + if ( -e "/etc/ganglia/gmetad.conf" ) { + $configure_file = '/etc/ganglia/gmetad.conf'; + } + + #version 3.0.7 + elsif ( -e "/etc/gmetad.conf" ) { + $configure_file = '/etc/gmetad.conf'; + } + + #non should install + else { + return; + } + + my $tmp = `/bin/grep "xCAT gmetad settings done" $configure_file`; + if ($tmp) { #openinf if ? + if ($callback) { + my $resp = {}; + $resp->{data}->[0] = "$localhost: $tmp"; + $callback->($resp); + } + else { + xCAT::MsgUtils->message( 'S', "Gmetad not configured $tmp\n" ); + } + # Backup the original file `/bin/cp -f $configure_file $configure_file.orig`; # Create new file from scratch `/bin/rm -f $configure_file`; `/bin/touch $configure_file`; - - open(OUTFILE,"+>>$configure_file") - or die ("Cannot open file \n"); - print(OUTFILE "# Setting up GMETAD configuration file \n"); - if (-e "/etc/xCATMN") - { - print(OUTFILE "data_source \"$hostname\" localhost \n"); + open( OUTFILE, "+>>$configure_file" ) + or die("Cannot open file \n"); + print( OUTFILE "# Setting up GMETAD configuration file \n" ); + + if ( -e "/etc/xCATMN" ) { + print( OUTFILE "data_source \"$hostname\" localhost \n" ); } - my $noderef=xCAT_monitoring::monitorctrl->getMonHierarchy(); - if (ref($noderef) eq 'ARRAY') { + + my $noderef = xCAT_monitoring::monitorctrl->getMonHierarchy(); + if ( ref($noderef) eq 'ARRAY' ) { if ($callback) { - my $resp={}; - $resp->{data}->[0]=$noderef->[1]; + my $resp = {}; + $resp->{data}->[0] = $noderef->[1]; $callback->($resp); - } else { - xCAT::MsgUtils->message('S', "[mon]: " . $noderef->[1]); } - return (1, ""); + else { + xCAT::MsgUtils->message( 'S', "[mon]: " . $noderef->[1] ); + } + return ( 1, "" ); } - - my @hostinfo=xCAT::Utils->determinehostname(); - my $isSV=xCAT::Utils->isServiceNode(); - my %iphash=(); - foreach(@hostinfo) {$iphash{$_}=1;} - if (!$isSV) { $iphash{'noservicenode'}=1;} + my @hostinfo = xCAT::Utils->determinehostname(); + my $isSV = xCAT::Utils->isServiceNode(); + my %iphash = (); + foreach (@hostinfo) { $iphash{$_} = 1; } + if ( !$isSV ) { + $iphash{'noservicenode'} = 1; + } my @children; my $cluster; - foreach my $key (keys (%$noderef)) - { - my @key_g=split(':', $key); - if (! $iphash{$key_g[0]}) { next;} - my $mon_nodes=$noderef->{$key}; - my $pattern = '^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'; - if ( $key_g[0]!~/$pattern/ ) - { + foreach my $key ( keys(%$noderef) ) { + my @key_g = split( ':', $key ); + if ( !$iphash{ $key_g[0] } ) { + next; + } + + my $mon_nodes = $noderef->{$key}; + my $pattern = '^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'; + if ( $key_g[0] !~ /$pattern/ ) { no warnings; $cluster = $key_g[0]; } - foreach(@$mon_nodes) - { - my $node=$_->[0]; - my $nodetype=$_->[1]; - if (($nodetype) && ($nodetype =~ /$::NODETYPE_OSI/)) - { - push(@children,$node); + + foreach (@$mon_nodes) { + my $node = $_->[0]; + my $nodetype = $_->[1]; + if ( ($nodetype) && ( $nodetype =~ /$::NODETYPE_OSI/ ) ) { + push( @children, $node ); } } + } + my $num = @children; + if ( -e "/etc/xCATSN" ) { + print( OUTFILE "gridname \"$cluster\"\n" ); + print( OUTFILE "data_source \"$cluster\" localhost\n" ); + my $master = xCAT::Utils->get_site_Master(); + print( OUTFILE "trusted_hosts $master\n" ); } - my $num=@children; - if (-e "/etc/xCATSN") - { - print ( OUTFILE "gridname \"$cluster\"\n"); - print ( OUTFILE "data_source \"$cluster\" localhost\n"); - my $master=xCAT::Utils->get_site_Master(); - print ( OUTFILE "trusted_hosts $master\n"); - } - else - { - for (my $j = 0; $j < $num; $j++) - { - print ( OUTFILE "data_source \"$children[ $j ]\" $children[ $j ]:8651 \n"); + else { + for ( my $j = 0 ; $j < $num ; $j++ ) { + print( OUTFILE + "data_source \"$children[ $j ]\" $children[ $j ]:8651 \n" + ); } } - print(OUTFILE "# xCAT gmetad settings done \n"); - close(OUTFILE); - } #closing if? -} # closing subrouting + print( OUTFILE "# xCAT gmetad settings done \n" ); + close(OUTFILE); + } #closing if? +} # closing subrouting #-------------------------------------------------------------- + =head3 deconfig - This function de-configures the cluster for the given nodes. This function is called + This function de-configures the cluster for the given nodes. This function is called when mondecfg command is issued by the user. This function restores the original Gmond and Gmetad configuration files by calling the deconfGmond and deconfGmetad functions respectively. Arguments: - p_nodes -- a pointer to an arrays of nodes to be removed for monitoring. none means all. - scope -- the action scope, it indicates the node type the action will take place. - 0 means local host only. - 2 means both local host and nodes, - callback -- the callback pointer for error and status displaying. It can be null. + p_nodes -- a pointer to an arrays of nodes to be removed for monitoring. none means all. + scope -- the action scope, it indicates the node type the action will take place. + 0 means local host only. + 2 means both local host and nodes, + callback -- the callback pointer for error and status displaying. It can be null. Returns: none =cut -#-------------------------------------------------------------- -sub deconfig - { - print "gangliamon:deconfig called\n"; - my $noderef=shift; - if ($noderef =~ /xCAT_monitoring::gangliamon/) { - $noderef=shift; - } - my $scope=shift; - my $callback=shift; - - deconfGmond($noderef,$scope,$callback); - deconfGmetad($noderef,$scope,$callback); - } - #-------------------------------------------------------------- -=head3 deconfGmond - This function is called by the deconfig() function. It deconfigures the Gmetad - configuration files for the given nodes - Arguments: - p_nodes -- a pointer to an arrays of nodes to be added for monitoring. none means all. - scope -- the action scope, it indicates the node type the action will take place. - 0 means localhost only. - 2 means localhost and nodes, - callback -- the callback pointer for error and status displaying. It can be null. - Returns:none -=cut -#-------------------------------------------------------------- - -sub deconfGmond - { - print "gangliamon:deconfGmond called \n"; - no warnings; - my $noderef=shift; - if ($noderef =~ /xCAT_monitoring::gangliamon/) { - $noderef=shift; - } - my $scope=shift; - my $callback=shift; - - my $localhost=hostname(); - - if (-e "/etc/ganglia/gmond.conf") - { #opening if V3.1.0 - `/bin/cp -f /etc/ganglia/gmond.conf /etc/ganglia/gmond.conf.save`; - my $decon_gmond=`/bin/cp -f /etc/ganglia/gmond.conf.orig /etc/ganglia/gmond.conf`; - if($?) - { #openinf if ? - if($callback) { - my $resp={}; - $resp->{data}->[0]="$localhost:$decon_gmond"; - $callback->($resp); - } else { xCAT::MsgUtils->message('S', "Gmond not deconfigured $decon_gmond \n"); } - } # closing if ? - } #closing if V3.1.0 - - else - { #opening V3.0.7 - `/bin/cp -f /etc/gmond.conf /etc/gmond.conf.save`; - my $decon_gmond=`/bin/cp -f /etc/gmond.conf.orig /etc/gmond.conf`; - if($?) - { #openinf if ? - if($callback) { - my $resp={}; - $resp->{data}->[0]="$localhost:$decon_gmond"; - $callback->($resp); - } else { xCAT::MsgUtils->message('S', "Gmond not deconfigured $decon_gmond \n"); } - } # closing if? - } #closing V3.0.7 - - if ($scope) - {#opening if scope of confGmond - 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, ""); +sub deconfig { + print "gangliamon:deconfig called\n"; + my $noderef = shift; + if ( $noderef =~ /xCAT_monitoring::gangliamon/ ) { + $noderef = shift; } - #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 for each - 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 - - my $node = join(',',@children); - if (-e "/etc/ganglia/gmond.conf") - { # opening if V3.1.0 - my $res_sv = `XCATBYPASS=Y $::XCATROOT/bin/xdsh $node /bin/cp -f /etc/ganglia/gmond.conf /etc/ganglia/gmond.conf.save`; - - my $res_cp = `XCATBYPASS=Y $::XCATROOT/bin/xdsh $node /bin/cp -f /etc/ganglia/gmond.conf.orig /etc/ganglia/gmond.conf`; - if($?) - { #openinf if ? - if($callback) - { - my $resp={}; - $resp->{data}->[0]="$localhost: $res_cp"; - $callback->($resp); - } - else { xCAT::MsgUtils->message('S', "Gmond not deconfigured: $res_cp \n"); } - } #closing if ? - } # closing if V3.1.0 - - else - { - my $res_sv = `XCATBYPASS=Y $::XCATROOT/bin/xdsh $node /bin/cp -f /etc/gmond.conf /etc/gmond.conf.save`; - - my $res_cp = `XCATBYPASS=Y $::XCATROOT/bin/xdsh $node /bin/cp -f /etc/gmond.conf.orig /etc/gmond.conf`; - if($?) - { #openinf if ? - if($callback) - { - my $resp={}; - $resp->{data}->[0]="$localhost: $res_cp"; - $callback->($resp); - } - else { xCAT::MsgUtils->message('S', "Gmond not deconfigured: $res_cp \n"); } - } #closing if ? - } # closing if V3.1.0 - } # closing for each - } # closing if scope - - } # closing subroutine + my $scope = shift; + my $callback = shift; + deconfGmond( $noderef, $scope, $callback ); + deconfGmetad( $noderef, $scope, $callback ); +} #-------------------------------------------------------------- -=head3 deconfGmetad - This function is called by the deconfig() function. It deconfigures the Gmetad - configuration files for the given nodes + +=head3 deconfGmond + This function is called by the deconfig() function. It deconfigures the Gmetad + configuration files for the given nodes + Arguments: - p_nodes -- a pointer to an arrays of nodes to be added for monitoring. none means all. - scope -- the action scope, it indicates the node type the action will take place. - 0 means localhost only. - 2 means localhost and nodes, - callback -- the callback pointer for error and status displaying. It can be null. + p_nodes -- a pointer to an arrays of nodes to be added for monitoring. none means all. + scope -- the action scope, it indicates the node type the action will take place. + 0 means localhost only. + 2 means localhost and nodes, + callback -- the callback pointer for error and status displaying. It can be null. Returns:none =cut + +#-------------------------------------------------------------- +sub deconfGmond { + print "gangliamon:deconfGmond called \n"; + no warnings; + my $noderef = shift; + + if ( $noderef =~ /xCAT_monitoring::gangliamon/ ) { + $noderef = shift; + } + + my $scope = shift; + my $callback = shift; + + my $localhost = hostname(); + + if ( -e "/etc/ganglia/gmond.conf" ) { #opening if V3.1.0 + `/bin/cp -f /etc/ganglia/gmond.conf /etc/ganglia/gmond.conf.save`; + my $decon_gmond = `/bin/cp -f /etc/ganglia/gmond.conf.orig /etc/ganglia/gmond.conf`; + if ($?) { #openinf if ? + if ($callback) { + my $resp = {}; + $resp->{data}->[0] = "$localhost:$decon_gmond"; + $callback->($resp); + } + else { + xCAT::MsgUtils->message( 'S', "Gmond not deconfigured $decon_gmond \n" ); + } + } # closing if ? + } #closing if V3.1.0 + + else { #opening V3.0.7 + `/bin/cp -f /etc/gmond.conf /etc/gmond.conf.save`; + my $decon_gmond = `/bin/cp -f /etc/gmond.conf.orig /etc/gmond.conf`; + if ($?) { #openinf if ? + if ($callback) { + my $resp = {}; + $resp->{data}->[0] = "$localhost:$decon_gmond"; + $callback->($resp); + } + else { + xCAT::MsgUtils->message( 'S', "Gmond not deconfigured $decon_gmond \n" ); + } + } # closing if? + } #closing V3.0.7 + + if ($scope) { #opening if scope of confGmond + 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 for each + 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 + + my $node = join( ',', @children ); + if ( -e "/etc/ganglia/gmond.conf" ) { # opening if V3.1.0 + my $res_sv = `XCATBYPASS=Y $::XCATROOT/bin/xdsh $node /bin/cp -f /etc/ganglia/gmond.conf /etc/ganglia/gmond.conf.save`; + + my $res_cp = `XCATBYPASS=Y $::XCATROOT/bin/xdsh $node /bin/cp -f /etc/ganglia/gmond.conf.orig /etc/ganglia/gmond.conf`; + if ($?) { #openinf if ? + if ($callback) { + my $resp = {}; + $resp->{data}->[0] = "$localhost: $res_cp"; + $callback->($resp); + } + else { + xCAT::MsgUtils->message( 'S', "Gmond not deconfigured: $res_cp \n" ); + } + } #closing if ? + } # closing if V3.1.0 + + else { + my $res_sv = `XCATBYPASS=Y $::XCATROOT/bin/xdsh $node /bin/cp -f /etc/gmond.conf /etc/gmond.conf.save`; + + my $res_cp = `XCATBYPASS=Y $::XCATROOT/bin/xdsh $node /bin/cp -f /etc/gmond.conf.orig /etc/gmond.conf`; + if ($?) { #openinf if ? + if ($callback) { + my $resp = {}; + $resp->{data}->[0] = "$localhost: $res_cp"; + $callback->($resp); + } + else { + xCAT::MsgUtils->message( 'S', + "Gmond not deconfigured: $res_cp \n" ); + } + } #closing if ? + } # closing if V3.1.0 + } # closing for each + } # closing if scope + +} # closing subroutine + #-------------------------------------------------------------- -sub deconfGmetad - { - print "gangliamon:deconfGmetad called \n"; - no warnings; - my $noderef=shift; - if ($noderef =~ /xCAT_monitoring::gangliamon/) { - $noderef=shift; - } - my $scope=shift; - my $callback=shift; - - my $localhost=hostname(); - - if (-e "/etc/ganglia/gmetad.conf") - { #opening V3.1.0 - `/bin/cp -f /etc/ganglia/gmetad.conf /etc/ganglia/gmetad.conf.save`; - my $decon_gmetad=`/bin/cp -f /etc/ganglia/gmetad.conf.orig /etc/ganglia/gmetad.conf`; - if($?) - { #openinf if ? - if($callback) { - my $resp={}; - $resp->{data}->[0]="$localhost: $decon_gmetad"; - $callback->($resp); - } else { xCAT::MsgUtils->message('S', "Gmetadd not deconfigured $decon_gmetad \n"); } - } - } #closing V3.1.0 - - else - { #opening V3.0.7 - `/bin/cp -f /etc/gmetad.conf /etc/gmetad.conf.save`; - my $decon_gmetad=`/bin/cp -f /etc/gmetad.conf.orig /etc/gmetad.conf`; - if($?) - { #openinf if ? - if($callback) { - my $resp={}; - $resp->{data}->[0]="$localhost: $decon_gmetad"; - $callback->($resp); - } else { xCAT::MsgUtils->message('S', "Gmetadd not deconfigured $decon_gmetad \n"); } - } - } #closing 3.0.7 - - } # closing subroutine - -#-------------------------------------------------------------------------------- -=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 - Ganglia monitoring. +=head3 deconfGmetad + This function is called by the deconfig() function. It deconfigures the Gmetad + configuration files for the given nodes + 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. + p_nodes -- a pointer to an arrays of nodes to be added for monitoring. none means all. + scope -- the action scope, it indicates the node type the action will take place. + 0 means localhost only. + 2 means localhost and nodes, + callback -- the callback pointer for error and status displaying. It can be null. + Returns:none =cut +#-------------------------------------------------------------- +sub deconfGmetad { + print "gangliamon:deconfGmetad called \n"; + no warnings; + my $noderef = shift; + if ( $noderef =~ /xCAT_monitoring::gangliamon/ ) { + $noderef = shift; + } + my $scope = shift; + my $callback = shift; + + my $localhost = hostname(); + + if ( -e "/etc/ganglia/gmetad.conf" ) { #opening V3.1.0 + `/bin/cp -f /etc/ganglia/gmetad.conf /etc/ganglia/gmetad.conf.save`; + my $decon_gmetad = `/bin/cp -f /etc/ganglia/gmetad.conf.orig /etc/ganglia/gmetad.conf`; + if ($?) { #openinf if ? + if ($callback) { + my $resp = {}; + $resp->{data}->[0] = "$localhost: $decon_gmetad"; + $callback->($resp); + } + else { + xCAT::MsgUtils->message( 'S', "Gmetad not deconfigured $decon_gmetad \n" ); + } + } + } #closing V3.1.0 + + else { #opening V3.0.7 + `/bin/cp -f /etc/gmetad.conf /etc/gmetad.conf.save`; + my $decon_gmetad = `/bin/cp -f /etc/gmetad.conf.orig /etc/gmetad.conf`; + if ($?) { #openinf if ? + if ($callback) { + my $resp = {}; + $resp->{data}->[0] = "$localhost: $decon_gmetad"; + $callback->($resp); + } + else { + xCAT::MsgUtils->message( 'S', "Gmetad not deconfigured $decon_gmetad \n" ); + } + } + } #closing 3.0.7 +} #-------------------------------------------------------------------------------- -sub stop - { # starting sub routine - print "gangliamon::stop called\n"; - my $noderef=shift; - if ($noderef =~ /xCAT_monitoring::gangliamon/) - { - $noderef=shift; - } - my $scope=shift; - my $callback=shift; - my $localhost=hostname(); - my $OS=`uname`; - my $res_gmond; - if ( $OS =~ /AIX/ ) - { - $res_gmond = `/etc/rc.d/init.d/gmond stop 2>&1`; - } - else - { - $res_gmond = `/etc/init.d/gmond stop 2>&1`; - } - if ($?) - { - if ($callback) - { - my $resp={}; - $resp->{data}->[0]="$localhost: Ganglia Gmond not stopped successfully: $res_gmond \n"; - $callback->($resp); - } - else - { - xCAT::MsgUtils->message('S', "[mon]: $res_gmond \n"); - } - - return(1,"Ganglia Gmond not stopped successfully. \n"); - } - - my $res_gmetad; - if ( $OS =~ /AIX/ ) - { - $res_gmetad = `/etc/rc.d/init.d/gmetad stop 2>&1`; - } - else - { - $res_gmetad = `/etc/init.d/gmetad stop 2>&1`; - } - - if ($?) - { - if ($callback) - { - my $resp={}; - $resp->{data}->[0]="$localhost: Ganglia Gmetad not stopped successfully:$res_gmetad \n"; - $callback->($resp); - } - else - { - xCAT::MsgUtils->message('S', "[mon]: $res_gmetad \n"); - } - - return(1,"Ganglia Gmetad not stopped successfully. \n"); - } - - - - if ($scope) { #opening if scope - my $OS=`uname`; - 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 $result = undef; - my $rec = undef; - if( exists($children[0]) ){ - $rec = join(',',@children); - } - if($rec){ - if ( $OS =~ /AIX/ ) - { - $result = `XCATBYPASS=Y $::XCATROOT/bin/xdsh $rec /etc/rc.d/init.d/gmond stop 2>&1`; - } - else - { - $result = `XCATBYPASS=Y $::XCATROOT/bin/xdsh $rec /etc/init.d/gmond 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 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 + Ganglia 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 all nodes (except localhost), + 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 { + print "gangliamon::stop called\n"; + my $noderef = shift; + if ( $noderef =~ /xCAT_monitoring::gangliamon/ ) { + $noderef = shift; + } + my $scope = shift; # Scope is always 2 + my $callback = shift; + my $localhost = hostname(); + my $OS = `uname`; + my $res_gmond; + if ( $OS =~ /AIX/ ) { + $res_gmond = `/etc/rc.d/init.d/gmond stop 2>&1`; + } + else { + $res_gmond = `/etc/init.d/gmond stop 2>&1`; + } + + if (!$scope) { + # Handle stopping monitoring on localhost + # monstop gangliamon + if ($?) { + if ($callback) { + my $resp = {}; + $resp->{data}->[0] = "$localhost: Ganglia Gmond not stopped successfully: $res_gmond \n"; + $callback->($resp); + } + else { + xCAT::MsgUtils->message( 'S', "[mon]: $res_gmond \n" ); + } + + return ( 1, "Ganglia Gmond not stopped successfully. \n" ); + } + + my $res_gmetad; + if ( $OS =~ /AIX/ ) { + $res_gmetad = `/etc/rc.d/init.d/gmetad stop 2>&1`; + } + else { + $res_gmetad = `/etc/init.d/gmetad stop 2>&1`; + } + + if ($?) { + if ($callback) { + my $resp = {}; + $resp->{data}->[0] = "$localhost: Ganglia Gmetad not stopped successfully:$res_gmetad \n"; + $callback->($resp); + } + else { + xCAT::MsgUtils->message( 'S', "[mon]: $res_gmetad \n" ); + } + + return ( 1, "Ganglia Gmetad not stopped successfully. \n" ); + } + } else { + # Handle stopping monitoring for given noderange + # monstop gangliamon -r + + my $OS = `uname`; + 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 $result = undef; + my $rec = undef; + if ( exists( $children[0] ) ) { + $rec = join( ',', @children ); + } + if ($rec) { + if ( $OS =~ /AIX/ ) { + $result = `XCATBYPASS=Y $::XCATROOT/bin/xdsh $rec /etc/rc.d/init.d/gmond stop 2>&1`; + } + else { + $result = `XCATBYPASS=Y $::XCATROOT/bin/xdsh $rec /etc/init.d/gmond 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" ); + } + } + } + + 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 Ganglia can help monitoring and returning the node status. @@ -942,13 +951,13 @@ sub stop #-------------------------------------------------------------------------------- sub supportNodeStatusMon { - #print "gangliamon::supportNodeStatusMon called\n"; - return 1; + + #print "gangliamon::supportNodeStatusMon called\n"; + return 1; } - - #-------------------------------------------------------------------------------- + =head3 startNodeStatusMon This function is called by the monitorctrl module to tell Ganglia to start monitoring the node status and feed them back @@ -961,14 +970,16 @@ sub supportNodeStatusMon { (return code, message) =cut + #-------------------------------------------------------------------------------- sub startNodeStatusMon { - #print "gangliamon::startNodeStatusMon called\n"; - return (0, "started"); + + #print "gangliamon::startNodeStatusMon called\n"; + return ( 0, "started" ); } - #-------------------------------------------------------------------------------- + =head3 stopNodeStatusMon This function is called by the monitorctrl module to tell Ganglia to stop feeding the node status info back to xCAT. It will @@ -979,41 +990,48 @@ sub startNodeStatusMon { Returns: (return code, message) =cut + #-------------------------------------------------------------------------------- sub stopNodeStatusMon { - #print "gangliamon::stopNodeStatusMon called\n"; - return (0, "stopped"); + + #print "gangliamon::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: + 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 +sub getDescription { + return "Description: This plugin will help interface the xCat cluster with Gangliam monitoring software \n"; } #-------------------------------------------------------------------------------- + =head3 getPostscripts - This function returns the postscripts needed for the nodes. - Arguments: none - Returns: - The the postscripts. It a pointer to an array with the node group names as the keys - and the comma separated poscript names as the value. For example: - {service=>"cmd1,cmd2", xcatdefaults=>"cmd3,cmd4"} where xcatdefults is a group - of all nodes including the service nodes. + This function returns the postscripts needed for the nodes. + + Arguments: none + Returns: + The the postscripts. It a pointer to an array with the node group names as the keys + and the comma separated poscript names as the value. For example: + {service=>"cmd1,cmd2", xcatdefaults=>"cmd3,cmd4"} where xcatdefults is a group + of all nodes including the service nodes. =cut + #-------------------------------------------------------------------------------- sub getPostscripts { - my $ret={}; - $ret->{compute}="confGang"; - return $ret; + my $ret = {}; + $ret->{compute} = "confGang"; + return $ret; }