#!/usr/bin/env python
"""
SNMP agent to parse CPU and ACPI TZ sensors from sysctl info on FreeBSD,
updating every 30 seconds

This implementation uses linux 'lm-sensors' OID tree
"""

from subprocess import Popen, PIPE
from seine.snmp.agent import SNMPAgent, Item

from systematic.smart import SmartCtlClient, SmartError

OID_PREFIX = '1.3.6.1.4.1.2021.13.18'


class SmartStatusMonitorAgent(SNMPAgent):
    def __init__(self):
        super(SmartStatusMonitorAgent, self).__init__(OID_PREFIX, reload_interval=30)

        self.index_tree = self.register_tree('{0}.2.1.1'.format(OID_PREFIX))
        self.names_tree = self.register_tree('{0}.2.1.2'.format(OID_PREFIX))
        self.model_tree = self.register_tree('{0}.2.1.3'.format(OID_PREFIX))
        self.serial_tree = self.register_tree('{0}.2.1.4'.format(OID_PREFIX))
        self.size_tree = self.register_tree('{0}.2.1.5'.format(OID_PREFIX))
        self.health_tree = self.register_tree('{0}.2.1.6'.format(OID_PREFIX))
        self.hours_tree = self.register_tree('{0}.2.1.7'.format(OID_PREFIX))

        self.client = SmartCtlClient()
        self.reload()

    def check_drives(self):
        self.client.scan()

        for drive in self.client.drives:
            self.index_tree.add_values('integer', [self.drive_index])
            self.names_tree.add_values('string', ['{0}'.format(drive.device)])
            self.health_tree.add_values('string', ['{0}'.format(drive.is_healthy and 'HEALTHY' or 'ERROR' )])

            info = drive.get_info()
            self.model_tree.add_values('string', [info['Device model'].value])
            self.serial_tree.add_values('string', [info['Serial number'].value])
            self.size_tree.add_values('integer', [info['User capacity'].value])

            attributes = drive.get_attributes()
            try:
                hours = attributes['power_on_hours']
            except KeyError:
                hours = -1
            self.hours_tree.add_values('integer', [hours['raw_value']])

            self.drive_index += 1

    def reload(self):
        self.clear()
        self.drive_index = 1
        self.check_drives()

SmartStatusMonitorAgent().run()
