mirror of
https://github.com/Grasscutters/mitmproxy.git
synced 2024-11-26 18:18:25 +00:00
Merge pull request #2923 from cortesi/moreopts
Options: split verbosity, add some docs to Loader.add_option
This commit is contained in:
commit
f02896862d
@ -92,6 +92,13 @@ class Loader:
|
||||
help: str,
|
||||
choices: typing.Optional[typing.Sequence[str]] = None
|
||||
) -> None:
|
||||
"""
|
||||
Add an option to mitmproxy.
|
||||
|
||||
Help should be a single paragraph with no linebreaks - it will be
|
||||
reflowed by tools. Information on the data type should be omitted -
|
||||
it will be generated and added by tools as needed.
|
||||
"""
|
||||
if name in self.master.options:
|
||||
existing = self.master.options._options[name]
|
||||
same_signature = (
|
||||
|
@ -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,
|
||||
|
@ -57,5 +57,14 @@ class Log:
|
||||
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)
|
||||
|
@ -3,23 +3,10 @@ from typing import Optional, Sequence
|
||||
from mitmproxy import optmanager
|
||||
from mitmproxy.net import tls
|
||||
|
||||
log_verbosity = [
|
||||
"error",
|
||||
"warn",
|
||||
"info",
|
||||
"alert",
|
||||
"debug",
|
||||
]
|
||||
|
||||
CA_DIR = "~/.mitmproxy"
|
||||
LISTEN_PORT = 8080
|
||||
|
||||
# Some help text style guidelines:
|
||||
#
|
||||
# - Should be a single paragraph with no linebreaks. Help will be reflowed by
|
||||
# tools.
|
||||
# - Avoid adding information about the data type - we can generate that.
|
||||
|
||||
|
||||
class Options(optmanager.OptManager):
|
||||
|
||||
@ -42,6 +29,7 @@ class Options(optmanager.OptManager):
|
||||
mode = None # type: str
|
||||
rawtcp = None # type: bool
|
||||
server = None # type: bool
|
||||
showhost = None # type: bool
|
||||
spoof_source_address = None # type: bool
|
||||
ssl_insecure = None # type: bool
|
||||
ssl_verify_upstream_trusted_ca = None # type: Optional[str]
|
||||
@ -56,8 +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.
|
||||
showhost = None # type: bool
|
||||
verbosity = None # type: str
|
||||
view_filter = None # type: Optional[str]
|
||||
|
||||
def __init__(self, **kwargs) -> None:
|
||||
@ -70,11 +56,6 @@ class Options(optmanager.OptManager):
|
||||
"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(
|
||||
|
@ -7,6 +7,7 @@ from mitmproxy import command
|
||||
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
|
||||
@ -81,6 +82,11 @@ class ConsoleAddon:
|
||||
"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.",
|
||||
|
@ -21,7 +21,7 @@ class EventLog(urwid.ListBox, layoutwidget.LayoutWidget):
|
||||
|
||||
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)
|
||||
@ -44,7 +44,7 @@ class EventLog(urwid.ListBox, layoutwidget.LayoutWidget):
|
||||
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"):
|
||||
|
@ -87,7 +87,7 @@ class ConsoleMaster(master.Master):
|
||||
)
|
||||
|
||||
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:
|
||||
|
@ -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 = {}
|
||||
@ -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)
|
||||
|
@ -310,6 +310,9 @@ class TestXSSScanner():
|
||||
def __init__(self):
|
||||
self.args = []
|
||||
|
||||
def info(self, str):
|
||||
self.args.append(str)
|
||||
|
||||
def error(self, str):
|
||||
self.args.append(str)
|
||||
return Logger()
|
||||
|
@ -147,7 +147,7 @@ class TestContentView:
|
||||
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")
|
||||
|
||||
|
@ -3,7 +3,6 @@ import pytest
|
||||
|
||||
from mitmproxy.addons import termlog
|
||||
from mitmproxy import log
|
||||
from mitmproxy.options import Options
|
||||
from mitmproxy.test import taddons
|
||||
|
||||
|
||||
@ -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"))
|
||||
|
@ -7,8 +7,6 @@ from ... import tservers
|
||||
|
||||
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())
|
||||
|
@ -11,7 +11,7 @@ from .. import tservers
|
||||
|
||||
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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user