def getSmbStatus(volInfo): status, msg, error = utils.execCmd(_checkSmbCmd) if status == utils.PluginStatusCode.OK: return status, "Process smb is running" smbConfigStat, msg, error = utils.execCmd(_chkConfigSmb) if smbConfigStat != utils.PluginStatusCode.OK: return utils.PluginStatusCode.OK, "OK: SMB not configured" # if smb is not running and any of the volume uses smb # then its required to alert the user for volume, volumeInfo in volInfo.iteritems(): if volumeInfo['volumeStatus'] == glustercli.VolumeStatus.OFFLINE: continue cifsStatus = volumeInfo.get('options', {}).get('user.cifs', 'enable') smbStatus = volumeInfo.get('options', {}).get('user.smb', 'enable') if cifsStatus == 'enable' and smbStatus == 'enable': # SMB configured, service not running msg = "CRITICAL: Process smb is not running" status = utils.PluginStatusCode.CRITICAL break else: # No volumes available or Non of the volumes are CIFS enabled msg = "OK: No gluster volume uses smb" status = utils.PluginStatusCode.OK return status, msg
def _verifyNagiosConfig(): (rc, out, err) = utils.execCmd( [server_utils.nagiosCmdPath.cmd, '-v', NAGIOS_CONFIG_FILE]) if rc == 0: return True else: return False
def getLvs(): lvmCommand = [ "lvm", "vgs", "--unquoted", "--noheading", "--nameprefixes", "--separator", "$", "--nosuffix", "--units", "m", "-o", "lv_uuid,lv_name,data_percent,pool_lv,lv_attr," "lv_size,lv_path,lv_metadata_size," "metadata_percent,vg_name" ] rc, out, err = utils.execCmd(lvmCommand) if rc != 0: logging.error( "lvm command failed.\nCommand=%s\nrc=%s\nout=%s\nerr=%s" % (lvmCommand, rc, out, err)) return None l = map( lambda x: dict(x), map(lambda x: [e.split('=') for e in x], map(lambda x: x.strip().split('$'), out))) d = {} for i in l: if i['LVM2_LV_ATTR'][0] == 't': k = "%s/%s" % (i['LVM2_VG_NAME'], i['LVM2_LV_NAME']) else: k = os.path.realpath(i['LVM2_LV_PATH']) d.update({k: i}) return d
def _verifyNagiosConfig(): (rc, out, err) = utils.execCmd([server_utils.nagiosCmdPath.cmd, '-v', NAGIOS_CONFIG_FILE]) if rc == 0: return True else: return False
def execNRPECommand(host, command, arguments=None, timeout=None, json_output=True): nrpeCmd = getNRPEBaseCommand(host, timeout).split() nrpeCmd.append(command) if arguments: nrpeCmd.append('-a') nrpeCmd.extend(arguments) (returncode, outputStr, err) = utils.execCmd(nrpeCmd, raw=True) if returncode == 0: if json_output: try: resultDict = json.loads(outputStr) except Exception as e: e.args += (outputStr,) raise return resultDict else: return outputStr else: print "Failed to execute NRPE command '%s' in host '%s' " \ "\nError : %s" \ "Make sure NRPE server in host '%s' is configured to accept " \ "requests from Nagios server" % (command, host, outputStr, host) sys.exit(utils.PluginStatusCode.CRITICAL)
def execNRPECommand(host, command, arguments=None, timeout=None, json_output=True): nrpeCmd = getNRPEBaseCommand(host, timeout).split() nrpeCmd.append(command) if arguments: nrpeCmd.append('-a') nrpeCmd.extend(arguments) (returncode, outputStr, err) = utils.execCmd(nrpeCmd, raw=True) if returncode == 0: if json_output: try: resultDict = json.loads(outputStr) except Exception as e: e.args += (outputStr, ) raise return resultDict else: return outputStr else: print "Failed to execute NRPE command '%s' in host '%s' " \ "\nError : %s" \ "Make sure NRPE server in host '%s' is configured to accept " \ "requests from Nagios server" % (command, host, outputStr, host) sys.exit(utils.PluginStatusCode.CRITICAL)
def getLvs(): lvmCommand = ["lvm", "vgs", "--unquoted", "--noheading", "--nameprefixes", "--separator", "$", "--nosuffix", "--units", "m", "-o", "lv_uuid,lv_name,data_percent,pool_lv,lv_attr," "lv_size,lv_path,lv_metadata_size," "metadata_percent,vg_name"] rc, out, err = utils.execCmd(lvmCommand) if rc != 0: logging.error( "lvm command failed.\nCommand=%s\nrc=%s\nout=%s\nerr=%s" % (lvmCommand, rc, out, err) ) return None l = map(lambda x: dict(x), map(lambda x: [e.split('=') for e in x], map(lambda x: x.strip().split('$'), out))) d = {} for i in l: if i['LVM2_LV_ATTR'][0] == 't': k = "%s/%s" % (i['LVM2_VG_NAME'], i['LVM2_LV_NAME']) else: k = os.path.realpath(i['LVM2_LV_PATH']) d.update({k: i}) return d
def getGlusterdStatus(): retCode, msg, error = utils.execCmd(_checkGlusterService) if retCode == 0: return utils.PluginStatusCode.OK, "Process glusterd is running" elif retCode == 3: return utils.PluginStatusCode.CRITICAL, \ "Process glusterd is not running" return utils.PluginStatusCode.CRITICAL, msg[0] if len(msg) > 0 else ""
def getCtdbStatus(smbStatus, nfsStatus): # If SMB/NFS is not running, then skip ctdb check if smbStatus != utils.PluginStatusCode.OK and \ nfsStatus != utils.PluginStatusCode.OK: return (utils.PluginStatusCode.OK, "CTDB ignored as SMB and NFS are not running") status, msg, error = utils.execCmd(_checkCtdbCmd) if status != utils.PluginStatusCode.OK: status, msg, error = utils.execCmd(_chkConfigCtdb) if status == utils.PluginStatusCode.OK: return (utils.PluginStatusCode.CRITICAL, "CTDB process is not running") return utils.PluginStatusCode.UNKNOWN, "CTDB not configured" # 'cdtb nodestatus' command will return the output in following format # # pnn:0 host_ip_address OK (THIS NODE) # # Possible states are - # Ok,Disconnected,Banned,Disabled,Unhealthy,Stopped,Inactive, # PartiallyOnline # And combinations of them like # pnn:0 host_ip_address BANNED|INACTIVE(THIS NODE) # # UNHEALTHY/DISABLED/PARTIALLYONLINE - node is partially operational # Any other state - node in not operational status, msg, error = utils.execCmd(['ctdb', 'nodestatus']) if len(msg) > 0: message = msg[0].split() if len(message) >= 2: msg = "Node status: %s" % message[2] if CtdbNodeStatus.OK in message[2]: status = utils.PluginStatusCode.OK elif (CtdbNodeStatus.UNHEALTHY in message[2] or CtdbNodeStatus.PARTIALLYONLINE in message[2] or CtdbNodeStatus.DISABLED in message[2]): status = utils.PluginStatusCode.WARNING else: status = utils.PluginStatusCode.CRITICAL else: status = utils.PluginStatusCode.UNKNOWN return status, msg
def sadfExecCmd(sadfCmd): try: (rc, out, err) = utils.execCmd(sadfCmd, raw=True) except (OSError, ValueError) as e: raise SadfCmdExecFailedException(err=[str(e)]) if rc != 0: raise SadfCmdExecFailedException(rc, [out], [err]) try: return etree.fromstring(out) except _etreeExceptions: raise SadfXmlErrorException(err=[out])
def getShdStatus(volInfo): status, msg, error = utils.execCmd(_checkShdCmd) if status == utils.PluginStatusCode.OK: return status, "Gluster Self Heal Daemon is running" hostUuid = glustercli.hostUUIDGet() for volumeName, volumeInfo in volInfo.iteritems(): if volumeInfo['volumeStatus'] == glustercli.VolumeStatus.OFFLINE: continue if hasBricks(hostUuid, volumeInfo['bricksInfo']) and \ int(volumeInfo['replicaCount']) > 1: status = utils.PluginStatusCode.CRITICAL msg = "CRITICAL: Gluster Self Heal Daemon not running" break else: msg = "OK: Process Gluster Self Heal Daemon" status = utils.PluginStatusCode.OK return status, msg
def getNfsStatus(volInfo): # if nfs is already running we need not to check further status, msg, error = utils.execCmd(_checkNfsCmd) if status == utils.PluginStatusCode.OK: return status, "Process glusterfs-nfs is running" # if nfs is not running and any of the volume uses nfs # then its required to alert the user for volume, volumeInfo in volInfo.iteritems(): if volumeInfo['volumeStatus'] == glustercli.VolumeStatus.OFFLINE: continue nfsStatus = volumeInfo.get('options', {}).get('nfs.disable', 'off') if nfsStatus == 'off': msg = "CRITICAL: Process glusterfs-nfs is not running" status = utils.PluginStatusCode.CRITICAL break else: msg = "OK: No gluster volume uses nfs" status = utils.PluginStatusCode.OK return status, msg
def getQuotadStatus(volInfo): # if quota is already running we need not to check further status, msg, error = utils.execCmd(_checkQuotaCmd) if status == utils.PluginStatusCode.OK: return status, "Process quotad is running" # if quota is not running and any of the volume uses quota # then the quotad process should be running in the host for volume, volumeInfo in volInfo.iteritems(): if volumeInfo['volumeStatus'] == glustercli.VolumeStatus.OFFLINE: continue quotadStatus = volumeInfo.get('options', {}).get('features.quota', '') if quotadStatus == 'on': msg = "CRITICAL: Process quotad is not running" utils.PluginStatusCode.CRITICAL break else: msg = "OK: Quota not enabled" status = utils.PluginStatusCode.OK return status, msg
def getBrickStatus(volumeName, brickName): status = None brickPath = brickName.split(':')[1] pidFile = brickName.replace(":/", "-").replace("/", "-") + ".pid" try: with open("%s/%s/run/%s" % ( _glusterVolPath, volumeName, pidFile)) as f: try: if _pidExists(int(f.read().strip())): status = utils.PluginStatusCode.OK brickDevice = storage.getBrickDeviceName(brickPath) disk = storage.getDisksForBrick(brickDevice) cmd = [checkIdeSmartCmdPath.cmd, "-d", disk, "-n"] rc, out, err = utils.execCmd(cmd) if rc == utils.PluginStatusCode.CRITICAL and \ "tests failed" in out[0]: status = utils.PluginStatusCode.WARNING msg = "WARNING: Brick %s: %s" % (brickPath, out[0]) else: status = utils.PluginStatusCode.CRITICAL except ValueError as e: status = utils.PluginStatusCode.CRITICAL msg = "Invalid pid of brick %s: %s" % (brickPath, str(e)) return status, msg except IOError as e: if e.errno == errno.ENOENT: status = utils.PluginStatusCode.CRITICAL else: status = utils.PluginStatusCode.UNKNOWN msg = "UNKNOWN: Brick %s: %s" % (brickPath, str(e)) finally: if status == utils.PluginStatusCode.OK: msg = "OK: Brick %s is up" % brickPath elif status == utils.PluginStatusCode.CRITICAL: msg = "CRITICAL: Brick %s is down" % brickPath return status, msg
def isNagiosRunning(): (rc, out, err) = utils.execCmd([serviceCmdPath.cmd, 'nagios', 'status']) if rc == 0: return True else: return False
def configureParam(paramName, value): sed_pattern = "/%s=.*/c\\%s=%s" % (paramName, paramName, value) command_sed = [__SED_CMD_PATH.cmd, "-i", sed_pattern, nscautils.__NAGIOSSERVER_CONF] utils.execCmd(command_sed)
def execNRPECommand(command): status, output, err = utils.execCmd(command.split(), raw=True) return status, output
def _runUnknown(): (rc, out, err) = utils.execCmd(["unknown"])
def configureParam(paramName, value): sed_pattern = '/%s=.*/c\\%s=%s' % (paramName, paramName, value) command_sed = [ __SED_CMD_PATH.cmd, '-i', sed_pattern, nscautils.__NAGIOSSERVER_CONF ] utils.execCmd(command_sed)
def testSuccess(self): (rc, out, err) = utils.execCmd(["true"]) self.assertEquals(rc, 0)
def testFailure(self): (rc, out, err) = utils.execCmd(["false"]) self.assertEquals(rc, 1)