Code review comment for lp:~benji/charms/precise/juju-gui/bug-1284088

Revision history for this message
Benji York (benji) wrote :

Reviewers: mp+211781_code.launchpad.net,

Message:
Please take a look.

Description:
Handle broken nrpe relations.

https://code.launchpad.net/~benji/charms/precise/juju-gui/bug-1284088/+merge/211781

(do not edit description out of merge proposal)

Please review this at https://codereview.appspot.com/76860047/

Affected files (+51, -7 lines):
   A [revision details]
   M scripts/charmsupport/nrpe.py
   M scripts/update-nrpe.py

Index: [revision details]
=== added file '[revision details]'
--- [revision details] 2012-01-01 00:00:00 +0000
+++ [revision details] 2012-01-01 00:00:00 +0000
@@ -0,0 +1,2 @@
+Old revision: <email address hidden>
+New revision: <email address hidden>

Index: scripts/update-nrpe.py
=== modified file 'scripts/update-nrpe.py'
--- scripts/update-nrpe.py 2014-02-18 12:18:02 +0000
+++ scripts/update-nrpe.py 2014-03-19 16:39:34 +0000
@@ -1,14 +1,29 @@
  #!/usr/bin/env python
-from charmsupport import nrpe
+import sys
+import charmsupport.nrpe
+
+
+def get_nrpe():
+ nrpe = charmsupport.nrpe.NRPE()
+ nrpe.add_check('app-is-accessible', 'Check_the_app_can_be_downloaded',
+ 'check-app-access.sh')
+ return nrpe

  def update_nrpe_config():
- nrpe_compat = nrpe.NRPE()
- nrpe_compat.add_check(
- 'app-is-accessible', 'Check_the_app_can_be_downloaded',
- 'check-app-access.sh')
- nrpe_compat.write()
+ nrpe = get_nrpe()
+ nrpe.write()
+
+
+def remove_nrpe_check():
+ nrpe = get_nrpe()
+ nrpe.remove_checks()

  if __name__ == '__main__':
- update_nrpe_config()
+ hook_name = sys.argv[0]
+ remove_nrpe_check()
+ if 'departed' in hook_name or 'broken' in hook_name:
+ remove_nrpe_check()
+ else:
+ update_nrpe_config()

Index: scripts/charmsupport/nrpe.py
=== modified file 'scripts/charmsupport/nrpe.py'
--- scripts/charmsupport/nrpe.py 2013-07-29 19:02:49 +0000
+++ scripts/charmsupport/nrpe.py 2014-03-19 16:39:34 +0000
@@ -5,12 +5,17 @@
  # Authors:
  # Matthew Wedgwood <email address hidden>

+# XXX This file has been modified to add the ability to remove NRPE checks.
+# The original project that created this code has been abandoned so there
is
+# no upstream to which the modifications can be sent.
+
  import subprocess
  import pwd
  import grp
  import os
  import re
  import shlex
+import errno

  from hookenv import config, local_unit

@@ -105,6 +110,11 @@
          subprocess.call(['juju-log', 'Check command not found:
{}'.format(command[0])])
          return ''

+ def service_file_name(self, nagios_context, hostname):
+ return '{}/service__{}_check_{}.cfg'.format(
+ NRPE.nagios_exportdir, hostname, self.shortname)
+
+
      def write(self, nagios_context, hostname):
          for f in os.listdir(NRPE.nagios_exportdir):
              if re.search('.*check_{}.cfg'.format(self.shortname), f):
@@ -119,6 +129,7 @@
          nrpe_service_text = Check.service_template.format(**templ_vars)
          nrpe_service_file = '{}/service__{}_check_{}.cfg'.format(
              NRPE.nagios_exportdir, hostname, self.shortname)
+ nrpe_service_file = self.service_file_name(nagios_context,
hostname)
          with open(nrpe_service_file, 'w') as nrpe_service_config:
              nrpe_service_config.write(str(nrpe_service_text))

@@ -128,9 +139,21 @@
              nrpe_check_config.write("command[check_{}]={}\n".format(
                  self.shortname, self.check_cmd))

+ def remove(self, nagios_context, hostname):
+ """Remove the configuration file for this check."""
+ try:
+ os.unlink(self.service_file_name(nagios_context, hostname))
+ except OSError, e:
+ if e.errno == errno.ENOENT:
+ # Ignore the fact that the file didn't exist.
+ pass
+ else:
+ raise
+
      def run(self):
          subprocess.call(self.check_cmd)

+
  class NRPE(object):
      nagios_logdir = '/var/log/nagios'
      nagios_exportdir = '/var/lib/nagios/export'
@@ -167,3 +190,7 @@

          if os.path.isfile('/etc/init.d/nagios-nrpe-server'):
              subprocess.call(['service', 'nagios-nrpe-server', 'reload'])
+
+ def remove_checks(self):
+ for check in self.checks:
+ check.remove(self.nagios_context, self.hostname)

« Back to merge proposal