2020-12-16 17:25:24 +08:00

109 lines
4.0 KiB
Python

# -*- 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