Skip to content

Commit

Permalink
Revamp verbosity options
Browse files Browse the repository at this point in the history
Split verbosity into termlog_verbosity and console_eventlog_verbosity.

This patch also removes printing to console if there are unknown options in the
command-line. Options now live in separate addons, so having uknown options
remaining is common and expected. We definitely shoould have some other way for
users to see what was ignored so they can catch typos and the like, but that's
a different patch.
  • Loading branch information
cortesi committed Feb 25, 2018
1 parent 77e5d82 commit 2fb8555
Show file tree
Hide file tree
Showing 12 changed files with 36 additions and 28 deletions.
9 changes: 8 additions & 1 deletion mitmproxy/addons/termlog.py
Expand Up @@ -14,13 +14,20 @@ class TermLog:
def __init__(self, outfile=None):
self.outfile = outfile

def load(self, loader):
loader.add_option(
"termlog_verbosity", str, 'info',
"Log verbosity.",
choices=log.LogTierOrder
)

def log(self, e):
if log.log_tier(e.level) == log.log_tier("error"):
outfile = self.outfile or realstderr
else:
outfile = self.outfile or realstdout

if log.log_tier(ctx.options.verbosity) >= log.log_tier(e.level):
if log.log_tier(ctx.options.termlog_verbosity) >= log.log_tier(e.level):
click.secho(
e.msg,
file=outfile,
Expand Down
9 changes: 9 additions & 0 deletions mitmproxy/log.py
Expand Up @@ -57,5 +57,14 @@ def __call__(self, text, level="info"):
self.master.add_log(text, level)


LogTierOrder = [
"error",
"warn",
"info",
"alert",
"debug",
]


def log_tier(level):
return dict(error=0, warn=1, info=2, alert=2, debug=3).get(level)
13 changes: 0 additions & 13 deletions mitmproxy/options.py
Expand Up @@ -3,13 +3,6 @@
from mitmproxy import optmanager
from mitmproxy.net import tls

log_verbosity = [
"error",
"warn",
"info",
"alert",
"debug",
]

CA_DIR = "~/.mitmproxy"
LISTEN_PORT = 8080
Expand Down Expand Up @@ -51,7 +44,6 @@ class Options(optmanager.OptManager):
# FIXME: Options that must be migrated to addons, but are complicated
# because they're used by more than one addon, or because they're
# embedded in the core code somehow.
verbosity = None # type: str
view_filter = None # type: Optional[str]

def __init__(self, **kwargs) -> None:
Expand All @@ -64,11 +56,6 @@ def __init__(self, **kwargs) -> None:
"showhost", bool, False,
"Use the Host header to construct URLs for display."
)
self.add_option(
"verbosity", str, 'info',
"Log verbosity.",
choices=log_verbosity
)

# Proxy options
self.add_option(
Expand Down
6 changes: 6 additions & 0 deletions mitmproxy/tools/console/consoleaddons.py
Expand Up @@ -7,6 +7,7 @@
from mitmproxy import exceptions
from mitmproxy import flow
from mitmproxy import http
from mitmproxy import log
from mitmproxy import contentviews
from mitmproxy.utils import strutils
import mitmproxy.types
Expand Down Expand Up @@ -81,6 +82,11 @@ def load(self, loader):
"The default content view mode.",
choices = [i.name.lower() for i in contentviews.views]
)
loader.add_option(
"console_eventlog_verbosity", str, 'info',
"EventLog verbosity.",
choices=log.LogTierOrder
)
loader.add_option(
"console_layout", str, "single",
"Console layout.",
Expand Down
4 changes: 2 additions & 2 deletions mitmproxy/tools/console/eventlog.py
Expand Up @@ -21,7 +21,7 @@ def __init__(self, master):

master.events.sig_add.connect(self.add_event)
master.events.sig_refresh.connect(self.refresh_events)
self.master.options.subscribe(self.refresh_events, ["verbosity"])
self.master.options.subscribe(self.refresh_events, ["console_eventlog_verbosity"])
self.refresh_events()

super().__init__(self.walker)
Expand All @@ -44,7 +44,7 @@ def keypress(self, size, key):
return super().keypress(size, key)

def add_event(self, event_store, entry: log.LogEntry):
if log.log_tier(self.master.options.verbosity) < log.log_tier(entry.level):
if log.log_tier(self.master.options.console_eventlog_verbosity) < log.log_tier(entry.level):
return
txt = "%s: %s" % (entry.level, str(entry.msg))
if entry.level in ("error", "warn", "alert"):
Expand Down
2 changes: 1 addition & 1 deletion mitmproxy/tools/console/master.py
Expand Up @@ -87,7 +87,7 @@ def prompt_for_exit(self):
)

def sig_add_log(self, event_store, entry: log.LogEntry):
if log.log_tier(self.options.verbosity) < log.log_tier(entry.level):
if log.log_tier(self.options.console_eventlog_verbosity) < log.log_tier(entry.level):
return
if entry.level in ("error", "warn", "alert"):
if self.first_tick:
Expand Down
8 changes: 3 additions & 5 deletions mitmproxy/tools/main.py
Expand Up @@ -46,10 +46,10 @@ def process_options(parser, opts, args):
if args.quiet or args.options or args.commands:
# also reduce log verbosity if --options or --commands is passed,
# we don't want log messages from regular startup then.
args.verbosity = 'error'
args.termlog_verbosity = 'error'
args.flow_detail = 0
if args.verbose:
args.verbosity = 'debug'
args.termlog_verbosity = 'debug'
args.flow_detail = 2

adict = {}
Expand Down Expand Up @@ -104,9 +104,7 @@ def run(
master.server = server
master.addons.trigger("configure", opts.keys())
master.addons.trigger("tick")
remaining = opts.update_known(**unknown)
if remaining and log.log_tier(opts.verbosity) > 1:
print("Ignored options: %s" % remaining)
opts.update_known(**unknown)
if args.options:
print(optmanager.dump_defaults(opts))
sys.exit(0)
Expand Down
3 changes: 3 additions & 0 deletions test/examples/test_xss_scanner.py
Expand Up @@ -310,6 +310,9 @@ class Logger():
def __init__(self):
self.args = []

def info(self, str):
self.args.append(str)

def error(self, str):
self.args.append(str)
return Logger()
Expand Down
2 changes: 1 addition & 1 deletion test/mitmproxy/addons/test_dumper.py
Expand Up @@ -147,7 +147,7 @@ def test_contentview(self, view_auto):
sio = io.StringIO()
d = dumper.Dumper(sio)
with taddons.context(d) as ctx:
ctx.configure(d, flow_detail=4, verbosity='debug')
ctx.configure(d, flow_detail=4)
d.response(tflow.tflow())
assert ctx.master.has_log("content viewer failed")

Expand Down
4 changes: 2 additions & 2 deletions test/mitmproxy/addons/test_termlog.py
Expand Up @@ -3,7 +3,6 @@

from mitmproxy.addons import termlog
from mitmproxy import log
from mitmproxy.options import Options
from mitmproxy.test import taddons


Expand All @@ -16,7 +15,8 @@ class TestTermLog:
])
def test_output(self, outfile, expected_out, expected_err, capfd):
t = termlog.TermLog(outfile=outfile)
with taddons.context(options=Options(verbosity='info')) as tctx:
with taddons.context(t) as tctx:
tctx.options.termlog_verbosity = "info"
tctx.configure(t)
t.log(log.LogEntry("one", "info"))
t.log(log.LogEntry("two", "debug"))
Expand Down
2 changes: 0 additions & 2 deletions test/mitmproxy/tools/console/test_master.py
Expand Up @@ -7,8 +7,6 @@

class TestMaster(tservers.MasterTest):
def mkmaster(self, **opts):
if "verbosity" not in opts:
opts["verbosity"] = 'warn'
o = options.Options(**opts)
m = console.master.ConsoleMaster(o)
m.addons.trigger("configure", o.keys())
Expand Down
2 changes: 1 addition & 1 deletion test/mitmproxy/tools/test_dump.py
Expand Up @@ -11,7 +11,7 @@

class TestDumpMaster(tservers.MasterTest):
def mkmaster(self, flt, **opts):
o = options.Options(view_filter=flt, verbosity='error', **opts)
o = options.Options(view_filter=flt, **opts)
m = dump.DumpMaster(o, with_termlog=False, with_dumper=False)
return m

Expand Down

0 comments on commit 2fb8555

Please sign in to comment.