zabbix 扩展脚本

#!/usr/bin/env python
#encoding:utf8
# desc: self-inspection
# args:
#     reboot :  reboot AP 
#     check  :  check AP syslog
#     getApNum: return AP Number Online
#     checkApOnline: ok: return ok; false: return ap ip : local apInfo 读取这个文件开始测试是否在线

import os
import sys
from paramikoHelper import myParamiko
from time import sleep
from telnetAP import rebTelnet
import threading

# AP IP信息文件
apInfoFile='/opt/script/apInfo'

# 全局线程锁
lock = threading.RLock()

# 多线程计数器
class Counter:
    count = 0

    def __init__(self, count):
        self.count = count

    def add(self, n = 1):
        lock.acquire()
        self.count = self.count + n
        lock.release()

    def delete(self, n = 1):
        lock.acquire()
        self.count = self.count - n
        lock.release()

    def get(self):
        return self.count

# 读取命令执行的结果
def getRunCommRes(cmd):
    return os.popen(cmd).read().strip('\n').strip(' ')
    
# 获取所有AP的IP地址列表
def getAllIP():
    return open(apInfoFile).read().split('\n')[:-1]
    
# 通用工具类
# 规定:
#    定义普通方法的时候,必须定义两个默认且两个参数 arg1 = "", arg2 = ""
#    定义被threadBox调用的target方法的时候,
#         要满足4个参数,且第一个参数为ip(threadBox定义的),后面如果没有指定参数,需要用默认参数 arg2 = "", arg3 = "", arg4 = ""
#         只有一个参数IP时: def oTarget(ip, arg2 = "", arg3 = "", arg4 = ""):
class CommonUtil:

    def __init__(self):
        pass
    
    # 多线程执行
    def threadBox(slef, myTarget, arg1 = "", arg2 = "", arg3 = ""):
        threads = []
        
        for ip in getAllIP():
            t = threading.Thread(target=myTarget, args=(ip, arg1, arg2, arg3))
            threads.append(t)
            t.start()
        
        for t in threads:
            t.join()
        
    # 获取设备在线时长
    def uptime(self, arg1 = "", arg2 = ""):
        print getRunCommRes("uptime | cut -d ',' -f1 | awk -F'up' '{print $2}'")
    
    # 获取设备网络配置    
    def netInfo(self, arg1 = "", arg2 = ""):
        ip = getRunCommRes("ip a show eth0 | grep inet | grep eth0 | awk '{print $2}'")
        gateway = getRunCommRes("ip route  | grep default | awk '{print $3}'")
        print ip,gateway

    # 获取设备联盟号
    def getPortalId(self, arg1 = "", arg2 = ""):
        print getRunCommRes('cat /usr/local/etc/chilli/wid')
        
    # 运行指定的脚本文件
    def runScript(self, arg1, arg2 = ""):
        print getRunCommRes('/opt/script/' + arg1)
    
    # ping Target
    def pingTarget(self, ip, res, downCount, args4 = ""):
        code = os.system('/bin/ping -c 1 -w 3 ' + ip + '>/dev/null')
        if code != 0:
            code1 = os.system('/bin/ping -c 1 -w 3 ' + ip + '>/dev/null')
            if code1 != 0:
                res.append(ip.split('.')[-1])
                downCount.add() 
                
    # 获取AP在线数
    # :::ex251::: 判断是否还有192.168.188.251的IP地址可以ping通
    #             如果可以ping通表示还有AP没有修改IP地址
    # a= 表示一共多少台AP, d=表示有多少台掉线, ::后面的数字表示192.168.188.+数字表示AP的ip地址
    #
    def checkApOnline(self, arg1 = "", arg2 = ""):
        # 检查接口是否正常
        interfaceName = getRunCommRes('ip addr show| grep 192.168.188.254').split('scope global')[1].strip(' ').split(':')[0]
        code = os.system("ip link show " + interfaceName + " | grep 'state UP' 1>/dev/null 2>&1 ")

        if code != 0:
            if 'eth2' == interfaceName:
                print "err;if=down:eth1,," + interfaceName
            else:
                print "err;if=down:" + interfaceName
        else:
            res = []
            total = len(getAllIP())
            downCount = Counter(0)
            ms251 = ""

            # 检查是否还存在251 IP的AP信息
            state251 = os.system('/bin/ping -c 1 -w 3 192.168.188.251 >/dev/null')
            if state251 == 0:
                ms251 = ':::ex251:::'
            
            self.threadBox(self.pingTarget, res, downCount)
            
            if len(res) == 0:
                print  ms251 + 'ok;' + str(total)
            else:
                print  ms251 + 'err;a=' + str(total) + ';d=' + str(downCount.get()) + '::' + str(res)        
    
    # reboot target
    def rebootTarget(self, ip, resDict, args3 = "", args4 = ""):
        try:
            sshobj = myParamiko(ip, 'root', 'password@123')
            resInfo = sshobj.run_cmd("reboot")
            resDict[ip] = resInfo["stdin"].strip('\n')
            sleep(1)
            sshobj.close()

        except Exception, e:
            resDict[ip] = "Error: " + str(e)
            if 'Authentication failed' in str(e):
                try:
                    rebTelnet(ip, 'admin', 'password')
                    resDict[ip] = "telRebootAp!"

                except Exception, e1:
                    resDict[ip] = "Error: " + str(e1)
                    
    # 重启AP
    def reboot(self):
        resDict = {}
        
        self.threadBox(self.rebootTarget, resDict)
        
        print resDict 
    
# 执行前环境初始化
def initSysDev():
    # 检查chilli程序是否异常退出
    chilliNum = getRunCommRes('ps -aef | grep chilli| grep -v grep | wc -l')
    cwatchNum = getRunCommRes('ps -aef | grep cwatch| grep -v grep | wc -l ')

    #if int(chilliNum) == 0 and int(cwatchNum) == 0:
    if int(chilliNum) == 0 :
        os.system('/usr/local/sbin/cwatch.sh &')

    # 根据网络方式配置IP地址,方便和AP通信 
    os.system('ip addr del 192.168.188.254/24 dev eth1 1>/dev/null 2>&1')
    os.system('ip addr del 192.168.188.254/24 dev eth2 1>/dev/null 2>&1')
    os.system('ip addr del 192.168.188.254/24 dev eth3 1>/dev/null 2>&1')

    code = os.system('ifconfig | grep ^br0 >/dev/null')
    if code == 0:
        os.system('ip addr add 192.168.188.254/24 dev br0 1>/dev/null 2>&1')
    else:
        code1 = os.system("ip link show eth1 | grep 'state UP' 1>/dev/null 2>&1 ")
        if code1 == 0:
            os.system("ifconfig eth1:1 192.168.188.254 up 1>/dev/null 2>&1")
        else:
            os.system("ifconfig eth2:1 192.168.188.254 up 1>/dev/null 2>&1")

# 执行开始            
def main():
    initSysDev()

    ComUtil = CommonUtil()
    
    if len(sys.argv) == 1:
        print "please add args!"

    elif len(sys.argv) == 2:
        myFun = getattr(ComUtil, sys.argv[1])
        myFun()
    
    elif len(sys.argv) == 3:
        myFun = getattr(ComUtil, sys.argv[1])
        myFun(sys.argv[2])
    
    elif len(sys.argv) == 4:
        myFun = getattr(ComUtil, sys.argv[1])
        myFun(sys.argv[2], sys.argv[3])
    
    else:
        print "args Error!"
   
    
if __name__ == "__main__":
    main()

 

posted @ 2018-07-26 15:19  喝杯茶  阅读(545)  评论(0编辑  收藏  举报