blob: 5700cd99e4b0d6f9afd707fe819859118613e007 [file] [log] [blame]
# Copyright 2019 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""A helper for common operations in ssh forwarding"""
import re
import py_utils
def ReadRemotePort(filename):
"""Fetches the port created remotely.
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.
Args:
filename: the file that stderr is redirected to.
Returns:
The port created on the remote device.
"""
def TryReadingPort(f):
line = f.readline()
tokens = re.search(r'port (\d+) for remote forward to', line)
return int(tokens.group(1)) if tokens else None
with open(filename, 'r') as f:
return py_utils.WaitFor(lambda: TryReadingPort(f), timeout=60)
def GetForwardingArgs(local_port, remote_port, host_ip, port_forward):
"""Prepare the forwarding arguments to execute for devices that connect with
the host via ssh.
Args:
local_port: Port on the host.
remote_port: Port on the remote device.
host_ip: ip of the host.
port_forward: Direction of the connection. True if forwarding from the host.
Returns:
List of strings, the command arguments for handling port forwarding.
"""
if port_forward:
arg_format = '-R{remote_port}:{host_ip}:{local_port}'
else:
arg_format = '-L{local_port}:{host_ip}:{remote_port}'
return [
arg_format.format(host_ip=host_ip,
local_port=local_port,
remote_port=remote_port or 0)
]