mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-11-04 05:12:30 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			305 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			305 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
#!/usr/bin/env perl
 | 
						|
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
 | 
						|
package xCAT_plugin::notification;
 | 
						|
 | 
						|
BEGIN
 | 
						|
{
 | 
						|
    $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat';
 | 
						|
}
 | 
						|
use lib "$::XCATROOT/lib/perl";
 | 
						|
use xCAT::Table;
 | 
						|
use xCAT::NotifHandler;
 | 
						|
1;
 | 
						|
 | 
						|
#-------------------------------------------------------------------------------
 | 
						|
 | 
						|
=head1  xCAT_plugin:notification
 | 
						|
=head2    Package Description
 | 
						|
  xCAT notification plugini module. This mondule allows users to register and
 | 
						|
  unregister for the xCAT database table changes. 
 | 
						|
=cut
 | 
						|
 | 
						|
#-------------------------------------------------------------------------------
 | 
						|
 | 
						|
 | 
						|
#--------------------------------------------------------------------------------
 | 
						|
 | 
						|
=head3   handled_commands
 | 
						|
      It returns a list of commands handled by this plugin.
 | 
						|
    Arguments:
 | 
						|
        none
 | 
						|
    Returns:
 | 
						|
        a list of commands.
 | 
						|
=cut
 | 
						|
 | 
						|
#-------------------------------------------------------------------------------
 | 
						|
sub handled_commands {
 | 
						|
    return {
 | 
						|
        regnotif     => "notification",
 | 
						|
        unregnotif   => "notification",
 | 
						|
        refnotif     => "notification",
 | 
						|
        lsnotif      => "notification",
 | 
						|
        enablenotif  => "notification",
 | 
						|
        disablenotif => "notification",
 | 
						|
      }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
#--------------------------------------------------------------------------------
 | 
						|
 | 
						|
=head3   process_request
 | 
						|
      It processes the monitoring control commands.
 | 
						|
    Arguments:
 | 
						|
      request -- a hash table which contains the command name.
 | 
						|
      callback -- a callback pointer to return the response to.
 | 
						|
      args -- a list of arguments that come with the command.
 | 
						|
    Returns:
 | 
						|
        0 for success. The output is returned through the callback pointer.
 | 
						|
        1. for unsuccess. The error messages are returns through the callback pointer.
 | 
						|
=cut
 | 
						|
 | 
						|
#-------------------------------------------------------------------------------
 | 
						|
sub process_request {
 | 
						|
    use Getopt::Long;
 | 
						|
 | 
						|
    # options can be bundled up like -vV
 | 
						|
    Getopt::Long::Configure("bundling");
 | 
						|
    $Getopt::Long::ignorecase = 0;
 | 
						|
 | 
						|
    my $request  = shift;
 | 
						|
    my $callback = shift;
 | 
						|
    my $command  = $request->{command}->[0];
 | 
						|
    my $args     = $request->{arg};
 | 
						|
 | 
						|
    if ($command eq "regnotif") {
 | 
						|
        my ($ret, $msg) = regNotification($args, $callback);
 | 
						|
        if ($msg) {
 | 
						|
            my %rsp = ();
 | 
						|
            $rsp->{dara}->[0] = $msg;
 | 
						|
            $callback->($rsp);
 | 
						|
        }
 | 
						|
        return $ret;
 | 
						|
    }
 | 
						|
    elsif ($command eq "unregnotif") {
 | 
						|
        my ($ret, $msg) = unregNotification($args, $callback);
 | 
						|
        if ($msg) {
 | 
						|
            my %rsp = ();
 | 
						|
            $rsp->{data}->[0] = $msg;
 | 
						|
            $callback->($rsp);
 | 
						|
        }
 | 
						|
        return $ret;
 | 
						|
    }
 | 
						|
    else {
 | 
						|
        my %rsp = ();
 | 
						|
        $rsp->{data}->[0] = "unsupported command: $command.";
 | 
						|
        $callback->($rsp);
 | 
						|
        return 1;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
#--------------------------------------------------------------------------------
 | 
						|
 | 
						|
=head3   regNotification
 | 
						|
      It registers a notification routine or a command which
 | 
						|
      will be called when there are changes in the data base tables
 | 
						|
      that the routine/command is interested in.
 | 
						|
    Arguments:
 | 
						|
      args - The format of the args is:
 | 
						|
         [-h|--help|-v|--version] or
 | 
						|
          filename tablename[,tablename]... [-o|--operation tableop[,tableop][,tableop]]]
 | 
						|
        where
 | 
						|
          tablename - string. a list of comma seperated names of the tables whose changes
 | 
						|
              will be watched.
 | 
						|
          filename - string. The name of the module (e.g. /usr/lib/xxx.pm) or
 | 
						|
              command (e.g. /usr/bin/xxx) that handles the notification.
 | 
						|
              If it is a perl module, the module  must implement the following routine:
 | 
						|
                processTableChanges(action, table_name, old_data, new_data)
 | 
						|
              Refer to notify() subroutine for the meaning of the parameters.
 | 
						|
              If it is a command, the command format should be:
 | 
						|
                command [-d|-a|-u] tablename {[colnames][rowvalues][rowvalues]...} {[colnames][rowvalues]}
 | 
						|
          tableop - it can be 'a' for add, 'd' for delete and 'u' for update.
 | 
						|
      callback - the pointer to the callback function.
 | 
						|
    Returns:
 | 
						|
      none
 | 
						|
    Comments:
 | 
						|
       If the module or the command already exists in the notification table, this subroutine
 | 
						|
       will replace it.
 | 
						|
=cut
 | 
						|
 | 
						|
#-------------------------------------------------------------------------------
 | 
						|
sub regNotification {
 | 
						|
    my $args     = shift;
 | 
						|
    my $callback = shift;
 | 
						|
    my $VERSION;
 | 
						|
    my $HELP;
 | 
						|
    my $tableops;
 | 
						|
 | 
						|
    # subroutine to display the usage
 | 
						|
    sub regnotif_usage
 | 
						|
    {
 | 
						|
        my $callbk = shift;
 | 
						|
        if (!$callbk) { return; }
 | 
						|
 | 
						|
        my %rsp;
 | 
						|
        $rsp->{data}->[0] = "Usage:";
 | 
						|
        $rsp->{data}->[1] = "  regnotif filename tablename[,tablename]... [-o|--operation tableop[,tableop][,tableop]]]";
 | 
						|
        $rsp->{data}->[2] = "       where tableop can be 'a' for add, 'd' for delete and 'u' for update";
 | 
						|
        $rsp->{data}->[3] = "  regnotif [-h|--help|-v|--version]";
 | 
						|
        $callbk->($rsp);
 | 
						|
    }
 | 
						|
 | 
						|
    @ARGV = @{$args};
 | 
						|
 | 
						|
    # parse the options
 | 
						|
    if (!GetOptions(
 | 
						|
            'o|operation=s' => \$tableops,
 | 
						|
            'h|help'        => \$::HELP,
 | 
						|
            'v|version'     => \$::VERSION,))
 | 
						|
    {
 | 
						|
        ®notif_usage($callback);
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    # display the usage if -h or --help is specified
 | 
						|
    if ($::HELP) {
 | 
						|
        ®notif_usage($callback);
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    # display the version statement if -v or --verison is specified
 | 
						|
    if ($::VERSION)
 | 
						|
    {
 | 
						|
        my %rsp;
 | 
						|
        $rsp->{data}->[0] = "regnotif version 1.0";
 | 
						|
        if ($callback) {
 | 
						|
            $callback->($rsp);
 | 
						|
        }
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    # must specify the file name and table names
 | 
						|
    if (@ARGV < 2)
 | 
						|
    {
 | 
						|
        ®notif_usage($callback);
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    #table operations must be a,d or u seperated by ','
 | 
						|
    if ($tableops)
 | 
						|
    {
 | 
						|
        if ($tableops !~ m/^(a|d|u)(,(a|d|u)){0,2}$/) {
 | 
						|
            my %rsp;
 | 
						|
            $rsp->{data}->[0] = "Invalid table operations: $tableops";
 | 
						|
            if ($callback) {
 | 
						|
                $callback->($rsp);
 | 
						|
            }
 | 
						|
            return;
 | 
						|
        }
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
        $tableops = "a,d,u";
 | 
						|
    }
 | 
						|
 | 
						|
    my $fname       = shift(@ARGV);
 | 
						|
    my $table_names = shift(@ARGV);
 | 
						|
 | 
						|
    my $table = xCAT::Table->new("notification", -create => 1, -autocommit => 0);
 | 
						|
    if ($table) {
 | 
						|
        my %key_col = (filename => $fname);
 | 
						|
        my %tb_cols = (tables => $table_names, tableops => $tableops);
 | 
						|
        $table->setAttribs(\%key_col, \%tb_cols);
 | 
						|
        $table->commit;
 | 
						|
    }
 | 
						|
 | 
						|
    #update notification cache
 | 
						|
    xCAT::NotifHandler::sendNotifSignal();
 | 
						|
    return;
 | 
						|
}
 | 
						|
 | 
						|
#--------------------------------------------------------------------------------
 | 
						|
 | 
						|
=head3   unregNotification 
 | 
						|
      It unregisters a notification routine or a command.
 | 
						|
    Arguments:
 | 
						|
      args - the format of the ares is:
 | 
						|
          [-h|--help|-v|--version] or
 | 
						|
          filename
 | 
						|
        where
 | 
						|
          filename - string. The name of the module or command that handles the notification.
 | 
						|
      callback - the pointer to the callback funtion.
 | 
						|
    Returns:
 | 
						|
      none
 | 
						|
=cut
 | 
						|
 | 
						|
#-------------------------------------------------------------------------------
 | 
						|
sub unregNotification {
 | 
						|
    my $args     = shift;
 | 
						|
    my $callback = shift;
 | 
						|
    my $VERSION;
 | 
						|
    my $HELP;
 | 
						|
 | 
						|
    # subroutine to display the usage
 | 
						|
    sub unregnotif_usage
 | 
						|
    {
 | 
						|
        my $callbk = shift;
 | 
						|
        if (!$callbk) { return; }
 | 
						|
 | 
						|
        my %rsp;
 | 
						|
        $rsp->{data}->[0] = "Usage:";
 | 
						|
        $rsp->{data}->[1] = "  unregnotif filename";
 | 
						|
        $rsp->{data}->[2] = "  unregnotif [-h|--help|-v|--version]";
 | 
						|
        $callbk->($rsp);
 | 
						|
    }
 | 
						|
 | 
						|
    @ARGV = @{$args};
 | 
						|
 | 
						|
    # parse the options
 | 
						|
    if (!GetOptions(
 | 
						|
            'h|help'    => \$::HELP,
 | 
						|
            'v|version' => \$::VERSION,))
 | 
						|
    {
 | 
						|
        &unregnotif_usage($callback);
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    # display the usage if -h or --help is specified
 | 
						|
    if ($::HELP) {
 | 
						|
        &unregnotif_usage($callback);
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    # display the version statement if -v or --verison is specified
 | 
						|
    if ($::VERSION)
 | 
						|
    {
 | 
						|
        my %rsp;
 | 
						|
        $rsp->{data}->[0] = "unregnotif version 1.0";
 | 
						|
        if ($callback) {
 | 
						|
            $callback->($rsp);
 | 
						|
        }
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    # must specify the node range
 | 
						|
    if (@ARGV < 1) {
 | 
						|
        &unregnotif_usage($callback);
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    my $fname = shift(@ARGV);
 | 
						|
 | 
						|
    my $table = xCAT::Table->new("notification", -create => 1, -autocommit => 0);
 | 
						|
    if ($table) {
 | 
						|
        my %key_col = (filename => $fname);
 | 
						|
        $table->delEntries(\%key_col);
 | 
						|
        $table->commit;
 | 
						|
    }
 | 
						|
 | 
						|
    #update notification cache
 | 
						|
    xCAT::NotifHandler::sendNotifSignal();
 | 
						|
    return;
 | 
						|
}
 | 
						|
 |