xcat-core/xCAT-server/lib/xcat/monitoring/montbhandler.pm
2010-08-25 18:47:47 +00:00

125 lines
4.0 KiB
Perl

#!/usr/bin/env perl
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
package xCAT_monitoring::montbhandler;
BEGIN
{
$::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat';
}
use lib "$::XCATROOT/lib/perl";
use xCAT::Table;
use xCAT::MsgUtils;
use xCAT::Utils;
use xCAT_plugin::notification;
use xCAT_monitoring::monitorctrl;
1;
#-------------------------------------------------------------------------------
=head1 xCAT_monitoring:montbhandler
=head2 Package Description
xCAT monitoring table handler module. This is a helper module for monitorctrl module
becuase the notification infrastructure does not allow a module to register more
than one callbacks. This module registers and unregisters notification to watch for
the changes in the monitoring tables. When changes occurrs, it forward the info
back to monitorctrl module for handling.
=cut
#-------------------------------------------------------------------------------
#--------------------------------------------------------------------------------
=head3 regMonitoringNotif
It registers this module in the notification table to watch for changes in
the monitoring table.
Arguments:
none
Returns:
0 for successful.
non-0 for not successful.
=cut
#--------------------------------------------------------------------------------
sub regMonitoringNotif {
#register for nodelist table changes if not already registered
my $tab = xCAT::Table->new('notification');
my $regged=0;
if ($tab) {
(my $ref) = $tab->getAttribs({filename => qw(montbhandler.pm)}, 'tables');
if ($ref and $ref->{tables}) {
$regged=1;
}
$tab->close();
}
if (!$regged) {
xCAT_plugin::notification::regNotification([qw(montbhandler.pm monsetting -o a,u,d)]);
}
}
#--------------------------------------------------------------------------------
=head3 unregMonitoringNotif
It un-registers this module in the notification table.
Arguments:
none
Returns:
0 for successful.
non-0 for not successful.
=cut
#--------------------------------------------------------------------------------
sub unregMonitoringNotif {
my $tab = xCAT::Table->new('notification');
my $regged=0;
if ($tab) {
(my $ref) = $tab->getAttribs({filename => qw(montbhandler.pm)}, "tables");
if ($ref and $ref->{tables}) {
$regged=1;
}
$tab->close();
}
if ($regged) {
xCAT_plugin::notification::unregNotification([qw(montbhandler.pm)]);
}
}
#--------------------------------------------------------------------------------
=head3 processTableChanges
It is called by the NotifHander module
when the monitoring tables get changed. If a plug-in
is added or removed from the monitoring table. this function will start
or stop the plug-in for monitoing the xCAT cluster.
Arguments:
action - table action. It can be d for rows deleted, a for rows added
or u for rows updated.
tablename - string. The name of the DB table whose data has been changed.
old_data - an array reference of the old row data that has been changed.
The first element is an array reference that contains the column names.
The rest of the elelments are also array references each contains
attribute values of a row.
It is set when the action is u or d.
new_data - a hash refernce of new row data; only changed values are present
in the hash. It is keyed by column names.
It is set when the action is u or a.
Returns:
0 for successful.
non-0 for not successful.
=cut
#--------------------------------------------------------------------------------
sub processTableChanges {
my $action=shift;
if ($action =~ /xCAT_plugin::montbhandler/) {
$action=shift;
}
my $tablename=shift;
my $old_data=shift;
my $new_data=shift;
xCAT_monitoring::monitorctrl->processMonitoringTableChanges($action, $tablename, $old_data, $new_data);
}