mirror of
https://github.com/xcat2/xcat-core.git
synced 2025-05-22 19:52:03 +00:00
90 lines
3.5 KiB
Perl
90 lines
3.5 KiB
Perl
# IBM(c) 2009 EPL license http://www.eclipse.org/legal/epl-v10.html
|
|
package xCAT_monitoring::bootttmon;
|
|
1;
|
|
|
|
#--------------------------------------------------------------------------------
|
|
|
|
=head3 processTableChanges
|
|
This subroutine gets called when changes are made to the boottarget or nodetype tables
|
|
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
|
|
Comment:
|
|
To use,
|
|
1. run regnotif bootttmon.pm boottarget,nodetype -o u
|
|
2. Then change the boottarget or nodetype tables (add node, remove node, or change status column).
|
|
3. Watch /var/log/bootttmon for output and updates to pxelinux.cfg files.
|
|
=cut
|
|
|
|
#-------------------------------------------------------------------------------
|
|
sub processTableChanges {
|
|
my $action = shift;
|
|
if ($action =~ /xCAT_monitoring::bootttmon/) {
|
|
$action = shift;
|
|
}
|
|
|
|
my $tablename = shift;
|
|
my $old_data = shift;
|
|
my $new_data = shift;
|
|
|
|
my @profiles = ();
|
|
my $newprofile;
|
|
open(FILE, ">>/var/log/bootttmon") or dir("cannot open the file\n");
|
|
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
|
|
printf FILE "\n-----------%2d-%02d-%04d %02d:%02d:%02d-----------\n", $mon + 1, $mday, $year + 1900, $hour, $min, $sec;
|
|
if ($new_data) {
|
|
push(@profiles, $tablename);
|
|
push(@profiles, $action);
|
|
if ($tablename eq "boottarget") {
|
|
$newprofile = $new_data->{bprofile};
|
|
push(@profiles, $new_data->{bprofile});
|
|
push(@profiles, $new_data->{kernel});
|
|
push(@profiles, $new_data->{initrd});
|
|
push(@profiles, $new_data->{kcmdline});
|
|
}
|
|
else {
|
|
$newprofile = $new_data->{profile};
|
|
push(@profiles, $new_data->{node});
|
|
push(@profiles, $new_data->{os});
|
|
push(@profiles, $new_data->{arch});
|
|
push(@profiles, $new_data->{profile});
|
|
push(@profiles, $new_data->{nodetype});
|
|
}
|
|
push(@profiles, $new_data->{comments});
|
|
push(@profiles, $new_data->{disable});
|
|
$news = join(',', @profiles);
|
|
print(FILE "Input is: $news\n");
|
|
}
|
|
if (($action eq "u") and ($newprofile ne '')) {
|
|
my @nodes = ();
|
|
if ($tablename eq "boottarget") { #have to look at all nodes
|
|
@nodes = `nodels '/.*' nodetype.profile==$newprofile`;
|
|
}
|
|
else { #only look at those nodes directly effected
|
|
@nodes = `nodels $new_data->{node}`;
|
|
}
|
|
chomp(@nodes);
|
|
for (my $j = 0 ; $j < @nodes ; $j++) {
|
|
my $node = @nodes[$j];
|
|
my $state = `nodeset $node stat`;
|
|
my @states = split(/:/, $state);
|
|
$state = @states[1];
|
|
my $out = `nodeset $node $state`;
|
|
print(FILE "pxelinux.cfg file update for $out");
|
|
}
|
|
}
|
|
close(FILE);
|
|
return 0;
|
|
}
|