#!/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():
                if not str(v).isdigit():
                    continue

                telegraf_output.add(f'{k}={v}')

        if 'ata_smart_attributes' in json:
            for entry in json['ata_smart_attributes']['table']:
                if not str(entry['raw']['value']).isdigit():
                    continue

                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)
