Index: replay.py |
diff --git a/replay.py b/replay.py |
index 8361c94aca4c22d1be983687bba50d0c2b54707a..2a6855925431c2cc6a81c017ad3e4b09c0a7dc84 100755 |
--- a/replay.py |
+++ b/replay.py |
@@ -43,6 +43,7 @@ import json |
import logging |
import optparse |
import os |
+import socket |
import sys |
import traceback |
@@ -148,7 +149,8 @@ def AddTrafficShaper(server_manager, options, host): |
ssl_port = options.ssl_shaping_port if options.ssl else None |
kwargs = dict( |
host=host, port=options.shaping_port, ssl_port=ssl_port, |
- use_loopback=not options.server_mode, **options.shaping_dummynet) |
+ use_loopback=not options.server_mode and host == '127.0.0.1', |
+ **options.shaping_dummynet) |
if not options.dns_forwarding: |
kwargs['dns_port'] = None |
server_manager.Append(trafficshaper.TrafficShaper, **kwargs) |
@@ -190,6 +192,7 @@ class OptionsWrapper(object): |
name for name, value in parser.defaults.items() |
if getattr(options, name) != value]) |
self._CheckConflicts() |
+ self._CheckValidIp('host') |
self._MassageValues() |
def _CheckConflicts(self): |
@@ -201,6 +204,15 @@ class OptionsWrapper(object): |
self._parser.error('Option --%s cannot be used with --%s.' % |
(bad_option, option)) |
+ def _CheckValidIp(self, name): |
+ """Give an error if option |name| is not a valid IPv4 address.""" |
+ value = getattr(self._options, name) |
+ if value: |
+ try: |
+ socket.inet_aton(value) |
+ except: |
+ self._parser.error('Option --%s must be a valid IPv4 address.' % name) |
+ |
def _ShapingKeywordArgs(self, shaping_key): |
"""Return the shaping keyword args for |shaping_key|. |
@@ -286,7 +298,9 @@ def replay(options, replay_filename): |
if options.server: |
AddDnsForward(server_manager, options.server) |
else: |
- host = platformsettings.get_server_ip_address(options.server_mode) |
+ host = options.host |
+ if not host: |
+ host = platformsettings.get_server_ip_address(options.server_mode) |
real_dns_lookup = dnsproxy.RealDnsLookup( |
name_servers=[platformsettings.get_original_primary_nameserver()]) |
if options.record: |
@@ -305,13 +319,15 @@ def replay(options, replay_filename): |
server_manager.AppendRecordCallback(http_archive.clear) |
if options.dns_forwarding: |
- if not options.server_mode: |
+ if not options.server_mode and host == '127.0.0.1': |
AddDnsForward(server_manager, host) |
AddDnsProxy(server_manager, options, host, real_dns_lookup, http_archive) |
if options.ssl and options.certfile is None: |
options.certfile = os.path.join(os.path.dirname(__file__), 'wpr_cert.pem') |
- http_proxy_address = platformsettings.get_httpproxy_ip_address( |
- options.server_mode) |
+ http_proxy_address = options.host |
+ if not http_proxy_address: |
+ http_proxy_address = platformsettings.get_httpproxy_ip_address( |
+ options.server_mode) |
AddWebProxy(server_manager, options, http_proxy_address, real_dns_lookup, |
http_archive, cache_misses) |
AddTrafficShaper(server_manager, options, host) |
@@ -469,6 +485,11 @@ def GetOptionParser(): |
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, |
+ action='store', |
+ 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, |
action='store', |
type='int', |