sub netcool_inform { use IO::Socket; use Time::localtime; my $paserver_host = ""; my $paserver_hosts = shift || 'sinxgp117s.southernco.com'; my $inform_number = shift || 100000; my $attributes = shift || []; my $num_attrs = @$attributes; my @inform_attrs = (); my $debug = 0; my ($paserver_port, $protocol) = ('32509', 'tcp'); my @varbinds = (); my $varbind17 = ""; my $data = ""; my $header1 = ""; my $data1 = ""; my $header2 = ""; my $data2 = ""; my $data_prefix1 = ""; my $data_prefix2 = ""; my $payload = ""; my $payload1 = ""; my $payloadlen1 = 0; my $payload2 = ""; my $payloadlen2 = 0; my $nulls = "00000000"; my $i = 0; my $result = 0; my $strlen = 0; my ($sec, $min, $hr, $day, $mon, $yr) = (); $varbinds[0] = "NerveCenter Server: $NCHostName"; $varbinds[1] = ""; # Date and time stamp $varbinds[2] = ""; # Inform number $varbinds[3] = "$NodeName"; # Source node name. $varbinds[4] = "$NodeAddress"; # Source node IP address. $varbinds[5] = "$ReadCommunity"; # Node RO community string. $varbinds[6] = "$WriteCommunity"; # Node RW community string. $varbinds[7] = "$NodePropertyGrp"; # Node property group. $varbinds[8] = "$AlarmName"; # Alarm name. $varbinds[9] = "$AlarmProperty"; # Alarm property. $varbinds[10] = "$OrigState"; # Source state name. $varbinds[11] = "$OrigStateSev"; # Source state severity. $varbinds[12] = "$DestState"; # Destination state name. $varbinds[13] = "$DestStateSev"; # Destination state severity. $varbinds[14] = "$TriggerName"; # Trigger name. $varbinds[15] = "$TriggerBaseObject";# Base object. $varbinds[16] = "$TriggerInstance" || "0"; # Instance. $varbinds[17] = "$TrapPduGenericNumber" || "-2"; # Trap generic number. $varbinds[18] = "$TrapPduSpecificNumber" || "-2"; # Trap specific number. $varbinds[19] = "01000000010000"; # Trap entity ID. $varbinds[20] = $num_attrs; # Num attributes. $varbinds[21] = "$AlarmInstanceID"; # Alarm instance ID. # # Open a log file if debugging. # open(LOGFILE, ">>/tmp/inform\.log") if $debug; print LOGFILE "\n--------------------------------------------------\n" if $debug; print LOGFILE "Paserver hosts=@$paserver_hosts\n" if $debug; print LOGFILE "Inform number=$inform_number\n" if $debug; print LOGFILE "Attributes=@$attributes\n" if $debug; print LOGFILE "Number of attributes=$num_attrs\n" if $debug; # # Create data to send. # $strlen = length($varbinds[0]) + 1; $varbinds[0] =~ s/(.)/sprintf("%2.2x", ord($1))/eg; # Convert to hex $varbinds[0] = sprintf "%2.2x%6.6s%2.2x%s%8.8s", $strlen, $nulls, $strlen, $varbinds[0], $nulls; print LOGFILE "varbind 0 :$varbinds[0]\n" if $debug; $sec = localtime->sec; $min = localtime->min; $hr = localtime->hour; $day = localtime->mday; $mon = localtime->mon + 1; $yr = localtime->year + 1900; $varbinds[1] = sprintf "%2.2d%2.2d%4.4d%2.2d%2.2d%2.2d", $mon, $day, $yr, $hr, $min, $sec; print LOGFILE "varbind 1 :$varbinds[1]\n" if $debug; $varbinds[1] =~ s/(.)/sprintf("%2.2x", ord($1))/eg; # Convert to hex $varbinds[1] = sprintf "0f%s%4.4s", $varbinds[1], $nulls; print LOGFILE "varbind 1 :$varbinds[1]\n" if $debug; $varbinds[2] = sprintf "%6.6x%2.2s", $inform_number, $nulls; print LOGFILE "varbind 2 :$varbinds[2]\n" if $debug; for ($i = 3; $i <= 18; $i++) { print LOGFILE "varbind $i :$varbinds[$i]\n" if $debug; $strlen = length($varbinds[$i]) + 1; $varbinds[$i] =~ s/(.)/sprintf("%2.2x", ord($1))/eg; # convert to hex print LOGFILE "varbind $i :$varbinds[$i]\n" if $debug; $varbinds[$i] = sprintf "%2.2x%6.6s%2.2x%s%4.4s", $strlen, $nulls, $strlen, $varbinds[$i], $nulls; print LOGFILE "varbind $i :$varbinds[$i]\n" if $debug; } if ($num_attrs) { print LOGFILE "varbind 20 :$varbinds[20]\n" if $debug; $varbinds[20] = sprintf "%2.2x%2.2s", $varbinds[20], $nulls; print LOGFILE "varbind 20 :$varbinds[20]\n" if $debug; for ($i = 0; $i <= ($num_attrs - 1); $i++) { $inform_attrs[$i] = "Attribute ".$attributes->[$i]; print LOGFILE "attribute $i:$inform_attrs[$i]\n" if $debug; $strlen = length($inform_attrs[$i]) + 1; $inform_attrs[$i] =~ s/(.)/sprintf("%2.2x", ord($1))/eg; # convert to hex $inform_attrs[$i] = sprintf "%2.2x%6.6s%2.2x%s%4.4s", $strlen, $nulls, $strlen, $inform_attrs[$i], $nulls; print LOGFILE "attribute $i:$inform_attrs[$i]\n" if $debug; $varbind17 = $varbind17.$inform_attrs[$i]; } print LOGFILE "varbind 17:$varbind17\n" if $debug; } else { $varbinds[20] = "0000"; print LOGFILE "varbind 20 :$varbinds[20]\n" if $debug; $varbinds[20] = sprintf "%4.4x", $varbinds[20]; $varbind17 = ""; } $strlen = length($varbinds[21]) + 1; $varbinds[21] =~ s/(.)/sprintf("%2.2x", ord($1))/eg; # convert to hex print LOGFILE "varbind 21 :$varbinds[21]\n" if $debug; $varbinds[21] = sprintf "%2.2x%6.6s%2.2x%s%2.2s", $strlen, $nulls, $strlen, $varbinds[21], $nulls; print LOGFILE "varbind 21 :$varbinds[21]\n" if $debug; $data_prefix1 = "03060003000000"; # Trap inform # $data_prefix2 = "0300000001000023940000000000000040000000000000000700"; # Tivoli Inform # $data_prefix2 = "0300000002000023940000000000000040000000000000000700"; # Netcool Inform $data_prefix2 = "0300000003000023940000000000000040000000000000000700"; $data2 = $data_prefix2.$varbinds[0].$varbinds[1].$varbinds[2].$varbinds[3]. $varbinds[4].$varbinds[5].$varbinds[6].$varbinds[7].$varbinds[8].$varbinds[9]. $varbinds[10].$varbinds[11].$varbinds[12].$varbinds[13].$varbinds[14]. $varbinds[15].$varbinds[16].$varbinds[17].$varbinds[18].$varbinds[19]. $varbinds[20].$varbind17.$varbinds[21]; $payload2 = pack("H*", $data2); $payloadlen2 = length($payload2); print LOGFILE "Payload 2 len:$payloadlen2\n" if $debug; $header2 = sprintf "%s%4.4x%6.6s", $data_prefix1, $payloadlen2, $nulls; print LOGFILE "Header 2:$header2\n" if $debug; $data1 = $header2.$data2; $payload1 = pack("H*", $data1); $payloadlen1 = length($payload1); print LOGFILE "Payload 1 len:$payloadlen1\n" if $debug; $header1 = sprintf "%8.8x", $payloadlen1; print LOGFILE "Header 1:$header1\n" if $debug; $data = $header1.$data1; $payload = pack("H*", $data); # # Send the inform to all destinations. # foreach $paserver_host (@$paserver_hosts) { # # Open the socket connection. # my $socket = IO::Socket::INET->new(PeerAddr => $paserver_host, PeerPort => $paserver_port, Proto => $protocol); # # Send data to socket. # $result = $socket->send($payload); print LOGFILE "Result of sending inform=$result\n" if $debug; # # Close it up. # $result = $socket->close(); print LOGFILE "Result of closing socket=$result\n" if $debug; } close(LOGFILE) if $debug; return 1; }