diff --git a/xCAT-server/lib/xcat/monitoring/gangliamon.pm b/xCAT-server/lib/xcat/monitoring/gangliamon.pm index c6eb7c2df..aa8926b0d 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 -# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html +# IBM(c) 2012 EPL license http://www.eclipse.org/legal/epl-v10.html package xCAT_monitoring::gangliamon; BEGIN { - $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat'; + $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat'; } use lib "$::XCATROOT/lib/perl"; use xCAT::NodeRange; @@ -20,8 +20,8 @@ use warnings; #------------------------------------------------------------------------------- =head1 xCAT_monitoring:gangliamon -=head2 Package Description - xCAT monitoring plugin package to handle Ganglia monitoring. +=head2 Package Description + xCAT monitoring plugin to handle Ganglia monitoring. =cut #------------------------------------------------------------------------------- @@ -29,900 +29,855 @@ use warnings; #-------------------------------------------------------------------------------- =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. + 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. + 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. + Returns: + (return code, message) + If the callback is set, use callback to display the status and error. =cut #-------------------------------------------------------------------------------- sub start { - print "gangliamon::start called\n"; - my $noderef = shift; - if ( $noderef =~ /xCAT_monitoring::gangliamon/ ) { - $noderef = shift; - } + 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 $scope = shift; + my $callback = shift; + my $localhost = hostname(); + my $OS = `uname`; - # 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, "" ); - } + # 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 + + 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; - } + if ( !$isSV ) { + $iphash{'noservicenode'} = 1; + } - my @children; - foreach my $key ( keys(%$pPairHash) ) { + my @children; + foreach my $key ( keys(%$pPairHash) ) { + my @key_a = split( ':', $key ); + if ( !$iphash{ $key_a[0] } ) { + next; + } + my $mon_nodes = $pPairHash->{$key}; - #opening foreach1 - my @key_a = split( ':', $key ); - if ( !$iphash{ $key_a[0] } ) { - next; - } - my $mon_nodes = $pPairHash->{$key}; + foreach (@$mon_nodes) { + my $node = $_->[0]; + my $nodetype = $_->[1]; + if ( ($nodetype) && ( $nodetype =~ /$::NODETYPE_OSI/ ) ) { + push( @children, $node ); + } + } + } - 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 ); + } - 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`; + } + } - 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`; - } - } + if ($result) { + if ($callback) { + my $resp = {}; + $resp->{data}->[0] = "$localhost: $result\n"; + $callback->($resp); + } + else { + xCAT::MsgUtils->message( 'S', "[mon]: $result\n" ); + } + } + } - 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); + } - if ($callback) { - my $resp = {}; - $resp->{data}->[0] = "$localhost: started. \n"; - $callback->($resp); - } - - return ( 0, "started" ); + return ( 0, "started" ); } #-------------------------------------------------------------- =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; - } + print "gangliamon: config called\n"; + my $noderef = shift; + if ( $noderef =~ /xCAT_monitoring::gangliamon/ ) { + $noderef = shift; + } - my $scope = shift; - my $callback = shift; + my $scope = shift; + my $callback = shift; - confGmond( $noderef, $scope, $callback ); - confGmetad( $noderef, $scope, $callback ); + 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 + 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 + 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; + print "gangliamon: confGmond called\n"; + no warnings; - # no strict 'vars'; - my $noderef = shift; - if ( $noderef =~ /xCAT_monitoring::gangliamon/ ) { - $noderef = shift; - } + 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` ); + 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.1.0 + if ( -e "/etc/ganglia/gmond.conf" ) { + $configure_file = '/etc/ganglia/gmond.conf'; + } - #version 3.0.7 - elsif ( -e "/etc/gmond.conf" ) { - $configure_file = '/etc/gmond.conf'; - } + # Version 3.0.7 + 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; - } + # Monintoring should be installed + 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, "" ); - } + 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; - } + 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); + } - #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 @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/; + foreach my $key ( keys(%$pPairHash) ) { + 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"/; + } + } + } - # 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"/; - $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); - 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) { + my @children; + my $install_root = xCAT::Utils->getInstallDir(); + foreach my $key ( keys(%$pPairHash) ) { + my @key_a = split( ':', $key ); + if ( !$iphash{ $key_a[0] } ) { + next; + } - 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}; - my $mon_nodes = $pPairHash->{$key}; + foreach (@$mon_nodes) { + my $node = $_->[0]; + my $nodetype = $_->[1]; - foreach (@$mon_nodes) { #opening foreach2 - my $node = $_->[0]; - my $nodetype = $_->[1]; + if ( ($nodetype) && ( $nodetype =~ /$::NODETYPE_OSI/ ) ) { + push( @children, $node ); + } + } - #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 ($?) { + 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" ); + } + } - 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`; + } - 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 ($?) { + 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" ); + } + } + } - 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 + 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. + 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"; + 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(); + 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` ); + chomp( my $hostname = `hostname` ); - # version 3.1.0 - if ( -e "/etc/ganglia/gmetad.conf" ) { - $configure_file = '/etc/ganglia/gmetad.conf'; - } + # 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'; - } + # Version 3.0.7 + elsif ( -e "/etc/gmetad.conf" ) { + $configure_file = '/etc/gmetad.conf'; + } - # mon should be installed - else { - return; - } - - # Backup the original file - `/bin/cp -f $configure_file $configure_file.orig`; + # Monitoring should be installed + else { + return; + } + + # 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`; + # 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" ); + 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' ) { - if ($callback) { - my $resp = {}; - $resp->{data}->[0] = $noderef->[1]; - $callback->($resp); - } else { - xCAT::MsgUtils->message( 'S', "[mon]: " . $noderef->[1] ); - } - return ( 1, "" ); - } + if ( -e "/etc/xCATMN" ) { + print( OUTFILE "data_source \"$hostname\" localhost \n" ); + } + + my $noderef = xCAT_monitoring::monitorctrl->getMonHierarchy(); + if ( ref($noderef) eq 'ARRAY' ) { + if ($callback) { + my $resp = {}; + $resp->{data}->[0] = $noderef->[1]; + $callback->($resp); + } 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 @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/ ) { - no warnings; - $cluster = $key_g[0]; - } + 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" ); - } - else { - for ( my $j = 0 ; $j < $num ; $j++ ) { - print( OUTFILE - "data_source \"$children[ $j ]\" $children[ $j ]:8651 \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" + ); + } + } - print( OUTFILE "# xCAT gmetad settings done \n" ); - close(OUTFILE); -} # closing subrouting + print( OUTFILE "# xCAT gmetad settings done \n" ); + close(OUTFILE); +} #-------------------------------------------------------------- =head3 deconfig - 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. + 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; - } + print "gangliamon: deconfig called\n"; + my $noderef = shift; + if ( $noderef =~ /xCAT_monitoring::gangliamon/ ) { + $noderef = shift; + } - my $scope = shift; - my $callback = shift; + my $scope = shift; + my $callback = shift; - deconfGmond( $noderef, $scope, $callback ); - deconfGmetad( $noderef, $scope, $callback ); + 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 + 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; + print "gangliamon: deconfGmond called \n"; + no warnings; + my $noderef = shift; - if ( $noderef =~ /xCAT_monitoring::gangliamon/ ) { - $noderef = shift; - } + if ( $noderef =~ /xCAT_monitoring::gangliamon/ ) { + $noderef = shift; + } - my $scope = shift; - my $callback = shift; + my $scope = shift; + my $callback = shift; - my $localhost = hostname(); + 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 + if ( -e "/etc/ganglia/gmond.conf" ) { # 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 ($?) { + if ($callback) { + my $resp = {}; + $resp->{data}->[0] = "$localhost:$decon_gmond"; + $callback->($resp); + } + else { + xCAT::MsgUtils->message( 'S', "Gmond not deconfigured $decon_gmond \n" ); + } + } + } else { # 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 ($?) { + if ($callback) { + my $resp = {}; + $resp->{data}->[0] = "$localhost:$decon_gmond"; + $callback->($resp); + } else { + xCAT::MsgUtils->message( 'S', "Gmond not deconfigured $decon_gmond \n" ); + } + } + } - 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) { + 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 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; } - #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) ) { + my @key_a = split( ':', $key ); + if ( !$iphash{ $key_a[0] } ) { next; } + my $mon_nodes = $pPairHash->{$key}; - 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) { + my $node = $_->[0]; + my $nodetype = $_->[1]; + if ( ($nodetype) && ( $nodetype =~ /$::NODETYPE_OSI/ ) ) { + push( @children, $node ); + } + } - 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" ) { # 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 ($?) { + if ($callback) { + my $resp = {}; + $resp->{data}->[0] = "$localhost: $res_cp"; + $callback->($resp); + } else { + xCAT::MsgUtils->message( 'S', "Gmond not deconfigured: $res_cp \n" ); + } + } + } - 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`; + 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/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 $res_cp = `XCATBYPASS=Y $::XCATROOT/bin/xdsh $node /bin/cp -f /etc/gmond.conf.orig /etc/gmond.conf`; + if ($?) { + if ($callback) { + my $resp = {}; + $resp->{data}->[0] = "$localhost: $res_cp"; + $callback->($resp); + } + else { + xCAT::MsgUtils->message( 'S', + "Gmond not deconfigured: $res_cp \n" ); + } + } + } + } + } +} #-------------------------------------------------------------- =head3 deconfGmetad - This function is called by the deconfig() function. It deconfigures the Gmetad - configuration files for the given nodes + 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 deconfGmetad { - print "gangliamon:deconfGmetad called \n"; - no warnings; - my $noderef = shift; - if ( $noderef =~ /xCAT_monitoring::gangliamon/ ) { - $noderef = shift; - } - my $scope = shift; - my $callback = shift; + 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(); + 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 + if ( -e "/etc/ganglia/gmetad.conf" ) { # 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 ($?) { + if ($callback) { + my $resp = {}; + $resp->{data}->[0] = "$localhost: $decon_gmetad"; + $callback->($resp); + } else { + xCAT::MsgUtils->message( 'S', "Gmetad not deconfigured $decon_gmetad \n" ); + } + } + } else { # 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 ($?) { + if ($callback) { + my $resp = {}; + $resp->{data}->[0] = "$localhost: $decon_gmetad"; + $callback->($resp); + } else { + xCAT::MsgUtils->message( 'S', "Gmetad not deconfigured $decon_gmetad \n" ); + } + } + } } #-------------------------------------------------------------------------------- =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. + 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. + 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`; + 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`; - if (!$scope) { - # Handle stopping monitoring on localhost - # monstop gangliamon - - 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" ); - } - } 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, "" ); - } + if (!$scope) { + # Handle stopping monitoring on localhost + # monstop gangliamon + + 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" ); + } + } 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; } + #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}; + my @children; + foreach my $key ( keys(%$pPairHash) ) { + 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`; - } - } + foreach (@$mon_nodes) { + my $node = $_->[0]; + my $nodetype = $_->[1]; + if ( ($nodetype) && ( $nodetype =~ /$::NODETYPE_OSI/ ) ) { + push( @children, $node ); + } + } + } + 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); - } + 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" ); + return ( 0, "stopped" ); } #-------------------------------------------------------------------------------- @@ -931,17 +886,13 @@ sub stop { This function is called by the monitorctrl module to check if Ganglia can help monitoring and returning the node status. - Arguments: - none - Returns: - 1 + Arguments: None + Returns: 1 =cut #-------------------------------------------------------------------------------- sub supportNodeStatusMon { - - #print "gangliamon::supportNodeStatusMon called\n"; - return 1; + return 1; } #-------------------------------------------------------------------------------- @@ -952,8 +903,7 @@ sub supportNodeStatusMon { to xCAT. Ganglia will start setting up the condition/response to monitor the node status changes. - Arguments: - None. + Arguments: None Returns: (return code, message) @@ -961,9 +911,7 @@ sub supportNodeStatusMon { #-------------------------------------------------------------------------------- sub startNodeStatusMon { - - #print "gangliamon::startNodeStatusMon called\n"; - return ( 0, "started" ); + return ( 0, "started" ); } #-------------------------------------------------------------------------------- @@ -973,53 +921,47 @@ sub startNodeStatusMon { Ganglia to stop feeding the node status info back to xCAT. It will stop the condition/response that is monitoring the node status. - Arguments: - none + Arguments: None Returns: (return code, message) =cut #-------------------------------------------------------------------------------- sub stopNodeStatusMon { - - #print "gangliamon::stopNodeStatusMon called\n"; - return ( 0, "stopped" ); + return ( 0, "stopped" ); } #-------------------------------------------------------------------------------- =head3 getDiscription - This function returns the detailed description of the plugin inluding the - valid values for its settings in the monsetting tabel. - - Arguments: - none - Returns: - The description. + 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 - Gangliam monitoring software \n"; + 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. + 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. + 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; }