📄 manager.pm
字号:
#!/usr/local/bin/perlpackage 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::errstr\n";#===========================================================================# 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: $ret\n"; 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, $#columns\n"; return Exit($dbh, "$group"); } $clause .= " and host = '$host'"; }# print STDERR "graphing clause: $clause\n"; # 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 graphed\n"; 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -