一种实用的校园网监控系统设计思想及实现

2009-05-07 05:48钱爱增
中国教育信息化·高教职教 2009年4期
关键词:脚本

摘要:文章提出了一种实用的校园网监控系统设计思想,该思想利用PHP、脚本编程和curl命令实现对校园网各种设备的监控,依据该思想设计开发了一套校园网监控系统,运行结果表明该系统能够起到监控校园网运行的作用。

关键词:cron curl 脚本 校园网监控系统

中图分类号:TP391 文献标识码:A 文章编号:1673-8454(2009)07-0027-03

目前校园网规模越来越大,核心设备、各种服务器越来越多,校园网建设已逐步从规模建设阶段转入内涵建设阶段,即数字化校园建设阶段,而数字化校园建设阶段的首要前提是保障校园网的正常、高效运行,而保障校园网正常、高效运行的基础是能够随时随地了解和监控校园网核心设备、各种服务器的运行状态。[1]

一、校园网监控系统设计思路

校园网中主要设备一般分为两大类,一类设备是用户只能用其提供的命令对其进行操作,不能在其操作系统上用脚本或语言编程控制,在此笔者称其为“不可编程设备”,如各种可网管交换机、防火墙和路由器等;另一类设备用户可以用脚本或语言对其编程控制,笔者称其为“可编程设备”,如各种服务器。校园网监控系统设计原理如图1所示,监控服务器通过监控程序定时登录到各种“不可编程设备”上,调用设备本身提供的命令,取得设备的各种运行状态变量,并将结果存储到监控服务器的数据库中。对于“可编程设备”,则由其自身周期性的运行脚本取得自身的各个状态参数,然后通过调用监控服务器上的监控程序将结果存储到监控服务器的数据库中,然后由设备状态显示程序将各设备的状态参量以某种方式显示出来,供校园网管理人员即时地了解校园网各设备的运行状态,进而达到监控整个校园网主要设备,保证校园网正常运行的目的。

图1校园网监控系统原理图

二、校园网监控系统组成

如图2所示,校园网监控系统共包括三个模块,其作用分别如下:

图2校园网监控系统组成

(1)“不可编程设备”采集模块的主要作用是采集校园网中各个“不可编程设备”状态数据,如CPU利用率、设备反应时间、特定端口利用率等。该模块又含三个子模块,分别是定时模块、数据采集模块和存储模块,定时模块(运行于监控服务器上)周期性地调用数据采集模块采集数据,然后由存储模块将数据存储到监控服务器的数据库中。

(2)“可编程设备”数据采集模块的主要作用是采集校园网中各个“可编程设备”的状态数据,如磁盘分区空间利用率、Swap交换空间使用率、系统负载情况等。该模块也分定时模块、数据采集模块和存储模块,“可编程设备”执行脚本程序取得系统自身相关状态参数后,由定时模块(运行于“可编程设备”上)周期性地调用数据采集模块采集数据,然后由存储模块将数据存储到监控服务器的数据库中。

(3)设备状态数据显示模块的主要作用是周期性地将数据库中的数据通过IE浏览器显示出来,供校园网管理人员即时了解和掌握校园网各主要设备的运行状态。

三、校园网监控系统实现

1.系统运行环境

监控系统服务器采用Pentium 4以上处理器即可,具有光驱、100M网卡,以备安装系统和接入校园网。本系统运行平台为RedHat Linux9.0,也可为AS系列,要求系统整合安装MySQL、Apache、PHP和Zend环境,安装Cron定时功能。

2.数据库结构

本系统需要建立数据表device_wrong,用于存储设备的状态数据,表的数据字典如表1所示。

3.具体实现

(1)“不可编程设备”数据采集模块

由系统组成可知,该模块由定时模块、数据采集模块和存储模块3个子模块组成。其中,定时模块运行于监控服务器上,由cron定时功能周期性地调用数据采集模块和存储模块,定时模块实现如下:[2]

10,20,30,40,50 * * * * /usr/bin/curl "http://监控服务器ip/path/non_program.php"

其中,curl是一个利用URL语法在命令行方式下工作的文件传输工具,功能是在命令提示符下执行双引号内的程序。[3]

数据采集模块、存储模块由non_program.php实现,其中,实现监控服务器登录到“不可编程设备”的协议程序核心代码如下:[1]

<?class telnet {

var $sock=NULL;

function telnet($host,$port)

{ $this->sock = fsockopen($host,$port,$errno, $errstr, 10);

if( !$this->sock ) exit("无法连接远程主机:".$host.",请稍后再试!");

socket_set_timeout($this->sock,2,0);

}

function close()

{ if ($this->sock) fclose($this->sock); $this->sock = NULL;

}

function write($buffer)

{fwrite($this->sock,$buffer); }

function getc()

{return fgetc($this->sock); }

function input_rate()

{ $buf = ′′; $what="bits/sec";

while (1)

{$IAC = chr(255); $theNULL = chr(0);

$c = $this->getc();if ($c === false) return $buf;

if ($c == $theNULL) continue; $buf .= $c;

if ($what == (substr($buf,strlen($buf)-strlen($what))))

return substr(strstr($buf,"input rate"),10);

else continue;

}}}?>

(2)“可编程设备”数据采集模块

由系统组成可知,该模块也含定时、数据采集和存储三个子模块,其中定时模块由各服务器上的定时功能实现,同时需要编写脚本代码,以便将服务器的各个状态变量传递给监控服务器上的监控程序,本文中主要监控各服务器的磁盘分区空间利用率、swap交换空间使用率、系统负载情况三项指标,脚本实现如下:

1)磁盘分区空间利用率脚本,名称为disk

#!/bin/sh

LANG=zh_cn

var=$(/bin/df -kP | grep / | awk -F ′′′ {print $6":"$5}′ | awk -F ′%′ ′ {print $1}′ | tr -s ′ ′ ′;′)

date=$(date -d "today" +"%Y-%m-%d_%H:%M:%S")

ip=$(/sbin/ifconfig | grep "inet addr" | grep -v "127.0.0.1" | awk ′{print $2;}′ | awk -F′:′ ′{print $2;}′ | tr -s ′ ′ ′;′)

/usr/bin/curl -d menu=disk -d date=$date -d ip=$ip -d data=$var "http://监控服务器/path/program.php"

2)swap交换空间使用率和系统负载脚本名称分别为swap和load,它们和磁盘分区空间利用率脚本只是var和menu变量不同,其余均相同,分别如下:

swap脚本:var=$(/usr/bin/free -m | grep Swap | awk ′{print $2":"$3":"$4}′);menu=swap

load脚本:var=$(/usr/bin/uptime | awk -F′load average: ′ ′{print $2}′ | awk ′{print $1$2$3}′);menu=load

3)定时脚本,名称为server

10,20,30,40,50 * * * * /usr/bin/disk

15,30,45 * * * * /usr/bin/swap

16,31,46 * * * * /usr/bin/load

4)数据采集模块和存储模块实现核心代码如下:[4]

<? $disk_max = "90";//磁盘分区使用百分比超过此值,则报警。默认为90%

$swap_max = "50";//Swap交换空间使用百分比超过此值,则报警。默认为50%

if (htmlspecialchars($_POST["menu"]) == "disk")

{$date = htmlspecialchars($_POST["date"]);

$ip = htmlspecialchars($_POST["ip"]);

$data = htmlspecialchars($_POST["data"]);

$arr1 = explode(";", $data);

foreach ($arr1 as $key1 => $value1)

{$arr2 = explode(":", $value1);

if ($arr2[0] != "" && $arr2[1] != "" && $arr2[1] >= $disk_max)

{$subject = "磁盘分区空间不足" . $ip;

$message = $message . "报警服务器:" . $ip . " ";

$message = $message . "报警时间:" . $date . " ";

$message = $message . "报警内容: ";

$message = $message . "磁盘分区 " . $arr2[0] . " 空间不足(空间使用率达到" . $arr2[1] . "%) ";

}}

require("./save.php");//将数据内容存储到数据库中}

if (htmlspecialchars($_POST["menu"]) == "swap")

{$date = htmlspecialchars($_POST["date"]);

$ip = htmlspecialchars($_POST["ip"]);

list($total, $used, $free) = split(":", htmlspecialchars($_POST["data"]));

$percentage = round($used / $total * 100, 0);

if ($percentage >= $swap_max)

{$subject = "Swap交换空间使用率高达" . $percentage . "%_" . $ip;

$message = $message . "报警服务器:" . $ip . " ";

$message = $message . "报警时间:" . $date . " ";

$message = $message . "报警内容: ";

$message = $message . "Swap交换空间使用率高达" . $percentage . "%。 ";}

require("./save.php");//将数据内容存储到数据库中}

if (htmlspecialchars($_POST["menu"]) == "load")

{$date = htmlspecialchars($_POST["date"]);

$ip = htmlspecialchars($_POST["ip"]);

list($load_last_1min, $load_last_5min, $load_last_15min) = split(",", htmlspecialchars($_POST["data"]));

$subject = "系统负载过高" . $ip;

$message = $message . "报警服务器:" . $ip . " ";

$message = $message . "报警时间:" . $date . " ";

$message = $message . "报警内容: ";

$message = $message . "最近 1分钟系统负载:" . $load_last_1min . " ";

$message = $message . "最近 5分钟系统负载:" . $load_last_5min . " ";

$message = $message . "最近15分钟系统负载:" . $load_last_15min . " ";}

require("./save.php");//将数据内容存储到数据库中}?>

(3)设备状态数据显示模块

该模块的主要作用是将存储在数据库中的设备状态数据显示出来,本系统中采用了图形化的显示方法,直观明了,程序执行时界面如图3所示,当设备运行正常时,图片显示正常,否则显示一个红色“╳”号的图片,当鼠标移动到图片上时动态显示出设备的故障情况。

<img src="http://img1.qikan.com.cn/qkimages/educ/educ200904/educ20090410-4-l.jpg" hspace="15" vspace="5" align="">

图3校园网监控系统运行界面

四、结束语

本监控系统自去年运行以来,对校园网的正常运行起到了较好的监控作用,真正扭转了校园网管理的被动局面,对各种校园网故障起到了很好的预防作用。

参考文献:

[1]钱爱增.基于Web的简易实用校园网管理系统的设计思路及实现[J].重庆工学院学报(自然科学版),2007,21(11),155-159.

[2]cron的使用.http://www.hackhome.com/InfoView/Article_ 79273.html,2007-6-2.

[3]CURL命令行下载工具.http://blog.csdn.net/dbigbear/archive/2006/11/21/1402580.aspx,2006-11-21.

[4]张宴.linux服务器监控系统ServMon V1.1.http://blog.s135.com/read.php/291.htm,2007-08-31.

猜你喜欢
脚本
酒驾
此去人海茫茫,各自风雨灿烂
数据库系统shell脚本应用
快乐假期
神奇的数学
愚人节大作战
小编的新年愿望
友谊的小船说翻就翻