tools_webrtc dir converted to py3 + top level PRESUBMIT script
Bug: webrtc:13607 Change-Id: Ib018e43ea977cc24dd71048e68e3343741f7f31b Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/249083 Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org> Reviewed-by: Harald Alvestrand <hta@webrtc.org> Reviewed-by: Jeremy Leconte <jleconte@google.com> Commit-Queue: Christoffer Jansson <jansson@google.com> Cr-Commit-Position: refs/heads/main@{#35953}
This commit is contained in:
committed by
WebRTC LUCI CQ
parent
b5cba85c2f
commit
4e8a773b4b
@ -1,4 +1,5 @@
|
||||
#!/usr/bin/env python
|
||||
#!/usr/bin/env vpython3
|
||||
|
||||
# Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
|
||||
#
|
||||
# Use of this source code is governed by a BSD-style license
|
||||
@ -46,170 +47,163 @@ _DEFAULT_PRESET = _PRESETS_DICT[_DEFAULT_PRESET_ID]
|
||||
|
||||
|
||||
class NonStrippingEpilogOptionParser(optparse.OptionParser):
|
||||
"""Custom parser to let us show the epilog without weird line breaking."""
|
||||
"""Custom parser to let us show the epilog without weird line breaking."""
|
||||
|
||||
def format_epilog(self, formatter):
|
||||
return self.epilog
|
||||
def format_epilog(self, formatter):
|
||||
return self.epilog
|
||||
|
||||
|
||||
def _GetExternalIp():
|
||||
"""Finds out the machine's external IP by connecting to google.com."""
|
||||
external_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||
external_socket.connect(('google.com', 80))
|
||||
return external_socket.getsockname()[0]
|
||||
"""Finds out the machine's external IP by connecting to google.com."""
|
||||
external_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||
external_socket.connect(('google.com', 80))
|
||||
return external_socket.getsockname()[0]
|
||||
|
||||
|
||||
def _ParseArgs():
|
||||
"""Define and parse the command-line arguments."""
|
||||
presets_string = '\n'.join(str(p) for p in _PRESETS)
|
||||
parser = NonStrippingEpilogOptionParser(epilog=(
|
||||
'\nAvailable presets:\n'
|
||||
' Bandwidth (kbps) Packet\n'
|
||||
'ID Name Receive Send Queue Delay loss \n'
|
||||
'-- ---- --------- -------- ----- ------- ------\n'
|
||||
'%s\n' % presets_string))
|
||||
parser.add_option('-p',
|
||||
'--preset',
|
||||
type='int',
|
||||
default=_DEFAULT_PRESET_ID,
|
||||
help=('ConnectionConfig configuration, specified by ID. '
|
||||
'Default: %default'))
|
||||
parser.add_option(
|
||||
'-r',
|
||||
'--receive-bw',
|
||||
type='int',
|
||||
default=_DEFAULT_PRESET.receive_bw_kbps,
|
||||
help=('Receive bandwidth in kilobit/s. Default: %default'))
|
||||
parser.add_option('-s',
|
||||
'--send-bw',
|
||||
type='int',
|
||||
default=_DEFAULT_PRESET.send_bw_kbps,
|
||||
help=('Send bandwidth in kilobit/s. Default: %default'))
|
||||
parser.add_option('-d',
|
||||
'--delay',
|
||||
type='int',
|
||||
default=_DEFAULT_PRESET.delay_ms,
|
||||
help=('Delay in ms. Default: %default'))
|
||||
parser.add_option('-l',
|
||||
'--packet-loss',
|
||||
type='float',
|
||||
default=_DEFAULT_PRESET.packet_loss_percent,
|
||||
help=('Packet loss in %. Default: %default'))
|
||||
parser.add_option(
|
||||
'-q',
|
||||
'--queue',
|
||||
type='int',
|
||||
default=_DEFAULT_PRESET.queue_slots,
|
||||
help=('Queue size as number of slots. Default: %default'))
|
||||
parser.add_option(
|
||||
'--port-range',
|
||||
default='%s,%s' % _DEFAULT_PORT_RANGE,
|
||||
help=('Range of ports for constrained network. Specify as '
|
||||
'two comma separated integers. Default: %default'))
|
||||
parser.add_option(
|
||||
'--target-ip',
|
||||
default=None,
|
||||
help=('The interface IP address to apply the rules for. '
|
||||
'Default: the external facing interface IP address.'))
|
||||
parser.add_option('-v',
|
||||
'--verbose',
|
||||
action='store_true',
|
||||
default=False,
|
||||
help=('Turn on verbose output. Will print all \'ipfw\' '
|
||||
'commands that are executed.'))
|
||||
"""Define and parse the command-line arguments."""
|
||||
presets_string = '\n'.join(str(p) for p in _PRESETS)
|
||||
parser = NonStrippingEpilogOptionParser(epilog=(
|
||||
'\nAvailable presets:\n'
|
||||
' Bandwidth (kbps) Packet\n'
|
||||
'ID Name Receive Send Queue Delay loss \n'
|
||||
'-- ---- --------- -------- ----- ------- ------\n'
|
||||
'%s\n' % presets_string))
|
||||
parser.add_option('-p',
|
||||
'--preset',
|
||||
type='int',
|
||||
default=_DEFAULT_PRESET_ID,
|
||||
help=('ConnectionConfig configuration, specified by ID. '
|
||||
'Default: %default'))
|
||||
parser.add_option('-r',
|
||||
'--receive-bw',
|
||||
type='int',
|
||||
default=_DEFAULT_PRESET.receive_bw_kbps,
|
||||
help=('Receive bandwidth in kilobit/s. Default: %default'))
|
||||
parser.add_option('-s',
|
||||
'--send-bw',
|
||||
type='int',
|
||||
default=_DEFAULT_PRESET.send_bw_kbps,
|
||||
help=('Send bandwidth in kilobit/s. Default: %default'))
|
||||
parser.add_option('-d',
|
||||
'--delay',
|
||||
type='int',
|
||||
default=_DEFAULT_PRESET.delay_ms,
|
||||
help=('Delay in ms. Default: %default'))
|
||||
parser.add_option('-l',
|
||||
'--packet-loss',
|
||||
type='float',
|
||||
default=_DEFAULT_PRESET.packet_loss_percent,
|
||||
help=('Packet loss in %. Default: %default'))
|
||||
parser.add_option('-q',
|
||||
'--queue',
|
||||
type='int',
|
||||
default=_DEFAULT_PRESET.queue_slots,
|
||||
help=('Queue size as number of slots. Default: %default'))
|
||||
parser.add_option('--port-range',
|
||||
default='%s,%s' % _DEFAULT_PORT_RANGE,
|
||||
help=('Range of ports for constrained network. Specify as '
|
||||
'two comma separated integers. Default: %default'))
|
||||
parser.add_option('--target-ip',
|
||||
default=None,
|
||||
help=('The interface IP address to apply the rules for. '
|
||||
'Default: the external facing interface IP address.'))
|
||||
parser.add_option('-v',
|
||||
'--verbose',
|
||||
action='store_true',
|
||||
default=False,
|
||||
help=('Turn on verbose output. Will print all \'ipfw\' '
|
||||
'commands that are executed.'))
|
||||
|
||||
options = parser.parse_args()[0]
|
||||
options = parser.parse_args()[0]
|
||||
|
||||
# Find preset by ID, if specified.
|
||||
if options.preset and not _PRESETS_DICT.has_key(options.preset):
|
||||
parser.error('Invalid preset: %s' % options.preset)
|
||||
# Find preset by ID, if specified.
|
||||
if options.preset and options.preset not in _PRESETS_DICT:
|
||||
parser.error('Invalid preset: %s' % options.preset)
|
||||
|
||||
# Simple validation of the IP address, if supplied.
|
||||
if options.target_ip:
|
||||
try:
|
||||
socket.inet_aton(options.target_ip)
|
||||
except socket.error:
|
||||
parser.error('Invalid IP address specified: %s' %
|
||||
options.target_ip)
|
||||
|
||||
# Convert port range into the desired tuple format.
|
||||
# Simple validation of the IP address, if supplied.
|
||||
if options.target_ip:
|
||||
try:
|
||||
if isinstance(options.port_range, str):
|
||||
options.port_range = tuple(
|
||||
int(port) for port in options.port_range.split(','))
|
||||
if len(options.port_range) != 2:
|
||||
parser.error(
|
||||
'Invalid port range specified, please specify two '
|
||||
'integers separated by a comma.')
|
||||
except ValueError:
|
||||
parser.error('Invalid port range specified.')
|
||||
socket.inet_aton(options.target_ip)
|
||||
except socket.error:
|
||||
parser.error('Invalid IP address specified: %s' % options.target_ip)
|
||||
|
||||
_InitLogging(options.verbose)
|
||||
return options
|
||||
# Convert port range into the desired tuple format.
|
||||
try:
|
||||
if isinstance(options.port_range, str):
|
||||
options.port_range = tuple(
|
||||
int(port) for port in options.port_range.split(','))
|
||||
if len(options.port_range) != 2:
|
||||
parser.error('Invalid port range specified, please specify two '
|
||||
'integers separated by a comma.')
|
||||
except ValueError:
|
||||
parser.error('Invalid port range specified.')
|
||||
|
||||
_InitLogging(options.verbose)
|
||||
return options
|
||||
|
||||
|
||||
def _InitLogging(verbose):
|
||||
"""Setup logging."""
|
||||
log_level = _DEFAULT_LOG_LEVEL
|
||||
if verbose:
|
||||
log_level = logging.DEBUG
|
||||
logging.basicConfig(level=log_level, format='%(message)s')
|
||||
"""Setup logging."""
|
||||
log_level = _DEFAULT_LOG_LEVEL
|
||||
if verbose:
|
||||
log_level = logging.DEBUG
|
||||
logging.basicConfig(level=log_level, format='%(message)s')
|
||||
|
||||
|
||||
def main():
|
||||
options = _ParseArgs()
|
||||
options = _ParseArgs()
|
||||
|
||||
# Build a configuration object. Override any preset configuration settings if
|
||||
# a value of a setting was also given as a flag.
|
||||
connection_config = _PRESETS_DICT[options.preset]
|
||||
if options.receive_bw is not _DEFAULT_PRESET.receive_bw_kbps:
|
||||
connection_config.receive_bw_kbps = options.receive_bw
|
||||
if options.send_bw is not _DEFAULT_PRESET.send_bw_kbps:
|
||||
connection_config.send_bw_kbps = options.send_bw
|
||||
if options.delay is not _DEFAULT_PRESET.delay_ms:
|
||||
connection_config.delay_ms = options.delay
|
||||
if options.packet_loss is not _DEFAULT_PRESET.packet_loss_percent:
|
||||
connection_config.packet_loss_percent = options.packet_loss
|
||||
if options.queue is not _DEFAULT_PRESET.queue_slots:
|
||||
connection_config.queue_slots = options.queue
|
||||
emulator = network_emulator.NetworkEmulator(connection_config,
|
||||
options.port_range)
|
||||
try:
|
||||
emulator.CheckPermissions()
|
||||
except network_emulator.NetworkEmulatorError as e:
|
||||
logging.error('Error: %s\n\nCause: %s', e.fail_msg, e.error)
|
||||
return -1
|
||||
# Build a configuration object. Override any preset configuration settings if
|
||||
# a value of a setting was also given as a flag.
|
||||
connection_config = _PRESETS_DICT[options.preset]
|
||||
if options.receive_bw is not _DEFAULT_PRESET.receive_bw_kbps:
|
||||
connection_config.receive_bw_kbps = options.receive_bw
|
||||
if options.send_bw is not _DEFAULT_PRESET.send_bw_kbps:
|
||||
connection_config.send_bw_kbps = options.send_bw
|
||||
if options.delay is not _DEFAULT_PRESET.delay_ms:
|
||||
connection_config.delay_ms = options.delay
|
||||
if options.packet_loss is not _DEFAULT_PRESET.packet_loss_percent:
|
||||
connection_config.packet_loss_percent = options.packet_loss
|
||||
if options.queue is not _DEFAULT_PRESET.queue_slots:
|
||||
connection_config.queue_slots = options.queue
|
||||
emulator = network_emulator.NetworkEmulator(connection_config,
|
||||
options.port_range)
|
||||
try:
|
||||
emulator.CheckPermissions()
|
||||
except network_emulator.NetworkEmulatorError as e:
|
||||
logging.error('Error: %s\n\nCause: %s', e.fail_msg, e.error)
|
||||
return -1
|
||||
|
||||
if not options.target_ip:
|
||||
external_ip = _GetExternalIp()
|
||||
else:
|
||||
external_ip = options.target_ip
|
||||
if not options.target_ip:
|
||||
external_ip = _GetExternalIp()
|
||||
else:
|
||||
external_ip = options.target_ip
|
||||
|
||||
logging.info('Constraining traffic to/from IP: %s', external_ip)
|
||||
try:
|
||||
emulator.Emulate(external_ip)
|
||||
logging.info(
|
||||
'Started network emulation with the following configuration:\n'
|
||||
' Receive bandwidth: %s kbps (%s kB/s)\n'
|
||||
' Send bandwidth : %s kbps (%s kB/s)\n'
|
||||
' Delay : %s ms\n'
|
||||
' Packet loss : %s %%\n'
|
||||
' Queue slots : %s', connection_config.receive_bw_kbps,
|
||||
connection_config.receive_bw_kbps / 8,
|
||||
connection_config.send_bw_kbps, connection_config.send_bw_kbps / 8,
|
||||
connection_config.delay_ms, connection_config.packet_loss_percent,
|
||||
connection_config.queue_slots)
|
||||
logging.info('Affected traffic: IP traffic on ports %s-%s',
|
||||
options.port_range[0], options.port_range[1])
|
||||
raw_input('Press Enter to abort Network Emulation...')
|
||||
logging.info('Flushing all Dummynet rules...')
|
||||
network_emulator.Cleanup()
|
||||
logging.info('Completed Network Emulation.')
|
||||
return 0
|
||||
except network_emulator.NetworkEmulatorError as e:
|
||||
logging.error('Error: %s\n\nCause: %s', e.fail_msg, e.error)
|
||||
return -2
|
||||
logging.info('Constraining traffic to/from IP: %s', external_ip)
|
||||
try:
|
||||
emulator.Emulate(external_ip)
|
||||
logging.info(
|
||||
'Started network emulation with the following configuration:\n'
|
||||
' Receive bandwidth: %s kbps (%s kB/s)\n'
|
||||
' Send bandwidth : %s kbps (%s kB/s)\n'
|
||||
' Delay : %s ms\n'
|
||||
' Packet loss : %s %%\n'
|
||||
' Queue slots : %s', connection_config.receive_bw_kbps,
|
||||
connection_config.receive_bw_kbps / 8, connection_config.send_bw_kbps,
|
||||
connection_config.send_bw_kbps / 8, connection_config.delay_ms,
|
||||
connection_config.packet_loss_percent, connection_config.queue_slots)
|
||||
logging.info('Affected traffic: IP traffic on ports %s-%s',
|
||||
options.port_range[0], options.port_range[1])
|
||||
input('Press Enter to abort Network Emulation...')
|
||||
logging.info('Flushing all Dummynet rules...')
|
||||
network_emulator.Cleanup()
|
||||
logging.info('Completed Network Emulation.')
|
||||
return 0
|
||||
except network_emulator.NetworkEmulatorError as e:
|
||||
logging.error('Error: %s\n\nCause: %s', e.fail_msg, e.error)
|
||||
return -2
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
sys.exit(main())
|
||||
sys.exit(main())
|
||||
|
||||
Reference in New Issue
Block a user