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,
}

你可能感兴趣的:(check)