#!/usr/bin/env python from json import loads from subprocess import check_output from sys import stderr devices = check_output(['smartctl', '--scan']).decode().splitlines() for device in devices: device = device.split(' ')[0] try: json = loads(check_output(['smartctl', '-n', 'standby', '-A', '--json=c', device])) telegraf_output = set() if 'power_on_time' in json: telegraf_output.add('power_on_hours={}'.format(json['power_on_time']['hours'])) if 'temperature' in json: telegraf_output.add('temperature={}'.format(json['temperature']['current'])) print('smartd_stats,device={device} {values}'.format( device=device, values=','.join(sorted(telegraf_output)), )) telegraf_output = set() if 'nvme_smart_health_information_log' in json: for k, v in json['nvme_smart_health_information_log'].items(): telegraf_output.add(f'{k}={v}') if 'ata_smart_attributes' in json: for entry in json['ata_smart_attributes']['table']: telegraf_output.add('{}={}'.format( entry['name'], entry['raw']['value'], )) print('smartd_health,device={device},type={type} {values}'.format( device=device, type=json['device']['type'], values=','.join(sorted(telegraf_output)), )) except Exception as e: print(f'{device} {repr(e)}', file=stderr)