Files
openGauss-OM/script/gspylib/inspection/items/cluster/CheckSpecialFile.py
coolany eae422baf3 适配CM组件
Signed-off-by: coolany <kyosang@163.com>

support cgroup

追加合入
2022-03-05 18:51:52 +08:00

207 lines
7.5 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
import subprocess
from multiprocessing.dummy import Pool as ThreadPool
from gspylib.common.Common import DefaultValue
from gspylib.inspection.common.CheckItem import BaseItem
from gspylib.inspection.common.CheckResult import ResultStatus
from base_utils.os.env_util import EnvUtil
from base_utils.os.net_util import NetUtil
class CheckSpecialFile(BaseItem):
def __init__(self):
super(CheckSpecialFile, self).__init__(self.__class__.__name__)
def getDiskPath(self):
nodeDirs = []
# get PGHOST Dir
tmpDir = EnvUtil.getEnv("PGHOST")
nodeDirs.append(tmpDir)
# get gphome dir
gphome_path = EnvUtil.getEnv("GPHOME")
nodeDirs.append(gphome_path)
# get log dir
log_path = EnvUtil.getEnv("GAUSSLOG")
nodeDirs.append(log_path)
# get gausshome dir
gausshome_path = EnvUtil.getEnv("GAUSSHOME")
nodeDirs.append(os.path.realpath(gausshome_path))
hostName = NetUtil.GetHostIpOrName()
dbNode = self.cluster.getDbNodeByName(hostName)
# including dn
for dbInst in dbNode.datanodes:
nodeDirs.append(dbInst.datadir)
return nodeDirs
def checkPathVaild(self, envValue):
"""
function: check path vaild
input : envValue
output: NA
"""
if (envValue.strip() == ""):
return 0
# check path vaild
for rac in DefaultValue.PATH_CHECK_LIST:
flag = envValue.find(rac)
if flag >= 0:
return 1
return 0
def ignorePath(self, path):
# Part of the root path and file permissions need to be ignored
ignorePathList = []
toolPath = EnvUtil.getEnv("GPHOME")
sudoPath = os.path.join(toolPath, "sudo")
inspectionPath = os.path.join(toolPath, "script/inspection")
ignorePathList.append("%s/script/gs_preinstall" % toolPath)
ignorePathList.append("%s/script/gs_postuninstall" % toolPath)
ignorePathList.append("%s/script/gs_checkos" % toolPath)
scriptPath = os.path.join(toolPath, "script")
scriptDirList = scriptPath.split('/')
inspectionDirList = inspectionPath.split('/')
# ignore own special files
if (path in ignorePathList or os.path.dirname(path) == sudoPath):
return True
else:
(filename, suffix) = os.path.splitext(path)
pathDirList = path.split('/')
# ignore .pyc file in GPHOME/script
if (path.find(scriptPath) == 0 and pathDirList[:len(
scriptDirList)] == scriptDirList and suffix == ".pyc"):
return True
# ignore GPHOME/script/inspection dir
elif (path.find(inspectionPath) == 0 and pathDirList[:len(
inspectionDirList)] == inspectionDirList):
return True
else:
return False
def checkSpecialChar(self):
outputList = []
failList = []
pathList = []
paths = self.getDiskPath()
for path in paths:
if (not path or not os.path.isdir(path)):
continue
else:
pathList.append(path)
pool = ThreadPool(DefaultValue.getCpuSet())
results = pool.map(self.checkSingleSpecialChar, pathList)
pool.close()
pool.join()
for outlist, flist in results:
if (outlist):
outputList.extend(outlist)
if (flist):
failList.extend(flist)
if (len(outputList) > 0):
outputList = DefaultValue.Deduplication(outputList)
if (failList):
failList = DefaultValue.Deduplication(failList)
return outputList, failList
def checkSingleSpecialChar(self, path):
# Check a single path
outputList = []
failList = []
cmd = "find '%s' -name '*'" % path
(status, output) = subprocess.getstatusoutput(cmd)
FileList = output.split('\n')
while '' in FileList:
FileList.remove('')
if (status != 0 and output.find("Permission denied") > 0):
for realPath in FileList:
if (realPath.find("Permission denied") > 0):
failList.append(realPath)
elif (self.checkPathVaild(realPath) != 0):
outputList.append(realPath)
else:
for realPath in FileList:
if (self.checkPathVaild(realPath) != 0):
outputList.append(realPath)
return outputList, failList
#########################################################
# get the files which under the all useful directory and
# its owner is not current execute use
#########################################################
def checkErrorOwner(self, ownername):
outputList = []
failList = []
path = ""
for path in self.getDiskPath():
if (not path or not os.path.isdir(path)):
continue
cmd = "find '%s' -iname '*' ! -user %s -print" % (path, ownername)
(status, output) = subprocess.getstatusoutput(cmd)
if (status == 0 and output != ""):
pathList = output.split("\n")
for path in pathList:
if (self.ignorePath(path)):
continue
outputList.append(path)
elif (output.find("Permission denied") > 0):
pathList = output.split("\n")
for path in pathList:
if (path.find("Permission denied") > 0):
failList.append(path)
continue
if (self.ignorePath(path)):
continue
outputList.append(path)
if (len(outputList) > 0):
outputList = DefaultValue.Deduplication(outputList)
return outputList, failList
def doCheck(self):
parRes = ""
flag = 0
output = ""
outputList, failList = self.checkSpecialChar()
for output in outputList:
if (output != ""):
flag = 1
parRes += "\nSpecial characters file: \"%s\"" % output
outputList, errorList = self.checkErrorOwner(self.user)
for output in outputList:
if (output != ""):
flag = 1
parRes += "\nFile owner should be %s." \
" Incorrect owner file: \"%s\"" \
% (self.user, output)
failList.extend(errorList)
if (failList):
flag = 1
failList = DefaultValue.Deduplication(failList)
parRes += "\n%s" % ("\n".join(failList))
if (flag == 1):
self.result.rst = ResultStatus.NG
self.result.val = parRes
else:
self.result.rst = ResultStatus.OK
self.result.val = "All files are normal."