# -*- coding:utf-8 -*- # Copyright (c) 2020 Huawei Technologies Co.,Ltd. # # openGauss is licensed under Mulan PSL v2. # You can use this software according to the terms # and conditions of the Mulan PSL v2. # You may obtain a copy of Mulan PSL v2 at: # # http://license.coscl.org.cn/MulanPSL2 # # THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, # WITHOUT WARRANTIES OF ANY KIND, # EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, # MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. # See the Mulan PSL v2 for more details. # ---------------------------------------------------------------------------- import os from gspylib.common.Common import DefaultValue from gspylib.inspection.common import SharedFuncs from gspylib.inspection.common.CheckItem import BaseItem from gspylib.inspection.common.CheckResult import ResultStatus from gspylib.os.gsOSlib import g_OSlib from gspylib.os.gsfile import g_file class CheckMaxHandle(BaseItem): def __init__(self): super(CheckMaxHandle, self).__init__(self.__class__.__name__) def doCheck(self): flag = True parRes = "" # Determine if it is an ELK environment elk_env = DefaultValue.getEnv("ELK_SYSTEM_TABLESPACE") if (elk_env): expand_value = 640000 else: expand_value = 1000000 # Check system open files parameter output = g_OSlib.getUserLimits('open files') self.result.raw = output if (output != ""): self.result.val += output + "\n" resList = output.split(' ') limitValue = resList[-1].strip() # Unlimited check is passed if limitValue == 'unlimited': pass # Open file parameter value is less than 640000 will not pass if int(limitValue) < int(expand_value): flag = False else: pass # Write check results parRes += "Max open files: %s\n" % limitValue else: # flag = False parRes += "Failed to get system open files parameter.\n" # Check cluster process open files parameter if (self.cluster): pidList = g_OSlib.getProcess( os.path.join(self.cluster.appPath, 'bin/gaussdb')) for pid in pidList: if (not os.path.isfile( "/proc/%s/limits" % pid) or not os.access( "/proc/%s/limits" % pid, os.R_OK)): continue openFileInfo = \ g_file.readFile('/proc/%s/limits' % pid, 'Max open files')[ 0] if (openFileInfo): value = openFileInfo.split()[3] if (int(value.strip()) < expand_value): flag = False parRes += "The value of " \ "max open files is %s on pid %s. " \ "it must not be less than %d.\n" % ( value.strip(), pid, expand_value) if (flag): self.result.rst = ResultStatus.OK else: self.result.rst = ResultStatus.NG self.result.val = parRes def doSet(self): self.result.val = "" self.result.raw = "" limitPath = '/etc/security/limits.d/' if (os.path.isfile(os.path.join(limitPath, '91-nofile.conf'))): limitFile = '91-nofile.conf' else: limitFile = '90-nofile.conf' elk_env = DefaultValue.getEnv("ELK_SYSTEM_TABLESPACE") if (elk_env): expand_value = 640000 else: expand_value = 1000000 errMsg = SharedFuncs.SetLimitsConf(["soft", "hard"], "nofile", expand_value, os.path.join(limitPath, limitFile)) if errMsg != "Success": self.result.val = "%s\n" % errMsg else: self.result.val = "Success to set openfile to %d\n" % expand_value