|
|
|
@ -22,26 +22,26 @@ import sys
|
|
|
|
|
|
|
|
|
|
from ansible import constants as C
|
|
|
|
|
|
|
|
|
|
ANSIBLE_COLOR=True
|
|
|
|
|
ANSIBLE_COLOR = True
|
|
|
|
|
if C.ANSIBLE_NOCOLOR:
|
|
|
|
|
ANSIBLE_COLOR=False
|
|
|
|
|
ANSIBLE_COLOR = False
|
|
|
|
|
elif not hasattr(sys.stdout, 'isatty') or not sys.stdout.isatty():
|
|
|
|
|
ANSIBLE_COLOR=False
|
|
|
|
|
ANSIBLE_COLOR = False
|
|
|
|
|
else:
|
|
|
|
|
try:
|
|
|
|
|
import curses
|
|
|
|
|
curses.setupterm()
|
|
|
|
|
if curses.tigetnum('colors') < 0:
|
|
|
|
|
ANSIBLE_COLOR=False
|
|
|
|
|
ANSIBLE_COLOR = False
|
|
|
|
|
except ImportError:
|
|
|
|
|
# curses library was not found
|
|
|
|
|
pass
|
|
|
|
|
except curses.error:
|
|
|
|
|
# curses returns an error (e.g. could not find terminal)
|
|
|
|
|
ANSIBLE_COLOR=False
|
|
|
|
|
ANSIBLE_COLOR = False
|
|
|
|
|
|
|
|
|
|
if C.ANSIBLE_FORCE_COLOR:
|
|
|
|
|
ANSIBLE_COLOR=True
|
|
|
|
|
ANSIBLE_COLOR = True
|
|
|
|
|
|
|
|
|
|
# --- begin "pretty"
|
|
|
|
|
#
|
|
|
|
@ -55,18 +55,19 @@ if C.ANSIBLE_FORCE_COLOR:
|
|
|
|
|
# http://nezzen.net/2008/06/23/colored-text-in-python-using-ansi-escape-sequences/
|
|
|
|
|
|
|
|
|
|
codeCodes = {
|
|
|
|
|
'black': u'0;30', 'bright gray': u'0;37',
|
|
|
|
|
'blue': u'0;34', 'white': u'1;37',
|
|
|
|
|
'green': u'0;32', 'bright blue': u'1;34',
|
|
|
|
|
'cyan': u'0;36', 'bright green': u'1;32',
|
|
|
|
|
'red': u'0;31', 'bright cyan': u'1;36',
|
|
|
|
|
'purple': u'0;35', 'bright red': u'1;31',
|
|
|
|
|
'yellow': u'0;33', 'bright purple': u'1;35',
|
|
|
|
|
'dark gray': u'1;30', 'bright yellow': u'1;33',
|
|
|
|
|
'magenta': u'0;35', 'bright magenta': u'1;35',
|
|
|
|
|
'normal': u'0' ,
|
|
|
|
|
'black': u'0;30', 'bright gray': u'0;37',
|
|
|
|
|
'blue': u'0;34', 'white': u'1;37',
|
|
|
|
|
'green': u'0;32', 'bright blue': u'1;34',
|
|
|
|
|
'cyan': u'0;36', 'bright green': u'1;32',
|
|
|
|
|
'red': u'0;31', 'bright cyan': u'1;36',
|
|
|
|
|
'purple': u'0;35', 'bright red': u'1;31',
|
|
|
|
|
'yellow': u'0;33', 'bright purple': u'1;35',
|
|
|
|
|
'dark gray': u'1;30', 'bright yellow': u'1;33',
|
|
|
|
|
'magenta': u'0;35', 'bright magenta': u'1;35',
|
|
|
|
|
'normal': u'0',
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def parsecolor(color):
|
|
|
|
|
"""SGR parameter string for the specified color name."""
|
|
|
|
|
matches = re.match(r"color(?P<color>[0-9]+)"
|
|
|
|
@ -77,12 +78,13 @@ def parsecolor(color):
|
|
|
|
|
if matches.group('color'):
|
|
|
|
|
return u'38;5;%d' % int(matches.group('color'))
|
|
|
|
|
if matches.group('rgb'):
|
|
|
|
|
return u'38;5;%d' % (16 + 36 * int(matches.group('red'))
|
|
|
|
|
+ 6 * int(matches.group('green'))
|
|
|
|
|
+ int(matches.group('blue')))
|
|
|
|
|
return u'38;5;%d' % (16 + 36 * int(matches.group('red')) +
|
|
|
|
|
6 * int(matches.group('green')) +
|
|
|
|
|
int(matches.group('blue')))
|
|
|
|
|
if matches.group('gray'):
|
|
|
|
|
return u'38;5;%d' % (232 + int(matches.group('gray')))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def stringc(text, color):
|
|
|
|
|
"""String in color."""
|
|
|
|
|
|
|
|
|
@ -92,7 +94,6 @@ def stringc(text, color):
|
|
|
|
|
else:
|
|
|
|
|
return text
|
|
|
|
|
|
|
|
|
|
# --- end "pretty"
|
|
|
|
|
|
|
|
|
|
def colorize(lead, num, color):
|
|
|
|
|
""" Print 'lead' = 'num' in 'color' """
|
|
|
|
@ -101,6 +102,7 @@ def colorize(lead, num, color):
|
|
|
|
|
s = stringc(s, color)
|
|
|
|
|
return s
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def hostcolor(host, stats, color=True):
|
|
|
|
|
if ANSIBLE_COLOR and color:
|
|
|
|
|
if stats['failures'] != 0 or stats['unreachable'] != 0:
|
|
|
|
@ -110,4 +112,3 @@ def hostcolor(host, stats, color=True):
|
|
|
|
|
else:
|
|
|
|
|
return u"%-37s" % stringc(host, C.COLOR_OK)
|
|
|
|
|
return u"%-26s" % host
|
|
|
|
|
|
|
|
|
|