check

it2022-05-05  231

check_mk检测插件 - raid监控

mk_raidstatus

python版本

#!/usr/bin/env python # -*- encoding: utf-8; py-indent-offset: 4 -*- import subprocess, re def cfggen(): # 192.168.48.116 command = ['/opt/raid/cfggen 0 DISPLAY |egrep \'Controller type|Volume ID|Status of volume|RAID level|Size|Physical hard disks|Target ID|State|Model Number\''] proc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, error = proc.communicate() print '<<<raidstatus>>>' print 'cfggen' print out def megacli64(): # 10.0.120.196, 10.20.10.237, 10.160.1.211 command = ['/opt/raid/MegaCli64 -ShowSummary -a0 -NoLog |egrep \'ProductName|Status|Connector|Product Id|State|Virtual drive|Size|State|RAID Level\''] proc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, error = proc.communicate() print '<<<raidstatus>>>' print 'megacli64' print out def sas2ircu(): # 10.0.120.207, 10.160.1.36 command = ['/opt/raid/sas2ircu 0 DISPLAY |egrep \'Controller type|Volume ID|Status of volume|RAID level|Size|Slot #|State|Model Number\''] proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, error = proc.communicate() print '<<<raidstatus>>>' print 'sas2ircu' print out def check_model(): command = ['lspci |grep -Po \'SAS\s*\d+\' |sed -e \'s/ //g\''] proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, error = proc.communicate() line = ' '.join(out.split()) m = re.match(r'(.*)(SAS\s*\d+)(.*)', line) model = m.group(2).strip() if model in ['SAS1068']: cfggen() elif model in ['SAS1078', 'SAS2108', 'SAS2208', 'SAS9240']: megacli64() elif model in ['SAS2008', 'SAS2308']: sas2ircu() if __name__ == '__main__': check_model()

bash版本

#!/bin/bash bin_path='/opt/raid' model=$(lspci |grep -Po 'SAS\s*\d+'|sed -e 's/ //g') case $model in 'SAS1068' ) echo '<<<raidstatus>>>' echo 'cfggen' $bin_path/cfggen 0 DISPLAY |egrep 'Controller type|Volume ID|Status of volume|RAID level|Size|Physical hard disks|Target ID|State|Model Number' ;; 'SAS1078'|'SAS2108'|'SAS2208'|'SAS9240' ) echo '<<<raidstatus>>>' echo 'megacli64' $bin_path/MegaCli64 -ShowSummary -a0 -NoLog |egrep 'ProductName|Status|Connector|Product Id|State|Virtual drive|Size|State|RAID Level' ;; 'SAS2008'|'SAS2308' ) echo '<<<raidstatus>>>' echo 'sas2ircu' $bin_path/sas2ircu 0 DISPLAY |egrep 'Controller type|Volume ID|Status of volume|RAID level|Size|Slot #|State|Model Number' ;; esac exit 0

raidstatus

#!/usr/bin/python # -*- encoding: utf-8; py-indent-offset: 4 -*- # output ''' <<<raidstatus>>> cfggen Controller type : SAS1068 Volume ID : 0 Status of volume : Okay (OKY) RAID level : 1 Size (in MB) : 285568 Physical hard disks (Target ID) : 9 1 Target ID : 1 State : Online (ONL) Size (in MB)/(in sectors) : 286102/585937500 Model Number : ST3300657SS Target ID : 8 State : Standby (SBY) Model Number : BACKPLANE Target ID : 9 State : Online (ONL) Size (in MB)/(in sectors) : 286102/585937500 Model Number : ST3300657SS ''' ''' <<<raidstatus>>> megacli64 ProductName : PERC H710 Mini(Bus 0, Dev 0) Status : Optimal Status : Healthy Product Id : BP12G+EXP Status : OK Connector : 00<Internal><Encl Pos 1 >: Slot 0 Product Id : ST2000VN000-1H31 State : Online Power State : Active Connector : 00<Internal><Encl Pos 1 >: Slot 1 Product Id : ST2000VN000-1H31 State : Online Power State : Active Connector : 00<Internal><Encl Pos 1 >: Slot 2 Product Id : ST2000VN000-1H31 State : Online Power State : Active Connector : 00<Internal><Encl Pos 1 >: Slot 3 Product Id : ST2000VN000-1H31 State : Online Power State : Active Connector : 00<Internal><Encl Pos 1 >: Slot 4 Product Id : ST2000VN000-1H31 State : Online Power State : Active Connector : 00<Internal><Encl Pos 1 >: Slot 5 Product Id : ST2000VN000-1H31 State : Online Power State : Active Connector : 00<Internal><Encl Pos 1 >: Slot 6 Product Id : ST2000VN000-1H31 State : Online Power State : Active Connector : 00<Internal><Encl Pos 1 >: Slot 7 Product Id : ST2000VN000-1H31 State : Online Power State : Active Connector : 00<Internal><Encl Pos 1 >: Slot 8 Product Id : ST2000VN000-1H31 State : Online Power State : Active Connector : 00<Internal><Encl Pos 1 >: Slot 9 Product Id : ST2000VN000-1H31 State : Online Power State : Active Connector : 00<Internal><Encl Pos 1 >: Slot 10 Product Id : ST2000VN000-1H31 State : Online Power State : Active Connector : 00<Internal><Encl Pos 1 >: Slot 11 Product Id : ST2000VN000-1H31 State : Online Power State : Active Connector : 00<Internal><Encl Pos 1 >: Slot 12 Product Id : ST300MM0006 State : Online Power State : Active Connector : 00<Internal><Encl Pos 1 >: Slot 13 Product Id : ST300MM0006 State : Online Power State : Active Connector : 00<Internal>: Slot 0 Product Id : SAS2 EXP BP State : Unconfigured Good Power State : Active Virtual drive : Target Id 0 ,VD name Virtual Disk 0 Size : 278.875 GB State : Optimal RAID Level : 1 Virtual drive : Target Id 1 ,VD name Virtual Disk 1 Size : 10.913 TB State : Optimal RAID Level : 10 ''' ''' <<<raid>>> <<<raidstatus>>> sas2ircu Controller type : SAS2008 Volume ID : 323 Status of volume : Okay (OKY) RAID level : RAID1 Size (in MB) : 1906394 Slot # : 5 State : Optimal (OPT) Size (in MB)/(in sectors) : 1907729/3907029167 Model Number : ST32000645NS Slot # : 6 State : Optimal (OPT) Size (in MB)/(in sectors) : 1907729/3907029167 Model Number : ST32000645NS ''' # the inventory function def inventory_raidstatus(info): #print info inventory = [] inventory.append((None,None)) return inventory def parse_cfggen(info): ''' controller: SAS1068E vdisks: [ {'status': 'Okay', 'disk': '9 1', 'size': '285568MB', 'id': '0', 'level': '1'} ] pdisks [ {'status': 'Online', 'model': 'ST3300657SS', 'id': '1'}, {'status': 'Standby', 'model': 'BACKPLANE', 'id': '8'}, {'status': 'Online', 'model': 'ST3300657SS', 'id': '9'} ] ''' vdisks = [] pdisks = [] vd = {} pd = {} for line in info: if line[0] == 'Controller': controller = line[3] continue if line[0] == 'Volume': vd['id'] = line[3] continue if line[0] == 'Status': vd['status'] = line[4] continue if line[0] == 'RAID': vd['level'] = line[3] continue if line[0] == 'Size': vd['size'] = line[4] + 'MB' continue if line[0] == 'Physical': vd['disk'] = ' '.join(line[6:]) vdisks.append(vd) vd = {} continue if line[0] == 'Target': pd['id'] = line[3] continue if line[0] == 'State': pd['status'] = line[2] if line[0] == 'Model': pd['model'] = line[3] pdisks.append(pd) pd = {} continue return controller, vdisks, pdisks def parse_megacli64(info): ''' controller: 'PERC H710' vdisks: [ {'status': 'Optimal', 'level': '1', 'id': '0', 'size': '278.875GB'}, {'status': 'Optimal', 'level': '10', 'id': '1', 'size': '10.913TB'} ] pdisks [ {'status': 'Online', 'model': 'ST2000VN000-1H31', 'id': '0'}, {'status': 'Online', 'model': 'ST2000VN000-1H31', 'id': '1'}, {'status': 'Online', 'model': 'ST2000VN000-1H31', 'id': '2'}, {'status': 'Online', 'model': 'ST2000VN000-1H31', 'id': '3'}, {'status': 'Online', 'model': 'ST2000VN000-1H31', 'id': '4'}, {'status': 'Online', 'model': 'ST2000VN000-1H31', 'id': '5'}, {'status': 'Online', 'model': 'ST2000VN000-1H31', 'id': '6'}, {'status': 'Online', 'model': 'ST2000VN000-1H31', 'id': '7'}, {'status': 'Online', 'model': 'ST2000VN000-1H31', 'id': '8'}, {'status': 'Online', 'model': 'ST2000VN000-1H31', 'id': '9'}, {'status': 'Online', 'model': 'ST2000VN000-1H31', 'id': '10'}, {'status': 'Online', 'model': 'ST2000VN000-1H31', 'id': '11'}, {'status': 'Online', 'model': 'ST300MM0006', 'id': '12'}, {'status': 'Online', 'model': 'ST300MM0006', 'id': '13'} ] ''' vdisks = [] pdisks = [] vd = {} pd = {} for line in info: if line[0] == 'ProductName': controller = ' '.join(line[2:]) continue if line[0] == 'Connector' and len(line) == 8: pd['id'] = line[7] continue if line[0] == 'Product' and len(line) ==4: pd['model'] = line[3] continue if line[0] == 'State' and len(line) == 3 and line[2] not in ['Optimal', 'Degraded']: pd['status'] = line[2] pdisks.append(pd) pd = {} continue if line[0] == 'Virtual': vd['id'] = line[5] continue if line[0] == 'Size': vd['size'] = ''.join(line[2:4]) continue if line[0] == 'State': vd['status'] = line[2] continue if line[0] == 'RAID': vd['level'] = line[3] vdisks.append(vd) vd = {} continue return controller, vdisks, pdisks def parse_sas2ircu(info): ''' controller: SAS2008 vdisks: [ {'status': 'Okay', 'size': '1906394MB', 'id': '323', 'level': 'RAID1'} ] pdisks [ {'status': 'Optimal', 'model': 'ST32000645NS', 'id': '5'}, {'status': 'Optimal', 'model': 'ST32000645NS', 'id': '6'} ] ''' vdisks = [] pdisks = [] vd = {} pd = {} for line in info: if line[0] == 'Controller': controller = line[3] continue if line[0] == 'Volume': vd['id'] = line[3] continue if line[0] == 'Status': vd['status'] = line[4] continue if line[0] == 'RAID': vd['level'] = line[3] continue if line[0] == 'Size' and len(line) == 5: vd['size'] = line[4] + 'MB' vdisks.append(vd) vd = {} continue if line[0] == 'Slot': pd['id'] = line[3] continue if line[0] == 'State': pd['status'] = line[2] if line[0] == 'Model': pd['model'] = line[3] pdisks.append(pd) pd = {} continue return controller, vdisks, pdisks # the check function def check_raidstatus(item, params, info): # cfggen handle if info[0][0] == 'cfggen': controller, vdisks, pdisks = parse_cfggen(info) if controller is None and len(vdisks) == 0 and len(pdisks) == 0: status = 3 else: status = 0 pids = [] vdinfo = [] pdinfo = [] for vdisk in vdisks: pids += vdisk['disk'].split(' ') if vdisk['status'] != 'Okay': status = 2 vdinfo.append('vd' + vdisk['id'] + '(raid-' + vdisk['level'] + ', ' + vdisk['size'] + '): ' + vdisk['status']) for pdisk in pdisks: if pdisk['status'] not in ['Online', 'Standby'] and pdisk['id'] in pids: pdinfo.append('pd' + pdisk['id'] + '(' + pdisk['model'] +'): ' + pdisk['status']) # megacli64 handle elif info[0][0] == 'megacli64': controller, vdisks, pdisks = parse_megacli64(info) if controller is None and len(vdisks) == 0 and len(pdisks) == 0: status = 3 else: status = 0 vdinfo = [] pdinfo = [] for vdisk in vdisks: if vdisk['status'] != 'Optimal': status = 2 vdinfo.append('VD' + vdisk['id'] + '(raid-' + vdisk['level'] + ', ' + vdisk['size'] + '): ' + vdisk['status']) for pdisk in pdisks: if pdisk['status'] != 'Online': pdinfo.append('PD' + pdisk['id'] + '(' + pdisk['model'] +'): ' + pdisk['status']) # sas2ircu handle elif info[0][0] == 'sas2ircu': controller, vdisks, pdisks = parse_sas2ircu(info) if controller is None and len(vdisks) == 0 and len(pdisks) == 0: status = 3 else: status = 0 pids = [] vdinfo = [] pdinfo = [] for vdisk in vdisks: if vdisk['status'] != 'Okay': status = 2 vdinfo.append('vd' + vdisk['id'] + '(' + vdisk['level'] + ', ' + vdisk['size'] + '): ' + vdisk['status']) for pdisk in pdisks: if pdisk['status'] not in ['Optimal'] and pdisk['id'] in pids: pdinfo.append('pd' + pdisk['id'] + '(' + pdisk['model'] +'): ' + pdisk['status']) # check status & output if status == 0: if info[0][0] in ['cfggen']: return (status, 'Controller Type: %s, Virtual Disks: %d, Physical Disks: %d' % (controller, len(vdisks), len(pids))) else: return (status, 'Controller Type: %s, Virtual Disks: %d, Physical Disks: %d' % (controller, len(vdisks), len(pdisks))) elif status == 2: return (status, 'Controller Type: %s, %s, %s' % (controller, ', '.join(vdinfo), ', '.join(pdinfo))) else: return (3, 'invalid check output') # declare the check to Check_MK check_info["raidstatus"] = { 'check_function': check_raidstatus, 'inventory_function': inventory_raidstatus, 'service_description': 'raidstatus', 'has_perfdata': False, } posted on 2015-02-04 12:02 北京涛子 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/liujitao79/p/4272011.html

相关资源:各显卡算力对照表!

最新回复(0)