A key installation 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
OS Import
import re
JSON Import 
# hidden portion inside the calling module 
Import Threading 
Import Time 

IF sys.platform.startswith ( 'win'): 
    # system is Windows 
    the SYSTEM = "Windows" 
    MAIN_DIR = 'Apache-ActiveMQ-5.13.1' 
    JDK_DIR = "jdk1.8.0 _91 " 
    JDKPKG = 'jdk1.8.0_91.zip' 
    base_dir = 'C: \\' 
    the PKG_PATH = 'C: \\' 
    the X86 = platform.architecture () [0] 

the else: 
    # system is not Windows 
    the 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' 
    the 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) 

        # use precompiled package 
        _send_message (U '. 1} {0} { . {2} 'format (U "Start install in", the SYSTEM, U "System"), jid jid =) 

        # determine whether the service already exists and is running 
        iF the SYSTEM == "Windows": 
            # if the update, you may need to change service name 
            OUT = __salt __ [ 'service.status'] ( "ActiveMQ") 
        the 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'} 
        if dependPkg not in ([],
        # decompression dependencies

        Jdk_dir = JDK_DIR
            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}\n'.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 (parameter)} 
        Basedir = baseDir.rstrip (os.sep)
        rune = execAccount
        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)}

  

Guess you like

Origin www.cnblogs.com/slqt/p/10948013.html