Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions ros2cli/ros2cli/daemon/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@

from ros2cli.helpers import before_invocation
from ros2cli.helpers import get_ros_domain_id
from ros2cli.helpers import pretty_print_call

from ros2cli.node.network_aware import NetworkAwareNode

Expand Down Expand Up @@ -76,6 +75,7 @@ def serve(server: LocalXMLRPCServer, *, timeout: int = 2 * 60 * 60):
start_parameter_services=False,
start_type_description_service=False)
with NetworkAwareNode(node_args) as node:
daemon_logger = node.get_logger()
functions = [
node.get_name,
node.get_namespace,
Expand Down Expand Up @@ -117,7 +117,8 @@ def serve(server: LocalXMLRPCServer, *, timeout: int = 2 * 60 * 60):
def reset_timer_and_pretty_print(func, *args, **kwargs):
nonlocal last_function_call_time
last_function_call_time = time.time()
pretty_print_call(func, args, kwargs)
arguments = ', '.join([f'{v!r}' for v in (args, kwargs)])
daemon_logger.info(f'{func.__name__}({arguments})')

server.register_introspection_functions()
for func in functions:
Expand All @@ -131,19 +132,20 @@ def timeout_handler():
nonlocal shutdown

if time.time() - last_function_call_time > timeout:
print('Shutdown due to timeout')
daemon_logger.info('Shutdown due to timeout')
shutdown = True
server.handle_timeout = timeout_handler
server.timeout = 0.2

# function to shutdown daemon remotely
def shutdown_handler():
nonlocal shutdown
print('Remote shutdown requested')
daemon_logger.info('Remote shutdown requested')
shutdown = True
server.register_function(shutdown_handler, 'system.shutdown')

print('Serving XML-RPC on ' + get_xmlrpc_server_url(server.server_address))
daemon_logger.info(
f'Serving XML-RPC on {get_xmlrpc_server_url(server.server_address)}')
try:
while rclpy.ok() and not shutdown:
server.handle_request()
Expand Down
11 changes: 6 additions & 5 deletions ros2cli/ros2cli/node/network_aware.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,10 @@
from ros2cli.node.direct import DirectNode


def get_interfaces_ip_addresses():
def get_interfaces_ip_addresses(logger=None):
addresses_by_interfaces = psutil.net_if_addrs()
print(f'Addresses by interfaces: {addresses_by_interfaces}')
if logger is not None:
logger.info(f'Addresses by interfaces: {addresses_by_interfaces}')
return addresses_by_interfaces


Expand All @@ -35,7 +36,7 @@ def __init__(self, args):
# TODO(ivanpauno): A race condition is possible here, since it isn't possible to know
# exactly which interfaces were available at node creation.
self.node = DirectNode(args)
self.addresses_at_start = get_interfaces_ip_addresses()
self.addresses_at_start = get_interfaces_ip_addresses(self.node.get_logger())

def __enter__(self):
self.node.__enter__()
Expand All @@ -59,11 +60,11 @@ def __exit__(self, exc_type, exc_value, traceback):
self.node.__exit__(exc_type, exc_value, traceback)

def reset_if_addresses_changed(self):
new_addresses = get_interfaces_ip_addresses()
new_addresses = get_interfaces_ip_addresses(self.node.get_logger())
if new_addresses != self.addresses_at_start:
self.addresses_at_start = new_addresses
self.node.destroy_node()
rclpy.shutdown()
self.node = DirectNode(self.args)
self.node.__enter__()
print('Network interfaces changed, daemon node was reset!')
self.node.get_logger().info('Network interfaces changed, daemon node was reset!')