Index: telemetry/third_party/webpagereplay/replay.py |
diff --git a/telemetry/third_party/webpagereplay/replay.py b/telemetry/third_party/webpagereplay/replay.py |
index dc8383adb7100ac093c4411b21cb2cb05cfbe3b8..bfb9096d8a992a1a78932e58e7a5421991f6c26f 100755 |
--- a/telemetry/third_party/webpagereplay/replay.py |
+++ b/telemetry/third_party/webpagereplay/replay.py |
@@ -39,9 +39,9 @@ Network simulation examples: |
$ sudo ./replay.py --packet_loss_rate=0.01 archive.wpr |
""" |
+import argparse |
import json |
import logging |
-import optparse |
import os |
import socket |
import sys |
@@ -177,8 +177,8 @@ class OptionsWrapper(object): |
"""Add checks, updates, and methods to option values. |
Example: |
- options, args = option_parser.parse_args() |
- options = OptionsWrapper(options, option_parser) # run checks and updates |
+ options, args = arg_parser.parse_args() |
+ options = OptionsWrapper(options, arg_parser) # run checks and updates |
if options.record and options.HasTrafficShaping(): |
[...] |
""" |
@@ -197,8 +197,8 @@ class OptionsWrapper(object): |
self._options = options |
self._parser = parser |
self._nondefaults = set([ |
- name for name, value in parser.defaults.items() |
- if getattr(options, name) != value]) |
+ action.dest for action in parser._optionals._actions |
+ if getattr(options, action.dest, action.default) is not action.default]) |
self._CheckConflicts() |
self._CheckValidIp('host') |
self._CheckFeatureSupport() |
@@ -373,188 +373,182 @@ def replay(options, replay_filename): |
return exit_status |
-def GetOptionParser(): |
- class PlainHelpFormatter(optparse.IndentedHelpFormatter): |
- def format_description(self, description): |
- if description: |
- return description + '\n' |
- else: |
- return '' |
- option_parser = optparse.OptionParser( |
- usage='%prog [options] replay_file', |
- formatter=PlainHelpFormatter(), |
+def GetParser(): |
+ arg_parser = argparse.ArgumentParser( |
+ usage='%(prog)s [options] replay_file', |
description=__doc__, |
+ formatter_class=argparse.RawDescriptionHelpFormatter, |
epilog='http://code.google.com/p/web-page-replay/') |
- option_parser.add_option('-r', '--record', default=False, |
+ arg_parser.add_argument('replay_filename', type=str, help='Replay file', |
+ nargs='?') |
+ |
+ arg_parser.add_argument('-r', '--record', default=False, |
action='store_true', |
help='Download real responses and record them to replay_file') |
- option_parser.add_option('--append', default=False, |
+ arg_parser.add_argument('--append', default=False, |
action='store_true', |
help='Append responses to replay_file.') |
- option_parser.add_option('-l', '--log_level', default='debug', |
+ arg_parser.add_argument('-l', '--log_level', default='debug', |
action='store', |
- type='choice', |
+ type=str, |
choices=('debug', 'info', 'warning', 'error', 'critical'), |
help='Minimum verbosity level to log') |
- option_parser.add_option('-f', '--log_file', default=None, |
+ arg_parser.add_argument('-f', '--log_file', default=None, |
action='store', |
- type='string', |
+ type=str, |
help='Log file to use in addition to writting logs to stderr.') |
- network_group = optparse.OptionGroup(option_parser, |
- 'Network Simulation Options', |
- 'These options configure the network simulation in replay mode') |
- network_group.add_option('-u', '--up', default='0', |
+ network_group = arg_parser.add_argument_group( |
+ title='Network Simulation Options', |
+ description=('These options configure the network simulation in ' |
+ 'replay mode')) |
+ network_group.add_argument('-u', '--up', default='0', |
action='store', |
- type='string', |
+ type=str, |
help='Upload Bandwidth in [K|M]{bit/s|Byte/s}. Zero means unlimited.') |
- network_group.add_option('-d', '--down', default='0', |
+ network_group.add_argument('-d', '--down', default='0', |
action='store', |
- type='string', |
+ type=str, |
help='Download Bandwidth in [K|M]{bit/s|Byte/s}. Zero means unlimited.') |
- network_group.add_option('-m', '--delay_ms', default='0', |
+ network_group.add_argument('-m', '--delay_ms', default='0', |
action='store', |
- type='string', |
+ type=str, |
help='Propagation delay (latency) in milliseconds. Zero means no delay.') |
- network_group.add_option('-p', '--packet_loss_rate', default='0', |
+ network_group.add_argument('-p', '--packet_loss_rate', default='0', |
action='store', |
- type='string', |
+ type=str, |
help='Packet loss rate in range [0..1]. Zero means no loss.') |
- network_group.add_option('-w', '--init_cwnd', default='0', |
+ network_group.add_argument('-w', '--init_cwnd', default='0', |
action='store', |
- type='string', |
+ type=str, |
help='Set initial cwnd (linux only, requires kernel patch)') |
- network_group.add_option('--net', default=None, |
+ network_group.add_argument('--net', default=None, |
action='store', |
- type='choice', |
+ type=str, |
choices=net_configs.NET_CONFIG_NAMES, |
help='Select a set of network options: %s.' % ', '.join( |
net_configs.NET_CONFIG_NAMES)) |
- network_group.add_option('--shaping_type', default='dummynet', |
+ network_group.add_argument('--shaping_type', default='dummynet', |
action='store', |
choices=('dummynet', 'proxy'), |
help='When shaping is configured (i.e. --up, --down, etc.) decides ' |
'whether to use |dummynet| (default), or |proxy| servers.') |
- option_parser.add_option_group(network_group) |
- harness_group = optparse.OptionGroup(option_parser, |
- 'Replay Harness Options', |
- 'These advanced options configure various aspects of the replay harness') |
- harness_group.add_option('-S', '--server', default=None, |
+ harness_group = arg_parser.add_argument_group( |
+ title='Replay Harness Options', |
+ description=('These advanced options configure various aspects ' |
+ 'of the replay harness')) |
+ harness_group.add_argument('-S', '--server', default=None, |
action='store', |
- type='string', |
+ type=str, |
help='IP address of host running "replay.py --server_mode". ' |
'This only changes the primary DNS nameserver to use the given IP.') |
- harness_group.add_option('-M', '--server_mode', default=False, |
+ harness_group.add_argument('-M', '--server_mode', default=False, |
action='store_true', |
help='Run replay DNS & http proxies, and trafficshaping on --port ' |
'without changing the primary DNS nameserver. ' |
'Other hosts may connect to this using "replay.py --server" ' |
'or by pointing their DNS to this server.') |
- harness_group.add_option('-i', '--inject_scripts', default='deterministic.js', |
+ harness_group.add_argument('-i', '--inject_scripts', default='deterministic.js', |
action='store', |
dest='inject_scripts', |
help='A comma separated list of JavaScript sources to inject in all ' |
'pages. By default a script is injected that eliminates sources ' |
'of entropy such as Date() and Math.random() deterministic. ' |
'CAUTION: Without deterministic.js, many pages will not replay.') |
- harness_group.add_option('-D', '--no-diff_unknown_requests', default=True, |
+ harness_group.add_argument('-D', '--no-diff_unknown_requests', default=True, |
action='store_false', |
dest='diff_unknown_requests', |
help='During replay, do not show a diff of unknown requests against ' |
'their nearest match in the archive.') |
- harness_group.add_option('-C', '--use_closest_match', default=False, |
+ harness_group.add_argument('-C', '--use_closest_match', default=False, |
action='store_true', |
dest='use_closest_match', |
help='During replay, if a request is not found, serve the closest match' |
'in the archive instead of giving a 404.') |
- harness_group.add_option('-U', '--use_server_delay', default=False, |
+ harness_group.add_argument('-U', '--use_server_delay', default=False, |
action='store_true', |
dest='use_server_delay', |
help='During replay, simulate server delay by delaying response time to' |
'requests.') |
- harness_group.add_option('-I', '--screenshot_dir', default=None, |
+ harness_group.add_argument('-I', '--screenshot_dir', default=None, |
action='store', |
- type='string', |
+ type=str, |
help='Save PNG images of the loaded page in the given directory.') |
- harness_group.add_option('-P', '--no-dns_private_passthrough', default=True, |
+ harness_group.add_argument('-P', '--no-dns_private_passthrough', default=True, |
action='store_false', |
dest='dns_private_passthrough', |
help='Don\'t forward DNS requests that resolve to private network ' |
'addresses. CAUTION: With this option important services like ' |
'Kerberos will resolve to the HTTP proxy address.') |
- harness_group.add_option('-x', '--no-dns_forwarding', default=True, |
+ harness_group.add_argument('-x', '--no-dns_forwarding', default=True, |
action='store_false', |
dest='dns_forwarding', |
help='Don\'t forward DNS requests to the local replay server. ' |
'CAUTION: With this option an external mechanism must be used to ' |
'forward traffic to the replay server.') |
- harness_group.add_option('--host', default=None, |
+ harness_group.add_argument('--host', default=None, |
action='store', |
- type='str', |
+ type=str, |
help='The IP address to bind all servers to. Defaults to 0.0.0.0 or ' |
'127.0.0.1, depending on --server_mode and platform.') |
- harness_group.add_option('-o', '--port', default=80, |
+ harness_group.add_argument('-o', '--port', default=80, |
action='store', |
- type='int', |
+ type=int, |
help='Port number to listen on.') |
- harness_group.add_option('--ssl_port', default=443, |
+ harness_group.add_argument('--ssl_port', default=443, |
action='store', |
- type='int', |
+ type=int, |
help='SSL port number to listen on.') |
- harness_group.add_option('--http_to_https_port', default=None, |
+ harness_group.add_argument('--http_to_https_port', default=None, |
action='store', |
- type='int', |
+ type=int, |
help='Port on which WPR will listen for HTTP requests that it will send ' |
'along as HTTPS requests.') |
- harness_group.add_option('--dns_port', default=53, |
+ harness_group.add_argument('--dns_port', default=53, |
action='store', |
- type='int', |
+ type=int, |
help='DNS port number to listen on.') |
- harness_group.add_option('-c', '--https_root_ca_cert_path', default=None, |
+ harness_group.add_argument('-c', '--https_root_ca_cert_path', default=None, |
action='store', |
- type='string', |
+ type=str, |
help='Certificate file to use with SSL (gets auto-generated if needed).') |
- harness_group.add_option('--no-ssl', default=True, |
+ harness_group.add_argument('--no-ssl', default=True, |
action='store_false', |
dest='ssl', |
help='Do not setup an SSL proxy.') |
- option_parser.add_option_group(harness_group) |
- harness_group.add_option('--should_generate_certs', default=False, |
+ harness_group.add_argument('--should_generate_certs', default=False, |
action='store_true', |
help='Use OpenSSL to generate certificate files for requested hosts.') |
- harness_group.add_option('--no-admin-check', default=True, |
+ harness_group.add_argument('--no-admin-check', default=True, |
action='store_false', |
dest='admin_check', |
help='Do not check if administrator access is needed.') |
- harness_group.add_option('--scramble_images', default=False, |
+ harness_group.add_argument('--scramble_images', default=False, |
action='store_true', |
dest='scramble_images', |
help='Scramble image responses.') |
- harness_group.add_option('--rules_path', default=None, |
+ harness_group.add_argument('--rules_path', default=None, |
action='store', |
help='Path of file containing Python rules.') |
- harness_group.add_option('--allowed_rule_imports', default='rules', |
+ harness_group.add_argument('--allowed_rule_imports', default='rules', |
action='store', |
help='A comma-separate list of allowed rule imports, or \'*\' to allow' |
- ' all packages. Defaults to \'%default\'.') |
- return option_parser |
+ ' all packages. Defaults to %(default)s.') |
+ return arg_parser |
def main(): |
- option_parser = GetOptionParser() |
- options, args = option_parser.parse_args() |
- options = OptionsWrapper(options, option_parser) |
+ arg_parser = GetParser() |
+ options = arg_parser.parse_args() |
+ options = OptionsWrapper(options, arg_parser) |
if options.server: |
- replay_filename = None |
- elif len(args) != 1: |
- option_parser.error('Must specify a replay_file') |
- else: |
- replay_filename = args[0] |
- |
- return replay(options, replay_filename) |
+ options.replay_filename = None |
+ elif options.replay_filename is None: |
+ arg_parser.error('Must specify a replay_file') |
+ return replay(options, options.replay_filename) |
if __name__ == '__main__': |