xcat-core/xCAT-server/lib/xcat/monitoring/gangliamon.pm

1202 lines
36 KiB
Perl
Raw Normal View History

#!/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';
}
use lib "$::XCATROOT/lib/perl";
use xCAT::NodeRange;
use Sys::Hostname;
use Socket;
use xCAT::Utils;
use xCAT::GlobalDef;
use xCAT_monitoring::monitorctrl;
use xCAT::MsgUtils;
use strict;
use warnings;
1;
#-------------------------------------------------------------------------------
=head1 xCAT_monitoring: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
#--------------------------------------------------------------------------------
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`;
}
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");
}
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 $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 ($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.
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)
=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);
}
#--------------------------------------------------------------
=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 $localhost=hostname();
chomp(my $hostname = `hostname`);
if (-e "/etc/ganglia/gmond.conf")
{ #opening if 3.1.0
`/bin/grep "xCAT gmond settings done" /etc/ganglia/gmond.conf`;
if($?)
{ #openinf if ?
if($callback) {
my $resp={};
$resp->{data}->[0]="$localhost: $?";
$callback->($resp);
} else { xCAT::MsgUtils->message('S', "Gmond not configured $? \n"); }
#backup the original file
`/bin/cp -f /etc/ganglia/gmond.conf /etc/ganglia/gmond.conf.orig`;
my $master=xCAT::Utils->get_site_Master();
open(FILE1, "</etc/ganglia/gmond.conf");
open(FILE, "+>/etc/ganglia/gmond.conf.tmp");
my $fname = "/etc/ganglia/gmond.conf";
unless ( open( CONF, $fname ))
{
return(0);
}
my @raw_data = <CONF>;
close( CONF );
my $str = join('',@raw_data);
$str =~ s/setuid = yes/setuid = no/;
$str =~ s/bind/#bind/;
$str =~ s/mcast_join = .*/host = $master/;
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 $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/mcast_join/# mcast_join/;
print FILE $str;
print FILE "# xCAT gmond settings done \n";
close(FILE1);
close(FILE);
`/bin/cp -f /etc/ganglia/gmond.conf.tmp /etc/ganglia/gmond.conf`;
# } #closing for each
} #closing if ?
} #closing if 3.1.0
else
{ #opening if 3.0.7
`/bin/grep "xCAT gmond settings done" /etc/gmond.conf`;
if($?)
{ #openinf if ?
if($callback) {
my $resp={};
$resp->{data}->[0]="$localhost: $?";
$callback->($resp);
} else { xCAT::MsgUtils->message('S', "Gmond not configured $? \n"); }
#backup the original file
`/bin/cp -f /etc/gmond.conf /etc/gmond.conf.orig`;
my $master=xCAT::Utils->get_site_Master();
open(FILE1, "</etc/gmond.conf");
open(FILE, "+>/etc/gmond.conf.tmp");
my $fname = "/etc/gmond.conf";
unless ( open( CONF, $fname ))
{
return(0);
}
my @raw_data = <CONF>;
close( CONF );
my $str = join('',@raw_data);
$str =~ s/setuid = yes/setuid = no/;
$str =~ s/bind/#bind/;
$str =~ s/mcast_join = .*/host = $master/;
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 $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/mcast_join/# mcast_join/;
print FILE $str;
print FILE "# xCAT gmond settings done \n";
close(FILE1);
close(FILE);
`/bin/cp -f /etc/gmond.conf.tmp /etc/gmond.conf`;
# } #closing for each
} #closing if ?
} #closing if 3.0.7
if ($scope)
{#opening if scope of confGmond
chomp(my $hostname = `hostname`);
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];
#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/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 $localhost=hostname();
chomp(my $hostname = `hostname`);
if (-e "/etc/ganglia/gmetad.conf")
{ #opening if 3.1.0
`/bin/grep "xCAT gmetad settings done" /etc/ganglia/gmetad.conf`;
if($?)
{ #openinf if ?
if($callback) {
my $resp={};
$resp->{data}->[0]="$localhost: $?";
$callback->($resp);
} else { xCAT::MsgUtils->message('S', "Gmetad not configured $? \n"); }
# backup the original file
`/bin/cp -f /etc/ganglia/gmetad.conf /etc/ganglia/gmetad.conf.orig`;
open(FILE1, "</etc/ganglia/gmetad.conf");
open(FILE, "+>/etc/ganglia/gmetad.conf.tmp");
while (readline(FILE1))
{
# print STDERR "READ = $_\n";
s/data_source/#data_source/g;
# print STDERR "POST-READ = $_\n";
print FILE $_;
}
close(FILE1);
close(FILE);
`/bin/cp -f /etc/ganglia/gmetad.conf.tmp /etc/ganglia/gmetad.conf`;
open(OUTFILE,"+>>/etc/ganglia/gmetad.conf")
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, "");
}
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/ )
{
no warnings;
$cluster = $key_g[0];
}
foreach(@$mon_nodes)
{
my $node=$_->[0];
my $nodetype=$_->[1];
if (($nodetype) && ($nodetype =~ /$::NODETYPE_OSI/))
{
push(@children,$node);
}
}
}
my $num=@children;
if (-e "/etc/xCATSN")
{
for (my $i = 0; $i < $num; $i++)
{
print ( OUTFILE "data_source \"$cluster\" $children[ $i ] \n");
}
}
else
{
for (my $j = 0; $j < $num; $j++)
{
print ( OUTFILE "data_source \"$children[ $j ]\" $children[ $j ] \n");
}
}
print(OUTFILE "# xCAT gmetad settings done \n");
close(OUTFILE);
} #closing if? loop
} # closing if 3.1.0
else
{#opening if 3.0.7
`/bin/grep "xCAT gmetad settings done" /etc/gmetad.conf`;
if($?)
{ #openinf if ?
if($callback) {
my $resp={};
$resp->{data}->[0]="$localhost: $?";
$callback->($resp);
} else { xCAT::MsgUtils->message('S', "Gmetad not configured $? \n"); }
# backup the original file
`/bin/cp -f /etc/gmetad.conf /etc/gmetad.conf.orig`;
open(FILE1, "</etc/gmetad.conf");
open(FILE, "+>/etc/gmetad.conf.tmp");
while (readline(FILE1))
{
s/data_source/#data_source/g;
print FILE $_;
}
close(FILE1);
close(FILE);
`/bin/cp -f /etc/gmetad.conf.tmp /etc/gmetad.conf`;
open(OUTFILE,"+>>/etc/gmetad.conf")
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, "");
}
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);
# print "a[0] is: $key_g[0] \n";
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);
}
}
}
my $num=@children;
if (-e "/etc/xCATSN")
{
for (my $i = 0; $i < $num; $i++)
{
print ( OUTFILE "data_source \"$cluster\" $children[ $i ] \n");
}
}
else
{
for (my $j = 0; $j < $num; $j++)
{
print ( OUTFILE "data_source \"$children[ $j ]\" $children[ $j ] \n");
}
}
print(OUTFILE "# xCAT gmetad settings done \n");
close(OUTFILE);
} #closing if? loop
} #closing if 3.0.7
} # closing subrouting
#--------------------------------------------------------------
=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.
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.
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, "");
}
#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
#--------------------------------------------------------------
=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 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', "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.
Arguments:
p_nodes -- a pointer to an arrays of nodes to be stoped for monitoring. null means all.
scope -- the action scope, it indicates the node type the action will take place.
0 means localhost only.
2 means both monservers and nodes,
callback -- the callback pointer for error and status displaying. It can be null.
Returns:
(return code, message)
if the callback is set, use callback to display the status and error.
=cut
#--------------------------------------------------------------------------------
sub stop
{ # starting sub routine
print "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 supportNodeStatusMon
This function is called by the monitorctrl module to check
if Ganglia can help monitoring and returning the node status.
Arguments:
none
Returns:
1
=cut
#--------------------------------------------------------------------------------
sub supportNodeStatusMon {
#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
to xCAT. Ganglia will start setting up the condition/response
to monitor the node status changes.
Arguments:
None.
Returns:
(return code, message)
=cut
#--------------------------------------------------------------------------------
sub startNodeStatusMon {
#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
stop the condition/response that is monitoring the node status.
Arguments:
none
Returns:
(return code, message)
=cut
#--------------------------------------------------------------------------------
sub stopNodeStatusMon {
#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:
none
Returns:
The description.
=cut
#--------------------------------------------------------------------------------
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.
=cut
#--------------------------------------------------------------------------------
sub getPostscripts {
my $ret={};
$ret->{compute}="confGang";
return $ret;
}