#native_company# #native_desc#
#native_cta#

RRD Monitor Page

By Jason Chambers
on March 7, 2003

Version: v1

Type: Full Script

Category: Other

License: GNU General Public License

Description: Already use MRTG’s? Store data with RRD?
Try these php pages to set threshold monitoring on usage statistics.

Three files, index.php, devmon.php, and new_mon_list.php

devmon.php -> 

<?php 

/* 
* Program Name: Device List Creater 
* Date: March 6, 2003 
* Modified: March 6, 2003 
* Author: Jason Chambers 
* File Name: devmon.php 
* email: [email protected] 
* 
* Description: This page will create the list of devices to monitor by 
* going through the directories where the rrd files are 
* stored. 
* 
*/ 

/* Set path to base directory (where subdirectories contain the rrd files) */ 
$rrd_dir = "/var/www/html/mon/"; 

/* Look inside $rrd_dir for the subdirectories */ 
if (is_dir($rrd_dir)){ 
    $fd = @opendir($rrd_dir); 
    if($fd) { 
    while (($part = @readdir($fd)) == true) { 
        if ($part != "." && $part != "..") { 
        if (is_dir($part)){ 
            $my_dir[] = $part; 
        } 
        } 
    } 
    } 
} 

sort($my_dir);   /* Sort the array of subdirectories */ 
reset($my_dir);  /* Reset the pointer to the beginning of the array */ 

$content  = "";   /* Initialize $content */ 
$content .= "<html>n<head>n<title>Monitor device list</title>n</head>nn<body>nn"; 
$content .= "<form name="mylist" action="new_mon_list.php" method="POST">n"; 

for($i=0;$i<count($my_dir);$i++){           
    $node_dir = $rrd_dir . $my_dir[$i]; 
    $content .= "<h5> in directory $my_dir[$i] </h5>n"; 
    $content .= "<table>n";     
    if ($handle = opendir("$node_dir")) { 
    while (false !== ($file = readdir($handle))) {                         
        if ($file != "." && $file != "..") {     
        $content .= "t<tr>ntt<td><input type="checkbox" name="mon_me[]" value="$file"><font size="-1" color="cornflowerblue">$file</font></td>nt</tr>n"; 
        } 
    } 
    }     
    $content .= "</table>n";     
} 

$content .= "<table>n"; 
$content .= "<tr><td><input type="SUBMIT"></td></tr>n"; 
$content .= "</table>n"; 
$content .= "</form>n"; 
$content .= "</body>n"; 
$content .= "</html>nn"; 

print "$content"; 


?> 

!----------------------- 
new_mon_list.php -> 

<?php 

/* 
* This file takes the posted data from devmon.php 
* and writes to monlist.txt 
* 
* Your webserver needs to have write access 
* to this directory 
* 
*/ 


$to_file = ""; 

foreach($_POST as $key => $nested) 
{ 
       
    for($i=0;$i<count($nested);$i++) 
    {     
    $to_file .= "$nested[$i]n"; 
    } 
} 

$myFile = fopen("monlist.txt","w"); 
fputs($myFile,"$to_file"); 
fclose($myFile); 

header("Refresh: 5; URL=../index.php"); 
print "<h4><i>The file "monlist.txt" has been created in this directory.</i></h4>"; 

?> 

!---------------------------------- 
index.php -> 

<? 

/* 
* Program Name: RRD monitor script 
* Date: March 3, 2003 
* Modified: March 5, 2003 
* Author: Jason Chambers 
* File name: index.php 
* email:[email protected] 
* 
*/ 

header("Refresh: 600");                                /* Tell the browser to refresh every 10 minutes        */ 

$send_alert = '';                                      /* Send alerts when threshold is surpassed 'on'/'off'  */ 
$notify_who = '';                                      /* Set the email address of the person to notify       */ 
$mail_msg = 'Hello,  ';                                /* Initialize $mail_msg                                */ 
              
/* poll list file */ 
$poll_list = '/home/rrdtool/poll/list'; 
     
/* path to rrdtool */ 
$path_rrdtool = '/usr/local/bin/'; 

/* path to base directory (directory that contains the subdirectories/working directories) for your rrd files */ 
$path_rrdbase_dir = '/var/www/html/mon/'; 

$time_now = time();                            /* Epoch Timestamp for "now"                           */ 
$time_back = $time_now - 600;                       /* Timestamp for 10 minutes back from "now"            */ 

$th_high = 4;                                          /* if interface traffic increase by this amount */ 
$th_low = 3;                                           /* if interface traffic decreases by this amount */ 
$num_trouble = 0;                                      /* initialize num_trouble variable to 0 (no troubles)  */ 

echo "<h3>" . date("l, F dS, Y h:i A") . "</h3>"; 
     
print "<table border=1 align="center">n"; 
print "t<tr>n"; 
print "tt<th>device</th>n"; 
print "tt<th>interface</th>n"; 
print "tt<th>ALERT? IN</th>n"; 
print "tt<th>ALERT? OUT</th>n"; 

$handle = fopen($poll_list,"r"); 
while (!feof($handle)) { 
    $from_file = fgets($handle,256); 
    $from_file = chop($from_file); 
    if (!$from_file == ""){ 
         

        $node = preg_split('/_/',$from_file);              /* $node[] is an array on the split line, '_' from the poll file */         
        $path_rrdfiles = $path_rrdbase_dir . "$node[0]";   /* path to rrd files */ 
             
    /* rrdtool fetch for now and 15 minutes ago */ 
        $run_now =  $path_rrdtool . "rrdtool fetch $path_rrdfiles/$from_file AVERAGE -r 900 -s $time_now -e $time_now"; 
     
        $my_data_now = shell_exec($run_now);              /* Array with the results of the rrdtool fetch command */ 
        $data0_array = preg_split('/n/',$my_data_now);   /* Split the array on new line char                    */ 
        $now_data = preg_split('/ /',$data0_array[2]);;   /* Split the new array on spaces                       */ 
     
        /* Get old data */ 
        $run_old =  $path_rrdtool . "rrdtool fetch $path_rrdfiles/$from_file AVERAGE -r 900 -s $time_back -e $time_back"; 
               
    $my_data_old = shell_exec($run_old);              /* Array with the results of the rrdtool fetch command */ 
        $data1_array = preg_split('/n/',$my_data_old);   /* Split the array on new line char                    */ 
        $old_data = preg_split('/ /',$data1_array[2]);    /* split the new array on spaces                       */ 

    /* Setup traffic in/out info */ 
    $now_traf_in  = $now_data[1] * 1; 
    $now_traf_out = $now_data[2] * 1; 
    $now_traf_in  = number_format($now_traf_in,2,'.', ''); 
    $now_traf_out = number_format($now_traf_out,2,'.', ''); 
      
    $old_traf_in  = $old_data[1] * 1; 
    $old_traf_out = $old_data[2] * 1; 
    $old_traf_in  = number_format($old_traf_in,2,'.', ''); 
    $old_traf_out = number_format($old_traf_out,2,'.', ''); 
     
    /* Setup up alert levels */ 
    $alert_up_in = $old_traf_in * $th_high;           /* if in traffic has doubled in the last 15 minutes  */ 
    $alert_down_in = $old_traf_in / $th_low;          /* if in traffic has decreased by half               */ 
    $alert_up_out = $old_traf_out * $th_high;         /* if out traffic has doubled in the last 15 minutes */ 
    $alert_down_out = $old_traf_out / $th_low;        /* if out traffic has decreased by half              */ 
     
    /* Check for an alert */ 
     
    if ($now_traf_in>$alert_up_in||$now_traf_in<$alert_down_in||$now_traf_in==0) 
    { 
        $in_bg_color = "red"; 
        $in_trouble = "yes"; 
        $num_trouble = $num_trouble + 1; 
        $mail_msg .= "alert detected on $node[0] port $node[1] going IN. Please check traffic on $node[0] for issues.n"; 
    } 
    else 
    { 
        $in_bg_color = "green"; 
        $in_trouble = "no"; 
    } 
     
    if ($now_traf_out>$alert_up_out||$now_traf_out<$alert_down_out||$now_traf_out==0) 
    { 
        $out_bg_color = "red"; 
        $out_trouble = "yes"; 
        $num_trouble = $num_trouble + 1; 
        $mail_msg .= "alert detected on $node[0] port $node[1] going OUT. Please check traffic on $node[0] for issues.n"; 
    } 
    else 
    { 
        $out_bg_color = "green"; 
        $out_trouble = "no"; 
    } 
     
    if ($in_trouble == "yes" || $out_trouble == "yes") { 
        print "t<tr>n"; 
        print "tt<td>$node[0]</td>n"; 
        print "tt<td>$node[1]</td>n";         
        print "tt<td bgcolor="$in_bg_color" align="center"><font color="white"><strong>:: IN ::</strong></font></td>n"; 
        print "tt<td bgcolor="$out_bg_color" align="center"><font color="white"><strong>:: OUT ::</strong></font></td>n"; 
        print "t</tr>n"; 
    } 
         
    } 
     
}     

fclose($handle); 

/* No trouble? Cool, display no trouble message. */ 
if ($num_trouble == 0){ 
                     
    print "t<tr>n"; 
    print "tt<td colspan=4 align="center"> <i>no current trouble</i></td>n"; 
    print "t</tr>n"; 
     
} 

/* Should we send the alert by email? */ 
if ($num_trouble > 0 && $send_alert == "on") { 
            mail("$notify_who","Alert detected while comparing interface usage.","$mail_msgn Thanks."); 
} 

   
print "</table>n"; 

/* Credits */ 
print "<table align="center">nt<tr>ntt<td><font size="-2"><i>Created by <a href="mailto:[email protected]">Jason Chambers</a></i></font></td>nt</tr>n</table>nn"; 

?>