27 lines
		
	
	
	
		
			900 B
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			27 lines
		
	
	
	
		
			900 B
		
	
	
	
		
			Python
		
	
	
	
	
	
#!/usr/bin/env python3
 | 
						|
 | 
						|
from subprocess import check_output
 | 
						|
from json import loads
 | 
						|
import time
 | 
						|
 | 
						|
 | 
						|
nanosecond = time.time_ns()
 | 
						|
 | 
						|
for line in check_output(['/usr/sbin/smartctl', '--scan', '-d', 'scsi']).splitlines():
 | 
						|
    device = line.split()[0].decode()
 | 
						|
    smart = loads(check_output(['/usr/sbin/smartctl', '-a', device, '-j']))
 | 
						|
    attributes = {
 | 
						|
        attribute['name']: attribute['flags']['value']
 | 
						|
            for attribute in smart['ata_smart_attributes']['table']
 | 
						|
            if int(attribute['id']) in [
 | 
						|
                # https://www.backblaze.com/blog/what-smart-stats-indicate-hard-drive-failures/
 | 
						|
                5,
 | 
						|
                187,
 | 
						|
                188,
 | 
						|
                197,
 | 
						|
                198,
 | 
						|
            ]
 | 
						|
    }
 | 
						|
    attributes_string = ','.join(f'{k}={v}' for k, v in attributes.items())
 | 
						|
 | 
						|
    print(f"smart_errors,host=${node.name},device={device} {attributes_string} {nanosecond}")
 |