#!/usr/bin/perl -I/usr/local/raqdevil/perl # Copyright (c) Turbolinux, inc. use strict; use CCE; use Getopt::Long; use I18n; use SendEmail; my %params; &GetOptions("conf|c=s" => \$params{'conf'}); my $conf = $params{'conf'}; open(CONF, "< $conf"); my @email_list; my $body = ""; my $lang = "en"; my $enabled = "true"; while () { chomp; my($key, $val) = split /\s*=\s*/, $_, 2; if ($key eq "email_list") { @email_list = split /\s*,\s*/, $val; } elsif ($key eq "lang") { $lang = $val; } elsif ($key eq "enabled") { $enabled = $val; } } if ($enabled eq "false") { exit 0; } close(CONF); my $object; my $i18n = new I18n(); my $DEBUG_ME = 0; my $cce = new CCE; $cce->connectuds(); my @sysoid = $cce->find ('System'); my ($ok, $sysobj) = $cce->get($sysoid[0]); my $system_lang = $sysobj->{productLanguage}; $i18n->setLocale($system_lang); my $body_head = $i18n->get('[[swatch.emailBody]]') . "\n\n"; my @oid = $cce->find ('ActiveMonitor'); my ($ok, @names, @info) = $cce->names ('ActiveMonitor'); #print $oid[0], "\n"; #print @names, "\n"; my @states = ("N", "G", "Y", "R"); my %stats = {}; my @tcp_ports; open TCP, "/usr/bin/netstat -n -p tcp -f inet"; while () { my @fields = split / +/, $_; my ($l1, $l2, $l3, $l4, $lport) = split /\./, $fields[3]; my ($r1, $r2) = split /\./, $fields[4]; if ($r1 eq "*" && $r2 eq "*") { push @tcp_ports, $lport; } } close TCP; my @udp_ports; open UDP, "/usr/bin/netstat -n -p udp -f inet"; while () { my @fields = split / +/, $_; my ($l1, $l2, $l3, $l4, $lport) = split /\./, $fields[2]; my ($r1, $r2) = split /\./, $fields[3]; if ($r1 eq "*" && $r2 eq "*") { push @udp_ports, $lport; } } close UDP; while ( defined (my $name = <@names>) ) { (my $ok, $object, my $old, my $new) = $cce->get ($oid[0], $name); if ( $object->{enabled} && $object->{monitor} ) { my $msg; my $agg_msg; my $state = 0; if ($object->{type} eq "aggregate") { print "$name aggregates $object->{typeData}\n" if ($DEBUG_ME); my $currentMessage = $object->{currentMessage}; my @aggregates = split / +/, $object->{typeData}; foreach my $aggregate (@aggregates) { my ($ok, $obj, $old, $new) = $cce->get ($oid[0], $aggregate); if ($obj->{enabled} && $obj->{monitor}) { ($stats{"$aggregate"}, my $ret, $agg_msg) = do_monitor($obj); $msg .= "\n - " . $i18n->get($ret); } if ($state < $stats{"$aggregate"}) { $state = $stats{"$aggregate"}; } $stats{"$name"} = $state; } if ($state > 0) { my @msgs = ("", "", "", ""); $msgs[1] = $object->{greenMsg} if (defined ($object->{greenMsg})); $msgs[2] = $object->{yellowMsg} if (defined ($object->{yellowMsg})); $msgs[3] = $object->{redMsg} if (defined ($object->{redMsg})); $cce->set ($oid[0], $name, { currentState => $states[$state], lastChange=>time(), currentMessage => $msgs[$state], }); if ($currentMessage ne $msgs[$state]) { $msg = $i18n->get($msgs[$state]) . $msg; } else { $msg = ""; } print "[$name] state : $state\n" if ($DEBUG_ME); } } elsif (!$object->{aggMember}) { ($stats{"$name"}, my $ret, $msg) = do_monitor($object); } if ($msg) { $body .= "* " . $msg . "\n\n"; } } } if ($body) { $body = $body_head . $body; my $subject = $i18n->get("[[swatch.emailSubject]]"); my $to; foreach $to (@email_list) { SendEmail::sendEmail($to, "root ", $subject, $body); } } $cce->bye(); sub do_monitor { my ($object) = @_; my $name = $object->{NAMESPACE}; my $oldMessage = $object->{currentMessage}; print "monitor [${name}]\n" if ($DEBUG_ME); my $type = $object->{type}; my $am = $object->{typeData}; my ($ret, $state) = ("", -1); $ENV{greenMsg} = $object->{greenMsg} if (defined ($object->{greenMsg})); $ENV{yellowMsg} = $object->{yellowMsg} if (defined ($object->{yellowMsg})); $ENV{redMsg} = $object->{redMsg} if (defined ($object->{redMsg})); if ($type eq "tcp") { my $hex; $hex = sprintf("%04X", 0 + $am); if (grep(/$hex/, @tcp_ports) > 0) { $state = 1; # green $ret = $ENV{greenMsg}; } else { my $restart; $state = 3; # red $ret = $ENV{redMsg}; $restart = $object->{restart} if (defined ($object->{restart})); system($restart); } } elsif ($type eq "udp") { my $hex; $hex = sprintf("%04X", 0 + $am); if (grep(/$hex/, @udp_ports) > 0) { $state = 1; # green $ret = $ENV{greenMsg}; } else { my $restart; $state = 3; # red $ret = $ENV{redMsg}; $restart = $object->{restart} if (defined ($object->{restart})); system($restart); } } elsif ( -x $am ) { print "running $am\n" if ($DEBUG_ME); $ret = `LANG=$lang $am`; $state = $? >> 8; print " [$state:$ret] " . $i18n->get($ret) . "\n" if ($DEBUG_ME); } if ($state >= 0) { $cce->set ($oid[0], $name, { currentState => $states[$state], lastChange=>time(), currentMessage => $ret, }); } my $msg; if ($oldMessage ne $ret) { $msg = $i18n->get($ret); } return ($state, $ret, $msg); }