203 lines
7.9 KiB
Python
203 lines
7.9 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 base_diff.env_variables import EnvVariables
|
|
from gspylib.common.ErrorCode import ErrorCode
|
|
from base_utils.executor.cmd_executor import CmdExecutor
|
|
from base_utils.os.cmd_util import CmdUtil
|
|
from base_utils.os.file_util import FileUtil
|
|
from base_utils.executor.local_remote_cmd import LocalRemoteCmd
|
|
from domain_utils.domain_common.cluster_constants import ClusterConstants
|
|
|
|
|
|
class ProfileFile:
|
|
""" profile file utility"""
|
|
|
|
def __init__(self):
|
|
pass
|
|
|
|
|
|
@staticmethod
|
|
def removeTmpMpp(mpprc_file):
|
|
"""
|
|
function : remove tmp mpprc file
|
|
input : NA
|
|
output : NA
|
|
"""
|
|
mpp_tmp_rm = os.path.dirname(mpprc_file) + "/mpprcfile_tmp"
|
|
if os.path.exists(mpp_tmp_rm):
|
|
FileUtil.removeDirectory(mpp_tmp_rm)
|
|
|
|
@staticmethod
|
|
def checkAllNodesMpprcFile(host_list, mpprc_file):
|
|
"""
|
|
function:check All Nodes mpprc_file
|
|
input: host_list, appPath, mpprc_file
|
|
output:NA
|
|
"""
|
|
# get mppfile, make sure it exists
|
|
if mpprc_file is None or mpprc_file == ClusterConstants.ETC_PROFILE or \
|
|
mpprc_file == ClusterConstants.BASHRC or not os.path.exists(mpprc_file):
|
|
return
|
|
if len(host_list) == 0:
|
|
raise Exception(ErrorCode.GAUSS_512["GAUSS_51203"] % "hostanme")
|
|
mppTmp = os.path.dirname(mpprc_file) + "/mpprcfile_tmp"
|
|
# Clean old tmp dir
|
|
ProfileFile.removeTmpMpp(mpprc_file)
|
|
# Create tmp dir for all mppfile
|
|
FileUtil.createDirectory(mppTmp)
|
|
# Copy every mppfile, rename them by hostname
|
|
for host in host_list:
|
|
catCmd = "%s %s > %s 2>&1" % (
|
|
CmdUtil.getCatCmd(), mpprc_file, ClusterConstants.DEV_NULL)
|
|
cmd = CmdUtil.getSshCommand(host, catCmd)
|
|
(status, _) = subprocess.getstatusoutput(cmd)
|
|
if status == 0:
|
|
tmpEnv = "%s/%s_env" % (mppTmp, host)
|
|
scpCmd = LocalRemoteCmd.getRemoteCopyCmd(mpprc_file, tmpEnv, host, False)
|
|
CmdExecutor.execCommandLocally(scpCmd)
|
|
ProfileFile.checkMpprcFileChange(tmpEnv, host, mpprc_file)
|
|
|
|
# remove tmp dir
|
|
ProfileFile.removeTmpMpp(mpprc_file)
|
|
|
|
@staticmethod
|
|
def checkMpprcFileChange(mpprcFile, host="local host", mpprcFile_rm=""):
|
|
"""
|
|
function:Check if mppfile has been changed
|
|
input: mppfile
|
|
output:NA
|
|
"""
|
|
# get mppfile, make sure it exists
|
|
if mpprcFile == "" or mpprcFile is None \
|
|
or mpprcFile == ClusterConstants.ETC_PROFILE \
|
|
or mpprcFile == ClusterConstants.BASHRC \
|
|
or not os.path.exists(mpprcFile):
|
|
ProfileFile.removeTmpMpp(mpprcFile)
|
|
return
|
|
|
|
if host == "" or host is None:
|
|
host = "local host"
|
|
|
|
# read the content of mppfile
|
|
with open(mpprcFile, 'r') as fp:
|
|
mpp_content = fp.read()
|
|
env_list = mpp_content.split('\n')
|
|
while '' in env_list:
|
|
env_list.remove('')
|
|
env_list = EnvVariables.filter_env_variable(env_list, mpprcFile, mpprcFile_rm)
|
|
|
|
# white elements
|
|
list_white = ["ELK_CONFIG_DIR", "ELK_SYSTEM_TABLESPACE", "MPPDB_ENV_SEPARATE_PATH",
|
|
"GPHOME", "UNPACKPATH", "PATH", "LD_LIBRARY_PATH", "PYTHONPATH",
|
|
"GAUSS_WARNING_TYPE", "GAUSSHOME", "PATH", "LD_LIBRARY_PATH",
|
|
"S3_CLIENT_CRT_FILE", "GAUSS_VERSION", "PGHOST", "GS_CLUSTER_NAME",
|
|
"GAUSSLOG", "GAUSS_ENV", "umask"]
|
|
# black elements
|
|
list_black = ["|", ";", "&", "<", ">", "`", "\\", "!", "\n"]
|
|
|
|
# check mpprcfile
|
|
for env in env_list:
|
|
env = env.strip()
|
|
if env == "":
|
|
continue
|
|
for white in list_white:
|
|
flag_white = 0
|
|
flag = env.find(white)
|
|
if env.startswith('export') or flag >= 0:
|
|
flag_white = 1
|
|
break
|
|
if flag_white == 0:
|
|
ProfileFile.removeTmpMpp(mpprcFile_rm)
|
|
raise Exception(
|
|
ErrorCode.GAUSS_502["GAUSS_50219"] % env +
|
|
" There are illegal characters in %s." % host)
|
|
for black in list_black:
|
|
flag = env.find(black)
|
|
if (flag >= 0 and env != ""):
|
|
ProfileFile.removeTmpMpp(mpprcFile_rm)
|
|
raise Exception(
|
|
ErrorCode.GAUSS_502["GAUSS_50219"] % env +
|
|
" There are illegal characters in %s." % host)
|
|
|
|
@staticmethod
|
|
def sourceEnvFile(file_env):
|
|
"""
|
|
Execute source file
|
|
"""
|
|
cmd = "%s '%s'" % (CmdUtil.SOURCE_CMD, file_env)
|
|
(status, output) = subprocess.getstatusoutput(cmd)
|
|
if status != 0 or output.strip() != "":
|
|
return (False, output)
|
|
return (True, "")
|
|
|
|
@staticmethod
|
|
def check_env_file(mpprc_file="", user=""):
|
|
"""
|
|
function: check if the env file contains msg which may cause the program failed.
|
|
input: NA
|
|
output: NA
|
|
"""
|
|
(status, output) = ProfileFile.sourceEnvFile(ClusterConstants.ETC_PROFILE)
|
|
if not status:
|
|
return False, output
|
|
|
|
if mpprc_file and os.path.isfile(mpprc_file):
|
|
env_global = EnvVariables.get_mpprc_wrapper(mpprc_file)
|
|
if os.path.exists(env_global):
|
|
(status, output) = ProfileFile.sourceEnvFile(env_global)
|
|
if not status:
|
|
return False, output
|
|
|
|
if user and os.getuid() == 0:
|
|
execute_cmd = "%s '%s' && %s '%s'" % (CmdUtil.SOURCE_CMD,
|
|
ClusterConstants.ETC_PROFILE,
|
|
CmdUtil.SOURCE_CMD,
|
|
ClusterConstants.BASHRC)
|
|
if mpprc_file:
|
|
remote_source_cmd = "if [ -f '%s' ] ; then %s '%s'; fi" % \
|
|
(mpprc_file, CmdUtil.SOURCE_CMD,
|
|
EnvVariables.get_mpprc_wrapper(mpprc_file))
|
|
execute_cmd = "%s && %s" % (execute_cmd, remote_source_cmd)
|
|
cmd = CmdUtil.getExecuteCmdWithUserProfile(user, ClusterConstants.BASHRC,
|
|
execute_cmd, False)
|
|
(status, output) = subprocess.getstatusoutput(cmd)
|
|
if status != 0 or output.strip() != "":
|
|
return False, output
|
|
return True, ""
|
|
|
|
@staticmethod
|
|
def updateUserEnvVariable(userProfile, variable, value):
|
|
"""
|
|
function : Update the user environment variable
|
|
input : String,String,String
|
|
output : NA
|
|
"""
|
|
try:
|
|
# delete old env information
|
|
delete_content = "^\\s*export\\s*%s=.*$" % variable
|
|
FileUtil.deleteLine(userProfile, delete_content)
|
|
# write the new env information into userProfile
|
|
write_content = ['export %s=%s' % (variable, value)]
|
|
FileUtil.writeFile(userProfile, write_content)
|
|
except Exception as e:
|
|
raise Exception(str(e))
|