#!/usr/bin/perl
## snmp for monsetting to remove blade settings from blade when trap is recieved
## example: 
## 1.  user removes a blade from the chassis
## 2.  snmp trap setup to point here
## 3.  this script removes the blade configuration from xCAT
## 4.  so if blade is placed in new slot or back in then xCAT goes 
##     through rediscover process again.

BEGIN
{
    $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat';
}

use lib "$::XCATROOT/lib/perl";
use xCAT::Utils;
use strict;
use Socket; # for name resolution

my $ip='';
my $mm='';
my $slot='';
my $log = "/var/log/xcatsnmp";
my $tftpdir = xCAT::Utils->getTftpDir();


open(FILE,">>$log") or die "Can't open log!!!";

my $date = `date`;
chomp($date);
print FILE "====================  $date  ============================\n";
sub rmblade {
	my $blade = shift;
	my $hex = ip2hex($blade);
	print FILE "Running: nodech $blade chain.currstate='' chain.currchain=''\n";
	`nodech $blade chain.currstate= chain.currchain=`; 
	print FILE "Running: chtab -d node=$blade mac\n";
	`chtab -d node=$blade mac`;
	print FILE "Running: makedhcp -d $blade\n";
	`makedhcp -d $blade`;
	print FILE "Running: rm $tftpdir/pxelinux.cfg/$blade\n";
	`rm  $tftpdir/pxelinux.cfg/$blade`;
	if($hex){
		print FILE "Running: rm $tftpdir/pxelinux.cfg/$hex\n";
		`rm $tftpdir/pxelinux.cfg/$hex`;
	}
}

sub ip2hex {
	my $node = shift;
	my $ip = '';
	my @quad;
	my $hex = '';
	my $packed_ip = gethostbyname($node);
	if(defined $packed_ip){
		$ip = inet_ntoa($packed_ip);	
print FILE "IP that was removed is $ip\n";
		@quad = split('\.', $ip);
		$hex = sprintf("%02X%02X%02X%02X", @quad);
	}
	return $hex;
}
foreach (<>){
	if(/ip=UDP/){
		$ip = $_;
		chomp($ip);
		$ip =~ s/ip=UDP: \[(.*)\]:.*/$1/g;
		$mm = gethostbyaddr(inet_aton($ip), AF_INET);
	}elsif(/spTrapSourceId=/){
		$slot = $_;
		chomp($slot);
		$slot =~ s/.*Blade_(\d\d).*/$1/g;
		$slot = $slot * 1; # to get rid of the leading 0's.
	}
}
print "ip: $ip\n";
print "host: $mm\n";
print "slot: $slot\n";
# we now have slot and amm.  Need to now get which blade this is:
my $nlscmd = "nodels mp.id==$slot".'@'."mp.mpa==$mm";
my $node = `$nlscmd`;
chomp($node);
print "node: $node\n";
if($node ne ''){
	system("logger -t xcat 'removing $node configuration from xCAT'");
	print FILE "removing $node configuration from xCAT\n";
	&rmblade($node);
}else{
	system("logger -t xcat 'a blade was removed from $mm:$slot but could not be identified'");
	print FILE "A blade was removed from $mm:$slot but could not be identified\n";
}
