def options_load(self, path: mitmproxy.types.Path) -> None: """ Load options from a file. """ try: optmanager.load_paths(ctx.options, path) except (OSError, exceptions.OptionsError) as e: raise exceptions.CommandError("Could not load options - %s" % e) from e
def options_load(self, path: str) -> None: """ Load options from a file. """ try: optmanager.load_paths(ctx.options, path) except (OSError, exceptions.OptionsError) as e: raise exceptions.CommandError( "Could not load options - %s" % e ) from e
def run(MasterKlass, args): # pragma: no cover version_check.check_pyopenssl_version() debug.register_info_dumpers() opts = options.Options() parser = cmdline.mitmdump(opts) args = parser.parse_args(args) master = None try: unknown = optmanager.load_paths(opts, args.conf) server = process_options(parser, opts, args) master = MasterKlass(opts, server) master.addons.configure_all(opts, opts.keys()) remaining = opts.update_known(**unknown) if remaining and opts.verbosity > 1: print("Ignored options: %s" % remaining) if args.options: print(optmanager.dump_defaults(opts)) sys.exit(0) opts.set(*args.setoptions) def cleankill(*args, **kwargs): master.shutdown() signal.signal(signal.SIGTERM, cleankill) master.run() except exceptions.OptionsError as e: print("%s: %s" % (sys.argv[0], e), file=sys.stderr) sys.exit(1) except (KeyboardInterrupt, RuntimeError): pass return master
def run(master_cls: typing.Type[master.Master], make_parser: typing.Callable[[options.Options], argparse.ArgumentParser], arguments: typing.Sequence[str], extra=typing.Callable[[typing.Any], dict]): # pragma: no cover """ extra: Extra argument processing callable which returns a dict of options. """ debug.register_info_dumpers() opts = options.Options() master = master_cls(opts) parser = make_parser(opts) args = parser.parse_args(arguments) try: unknown = optmanager.load_paths(opts, args.conf) pconf = process_options(parser, opts, args) server = None # type: typing.Any if pconf.options.server: try: server = proxy.server.ProxyServer(pconf) except exceptions.ServerException as v: print(str(v), file=sys.stderr) sys.exit(1) else: server = proxy.server.DummyServer(pconf) 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) if args.options: print(optmanager.dump_defaults(opts)) sys.exit(0) if args.commands: master.commands.dump() sys.exit(0) opts.set(*args.setoptions) if extra: opts.update(**extra(args)) def cleankill(*args, **kwargs): master.shutdown() signal.signal(signal.SIGTERM, cleankill) master.run() except exceptions.OptionsError as e: print("%s: %s" % (sys.argv[0], e), file=sys.stderr) sys.exit(1) except (KeyboardInterrupt, RuntimeError) as e: pass return master
def run(MasterKlass, args, extra=None): # pragma: no cover """ extra: Extra argument processing callable which returns a dict of options. """ version_check.check_pyopenssl_version() debug.register_info_dumpers() opts = options.Options() parser = cmdline.mitmdump(opts) args = parser.parse_args(args) master = None try: unknown = optmanager.load_paths(opts, args.conf) pconf = process_options(parser, opts, args) if pconf.options.server: try: server = proxy.server.ProxyServer(pconf) except exceptions.ServerException as v: print(str(v), file=sys.stderr) sys.exit(1) else: server = proxy.server.DummyServer(pconf) master = MasterKlass(opts, server) master.addons.trigger("configure", opts.keys()) master.addons.trigger("tick") remaining = opts.update_known(**unknown) if remaining and opts.verbosity > 1: print("Ignored options: %s" % remaining) if args.options: print(optmanager.dump_defaults(opts)) sys.exit(0) if args.commands: master.commands.dump() sys.exit(0) opts.set(*args.setoptions) if extra: opts.update(**extra(args)) def cleankill(*args, **kwargs): master.shutdown() signal.signal(signal.SIGTERM, cleankill) master.run() except exceptions.OptionsError as e: print("%s: %s" % (sys.argv[0], e), file=sys.stderr) sys.exit(1) except (KeyboardInterrupt, RuntimeError) as e: pass return master
def test_saving(tmpdir): o = TD2() o.three = "set" dst = str(tmpdir.join("conf")) optmanager.save(o, dst, defaults=True) o2 = TD2() optmanager.load_paths(o2, dst) o2.three = "foo" optmanager.save(o2, dst, defaults=True) optmanager.load_paths(o, dst) assert o.three == "foo" with open(dst, 'a') as f: f.write("foobar: '123'") assert optmanager.load_paths(o, dst) == {"foobar": "123"} with open(dst, 'a') as f: f.write("'''") with pytest.raises(exceptions.OptionsError): optmanager.load_paths(o, dst)
def run( master_cls: typing.Type[master.Master], make_parser: typing.Callable[[options.Options], argparse.ArgumentParser], arguments: typing.Sequence[str], extra: typing.Callable[[typing.Any], dict] = None ) -> master.Master: # pragma: no cover """ extra: Extra argument processing callable which returns a dict of options. """ debug.register_info_dumpers() opts = options.Options() master = master_cls(opts) parser = make_parser(opts) # To make migration from 2.x to 3.0 bearable. if "-R" in sys.argv and sys.argv[sys.argv.index("-R") + 1].startswith("http"): print("-R is used for specifying replacements.\n" "To use mitmproxy in reverse mode please use --mode reverse:SPEC instead") try: args = parser.parse_args(arguments) except SystemExit: arg_check.check() sys.exit(1) try: opts.set(*args.setoptions, defer=True) optmanager.load_paths( opts, os.path.join(opts.confdir, "config.yaml"), os.path.join(opts.confdir, "config.yml"), ) pconf = process_options(parser, opts, args) server: typing.Any = None if pconf.options.server: try: server = proxy.server.ProxyServer(pconf) except exceptions.ServerException as v: print(str(v), file=sys.stderr) sys.exit(1) else: server = proxy.server.DummyServer(pconf) master.server = server if args.options: print(optmanager.dump_defaults(opts)) sys.exit(0) if args.commands: master.commands.dump() sys.exit(0) if extra: opts.update(**extra(args)) loop = asyncio.get_event_loop() for signame in ('SIGINT', 'SIGTERM'): try: loop.add_signal_handler(getattr(signal, signame), getattr(master, "prompt_for_exit", master.shutdown)) except NotImplementedError: # Not supported on Windows pass # Make sure that we catch KeyboardInterrupts on Windows. # https://stackoverflow.com/a/36925722/934719 if os.name == "nt": async def wakeup(): while True: await asyncio.sleep(0.2) asyncio.ensure_future(wakeup()) master.run() except exceptions.OptionsError as e: print("%s: %s" % (sys.argv[0], e), file=sys.stderr) sys.exit(1) except (KeyboardInterrupt, RuntimeError): pass return master
def run(master_cls: typing.Type[master.Master], make_parser: typing.Callable[[options.Options], argparse.ArgumentParser], arguments: typing.Sequence[str], extra: typing.Callable[[typing.Any], dict] = None): # pragma: no cover """ extra: Extra argument processing callable which returns a dict of options. """ debug.register_info_dumpers() opts = options.Options() master = master_cls(opts) parser = make_parser(opts) # To make migration from 2.x to 3.0 bearable. if "-R" in sys.argv and sys.argv[sys.argv.index("-R") + 1].startswith("http"): print( "-R is used for specifying replacements.\n" "To use mitmproxy in reverse mode please use --mode reverse:SPEC instead" ) try: args = parser.parse_args(arguments) except SystemExit: arg_check.check() sys.exit(1) try: unknown = optmanager.load_paths(opts, args.conf) pconf = process_options(parser, opts, args) server = None # type: typing.Any if pconf.options.server: try: server = proxy.server.ProxyServer(pconf) except exceptions.ServerException as v: print(str(v), file=sys.stderr) sys.exit(1) else: server = proxy.server.DummyServer(pconf) 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) if args.options: print(optmanager.dump_defaults(opts)) sys.exit(0) if args.commands: master.commands.dump() sys.exit(0) opts.set(*args.setoptions) if extra: opts.update(**extra(args)) def cleankill(*args, **kwargs): master.shutdown() signal.signal(signal.SIGTERM, cleankill) master.run() except exceptions.OptionsError as e: print("%s: %s" % (sys.argv[0], e), file=sys.stderr) sys.exit(1) except (KeyboardInterrupt, RuntimeError) as e: pass return master
def run( master_cls: typing.Type[master.Master], make_parser: typing.Callable[[options.Options], argparse.ArgumentParser], arguments: typing.Sequence[str], extra: typing.Callable[[typing.Any], dict] = None ) -> master.Master: # pragma: no cover """ extra: Extra argument processing callable which returns a dict of options. """ debug.register_info_dumpers() opts = options.Options() master = master_cls(opts) parser = make_parser(opts) # To make migration from 2.x to 3.0 bearable. if "-R" in sys.argv and sys.argv[sys.argv.index("-R") + 1].startswith("http"): print("-R is used for specifying replacements.\n" "To use mitmproxy in reverse mode please use --mode reverse:SPEC instead") try: args = parser.parse_args(arguments) except SystemExit: arg_check.check() sys.exit(1) try: opts.confdir = args.confdir optmanager.load_paths( opts, os.path.join(opts.confdir, OPTIONS_FILE_NAME), ) pconf = process_options(parser, opts, args) server: typing.Any = None if pconf.options.server: try: server = proxy.server.ProxyServer(pconf) except exceptions.ServerException as v: print(str(v), file=sys.stderr) sys.exit(1) else: server = proxy.server.DummyServer(pconf) master.server = server if args.options: print(optmanager.dump_defaults(opts)) sys.exit(0) if args.commands: master.commands.dump() sys.exit(0) opts.set(*args.setoptions, defer=True) if extra: opts.update(**extra(args)) loop = asyncio.get_event_loop() for signame in ('SIGINT', 'SIGTERM'): try: loop.add_signal_handler(getattr(signal, signame), master.shutdown) except NotImplementedError: # Not supported on Windows pass # Make sure that we catch KeyboardInterrupts on Windows. # https://stackoverflow.com/a/36925722/934719 if os.name == "nt": async def wakeup(): while True: await asyncio.sleep(0.2) asyncio.ensure_future(wakeup()) master.run() except exceptions.OptionsError as e: print("%s: %s" % (sys.argv[0], e), file=sys.stderr) sys.exit(1) except (KeyboardInterrupt, RuntimeError) as e: pass return master
def run( master_cls: typing.Type[master.Master], make_parser: typing.Callable[[options.Options], argparse.ArgumentParser], arguments: typing.Sequence[str], extra: typing.Callable[[typing.Any], dict] = None ) -> master.Master: # pragma: no cover """ extra: Extra argument processing callable which returns a dict of options. """ # Remove debuger # debug.register_info_dumpers() # Add looper in server thread loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) opts = options.Options() master = master_cls(opts) parser = make_parser(opts) # To make migration from 2.x to 3.0 bearable. if "-R" in sys.argv and sys.argv[sys.argv.index("-R") + 1].startswith("http"): print( "-R is used for specifying replacements.\n" "To use mitmproxy in reverse mode please use --mode reverse:SPEC instead" ) try: args = parser.parse_args(arguments) except SystemExit: arg_check.check() sys.exit(1) try: opts.confdir = args.confdir optmanager.load_paths( opts, os.path.join(opts.confdir, OPTIONS_FILE_NAME), ) pconf = process_options(parser, opts, args) server: typing.Any = None if pconf.options.server: try: server = proxy.server.ProxyServer(pconf) except exceptions.ServerException as v: print(str(v), file=sys.stderr) sys.exit(1) else: server = proxy.server.DummyServer(pconf) master.server = server if args.options: print(optmanager.dump_defaults(opts)) sys.exit(0) if args.commands: master.commands.dump() sys.exit(0) opts.set(*args.setoptions, defer=True) if extra: opts.update(**extra(args)) if os.name == "nt": async def wakeup(): while True: await asyncio.sleep(0.2) asyncio.ensure_future(wakeup()) master.run() except exceptions.OptionsError as e: print("%s: %s" % (sys.argv[0], e), file=sys.stderr) sys.exit(1) except (KeyboardInterrupt, RuntimeError) as e: pass return master
def run( master_cls: typing.Type[master.Master], make_parser: typing.Callable[[options.Options], argparse.ArgumentParser], arguments: typing.Sequence[str], extra: typing.Callable[[typing.Any], dict] = None ): # pragma: no cover """ extra: Extra argument processing callable which returns a dict of options. """ debug.register_info_dumpers() opts = options.Options() master = master_cls(opts) parser = make_parser(opts) # To make migration from 2.x to 3.0 bearable. if "-R" in sys.argv and sys.argv[sys.argv.index("-R") + 1].startswith("http"): print("-R is used for specifying replacements.\n" "To use mitmproxy in reverse mode please use --mode reverse:SPEC instead") try: args = parser.parse_args(arguments) except SystemExit: arg_check.check() sys.exit(1) try: unknown = optmanager.load_paths(opts, args.conf) pconf = process_options(parser, opts, args) server = None # type: typing.Any if pconf.options.server: try: server = proxy.server.ProxyServer(pconf) except exceptions.ServerException as v: print(str(v), file=sys.stderr) sys.exit(1) else: server = proxy.server.DummyServer(pconf) 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) if args.options: print(optmanager.dump_defaults(opts)) sys.exit(0) if args.commands: master.commands.dump() sys.exit(0) opts.set(*args.setoptions) if extra: opts.update(**extra(args)) def cleankill(*args, **kwargs): master.shutdown() signal.signal(signal.SIGTERM, cleankill) master.run() except exceptions.OptionsError as e: print("%s: %s" % (sys.argv[0], e), file=sys.stderr) sys.exit(1) except (KeyboardInterrupt, RuntimeError) as e: pass return master
def test_saving(tmpdir): o = TD2() o.three = "set" dst = str(tmpdir.join("conf")) optmanager.save(o, dst, defaults=True) o2 = TD2() optmanager.load_paths(o2, dst) o2.three = "foo" optmanager.save(o2, dst, defaults=True) optmanager.load_paths(o, dst) assert o.three == "foo" with open(dst, 'a') as f: f.write("foobar: '123'") optmanager.load_paths(o, dst) assert o.deferred == {"foobar": "123"} with open(dst, 'a') as f: f.write("'''") with pytest.raises(exceptions.OptionsError): optmanager.load_paths(o, dst) with open(dst, 'wb') as f: f.write(b"\x01\x02\x03") with pytest.raises(exceptions.OptionsError): optmanager.load_paths(o, dst) with pytest.raises(exceptions.OptionsError): optmanager.save(o, dst) with open(dst, 'wb') as f: f.write(b"\xff\xff\xff") with pytest.raises(exceptions.OptionsError): optmanager.load_paths(o, dst) with pytest.raises(exceptions.OptionsError): optmanager.save(o, dst)
def run( master_cls: typing.Type[master.Master], make_parser: typing.Callable[[options.Options], argparse.ArgumentParser], arguments: typing.Sequence[str], extra: typing.Callable[[typing.Any], dict] = None ) -> master.Master: # pragma: no cover """ extra: Extra argument processing callable which returns a dict of options. """ debug.register_info_dumpers() opts = options.Options() master = master_cls(opts) parser = make_parser(opts) # To make migration from 2.x to 3.0 bearable. if "-R" in sys.argv and sys.argv[sys.argv.index("-R") + 1].startswith("http"): print( "-R is used for specifying replacements.\n" "To use mitmproxy in reverse mode please use --mode reverse:SPEC instead" ) try: args = parser.parse_args(arguments) except SystemExit: arg_check.check() sys.exit(1) try: opts.confdir = args.confdir unknown = optmanager.load_paths( opts, os.path.join(opts.confdir, OPTIONS_FILE_NAME), ) pconf = process_options(parser, opts, args) server: typing.Any = None if pconf.options.server: try: server = proxy.server.ProxyServer(pconf) except exceptions.ServerException as v: print(str(v), file=sys.stderr) sys.exit(1) else: server = proxy.server.DummyServer(pconf) master.server = server opts.update_known(**unknown) if args.options: print(optmanager.dump_defaults(opts)) sys.exit(0) if args.commands: master.commands.dump() sys.exit(0) opts.set(*args.setoptions, defer=True) if extra: opts.update(**extra(args)) def cleankill(*args, **kwargs): master.shutdown() signal.signal(signal.SIGTERM, cleankill) loop = asyncio.get_event_loop() for signame in ('SIGINT', 'SIGTERM'): try: loop.add_signal_handler(getattr(signal, signame), master.shutdown) except NotImplementedError: # Not supported on Windows pass master.run() except exceptions.OptionsError as e: print("%s: %s" % (sys.argv[0], e), file=sys.stderr) sys.exit(1) except (KeyboardInterrupt, RuntimeError) as e: pass return master
def run( master_cls: typing.Type[master.Master], make_parser: typing.Callable[[options.Options], argparse.ArgumentParser], arguments: typing.Sequence[str], extra: typing.Callable[[typing.Any], dict] = None ) -> master.Master: # pragma: no cover """ extra: Extra argument processing callable which returns a dict of options. """ debug.register_info_dumpers() opts = options.Options() master = master_cls(opts) parser = make_parser(opts) # To make migration from 2.x to 3.0 bearable. if "-R" in sys.argv and sys.argv[sys.argv.index("-R") + 1].startswith("http"): print( "-R is used for specifying replacements.\n" "To use mitmproxy in reverse mode please use --mode reverse:SPEC instead" ) # SF 通过print输出得到args的内容 """ Namespace(anticache=None, anticomp=None, certs=None, client_replay=None, commands=False, confdir='~/.mitmproxy', http2=None, ignore_hosts=None, intercept=None, listen_host='192.168.0.7', listen_port=8888, mode=None, options=False, proxyauth=None, quiet=False, rawtcp=None, replacements=None, rfile=None, save_stream_file=None, scripts=None, server=None, server_replay=None, server_replay_kill_extra=None, server_replay_nopop=None, setheaders=None, setoptions=[], showhost=None, ssl_insecure=None, stickyauth=None, stickycookie=None, tcp_hosts=None, upstream_auth=None, verbose=None, version=False, web_iface=None, web_open_browser=None, web_port=None) """ try: args = parser.parse_args(arguments) #SF:如果中间的代码调用了sys.exit就会触发SystemExit except SystemExit: arg_check.check() sys.exit(1) try: opts.confdir = args.confdir optmanager.load_paths( opts, os.path.join(opts.confdir, OPTIONS_FILE_NAME), ) pconf = process_options(parser, opts, args) server: typing.Any = None if pconf.options.server: try: server = proxy.server.ProxyServer(pconf) except exceptions.ServerException as v: print(str(v), file=sys.stderr) sys.exit(1) else: server = proxy.server.DummyServer(pconf) master.server = server if args.options: print(optmanager.dump_defaults(opts)) sys.exit(0) if args.commands: master.commands.dump() sys.exit(0) opts.set(*args.setoptions, defer=True) if extra: opts.update(**extra(args)) loop = asyncio.get_event_loop() for signame in ('SIGINT', 'SIGTERM'): try: loop.add_signal_handler(getattr(signal, signame), master.shutdown) except NotImplementedError: # Not supported on Windows pass # Make sure that we catch KeyboardInterrupts on Windows. # https://stackoverflow.com/a/36925722/934719 if os.name == "nt": async def wakeup(): while True: await asyncio.sleep(0.2) asyncio.ensure_future(wakeup()) master.run() except exceptions.OptionsError as e: print("%s: %s" % (sys.argv[0], e), file=sys.stderr) sys.exit(1) except (KeyboardInterrupt, RuntimeError) as e: pass return master
async def main() -> T: debug.register_info_dumpers() opts = options.Options() master = master_cls(opts) parser = make_parser(opts) # To make migration from 2.x to 3.0 bearable. if "-R" in sys.argv and sys.argv[sys.argv.index("-R") + 1].startswith("http"): print( "To use mitmproxy in reverse mode please use --mode reverse:SPEC instead" ) try: args = parser.parse_args(arguments) except SystemExit: arg_check.check() sys.exit(1) try: opts.set(*args.setoptions, defer=True) optmanager.load_paths( opts, os.path.join(opts.confdir, "config.yaml"), os.path.join(opts.confdir, "config.yml"), ) process_options(parser, opts, args) if args.options: optmanager.dump_defaults(opts, sys.stdout) sys.exit(0) if args.commands: master.commands.dump() sys.exit(0) if extra: if args.filter_args: master.log.info( f"Only processing flows that match \"{' & '.join(args.filter_args)}\"" ) opts.update(**extra(args)) except exceptions.OptionsError as e: print(f"{sys.argv[0]}: {e}", file=sys.stderr) sys.exit(1) loop = asyncio.get_running_loop() def _sigint(*_): loop.call_soon_threadsafe( getattr(master, "prompt_for_exit", master.shutdown)) def _sigterm(*_): loop.call_soon_threadsafe(master.shutdown) # We can't use loop.add_signal_handler because that's not available on Windows' Proactorloop, # but signal.signal just works fine for our purposes. signal.signal(signal.SIGINT, _sigint) signal.signal(signal.SIGTERM, _sigterm) await master.run() return master