|
|
|
#!/usr/bin/env python
|
|
|
|
# -*-coding:utf-8 -*-
|
|
|
|
|
|
|
|
import sys
|
|
|
|
import os
|
|
|
|
import json
|
|
|
|
import shutil
|
|
|
|
import traceback
|
|
|
|
import logging
|
|
|
|
from appManager.module.global_api import ComponentHelper
|
|
|
|
from appsUtils.confutil import ConfUtil
|
|
|
|
|
|
|
|
|
|
|
|
BASE_PATH = os.path.split(os.path.realpath(__file__))[0]
|
|
|
|
DSTPATH = sys.argv[1]
|
|
|
|
ISUPDATE = sys.argv[2]
|
|
|
|
CUR_PATH = os.path.normpath(os.path.dirname(os.path.abspath(__file__)))
|
|
|
|
APP_NAME = 'uebaMetricsAnalysis'
|
|
|
|
|
|
|
|
def get_logger(logger_name=APP_NAME, logger_level=logging.INFO):
|
|
|
|
"""日志"""
|
|
|
|
import logging.handlers
|
|
|
|
logger = logging.getLogger(logger_name)
|
|
|
|
formatter = logging.Formatter(
|
|
|
|
'%(asctime)s %(levelname)s %(filename)s %(funcName)s:%(lineno)d %(message)s')
|
|
|
|
logger.setLevel(logger_level)
|
|
|
|
logger_file = os.path.normpath(os.path.join('/home/master', 'logs'))
|
|
|
|
if not os.path.exists(logger_file):
|
|
|
|
os.mkdir(logger_file)
|
|
|
|
if not logger.handlers:
|
|
|
|
file_handler = logging.handlers.TimedRotatingFileHandler(
|
|
|
|
os.path.normpath(logger_file + os.sep + logger_name + '.log'), 'midnight')
|
|
|
|
file_handler.suffix = "%Y-%m-%d"
|
|
|
|
file_handler.setLevel(logger_level)
|
|
|
|
file_handler.setFormatter(formatter)
|
|
|
|
logger.addHandler(file_handler)
|
|
|
|
return logger
|
|
|
|
|
|
|
|
|
|
|
|
logger = get_logger("uebaMetricsAnalysis")
|
|
|
|
|
|
|
|
|
|
|
|
def installDBSchema(exec_sql):
|
|
|
|
try:
|
|
|
|
confutil = ConfUtil()
|
|
|
|
curPgConf = confutil.getPostgresqlConf()
|
|
|
|
sqlPath = os.path.join(CUR_PATH, APP_NAME, 'sql')
|
|
|
|
|
|
|
|
for sqlfile in exec_sql:
|
|
|
|
if sqlfile == "pg_update.sql":
|
|
|
|
continue
|
|
|
|
sqlPath = os.path.join(CUR_PATH, APP_NAME, 'sql', sqlfile)
|
|
|
|
cmd = 'psql -U %s %s<"%s"' % (curPgConf["username"], curPgConf["database"], sqlPath,)
|
|
|
|
logger.info(cmd)
|
|
|
|
r = os.popen(cmd)
|
|
|
|
logger.info(sqlfile + ' ' + str(r.readlines()))
|
|
|
|
logger.info('create schema successfully.')
|
|
|
|
except Exception as e:
|
|
|
|
logger.info(str(e))
|
|
|
|
|
|
|
|
def add_task():
|
|
|
|
# 组件批量注册任务
|
|
|
|
ch = ComponentHelper(APP_NAME)
|
|
|
|
logger.info("开始注册定时任务")
|
|
|
|
ch_ret = ch.add_task()
|
|
|
|
if ch_ret['status'] != 200:
|
|
|
|
logger.info('add task failed, reason is %s' % ch_ret['msg'])
|
|
|
|
else:
|
|
|
|
logger.info('add task successfully.')
|
|
|
|
logger.info("定时任务注册成功")
|
|
|
|
|
|
|
|
|
|
|
|
class Install():
|
|
|
|
def __init__(self):
|
|
|
|
self.app_name = self.__get_app_name()
|
|
|
|
|
|
|
|
def install(self):
|
|
|
|
try:
|
|
|
|
installDBSchema(["pg_struct.sql","pg_data.sql"])
|
|
|
|
add_task()
|
|
|
|
logger.info('>>>安装结束!!!')
|
|
|
|
except Exception as e:
|
|
|
|
logger.error("install failure! reason: %s" % traceback.format_exc())
|
|
|
|
self.install_rollback()
|
|
|
|
# 此处写自定义的状态码,如100
|
|
|
|
code = 100
|
|
|
|
sys.exit(code)
|
|
|
|
|
|
|
|
def upgrade(self):
|
|
|
|
try:
|
|
|
|
# 第一步,拷贝目录
|
|
|
|
shutil.rmtree(DSTPATH)
|
|
|
|
self.copy_files()
|
|
|
|
# 第二步,写自己升级的逻辑
|
|
|
|
except Exception as e:
|
|
|
|
logger.info(traceback.format_exc())
|
|
|
|
self.upgrade_rollback()
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
def copy_files(self):
|
|
|
|
src_path = os.path.join(CUR_PATH, self.app_name)
|
|
|
|
shutil.copytree(src_path, DSTPATH)
|
|
|
|
|
|
|
|
def install_rollback(self):
|
|
|
|
"""安装回滚操作"""
|
|
|
|
try:
|
|
|
|
logger.error("rollback app folder")
|
|
|
|
except Exception as e:
|
|
|
|
logger.error("roll back failed")
|
|
|
|
logger.error(traceback.format_exc())
|
|
|
|
|
|
|
|
def upgrade_rollback(self):
|
|
|
|
"""升级回滚操作"""
|
|
|
|
try:
|
|
|
|
logger.error("rollback app folder")
|
|
|
|
except Exception as e:
|
|
|
|
logger.error("roll back failed")
|
|
|
|
logger.error(traceback.format_exc())
|
|
|
|
|
|
|
|
def __get_app_name(self):
|
|
|
|
with open(os.path.join(CUR_PATH, list(os.walk(CUR_PATH))[0][1][0], "package.json"), "r+") as f:
|
|
|
|
pkgConfig = json.load(f)
|
|
|
|
return pkgConfig["name"]
|
|
|
|
|
|
|
|
|
|
|
|
def main():
|
|
|
|
try:
|
|
|
|
flag = sys.argv[2]
|
|
|
|
install_instance = Install()
|
|
|
|
if flag == '0':
|
|
|
|
logger.info("=" * 20 + "开始安装" + "=" * 20)
|
|
|
|
install_instance.install()
|
|
|
|
if flag == '1':
|
|
|
|
logger.info("=" * 20 + "开始升级" + "=" * 20)
|
|
|
|
install_instance.upgrade()
|
|
|
|
logger.info("main 执行完成")
|
|
|
|
sys.exit(0)
|
|
|
|
except Exception as e:
|
|
|
|
logger.info("install failure, reason: %s" % traceback.format_exc())
|
|
|
|
raise e
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
main()
|