python-netsnmp扩展(2)管理端简单功能开发

来源:互联网 发布:博客源码 编辑:程序博客网 时间:2024/06/05 18:16

 

         上篇文章讲到配置完成并能够实现get,类似的可以实现set,后来研究了一段时间简单的trap功能也基本完成.

        

         先解决一个上篇未完美解决的问题:

               

             2、libnetsnmp.so.30找不到,ln -s /usr/local/lib/libnetsnmp.so.30 /usr/lib创建一个连接一般可以解决,

                但我并不能于是export LD_LIBRARY_PATH=/usr/local/lib每次terminal都要输入一次但确实可行,更好的办法正在寻找中。。

         后来将ln -s /usr/local/lib/libnetsnmp.so.30 /usr/lib 改为ln -s /usr/local/lib/libnetsnmp.so.30 /usr/lib64 后执行,创建链接到lib64中就可以了..笋尖感觉自己SB了.

 

 

        好了回到管理端的开发,新建一个文件开始写入我们的python程序

        先定义一个类,作为要管理的对象

        class XXX(object):
            def __init__(self, destHost):
                self.destHost = destHost
                self.snmpSession =netsnmp.Session('参数自己设置')

        并设置一个类的方法get

           def SnmpGet(self,oid_desc):
               oid = netsnmp.Varbind(oid_desc,'0')       #将地址等信息bind,这里图简单我省去了value什么的东西
               oidList = netsnmp.VarList(oid)                 #  将bind后的信息放入list,这里我只放入了一组信息oid
               resultList = self.snmpSession.get(oidList)   #get  返回一个resultlist,因为我的oidList里只有一个,所以resultList里也只有一组数据
               return resultList

        set的方法与get类似,只是在bind的时候要多一个value参数(加载mib文件后可以省略valueType)

 

       上面两个功能相对简单,trap稍微麻烦一点.

                         界面比较简陋,主要是作为测试使用.

 

                     因为python netsnmp模块没有对snmptrapd的扩展(README中没有介绍,网上也没有找到,我就默认为没有了),所以我实际上还是在命令行中实现trapd这个功能.

                     思路是点击'open'按钮,就打开snmptrapd服务,此时处于监听状态,可以捕获代理端发来的snmptrap信息,然后提示管理者,并将信息写入checkfile。

                     点击'close' 则 stop snmptrapd,并退出程序。

                    

                      为trapd功能 建立一个进程

                           t=Process(target=trapd,)

                      点击open触发事件

                          def openTrapd():
                               t.start()
                               var5.set('OpenNow !')

                       trapd函数如下           

                         def trapd():
                             global path
                             trapd_it_adr=path+'/trapd_it'
                             os.system(trapd_it_adr)

                       其中trapd_it是一个shell脚本,相当于在命令行执行snmptrapd,要使用sudo。

 

                      可能遇到的问题:sudo找不到命令snmptrap(d),原因是snmptrap(d)不在sudoers这个文件配置的路径下面,具体可以上网查一下。网上比较多的建议是修     

                改sudoers文件,我建议将给snmptrap(d)命令创建一个链接 sudo ln -s \usr\local\bin\snmptrap(d) \bin 前面一个位置是你的snmptrap(d)所放的位置,后面一个是     

                sudoers的默认搜索路径,不只\bin这一个,具体可以打开sudoers看一下,不过需要权限,而我在改变sudoers的权限后,这个文件就失效了。。。

                       其中path是shell文件以及后面要用到的奇奇怪怪的文件的存放路径。

                      

                      点击close触发事件

                     def closeTrapd():
                             trapd_cls()
                             var5.set('ClosedNow !')
                             root.quit()

 

                    

                     def trapd_cls():
    
                          global path
     
                          f=open(path+'/snmpd_pid','r')
                          pid=f.read()
                          os.system('sudo kill 2 %i'%long(pid))
                          f.close()
                          t.terminate()

                关闭snmptrapd的方法有点蠢,但确实也没找到更好的办法,snmpd_pid是存放snmptrapd服务pid的文件,在shell里的命令中加入-p可以获得pid.在snmptrapd.conf中我配置的触发程序是log_it(shell),他的作用是将信息写入checkfile,并执行alarm_it(python)作用是提醒管理者。

 

                代码写得很乱,对于实现的这个小功能来讲文件也显得有些多,不过能运行就好。

                

                sudo snmptrap -v 2c -c public localhost:162 "" XXX-MIB::XXXwarning,成功收到 提示,并记录到checkfile

 

                管理端 的开发基本就这个过程。代理端那边因为直接用的购买的设备所以大概也不需要自己去用C写扩展了。实现过程中也是遇到数不清的问题。。而且感觉这方面的资料非常的零乱,所以一天大部分时间都游击在各大国内外论坛,也算学习到很多。

0 0