diff --git a/pom.xml b/pom.xml index c296dd5..1c46c8f 100644 --- a/pom.xml +++ b/pom.xml @@ -35,6 +35,17 @@ https://github.com/CMIPT 8 + + ajiankexx + ajianke2@gmail.com + https://github.com/ajiankexx + + Developer + + CMIPT + https://github.com/CMIPT + 8 + diff --git a/script/deploy_helper.py b/script/deploy_helper.py index 3a697d8..4d05ed6 100644 --- a/script/deploy_helper.py +++ b/script/deploy_helper.py @@ -10,6 +10,33 @@ from types import SimpleNamespace import os import subprocess +import logging +import inspect + + +def setup_logger(log_level=logging.INFO): + """ + Configure the global logging system. + + :param log_level: Set the logging level, defaulting to INFO. + """ + logging.basicConfig(level=log_level, + format='%(asctime)s -%(levelname)s- in %(pathname)s:%(caller_lineno)d: %(message)s', + datefmt='%Y-%m-%d %H:%M:%S') + + +def command_checker(status_code: int, message: str, expected_code: int = 0): + """ + Check if the command execution status code meets the expected value. + + :param status_code: The actual status code of the command execution. + :param message: The log message to be recorded. + :param expected_code: The expected status code, defaulting to 0. + """ + if status_code != expected_code: + caller_frame = inspect.currentframe().f_back + logging.error(message, extra={'caller_lineno': caller_frame.f_lineno}) + exit(status_code) # open config_path and default_config_path @@ -63,10 +90,10 @@ def create_systemd_service(config): [Install] WantedBy={wanted_by} """ - res = os.system( - f'echo "{gcs_file_content}" | sudo tee {service_full_path}') - if res != 0: - exit(res) + command = f'echo "{gcs_file_content}" | sudo tee {service_full_path}' + res = os.system(command) + message = message_tmp.format(command, res) + command_checker(res, message) # TODO: add checker to check @@ -81,15 +108,22 @@ def deploy_on_ubuntu(config): if res.returncode != 0: return res.returncode package_path = res.stdout.strip() - res = os.system(f'mvn package {skip_test}') - if res != 0: - return res + command = f'mvn package {skip_test}' + res = os.system(command) + message = message_tmp.format(command, res) + command_checker(res, message) if config.deploy: if os.system(f"cat /etc/passwd | grep -w -E '^{config.serviceUser}'") != 0: - os.system(f'sudo useradd {config.serviceUser}') + command = f'sudo useradd {config.serviceUser}' + res = os.system(command) + message = message_tmp.format(command, res) + command_checker(res, message) if config.serviceUserPassword == None or config.serviceUserPassword == "": - os.system(f'sudo passwd -d {config.serviceUser}') + command =f'sudo passwd -d {config.serviceUser}' + res = os.system(command) + message = message_tmp.format(command, res) + command_checker(res, message) else: process = subprocess.Popen(['sudo', 'chpasswd'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) @@ -99,46 +133,84 @@ def deploy_on_ubuntu(config): process.communicate() if not os.path.exists(os.path.dirname(config.serviceStartJarFile)): - os.system(f'sudo mkdir -p {os.path.dirname(config.serviceStartJarFile)}') - res = os.system(f'sudo cp {package_path} {config.serviceStartJarFile}') - if res != 0: - return res + command = f'sudo mkdir -p {os.path.dirname(config.serviceStartJarFile)}' + res = os.system(command) + message = message_tmp.format(command, res) + command_checker(res, message) + command = f'sudo cp {package_path} {config.serviceStartJarFile}' + res = os.system(command) + message = message_tmp.format(command, res) + command_checker(res, message) create_systemd_service(config) if config.serviceEnable: - res = os.system(f'sudo systemctl enable {config.serviceName}') - if res != 0: - return res + command = f'sudo systemctl enable {config.serviceName}' + res = os.system(command) + message = message_tmp.format(command, res) + command_checker(res, message) else: - res = os.system(f'sudo systemctl disable {config.serviceName}') - if res != 0: - return res - res = os.system(f'sudo systemctl start {config.serviceName}') - if res != 0: - return res + command = f'sudo systemctl disable {config.serviceName}' + res = os.system(command) + message = message_tmp.format(command, res) + command_checker(res, message) + command = f'sudo systemctl start {config.serviceName}' + res = os.system(command) + message = message_tmp.format(command, res) + command_checker(res, message) # TODO: finish deploy on docker # TODO: add checker to check def clean(config): - os.system(f'sudo systemctl disable {config.serviceName}') - os.system(f'sudo systemctl stop {config.serviceName}') + command = f'sudo systemctl disable {config.serviceName}' + res = os.system(command) + message = message_tmp.format(command, res) + command_checker(res, message) + command = f'sudo systemctl stop {config.serviceName}' + res = os.system(command) + message = message_tmp.format(command, res) + command_checker(res, message) if os.path.exists(f'/etc/systemd/system/{config.serviceName}.{config.serviceSuffix}'): - os.system( - f'sudo rm -rf /etc/systemd/system/{config.serviceName}.{config.serviceSuffix} && ' - f'sudo systemctl daemon-reload') - os.system(f'sudo systemctl reset-failed {config.serviceName}') + command = f'''sudo rm -rf /etc/systemd/system/{config.serviceName}.{config.serviceSuffix} && \\ + sudo systemctl daemon-reload''' + res = os.system(command) + message = message_tmp.format(command, res) + command_checker(res, message) + command = f'sudo systemctl reset-failed {config.serviceName}' + res = os.system(command) + message = message_tmp.format(command, res) + command_checker(res, message) if os.path.exists(f'{config.serviceWorkingDirectory}'): - os.system(f'sudo rm -rf {config.serviceWorkingDirectory}') + command = f'sudo rm -rf {config.serviceWorkingDirectory}' + res = os.system(command) + message = message_tmp.format(command, res) + command_checker(res, message) if os.path.exists(f'{config.serviceStartJarFile}'): - os.system(f'sudo rm -rf {config.serviceStartJarFile}') + command = f'sudo rm -rf {config.serviceStartJarFile}' + res = os.system(command) + message = message_tmp.format(command, res) + command_checker(res, message) if os.path.exists(f'{config.servicePIDFile}'): - os.system(f'sudo rm -rf {config.servicePIDFile}') + command = f'sudo rm -rf {config.servicePIDFile}' + res = os.system(command) + message = message_tmp.format(command, res) + command_checker(res, message) if os.system(f"cat /etc/passwd | grep -w -E '^{config.serviceUser}'") == 0: - os.system(f'sudo userdel {config.serviceUser}') - os.system(f'mvn clean') + command = f'sudo userdel {config.serviceUser}' + res = os.system(command) + message = message_tmp.format(command, res) + command_checker(res, message) + command = f'mvn clean' + res = os.system(command) + message = message_tmp.format(command, res) + command_checker(res, message) if __name__ == "__main__": + message_tmp = '''\ +The command below failed: + {0} +Expected status code 0, got status code {1} +''' parser = argparse.ArgumentParser( description="Deploy the project when the environment is ready.") parser.add_argument('--config-path', nargs='?', default='../config.json', @@ -148,7 +220,21 @@ def clean(config): parser.add_argument('--default-config-path', nargs='?', default='../config_default.json', type=str, help="Linux distribution") parser.add_argument('--clean', action='store_true', help="Clean up the project") + parser.add_argument('--log-level', nargs='?', default='INFO', + type=str, help=( + "Set the logging level. Possible values are: " + "'DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'. " + "Default is 'INFO'.\n" + "- DEBUG: Detailed information, typically of interest only when diagnosing problems.\n" + "- INFO: Confirmation that things are working as expected.\n" + "- WARNING: An indication that something unexpected happened, or indicative of some problem in the near future. The software is still working as expected.\n" + "- ERROR: Due to a more serious problem, the software has not been able to perform some function.\n" + "- CRITICAL: A very serious error, indicating that the program itself may be unable to continue running." + )) args = parser.parse_args() + if args.log_level.upper() not in logging._nameToLevel: + raise ValueError(f"Invalid log level: {args.log_level}") + setup_logger(getattr(logging, args.log_level.upper())) if args.clean: clean(load_config_file_as_obj(args.config_path, args.default_config_path)) elif args.distro == 'ubuntu':