Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9)

Unified Diff: telemetry/telemetry/internal/forwarders/cros_forwarder.py

Issue 2982743002: webrtc: Fix missing port forwarding on CrOS (Closed)
Patch Set: webrtc: Fix missing port forwarding on CrOS and android Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: telemetry/telemetry/internal/forwarders/cros_forwarder.py
diff --git a/telemetry/telemetry/internal/forwarders/cros_forwarder.py b/telemetry/telemetry/internal/forwarders/cros_forwarder.py
index 4316954559177e6428cc5584d4359be3ea1fd13a..e59167bbd628c46356d26cd0b8bf7ee669750613 100644
--- a/telemetry/telemetry/internal/forwarders/cros_forwarder.py
+++ b/telemetry/telemetry/internal/forwarders/cros_forwarder.py
@@ -3,7 +3,9 @@
# found in the LICENSE file.
import logging
+import re
import subprocess
+import tempfile
from telemetry.internal import forwarders
from telemetry.internal.forwarders import do_nothing_forwarder
@@ -30,16 +32,36 @@ class CrOsSshForwarder(forwarders.Forwarder):
super(CrOsSshForwarder, self).__init__(port_pair)
self._cri = cri
self._proc = None
+ self._remote_port = None
forwarding_args = self._ForwardingArgs(
use_remote_port_forwarding, self.host_ip, port_pair)
+ err_file = tempfile.NamedTemporaryFile()
self._proc = subprocess.Popen(
- self._cri.FormSSHCommandLine(['sleep', '999999999'], forwarding_args),
+ self._cri.FormSSHCommandLine(['-NT'], forwarding_args,
+ port_forward=use_remote_port_forwarding),
stdout=subprocess.PIPE,
- stderr=subprocess.PIPE,
+ stderr=err_file,
stdin=subprocess.PIPE,
shell=False)
+ def _get_remote_port(err_file):
+ # When we specify the remote port '0' in ssh remote port forwarding,
+ # the remote ssh server should return the port it binds to in stderr.
+ # e.g. 'Allocated port 42360 for remote forward to localhost:12345',
+ # the port 42360 is the port created remotely and the traffic to the
+ # port will be relayed to localhost port 12345.
+ line = err_file.readline()
+ tokens = re.search(r'port (\d+) for remote forward to', line)
+ if tokens:
+ self._remote_port = int(tokens.group(1))
+ return tokens
+
+ if use_remote_port_forwarding and port_pair.remote_port == 0:
+ with open(err_file.name, 'r') as err_file_reader:
+ py_utils.WaitFor(lambda: _get_remote_port(err_file_reader), 60)
+
py_utils.WaitFor(
lambda: self._cri.IsHTTPServerRunningOnPort(self.host_port), 60)
+ err_file.close()
logging.debug('Server started on %s:%d', self.host_ip, self.host_port)
# pylint: disable=unused-argument
@@ -55,6 +77,9 @@ class CrOsSshForwarder(forwarders.Forwarder):
@property
def host_port(self):
+ # Return remote port if it is resolved remotely.
+ if self._remote_port:
+ return self._remote_port
return self._port_pair.remote_port
def Close(self):

Powered by Google App Engine
This is Rietveld 408576698