commit ba49077b953265515aef1b2b98b159636f37d7c5 Author: Damian Johnson atagar@torproject.org Date: Thu Aug 25 10:15:24 2011 -0700
Skeleton terminal contorl interpretor
This provides a basic skeleton for a terminal-only interpretor of the control port. This provides terminal coloring, formatting, and history scollback but it not yet tied into the control port. The plan is that both the torInterpretor and interpretorPanel will use the same backend for irc style interpretor commands so people can use the interpretor in both the curses interface or plain terminal. --- src/util/torInterpretor.py | 66 ++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 66 insertions(+), 0 deletions(-)
diff --git a/src/util/torInterpretor.py b/src/util/torInterpretor.py new file mode 100644 index 0000000..9b6bff4 --- /dev/null +++ b/src/util/torInterpretor.py @@ -0,0 +1,66 @@ +""" +Provides an interactive interpretor for working with the Tor control port. This +adds usability features like IRC style interpretor commands and, when ran +directly, history and tab completion. +""" + +import readline # simply importing this provides history to raw_input + +from util import enum + +TERM_COLORS = ("BLACK", "RED", "GREEN", "YELLOW", "BLUE", "MAGENTA", "CYAN", "WHITE") + +Color = enum.Enum(*TERM_COLORS) +BgColor = enum.Enum(*["BG_" + color for color in TERM_COLORS]) +Attr = enum.Enum("BOLD", "UNDERLINE", "HILIGHT") + +FG_ENCODING = dict([(Color.values()[i], str(30 + i)) for i in range(8)]) +BG_ENCODING = dict([(BgColor.values()[i], str(40 + i)) for i in range(8)]) +ATTR_ENCODING = {Attr.BOLD: "1", Attr.UNDERLINE: "4", Attr.HILIGHT: "7"} + +CSI = "\x1B[%sm" +RESET = CSI % "0" + +def format(msg, *attr): + """ + Simple terminal text formatting, using ANSI escape sequences from: + https://secure.wikimedia.org/wikipedia/en/wiki/ANSI_escape_code#CSI_codes + + toolkits providing similar capabilities: + * django.utils.termcolors + https://code.djangoproject.com/browser/django/trunk/django/utils/termcolors.... + + * termcolor + http://pypi.python.org/pypi/termcolor + + * colorama + http://pypi.python.org/pypi/colorama + + Arguments: + msg - string to be formatted + attr - text attributes, this can be Color, BgColor, or Attr enums and are + case insensitive (so strings like "red" are fine) + """ + + encodings = [] + for textAttr in attr: + textAttr, encoding = enum.toCamelCase(textAttr), None + encoding = FG_ENCODING.get(textAttr, encoding) + encoding = BG_ENCODING.get(textAttr, encoding) + encoding = ATTR_ENCODING.get(textAttr, encoding) + if encoding: encodings.append(encoding) + + if encodings: + return (CSI % ";".join(encodings)) + msg + RESET + else: + raise IOError("BLARG! %s" % str(attr)) + return msg + +def prompt(): + prompt = format(">>> ", Color.GREEN, Attr.BOLD) + input = "" + + while input != "/quit": + input = raw_input(prompt) + print format("echoing back '%s'" % input, Color.BLUE) +
tor-commits@lists.torproject.org