Example #1
0
    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
Example #2
0
 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
Example #3
0
    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
Example #4
0
 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
Example #5
0
    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
Example #6
0
    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
Example #7
0
 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
Example #8
0
    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;
Example #9
0
 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
Example #10
0
    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
Example #11
0
 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
Example #12
0
    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