manager.pm
上传用户:wxp200602
上传日期:2007-10-30
资源大小:4028k
文件大小:36k
- package NetSNMP::manager;
- use strict ();
- use Apache::Constants qw(:common);
- use CGI qw(:standard delete_all);
- use SNMP ();
- use DBI ();
- use NetSNMP::manager::displaytable qw(displaytable displaygraph);
- # globals
- $NetSNMP::manager::hostname = 'localhost'; # Host that serves the mSQL Database
- $NetSNMP::manager::dbname = 'snmp'; # mySQL Database name
- $NetSNMP::manager::user = 'root';
- # $NetSNMP::manager::pass = "password";
- $NetSNMP::manager::imagebase = "/home/hardaker/src/snmp/manager"; # <=== CHANGE ME ====
- $NetSNMP::manager::redimage = "/graphics/red.gif";
- $NetSNMP::manager::greenimage = "/graphics/green.gif";
- #$NetSNMP::manager::verbose = 1;
- $NetSNMP::manager::tableparms = "border=1 bgcolor="#c0c0e0"";
- $NetSNMP::manager::headerparms = "border=1 bgcolor="#b0e0b0"";
- # init the snmp library
- $SNMP::save_descriptions=1;
- #SNMP::init_mib();
- %NetSNMP::manager::myorder = qw(id 0 oidindex 1 host 2 updated 3);
- sub handler {
- my $r = shift;
- Apache->request($r);
- # get info from handler
- my $hostname = $r->dir_config('hostname') || $NetSNMP::manager::hostname;
- my $dbname = $r->dir_config('dbname') || $NetSNMP::manager::dbname;
- my $sqluser = $r->dir_config('user') || $NetSNMP::manager::user;
- my $pass = $r->dir_config('pass') || $NetSNMP::manager::pass;
- my $verbose = $r->dir_config('verbose') || $NetSNMP::manager::verbose;
- #===========================================================================
- # Global defines
- #===========================================================================
- my ($dbh, $query, $remuser);
- $remuser = $ENV{'REMOTE_USER'};
- $remuser = "guest" if (!defined($remuser) || $remuser eq "");
- #===========================================================================
- # Connect to the mSQL database with the appropriate driver
- #===========================================================================
- ($dbh = DBI->connect("DBI:mysql:database=$dbname;host=$hostname", $sqluser, $pass))
- or die "tConnect not ok: $DBI::errstrn";
- #===========================================================================
- # stats Images, for inclusion on another page. (ie, slashdot user box)
- #===========================================================================
- if (my $group = param('groupstat')) {
- $r->content_type("image/gif");
- $r->send_http_header();
- my $cur = getcursor($dbh, "select host from usergroups as ug, hostgroups as hg where ug.groupname = '$group' and hg.groupname = '$group' and user = '$remuser'");
- while (my $row = $cur->fetchrow_hashref ) {
- if (checkhost($dbh, $group, $row->{'host'})) {
- open(I, "$NetSNMP::manager::imagebase$NetSNMP::manager::redimage");
- while(read(I, $_, 4096)) { print; }
- close(I);
- }
- }
- open(I, "$NetSNMP::manager::imagebase$NetSNMP::manager::greenimage");
- while(read(I, $_, 4096)) { print; }
- close(I);
- return OK();
- }
- sub date_format {
- my $time = shift;
- my @out = localtime($time);
- my $ret = $out[4] . "-" . $out[3] . "-" . $out[5] . " " . $out[2] . " " . $out[1];
- # print STDERR "$time: $retn";
- return $ret;
- }
- #
- # Graphing of historical data
- #
- if ((param('displaygraph') || param('dograph')) && param('table')) {
- my $host = param('host');
- my $group = param('group');
- if (!isuser($dbh, $remuser, $group)) {
- $r->content_type("image/png");
- $r->send_http_header();
- print "Unauthorized access to that group ($group)n";
- return Exit($dbh, $group);
- }
- my $table = param('table');
- my @columns;
- if (!param('dograph')) {
- $r->content_type("text/html");
- $r->send_http_header();
- print "<body bgcolor="#ffffff">n";
- print "<form>n";
- print "<table border=1><tr><td>n";
- print "<table>n";
- print "<tr align=top><th></th><th>Select indexes<br>to graph</th></tr>n";
- my $handle = getcursor($dbh, "SELECT sql_small_result distinct(oidindex) FROM $table where host = '$host'");
- my @cols;
- while ( $row = $handle->fetchrow_hashref ) {
- print "<tr><td>$row->{oidindex}</td><td><input type=checkbox value=1 name=" . 'graph_' . displaytable::to_unique_key($row->{'oidindex'}) . "></td></tr>n";
- }
- print "</table>n";
- print "</td><td>n";
- print "<table>n";
- print "<tr align=top><th></th><th>Select Columns<br>to graph</th></tr>n";
- my $handle = getcursor($dbh, "SELECT * FROM $table limit 1");
- my $row = $handle->fetchrow_hashref;
- map { print "<tr><td>$_</td><td><input type=checkbox value=1 name=column_" . displaytable::to_unique_key($_) . "></td></tr>n"; } keys(%$row);
- print "</table>n";
- print "</td></tr></table>n";
- print "<br>Graph as a Rate: <input type=checkbox value=1 name=graph_as_rate><br>n";
- print "<br>Maximum Y Value: <input type=text value=inf name=max_y><br>n";
- print "<br>Minimum Y Value: <input type=text value=-inf name=min_y><br>n";
- print "<input type=hidden name=table value="$table">n";
- print "<input type=hidden name=host value="$host">n";
- print "<input type=hidden name=dograph value=1>n";
- print "<input type=hidden name=group value="$group">n";
- print "<input type=submit name="Make Graph">n";
- print "</form>n";
- my $handle = getcursor($dbh, "SELECT distinct(oidindex) FROM $table where host = '$host' order by oidindex");
- return Exit($dbh, $group);
- }
- if (param('graph_all_data')) {
- $clause = "host = '$host'";
- } else {
- my $handle = getcursor($dbh, "SELECT distinct(oidindex) FROM $table where host = '$host'");
- $clause = "where (";
- while ( $row = $handle->fetchrow_hashref ) {
- # print STDERR "graph test: " . $row->{'oidindex'} . "=" . "graph_" . displaytable::to_unique_key($row->{'oidindex'}) . "=" . param("graph_" . displaytable::to_unique_key($row->{'oidindex'})) . "n";
- if (param("graph_" . displaytable::to_unique_key($row->{'oidindex'}))) {
- $clause .= " or oidindex = " . $row->{'oidindex'} . "";
- }
- }
- my $handle = getcursor($dbh, "SELECT * FROM $table limit 1");
- my $row = $handle->fetchrow_hashref;
- map { push @columns, $_ if (param('column_' . displaytable::to_unique_key($_))) } keys(%$row);
- $clause .= ")";
- $clause =~ s/( or /(/;
- if ($clause =~ /()/ || $#columns == -1) {
- $r->content_type("text/html");
- $r->send_http_header();
- print "<body bgcolor="#ffffff">n";
- print "<h1>No Data to Graph</h1>n";
- print STDERR "No data to graph: $clause, $#columnsn";
- return Exit($dbh, "$group");
- }
- $clause .= " and host = '$host'";
- }
- # print STDERR "graphing clause: $clausen";
- # all is ok, display the graph
- $r->content_type("image/png");
- $r->send_http_header();
- print STDERR "graphing clause: $clause, columns: ", join(", ",@columns), "n";
- my @args;
- push (@args, '-rate', '60') if (param('graph_as_rate'));
- push (@args, '-max', param('max_y')) if (param('max_y') && param('max_y') =~ /^[-.d]+$/);
- push (@args, '-min', param('min_y')) if (param('min_y') && param('min_y') =~ /^[-.d]+$/);
- my $ret =
- displaygraph($dbh, $table,
- # '-xcol', "date_format(updated,'%m-%d-%y %h:%i')",
- '-xcol', "unix_timestamp(updated)",
- '-pngparms', [
- 'x_labels_vertical', '1',
- 'x_tick_number', 6,
- 'x_number_format', &date_format,
- 'y_label', 'Count/Min',
- 'title', $table,
- # 'y_min_value', 0,
- ],
- '-clauses', "$clause order by updated",
- @args,
- '-columns', @columns,
- '-indexes', ['oidindex']);
- print STDERR "$ret rows graphedn";
- return OK();
- }
- #===========================================================================
- # Start HTML.
- #===========================================================================
- $r->content_type("text/html");
- $r->send_http_header();
- print "<body bgcolor="#ffffff">n";
- print "<h1>UCD-SNMP Management Console</h1>n";
- print "<hr>n";
- #===========================================================================
- # Display mib related data information
- #===========================================================================
- if (param('displayinfo')) {
- makemibtable(param('displayinfo'));
- return Exit($dbh, "");
- }
- #===========================================================================
- # Display a generic sql table of any kind (debugging).
- #===========================================================================
- # if (my $disptable = param('displaytable')) {
- # if (param('editable') == 1) {
- # print "<form submit=dont>n";
- # displaytable($disptable, -editable, 1);
- # print "</form>n";
- # } else {
- # displaytable($disptable);
- # }
- # return Exit($dbh, "");
- # }
- #===========================================================================
- # Get host and group from CGI query.
- #===========================================================================
- my $host = param('host');
- my $group = param('group');
- #===========================================================================
- # Editable user information
- #===========================================================================
- if (param('setuponcall')) {
- print "<title>oncall schedule for user: $remuser</title>n";
- print "<h2>oncall schedule for user: $remuser</h2>n";
- print "<p>Please select your oncall schedule and mailing addresses for your groups below:";
- if (!isexpert($remuser)) {
- print "<ul>n";
- print "<li>Values for the days/hours fields can be comma seperated lists of hours/days/ranges. EG: hours: 7-18,0-4.n";
- print "</ul>n";
- }
- print "<form method=post><input type=hidden name=setuponcall value=1>n";
- displaytable($dbh, 'oncall',
- '-clauses',"where user = '$remuser' order by groupname",
- '-select','id, user, groupname, email, pager, days, hours',
- '-selectorder', 1,
- '-notitle', 1,
- '-editable', 1,
- '-indexes', ['id','user','groupname'],
- '-CGI', $CGI::Q
- );
- print "<input type=submit value="submit changes">n";
- print "</form>n";
- return Exit($dbh, $group);
- }
- #===========================================================================
- # show the list of groups a user belongs to.
- #===========================================================================
- if (!defined($group)) {
- my @groups = getgroupsforuser($dbh, $remuser);
- print "<title>Net-SNMP Group List</title>n";
- print "<h2>Host groupings you may access:</h2>n";
- if (!isexpert($remuser)) {
- print "<ul>n";
- print "<li>Click on a group to operate or view the hosts in that group.n";
- print "<li>Click on a red status light below to list the problems found.n";
- print "</ul>n";
- }
-
- if ($#groups > 0) {
- displaytable($dbh, 'usergroups',
- '-clauses', "where (user = '$remuser')",
- '-select', 'distinct groupname',
- '-notitle', 1,
- '-printonly', ['groupname'],
- '-datalink', sub { my $q = self_url();
- my $key = shift;
- my $h = shift;
- return if ($key ne "groupname");
- return addtoken($q,"group=$h");
- },
- '-beginhook',
- sub {
- my $q = self_url();
- my($dbh, $junk, $data) = @_;
- if (!defined($data)) {
- print "<th>Status</th>";
- return;
- }
- my ($cur, $row);
- $cur = getcursor($dbh, "select host from hostgroups where groupname = '$data->{groupname}'");
- while ( $row = $cur->fetchrow_hashref ) {
- if (checkhost($dbh, $data->{'groupname'},
- $row->{'host'})) {
- print "<td><a href="" . addtoken($q,"group=$data->{groupname}&summarizegroup=1") . ""><img border=0 src=$NetSNMP::manager::redimage></a></td>n";
- return;
- }
- }
- print "<td><img src=$NetSNMP::manager::greenimage></td>n";
- }
- );
- $dbh->disconnect();
- return Exit($dbh, $group);
- } else {
- if ($#groups == -1) {
- print "You are not configured to use the Net-SNMP-manager, please contact your system administrator.";
- return Exit($dbh, $group);
- }
- $group = $groups[0];
- }
- }
- #===========================================================================
- # reject un-authorized people accessing a certain group
- #===========================================================================
- if (!isuser($dbh, $remuser, $group)) {
- print "Unauthorized access to that group ($group)n";
- return Exit($dbh, $group);
- }
- #===========================================================================
- # add a new host to a group
- #===========================================================================
- if (defined(my $newhost = param('newhost'))) {
- if (isadmin($dbh, $remuser, $group)) {
- if ($dbh->do("select * from hostgroups where host = '$newhost' and groupname = '$group'") eq "0E0") {
- $dbh->do("insert into hostgroups(host,groupname) values('$newhost','$group')") ;
- } else {
- print "<b>ERROR: host $newhost already in $group</b>n";
- }
- CGI::delete('newhost');
- }
- }
- #===========================================================================
- # display setup configuration for a group
- #===========================================================================
- if (defined(param('setupgroup'))) {
- if (isadmin($dbh, $remuser, $group)) {
- setupgroup($dbh, $group);
- } else {
- print "<h2>You're not able to perform setup operations for group $groupn";
- }
- return Exit($dbh, $group);
- }
- #===========================================================================
- # save configuration information submitted about a group
- #===========================================================================
- if (defined(param('setupgroupsubmit')) &&
- isadmin($dbh, $remuser, $group)) {
- setupgroupsubmit($dbh, $group);
- delete_all();
- param(-name => 'group', -value => $group);
- print "<a href="" . self_url() . "">Entries submitted</a>";
- return Exit($dbh, $group);
- }
- #===========================================================================
- # user preferences
- #===========================================================================
- if (defined(param('userprefs'))) {
- setupuserpreferences($dbh, $remuser, $group);
- return Exit($dbh, $group);
- }
- #===========================================================================
- # save submitted user preferences
- #===========================================================================
- if (defined(param('setupuserprefssubmit')) &&
- isadmin($dbh, $remuser, $group)) {
- setupusersubmit($dbh, $remuser, $group);
- delete_all();
- param(-name => 'group', -value => $group);
- print "<a href="" . self_url() . "">Entries submitted</a>";
- return Exit($dbh, $group);
- }
- #===========================================================================
- # summarize problems in a group
- #===========================================================================
- if (defined(param('summarizegroup'))) {
- print "<title>group problem summary: $group</title>n";
- print "<h2>The following is a list of problems in the group "$group":</h2>n";
- summarizeerrors($dbh, "where groupname = '$group'");
- return Exit($dbh, $group);
- }
- #===========================================================================
- # summarize problems on a host
- #===========================================================================
- if (defined($host) && defined(param('summarizehost'))) {
- print "<title>host summary: $host</title>n";
- print "<h2>The following is a list of problems for the host "$host":</h2>n";
- summarizeerrors($dbh, "where groupname = '$group' and host = '$host'");
- return Exit($dbh, $group);
- }
- #===========================================================================
- # display a list of hosts in a group
- #===========================================================================
- if (!defined($host)) {
- print "<title>Net-SNMP Host $host</title>n";
- print "<h2>Hosts in the group "$group":</h2>n";
- if (!isexpert($remuser)) {
- print "<ul>n";
- if (isadmin($dbh, $remuser, $group)) {
- my $q = self_url();
- $q =~ s/?.*//;
- print "<li>Make sure you <a href="" . addtoken($q,"group=$group&setupgroup=1") . "">set up the host</a> for the SNMP tables you want to monitor.n";
- }
- print "<li>Click on a hostname to operate on or view the information tables associated with that group.n";
- print "<li>Click on a red status light below to list the problems found in with a particular host.n";
- print "</ul>n";
- }
- displaytable($dbh, 'hostgroups',
- '-notitle',0,
- '-clauses', "where (groupname = '$group')",
- '-select', 'distinct host, sysObjectId, sysDescr, sysUpTime, versionTag',
- '-datalink', sub { my $q = self_url();
- my $key = shift;
- my $h = shift;
- return if ($key ne "host");
- return addtoken($q,"host=$h");
- },
- '-beginhook',
- sub {
- my $q = self_url();
- my($dbh, $junk, $data) = @_;
- if (!defined($data)) {
- print "<th>Status</th>";
- return;
- }
- if (checkhost($dbh, $group, $data->{'host'})) {
- print "<td><a href="" . addtoken($q,"group=$group&summarizehost=1&host=$data->{host}") . ""><img border=0 src=$NetSNMP::manager::redimage></a></td>n";
- } else {
- print "<td><img src=$NetSNMP::manager::greenimage></td>n";
- }
- }
- );
- if (isadmin($dbh, $remuser, $group)) {
- addhostentryform($group);
- my $q = self_url();
- $q =~ s/?.*//;
- print "<a href="" . addtoken($q,"group=$group&setupgroup=1") . "">setup group $group</a>n";
- }
- return Exit($dbh, $group);
- }
- #===========================================================================
- # setup the host's history records
- #===========================================================================
- if (param('setuphost')) {
- print "<title>Net-SNMP history setup for host: $host</title>n";
- print "<h2>Net-SNMP history setup for the host: "$host"</h2>n";
- print "<p>Enter the number of days to keep the data for a given table for the host "$host":n";
- if (!isexpert($remuser)) {
- print "<ul>n";
- print "<li>Numbers must be greater than or equal to 1 to enable history logging.n";
- print "</ul>n";
- }
- print "<form method=post><input type=hidden name=setuphost value=1><input type=hidden name=host value="$host"><input type=hidden name=group value="$group">n";
- displaytable($dbh, 'hosttables',
- '-clauses',"where host = '$host' and groupname = '$group'",
- '-select','groupname, host, tablename, keephistory',
- '-selectorder', 1,
- '-notitle', 1,
- '-editable', 1,
- '-indexes', ['groupname','host','tablename'],
- '-CGI', $CGI::Q
- );
- print "<input type=submit value="submit changes">n";
- print "</form>n";
- return Exit($dbh, $group);
- }
- #===========================================================================
- # display a huge table of history about something
- #===========================================================================
- if (param('displayhistory')) {
- if (!isuser($dbh, $remuser, $group)) {
- print "Unauthorized access to that group ($group)n";
- return Exit($dbh, $group);
- }
- displaytable($dbh, param('table'),
- '-clauses', "where (host = '$host')",
- '-dolink', &linktodisplayinfo,
- '-dontdisplaycol', "select * from userprefs where user = '$remuser' and groupname = '$group' and tablename = ? and columnname = ? and displayit = 'N'"
- );
- return Exit($dbh, $group);
- }
- #===========================================================================
- # display inforamation about a host
- # optionally add new collection tables
- #===========================================================================
- showhost($dbh, $host, $group, $remuser);
- if (isadmin($dbh, $remuser, $group)) {
- if (param('newtables')) {
- my $x = param('newtables');
- $x =~ s/,/ /g;
- if (/[^ws]/) {
- print "<br>Illegal table names in addition list: $x<br>n"
- } else {
- my @x = split(/s+/,$x);
- foreach my $i (@x) {
- $dbh->do("insert into hosttables(host, groupname, tablename, keephistory) values('$host','$group','$i','0')");
- }
- print "<br>adding: ",join(", ",@x),"<br>n";
- }
- } else {
- print "<br>Add new MIB Tables or Groups that you want to collect for this host: <form><input type=hidden name=host value="$host"><input type=hidden name=group value="$group"><input name="newtables" type=text><br><input type=submit value="add tables"></form>n";
- }
- my $q = self_url();
- $q =~ s/?.*//;
- print "<a href="" . addtoken($q, "setuphost=1&host=$host&group=$group") . "">setup host $host</a>n";
- }
- return Exit($dbh, $group);
- #===========================================================================
- # END of handler
- #===========================================================================
- }
- # add a token to a url string. Use either a ? or an & depending on
- # existence of ?.
- sub addtoken {
- my $url = shift;
- my $token = shift;
- return "$url&$token" if ($url =~ /?/);
- return "$url?$token";
- }
- #
- # summarizeerrors(DB-HANDLE, CLAUSE):
- # summarize the list of errors in a given CLAUSE
- #
- sub summarizeerrors {
- my $dbh = shift;
- my $clause = shift;
- $clause = "where" if ($clause eq "");
- my $clause2 = $clause;
- $clause2 =~ s/ host / hosterrors.host /;
- # Major errors
- displaytable($dbh, 'hosterrors, hostgroups', # , hostgroups
- '-select', "hosterrors.host as host, errormsg",
- '-notitle', 1,
- '-title', "Fatal Errors",
- '-clauses', "$clause2 and hosterrors.host = hostgroups.host",
- '-beginhook', sub {
- if ($#_ < 2) {
- #doing header;
- print "<td></td>";
- } else {
- print "<td><img src="$NetSNMP::manager::redimage"></td>n";
- }});
- my $tabletop = "<br><table $NetSNMP::manager::tableparms><tr $NetSNMP::manager::headerparms><th><b>Host</b></th><th><b>Table</b></th><th><b>Description</b></th></tr>n";
- my $donetop = 0;
- my $cursor =
- getcursor($dbh, "SELECT * FROM hosttables $clause");
- while (my $row = $cursor->fetchrow_hashref ) {
- my $exprs = getcursor($dbh, "SELECT * FROM errorexpressions where (tablename = '$row->{tablename}')");
-
- while (my $expr = $exprs->fetchrow_hashref ) {
- my $errors = getcursor($dbh, "select * from $row->{tablename} where $expr->{expression} and host = '$row->{host}'");
- while (my $error = $errors->fetchrow_hashref ) {
- print $tabletop if ($donetop++ == 0);
- print "<tr><td>$row->{host}</td><td>$row->{tablename}</td><td>$expr->{returnfield}: $error->{$expr->{returnfield}}</td></tr>";
- }
- }
- }
- print "</table>";
- }
- #
- # getcursor(CMD):
- # genericlly get a cursor for a given sql command, displaying and
- # printing errors where necessary.
- #
- sub getcursor {
- my $dbh = shift;
- my $cmd = shift;
- my $cursor;
- ( $cursor = $dbh->prepare( $cmd ))
- or print "nnot ok: $DBI::errstrn";
- ( $cursor->execute )
- or print( "tnot ok: $DBI::errstrn" );
- return $cursor;
- }
- #
- # mykeysort($a, $b)
- # sorts $a and $b against the order in the mib or against the hard
- # coded special list.
- #
- sub mykeysort {
- my $a = $displaytable::a;
- my $b = $displaytable::b;
- my $mb = $SNMP::MIB{SNMP::translateObj($b)};
- my $ma = $SNMP::MIB{SNMP::translateObj($a)};
- return $NetSNMP::manager::myorder{$a} <=> $NetSNMP::manager::myorder{$b} if ((defined($NetSNMP::manager::myorder{$a}) || !defined($ma->{'subID'})) && (defined($NetSNMP::manager::myorder{$b}) || !defined($mb->{'subID'})));
- return 1 if (defined($NetSNMP::manager::myorder{$b}) || !defined($mb->{'subID'}));
- return -1 if (defined($NetSNMP::manager::myorder{$a}) || !defined($ma->{'subID'}));
- $ma->{'subID'} <=> $mb->{'subID'};
- }
- #
- # checkhost(GROUP, HOST):
- # if anything in a host is an error, as defined by the
- # errorexpressions table, return 1, else 0
- #
- sub checkhost {
- my $dbh = shift;
- my $group = shift;
- my $host = shift;
- my ($tblh);
- return 2 if ($dbh->do("select * from hosterrors where host = '$host'") ne "0E0");
- # get a list of tables we want to display
- $tblh = getcursor($dbh, "SELECT * FROM hosttables where (host = '$host' and groupname = '$group')");
- # table data
- my($exprs, $tablelist);
- while ( $tablelist = $tblh->fetchrow_hashref ) {
- $exprs = getcursor($dbh, "SELECT * FROM errorexpressions where (tablename = '$tablelist->{tablename}')");
- while(my $expr = $exprs->fetchrow_hashref) {
- if ($dbh->do("select * from $tablelist->{tablename} where $expr->{expression} and host = '$host'") ne "0E0") {
- return 1;
- }
- }
- }
- return 0;
- }
- #
- # showhost(HOST):
- #
- # display all the tables monitored for a given host (in a group).
- #
- sub showhost {
- my $dbh = shift;
- my $host = shift;
- my $group = shift;
- my $remuser = shift;
- my $q = self_url();
- $q =~ s/?.*//;
- # host header
- print "<title>Net-SNMP manager report for host: $host</title>n";
- print "<h2>Monitored information for the host $host</h2>n";
- if (!isexpert($remuser)) {
- print "<ul>n";
- print "<li>Click on a column name for information about the data in that column.n";
- print "<li>Click on a column name or table name for information about the data in the table.n";
- print "<li>If you are <a href="" . addtoken($q, "setuphost=1&host=$host&group=$group") . "">collecting past history</a> for a data set, links will appear below the table that allow you to view and/or graph the historic data.n";
- print "</ul>n";
- }
- # does the host have a serious error?
- my $errlist = getcursor($dbh, "SELECT * FROM hosterrors where (host = '$host')");
- if ( $dbh->do("SELECT * FROM hosterrors where (host = '$host')") ne "0E0") {
- displaytable($dbh, 'hosterrors',
- '-clauses', "where (host = '$host')",
- '-dontdisplaycol', "select * from userprefs where user = '$remuser' and groupname = '$group' and tablename = ? and columnname = ? and displayit = 'N'",
- '-beginhook', sub {
- if ($#_ < 2) {
- #doing header;
- print "<td></td>";
- } else {
- print "<td><img src="$NetSNMP::manager::redimage"></td>n";
- }});
- }
- # get a list of tables we want to display
- my $tblh = getcursor($dbh, "SELECT * FROM hosttables where (host = '$host' and groupname = '$group')");
- # table data
- my($tablelist);
- while ( $tablelist = $tblh->fetchrow_hashref ) {
- displaytable($dbh, $tablelist->{'tablename'},
- '-clauses', "where (host = '$host') order by oidindex",
- '-dontdisplaycol', "select * from userprefs where user = '$remuser' and groupname = '$group' and tablename = ? and columnname = ? and displayit = 'N'",
- '-sort', &mykeysort,
- '-dolink', &linktodisplayinfo,
- '-beginhook', &printredgreen);
- if ($tablelist->{'keephistory'}) {
- my $q = self_url();
- $q =~ s/?.*//;
- print "history: ";
- print "<a href="" . addtoken($q, "displayhistory=1&host=$host&group=$group&table=$tablelist->{'tablename'}hist") . "">[table]</a>n";
- print "<a href="" . addtoken($q, "displaygraph=1&host=$host&group=$group&table=$tablelist->{'tablename'}hist") . "">[graph]</a>n";
- print "<br>n";
- }
- }
- }
- #
- # linktodisplayinfo(STRING):
- #
- # returns a url to the appropriate displayinfo link if STRING is a
- # mib node.
- #
- sub linktodisplayinfo {
- return if (exists($NetSNMP::manager::myorder{shift}));
- return self_url() . "&displayinfo=" . shift;
- }
- # printredgreen(TABLENAME, DATA):
- #
- # display a red or a green dot in a table dependent on the table's
- # values and associated expression
- #
- # DATA is NULL when in a header row (displaying header names).
- #
- sub printredgreen {
- my $dbh = shift;
- my $tablename = shift;
- my $data = shift;
- my ($exprs, $expr, $img);
- if (!defined($data)) {
- #doing header;
- print "<td></td>";
- return;
- }
- my $cmd = "SELECT * FROM errorexpressions where (tablename = '$tablename')";
- print " $cmdn" if ($NetSNMP::manager::verbose);
- ( $exprs = $dbh->prepare( $cmd ) )
- or die "nnot ok: $DBI::errstrn";
- ( $exprs->execute )
- or print( "tnot ok: $DBI::errstrn" );
- $img = $NetSNMP::manager::greenimage;
- while($expr = $exprs->fetchrow_hashref) {
- if ($dbh->do("select oidindex from $tablename where host = '$data->{host}' and oidindex = '$data->{oidindex}' and $expr->{expression}") ne "0E0") {
- $img = $NetSNMP::manager::redimage;
- }
- }
- print "<td><img src=$img></td>";
- }
- #
- # display information about a given mib node as a table.
- #
- sub makemibtable {
- my $dispinfo = shift;
- # display information about a data type in a table
- my $mib = $SNMP::MIB{SNMP::translateObj($dispinfo)};
- print "<table $NetSNMP::manager::tableparms><tr><td>n";
- foreach my $i (qw(label type access status units hint moduleID description enums)) {
- # foreach my $i (keys(%$mib)) {
- next if (!defined($$mib{$i}) || $$mib{$i} eq "");
- next if (ref($$mib{$i}) eq "HASH" && $#{keys(%{$$mib{$i}})} == -1);
- print "<tr><td>$i</td><td>";
- if (ref($$mib{$i}) eq "HASH") {
- print "<table $NetSNMP::manager::tableparms><tr><td>n";
- foreach my $j (sort { $$mib{$i}{$a} <=> $$mib{$i}{$b} } keys(%{$$mib{$i}})) {
- print "<tr><td>$$mib{$i}{$j}</td><td>$j</td></tr>";
- }
- print "</table>n";
- } else {
- print "$$mib{$i}";
- }
- print "</td></tr>n";
- }
- print "</table>n";
- }
- # given a user, get all the groups he belongs to.
- sub getgroupsforuser {
- my (@ret, $cursor, $row);
- my ($dbh, $remuser) = @_;
- ( $cursor = $dbh->prepare( "SELECT * FROM usergroups where (user = '$remuser')"))
- or die "nnot ok: $DBI::errstrn";
- ( $cursor->execute )
- or print( "tnot ok: $DBI::errstrn" );
- while ( $row = $cursor->fetchrow_hashref ) {
- push(@ret, $row->{'groupname'});
- }
- @ret;
- }
- # given a host, get all the groups it belongs to.
- sub gethostsforgroup {
- my (@ret, $cursor, $row);
- my ($dbh, $group) = @_;
- ( $cursor = $dbh->prepare( "SELECT * FROM hostgroups where (groupname = '$group')"))
- or die "nnot ok: $DBI::errstrn";
- ( $cursor->execute )
- or print( "tnot ok: $DBI::errstrn" );
- while ( $row = $cursor->fetchrow_hashref ) {
- push(@ret, $row->{'host'});
- }
- @ret;
- }
- # display the host add entry box
- sub addhostentryform {
- my $group = shift;
- print "<form method="get" action="" . self_url() . "">n";
- print "Add a new host to the group "$group": <input type="text" name="newhost"><br>";
- print "<input type="hidden" name="group" value="$group">";
- print "<input type=submit value="Add Hosts">n";
- print "</form>";
- }
- #is an expert user?
- sub isexpert {
- return 0;
- }
- #is remuser a admin?
- sub isadmin {
- my ($dbh, $remuser, $group) = @_;
- return 0 if (!defined($remuser) || !defined($group));
- return 1 if ($dbh->do("select * from usergroups where user = '$remuser' and groupname = '$group' and isadmin = 'Y'") ne "0E0");
- return 0;
- }
- #is user a member of this group?
- sub isuser {
- my ($dbh, $remuser, $group) = @_;
- return 0 if (!defined($remuser) || !defined($group));
- return 1 if ($dbh->do("select * from usergroups where user = '$remuser' and groupname = '$group'") ne "0E0");
- return 0;
- }
- # displayconfigarray(HOSTS, NAMES, CONFIG):
- #
- # displays an array of generic check buttons to turn on/off certain
- # variables.
- sub displayconfigarray {
- my $dbh = shift;
- my $hosts = shift;
- my $names = shift;
- my %config = @_;
- my $cmd;
- if ($config{'-check'}) {
- ( $cmd = $dbh->prepare( $config{'-check'} ) )
- or die "nnot ok: $DBI::errstrn";
- }
- print "<table $NetSNMP::manager::tableparms>n";
- print "<tr><td></td>";
- my ($i, $j);
- foreach $j (@$names) {
- my $nj = $j;
- $nj = $j->[0] if ($config{'-arrayrefs'} || $config{'-arrayref2'});
- print "<td>$nj</td>";
- }
- foreach my $i (@$hosts) {
- my $ni = $i;
- $ni = $i->[0] if ($config{'-arrayrefs'} || $config{'-arrayref1'});
- print "<tr><td>$ni</td>";
- foreach $j (@$names) {
- my $nj = $j;
- $nj = $j->[0] if ($config{'-arrayrefs'} || $config{'-arrayref2'});
- my $checked = "checked" if (defined($cmd) && $cmd->execute($ni,$nj) ne "0E0");
- print "<td><input type=checkbox $checked value=y name=" . $config{prefix} . $ni . $nj . "></td>n";
- }
- print "</tr>n";
- }
- print "</tr>";
- print "</table>";
- }
- sub adddefaulttables {
- my ($dbh, $names) = @_;
- my $row;
- # add in known expression tables.
- my $handle = getcursor($dbh, "SELECT * FROM errorexpressions");
- expr:
- while($row = $handle->fetchrow_hashref) {
- foreach $i (@$names) {
- if ($i->[0] eq $row->{tablename}) {
- next expr;
- }
- }
- push @$names, [$row->{tablename}];
- }
- }
- #
- # display the setup information page for a given group.
- #
- sub setupgroup {
- my $dbh = shift;
- my $group = shift;
-
- my ($hosts, $names) = gethostandgroups($dbh, $group);
- adddefaulttables($dbh, $names);
- print "<form method="post" action="" . self_url() . "">n";
- print "<input type=hidden text="setupgroupsubmit" value="y">";
- displayconfigarray($dbh, $hosts, $names,
- -arrayrefs, 1,
- -check, "select * from hosttables where (host = ? and tablename = ? and groupname = '$group')");
- print "<input type=hidden name=group value="$group">n";
- print "<input type=submit value=submit name="setupgroupsubmit">n";
- print "</form>";
- }
- # a wrapper around fetching arrays of everything in a table.
- sub getarrays {
- my $dbh = shift;
- my $table = shift;
- my %config = @_;
- my $selectwhat = $config{'-select'} || "*";
- my $handle;
-
- $handle = getcursor($dbh, "SELECT $selectwhat FROM $table $config{-clauses}");
- return $handle->fetchall_arrayref;
- }
- #
- # get a list of all tablenames and hostnames for a given group.
- #
- sub gethostandgroups {
- my $dbh = shift;
- my $group = shift;
- my ($tbnms);
- my $names = getarrays($dbh, 'hosttables',
- "-select", 'distinct tablename',
- "-clauses", "where groupname = '$group'");
- my $hosts = getarrays($dbh, 'hostgroups',
- "-select", 'distinct host',
- "-clauses", "where groupname = '$group'");
-
- return ($hosts, $names);
- }
- sub setupgroupsubmit {
- my $dbh = shift;
- my $group = shift;
-
- my ($hosts, $names) = gethostandgroups($dbh, $group);
- adddefaulttables($dbh, $names);
- foreach my $i (@$hosts) {
- $dbh->do("delete from hosttables where host = '${$i}[0]' and groupname = '$group'");
- }
- my $rep = $dbh->prepare("insert into hosttables(host,tablename,groupname) values(?,?,'$group')");
- foreach my $i (@$hosts) {
- foreach my $j (@$names) {
- if (param("${$i}[0]" . "${$j}[0]")) {
- print "test: ","${$i}[0] : ${$j}[0]<br>n";
- $rep->execute("${$i}[0]", "${$j}[0]") || print "$! $DBI::errstr<br>n";
- }
- }
- }
-
- }
- #
- # save user pref data submitted by the user
- #
- sub setupusersubmit {
- my ($dbh, $remuser, $group) = @_;
- my $tables = getarrays($dbh, 'hosttables',
- "-select", 'distinct tablename',
- "-clauses", "where groupname = '$group'");
-
- $dbh->do("delete from userprefs where user = '$remuser' and groupname = '$group'");
- my $rep = $dbh->prepare("insert into userprefs(user, groupname, tablename, columnname, displayit) values('$remuser', '$group', ?, ?, 'N')");
- my ($i, $j);
- foreach my $i (@$tables) {
- my $sth = $dbh->prepare("select * from ${$i}[0] where 1 = 0");
- $sth->execute();
- foreach $j (@{$sth->{NAME}}) {
- if (param("${$i}[0]" . "$j")) {
- $rep->execute("${$i}[0]", "$j");
- }
- }
- }
- }
- sub Exit {
- my ($dbh, $group) = @_;
- my $tq = self_url();
- $tq =~ s/?.*//;
- print "<hr>n";
- print "<a href="$tq">[TOP]</a>n";
- print "<a href="$tq?userprefs=1&group=$group">[display options]</a>n";
- print "<a href="$tq?setuponcall=1">[setup oncall schedule]</a>n";
- if (defined($group)) {
- print "<a href="$tq?group=$group">[group: $group]</a>n";
- print "<a href="$tq?group=$group&summarizegroup=1">[summarize errors]</a>n";
- }
- $dbh->disconnect() if (defined($dbh));
- return OK();
- # exit shift;
- }
- #
- # setup user preferences by displaying a configuration array of
- # checkbuttons for each table.
- #
- sub setupuserpreferences {
- my ($dbh, $remuser, $group) = @_;
- my $tables = getarrays($dbh, 'hosttables',
- "-select", 'distinct tablename',
- "-clauses", "where groupname = '$group'");
- print "<h3>Select the columns from the tables that you want to <b>hide</b> below and click on submit:</h3>n";
- print "<form method="post" action="" . self_url() . "">n";
- my ($i, $j);
- foreach my $i (@$tables) {
- my $sth = $dbh->prepare("select * from ${$i}[0] where 1 = 0");
- $sth->execute();
- displayconfigarray($dbh, [${$i}[0]], $sth->{NAME},
- -check, "select * from userprefs where (tablename = ? and columnname = ? and user = '$remuser' and groupname = '$group' and displayit = 'N')");
- print "<br>n";
- }
- print "<input type=hidden name=group value="$group">n";
- print "<input type=submit value=submit name="setupuserprefssubmit">n";
- print "</form>";
- }