网络管理是网络应用的重要技术之一。目前,Linux下的网络管理工具主要有Mon系统管理工具、PIKT故障检测工具、Scotty网络管理工具、MRTG、cmu-snmp SNMP工具等。其中,Scotty是由布伦瑞克工学院(Technical University of Braunschweig)网络管理小组(NMG)开发的一套网络管理软件开发包。该开发包是用C语言编写的Tcl/Tk脚本语言扩展库。由于其功能强大,所以常常被用于快速建立网络管理应用。在Unix/Linux下,Scotty已称为标准网络管理程序和开发包之一,许多操作系统已将其直接集成。
Scotty使用Tcl/Tk脚本语言。Tcl是一种通用性很强的脚本语言,它最初由John K.Ousterhout在Unix下实现,后来又逐渐向其中增加了图形工具包Tk。现在Tcl/Tk已可以在很多平台下运行,所以,用Tcl编写的程序可以非常简单的从一个平台移植到另一个平台。Tcl/Tk主要包含两部分:语言本身和库。Tcl也是一个库包,它可以被嵌入应用程序,而Tcl本身也是可以扩充的,比如Scotty中的Tnm就是一个Tcl的扩展库,除此之外,还有著名的Expect等Tcl扩展。用Scotty开发的同时,也可搭配这些库,使得开发代码复用度更高,系统稳定性也更好。Tcl现在已成为一种业界常用的脚本配置语言,包括Motorola、、Sun、Cisco等著名公司都根据它们的需要使用Tcl。比如, Cisco路由器就采用了Tcl来配置,更为特别的是,在其中,Cisco还应用了Scotty作为辅助。可见,采用Tcl和Scotty开发网络管理应用是符合业界标准的。Scotty主页上列举了一些用Scotty编写的工具,在著名的开源网站SourceForge上也有用Scotty开发的SNMP应用Thresh,其源代码仅有几百行。
Scotty的2.x版本除Windows版外都为稳定版本,而当前的3.0alpha版本还在开发测试中。3.0主要提供了对SNMPv3的支持,另外还提供了几个网络高级应用的包。Scotty总体来说包含两部分:其一是Tnm Tcl扩展。该扩展提供对网络管理信息资源的访问。其二是Tkined网络编辑器。该编辑器为可扩展的网络管理系统提供了一套框架。
使用Scotty开发网络应用的优点是开发速度较快、可以跨平台执行、修改完代码无需重新编译即可运行,并且其源代码也是开放的。作为专门为网络管理所设计的开发包,我们在Scotty中可以灵活地通过各种协议方便地操纵各种网络对象。Scotty的Tnm扩展库目前已支持很多协议,具体如下(括号内为对该项协议的具体支持细节):
1.SNMP (SNMPv1,SNMPv 2c ,SNMPv2u,并且可以访问MIB)
2.ICMP (回显(echo),mask,时间戳(timestamp),udp/icmp路由请求)
3.DNS (a,ptr,hinfo,mx,soa record lookups)
4.HTTP (服务器端和客户端)
5.SUN RPC (portmapper,mount,rstat,etherstat,pcnfs服务)
6.NTP (版本3模式6请求)
7.UDP (发送和接收UDP数据报-目前还未实现通道)
此外,它还增加了命令以简化网络管理程序的实现:
1.Netdb命令允许对本例网络数据库的访问(主机名和IP地址,服务名和服务号,网络名,协议名,Sun RPC服务名)
2.Syslog命令允许向本地系统日志设备发送信息
3.Job命令简化了需要以特定间隔时间调度的检测和控制过程的实现。
除了Tnm之外,Scotty还提供了一个交互的网络编辑器tkined。其主要功能是为网络程序提供一个交互界面。这个管理器是可编程的,可以通过Tnm编写的程序可以对该编辑器的所有细节进行控制,因为开发包提供了相应的Tcl API。这样,我们既可以通过Tnm直接编写应用,并由我们自己提供交互界面,也可以通过Tnm与tkined的集成框架来开发。这也体现了Scotty强大的灵活性。
许多用高级语言要几十行代码的程序在Scotty中只需一两行就可以实现。比如要将一个网络地址转换成主机名只需执行netdb hosts name address命令即可。而这在C中则需要一长串的代码。所以,许多Scotty应用尽管看上去比较简短,但实际上已实现了一些比较复杂的功能。
同样,使用Scotty也有一些不足之处。首先是脚本语言共有的缺陷,对复杂数据结构和算法的处理差,其数值处理能力也很差,这一点在前面脚本语言和系统高级语言对比时进行过介绍,因此不适合于开发大型复杂的应用。其次,由于Scotty本身是为了简化开发而设计的,所以Tnm把底层的细节都隐藏了。如果开发的应用需要设计很多底层操作,则一般不适合用Scotty。
下面的一个简单程序摘自Scotty3.0的示例代码,注释部分已略去,从中可以看出Scotty的大概用法。
package require Tnm 3.0
namespace import Tnm::mib Tnm::snmp Tnm::icmp Tnm::netdb
proc traphandler {ip pdu args} {
set msg "$pdu from $ip:"
foreach vb $args {
append msg " [Tnm::mib name [lindex $vb 0]]=/"[lindex $vb 2]/""
}
puts stdout $msg
Tnm::syslog warning $msg
}
proc try cmd {
if {[catch $cmd msg]} { puts stderr "$cmd failed: $msg" }
}
try { Tnm::snmp listener -version SNMPv1 }
try { Tnm::snmp listener -version SNMPv 2c }
try { Tnm::snmp listener -version SNMPv3 }
foreach s [Tnm::snmp find] {
$s bind trap "traphandler %A %T %V"
}
vwait forever
上面程序的主要功能是将traphandler过程挂钩为指定SNMP陷阱处理过程,这样将在接收到SNMP 陷阱数据报时自动调用该过程。可以看出,Tcl的语法与C非常相近,这大大提高了开发速度。
从以上分析可以看出,Scotty是一套比较成熟的网络管理应用开发包,它主要用于快速开发一些比较小型的应用。在进行自己的开发时,可以根据实际的需要进行选择。