diff --git a/supervisor_stdout.py b/supervisor_stdout.py index 34cfff9..3289fd8 100644 --- a/supervisor_stdout.py +++ b/supervisor_stdout.py @@ -1,5 +1,65 @@ +# This file contains code that was adapted from Django. [https://github.com/django/django/] + +# Copyright (c) Django Software Foundation and individual contributors. +# All rights reserved. + +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: + +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. + +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. + +# 3. Neither the name of Django nor the names of its contributors may be used +# to endorse or promote products derived from this software without +# specific prior written permission. + +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +import os import sys +COLORS = tuple(range(30, 38)) + +def get_color(key): + use_string = key if isinstance(key, basestring) else str(key) + return COLORS[use_string.__hash__() % len(COLORS)] + +def supports_color(): + """ + Taken from https://github.com/django/django/blob/master/django/core/management/color.py + + Returns True if the running system's terminal supports color, and False + otherwise. + """ + + if os.getenv("STDOUT_ALWAYS_ENABLE_COLOR_OUTPUT"): + return True + + if os.getenv("STDOUT_DISABLE_COLOR_OUTPUT"): + return False + + plat = sys.platform + supported_platform = plat != 'Pocket PC' and (plat != 'win32' or + 'ANSICON' in os.environ) + # isatty is not always implemented, #6223. + is_a_tty = hasattr(sys.stdout, 'isatty') and sys.stdout.isatty() + if not supported_platform or not is_a_tty: + return False + return True + def write_stdout(s): sys.stdout.write(s) sys.stdout.flush() @@ -19,7 +79,14 @@ def main(): def event_handler(event, response): line, data = response.split('\n', 1) headers = dict([ x.split(':') for x in line.split() ]) - print '%s %s | %s'%(headers['processname'], headers['channel'], data), + if supports_color(): + print '\033[1;%sm%s\033[1;m | \033[1;%sm%s\033[1;m | %s' % (get_color(headers['processname']), + headers['processname'], + get_color(headers['channel']), + headers['channel'], + data), + else: + print '%s | %s | %s' % (headers['processname'], headers['channel'], data), if __name__ == '__main__': main()