HEX
Server: LiteSpeed
System: Linux pl-rocket-da1.hostsila.org 4.18.0-477.27.2.lve.el8.x86_64 #1 SMP Wed Oct 11 12:32:56 UTC 2023 x86_64
User: etorby24eu (1588)
PHP: 8.3.23
Disabled: exec,system,passthru,shell_exec,proc_close,proc_open,dl,popen,show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname
Upload Files
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()