changes in monitoring plug-in infrastructure to better fit the xCAT env

git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@1978 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
linggao 2008-08-01 17:35:58 +00:00
parent 739ca852f7
commit 9621c2854c
9 changed files with 2216 additions and 1462 deletions

File diff suppressed because it is too large Load Diff

View File

@ -46,7 +46,7 @@ sub regMonitoringNotif {
my $tab = xCAT::Table->new('notification');
my $regged=0;
if ($tab) {
(my $ref) = $tab->getAttribs({filename => qw(montbhandler.pm)}, tables);
(my $ref) = $tab->getAttribs({filename => qw(montbhandler.pm)}, 'tables');
if ($ref and $ref->{tables}) {
$regged=1;
}
@ -54,7 +54,7 @@ sub regMonitoringNotif {
}
if (!$regged) {
xCAT_plugin::notification::regNotification([qw(montbhandler.pm monitoring,monsetting -o a,u,d)]);
xCAT_plugin::notification::regNotification([qw(montbhandler.pm monsetting -o a,u,d)]);
}
}

View File

@ -6,11 +6,12 @@ BEGIN
$::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat';
}
use lib "$::XCATROOT/lib/perl";
use strict;
use IO::File;
use xCAT::Utils;
use xCAT::MsgUtils;
use xCAT_monitoring::monitorctrl;
use Sys::Hostname;
#print "xCAT_monitoring::snmpmon loaded\n";
1;
@ -27,61 +28,334 @@ use xCAT_monitoring::monitorctrl;
#--------------------------------------------------------------------------------
=head3 start
This function gets called by the monitorctrl module
when xcatd starts.
This function gets called by the monitorctrl module when monstart command
gets called and when xcatd starts.
Arguments:
None.
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)
(return code, message)
if the callback is set, use callback to display the status and error.
=cut
#--------------------------------------------------------------------------------
sub start {
#print "snmpmon::start called\n";
print "snmpmon:start called\n";
my $noderef=shift;
if ($noderef =~ /xCAT_monitoring::snmpmon/) {
$noderef=shift;
}
my $scope=shift;
my $callback=shift;
# do not turn it on on the service node
#if (xCAT::Utils->isServiceNode()) { return (0, "");}
my $localhostname=hostname();
# unless we are running on linux, exit.
#unless($^O eq "linux"){
# exit;
# }
# get the PID of the currently running snmptrapd if it is running.
# then stop it and restart it again so that it reads our new
# snmptrapd.conf configuration file. Then the process
my $pid;
chomp($pid= `/bin/ps -ef | /bin/grep snmptrapd | /bin/grep -v grep | /bin/awk '{print \$2}'`);
if($pid){
`/bin/kill -9 $pid`;
}
# start it up again!
system("/usr/sbin/snmptrapd -m ALL");
# get the PID of the currently running snmpd if it is running.
# if it's running then we just leave. Otherwise, if we don't get A PID, then we
# assume that it isn't running, and start it up again!
chomp($pid= `/bin/ps -ef | /bin/grep snmpd | /bin/grep -v grep | /bin/awk '{print \$2}'`);
unless($pid){
# start it up!
system("/usr/sbin/snmpd");
}
if ($scope) {
#enable alerts on the nodes
#enable bmcs if any
if ($callback) {
my $rsp={};
$rsp->{data}->[0]="$localhostname: enabling SNMP alert on BMCs and MMs...";
$callback->($rsp);
}
configBMC(1, $noderef, $callback);
#enable MMAs if any
configMPA(1, $noderef, $callback);
}
if ($callback) {
my $rsp={};
$rsp->{data}->[0]="$localhostname: started.";
$callback->($rsp);
}
return (0, "started")
}
#--------------------------------------------------------------------------------
=head3 stop
This function gets called by the monitorctrl module when monstop command gets called.
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 {
print "snmpmon:stop called\n";
my $noderef=shift;
if ($noderef =~ /xCAT_monitoring::snmpmon/) {
$noderef=shift;
}
my $scope=shift;
my $callback=shift;
my $localhostname=hostname();
if ($scope) {
if ($callback) {
my $rsp={};
$rsp->{data}->[0]="$localhostname: disabling SNMP alert on BMCs and MMs...";
$callback->($rsp);
}
#disable MMAs if any
configMPA(0, $noderef, $callback);
#disable BMC so that it stop senging alerts (PETs) to this node
configBMC(0, $noderef, $callback);
}
# now check to see if the daemon is running. If it is then we need to resart or stop?
# it with the new snmptrapd.conf file that will not forward events to RMC.
chomp(my $pid= `/bin/ps -ef | /bin/grep snmptrapd | /bin/grep -v grep | /bin/awk '{print \$2}'`);
if($pid){
`/bin/kill -9 $pid`;
# start it up again!
#system("/usr/sbin/snmptrapd");
}
if ($callback) {
my $rsp={};
$rsp->{data}->[0]="$localhostname: stopped.";
$callback->($rsp);
}
return (0, "stopped");
}
#--------------------------------------------------------------------------------
=head3 supportNodeStatusMon
This function is called by the monitorctrl module to check
if SNMP can help monitoring and returning the node status.
SNMP does not support this function.
Arguments:
none
Returns:
0
=cut
#--------------------------------------------------------------------------------
sub supportNodeStatusMon {
return 0;
}
#--------------------------------------------------------------------------------
=head3 startNodeStatusMon
This function is called by the monitorctrl module when monstart gets called and
when xcatd starts. It starts monitoring the node status and feed them back
to xCAT.
Arguments:
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 loca lhost only.
2 means both localhost and nodes,
callback -- the callback pointer for error and status displaying. It can be null.
note: p_nodes and scope are ignored by this plugin.
Returns:
(return code, message)
if the callback is set, use callback to display the status and error.
This function is called by the monitorctrl module to tell
=cut
#--------------------------------------------------------------------------------
sub startNodeStatusMon {
return (1, "This function is not supported.");
}
#--------------------------------------------------------------------------------
=head3 stopNodeStatusMon
This function is called by the monitorctrl module when monstop command is issued.
It stops feeding the node status info back to xCAT.
Arguments:
p_nodes -- a pointer to an arrays of nodes to stoped for monitoring. null 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.
note: p_nodes and scope are ignored by this plugin.
Returns:
(return code, message)
if the callback is set, use callback to display the status and error.
=cut
#--------------------------------------------------------------------------------
sub stopNodeStatusMon {
return (1, "This function is not supported.");
}
#--------------------------------------------------------------------------------
=head3 config
This function configures the cluster for the given nodes.
This function is called when monconfig command is issued or when xcatd starts
on the service node. It will configure the cluster to include the given nodes within
the monitoring doamin.
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 "snmpmon:config called\n";
my $noderef=shift;
if ($noderef =~ /xCAT_monitoring::snmpmon/) {
$noderef=shift;
}
my $scope=shift;
my $callback=shift;
my $localhostname=hostname();
# check supported snmp package
my $cmd;
my @snmpPkg = `/bin/rpm -qa | grep snmp`;
my $pkginstalled = grep(/net-snmp/, @snmpPkg);
if ($pkginstalled) {
if (!$pkginstalled) {
if ($callback) {
my $rsp={};
$rsp->{data}->[0]="$localhostname: net-snmp is not installed.";
$callback->($rsp);
}
return (1, "net-snmp is not installed")
} else {
my ($ret, $err)=configSNMP();
if ($ret != 0) { return ($ret, $err);}
} else {
return (1, "net-snmp is not installed")
}
#enable bmcs if any
configBMC(1);
#enable MMAs if any
configMPA(1);
#configure mail to enabling receiving mails from trap handler
configMail();
return (0, "started")
if ($scope) {
if ($callback) {
my $rsp={};
$rsp->{data}->[0]="$localhostname: setting up SNMP alert destination for BMCs and MMs ....";
$callback->($rsp);
}
#enable bmcs if any
configBMC(2, $noderef, $callback);
#enable MMAs if any
configMPA(2, $noderef, $callback);
}
if ($callback) {
my $rsp={};
$rsp->{data}->[0]="$localhostname: done.";
$callback->($rsp);
}
return (0, "")
}
#--------------------------------------------------------------------------------
=head3 deconfig
This function de-configures the cluster for the given nodes.
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:
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:
(error code, error message)
=cut
#--------------------------------------------------------------------------------
sub deconfig {
print "snmpmon:deconfig called\n";
my $noderef=shift;
if ($noderef =~ /xCAT_monitoring::snmpmon/) {
$noderef=shift;
}
my $scope=shift;
my $callback=shift;
my $localhostname=hostname();
if (-f "/usr/share/snmp/snmptrapd.conf.orig"){
# copy back the old one
`mv -f /usr/share/snmp/snmptrapd.conf.orig /usr/share/snmp/snmptrapd.conf`;
} else {
if (-f "/usr/share/snmp/snmptrapd.conf"){
# if the file exists, delete all entries that have xcat_traphandler
my $cmd = "grep -v xcat_traphandler /usr/share/snmp/snmptrapd.conf ";
$cmd .= "> /usr/share/snmp/snmptrapd.conf.unconfig ";
`$cmd`;
# move it back to the snmptrapd.conf file.
`mv -f /usr/share/snmp/snmptrapd.conf.unconfig /usr/share/snmp/snmptrapd.conf`;
}
}
if ($callback) {
my $rsp={};
$rsp->{data}->[0]="$localhostname: done.";
$callback->($rsp);
}
return (0, "");
}
#--------------------------------------------------------------------------------
=head3 configBMC
This function configures BMC to setup the snmp destination, enable/disable
PEF policy table entry number 1.
Arguments:
actioon -- 1 enable PEF policy table. 0 disable PEF policy table.
actioon -- 0 disable alert. 1 enable alert. 2 setup snmp destination
p_nodes -- a pointer to an arrays of nodes to be monitored. null means all.
callback -- the callback pointer for error and status displaying. It can be null.
Returns:
(return code, message)
=cut
#--------------------------------------------------------------------------------
sub configBMC {
my $action=shift;
my $noderef=shift;
my $callback=shift;
my $ret_text="";
my $ret_val=0;
@ -89,22 +363,24 @@ sub configBMC {
#the identification of this node
my @hostinfo=xCAT::Utils->determinehostname();
my $isSV=xCAT::Utils->isServiceNode();
%iphash=();
my %iphash=();
foreach(@hostinfo) {$iphash{$_}=1;}
if (!$isSV) { $iphash{'noservicenode'}=1;}
my $pPairHash=xCAT_monitoring::monitorctrl->getNodeMonServerPair($noderef, 0);
my %masterhash=();
my @node_a=();
my $table=xCAT::Table->new("ipmi");
if ($table) {
my @tmp1=$table->getAllNodeAttribs(['node','bmc']);
if (defined(@tmp1) && (@tmp1 > 0)) {
if (@tmp1 > 0) {
foreach(@tmp1) {
my $node=$_->{node};
my $bmc=$_->{bmc};
if (! exists($pPairHash->{$node})) {next;}
my $pairs=xCAT_monitoring::monitorctrl->getNodeMonServerPair($node);
my $pairs=$pPairHash->{$node};
my @a_temp=split(',',$pairs);
my $monserver=$a_temp[0];
my $master=$a_temp[1];
@ -132,17 +408,22 @@ sub configBMC {
#now doing the real thing: enable PEF alert policy table
my $noderange=join(',',@node_a );
my $actionstring="en";
if ($action==0) {$actionstring="dis";}
#print "XCATBYPASS=Y rspconfig $noderange alert=$actionstring\n";
my $result = `XCATBYPASS=Y rspconfig $noderange alert=$actionstring 2>&1`;
if ($?) {
xCAT::MsgUtils->message('S', "[mon]: Changeing SNMP PEF policy for IPMI nodes $noderange:\n $result\n");
$ret_tex .= "Changeing SNMP PEF policy for IPMI nodes $noderange:\n $result\n";
}
#setup the snmp destination
if ($action==1) {
if ($action==0) {
print "XCATBYPASS=Y rspconfig $noderange alert=dis\n";
my $result = `XCATBYPASS=Y rspconfig $noderange alert=dis 2>&1`;
if ($?) {
xCAT::MsgUtils->message('S', "[mon]: Changeing SNMP PEF policy for IPMI nodes $noderange:\n $result\n");
$ret_text .= "Changeing SNMP PEF policy for IPMI nodes $noderange:\n $result\n";
}
} elsif ($action==1) {
print "XCATBYPASS=Y rspconfig $noderange alert=en\n";
my $result = `XCATBYPASS=Y rspconfig $noderange alert=en 2>&1`;
if ($?) {
xCAT::MsgUtils->message('S', "[mon]: Changeing SNMP PEF policy for IPMI nodes $noderange:\n $result\n");
$ret_text .= "Changeing SNMP PEF policy for IPMI nodes $noderange:\n $result\n";
}
} else {
#setup the snmp destination
foreach (keys(%masterhash)) {
my $ref2=$masterhash{$_};
if (@$ref2==0) { next;}
@ -154,16 +435,24 @@ sub configBMC {
$ret_val=1;
$ret_text .= "Converting to IP: $ptmp->[1]\n";
} else {
#print "XCATBYPASS=Y rspconfig $nr2 snmpdest=$ptmp->[1]\n";
print "XCATBYPASS=Y rspconfig $nr2 snmpdest=$ptmp->[1]\n";
my $result2 = `XCATBYPASS=Y rspconfig $nr2 snmpdest=$ptmp->[1] 2>&1`;
if ($?) {
xCAT::MsgUtils->message('S', "[mon]: Changing SNMP destination for IPMI nodes $nr2:\n $result2\n");
$ret_tex .= "Changing SNMP destination for IPMI nodes $nr2:\n $result2\n";
$ret_text .= "Changing SNMP destination for IPMI nodes $nr2:\n $result2\n";
}
}
}
}
if ($callback) {
my $rsp={};
if ($ret_val) {
$rsp->{data}->[0]="$ret_text";
}
$callback->($rsp);
}
return ($ret_val, $ret_text);
}
@ -174,13 +463,18 @@ sub configBMC {
This function configures Blade Center Management Module to setup the snmp destination,
enable/disable remote alert notification.
Arguments:
actioon -- 1 enable remote alert notification. 0 disable remote alert notification.
actioon -- 1 enable remote alert notification. 0 disable remote alert notification.
2 setting up snmp destination.
p_nodes -- a pointer to an arrays of nodes to be monitored. null means all.
callback -- the callback pointer for error and status displaying. It can be null.
Returns:
(return code, message)
=cut
#--------------------------------------------------------------------------------
sub configMPA {
my $action=shift;
my $noderef=shift;
my $callback=shift;
my $ret_val=0;
my $ret_text="";
@ -188,25 +482,35 @@ sub configMPA {
#the identification of this node
my @hostinfo=xCAT::Utils->determinehostname();
my $isSV=xCAT::Utils->isServiceNode();
%iphash=();
my %iphash=();
foreach(@hostinfo) {$iphash{$_}=1;}
if (!$isSV) { $iphash{'noservicenode'}=1;}
my $all=0;
my %nodehash=();
if ((!$noderef) || (@$noderef==0)) {$all=1;}
else {
foreach(@$noderef) { $nodehash{$_}=1;}
}
my %mpa_hash=();
my %masterhash=();
my @node_a=();
my $table=xCAT::Table->new("mp");
if ($table) {
my @tmp1=$table->getAllNodeAttribs(['mpa']);
if (defined(@tmp1) && (@tmp1 > 0)) {
my @tmp1=$table->getAllNodeAttribs(['node','mpa']);
if (@tmp1 > 0) {
foreach(@tmp1) {
my $node=$_->{node};
my $mpa=$_->{mpa};
if ((!$all) && (!exists($nodehash{$node})) && (!exists($nodehash{$mpa}))) {next;}
if ($mpa_hash{$mpa}) { next;} #already handled
$mpa_hash{$mpa}=1;
my $pairs=xCAT_monitoring::monitorctrl->getNodeMonServerPair($mpa);
my $pHash=xCAT_monitoring::monitorctrl->getNodeMonServerPair([$mpa], 0);
my $pairs=$pHash->{$mpa};
my @a_temp=split(',',$pairs);
my $monserver=$a_temp[0];
my $master=$a_temp[1];
@ -235,19 +539,22 @@ sub configMPA {
#now doing the real thing: enable PEF alert policy table
my $noderange=join(',',@node_a );
#print "noderange=@noderange\n";
my $actionstring="en";
if ($action==0) {$actionstring="dis";}
#print "XCATBYPASS=Y rspconfig $noderange alert=$actionstring\n";
my $result = `XCATBYPASS=Y rspconfig $noderange alert=$actionstring 2>&1`;
if ($?) {
xCAT::MsgUtils->message('S', "[mon]: Changeing SNMP remote alert profile for Blade Center MM $noderange:\n $result\n");
$ret_text .= "Changeing SNMP remote alert profile for Blade Center MM $noderange:\n $result\n";
}
#setup the snmp destination
if ($action==1) {
if ($action==0) {
print "XCATBYPASS=Y rspconfig $noderange alert=dis\n";
my $result = `XCATBYPASS=Y rspconfig $noderange alert=dis 2>&1`;
if ($?) {
xCAT::MsgUtils->message('S', "[mon]: Changeing SNMP remote alert profile for Blade Center MM $noderange:\n $result\n");
$ret_text .= "Changeing SNMP remote alert profile for Blade Center MM $noderange:\n $result\n";
}
} elsif ($action==1) {
print "XCATBYPASS=Y rspconfig $noderange alert=en\n";
my $result = `XCATBYPASS=Y rspconfig $noderange alert=en 2>&1`;
if ($?) {
xCAT::MsgUtils->message('S', "[mon]: Changeing SNMP remote alert profile for Blade Center MM $noderange:\n $result\n");
$ret_text .= "Changeing SNMP remote alert profile for Blade Center MM $noderange:\n $result\n";
}
} else {
#setup the snmp destination
foreach (keys(%masterhash)) {
my $ref2=$masterhash{$_};
if (@$ref2==0) { next;}
@ -259,7 +566,7 @@ sub configMPA {
$ret_val=1;
$ret_text .= "Converting to IP: $ptmp->[1]\n";
} else {
#print "XCATBYPASS=Y rspconfig $nr2 snmpdest=$ptmp->[1]\n";
print "XCATBYPASS=Y rspconfig $nr2 snmpdest=$ptmp->[1]\n";
my $result2 = `XCATBYPASS=Y rspconfig $nr2 snmpdest=$ptmp->[1] 2>&1`;
if ($?) {
xCAT::MsgUtils->message('S', "[mon]: Changing SNMP destination for Blade Center MM $nr2:\n $result2\n");
@ -269,6 +576,14 @@ sub configMPA {
}
}
if ($callback) {
my $rsp={};
if ($ret_val) {
$rsp->{data}->[0]="$ret_text";
}
$callback->($rsp);
}
return ($ret_val, $ret_text);
}
@ -324,7 +639,7 @@ sub configSNMP {
s/\s*forward/\#forward/; #comment out the old one
if (!$forward_handled) {
print FILE "forward default $master\n";
$forward_handle=1;
$forward_handled=1;
}
}
}
@ -350,6 +665,7 @@ sub configSNMP {
}
else { # The snmptrapd.conf file does not exists
# create the file:
my $handle = new IO::File;
open($handle, ">/usr/share/snmp/snmptrapd.conf");
print $handle "authCommunity log,execute,net public\n";
if ($isSN) {
@ -361,27 +677,7 @@ sub configSNMP {
}
# TODO: put the mib files to /usr/share/snmp/mibs
# get the PID of the currently running snmptrapd if it is running.
# then stop it and restart it again so that it reads our new
# snmptrapd.conf configuration file. Then the process
chomp(my $pid= `/bin/ps -ef | /bin/grep snmptrapd | /bin/grep -v grep | /bin/awk '{print \$2}'`);
if($pid){
`/bin/kill -9 $pid`;
}
# start it up again!
system("/usr/sbin/snmptrapd -m ALL");
# get the PID of the currently running snmpd if it is running.
# if it's running then we just leave. Otherwise, if we don't get A PID, then we
# assume that it isn't running, and start it up again!
chomp(my $pid= `/bin/ps -ef | /bin/grep snmpd | /bin/grep -v grep | /bin/awk '{print \$2}'`);
unless($pid){
# start it up again!
system("/usr/sbin/snmpd");
}
return (0, "started");
return (0, "");
}
#--------------------------------------------------------------------------------
@ -414,175 +710,7 @@ sub configMail {
}
#--------------------------------------------------------------------------------
=head3 stop
This function gets called by the monitorctrl module when
xcatd stops.
Arguments:
none
Returns:
(return code, message)
=cut
#--------------------------------------------------------------------------------
sub stop {
#print "snmpmon::stop called\n";
# do not turn it on on the service node
#if (xCAT::Utils->isServiceNode()) { return (0, "");}
#disable MMAs if any
configMPA(0);
#disable BMC so that it stop senging alerts (PETs) to this node
configBMC(0);
if (-f "/usr/share/snmp/snmptrapd.conf.orig"){
# copy back the old one
`mv -f /usr/share/snmp/snmptrapd.conf.orig /usr/share/snmp/snmptrapd.conf`;
} else {
if (-f "/usr/share/snmp/snmptrapd.conf"){
# if the file exists, delete all entries that have xcat_traphandler
my $cmd = "grep -v xcat_traphandler /usr/share/snmp/snmptrapd.conf ";
$cmd .= "> /usr/share/snmp/snmptrapd.conf.unconfig ";
`$cmd`;
# move it back to the snmptrapd.conf file.
`mv -f /usr/share/snmp/snmptrapd.conf.unconfig /usr/share/snmp/snmptrapd.conf`;
}
}
# now check to see if the daemon is running. If it is then we need to resart or stop?
# it with the new snmptrapd.conf file that will not forward events to RMC.
chomp(my $pid= `/bin/ps -ef | /bin/grep snmptrapd | /bin/grep -v grep | /bin/awk '{print \$2}'`);
if($pid){
`/bin/kill -9 $pid`;
# start it up again!
#system("/usr/sbin/snmptrapd");
}
return (0, "stopped");
}
#--------------------------------------------------------------------------------
=head3 supportNodeStatusMon
This function is called by the monitorctrl module to check
if SNMP can help monitoring and returning the node status.
SNMP does not support this function.
Arguments:
none
Returns:
1
=cut
#--------------------------------------------------------------------------------
sub supportNodeStatusMon {
return 0;
}
#--------------------------------------------------------------------------------
=head3 startNodeStatusMon
This function is called by the monitorctrl module to tell
SNMP to start monitoring the node status and feed them back
to xCAT. SNMP does not have this support.
Arguments:
None.
Returns:
(return code, message)
=cut
#--------------------------------------------------------------------------------
sub startNodeStatusMon {
return (1, "This function is not supported.");
}
#--------------------------------------------------------------------------------
=head3 stopNodeStatusMon
This function is called by the monitorctrl module to tell
SNMP to stop feeding the node status info back to xCAT.
SNMP does not support this function.
Arguments:
none
Returns:
(return code, message)
=cut
#--------------------------------------------------------------------------------
sub stopNodeStatusMon {
return (1, "This function is not supported.");
}
#--------------------------------------------------------------------------------
=head3 addNodes
This function adds the nodes into the SNMP domain.
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, 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 "snmpmon::addNodes\n";
# $noderef=shift;
# if ($noderef =~ /xCAT_monitoring::snmpmon/) {
# $noderef=shift;
# }
# my $info=shift;
# if ($info) {
# foreach(@$noderef) {
# my $node_info=$_;
# print " node=$node_info->[0], status=$node_info->[1]\n";
# }
# } else {
# print "noderef=@$noderef\n";
# }
return (0, "ok");
}
#--------------------------------------------------------------------------------
=head3 removeNodes
This function removes the nodes from the SNMP domain.
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, 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 "snmpmon::removeNodes\n";
# $noderef=shift;
# if ($noderef =~ /xCAT_monitoring::snmpmon/) {
# $noderef=shift;
# }
# my $info=shift;
# if ($info) {
# foreach(@$noderef) {
# my $node_info=$_;
# print " node=$node_info->[0], status=$node_info->[1]\n";
# }
# } else {
# print "noderef=@$noderef\n";
# }
return (0, "ok");
}
#--------------------------------------------------------------------------------
=head3 processSettingChanges
@ -646,3 +774,101 @@ sub getDescription {
system events.\n"
}
#--------------------------------------------------------------------------------
=head3 getNodesMonServers
This function checks the given nodes, if they are bmc/ipmi nodes, the monserver pairs of
the nodes will be returned. If the nodes are managed by MM, the monserver pairs of their
mpa will be returned.
Arguments:
p_nodes -- a pointer to an arrays of nodes to be added for monitoring. none means all.
callback -- the callback pointer for error and status displaying. It can be null.
Returns:
A pointer to a hash table with monserver pairs as the key and an array
pointer of nodes as the value.
For example: { "sv1,ma1"=>[node1,node2], "sv2,ma2"=>node3...}
The pair is in the format of "monserver,monmaser". First one is the monitoring service
node ip/hostname that faces the mn and the second one is the monitoring service
node ip/hostname that faces the cn.
The value of the first one can be "noservicenode" meaning that there is no service node
for that node. In this case the second one is the site master.
=cut
#--------------------------------------------------------------------------------
sub getNodesMonServers
{
print "snmpmon:getNodesMonServer called\n";
my $noderef=shift;
if ($noderef =~ /xCAT_monitoring::snmpmon/) {
$noderef=shift;
}
my $callback=shift;
my $ret={};
my $localhostname=hostname();
my $pPairHash=xCAT_monitoring::monitorctrl->getNodeMonServerPair($noderef, 0);
#check for blades, only returns the MPAs and their monservers
my %mpa_hash=();
my $table=xCAT::Table->new("mp");
if ($table) {
my @tmp1=$table->getAllNodeAttribs(['node','mpa']);
if (@tmp1 > 0) {
foreach(@tmp1) {
my $node=$_->{node};
my $mpa=$_->{mpa};
if ((!exists($pPairHash->{$node})) && (!exists($pPairHash->{$mpa}))) {next;} #not in input
#if (exists($pPairHash->{$node})) { delete($pPairHash->{$node}); }
if ($mpa_hash{$mpa}) { next;} #already handled
$mpa_hash{$mpa}=1;
my $pairs;
if (exists($pPairHash->{$mpa})) {
$pairs=$pPairHash->{$mpa};
} else {
my $pHash=xCAT_monitoring::monitorctrl->getNodeMonServerPair([$mpa], 0);
$pairs=$pHash->{$mpa};
}
if (exists($ret->{$pairs})) {
my $pa=$ret->{$pairs};
push(@$pa, $mpa);
}
else {
$ret->{$pairs}=[$mpa];
}
#if (exists($pPairHash->{$mpa}))) { delete($pPairHash->{$mpa}); }
} #foreach
}
$table->close();
}
#check BMC/IPMI nodes
$table=xCAT::Table->new("ipmi");
if ($table) {
my @tmp1=$table->getAllNodeAttribs(['node','bmc']);
if (@tmp1 > 0) {
foreach(@tmp1) {
my $node=$_->{node};
my $bmc=$_->{bmc};
if (! exists($pPairHash->{$node})) {next;}
my $pairs=$pPairHash->{$node};
if (exists($ret->{$pairs})) {
my $pa=$ret->{$pairs};
push(@$pa, $node);
}
else {
$ret->{$pairs}=[$node];
}
#delete($pPairHash->{$node});
} #foreach
}
$table->close();
}
return $ret;
}

View File

@ -6,10 +6,11 @@ BEGIN
$::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat';
}
use lib "$::XCATROOT/lib/perl";
use strict;
use xCAT::Utils;
use xCAT::GlobalDef;
use xCAT_monitoring::monitorctrl;
use Sys::Hostname;
1;
@ -24,16 +25,23 @@ use xCAT_monitoring::monitorctrl;
#--------------------------------------------------------------------------------
=head3 start
This function gets called by the monitorctrl module
when xcatd starts.
This function gets called by the monitorctrl module when monstart command
gets called and when xcatd starts.
Arguments:
None.
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 monservers and nodes,
callback -- the callback pointer for error and status displaying. It can be null.
Returns:
(return code, message)
(return code, message)
if the callback is set, use callback to display the status and error.
=cut
#--------------------------------------------------------------------------------
sub start {
#print "xcatmon.start\n";
print "xcatmon.start\n";
return (0, "started");
}
@ -42,15 +50,20 @@ sub start {
#--------------------------------------------------------------------------------
=head3 stop
This function gets called by the monitorctrl module when
xcatd stops.
This function gets called by the monitorctrl module when monstop command gets called.
Arguments:
none
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)
(return code, message)
if the callback is set, use callback to display the status and error.
=cut
#--------------------------------------------------------------------------------
sub stop {
print "xcatmon.stop\n";
return (0, "stopped");
}
@ -78,23 +91,30 @@ sub supportNodeStatusMon {
#--------------------------------------------------------------------------------
=head3 startNodeStatusMon
This function is called by the monitorctrl module to tell
the product to start monitoring the node status and feed them back
This function is called by the monitorctrl module when monstart gets called and
when xcatd starts. It starts monitoring the node status and feed them back
to xCAT.
Arguments:
None.
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 monservers and nodes,
callback -- the callback pointer for error and status displaying. It can be null.
note: p_nodes and scope are ignored by this plugin.
Returns:
(return code, message)
(return code, message)
if the callback is set, use callback to display the status and error.
=cut
#--------------------------------------------------------------------------------
sub startNodeStatusMon {
my $temp=shift;
if ($temp =~ /xCAT_monitoring::xcatmon/) {
$temp=shift;
sub startNodeStatusMon
{
print "xcatmon.startNodeStatusMon\n";
my $noderef=shift;
if ($noderef =~ /xCAT_monitoring::xcatmon/) {
$noderef=shift;
}
#print "xcatmon.startNodeStatusMon\n";
my $scope=shift;
my $callback=shift;
#run the command first to update the status,
my $cmd="$::XCATROOT/sbin/xcatnodemon";
@ -134,71 +154,112 @@ sub startNodeStatusMon {
$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); }
my $localhostname=hostname();
if ($code==0) {
if ($callback) {
my $rsp={};
$rsp->{data}->[0]="$localhostname: started. Refresh interval is $value minute(s).";
$callback->($rsp);
}
return (0, "started"); }
else {
if ($callback) {
my $rsp={};
$rsp->{data}->[0]="$localhostname: $code $msg";
$callback->($rsp);
}
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.
This function is called by the monitorctrl module when monstop command is issued.
It stops feeding the node status info back to xCAT.
Arguments:
none
p_nodes -- a pointer to an arrays of nodes to 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.
note: p_nodes and scope are ignored by this plugin.
Returns:
(return code, message)
(return code, message)
if the callback is set, use callback to display the status and error.
=cut
#--------------------------------------------------------------------------------
sub stopNodeStatusMon {
#TODO: turn off the node status monitoring.
print "xcatmon.stopNodeStatusMon\n";
my $noderef=shift;
if ($noderef =~ /xCAT_monitoring::xcatmon/) {
$noderef=shift;
}
my $scope=shift;
my $callback=shift;
my $job="$::XCATROOT/sbin/xcatnodemon";
my ($code, $msg)=xCAT::Utils::remove_cron_job($job);
if ($code==0) { return (0, "stopped"); }
else { return ($code, $msg); }
my $localhostname=hostname();
if ($code==0) {
if ($callback) {
my $rsp={};
$rsp->{data}->[0]="$localhostname: stopped.";
$callback->($rsp);
}
return (0, "stopped"); }
else {
if ($callback) {
my $rsp={};
$rsp->{data}->[0]="$localhostname: $code $msg";
$callback->($rsp);
}
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.
=head3 config
This function configures the cluster for the given nodes.
This function is called by when monconfig command is issued or when xcatd starts
on the service node. It will configure the cluster to include the given nodes within
the monitoring doamin.
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, 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.
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 both monservers and nodes,
callback -- the callback pointer for error and status displaying. It can be null.
Returns:
(error code, error message)
=cut
#--------------------------------------------------------------------------------
sub addNodes {
sub config {
#print "xcatmon:addNodes called\n";
print "xcatmon:config called\n";
return (0, "ok");
}
#--------------------------------------------------------------------------------
=head3 removeNodes
=head3 deconfig
This function de-configures the cluster for the given nodes.
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, 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.
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 localhost only.
2 means both monservers and nodes,
callback -- the callback pointer for error and status displaying. It can be null.
Returns:
(error code, error message)
=cut
#--------------------------------------------------------------------------------
sub removeNodes {
sub deconfig {
#print "xcatmon:removeNodes called\n";
print "xcatmon:deconfig called\n";
return (0, "ok");
}
@ -216,7 +277,7 @@ sub removeNodes {
=cut
#--------------------------------------------------------------------------------
sub getMonNodesStatus {
%status=();
my %status=();
my @inactive_nodes=();
my @active_nodes=();
my @unknown_nodes=();
@ -262,9 +323,8 @@ sub getMonNodesStatus {
#--------------------------------------------------------------------------------
=head3 processNodeStatusChanges
This function will update the status column of the
nodelist table with the new node status.
=head3 setNodeStatusAttributes
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.
@ -274,12 +334,12 @@ sub getMonNodesStatus {
non-0 for not successful.
=cut
#--------------------------------------------------------------------------------
sub processNodeStatusChanges {
sub setNodeStatusAttributes {
my $temp=shift;
if ($temp =~ /xCAT_monitoring::xcatmon/) {
$temp=shift;
}
return xCAT_monitoring::monitorctrl->processNodeStatusChanges($temp);
return xCAT_monitoring::monitorctrl->setNodeStatusAttributes($temp);
}
#--------------------------------------------------------------------------------
@ -295,8 +355,8 @@ sub processNodeStatusChanges {
#--------------------------------------------------------------------------------
sub processSettingChanges {
#restart the cron job
xCAT_monitoring::xcatmon->stopNodeStatusMon();
xCAT_monitoring::xcatmon->startNodeStatusMon();
xCAT_monitoring::xcatmon->stopNodeStatusMon([], 0);
xCAT_monitoring::xcatmon->startNodeStatusMon([], 0);
}
#--------------------------------------------------------------------------------

View File

@ -144,18 +144,6 @@ sub process_request
}
my $errored = 0;
sub pass_along {
my $resp = shift;
$::callback->($resp);
if ($resp and ($resp->{errorcode} and $resp->{errorcode}->[0]) or ($resp->{error} and $resp->{error}->[0])) {
$errored=1;
}
foreach (@{$resp->{node}}) {
if ($_->{error} or $_->{errorcode}) {
$errored=1;
}
}
}
#----------------------------------------------------------------------------
@ -539,16 +527,7 @@ ll~;
my $rsp;
push @{$rsp->{data}}, "AIX/NIM nodes were initialized.\n";
xCAT::MsgUtils->message("I", $rsp, $callback);
###################
#give monitoring code a chance to prepare the master for the node deployment
#push @{$rsp->{data}}, "Initializing for the node monitoring.\n";
#xCAT::MsgUtils->message("I", $rsp, $callback);
my %new_request = (
command => ['moncfgmaster'],
node => \@nodelist
);
$sub_req->(\%new_request, \&pass_along);
###################
return 0;
}
return 0;
@ -3003,16 +2982,7 @@ ll~;
my $rsp;
push @{$rsp->{data}}, "AIX/NIM diskless nodes were initialized.\n";
xCAT::MsgUtils->message("I", $rsp, $callback);
#################
#give monitoring code a chance to prepare the master for the node deployment
#push @{$rsp->{data}}, "Initializing for the node monitoring.\n";
#xCAT::MsgUtils->message("I", $rsp, $callback);
my %new_request = (
command => ['moncfgmaster'],
node => \@nodelist
);
$sub_req->(\%new_request, \&pass_along);
#################
return 0;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -295,15 +295,6 @@ sub process_request {
}
}
##################################
#give monitoring code a chance to prepare the master for the node deployment
my %new_request = (
command => ['moncfgmaster'],
node => \@rnodes
);
$sub_req->(\%new_request, \&pass_along);
##################################
}

View File

@ -282,14 +282,6 @@ sub process_request {
node=>\@breaknetboot,
arg=>['-s','filename = \"xcat/nonexistant_file_to_intentionally_break_netboot_for_localboot_to_work\";']},$callback);
#####################################
# give monitoring code a chance to prepare the master for the node deployment
my %new_request = (
command => ['moncfgmaster'],
node => \@rnodes
);
$sub_req->(\%new_request, \&pass_along);
#####################################
}

View File

@ -56,7 +56,7 @@ if (@changed_inactive>0) {
#only set the node status for the changed ones
if (keys(%node_status) > 0) {
xCAT_monitoring::xcatmon::processNodeStatusChanges(\%node_status);
xCAT_monitoring::xcatmon::setNodeStatusAttributes(\%node_status);
}
#($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);