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_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_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 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