[Date Prev] [Date Next] | [Thread Prev] [Thread Next] | [Date Index] [Thread Index] |
[snips-users] Alarm and Event browser
|
I am somewhat uncomfortable with the lack of persistency in syslog events monitored by SNIPs. I don't understand how to set up arm/disarm pairs in syslogmon. By the time an on-call or NOC person gets to the alarm, the condition has cleared. If anyone can clue me in on how to properly arm/disarm single ended alarm events, plesae let me know. In the meantime, I put tojether a cgi that works as an adjunct to genweb. It creates a small popup 'alarm' browser that uses the canned filters and snips applications that I wrote of a week ago. I donate these mods to the snips users. Vikas - if you wish to include in the distribution, I expect that you will need to clean up somewhat. I am a novice to CGI programming, and extremely green at javascript. This new pair of alarm and event browsers has a reseblance to the OpenView look and feel. The shell archive below patches the snipsweb-confg file ( I would recommend manually edit'ing), Installs an alarm browser button to the genweb display, and snips-events.cgi takes care of the two popup windows for alarm and event browsing. NB: If you do not declare the $alarm_cgi in snipsweb-confg, your new button will not show up. Tim Peiffer peiffer at umn edu # This is a shell archive. Save it in a file, remove anything before # this line, and then unpack it by entering "sh file". Note, it may # create directories; files and directories will be owned by you and # have default permissions. # # This archive contains: # # snipsweb-confg.event.patch # genweb.event.patch # snips-events.cgi # echo x - snipsweb-confg.event.patch sed 's/^X//' >snipsweb-confg.event.patch << 'END-of-snipsweb-confg.event.patch' X29a30,31 X> $menu_cgi = "/cgi-bin/genweb-menu.cgi"; X> $alarm_cgi = "/cgi-bin/snips-events.cgi"; X87a90,98 X> X> %watchpat = ( X> '&namepat=otr|qtr|gtr|gigapop' => 'NL GigaPOP', X> '&filepat=nsmon|radiusmon' => 'Nameservice/Authentication', X> '&namepat=vpn' => 'VPN Service', X> '&namepat=ntc-ww|ATM\.' => 'WireWall Aggregators', X> '&filepat=hostmon|syslogmon' => 'Generic Host Monitoring' X> ) unless (%watchpat); X> END-of-snipsweb-confg.event.patch echo x - genweb.event.patch sed 's/^X//' >genweb.event.patch << 'END-of-genweb.event.patch' X1,2c1,2 X< #!/usr/local/bin/perl X< my $versionid = '$Id: genweb.cgi,v 1.3 2002/01/30 05:42:45 vikas Exp $ ';# X--- X> #!/usr/bin/perl X> my $versionid = '$Id: genweb.cgi,v 1.2 2001/09/24 15:25:36 vikas Exp $ ';# X113c113 X< $baseurl $webdir $snipsweb_cgi $sound $snipsroot $imageurl $etcdir X--- X> $baseurl $webdir $snipsweb_cgi $alarm_cgi $sound $snipsroot $imageurl $etcdir X118c118 X< $debug @row_data $cgimode $filter_cgi $gen_cgi_links X--- X> $debug @row_data $cgimode $filter_cgi $menu_cgi $gen_cgi_links X167a168 X> $menu_cgi = "/cgi-bin/genweb-menu.cgi" unless $filter_cgi; X436a440,475 X> # this button invokes the genweb-menu.cgi script for canned filters X> if ($menu_cgi ne "") X> { X> print " <TD valign=middle> X> <FORM action=\"${menu_cgi}\" method=\"get\"> X> <input type=submit value=\"Menus\">\n"; X> foreach ( qw(view refresh sound sort maxrows namepat varpat monpat X> filepat altprint)) X> { X> my $p =$thiscgi->param($_); X> next if !defined($p) || $p eq '' || $p eq 'no'; X> print $thiscgi->hidden(-name => $_, -value=>$thiscgi->param($_)); X> } X> print " X> <input type=hidden name=noncgiurl value=\"${baseurl}/${view}.html\"> X> </FORM></TD>\n"; X> } X> X> # this button invokes a popup for alarm monitor X> if ($alarm_cgi ne "") X> { X> print " X> <script language=\"JavaScript\"><!-- X> function win(fileName) { X> snipsfloat = window.open(\'\',\'snipsalarm\',\'scrollbars=yes,status=no,width=300,height=300\') X> snipsfloat.location.href = fileName; X> } X> //--></script>\n"; X> X> print " <TD valign=middle> X> <FORM action=\"${alarm_cgi}\" method=\"get\"> X> <input type=button value=\"Alarm Browser\" X> onCLick=\"javascript:win(\'$alarm_cgi\')\">\n"; X> print " </FORM></TD>\n"; X> } X> END-of-genweb.event.patch echo x - snips-events.cgi sed 's/^X//' >snips-events.cgi << 'END-of-snips-events.cgi' X#!/usr/bin/perl X# X# AUTHOR: peiffer at umn edu, June 2002 X# X# Xmy $vcid = '$Id:'; X Xuse vars qw ( $debug $refresh $large_refresh $genweb_cgi X $snipsroot $etcdir $max_table_rows X ); X$snipsroot = "/usr/local/snips" ; # SET_THIS X$etcdir = "$snipsroot/etc"; Xpush (@INC, $etcdir); X Xrequire "snipsperl.conf"; Xrequire "snipsweb-confg"; # in etcdir X Xuse Time::Local; Xuse CGI; # also requires Base64.pm X Xmy @monitors = qw( etherload hostmon ippingmon nsmon ntpmon portmon X rpcpingmon trapmon dhcpmon wwmon bgpmon ) ; Xmy @sortfields = qw(name varname deviceaddr varvalue monitor severe); X%watchpat = ( X ) unless (%watchpat); Xmy @watchfields = keys %watchpat; X X$debug = 0; # FIX FIX X$query = new CGI; X$debug= $query->param('debug') if $query->param('debug'); Xmy $a=$query->param('Action'); X X# this script was invoked by external script. Xprint $query->header(-Refresh=>'$refresh;'); Xprint $query->start_html("SNIPS Event/Alarm Browser"); X&print_form($query); Xprint $query->end_html; X X### X### Subroutines X### X Xsub print_form { X my($query) = @_; X X my($field); X X my(@rawlogs) = &get_logs (3600); # 1hr X my $idx = 0; X my %suffixlist; X X foreach(@watchfields) { # Gotta find a less hokey way of naming. X $suffixlist{$_} = $idx++; X } X X print " X <script language=\"JavaScript\"><!-- X function win(fileName) { X snipsfloat = window.open(\'\',\'snipsevent\',\'scrollbars=yes,status=no,width=800,height=200\') X snipsfloat.location.href = fileName; X } X //--></script>\n"; X X printf " <TABLE BORDER=1><CAPTION>Alarm Browser</CAPTION>\n"; X foreach $field (@watchfields) { X print_logs($suffixlist{$field}, $watchpat{$field}, &filter_logs($field, @rawlogs)); X printf " <TR>\n"; X printf " <TD>\n"; X $button = sprintf("/snips/gifs/%s.gif", &get_condition($field,@rawlogs)); X printf " <IMG SRC=\"$button\" height=37, width=37>\n"; X printf " </TD>\n"; X printf " <TD>\n"; X printf " <A HREF=\"javascript:win(\'${baseurl}/snipslog.%s\')\">%s</A>\n", X $suffixlist{$field}, $watchpat{$field}; X printf " </TD>\n"; X printf " </TR>\n"; X } X printf " </TABLE>\n"; X X print $query->endform, "<HR>\n"; X} X X# X# void X# print_logs (matchspec, caption, list of logs) X# X# Create a temporary log entry in the web directory. X# Xsub print_logs { X my ($suffix, $field, @logs) = @_; X X my $bgcolor; X open(LOG, ">${webdir}/snipslog.${suffix}"); X printf LOG " <TABLE BORDER=1 BGCOLOR=\"TAN\">"; X printf LOG "<CAPTION>Event Browser $field </CAPTION>\n"; X printf LOG "<TR><TD>Legend:<BR>"; X printf LOG "DATE [monitor]: DEVICE device address VAR variable measured threshold units LEVEL event_level LOGLEVEL lastevent_level STATE state\n"; X printf LOG "</TD></TR>\n"; X foreach my $log (@logs) { X if ($bgcolor eq 'D8D8D8') { X $bgcolor = 'FFFFCC'; X } else { X $bgcolor = 'D8D8D8'; X } X X $log =~ s/Info/<FONT COLOR="GREEN">Info<\/FONT>/g; X $log =~ s/Warning/<FONT COLOR="YELLOW">Warning<\/FONT>/g; X $log =~ s/Error/<FONT COLOR="BLUE">Error<\/FONT>/g; X $log =~ s/Critical/<FONT COLOR="RED">Critical<\/FONT>/g; X X printf LOG " <TR><TD BGCOLOR=\"$bgcolor\">"; X printf LOG "<SMALL>$log</SMALL></TD></TR>\n"; X } X printf LOG " </TABLE>\n"; X close(LOG); X} X# X# list [green,yellow,blue,red][info,warning,error,critical] X# get_condition (urlspec, list of logs) X# X# return the overall alarm condition code (color) for events X# that match the input urlspec X# Xsub get_condition { X X my($url,@rawlogs) = @_; X my($condition,%cache,$key,$value,%condition); X X foreach $line (&filter_logs($url,@rawlogs)) { X my($monitor,$device,$address,$var,$level,$state) = X (split(/\s+/, $line))[5,7,8,10,17,19]; X $key = join('|', $monitor, $device, $address,$var); X $cache{$key} = $level; X } X foreach $value (values %cache) { X $condition{$value} = 1; X } X X my($cache_size) = scalar(keys %condition); X foreach $key (keys %condition) { X print "get_condition(): key $key\n", if ($debug); X } X X return 'redsq' if (exists $condition{'Critical'}); X return 'bluesq' if (exists $condition{'Error'}); X return 'yellowsq' if (exists $condition{'Warning'}); X return 'greensq' if (exists $condition{'Info'}); X return 'empty' if (exists $condition{'Unknown'}); X return 'greensq' if ($cache_size == 0); X} X X# X# list X# filter_logs(urlspec,list of logs) X# X# Filter logs based upon SNIPs genweb parameter list. Empty X# parameters for filepat, and namepat are assumed to be matched. X# Xsub filter_logs { X my($url,@rawlogs) = @_; X X my(@retn); X X my($filepat) = ($url =~ /filepat=([^\&]*)/); X $filepat = '.*' if ($filepat eq ''); X my($namepat) = ($url =~ /namepat=([^\&]*)/); X $namepat = '.*' if ($namepat eq ''); X foreach my $line (@rawlogs) { X my($monitor,$device,$address,$var,$level,$state) = X (split(/\s+/, $line))[5,7,8,10,17,19]; X if (($monitor =~ /$filepat/) && X ($device =~ /$namepat/)) { X push(@retn, $line); X } X } X return(@retn); X} X X# X# list X# get_logs(time) X# X# Read and return list of SNIPS logs that are more current than X# the input time in seconds X# Xsub get_logs { X my($time) = @_; X X my @retn; X my %MON = ('Jan', 0, 'Feb', 1, 'Mar', 2, 'Apr', 3, 'May', 4, 'Jun', 5, X 'Jul', 6, 'Aug', 7, 'Sep', 8, 'Oct', 9, 'Nov', 10, 'Dec', 11); X open(LOG, "$snipsroot/logs/info"); X while(<LOG>) { X chomp; X my $logline = $_; X printf "new line $logline\n" if ($debug); X if (/\S+\s+(\S+)\s+(\d+)\s+(\d+):(\d+):(\d+)\s+(\d+)\s+\[(\S*)\]/) { X my($month,$mday,$hours,$min,$sec,$year,$monitor) = X ($1, $2, $3, $4, $5, $6, $7); X next if ($monitor eq ''); # some bug in hostmon X $mon = $MON{$month}; X my $logtime = timelocal($sec,$min,$hours,$mday,$mon,$year); X next if ((time - $time) > $logtime); X printf "get_logs(): pushing $logline\n", if ($debug); X push @retn, $_; X } X } X close(LOG); X X return(@retn); X} END-of-snips-events.cgi exit |