This repository was archived by the owner on Nov 8, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathcheck_purefa_hw.py
executable file
·132 lines (111 loc) · 5.16 KB
/
check_purefa_hw.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#!/usr/bin/env python
# Copyright (c) 2018, 2019, 2020, 2022 Pure Storage, Inc.
#
# * Overview
#
# This short Nagios/Icinga plugin code shows how to build a simple plugin to monitor Pure Storage FlashArrays.
# The Pure Storage Python REST Client is used to query the FlashArray.
#
# * Installation
#
# The script should be copied to the Nagios plugins directory on the machine hosting the Nagios server or the NRPE
# for example the /usr/lib/nagios/plugins folder.
# Change the execution rights of the program to allow the execution to 'all' (usually chmod 0755).
#
"""Pure Storage FlashArray hardware components status
Nagios plugin to retrieve the current status of hardware components from a Pure Storage FlashArray.
Hardware status indicators are collected from the target FA using the REST call.
The plugin has three mandatory arguments: 'endpoint', which specifies the target FA, 'apitoken', which
specifies the autentication token for the REST call session and 'component', that is the name of the
hardware component to be monitored. The component must be specified using the internal naming schema of
the Pure FlashArray: i.e CH0 for the main chassis, CH1 for the secondary chassis (shelf 1), CT0 for controller 0,i
CT1 for controller 1i, CH0.NVB0 for the first NVRAM module, CH0.NVB1 for the second NVRAM module, CH0.BAY0 for
the first flash module, CH0.BAY10 for the tenth flash module, CH1.BAY1, for the first flash module on the
first additional shelf,...
"""
import sys
if not sys.warnoptions:
import warnings
warnings.simplefilter("ignore")
import argparse
import logging
import logging.handlers
import nagiosplugin
from pypureclient import flasharray, PureError
# Disable warnings using urllib3 embedded in requests or directly
try:
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
except:
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
class PureFAhw(nagiosplugin.Resource):
"""Pure Storage FlashArray hardware status
Retrieve FA hardware components status
"""
def __init__(self, endpoint, apitoken, component):
self.endpoint = endpoint
self.apitoken = apitoken
self.component = component
self.logger = logging.getLogger(self.name)
handler = logging.handlers.SysLogHandler(address = '/dev/log')
handler.setLevel(logging.ERROR)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
self.logger.addHandler(handler)
@property
def name(self):
if (self.component is None):
return 'PURE_FA_HW'
else:
return 'PURE_FA_HW_' + str(self.component)
def get_status(self):
"""Get hardware components status from flasharray."""
fainfo = []
try:
client = flasharray.Client(target=self.endpoint,
api_token=self.apitoken,
user_agent='Pure_Nagios_plugin/0.2.0')
if self.component is None:
res = client.get_hardware()
else:
res = client.get_hardware(names=[self.component])
if isinstance(res, flasharray.ValidResponse):
fainfo = list(res.items)
except Exception as e:
raise nagiosplugin.CheckError('FA REST call returned "{}"'.format(e))
return(fainfo)
def probe(self):
fainfo = self.get_status()
if fainfo:
failedcomponents = [component for component in fainfo if component.status not in ['ok', 'not_installed']]
if failedcomponents:
metrics = ", ".join([component.name + ': ' + component.status for component in failedcomponents])
metric = nagiosplugin.Metric(metrics + '. Status', 1, context='default')
else:
if self.component is None:
metric = nagiosplugin.Metric('All hardware components are OK. Status', 0, context='default' )
else:
metric = nagiosplugin.Metric('{} hardware is OK. Status'.format(self.component), 0, context='default' )
else:
metric = None
return metric
def parse_args():
argp = argparse.ArgumentParser()
argp.add_argument('endpoint', help="FA hostname or ip address")
argp.add_argument('apitoken', help="FA api_token")
argp.add_argument('--component', help="FA hardware component, if not specified all components are checked")
argp.add_argument('-v', '--verbose', action='count', default=0,
help='increase output verbosity (use up to 3 times)')
argp.add_argument('-t', '--timeout', default=30,
help='abort execution after TIMEOUT seconds')
return argp.parse_args()
@nagiosplugin.guarded
def main():
args = parse_args()
check = nagiosplugin.Check( PureFAhw(args.endpoint, args.apitoken, args.component) )
check.add(nagiosplugin.ScalarContext('default', '', '@1:1'))
check.main(args.verbose, args.timeout)
if __name__ == '__main__':
main()