zoukankan      html  css  js  c++  java
  • 一键安装activemq

    # -*- coding: utf-8 -*-
    """
    Support for Activemq
    
    This module uses the manager webapp to manage Activemq.
    If the manager Activemq is not configured some of the functions won't work.
    :configuration:
        - Java bin path should be in default path
        - If ipv6 is enabled make sure you permit manager access to ipv6 interface
          "0:0:0:0:0:0:0:1"
        - If you are using tomcat.tar.gz it has to be installed or symlinked under
          ``/opt``, preferably using name Activemq
        - "tomcat.signal start/stop" works but it does not use the startup scripts
    """
    
    # Import python libs
    import platform
    import sys
    import subprocess
    import os
    import re
    import json
    #隐藏部分内部调用模块
    import threading
    import time
    
    if sys.platform.startswith('win'):
        # 系统为windows
        SYSTEM = "windows"
        MAIN_DIR = 'apache-activemq-5.13.1'
        JDK_DIR = "jdk1.8.0_91"
        JDKPKG = 'jdk1.8.0_91.zip'
        BASE_DIR = 'C:\'
        PKG_PATH = 'C:\'
        X86 = platform.architecture()[0]
    
    else:
        # 系统不是windows
        SYSTEM = "linux"
        MAIN_DIR = 'apache-activemq-5.13.2'
        JDK_DIR = "jdk1.8.0_45"
        JDKPKG = 'jdk-8u45-linux-x64.gz'
        BASE_DIR = '/usr/local'
        PKG_PATH = '/usr/local'
        X86 = platform.architecture()[0]
    
    
    class InstallError(Exception):
        pass
    
    
    def get_java_success(java_home):
        out = utils_cmd.get_output(java_home + ' -v')
        utils.logger.info(java_home + ' -v')
        result = ''.join(out)
        utils.logger.info(result)
        invalid_msg = ['is valid', 'ERROR', 'not compatible']
        for i in invalid_msg:
            if not filter((lambda list_item: i in list_item), out) == []:
                raise InstallError('install java fail:{}'.format(result))
    
    
    def _send_message(message, jid=None):
        __salt__['exec_module.module_send_event'](message, jid=jid)
    
    
    def install(baseDir=None, port=None, package=None, dependPkg=None, jid=None,
                execAccount=None, outputParam=[], **kwargs):
        u"""
        :param activemq:activemq package name
        :param installDir:activemq install path
        :param pkg_dir:activemq package path
        :return:{"success": False, "message": message}
        """
        try:
            ret, param = utils_errors.check_inputs(locals(), outs=['dependPkg'])
            if not ret:
                return {'success': False, 'message': 'input params error,please check input params:{}'.format(param)}
            runas = execAccount
            main_path = baseDir.split(os.sep)[-1]
            # 参数预处理
            if SYSTEM == "windows" and baseDir.endswith(":"):
                baseDir = baseDir + '\'
            elif SYSTEM == "windows" and baseDir.endswith(":\"):
                pass
            else:
                baseDir = baseDir.rstrip(os.sep)
    
            # 使用已编译好的包
            _send_message(u'{0}{1}{2}'.format(u"start install in ", SYSTEM, u" system"), jid=jid)
    
            # 判断服务是否已存在且正在运行
            if SYSTEM == "windows":
                # 若更新,可能需要更改服务名称
                out = __salt__['service.status']("activemq")
            else:
                out = __salt__['ps.pgrep']("activemq")
            if out:
                return {"success": False, "message": u"activemq has been installed and is running,please stop first"}
    
            if not package:
                return {"success": False, "message": u'activemq install fail,package param is null,please read the log!'}
    
            # 解压主包
            if SYSTEM == "windows":
                activemq_home = utils_pack.install_pkgs(package[0], baseDir)
            else:
                activemq_home = utils_pack.unpack_tar(package[0], baseDir, path=main_path)
            if os.path.isdir(activemq_home) and len(os.listdir(activemq_home)) != 0:
                _send_message(u"activemq unpack success.installation progress:30%.", jid=jid)
                utils.logger.info('activemq_path:{}'.format(activemq_home))
            else:
                return {"success": False, "message": 'activemq install fail,unpack main package fail'}
    
            jdk_dir = JDK_DIR
            # 解压依赖包
            if dependPkg not in ([], None, ''):
                for dependPkg_item in dependPkg:
                    package_name = dependPkg_item.split(os.sep)[-1]
    
                    if not dependPkg_item.endswith('.exe'):
                        file_path = utils_pack.unpack_tar(dependPkg_item, baseDir, path=package_name)
                        if 'jdk' in file_path or 'java' in file_path:
                            jdk_dir = file_path
                        if os.path.isdir(file_path) and len(os.listdir(file_path)) != 0:
                            _send_message(u"{0}install success".format(package_name), jid=jid)
                        else:
                            return {"success": False,
                                    "message": 'activemq install fail,{} unpack fail'.format(package_name)}
                    elif dependPkg_item.endswith('.exe') and platform.platform() >= 'Windows-7':
                        install_dir = os.path.join(baseDir, package_name)
                        cmd = '{0} /s INSTALLDIR={1} INSTALL_SILENT=Enable'.format(dependPkg_item,
                                                                                   install_dir)
                        utils.logger.info('install java:{}'.format(cmd))
                        if runas:
                            cmd = 'sudo -u {} "{}"'.format(runas, cmd)
                        out = __salt__['cmd.run_stdout'](cmd, cwd=baseDir,
                                                         python_shell=False).splitlines()
    
                        while 1:
                            if os.path.exists(install_dir):
                                break
                    else:
                        install_dir = os.path.join(baseDir, package_name)
                        cmd = '{0} /s INSTALLDIR={1} INSTALL_SILENT=Enable /L C:setup.log'.format(
                            dependPkg_item,
                            install_dir)
                        utils.logger.info('install java:{}'.format(cmd))
                        try:
                            if runas:
                                cmd = 'sudo -u {} "{}"'.format(runas, cmd)
                            p = subprocess.Popen(cmd, cwd=baseDir, shell=False)
                            p.wait()
                        except Exception as e:
                            utils.logger.info('{}'.format(e))
                            pass
                        start_time = time.time()
                        while 1:
                            if os.path.exists(install_dir):
                                utils.logger.info(u'java is installing...')
                                break
                            if time.time() - start_time > 1000000:
                                raise InstallError(u'java install fail')
    
                        start_time = time.time()
                        while 1:
                            with open('C:\setup.log') as f:
                                f.seek(0, 1)
                                if '=== Logging stopped:' in f.readline():
                                    utils.logger.info(f.readline())
                                    break
    
                            if time.time() - start_time > 10000:
                                raise InstallError(u'java install fail')
    
            utils.logger.info(u'unpack dependency packages success')
            _send_message(u"unpack dependency packages success.installation progress:90%", jid=jid)
            # add Jdk path into Activemq environment variables
            if SYSTEM == "windows":
                # add activemq service
                win_doc = os.path.join(baseDir, MAIN_DIR,
                                       "bin\{0}".format("win32" if '32' in X86 else "win64"))
                java_home = os.path.join(baseDir, JDK_DIR, "bin", "java")
                get_java_success(java_home)
    
                __salt__['file.replace'](win_doc + "\wrapper.conf", '^wrapper.java.command=java',
                                         'wrapper.java.command=' + java_home.replace("\", "/"))
                cmd = win_doc + "\InstallService.bat"
                result = utils_cmd.get_output(cmd, runas=runas)
            else:
                activemq_bin_home = '{0}/bin/activemq'.format(activemq_home)
                java_home = 'JAVA_HOME={0}
    '.format(jdk_dir)
                get_java_success(java_home)
                out = __salt__['file.prepend'](activemq_bin_home, java_home)
            install_path = json.dumps({'install_path': activemq_home})
            return {"success": True, "message": u'activemq install success', 'outputParam': install_path}
        except Exception as e:
            return {"success": False, "message": "{0}".format(e)}
        finally:
            if os.path.exists('C:\setup.log'):
                os.remove('C:\setup.log')
    
    
    def start(baseDir=BASE_DIR, jid=None, execAccount=None, outputParam=[], **kwargs):
        try:
            ret, param = utils_errors.check_inputs(locals())
            if not ret:
                return {'success': False, 'message': 'input params error,please check input params:{}'.format(param)}
            runas = execAccount
            baseDir = baseDir.rstrip(os.sep)
            cwd = os.path.join(baseDir, 'bin')
            if not os.path.exists(cwd):
                cwd = os.path.join(baseDir, MAIN_DIR, 'bin')
            if not os.path.exists(cwd):
                return {'success': False, "message": 'no activemq execfile in {} directory,please input again'.format(baseDir)}
    
            utils.logger.info('activemq directory:{}'.format(cwd))
            if SYSTEM == "windows":
                __salt__['service.start']("ActiveMQ")
                out = __salt__['service.status']("ActiveMQ")
            else:
                result = ""
                cmd = "sh activemq start"
                req_cmd = "sh activemq status"
                # 运行bat文件启动
                i = 0
                while i <= 1000:
                    i += 1
                    result = utils_cmd.get_output(cmd, cwd=cwd, wait=True, runas=runas)
                    out = not filter(
                        (lambda list_item: "ActiveMQ is running" in list_item), result) == []
                    if out:
                        break
                    out = os.path.exists(
                        '{0}/data/activemq.pid'.format(cwd.rstrip('bin')))
                    if out:
                        break
            if out:
                message = utils.make_msg(u"Activemq start success")
                return {"success": True, "message": message}
            else:
                message = utils.make_msg(u"Activemq start fail", other_msg=str(result))
                return {"success": False, "message": message}
        except Exception as e:
            return {"success": False, "message": 'Activemq start fail:{}'.format(e)}
    
    
    def stop(baseDir=BASE_DIR, jid=None, execAccount=None, outputParam=[], **kwargs):
        try:
            ret, param = utils_errors.check_inputs(locals())
            if not ret:
                return {'success': False, 'message': 'input params error,please check input params:{}'.format(param)}
            runas = execAccount
            baseDir = baseDir.rstrip(os.sep)
            path = os.path.join(baseDir, 'bin/activemq')
            if not os.path.exists(path):
                path = os.path.join(baseDir, MAIN_DIR, 'bin/activemq')
            if not os.path.exists(path):
                return {'success': False, "message": 'no activemq execfile in {} directory,please input again'.format(baseDir)}
            out, result = __salt__['exec_module.manageService'](SYSTEM, 'activemq', 'service.stop',
                                                                'activemq',
                                                                'sh {0} stop'.format(path))
    
            if SYSTEM == "windows":
                __salt__['service.stop']("ActiveMQ")
                out = not __salt__['service.status']("ActiveMQ")
            else:
                result, message = __salt__['exec_module.manageService'](SYSTEM, 'activemq',
                                                                        'service.stop',
                                                                        'activemq',
                                                                        'sh {0} stop'.format(path))
    
                i = 0
                cwd = path.rstrip('activemq')
                while i <= 1000:
                    i += 1
                    p = subprocess.Popen("sh activemq status", shell=True,
                                         cwd=cwd,
                                         stdout=subprocess.PIPE,
                                         stderr=subprocess.PIPE, stdin=None)
                    result = p.stdout.readlines()
                    out = not filter(
                        (lambda list_item: "ActiveMQ not running" in list_item), result) == []
                    if out:
                        break
                    out = not os.path.exists('{0}/data/activemq.pid'.format(cwd))
                    if out:
                        break
    
            if out:
                message = utils.make_msg(u'Activemq stop success!')
                return {"success": True, "message": message}
            else:
                message = utils.make_msg(u'Activemq stop fail,error message:', other_msg=str(result))
                return {"success": False, "message": message}
        except Exception as e:
            return {"success": False, "message": 'Activemq stop fail,error message:{}'.format(e)}
    
    
    def restart(baseDir=BASE_DIR, jid=None, outputParam=[],
                execAccount=None, **kwargs):
        baseDir = baseDir.rstrip(os.sep)
    
        try:
            ret, param = utils_errors.check_inputs(locals())
            if not ret:
                return {'success': False, 'message': 'input params error,please check input params:{}'.format(param)}
    
            runas = execAccount
            if not os.path.exists(baseDir):
                return {'success': False, "message": 'no activemq execfile in {} directory,please input again'.format(baseDir)}
    
            if SYSTEM == "windows":
                __salt__['service.restart']("ActiveMQ")
                out = __salt__['service.status']("ActiveMQ")
                if out:
                    message = utils.make_msg(u"Activemq restart success")
                    return {"success": True, "message": message}
                else:
                    message = utils.make_msg(u"Activemq restart fail")
                    return {"success": False, "message": message}
            else:
                cwd = '{0}/bin'.format(baseDir)
                if not os.path.exists(cwd):
                    cwd = '{0}/{1}/bin'.format(baseDir, MAIN_DIR)
                result = utils_cmd.get_output("sh activemq status",
                                              cwd=cwd,
                                              wait=True, runas=runas)
                out = not filter(
                    (lambda list_item: "ActiveMQ is running" in list_item), result) == []
    
                utils.logger.info('restart:{}'.format(out))
                if not out:
                    message = utils.make_msg(u"Activemq is not running,try to start")
                    result = start(baseDir=baseDir, jid=jid)
                    message = utils.make_msg(result["message"])
                    if result["success"]:
                        return {"success": True, "message": u"Activemq restart success"}
                    else:
                        return {"success": False, "message": u"Activemq restart fail, but service has stop"}
                else:
                    result = stop(baseDir=baseDir, jid=jid)
                    utils.logger.info('stop:{}'.format(result))
                    if not result["success"]:
                        return {"success": False, "message": u"Activemq restart fail,stop service fail"}
    
                out = start(baseDir=baseDir, jid=jid)
                utils.logger.info('start:{}'.format(out))
                if out["success"]:
                    return {"success": True, "message": u"Activemq restart success"}
                else:
                    return {"success": False, "message": u"Activemq restart fail,start fail"}
        except Exception as e:
            return {"success": False, "message": "Activemq restart fail:{}".format(e)}
    

      

  • 相关阅读:
    LeetCode 64. 最小路径和
    LeetCode 344. 反转字符串
    LeetCode 162. 寻找峰值
    LeetCode 227. 基本计算器 II
    LeetCode 232. 用栈实现队列
    LeetCode 160. 相交链表
    LeetCode 112. 路径总和
    谈谈反作弊风控的实践经验
    LeetCode 704. 二分查找
    Hive SQL rank()/dense_rank()/row_number()的区别
  • 原文地址:https://www.cnblogs.com/slqt/p/10948013.html
Copyright © 2011-2022 走看看