Files
openGauss-OM/script/local/CreatePath.py
hangjin2020 a2679f0cf7 om仓迁移
2020-12-16 17:25:24 +08:00

176 lines
5.2 KiB
Python

#!/usr/bin/env python3
# -*- 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.
# ----------------------------------------------------------------------------
# Description : CreatePath.py is a utility to create new path.
#############################################################################
import getopt
import sys
import os
import subprocess
import pwd
import grp
sys.path.append(sys.path[0] + "/../")
from gspylib.common.ErrorCode import ErrorCode
from gspylib.common.ParameterParsecheck import Parameter
from gspylib.common.Common import DefaultValue
g_user = ""
g_newPath = ""
def exitWithRetCode(retCode, msg=""):
"""
exit with retcode message
"""
if (msg != ""):
print(msg)
sys.exit(retCode)
def usage():
"""
Usage:
python3 CreatePath.py -U user -P newpath
Common options:
-U the user of old cluster
-P the new path need to be created
--help show this help, then exit
"""
print(usage.__doc__)
def parseCommandLine():
"""
function: Check parameter from command line
input : NA
output: NA
"""
try:
opts, args = getopt.getopt(sys.argv[1:], "U:P:h", ["help"])
except Exception as e:
usage()
exitWithRetCode(1, ErrorCode.GAUSS_500["GAUSS_50000"] % str(e))
if (len(args) > 0):
exitWithRetCode(1, ErrorCode.GAUSS_500["GAUSS_50000"] % str(args[0]))
global g_user
global g_newPath
for (key, value) in opts:
if (key == "--help" or key == "-h"):
usage()
exitWithRetCode(0)
elif (key == "-U"):
g_user = value
elif (key == "-P"):
g_newPath = value
else:
exitWithRetCode(1, ErrorCode.GAUSS_500["GAUSS_50000"] % key)
Parameter.checkParaVaild(key, value)
if (g_user == ""):
exitWithRetCode(1, ErrorCode.GAUSS_500["GAUSS_50001"] % 'U' + ".")
if (g_newPath == ""):
exitWithRetCode(1, ErrorCode.GAUSS_500["GAUSS_50001"] % 'P' + ".")
if (not os.path.isabs(g_newPath)):
exitWithRetCode(1, ErrorCode.GAUSS_502["GAUSS_50213"] % g_newPath)
g_newPath = os.path.normpath(g_newPath)
def getTopPathNotExist(topDirPath):
"""
function: find the top path to be created
output: tmpDir
"""
tmpDir = topDirPath
while True:
# find the top path to be created
(tmpDir, topDirName) = os.path.split(tmpDir)
if (os.path.exists(tmpDir) or topDirName == ""):
tmpDir = os.path.join(tmpDir, topDirName)
break
return tmpDir
def createPathUnderRoot(newPath, user):
"""
create path using root user
this function only can be called by root, and user should be exist
input : newPath, user
output: NA
"""
# get group information
try:
DefaultValue.getUserId(user)
except Exception as e:
exitWithRetCode(1, str(e))
groupInfo = grp.getgrgid(pwd.getpwnam(user).pw_gid).gr_name
# check and create new path
ownerPath = newPath
newPathExistAlready = True
if (not os.path.exists(ownerPath)):
newPathExistAlready = False
ownerPath = getTopPathNotExist(ownerPath)
# create newPath
cmd = "(if [ ! -d '%s' ]; then mkdir -p '%s' -m %s;fi)" \
% (newPath, newPath, DefaultValue.KEY_DIRECTORY_MODE)
(status, output) = subprocess.getstatusoutput(cmd)
if (status != 0):
msg = "Cmd:%s\noutput:%s" % (cmd, output)
exitWithRetCode(1, msg)
# give permissions to the directory ownerPath
if not newPathExistAlready:
cmd = "chown -R %s:%s '%s' && chmod -R %s '%s'" \
% (user, groupInfo, ownerPath,
DefaultValue.KEY_DIRECTORY_MODE, ownerPath)
else:
cmd = "chown %s:%s '%s' && chmod %s '%s'" \
% (user, groupInfo, ownerPath,
DefaultValue.KEY_DIRECTORY_MODE, ownerPath)
(status, output) = subprocess.getstatusoutput(cmd)
if (status != 0):
msg = "Cmd:%s\noutput:%s" % (cmd, output)
exitWithRetCode(1, msg)
# check enter permission
cmd = "su - %s -c 'cd %s'" % (user, newPath)
(status, output) = subprocess.getstatusoutput(cmd)
if (status != 0):
msg = "Cmd:%s\noutput:%s" % (cmd, output)
exitWithRetCode(1, msg)
# create new path succeed, return 0
exitWithRetCode(0, "Successfully created new path.")
if __name__ == '__main__':
"""
main function
"""
# check precondition
if (os.getuid() != 0):
exitWithRetCode(1, ErrorCode.GAUSS_501["GAUSS_50104"])
try:
parseCommandLine()
createPathUnderRoot(g_newPath, g_user)
except Exception as e:
exitWithRetCode(1, str(e))