16e37a45d5
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@1525 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
321 lines
9.9 KiB
Perl
321 lines
9.9 KiB
Perl
#!/usr/bin/env perl
|
|
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
|
|
package xCAT_monitoring::xcatmon;
|
|
BEGIN
|
|
{
|
|
$::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat';
|
|
}
|
|
use lib "$::XCATROOT/lib/perl";
|
|
use xCAT::Utils;
|
|
use xCAT::GlobalDef;
|
|
use xCAT_monitoring::monitorctrl;
|
|
|
|
|
|
|
|
1;
|
|
#-------------------------------------------------------------------------------
|
|
=head1 xCAT_monitoring:xcatmon
|
|
=head2 Package Description
|
|
This is a xCAT monitoring plugin. The only thing that this plug-in does is
|
|
the node monitoring. To activate it simply do the following command:
|
|
chtab pname=xCAT monitoring.nodestatmon=Y
|
|
=cut
|
|
#-------------------------------------------------------------------------------
|
|
|
|
#--------------------------------------------------------------------------------
|
|
=head3 start
|
|
This function gets called by the monitorctrl module
|
|
when xcatd starts.
|
|
Arguments:
|
|
None.
|
|
Returns:
|
|
(return code, message)
|
|
=cut
|
|
#--------------------------------------------------------------------------------
|
|
sub start {
|
|
#print "xcatmon.start\n";
|
|
|
|
return (0, "started");
|
|
}
|
|
|
|
|
|
|
|
#--------------------------------------------------------------------------------
|
|
=head3 stop
|
|
This function gets called by the monitorctrl module when
|
|
xcatd stops.
|
|
Arguments:
|
|
none
|
|
Returns:
|
|
(return code, message)
|
|
=cut
|
|
#--------------------------------------------------------------------------------
|
|
sub stop {
|
|
|
|
return (0, "stopped");
|
|
}
|
|
|
|
|
|
|
|
|
|
#--------------------------------------------------------------------------------
|
|
=head3 supportNodeStatusMon
|
|
This function is called by the monitorctrl module to check
|
|
if this product can help monitoring and returning the node status.
|
|
|
|
Arguments:
|
|
none
|
|
Returns:
|
|
1
|
|
=cut
|
|
#--------------------------------------------------------------------------------
|
|
sub supportNodeStatusMon {
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
|
|
#--------------------------------------------------------------------------------
|
|
=head3 startNodeStatusMon
|
|
This function is called by the monitorctrl module to tell
|
|
the product to start monitoring the node status and feed them back
|
|
to xCAT.
|
|
Arguments:
|
|
None.
|
|
Returns:
|
|
(return code, message)
|
|
|
|
=cut
|
|
#--------------------------------------------------------------------------------
|
|
sub startNodeStatusMon {
|
|
my $temp=shift;
|
|
if ($temp =~ /xCAT_monitoring::xcatmon/) {
|
|
$temp=shift;
|
|
}
|
|
|
|
#print "xcatmon.startNodeStatusMon\n";
|
|
|
|
#run the command first to update the status,
|
|
my $cmd="$::XCATROOT/sbin/xcatnodemon";
|
|
#$output=`$cmd 2>&1`;
|
|
#if ($?) {
|
|
# print "xcatmon: $output\n";
|
|
#}
|
|
|
|
#figure out the ping-intercal setting
|
|
my $value=3; #default
|
|
my %settings=xCAT_monitoring::monitorctrl->getPluginSettings("xcatmon");
|
|
|
|
#print "settings for xcatmon:\n";
|
|
#foreach (keys(%settings)) {
|
|
# print "key=$_, value=$settings{$_}\n";
|
|
#}
|
|
my $reading=$settings{'ping-interval'};
|
|
if ($reading>0) { $value=$reading;}
|
|
|
|
#create the cron job, it will run the command every 3 minutes.
|
|
my $newentry;
|
|
if (xCAT::Utils->isAIX()) {
|
|
#AIX does not support */value format, have to list them all.
|
|
my $minutes;
|
|
if ($value==1) { $minutes='*';}
|
|
elsif ($value<=30) {
|
|
my @temp_a=(0..59);
|
|
foreach (@temp_a) {
|
|
if (($_ % $value) == 0) { $minutes .= "$_,";}
|
|
}
|
|
chop($minutes);
|
|
} else {
|
|
$minutes="0";
|
|
}
|
|
$newentry="$minutes * * * * XCATROOT=$::XCATROOT PATH=$ENV{'PATH'} XCATCFG='$ENV{'XCATCFG'}' $cmd";
|
|
} else {
|
|
$newentry="*/$value * * * * XCATROOT=$::XCATROOT PATH=$ENV{'PATH'} XCATCFG='$ENV{'XCATCFG'}' $cmd";
|
|
}
|
|
my ($code, $msg)=xCAT::Utils::add_cron_job($newentry);
|
|
if ($code==0) { return (0, "started"); }
|
|
else { return ($code, $msg); }
|
|
}
|
|
|
|
|
|
#--------------------------------------------------------------------------------
|
|
=head3 stopNodeStatusMon
|
|
This function is called by the monitorctrl module to tell
|
|
the product to stop feeding the node status info back to xCAT.
|
|
|
|
Arguments:
|
|
none
|
|
Returns:
|
|
(return code, message)
|
|
=cut
|
|
#--------------------------------------------------------------------------------
|
|
sub stopNodeStatusMon {
|
|
#TODO: turn off the node status monitoring.
|
|
|
|
my $job="$::XCATROOT/sbin/xcatnodemon";
|
|
my ($code, $msg)=xCAT::Utils::remove_cron_job($job);
|
|
if ($code==0) { return (0, "stopped"); }
|
|
else { return ($code, $msg); }
|
|
|
|
}
|
|
|
|
|
|
#--------------------------------------------------------------------------------
|
|
=head3 addNodes
|
|
This function is called by the monitorctrl module when new nodes are added
|
|
to the xCAT cluster. It should add the nodes into the product for monitoring.
|
|
Arguments:
|
|
nodes --nodes to be added. It is a pointer to an array. If the next argument is
|
|
1, each element is a ref to an array of [nodes, nodetype, status]. For example:
|
|
[['node1', 'active'], ['node2', 'booting']..].
|
|
if the next argument is 0, each element is a node name to be added.
|
|
boolean -- 1, or 0.
|
|
Returns:
|
|
(error code, error message)
|
|
=cut
|
|
#--------------------------------------------------------------------------------
|
|
sub addNodes {
|
|
|
|
#print "xcatmon:addNodes called\n";
|
|
|
|
return (0, "ok");
|
|
}
|
|
|
|
#--------------------------------------------------------------------------------
|
|
=head3 removeNodes
|
|
This function is called by the monitorctrl module when nodes are removed
|
|
from the xCAT cluster. It should remove the nodes from the product for monitoring.
|
|
Arguments:
|
|
nodes --nodes to be added. It is a pointer to an array. If the next argument is
|
|
1, each element is a ref to an array of [nodes, nodetype, status]. For example:
|
|
[['node1', 'active'], ['node2', 'booting']..].
|
|
if the next argument is 0, each element is a node name to be added.
|
|
boolean -- 1, or 0.
|
|
Returns:
|
|
(error code, error message)
|
|
=cut
|
|
#--------------------------------------------------------------------------------
|
|
sub removeNodes {
|
|
|
|
#print "xcatmon:removeNodes called\n";
|
|
|
|
return (0, "ok");
|
|
}
|
|
|
|
|
|
#--------------------------------------------------------------------------------
|
|
=head3 getMonNodesStatus
|
|
This function goes to the xCAT nodelist table to retrieve the saved node status
|
|
for all the node that are managed by local nodes.
|
|
Arguments:
|
|
none.
|
|
Returns:
|
|
a hash that has the node status. The format is:
|
|
{active=>[node1, node3,...], unreachable=>[node4, node2...], unknown=>[node8, node101...]}
|
|
=cut
|
|
#--------------------------------------------------------------------------------
|
|
sub getMonNodesStatus {
|
|
%status=();
|
|
my @inactive_nodes=();
|
|
my @active_nodes=();
|
|
my @unknown_nodes=();
|
|
|
|
my $hierachy=xCAT_monitoring::monitorctrl->getMonHierarchy();
|
|
my @mon_servers=keys(%$hierachy);
|
|
my $isSV=xCAT::Utils->isServiceNode();
|
|
|
|
#on a service node or on ms, get the nodes that has local host as the server node
|
|
my $monnodes;
|
|
my @hostinfo=xCAT::Utils->determinehostname();
|
|
my %iphash=();
|
|
foreach(@hostinfo) {$iphash{$_}=1;}
|
|
#if this is mn, include the ones that has no service nodes
|
|
if (!$isSV) { $iphash{'noservicenode'}=1;}
|
|
|
|
|
|
foreach(@mon_servers) {
|
|
#service node come in pairs, the first one is the monserver adapter that facing the mn,
|
|
# the second one is facing the cn. we use the first one here
|
|
my @server_pair=split(',', $_);
|
|
my $sv=$server_pair[0];
|
|
if ($iphash{$sv}) {
|
|
$monnodes=$hierachy->{$_};
|
|
}
|
|
}
|
|
|
|
foreach(@$monnodes) {
|
|
my $node=$_->[0];
|
|
my $status=$_->[2];
|
|
if ($status eq $::STATUS_ACTIVE) { push(@active_nodes, $node);}
|
|
elsif ($status eq $::STATUS_INACTIVE) { push(@inactive_nodes, $node);}
|
|
else { push(@unknown_nodes, $node);}
|
|
}
|
|
|
|
$status{$::STATUS_ACTIVE}=\@active_nodes;
|
|
$status{$::STATUS_INACTIVE}=\@inactive_nodes;
|
|
$status{unknown}=\@unknown_nodes;
|
|
|
|
return %status;
|
|
}
|
|
|
|
|
|
#--------------------------------------------------------------------------------
|
|
=head3 processNodeStatusChanges
|
|
This function will update the status column of the
|
|
nodelist table with the new node status.
|
|
Arguments:
|
|
status -- a hash pointer of the node status. A key is a status string. The value is
|
|
an array pointer of nodes that have the same status.
|
|
for example: {active=>["node1", "node1"], inactive=>["node5","node100"]}
|
|
Returns:
|
|
0 for successful.
|
|
non-0 for not successful.
|
|
=cut
|
|
#--------------------------------------------------------------------------------
|
|
sub processNodeStatusChanges {
|
|
my $temp=shift;
|
|
if ($temp =~ /xCAT_monitoring::xcatmon/) {
|
|
$temp=shift;
|
|
}
|
|
return xCAT_monitoring::monitorctrl->processNodeStatusChanges($temp);
|
|
}
|
|
|
|
#--------------------------------------------------------------------------------
|
|
=head3 processSettingChanges
|
|
This function gets called when the setting for this monitoring plugin
|
|
has been changed in the monsetting table.
|
|
Arguments:
|
|
none.
|
|
Returns:
|
|
0 for successful.
|
|
non-0 for not successful.
|
|
=cut
|
|
#--------------------------------------------------------------------------------
|
|
sub processSettingChanges {
|
|
#restart the cron job
|
|
xCAT_monitoring::xcatmon->stopNodeStatusMon();
|
|
xCAT_monitoring::xcatmon->startNodeStatusMon();
|
|
}
|
|
|
|
#--------------------------------------------------------------------------------
|
|
=head3 getDiscription
|
|
This function returns the detailed description of the plugin inluding the
|
|
valid values for its settings in the mon setting tabel.
|
|
Arguments:
|
|
none
|
|
Returns:
|
|
The description.
|
|
=cut
|
|
#--------------------------------------------------------------------------------
|
|
sub getDescription {
|
|
return
|
|
" Description:
|
|
xcatmon uses fping to report the node liveness status and update the
|
|
nodelist.status column. Use command 'monstart xcatmon -n' to start
|
|
monitoring.
|
|
Settings:
|
|
ping-interval: the number of minutes between each fping operation.
|
|
The default value is 3.";
|
|
}
|