make grpc channels injectable

This commit is contained in:
Gilles Boccon-Gibod
2023-09-15 12:00:02 -07:00
parent c6cdca8923
commit 406a932467
2 changed files with 43 additions and 23 deletions

View File

@@ -39,10 +39,12 @@
"libusb", "libusb",
"MITM", "MITM",
"NDIS", "NDIS",
"netsim",
"NONBLOCK", "NONBLOCK",
"NONCONN", "NONCONN",
"OXIMETER", "OXIMETER",
"popleft", "popleft",
"protobuf",
"psms", "psms",
"pyee", "pyee",
"pyusb", "pyusb",

View File

@@ -18,12 +18,13 @@
import asyncio import asyncio
import atexit import atexit
import logging import logging
import grpc.aio
import os import os
import pathlib import pathlib
import sys import sys
from typing import Dict, Optional from typing import Dict, Optional
import grpc.aio
from .common import ( from .common import (
ParserSource, ParserSource,
PumpedTransport, PumpedTransport,
@@ -33,8 +34,8 @@ from .common import (
) )
# pylint: disable=no-name-in-module # pylint: disable=no-name-in-module
from .grpc_protobuf.packet_streamer_pb2_grpc import PacketStreamerStub
from .grpc_protobuf.packet_streamer_pb2_grpc import ( from .grpc_protobuf.packet_streamer_pb2_grpc import (
PacketStreamerStub,
PacketStreamerServicer, PacketStreamerServicer,
add_PacketStreamerServicer_to_server, add_PacketStreamerServicer_to_server,
) )
@@ -43,6 +44,7 @@ from .grpc_protobuf.hci_packet_pb2 import HCIPacket
from .grpc_protobuf.startup_pb2 import Chip, ChipInfo from .grpc_protobuf.startup_pb2 import Chip, ChipInfo
from .grpc_protobuf.common_pb2 import ChipKind from .grpc_protobuf.common_pb2 import ChipKind
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# Logging # Logging
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
@@ -273,8 +275,36 @@ async def open_android_netsim_controller_transport(
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
async def open_android_netsim_host_transport( async def open_android_netsim_host_transport_with_address(
server_host: Optional[str], server_port: int, options: Dict[str, str] server_host: Optional[str],
server_port: int,
options: Optional[Dict[str, str]] = None,
):
if server_host == '_' or not server_host:
server_host = 'localhost'
if not server_port:
# Look for the gRPC config in a .ini file
instance_number = int(options.get('instance', "0"))
server_host = 'localhost'
server_port = find_grpc_port(instance_number)
if not server_port:
raise RuntimeError('gRPC server port not found')
# Connect to the gRPC server
server_address = f'{server_host}:{server_port}'
logger.debug(f'Connecting to gRPC server at {server_address}')
channel = grpc.aio.insecure_channel(server_address)
return await open_android_netsim_host_transport_with_channel(
channel,
options,
)
# -----------------------------------------------------------------------------
async def open_android_netsim_host_transport_with_channel(
channel, options: Optional[Dict[str, str]] = None
): ):
# Wrapper for I/O operations # Wrapper for I/O operations
class HciDevice: class HciDevice:
@@ -294,10 +324,12 @@ async def open_android_netsim_host_transport(
async def read(self): async def read(self):
response = await self.hci_device.read() response = await self.hci_device.read()
response_type = response.WhichOneof('response_type') response_type = response.WhichOneof('response_type')
if response_type == 'error': if response_type == 'error':
logger.warning(f'received error: {response.error}') logger.warning(f'received error: {response.error}')
raise RuntimeError(response.error) raise RuntimeError(response.error)
elif response_type == 'hci_packet':
if response_type == 'hci_packet':
return ( return (
bytes([response.hci_packet.packet_type]) bytes([response.hci_packet.packet_type])
+ response.hci_packet.packet + response.hci_packet.packet
@@ -312,24 +344,8 @@ async def open_android_netsim_host_transport(
) )
) )
name = options.get('name', DEFAULT_NAME) name = DEFAULT_NAME if options is None else options.get('name', DEFAULT_NAME)
manufacturer = DEFAULT_MANUFACTURER manufacturer = DEFAULT_MANUFACTURER
instance_number = int(options.get('instance', "0"))
if server_host == '_' or not server_host:
server_host = 'localhost'
if not server_port:
# Look for the gRPC config in a .ini file
server_host = 'localhost'
server_port = find_grpc_port(instance_number)
if not server_port:
raise RuntimeError('gRPC server port not found')
# Connect to the gRPC server
server_address = f'{server_host}:{server_port}'
logger.debug(f'Connecting to gRPC server at {server_address}')
channel = grpc.aio.insecure_channel(server_address)
# Connect as a host # Connect as a host
service = PacketStreamerStub(channel) service = PacketStreamerStub(channel)
@@ -420,7 +436,9 @@ async def open_android_netsim_transport(spec: Optional[str]) -> Transport:
mode = options.get('mode', 'host') mode = options.get('mode', 'host')
if mode == 'host': if mode == 'host':
return await open_android_netsim_host_transport(host, port, options) return await open_android_netsim_host_transport_with_address(
host, port, options
)
if mode == 'controller': if mode == 'controller':
if host is None: if host is None:
raise ValueError('<host>:<port> missing') raise ValueError('<host>:<port> missing')