#!/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()

zabbix 扩展脚本的更多相关文章

  1. zabbix通过脚本发送短信

    zabbix通过脚本发送短信 原则 和zabbix电子邮件是一样的,他们是action内部配置,司的api来完毕.当然网上有不少利用139邮箱来发的,这个事实上算调用email的一种,这里复述的是调用 ...

  2. zabbix配合脚本监控Kafka

    简介: Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据.Kafka如下特性,受到诸多公司的青睐. 1.高吞吐量:即使是非常普通的硬件Kafka也可以支持 ...

  3. zabbix统一脚本监控方式

    几周的zabbix使用之后几点心得,暂时记在这儿 简单命令监控,直接配置Userparameter参数,以应用来分类conf文件,将不同应用的配置写在不同的conf文件里,并将之放到统一的配置引入目录 ...

  4. Zabbix 添加脚本检测IP变化

    监控环境 IP和HOSTNAME 有时会有变化.但目前是通过IP地址监控,不是DNS名,添加一个外部脚本,发现IP和HOSTNAME发生变化时告警. vim /usr/local/etc/zabbix ...

  5. zabbix 自定义脚本监控activemq

    1. 编写获取activemq队列积压消息(check-amq.sh) #!/bin/bash QUEUENAME=$ MQ_IP='172.16.1.56' curl -uadmin:admin h ...

  6. zabbix邮件脚本报警

    #启动邮箱服务 systemctl start postfix.service #配置用户的邮箱发送邮件 vim /etc/mail.rc set from="xxx@xxx.com&quo ...

  7. zabbix自定义脚本监控服务器端口状态

    zabbix可以通过客户端的[net.tcp.port[<ip>,port]]该item监控项来判断本地/远程服务器TCP端口是否正常,不过当时没有想起来,就用了自定义脚本去写的,很久没有 ...

  8. zabbix安装脚本

    #!/bin/bash # #安装zabbix源.aliyun YUM源 #curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyu ...

  9. Zabbix告警脚本-短信

    [root@iot-svndata02 bin]# cat zbsms.sh #!/bin/sh #curl http://221.179.180.137:8080/smsaServer/lkSend ...

随机推荐

  1. UVA 10891 SUM游戏 DP

    刚看到这个题目不知道怎么个DP法,有点难想到 解法如下 设置dp[i][j]代表i到j这段子序列能获得的最大值,这样,枚举m=min(m,dp[i+1到j][j],dp[i][i到j-1]),m就代表 ...

  2. LGOJ4299 首都

    这题是 \(LCT\) 维护子树信息中的 \(LCT\) 维护重心 Description link 题意概述:给定一个森林,要求支持以下操作 1.链接两个点 2.求一个点所在树的重心 3.求所有重心 ...

  3. KAFKA伪集群单机安装

    下载 kafka_2.11-2.0.1.tgz 文档kafka_2.11-2.0.1-site-docs.tgz cd /uae/local tar -zxvf kafka_2.11-2.0.1.tg ...

  4. iPhone到底能不能充一整夜电?

    其实在国内,手机充电一直是个"玄学问题".早在多年前就有大神向小白敦敦教导,"新买的手机要将电用完,并充12个小时,如此反复三次才能延长手机电池寿命".甚至直到 ...

  5. 系统 win 10 专业版 下载地址

    thunder://QUFodHRwOi8veHoyLjgxMDg0MC5jb20vY25fd2luZG93c18xMF9jb25zdW1lcl9lZGl0aW9uc192ZXJzaW9uXzE4MD ...

  6. 手把手教你入门Yii2框架-1

    前言概述: 我是一名PHP开发工程师,最拿手的是版本2.0的Yii框架,在培训班里老师没教我Yii框架,只是由于我弟弟(同行)擅长Yii框架,所以我用得最多的就是Yii2.0,后台我学了ThinkPH ...

  7. LeetCode——324. 摆动排序 II

    给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]... 的顺序. 示例 1: 输入: nums = [1, 5 ...

  8. 常见的nosql数据库有哪些?以及他们的特点与区别?

    一.常见的nosql 二.Redis,Memcache,MongoDb的特点 (1).Redis 优点: 1.支持多种数据结构,如 string(字符串). list(双向链表).dict(hash表 ...

  9. JS专题-FormData

    var formData = new FormData(); <form id="coords" class="coords" onsubmit=&quo ...

  10. 吴裕雄--天生自然 pythonTensorFlow图形数据处理:多线程队列操作

    import tensorflow as tf #1. 定义队列及其操作. queue = tf.FIFOQueue(100,"float") enqueue_op = queue ...