blob: c2aabb26a27a7062c6b7dabbe8d7975d61f3a792 [file] [log] [blame]
"""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