55
56
# If you're running multiple environments with the same services in them
56
57
# this allows you to differentiate between them.
58
# nagios_servicegroups:
62
# A comma-separated list of nagios servicegroups.
63
# If left empty, the nagios_context will be used as the servicegroup
58
65
# 3. Add custom checks (Nagios plugins) to files/nrpe-external-master
126
133
def _locate_cmd(self, check_cmd):
129
os.path.join(os.environ['CHARM_DIR'],
130
'files/nrpe-external-master'),
131
135
'/usr/lib/nagios/plugins',
132
136
'/usr/local/lib/nagios/plugins',
141
145
log('Check command not found: {}'.format(parts[0]))
144
def write(self, nagios_context, hostname):
148
def write(self, nagios_context, hostname, nagios_servicegroups=None):
145
149
nrpe_check_file = '/etc/nagios/nrpe.d/{}.cfg'.format(
147
151
with open(nrpe_check_file, 'w') as nrpe_check_config:
153
157
log('Not writing service config as {} is not accessible'.format(
154
158
NRPE.nagios_exportdir))
156
self.write_service_config(nagios_context, hostname)
160
self.write_service_config(nagios_context, hostname,
161
nagios_servicegroups)
158
def write_service_config(self, nagios_context, hostname):
163
def write_service_config(self, nagios_context, hostname,
164
nagios_servicegroups=None):
159
165
for f in os.listdir(NRPE.nagios_exportdir):
160
166
if re.search('.*{}.cfg'.format(self.command), f):
161
167
os.remove(os.path.join(NRPE.nagios_exportdir, f))
169
if not nagios_servicegroups:
170
nagios_servicegroups = nagios_context
164
173
'nagios_hostname': hostname,
165
'nagios_servicegroup': nagios_context,
174
'nagios_servicegroup': nagios_servicegroups,
166
175
'description': self.description,
167
176
'shortname': self.shortname,
168
177
'command': self.command,
186
195
super(NRPE, self).__init__()
187
196
self.config = config()
188
197
self.nagios_context = self.config['nagios_context']
198
if 'nagios_servicegroups' in self.config:
199
self.nagios_servicegroups = self.config['nagios_servicegroups']
201
self.nagios_servicegroups = 'juju'
189
202
self.unit_name = local_unit().replace('/', '-')
191
204
self.hostname = hostname
211
224
nrpe_monitors = {}
212
225
monitors = {"monitors": {"remote": {"nrpe": nrpe_monitors}}}
213
226
for nrpecheck in self.checks:
214
nrpecheck.write(self.nagios_context, self.hostname)
227
nrpecheck.write(self.nagios_context, self.hostname,
228
self.nagios_servicegroups)
215
229
nrpe_monitors[nrpecheck.shortname] = {
216
230
"command": nrpecheck.command,
221
235
for rid in relation_ids("local-monitors"):
222
236
relation_set(relation_id=rid, monitors=yaml.dump(monitors))
239
def get_nagios_hostcontext(relation_name='nrpe-external-master'):
241
Query relation with nrpe subordinate, return the nagios_host_context
243
:param str relation_name: Name of relation nrpe sub joined to
245
for rel in relations_of_type(relation_name):
246
if 'nagios_hostname' in rel:
247
return rel['nagios_host_context']
250
def get_nagios_hostname(relation_name='nrpe-external-master'):
252
Query relation with nrpe subordinate, return the nagios_hostname
254
:param str relation_name: Name of relation nrpe sub joined to
256
for rel in relations_of_type(relation_name):
257
if 'nagios_hostname' in rel:
258
return rel['nagios_hostname']
261
def get_nagios_unit_name(relation_name='nrpe-external-master'):
263
Return the nagios unit name prepended with host_context if needed
265
:param str relation_name: Name of relation nrpe sub joined to
267
host_context = get_nagios_hostcontext(relation_name)
269
unit = "%s:%s" % (host_context, local_unit())
275
def add_init_service_checks(nrpe, services, unit_name):
277
Add checks for each service in list
279
:param NRPE nrpe: NRPE object to add check to
280
:param list services: List of services to check
281
:param str unit_name: Unit name to use in check description
284
upstart_init = '/etc/init/%s.conf' % svc
285
sysv_init = '/etc/init.d/%s' % svc
286
if os.path.exists(upstart_init):
289
description='process check {%s}' % unit_name,
290
check_cmd='check_upstart_job %s' % svc
292
elif os.path.exists(sysv_init):
293
cronpath = '/etc/cron.d/nagios-service-check-%s' % svc
294
cron_file = ('*/5 * * * * root '
295
'/usr/local/lib/nagios/plugins/check_exit_status.pl '
296
'-s /etc/init.d/%s status > '
297
'/var/lib/nagios/service-check-%s.txt\n' % (svc,
300
f = open(cronpath, 'w')
305
description='process check {%s}' % unit_name,
306
check_cmd='check_status_file.py -f '
307
'/var/lib/nagios/service-check-%s.txt' % svc,