diff options
Diffstat (limited to 'src/collectors/python.d.plugin/adaptec_raid/adaptec_raid.chart.py')
-rw-r--r-- | src/collectors/python.d.plugin/adaptec_raid/adaptec_raid.chart.py | 247 |
1 files changed, 0 insertions, 247 deletions
diff --git a/src/collectors/python.d.plugin/adaptec_raid/adaptec_raid.chart.py b/src/collectors/python.d.plugin/adaptec_raid/adaptec_raid.chart.py deleted file mode 100644 index 1995ad6810..0000000000 --- a/src/collectors/python.d.plugin/adaptec_raid/adaptec_raid.chart.py +++ /dev/null @@ -1,247 +0,0 @@ -# -*- coding: utf-8 -*- -# Description: adaptec_raid netdata python.d module -# Author: Ilya Mashchenko (ilyam8) -# SPDX-License-Identifier: GPL-3.0-or-later - - -import re -from copy import deepcopy - -from bases.FrameworkServices.ExecutableService import ExecutableService -from bases.collection import find_binary - -disabled_by_default = True - -update_every = 5 - -ORDER = [ - 'ld_status', - 'pd_state', - 'pd_smart_warnings', - 'pd_temperature', -] - -CHARTS = { - 'ld_status': { - 'options': [None, 'Status of logical devices (1: Failed or Degraded)', 'bool', 'logical devices', - 'adaptec_raid.ld_status', 'line'], - 'lines': [] - }, - 'pd_state': { - 'options': [None, 'State of physical devices (1: not Online)', 'bool', 'physical devices', - 'adaptec_raid.pd_state', 'line'], - 'lines': [] - }, - 'pd_smart_warnings': { - 'options': [None, 'S.M.A.R.T warnings', 'count', 'physical devices', - 'adaptec_raid.smart_warnings', 'line'], - 'lines': [] - }, - 'pd_temperature': { - 'options': [None, 'Temperature', 'celsius', 'physical devices', 'adaptec_raid.temperature', 'line'], - 'lines': [] - }, -} - -SUDO = 'sudo' -ARCCONF = 'arcconf' - -BAD_LD_STATUS = ( - 'Degraded', - 'Failed', -) - -GOOD_PD_STATUS = ( - 'Online', -) - -RE_LD = re.compile( - r'Logical [dD]evice number\s+([0-9]+).*?' - r'Status of [lL]ogical [dD]evice\s+: ([a-zA-Z]+)' -) - - -def find_lds(d): - d = ' '.join(v.strip() for v in d) - return [LD(*v) for v in RE_LD.findall(d)] - - -def find_pds(d): - pds = list() - pd = PD() - - for row in d: - row = row.strip() - if row.startswith('Device #'): - pd = PD() - pd.id = row.split('#')[-1] - elif not pd.id: - continue - - if row.startswith('State'): - v = row.split()[-1] - pd.state = v - elif row.startswith('S.M.A.R.T. warnings'): - v = row.split()[-1] - pd.smart_warnings = v - elif row.startswith('Temperature'): - v = row.split(':')[-1].split()[0] - pd.temperature = v - elif row.startswith(('NCQ status', 'Device Phy')) or not row: - if pd.id and pd.state and pd.smart_warnings: - pds.append(pd) - pd = PD() - - return pds - - -class LD: - def __init__(self, ld_id, status): - self.id = ld_id - self.status = status - - def data(self): - return { - 'ld_{0}_status'.format(self.id): int(self.status in BAD_LD_STATUS) - } - - -class PD: - def __init__(self): - self.id = None - self.state = None - self.smart_warnings = None - self.temperature = None - - def data(self): - data = { - 'pd_{0}_state'.format(self.id): int(self.state not in GOOD_PD_STATUS), - 'pd_{0}_smart_warnings'.format(self.id): self.smart_warnings, - } - if self.temperature and self.temperature.isdigit(): - data['pd_{0}_temperature'.format(self.id)] = self.temperature - - return data - - -class Arcconf: - def __init__(self, arcconf): - self.arcconf = arcconf - - def ld_info(self): - return [self.arcconf, 'GETCONFIG', '1', 'LD'] - - def pd_info(self): - return [self.arcconf, 'GETCONFIG', '1', 'PD'] - - -# TODO: hardcoded sudo... -class SudoArcconf: - def __init__(self, arcconf, sudo): - self.arcconf = Arcconf(arcconf) - self.sudo = sudo - - def ld_info(self): - return [self.sudo, '-n'] + self.arcconf.ld_info() - - def pd_info(self): - return [self.sudo, '-n'] + self.arcconf.pd_info() - - -class Service(ExecutableService): - def __init__(self, configuration=None, name=None): - ExecutableService.__init__(self, configuration=configuration, name=name) - self.order = ORDER - self.definitions = deepcopy(CHARTS) - self.use_sudo = self.configuration.get('use_sudo', True) - self.arcconf = None - - def execute(self, command, stderr=False): - return self._get_raw_data(command=command, stderr=stderr) - - def check(self): - arcconf = find_binary(ARCCONF) - if not arcconf: - self.error('can\'t locate "{0}" binary'.format(ARCCONF)) - return False - - sudo = find_binary(SUDO) - if self.use_sudo: - if not sudo: - self.error('can\'t locate "{0}" binary'.format(SUDO)) - return False - err = self.execute([sudo, '-n', '-v'], True) - if err: - self.error(' '.join(err)) - return False - - if self.use_sudo: - self.arcconf = SudoArcconf(arcconf, sudo) - else: - self.arcconf = Arcconf(arcconf) - - lds = self.get_lds() - if not lds: - return False - - self.debug('discovered logical devices ids: {0}'.format([ld.id for ld in lds])) - - pds = self.get_pds() - if not pds: - return False - - self.debug('discovered physical devices ids: {0}'.format([pd.id for pd in pds])) - - self.update_charts(lds, pds) - return True - - def get_data(self): - data = dict() - - for ld in self.get_lds(): - data.update(ld.data()) - - for pd in self.get_pds(): - data.update(pd.data()) - - return data - - def get_lds(self): - raw_lds = self.execute(self.arcconf.ld_info()) - if not raw_lds: - return None - - lds = find_lds(raw_lds) - if not lds: - self.error('failed to parse "{0}" output'.format(' '.join(self.arcconf.ld_info()))) - self.debug('output: {0}'.format(raw_lds)) - return None - return lds - - def get_pds(self): - raw_pds = self.execute(self.arcconf.pd_info()) - if not raw_pds: - return None - - pds = find_pds(raw_pds) - if not pds: - self.error('failed to parse "{0}" output'.format(' '.join(self.arcconf.pd_info()))) - self.debug('output: {0}'.format(raw_pds)) - return None - return pds - - def update_charts(self, lds, pds): - charts = self.definitions - for ld in lds: - dim = ['ld_{0}_status'.format(ld.id), 'ld {0}'.format(ld.id)] - charts['ld_status']['lines'].append(dim) - - for pd in pds: - dim = ['pd_{0}_state'.format(pd.id), 'pd {0}'.format(pd.id)] - charts['pd_state']['lines'].append(dim) - - dim = ['pd_{0}_smart_warnings'.format(pd.id), 'pd {0}'.format(pd.id)] - charts['pd_smart_warnings']['lines'].append(dim) - - dim = ['pd_{0}_temperature'.format(pd.id), 'pd {0}'.format(pd.id)] - charts['pd_temperature']['lines'].append(dim) |