• A Python Environment Detector


    The user provide the method to get result(command on remote host), the check standard(a callback function), and information about target host(ip and username), and a timeout of execution time optional, with the envdet module, you can get the result: if the command output obey the check standard.

    The application module, detapp.py:

    import logging
    
    from envdet import rcmd
    
    
    
    logger = logging.getLogger('DetectApp')
    
    logger.setLevel(logging.DEBUG)
    
    fh = logging.FileHandler('detect.log')
    
    fh.setLevel(logging.DEBUG)
    
    ch = logging.StreamHandler()
    
    ch.setLevel(logging.INFO)
    
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    
    ch.setFormatter(formatter)
    
    fh.setFormatter(formatter)
    
    logger.addHandler(ch)
    
    logger.addHandler(fh)
    
    
    
    
    
    def isOracleJDK(str):
    
        return 'Java(TM)' in str
    
    
    
    res = rcmd('bvt', '10.0.2.47', 'java -version', isOracleJDK)
    
    logger.info('Check result:%s' % res)
    

    The environment detection module, envdet.py:

    from subprocess import Popen, PIPE, STDOUT
    
    import signal
    
    import logging
    
    
    
    logger = logging.getLogger('DetectApp.envdet')
    
    
    
    def handler(signum, frame):
    
        logger.error('Signal handler called with signal: %d' % signum)
    
        raise IOError("Command execution timeout!")
    
    
    
    def rcmd(user, host, cmd, check_handler, timeout=10):
    
        signal.signal(signal.SIGALRM, handler)
    
        signal.alarm(timeout)
    
    
    
        cmdstr = "ssh %s@%s 'source /etc/profile;%s'" % (user, host, cmd)
    
    
    
        p = Popen(cmdstr, close_fds=True, shell=True, stdout=PIPE, stderr=STDOUT)
    
    
    
        fullres = line = ''
    
        while p.poll() is None:
    
            out = p.stdout.read(1)
    
            fullres = fullres + out
    
            if out=='
    ':
    
                logger.debug(line)
    
                line = ''
    
            else:
    
                line = line + out
    
        logger.debug('----ret of cmd %s is: %d----' % (cmd, p.returncode))
    
        return check_handler(fullres)
    

    The technical points here are:

    • Run shell command in Python and retrieve output and return code;

    • Use signal to limit the overall running time of commands on remote host over SSH;

    • The logging utility across multiple modules, notice the naming rules: .. So if you rename the module name, rename it's logger accordingly.

  • 相关阅读:
    Spring学习笔记(二)----Spring IOC
    LeetCode----正则表达式匹配「动态规划」
    Markdown----一款轻量级标记语言
    LeetCode----最长回文子串「动态规划」
    数据结构(六)
    数据结构(五)
    HDOJ3613解题报告【拓展KMP】
    HDOJ1358解题报告【KMP算法next数组的使用】
    POJ1990解题报告【树状数组】
    HDOJ1507解题报告【二分图染色】
  • 原文地址:https://www.cnblogs.com/darkmatter/p/3631303.html
Copyright © 2020-2023  润新知