ansible/callbacks/logformatter.py (54 lines of code) (raw):

"""Python callback for highlighting Ansible logs. /* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ """ from __future__ import (absolute_import, division, print_function) import os import sys import textwrap from ansible.plugins.callback import CallbackBase __metaclass__ = type class CallbackModule(CallbackBase): """.""" def __init__(self): """Initialize superclass.""" super(CallbackModule, self).__init__() def emit(self, host, category, data): """Emit colorized output based upon data contents.""" if type(data) == dict: cmd = data['cmd'] if 'cmd' in data else None msg = data['msg'] if 'msg' in data else None stdout = data['stdout'] if 'stdout' in data else None stderr = data['stderr'] if 'stderr' in data else None reason = data['reason'] if 'reason' in data else None print() if cmd: print(hilite('[%s]\n> %s' % (category, cmd), category, wrap = False)) if reason: print(hilite(reason, category)) if msg: print(hilite(msg, category)) if stdout: print(hilite(stdout, category)) if stderr: print(hilite(stderr, category)) def runner_on_failed(self, host, res, ignore_errors=False): self.emit(host, 'FAILED', res) def runner_on_ok(self, host, res): pass def runner_on_skipped(self, host, item=None): self.emit(host, 'SKIPPED', '...') def runner_on_unreachable(self, host, res): self.emit(host, 'UNREACHABLE', res) def runner_on_async_failed(self, host, res, jid): self.emit(host, 'FAILED', res) def hilite(msg, status, wrap = True): """Highlight message.""" def supports_color(): if ((sys.platform != 'win32' or 'ANSICON' in os.environ) and sys.stdout.isatty()): return True else: return False if supports_color(): attr = [] if status == 'FAILED': # red attr.append('31') else: # bold attr.append('1') text = '\x1b[%sm%s\x1b[0m' % (';'.join(attr), msg) else: text = msg return textwrap.fill(text, 80) if wrap else text