From 0f4d94b31c02171c1cc39bf90426b61e5c2a05e1 Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Tue, 2 May 2017 15:25:42 +1200 Subject: console: Make EventLog its own control, bind to "E" --- mitmproxy/tools/console/eventlog.py | 47 +++++++++++++++++++++++++++ mitmproxy/tools/console/flowlist.py | 62 ------------------------------------ mitmproxy/tools/console/master.py | 40 ++++++++--------------- mitmproxy/tools/console/statusbar.py | 4 +-- mitmproxy/tools/console/window.py | 23 +++++++------ 5 files changed, 77 insertions(+), 99 deletions(-) create mode 100644 mitmproxy/tools/console/eventlog.py diff --git a/mitmproxy/tools/console/eventlog.py b/mitmproxy/tools/console/eventlog.py new file mode 100644 index 00000000..45d950c4 --- /dev/null +++ b/mitmproxy/tools/console/eventlog.py @@ -0,0 +1,47 @@ +import urwid +from mitmproxy.tools.console import signals + +EVENTLOG_SIZE = 10000 + + +class LogBufferWalker(urwid.SimpleListWalker): + pass + + +class EventLog(urwid.ListBox): + keyctx = "eventlog" + + def __init__(self, master): + self.walker = LogBufferWalker([]) + self.master = master + urwid.ListBox.__init__(self, self.walker) + signals.sig_add_log.connect(self.sig_add_log) + + def set_focus(self, index): + if 0 <= index < len(self.walker): + super().set_focus(index) + + def keypress(self, size, key): + if key == "z": + self.master.clear_events() + key = None + elif key == "m_end": + self.set_focus(len(self.walker) - 1) + elif key == "m_start": + self.set_focus(0) + return urwid.ListBox.keypress(self, size, key) + + def sig_add_log(self, sender, e, level): + txt = "%s: %s" % (level, str(e)) + if level in ("error", "warn"): + e = urwid.Text((level, txt)) + else: + e = urwid.Text(txt) + self.walker.append(e) + if len(self.walker) > EVENTLOG_SIZE: + self.walker.pop(0) + if self.master.options.console_focus_follow: + self.walker.set_focus(len(self.walker) - 1) + + def clear_events(self): + self.walker[:] = [] \ No newline at end of file diff --git a/mitmproxy/tools/console/flowlist.py b/mitmproxy/tools/console/flowlist.py index 8e28ff0f..4184eeb4 100644 --- a/mitmproxy/tools/console/flowlist.py +++ b/mitmproxy/tools/console/flowlist.py @@ -47,68 +47,6 @@ footer = [ ] -class LogBufferBox(urwid.ListBox): - - def __init__(self, master): - self.master = master - urwid.ListBox.__init__(self, master.logbuffer) - - def set_focus(self, index): - if 0 <= index < len(self.master.logbuffer): - super().set_focus(index) - - def keypress(self, size, key): - if key == "z": - self.master.clear_events() - key = None - elif key == "m_end": - self.set_focus(len(self.master.logbuffer) - 1) - elif key == "m_start": - self.set_focus(0) - return urwid.ListBox.keypress(self, size, key) - - -class BodyPile(urwid.Pile): - - def __init__(self, master): - h = urwid.Text("Event log") - h = urwid.Padding(h, align="left", width=("relative", 100)) - - self.inactive_header = urwid.AttrWrap(h, "heading_inactive") - self.active_header = urwid.AttrWrap(h, "heading") - - urwid.Pile.__init__( - self, - [ - FlowListBox(master), - urwid.Frame( - LogBufferBox(master), - header = self.inactive_header - ) - ] - ) - self.master = master - - def keypress(self, size, key): - if key == "tab": - self.focus_position = ( - self.focus_position + 1) % len(self.widget_list) - if self.focus_position == 1: - self.widget_list[1].header = self.active_header - else: - self.widget_list[1].header = self.inactive_header - key = None - - # This is essentially a copypasta from urwid.Pile's keypress handler. - # So much for "closed for modification, but open for extension". - item_rows = None - if len(size) == 2: - item_rows = self.get_item_rows(size, focus = True) - i = self.widget_list.index(self.focus_item) - tsize = self.get_item_size(size, i, True, item_rows) - return self.focus_item.keypress(tsize, key) - - class FlowItem(urwid.WidgetWrap): def __init__(self, master, flow): diff --git a/mitmproxy/tools/console/master.py b/mitmproxy/tools/console/master.py index b88a0354..fdeacd55 100644 --- a/mitmproxy/tools/console/master.py +++ b/mitmproxy/tools/console/master.py @@ -31,8 +31,6 @@ from mitmproxy.tools.console import window from mitmproxy import contentviews from mitmproxy.utils import strutils -EVENTLOG_SIZE = 10000 - class Logger: def log(self, evt): @@ -166,8 +164,9 @@ class ConsoleAddon: except exceptions.CommandError as e: signals.status_message.send(message=str(e)) - self.master.overlay(overlay.Chooser(self.master, prompt, choices, "", callback)) - ctx.log.info(choices) + self.master.overlay( + overlay.Chooser(self.master, prompt, choices, "", callback) + ) @command.command("console.choose.cmd") def console_choose_cmd( @@ -189,8 +188,9 @@ class ConsoleAddon: except exceptions.CommandError as e: signals.status_message.send(message=str(e)) - self.master.overlay(overlay.Chooser(self.master, prompt, choices, "", callback)) - ctx.log.info(choices) + self.master.overlay( + overlay.Chooser(self.master, prompt, choices, "", callback) + ) @command.command("console.command") def console_command(self, *partial: typing.Sequence[str]) -> None: @@ -209,6 +209,11 @@ class ConsoleAddon: """View the options editor.""" self.master.switch_view("options") + @command.command("console.view.eventlog") + def view_eventlog(self) -> None: + """View the options editor.""" + self.master.switch_view("eventlog") + @command.command("console.view.help") def view_help(self) -> None: """View help.""" @@ -351,6 +356,7 @@ def default_keymap(km): km.add("?", "console.view.help", ["global"]) km.add("C", "console.view.commands", ["global"]) km.add("O", "console.view.options", ["global"]) + km.add("E", "console.view.eventlog", ["global"]) km.add("Q", "console.exit", ["global"]) km.add("q", "console.view.pop", ["global"]) @@ -375,9 +381,8 @@ def default_keymap(km): ) km.add("d", "view.remove @focus", ["flowlist", "flowview"]) km.add("D", "view.duplicate @focus", ["flowlist", "flowview"]) - km.add("e", "set console_eventlog=toggle", ["flowlist"]) km.add( - "E", + "e", "console.choose.cmd Format export.formats " "console.command export.file {choice} @focus ''", ["flowlist", "flowview"] @@ -461,8 +466,6 @@ class ConsoleMaster(master.Master): default_keymap(self.keymap) self.options.errored.connect(self.options_error) - self.logbuffer = urwid.SimpleListWalker([]) - self.view_stack = [] signals.call_in.connect(self.sig_call_in) @@ -508,19 +511,10 @@ class ConsoleMaster(master.Master): def sig_add_log(self, sender, e, level): if self.options.verbosity < log.log_tier(level): return - if level in ("error", "warn"): signals.status_message.send( message = "{}: {}".format(level.title(), e) ) - e = urwid.Text((level, str(e))) - else: - e = urwid.Text(str(e)) - self.logbuffer.append(e) - if len(self.logbuffer) > EVENTLOG_SIZE: - self.logbuffer.pop(0) - if self.options.console_focus_follow: - self.logbuffer.set_focus(len(self.logbuffer) - 1) def sig_call_in(self, sender, seconds, callback, args=()): def cb(*_): @@ -621,12 +615,9 @@ class ConsoleMaster(master.Master): self.window = window.Window(self) self.loop.widget = self.window + self.window.refresh() self.loop.set_alarm_in(0.01, self.ticker) - self.loop.set_alarm_in( - 0.0001, - lambda *args: self.switch_view("flowlist") - ) self.start() try: @@ -660,6 +651,3 @@ class ConsoleMaster(master.Master): def quit(self, a): if a != "n": self.shutdown() - - def clear_events(self): - self.logbuffer[:] = [] diff --git a/mitmproxy/tools/console/statusbar.py b/mitmproxy/tools/console/statusbar.py index a5db0f4a..7e471b90 100644 --- a/mitmproxy/tools/console/statusbar.py +++ b/mitmproxy/tools/console/statusbar.py @@ -34,8 +34,8 @@ class PromptStub: class ActionBar(urwid.WidgetWrap): def __init__(self, master): - urwid.WidgetWrap.__init__(self, None) self.master = master + urwid.WidgetWrap.__init__(self, None) self.clear() signals.status_message.connect(self.sig_message) signals.status_prompt.connect(self.sig_prompt) @@ -151,7 +151,7 @@ class StatusBar(urwid.WidgetWrap): self.master = master self.helptext = helptext self.ib = urwid.WidgetWrap(urwid.Text("")) - self.ab = ActionBar(self) + self.ab = ActionBar(self.master) super().__init__(urwid.Pile([self.ib, self.ab])) signals.update_settings.connect(self.sig_update) signals.flowlist_change.connect(self.sig_update) diff --git a/mitmproxy/tools/console/window.py b/mitmproxy/tools/console/window.py index d7038da0..ea26056d 100644 --- a/mitmproxy/tools/console/window.py +++ b/mitmproxy/tools/console/window.py @@ -8,6 +8,7 @@ from mitmproxy.tools.console import options from mitmproxy.tools.console import overlay from mitmproxy.tools.console import help from mitmproxy.tools.console import grideditor +from mitmproxy.tools.console import eventlog class Window(urwid.Frame): @@ -19,7 +20,6 @@ class Window(urwid.Frame): footer = urwid.AttrWrap(self.statusbar, "background") ) self.master = master - self.primary_stack = [] self.master.view.sig_view_refresh.connect(self.view_changed) self.master.view.sig_view_add.connect(self.view_changed) self.master.view.sig_view_remove.connect(self.view_changed) @@ -38,13 +38,23 @@ class Window(urwid.Frame): commands = commands.Commands(self.master), options = options.Options(self.master), help = help.HelpView(None), + eventlog = eventlog.EventLog(self.master), + edit_focus_query = grideditor.QueryEditor(self.master), edit_focus_cookies = grideditor.CookieEditor(self.master), edit_focus_setcookies = grideditor.SetCookieEditor(self.master), edit_focus_form = grideditor.RequestFormEditor(self.master), edit_focus_path = grideditor.PathEditor(self.master), edit_focus_request_headers = grideditor.RequestHeaderEditor(self.master), - edit_focus_response_headers = grideditor.ResponseHeaderEditor(self.master), + edit_focus_response_headers = grideditor.ResponseHeaderEditor( + self.master + ), + ) + self.primary_stack = ["flowlist"] + + def refresh(self): + self.body = urwid.AttrWrap( + self.windows[self.primary_stack[-1]], "background" ) def call(self, v, name, *args, **kwargs): @@ -80,9 +90,7 @@ class Window(urwid.Frame): if self.primary_stack and self.primary_stack[-1] == wname: return self.primary_stack.append(wname) - self.body = urwid.AttrWrap( - self.windows[wname], "background" - ) + self.refresh() self.view_changed() self.focus_changed() @@ -93,10 +101,7 @@ class Window(urwid.Frame): if len(self.primary_stack) > 1: self.view_popping() self.primary_stack.pop() - self.body = urwid.AttrWrap( - self.windows[self.primary_stack[-1]], - "background", - ) + self.refresh() self.view_changed() self.focus_changed() else: -- cgit v1.2.3