检查DELL服务器硬盘健康状态脚本
2015-12-09 14:26
531 查看
服务器运行时间长了,需要实时了解dell服务器上每块硬盘的物理状况:硬盘是否在线,是否有坏道了,是否影响到了阵列等.DELL的OMSA管理工具可以获取到这些信息.于是便写了个脚本,调用OMSA工具检查硬盘状态,并通过nagios来告警.
#!/usr/bin/env python #_*_coding:utf-8_*_ """ 检查dell服务器的硬盘状态,阵列卡状态 """ #$Id$# __author__ = '小卡车7号 <1165205343@qq.com>' __version__ = '$Revision: 0.1 $' import os import sys import subprocess def usage(): """显示脚本信息""" print """ 系统需安装 dell omsa 管理软件 硬盘的状态值通过 omreport storage pdisk controller = 0 命令获取 """ sys.exit(3) def check_status(val): """获取返回给nagios的状态值""" if 2 in val : status = 2 elif 1 in val: status = 1 else: status = 0 return status def split_line(data): """把数据拆分为行,并把行按照':'拆分""" arg = dict() for line in data.split('\n'): if ':' not in line: continue key,val = line.split(':',1) arg[key.strip()] = val.strip() return arg def check_pdisk(cid): """检查物理磁盘的信息,并进行判断""" infos = [] state = [] data = os.popen('omreport storage pdisk controller=%s'%cid).read().split('\n\n') for val in data: if ':' not in val: continue arg = split_line(val) disk_id = arg['ID'] disk_statu = arg['Status'] disk_state = arg['State'] disk_space = arg['Capacity'] disk_space = disk_space.split()[0] + disk_space.split()[1] disk_pro = arg['Part Number'] if disk_state == 'Online' and disk_statu == 'Ok': status = 0 else: status = 2 info = 'Disk %s,Status:%s,State:%s,Space:%s,ID:%s'\ % (disk_id,disk_statu,disk_state,disk_space,disk_pro) state.append(status) infos.append(info) infos = sorted(infos,key=lambda val:val.split(',')[1]) return state,infos def get_control_id(): """获取阵列卡ID,检查阵列卡状态 阵列卡固件驱动版本低于可更新版本时,显示为降级状态 该驱动可以不升级,故选择屏蔽该错误""" command = subprocess.Popen('omreport', shell=True, stdout=subprocess.PIPE,\ stderr=subprocess.STDOUT).wait() if command != 0: usage() data = os.popen('omreport storage controller').read() arg = split_line(data) cid = arg['ID'] statu = arg['Status'] state = arg['State'] mode = arg['Name'] current_version = arg['Firmware Version'] try: update_version = arg['Latest Available Firmware Version'] except KeyError: update_version = arg['Minimum Required Firmware Version'] desc = ['OK', 'WARN', 'CRITICAL'] if statu == 'Ok' and state =='Ready': status = 0 elif current_version != update_version \ and statu == 'Non-Critical' and state == 'Degraded': status = 0 elif statu == 'Ok' or state =='Ready': status = 1 else: status = 2 return cid,status,"dell controll:%s,Status:%s,State:%s,Mode:%s" % (desc[status],statu,state,mode) if __name__ == '__main__': ID,STAT,INFO = get_control_id() STATU,INFOS = check_pdisk(ID) STATU.append(STAT) STATUS = check_status(STATU) INFOS.append(INFO) print '\n'.join(INFOS) sys.exit(STATUS)
相关文章推荐
- 单例模式
- 单例模式
- 单例模式
- 安卓中WebView跟Js交互
- Jenkins内置环境变量的使用
- (学习)高精度地震——储层特征分析(1)
- IOS使用Jenkins持续集成
- 恢复误删的本地分支
- OC-017.new和alloc init 的区别
- Android驱动开发-- 1.内核driver层
- 分享一下Dagger2的使用经验
- Volley的初级使用(Http请求数据)
- 搭建持续集成接口测试平台(Jenkins+Ant+Jmeter)
- rhel7和centos7找回root密码 以及rhel6和centos6找回root密码
- 双栏pdf分割,kindle dxg
- CSS-tips
- 对imageNamed和imageWithContentsOfFile的一些理解
- 10016---Nginx 初体验
- php7 兼容 mysql
- Unity3D ----- 生命周期