Files
openGauss-OM/script/gs_backup
coolany eae422baf3 适配CM组件
Signed-off-by: coolany <kyosang@163.com>

support cgroup

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

243 lines
8.7 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 : gs_backup is a utility to back up or restore binary files and parameter files.
#############################################################################
import os
import sys
import pwd
from gspylib.common.GaussLog import GaussLog
from gspylib.common.Common import DefaultValue
from gspylib.common.ParallelBaseOM import ParallelBaseOM
from gspylib.common.ErrorCode import ErrorCode
from gspylib.common.ParameterParsecheck import Parameter
from impl.backup.OLAP.BackupImplOLAP import BackupImplOLAP
from domain_utils.cluster_file.cluster_log import ClusterLog
from domain_utils.domain_common.cluster_constants import ClusterConstants
from domain_utils.cluster_os.cluster_user import ClusterUser
ACTION_BACKUP = "backup"
ACTION_RESTORE = "restore"
class Backup(ParallelBaseOM):
'''
classdocs
input : NA
output: NA
'''
def __init__(self):
'''
function: Constructor
input : NA
output: NA
'''
ParallelBaseOM.__init__(self)
self.nodename = ""
self.backupDir = ""
self.isParameter = False
self.isBinary = False
self.isForce = False
####################################################################################
# Help context. U:R:oC:v:
####################################################################################
def usage(self):
"""
gs_backup is a utility to back up or restore binary files and parameter files.
Usage:
gs_backup -? | --help
gs_backup -V | --version
gs_backup -t backup --backup-dir=BACKUPDIR [-h HOSTNAME] [--parameter]
[--binary] [--all] [-l LOGFILE]
gs_backup -t restore --backup-dir=BACKUPDIR [-h HOSTNAME] [--parameter]
[--binary] [--all] [-l LOGFILE]
[--force]
General options:
-t Operation type. It can be backup or restore.
--backup-dir=BACKUPDIR Backup or restore directory.
-h The node which stored the backup file,
need to specify the node when recovering.
If the node name is not specified,
the backup sets are stored in each node.
--parameter Back up or restore parameter files only.
(This option is used by default.)
--binary Back up or restore binary files only.
--all Back up or restore both parameter files and binary files.
--force Force to restore binary files even if the
cluster_static_config is lost
-l Path of log file.
-?, --help Show help information for this utility,
and exit the command line mode.
-V, --version Show version information.
"""
print(self.usage.__doc__)
def checkAction(self):
"""
function: check action
if action not in (ACTION_BACKUP, ACTION_RESTORE), throw error
input : NA
output: NA
"""
if (self.action == ""):
GaussLog.exitWithError(
ErrorCode.GAUSS_500["GAUSS_50001"] % 't' + ".")
if self.action not in (ACTION_BACKUP, ACTION_RESTORE):
GaussLog.exitWithError(ErrorCode.GAUSS_500["GAUSS_50004"] % 't'
+ " The value of the '-t' parameter :"
" backup or restore.")
def checkUserParameter(self):
"""
function: check User Parameter
if clusterUser is null, check user name
if user name is null, throw error
input : NA
output: NA
"""
if (self.user == ""):
self.user = pwd.getpwuid(os.getuid()).pw_name
if (self.user == ""):
GaussLog.exitWithError(
ErrorCode.GAUSS_500["GAUSS_50001"] % 'U' + ".")
# check if user exist and is the right user
ClusterUser.checkUser(self.user)
def checkBackupPara(self):
"""
function: check Backup Parameter
if backupDir is null throw error
if backupDir is not absolute throw error
input : NA
output: NA
"""
if (self.backupDir == ""):
GaussLog.exitWithError(
ErrorCode.GAUSS_500["GAUSS_50001"] % '-backup-dir' + ".")
if (not os.path.isabs(self.backupDir)):
GaussLog.exitWithError(
ErrorCode.GAUSS_502["GAUSS_50213"] % self.backupDir)
def parseCommandLine(self):
"""
function: Parse command line and save to global variable
input : NA
output: NA
"""
ParaObj = Parameter()
# get the dict of paramters
ParaDict = ParaObj.ParameterCommandLine("backup")
# check if has '--help'
if (ParaDict.__contains__("helpFlag")):
self.usage()
sys.exit(0)
# parse --all parameter
backupAll = False
forceRestore = False
parameter_map = {"action": self.action,
"backupDir": self.backupDir,
"isBinary": self.isBinary,
"isParameter": self.isParameter,
"logFile": self.logFile,
"all": backupAll,
"force": forceRestore}
parameter_keys = parameter_map.keys()
for key in parameter_keys:
if (ParaDict.__contains__(key)):
parameter_map[key] = ParaDict.get(key)
self.action = parameter_map["action"]
self.backupDir = parameter_map["backupDir"]
self.isBinary = parameter_map["isBinary"]
self.isParameter = parameter_map["isParameter"]
self.logFile = parameter_map["logFile"]
self.isForce = parameter_map["force"]
if (parameter_map["all"]):
self.isBinary = True
self.isParameter = True
if (ParaDict.__contains__("nodename")):
nodename = ParaDict.get("nodename")
if (len(nodename) != 1):
GaussLog.exitWithError(
ErrorCode.GAUSS_500["GAUSS_50004"] % "h" + \
" The number of node must be equal 1. Please check it.")
self.nodename = nodename[0]
def checkParameter(self):
"""
function: Check parameter from command line
input : NA
output: NA
"""
self.checkAction()
# check if user exist and is the right user
self.checkUserParameter()
self.logFile = ClusterLog.checkLogFile(self.logFile, self.user, "",
ClusterConstants.GS_BACKUP_LOG_FILE)
# check backupDir
self.checkBackupPara()
# check backup context parameter
if (self.isParameter == False and self.isBinary == False):
GaussLog.printMessage("Hint:Parameters '--parameter','--binary',"
"and '--all' were not specified." +
" Only parameter files will be backed up.")
self.isParameter = True
if __name__ == '__main__':
"""
function: main
input : NA
output: NA
"""
# check if is root user
if (os.getuid() == 0):
GaussLog.exitWithError(ErrorCode.GAUSS_501["GAUSS_50105"])
try:
# Objectize class
backupObj = Backup()
# Initialize self and Parse command line and save to global variable
backupObj.parseCommandLine()
# check the parameters is not OK
backupObj.checkParameter()
# set action flag file
DefaultValue.setActionFlagFile("gs_backup")
# get clustet Type
impl = BackupImplOLAP(backupObj)
impl.run()
except Exception as e:
GaussLog.exitWithError(str(e))
finally:
DefaultValue.setActionFlagFile("gs_backup", False)
sys.exit(0)