def _detect_adaptec(self, disklist, request): # map disk name to disk mount path adaptec_disks = {} diskset = set(disklist) for disk in diskset: cmd = nagios.rootify(self._get_smartctl(request) + " -a %s" % disk) output = commands.getoutput(cmd) results = re.findall(r"Device: Adaptec\s+(\S+)", output) if len(results) == 1: adaptec_disks[results[0]] = disk disklist.remove(disk) # map to disknum to disk name (with disknum) cmd = nagios.rootify("/usr/StorMan/arcconf getconfig 1") output = commands.getoutput(cmd) results = re.findall(r"Logical device number(?:.*\n)+?\n", output, re.M) diskdict = {} for result in results: name = re.findall(r"Logical device name\s*:\s*(.*)", result)[0] for diskid in re.findall(r"Present \(\D*\d+,[^)]*?(\d+)\)", result): diskdict[diskid] = "%s-%s" % (adaptec_disks[name], diskid) return diskdict
def check_health_status(self, request, disklist): message = "overall test results" status_code = nagios.Status.OK for device_with_type in disklist: if device_with_type: disk = device_with_type.split()[0] else: continue cmd = nagios.rootify( self._get_smartctl(request) + " -H %s" % device_with_type) # print "get health command: ", cmd output = commands.getoutput(cmd) if not self._validate_output(request, output): continue if "SMART support is: Unavailable" in output: message += " %s=NOTSUPPORT" % disk continue test_result = re.findall( r"(?<=SMART overall-health self-assessment test result: )(\w+)", output) if not test_result: test_result = re.findall(r"(?<=SMART Health Status: )(\w+)", output) if not test_result: continue message += " %s=%s" % (disk, test_result[0]) if test_result[0] != "PASSED" and test_result[0] != "OK": status_code = nagios.Status.CRITICAL return status_code, message
def retrieve_batch_status(self, request): devicelist = self._get_disks(request) # print "devicelist: ", devicelist disklist = [d.split()[0] for d in devicelist if d] # print "disklist: ", disklist stats = {} # load the SMART info of adaptec raid controller if request.raid == "adaptec": stats.update(self.retrieve_adaptec_status(request, disklist)) return stats # load the SMART info of the rest disks. for device_with_type in devicelist: if device_with_type: disk = device_with_type.split()[0] else: continue cmd = nagios.rootify( self._get_smartctl(request) + (" -A %s" % device_with_type)) # print "smartctl cmd: ", cmd output = commands.getoutput(cmd) if not self._validate_output(request, output): continue for attrid, attribute in self._parse_output(request, output): # stats.setdefault(attrid, {})[disk] = attribute stats.setdefault(attrid, {})[device_with_type] = attribute # print "stats: ", stats return stats
def check_health_status(self, request, disklist): message = "overall test results" status_code = nagios.Status.OK for device_with_type in disklist: if device_with_type: disk = device_with_type.split()[0] else: continue cmd = nagios.rootify(self._get_smartctl(request) + " -H %s" % device_with_type) # print "get health command: ", cmd output = commands.getoutput(cmd) if not self._validate_output(request, output): continue if "SMART support is: Unavailable" in output: message += " %s=NOTSUPPORT" % disk continue test_result = re.findall(r"(?<=SMART overall-health self-assessment test result: )(\w+)", output) if not test_result: test_result = re.findall(r"(?<=SMART Health Status: )(\w+)", output) if not test_result: continue message += " %s=%s" % (disk, test_result[0]) if test_result[0] != "PASSED" and test_result[0] != "OK": status_code = nagios.Status.CRITICAL return status_code, message
def retrieve_batch_status(self, request): devicelist = self._get_disks(request) # print "devicelist: ", devicelist disklist = [d.split()[0] for d in devicelist if d] # print "disklist: ", disklist stats = {} # load the SMART info of adaptec raid controller if request.raid == "adaptec": stats.update(self.retrieve_adaptec_status(request, disklist)) return stats # load the SMART info of the rest disks. for device_with_type in devicelist: if device_with_type: disk = device_with_type.split()[0] else: continue cmd = nagios.rootify(self._get_smartctl(request) + (" -A %s" % device_with_type)) # print "smartctl cmd: ", cmd output = commands.getoutput(cmd) if not self._validate_output(request, output): continue for attrid, attribute in self._parse_output(request, output): # stats.setdefault(attrid, {})[disk] = attribute stats.setdefault(attrid, {})[device_with_type] = attribute # print "stats: ", stats return stats
def _get_query_status(self, query, request): cmd_template = "psql" if request.port is not None: cmd_template += " -p %s" % request.port cmd_template += " -wAtc \"%s\"" cmd = cmd_template % query if request.user: cmd = nagios.rootify(cmd, request.user) return commands.getoutput(cmd)
def _get_disks(self, request): if request.disk: disklist = [request.disk] elif request.raid == "megaraid": # get list of OS device names (/dev/sda1, etc) devlist = [] cmd = nagios.rootify("/sbin/fdisk -l") output = commands.getoutput(cmd) devlist = re.findall(r"(?<=Disk )((?:/[\w-]+)+)(?=:)", output) #print "devlist: ", devlist disklist = [] # get list of raid controller device ids cmd = nagios.rootify( '/usr/sbin/MegaCli -PDList -aALL | grep "Device Id"') output = commands.getoutput(cmd) #print "MegaCli Output: ", output for line in output.split('\n'): did = line.split(":")[1].strip() # note that it does not matter which 'dev' you specify, as long as it's valid. There is no mapping from 'dev' to 'device ID' disk = "%s -d sat+megaraid,%s" % (devlist[0], did) disklist.append(disk) else: output = commands.getoutput( self._get_smartctl(request) + " --scan") if self._validate_scan_output(request, output): disklist = [] for line in output.split("\n"): if line: d = line.split("#")[0].strip() disklist.append(d) elif sys.platform != "win32": cmd = nagios.rootify("/sbin/fdisk -l") output = commands.getoutput(cmd) disklist = re.findall(r"(?<=Disk )((?:/[\w-]+)+)(?=:)", output) else: nagios.StatusUnknownError(request, "Can't get disk list") return disklist
def _get_batch_status(self, request): cmd = "redis-cli --raw" if request.password: cmd += " -a %s" % request.password if request.database: cmd += " -n %s" % request.database if request.host: cmd += " -h %s" % request.host if request.port: cmd += " -p %s" % request.port cmd += " info" if request.user: cmd = nagios.rootify(cmd, request.user) return commands.getoutput(cmd)
def _get_disks(self, request): if request.disk: disklist = [request.disk] elif request.raid == "megaraid": # get list of OS device names (/dev/sda1, etc) devlist = [] cmd = nagios.rootify("/sbin/fdisk -l") output = commands.getoutput(cmd) devlist = re.findall(r"(?<=Disk )((?:/[\w-]+)+)(?=:)", output) #print "devlist: ", devlist disklist = [] # get list of raid controller device ids cmd = nagios.rootify('/usr/sbin/MegaCli -PDList -aALL | grep "Device Id"') output = commands.getoutput(cmd) #print "MegaCli Output: ", output for line in output.split('\n'): did = line.split(":")[1].strip() # note that it does not matter which 'dev' you specify, as long as it's valid. There is no mapping from 'dev' to 'device ID' disk = "%s -d sat+megaraid,%s" % (devlist[0], did) disklist.append(disk) else: output = commands.getoutput(self._get_smartctl(request) + " --scan") if self._validate_scan_output(request, output): disklist = [] for line in output.split("\n"): if line: d = line.split("#")[0].strip() disklist.append(d) elif sys.platform != "win32": cmd = nagios.rootify("/sbin/fdisk -l") output = commands.getoutput(cmd) disklist = re.findall(r"(?<=Disk )((?:/[\w-]+)+)(?=:)", output) else: nagios.StatusUnknownError(request, "Can't get disk list") return disklist
def _detect_adaptec(self, disklist, request): # map disk name to disk mount path adaptec_disks = {} diskset = set(disklist) for disk in diskset: cmd = nagios.rootify(self._get_smartctl(request) + " -a %s" % disk) output = commands.getoutput(cmd) results = re.findall(r"Device: Adaptec\s+(\S+)", output) if len(results) == 1: adaptec_disks[results[0]] = disk disklist.remove(disk) # map to disknum to disk name (with disknum) cmd = nagios.rootify("/usr/StorMan/arcconf getconfig 1") output = commands.getoutput(cmd) results = re.findall(r"Logical device number(?:.*\n)+?\n", output, re.M) diskdict = {} for result in results: name = re.findall(r"Logical device name\s*:\s*(.*)", result)[0] for diskid in re.findall(r"Present \(\D*\d+,[^)]*?(\d+)\)", result): diskdict[diskid] = "%s-%s" % (adaptec_disks[name], diskid) return diskdict;
def test_rootify(self): mock_os = mock.Mock() # sys.modules['os'] = mock_os nagios.__dict__['os'] = mock_os mock_os.geteuid.return_value = 1 self.assertEqual("sudo ls", nagios.rootify("ls")) self.assertEqual("sudo ls", nagios.rootify("sudo ls")) self.assertEqual("sudo -u appfirst ls", nagios.rootify("ls", "appfirst")) self.assertEqual("sudo -u appfirst ls", nagios.rootify("sudo ls", "appfirst")) mock_os.geteuid.return_value = 0 self.assertEqual("echo \"rosie\"", nagios.rootify("echo \"rosie\"")) self.assertEqual("sudo echo \"rosie\"", nagios.rootify("sudo echo \"rosie\"")) self.assertEqual("su -l appfirst -c \"echo \\\"rosie\\\"\"", nagios.rootify("echo \"rosie\"", "appfirst"))
def run_query(self, request, query): cmd_template = "redis-cli --raw" if request.password is not None: cmd_template += " -a %s" % request.password if request.database is not None: cmd_template += " -n %s" % request.database if request.host is not None: cmd_template += " -h %s" % request.host if request.port is not None: cmd_template += " -p %s" % request.port cmd = "%s %s" % (cmd_template, query) if request.user: cmd = nagios.rootify(cmd, request.user) output = commands.getoutput(cmd) if "command not found" in output: raise nagios.ServiceInaccessibleError(request, output) elif output.strip() == "": raise nagios.ServiceInaccessibleError(request, output) return output
def retrieve_adaptec_status(self, request, disklist): stats = {} diskdict = self._detect_adaptec(disklist, request) if not diskdict: return stats cmd = nagios.rootify("/usr/StorMan/arcconf getsmartstats 1") output = commands.getoutput(cmd) xml = output[output.index("<SmartStats"):output.index("</SmartStats>")+13] dom = parseString(xml) for disknode in dom.getElementsByTagName("PhysicalDriveSmartStats"): disk = diskdict[disknode.getAttribute("id")] for attrnode in disknode.getElementsByTagName("Attribute"): attribute = SmartAttribute() attribute.value = attrnode.getAttribute("normalizedCurrent") attribute.worst = attrnode.getAttribute("normalizedWorst") attribute.raw_value = attrnode.getAttribute("rawValue") attrid = str(int(attrnode.getAttribute("id"), 16)) stats.setdefault(attrid, {})[disk] = attribute return stats
def get_adaptec_health(self, request): if sys.platform == "win32": raise nagios.StatusUnknownError( request, "Adaptec Health only supported on linux.") disklist = self._get_disks(request) diskdict = self._detect_adaptec(disklist, request) if not diskdict: raise nagios.StatusUnknownError( request, "No Adaptec Raid Controller detected.") message = "" cmd = nagios.rootify("/usr/StorMan/arcconf getlogs 1 stats") output = commands.getoutput(cmd) if not self._validate_arcconf_output(request, output): return xml = output[output.index("<ControllerLog" ):output.index("</ControllerLog>") + 16] dom = parseString(xml) status_code = nagios.Status.OK if not request.warn: warn = 1 else: warn = request.warn sub_perfs = [] for statsnodee in dom.getElementsByTagName("physicaldrivestats"): value = int(statsnodee.getAttribute("smartWarnCnt")) disk = diskdict[statsnodee.getAttribute("id")] if value > 0: if message == "": message = "smart warnings:" message += " %s=%s" % (disk, value) status_code = self.superimpose(status_code, value, warn, request.crit) sub_perfs.append((disk, value)) if message == "": message = "no smart warning" r = nagios.Result(request.option, status_code, message, request.appname) for disk, value in sub_perfs: r.add_performance_data(disk, value, warn=warn, crit=request.crit) return r
def retrieve_adaptec_status(self, request, disklist): stats = {} diskdict = self._detect_adaptec(disklist, request) if not diskdict: return stats cmd = nagios.rootify("/usr/StorMan/arcconf getsmartstats 1") output = commands.getoutput(cmd) xml = output[output.index("<SmartStats" ):output.index("</SmartStats>") + 13] dom = parseString(xml) for disknode in dom.getElementsByTagName("PhysicalDriveSmartStats"): disk = diskdict[disknode.getAttribute("id")] for attrnode in disknode.getElementsByTagName("Attribute"): attribute = SmartAttribute() attribute.value = attrnode.getAttribute("normalizedCurrent") attribute.worst = attrnode.getAttribute("normalizedWorst") attribute.raw_value = attrnode.getAttribute("rawValue") attrid = str(int(attrnode.getAttribute("id"), 16)) stats.setdefault(attrid, {})[disk] = attribute return stats
def get_adaptec_health(self, request): if sys.platform == "win32": raise nagios.StatusUnknownError(request, "Adaptec Health only supported on linux.") disklist = self._get_disks(request) diskdict = self._detect_adaptec(disklist, request) if not diskdict: raise nagios.StatusUnknownError(request, "No Adaptec Raid Controller detected.") message = "" cmd = nagios.rootify("/usr/StorMan/arcconf getlogs 1 stats") output = commands.getoutput(cmd) if not self._validate_arcconf_output(request, output): return xml = output[output.index("<ControllerLog"):output.index("</ControllerLog>")+16] dom = parseString(xml) status_code = nagios.Status.OK if not request.warn: warn = 1 else: warn = request.warn sub_perfs = [] for statsnodee in dom.getElementsByTagName("physicaldrivestats"): value = int(statsnodee.getAttribute("smartWarnCnt")) disk = diskdict[statsnodee.getAttribute("id")] if value > 0: if message == "": message = "smart warnings:" message += " %s=%s" % (disk, value) status_code = self.superimpose(status_code, value, warn, request.crit) sub_perfs.append((disk, value)) if message == "": message = "no smart warning" r = nagios.Result(request.option, status_code, message, request.appname) for disk, value in sub_perfs: r.add_performance_data(disk, value, warn=warn, crit=request.crit) return r
def _get_batch_status(self, request): # TODO: make path optional cmd = nagios.rootify("/usr/bin/passenger-status") return commands.getoutput(cmd)
def _get_smartctl(self, request): if sys.platform == "win32": return request.path + "smartctl" else: return nagios.rootify(request.path + "smartctl")
def check_traceroute(self, request): cmd = "%straceroute -m %s %s" % (request.path, request.maxttl, request.host) cmd = nagios.rootify(cmd) output = commands.getoutput(cmd) return output