File: //opt/node_api/drvinfo.hook
#!/usr/bin/python
import re
import os
import json
def smart(smartdata):
data={}
for i in smartdata:
if re.search('^Device Model:', i):
device_model_tmp = re.search('^Device Model: (.*?)$', i, re.M | re.I)
device_model = device_model_tmp.group(1).strip()
data['model']=device_model
if re.search('^Serial Number:', i):
serial_number_tmp = re.search('^Serial Number: (.*?)$', i, re.M | re.I)
serial_number = serial_number_tmp.group(1).strip()
data['serial']=serial_number
if re.search('^Sector Size:', i):
sector_size_tmp = re.search('^Sector Size: (.*?) bytes logical/physical$', i, re.M | re.I)
sector_size = sector_size_tmp.group(1).strip()
data['sector_size']=sector_size
if re.search('Power_On_Hours',i):
i = re.sub(r"\s+", " ", i.strip())
poh = i.split(' ')
data['poh']=poh[9]
if re.search('^241',i):
i = re.sub(r"\s+", " ", i)
Total_LBAs_Written = i.split(' ');
data['tlw']=Total_LBAs_Written[9]
return data
def adaptec():
drv_smart={}
sector_size={}
serial_number={}
data={}
data['device']={}
data['vendor'] = 'Adaptec'
drivers = os.popen('ls /dev/sg*[0-9]').read().splitlines()
deviceinfo = {}
for drv in drivers:
drv_smart[drv] = os.popen('smartctl -s on -T permissive -d sat --all ' + drv).read().splitlines()
tmpdata = smart(drv_smart[drv])
if tmpdata:
data['device'][drv]=tmpdata
return data
def areca():
with open('/proc/scsi/sg/device_strs') as device_strs:
lines=device_strs.read().splitlines()
for position, item in enumerate(lines):
if re.search('RAID controller', item,re.I |re.U):
raid_position = position
with open('/proc/scsi/sg/devices') as devices:
lines=devices.read().splitlines()
for position, item in enumerate(lines):
if position == raid_position:
string = item.split('\t')
drivers_count = int(string[4])
drv_smart={}
sector_size={}
serial_number={}
data={}
data['device']={}
data['vendor'] = 'areca'
for drv in range(drivers_count+1):
drv_smart[drv] = os.popen('smartctl -a -d areca,'+str(drv)+' /dev/sg'+str(raid_position)).read().splitlines()
tmpdata = smart(drv_smart[drv])
if tmpdata:
data['device']['/dev/sg'+str(drv)]=tmpdata
return data
def direct():
drv_smart={}
sector_size={}
serial_number={}
data={}
data['vendor'] = 'direct'
drivers = os.popen('ls /dev/sd[a-z]').read().splitlines()
deviceinfo = {}
data['device']={}
for drv in drivers:
deviceinfo[drv] = os.popen('hdparm -I '+ drv + ' 2>/dev/null').read().splitlines()
for line in deviceinfo[drv]:
if re.search('Solid State Device', line):
drv_smart[drv] = os.popen('smartctl -a ' + str(drv) + ' 2>/dev/null').read().splitlines()
tmpdata = smart(drv_smart[drv])
if tmpdata:
data['device'][drv]=smart(drv_smart[drv])
return data
def megaraid():
drv_smart={}
sector_size={}
serial_number={}
data={}
data['vendor'] = 'megaraid'
deviceinfo = {}
data['device']={}
with open('/proc/scsi/sg/device_strs') as device_strs:
lines=device_strs.read().splitlines()
for position, item in enumerate(lines):
if re.search('AVAGO', item,re.I |re.U):
raid_position = position
drivers = os.popen("/home/serverstats/monitor/raid/MegaCli_x86_64 -pdlist -a0| grep 'Device Id' |cut -d: -f2").read().splitlines()
if re.search('LSI', item,re.I |re.U):
raid_position = position
drivers = os.popen("/home/serverstats/monitor/raid/MegaCli_x86_64 -pdlist -a0| grep 'Device Id' |cut -d: -f2").read().splitlines()
break
try:
for drv in drivers:
drv_smart[drv] = os.popen('smartctl -a -d sat+megaraid,' + str(drv.strip()) + ' -T permissive /dev/sg'+str(raid_position) + ' 2>/dev/null').read().splitlines()
tmpdata = smart(drv_smart[drv])
if tmpdata:
data['device'][drv]=tmpdata
return data
except NameError:
return False
def main():
data={}
lspci = os.popen('lspci').read().splitlines()
for line in lspci:
if re.search('[Aa]reca', line):
data['raid'] = areca()
if re.search('[Aa]daptec', line):
data['raid'] = adaptec()
if re.search('MegaRAID', line):
data['raid'] = megaraid()
data['direct'] = direct()
data['hostname'] = os.popen('hostname').read()
print json.dumps(data)
if __name__ == "__main__":
main()