From 0a55cfa358e54ab5f47c2a54ae4d1bf8f8581dca Mon Sep 17 00:00:00 2001 From: claireyywang Date: Mon, 19 Aug 2019 17:31:08 -0700 Subject: [PATCH 01/10] add network checks and report Signed-off-by: claireyywang --- ros2doctor/ros2doctor/api/network.py | 91 ++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 ros2doctor/ros2doctor/api/network.py diff --git a/ros2doctor/ros2doctor/api/network.py b/ros2doctor/ros2doctor/api/network.py new file mode 100644 index 000000000..e1556ac69 --- /dev/null +++ b/ros2doctor/ros2doctor/api/network.py @@ -0,0 +1,91 @@ +# Copyright 2019 Open Source Robotics Foundation, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import netifaces +import platform +import socket +import sys + + +def _is_unix_like_platform(): + """Return True is conforms to UNIX/POSIX-style APIs.""" + return platform.system() in ['Linux', 'FreeBSD', 'Darwin'] + + +def _use_ipv6(): + """Check if ROS uses IPV6""" + ipv6 = os.environ.get('ROS_IPV6') + return ipv6 and ipv6 == 'on' + + +def get_local_addresses(): + """Fetch a list of local IP addresses.""" + local_addrs = [] + if _is_unix_like_platform(): + ipv4_addrs = [] + ipv6_addrs = [] + for i in netifaces.interfaces(): + addrs = netifaces.ifaddresses(i) + if socket.AF_INET in addrs: + v4addrs.extend([addr['addr'] for addr in addrs[socket.AF_INET]]) + if socket.AF_INET6 in addrs: + v6addrs.extend([addr['addr'] for addr in addrs[socket.AF_INET6]]) + if _use_ipv6(): + local_addrs = ipv4_addrs + ipv6_addrs + else: + local_addrs = ipv4_addrs + else: + # can only resolve one address on other platforms? + if _use_ipv6(): + local_addrs = [host[4][0] for host in socket.getaddrinfo(socket.gethostname(),\ + 0, 0, 0, socket.SOL_TCP)] + else: + local_addrs = [host[4][0] for host in socket.getaddrinfo(socket.gethostname(),\ + 0, socket.AF_INET, 0, socket.SOL_TCP)] + return local_addrs + + +def check_sys_ips(): + """Compare roslib's routine against socket resolution to see if they agree.""" + #TODO figure out the significance of this check + pass + +# def check_ros_hostname(): +# """Check if ROS_HOSTNAME resolves to a local IP address.""" +# hostname = +# pass + +def check_ros_ip(): + """Check if ROS_IP is a local IP address.""" + + pass + + +# Error / Warning Rules + +warnings = {} + +errors = {} + + +def check_network(): + """Conduct network checks and output error/warning messages.""" + + pass + + +def print_network(): + """Print all system and ROS network information.""" + + pass From 9f2428eea77106d0cd1ec0e636ca0bf7827bfae4 Mon Sep 17 00:00:00 2001 From: claireyywang Date: Tue, 20 Aug 2019 17:09:55 -0700 Subject: [PATCH 02/10] network shenanigens Signed-off-by: claireyywang --- ros2doctor/ros2doctor/api/network.py | 75 +++++++++++++++------------ ros2doctor/ros2doctor/api/platform.py | 22 ++++---- ros2doctor/setup.py | 1 + 3 files changed, 54 insertions(+), 44 deletions(-) diff --git a/ros2doctor/ros2doctor/api/network.py b/ros2doctor/ros2doctor/api/network.py index e1556ac69..7d5938b8f 100644 --- a/ros2doctor/ros2doctor/api/network.py +++ b/ros2doctor/ros2doctor/api/network.py @@ -12,7 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. +import ipaddress import netifaces +import os import platform import socket import sys @@ -23,10 +25,10 @@ def _is_unix_like_platform(): return platform.system() in ['Linux', 'FreeBSD', 'Darwin'] -def _use_ipv6(): - """Check if ROS uses IPV6""" - ipv6 = os.environ.get('ROS_IPV6') - return ipv6 and ipv6 == 'on' +# def _use_ipv6(): +# """Check if ROS uses IPV6""" +# ipv6 = os.environ.get('ROS_IPV6') +# return ipv6 and ipv6 == 'on' def get_local_addresses(): @@ -38,16 +40,16 @@ def get_local_addresses(): for i in netifaces.interfaces(): addrs = netifaces.ifaddresses(i) if socket.AF_INET in addrs: - v4addrs.extend([addr['addr'] for addr in addrs[socket.AF_INET]]) + ipv4_addrs.extend([addr['addr'] for addr in addrs[socket.AF_INET]]) if socket.AF_INET6 in addrs: - v6addrs.extend([addr['addr'] for addr in addrs[socket.AF_INET6]]) - if _use_ipv6(): + ipv6_addrs.extend([addr['addr'] for addr in addrs[socket.AF_INET6]]) + if socket.has_ipv6: local_addrs = ipv4_addrs + ipv6_addrs else: local_addrs = ipv4_addrs else: # can only resolve one address on other platforms? - if _use_ipv6(): + if socket.has_ipv6: local_addrs = [host[4][0] for host in socket.getaddrinfo(socket.gethostname(),\ 0, 0, 0, socket.SOL_TCP)] else: @@ -56,36 +58,45 @@ def get_local_addresses(): return local_addrs -def check_sys_ips(): - """Compare roslib's routine against socket resolution to see if they agree.""" - #TODO figure out the significance of this check - pass - -# def check_ros_hostname(): -# """Check if ROS_HOSTNAME resolves to a local IP address.""" -# hostname = -# pass - -def check_ros_ip(): - """Check if ROS_IP is a local IP address.""" - - pass - - -# Error / Warning Rules - -warnings = {} - -errors = {} +def check_sys_ips(local_addrs): + """Check if loopback and multicast IP addresses are present.""" + has_loopback = False + has_others = False + has_multicast = False + for addr in local_addrs: + try: + addr_obj = ipaddress.ip_address(addr) + except ValueError: + continue + if addr_obj.is_loopback: + has_loopback = True + else: + has_others = True + # if addr_obj.is_multicast: + # has_multicast = True + return has_loopback, has_others, has_multicast def check_network(): """Conduct network checks and output error/warning messages.""" - - pass + result = False + local_addrs = get_local_addresses() + if not local_addrs: + sys.stderr.write('ERROR: No local IP addresses found.\n') + return result + else: + has_loopback, has_others, has_multicast = check_sys_ips(local_addrs) + if not has_loopback: + sys.stderr.write('ERROR: No loopback IP address is found.\n') + if not has_others: + sys.stderr.write('WARNING: Only loopback IP address is found.\n') + # if not has_multicast: + # sys.stderr.write('WARNING: No multicast IP address found.\n') + if has_loopback and has_others: + result = True + return result def print_network(): """Print all system and ROS network information.""" - pass diff --git a/ros2doctor/ros2doctor/api/platform.py b/ros2doctor/ros2doctor/api/platform.py index 02d879fb7..03d8c2d93 100644 --- a/ros2doctor/ros2doctor/api/platform.py +++ b/ros2doctor/ros2doctor/api/platform.py @@ -42,19 +42,19 @@ def check_platform_helper(): """Check ROS_DISTRO related environment variables and distribution name.""" distro_name = os.environ.get('ROS_DISTRO') if not distro_name: - sys.stderr.write('WARNING: ROS_DISTRO is not set.') + sys.stderr.write('WARNING: ROS_DISTRO is not set.\n') return else: distro_name = distro_name.lower() u = rosdistro.get_index_url() if not u: - sys.stderr.write('WARNING: Unable to access ROSDISTRO_INDEX_URL\ - or DEFAULT_INDEX_URL.') + sys.stderr.write('WARNING: Unable to access ROSDISTRO_INDEX_URL ' + 'or DEFAULT_INDEX_URL.\n') return i = rosdistro.get_index(u) distro_info = i.distributions.get(distro_name) if not distro_info: - sys.stderr.write("WARNING: Distribution name '%s' is not found" % distro_name) + sys.stderr.write("WARNING: Distribution name '%s' is not found\n" % distro_name) return distro_data = rosdistro.get_distribution(i, distro_name).get_data() return distro_name, distro_info, distro_data @@ -84,15 +84,13 @@ def check_platform(): # check distro status if distro_info.get('distribution_status') == 'prerelease': - sys.stderr.write('WARNING: Distribution is not fully supported or tested.\ - To get more stable features,\ - Download a stable version at\ - https://index.ros.org/doc/ros2/Installation/') + sys.stderr.write('WARNING: Distribution is not fully supported or tested. ' + 'To get more stable features, download a stable version at ' + 'https://index.ros.org/doc/ros2/Installation/\n') elif distro_info.get('distribution_status') == 'end-of-life': - sys.stderr.write('WARNING: Distribution is no longer supported or deprecated.\ - To get the latest features,\ - Download the latest version at\ - https://index.ros.org/doc/ros2/Installation/') + sys.stderr.write('WARNING: Distribution is no longer supported or deprecated. ' + 'To get the latest features, download the latest version at ' + 'https://index.ros.org/doc/ros2/Installation/') else: passed = True return passed diff --git a/ros2doctor/setup.py b/ros2doctor/setup.py index 41efa6b03..8b253d913 100644 --- a/ros2doctor/setup.py +++ b/ros2doctor/setup.py @@ -32,6 +32,7 @@ ], 'ros2doctor.checks': [ 'check_platform = ros2doctor.api.platform:check_platform', + 'check_network = ros2doctor.api.network:check_network', ], 'ros2doctor.report': [ 'report_platform = ros2doctor.api.platform:print_platform_info', From f1d4071753b3c61b6fe14260e34cafccf7fd4c62 Mon Sep 17 00:00:00 2001 From: claireyywang Date: Tue, 20 Aug 2019 17:13:25 -0700 Subject: [PATCH 03/10] network shenanigens Signed-off-by: claireyywang --- ros2doctor/ros2doctor/api/network.py | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/ros2doctor/ros2doctor/api/network.py b/ros2doctor/ros2doctor/api/network.py index 7d5938b8f..e1e585c37 100644 --- a/ros2doctor/ros2doctor/api/network.py +++ b/ros2doctor/ros2doctor/api/network.py @@ -25,12 +25,6 @@ def _is_unix_like_platform(): return platform.system() in ['Linux', 'FreeBSD', 'Darwin'] -# def _use_ipv6(): -# """Check if ROS uses IPV6""" -# ipv6 = os.environ.get('ROS_IPV6') -# return ipv6 and ipv6 == 'on' - - def get_local_addresses(): """Fetch a list of local IP addresses.""" local_addrs = [] @@ -40,8 +34,10 @@ def get_local_addresses(): for i in netifaces.interfaces(): addrs = netifaces.ifaddresses(i) if socket.AF_INET in addrs: + # get ipv4 addresses from all interfaces ipv4_addrs.extend([addr['addr'] for addr in addrs[socket.AF_INET]]) if socket.AF_INET6 in addrs: + # get ipv6 addresses from all interfaces ipv6_addrs.extend([addr['addr'] for addr in addrs[socket.AF_INET6]]) if socket.has_ipv6: local_addrs = ipv4_addrs + ipv6_addrs @@ -62,7 +58,6 @@ def check_sys_ips(local_addrs): """Check if loopback and multicast IP addresses are present.""" has_loopback = False has_others = False - has_multicast = False for addr in local_addrs: try: addr_obj = ipaddress.ip_address(addr) @@ -72,9 +67,7 @@ def check_sys_ips(local_addrs): has_loopback = True else: has_others = True - # if addr_obj.is_multicast: - # has_multicast = True - return has_loopback, has_others, has_multicast + return has_loopback, has_others def check_network(): @@ -85,13 +78,11 @@ def check_network(): sys.stderr.write('ERROR: No local IP addresses found.\n') return result else: - has_loopback, has_others, has_multicast = check_sys_ips(local_addrs) + has_loopback, has_others = check_sys_ips(local_addrs) if not has_loopback: sys.stderr.write('ERROR: No loopback IP address is found.\n') if not has_others: sys.stderr.write('WARNING: Only loopback IP address is found.\n') - # if not has_multicast: - # sys.stderr.write('WARNING: No multicast IP address found.\n') if has_loopback and has_others: result = True return result From eee518c8294e233dea3c7415edb8f768f768c088 Mon Sep 17 00:00:00 2001 From: claireyywang Date: Tue, 20 Aug 2019 17:17:11 -0700 Subject: [PATCH 04/10] network shenanigens Signed-off-by: claireyywang --- ros2doctor/ros2doctor/api/network.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ros2doctor/ros2doctor/api/network.py b/ros2doctor/ros2doctor/api/network.py index e1e585c37..55b0fdcbf 100644 --- a/ros2doctor/ros2doctor/api/network.py +++ b/ros2doctor/ros2doctor/api/network.py @@ -90,4 +90,6 @@ def check_network(): def print_network(): """Print all system and ROS network information.""" + local_addrs = get_local_addresses() + print('Local addresses: ', *local_addrs) pass From 0a13602a76c5768123920c1c52558c5b6975a579 Mon Sep 17 00:00:00 2001 From: claireyywang Date: Wed, 21 Aug 2019 12:06:42 -0700 Subject: [PATCH 05/10] add network check and report Signed-off-by: claireyywang --- ros2doctor/package.xml | 2 +- ros2doctor/ros2doctor/api/format.py | 20 ++++++ ros2doctor/ros2doctor/api/network.py | 84 ++++++++----------------- ros2doctor/ros2doctor/api/platform.py | 28 +++++---- ros2doctor/ros2doctor/command/doctor.py | 2 +- ros2doctor/setup.py | 3 +- 6 files changed, 67 insertions(+), 72 deletions(-) create mode 100644 ros2doctor/ros2doctor/api/format.py diff --git a/ros2doctor/package.xml b/ros2doctor/package.xml index 90f3b5810..c82ad9cb4 100644 --- a/ros2doctor/package.xml +++ b/ros2doctor/package.xml @@ -9,7 +9,7 @@ ros2cli - python3-numpy + python3-ifcfg python3-rosdistro-modules ament_copyright diff --git a/ros2doctor/ros2doctor/api/format.py b/ros2doctor/ros2doctor/api/format.py new file mode 100644 index 000000000..4d89abf9c --- /dev/null +++ b/ros2doctor/ros2doctor/api/format.py @@ -0,0 +1,20 @@ +# Copyright 2019 Open Source Robotics Foundation, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +def print_term(k, v): + """Print term only if it exists.""" + if v: + # TODO: 20 padding needs to be dynamically set + print('{:20}: {}'.format(k,v)) diff --git a/ros2doctor/ros2doctor/api/network.py b/ros2doctor/ros2doctor/api/network.py index 55b0fdcbf..d23821140 100644 --- a/ros2doctor/ros2doctor/api/network.py +++ b/ros2doctor/ros2doctor/api/network.py @@ -12,84 +12,54 @@ # See the License for the specific language governing permissions and # limitations under the License. -import ipaddress -import netifaces -import os import platform -import socket import sys +import ifcfg + +from ros2doctor.api.format import print_term + def _is_unix_like_platform(): """Return True is conforms to UNIX/POSIX-style APIs.""" return platform.system() in ['Linux', 'FreeBSD', 'Darwin'] -def get_local_addresses(): - """Fetch a list of local IP addresses.""" - local_addrs = [] - if _is_unix_like_platform(): - ipv4_addrs = [] - ipv6_addrs = [] - for i in netifaces.interfaces(): - addrs = netifaces.ifaddresses(i) - if socket.AF_INET in addrs: - # get ipv4 addresses from all interfaces - ipv4_addrs.extend([addr['addr'] for addr in addrs[socket.AF_INET]]) - if socket.AF_INET6 in addrs: - # get ipv6 addresses from all interfaces - ipv6_addrs.extend([addr['addr'] for addr in addrs[socket.AF_INET6]]) - if socket.has_ipv6: - local_addrs = ipv4_addrs + ipv6_addrs - else: - local_addrs = ipv4_addrs - else: - # can only resolve one address on other platforms? - if socket.has_ipv6: - local_addrs = [host[4][0] for host in socket.getaddrinfo(socket.gethostname(),\ - 0, 0, 0, socket.SOL_TCP)] - else: - local_addrs = [host[4][0] for host in socket.getaddrinfo(socket.gethostname(),\ - 0, socket.AF_INET, 0, socket.SOL_TCP)] - return local_addrs - - -def check_sys_ips(local_addrs): +def check_sys_ips(): """Check if loopback and multicast IP addresses are present.""" has_loopback = False has_others = False - for addr in local_addrs: - try: - addr_obj = ipaddress.ip_address(addr) - except ValueError: - continue - if addr_obj.is_loopback: + has_multicast = False + for name, iface in ifcfg.interfaces().items(): + flags = iface.get('flags') + if 'LOOPBACK' in flags: has_loopback = True else: has_others = True - return has_loopback, has_others + if 'MULTICAST' in flags: + has_multicast = True + return has_loopback, has_others, has_multicast -def check_network(): +def check_network_config(): """Conduct network checks and output error/warning messages.""" result = False - local_addrs = get_local_addresses() - if not local_addrs: - sys.stderr.write('ERROR: No local IP addresses found.\n') - return result - else: - has_loopback, has_others = check_sys_ips(local_addrs) - if not has_loopback: - sys.stderr.write('ERROR: No loopback IP address is found.\n') - if not has_others: - sys.stderr.write('WARNING: Only loopback IP address is found.\n') - if has_loopback and has_others: - result = True + has_loopback, has_others, has_multicast = check_sys_ips() + if not has_loopback: + sys.stderr.write('ERROR: No loopback IP address is found.\n') + if not has_others: + sys.stderr.write('WARNING: Only loopback IP address is found.\n') + if not has_multicast: + sys.stderr.write('WARNING: No multicast IP address is found.\n') + if has_loopback and has_others and has_multicast: + result = True return result def print_network(): """Print all system and ROS network information.""" - local_addrs = get_local_addresses() - print('Local addresses: ', *local_addrs) - pass + print('NETWORK CONFIGURATION') + for name, iface in ifcfg.interfaces().items(): + for k, v in iface.items(): + print_term(k, v) + print('\n') diff --git a/ros2doctor/ros2doctor/api/platform.py b/ros2doctor/ros2doctor/api/platform.py index 03d8c2d93..cd31b5a53 100644 --- a/ros2doctor/ros2doctor/api/platform.py +++ b/ros2doctor/ros2doctor/api/platform.py @@ -16,6 +16,8 @@ import platform import sys +from ros2doctor.api.format import print_term + import rosdistro @@ -24,18 +26,19 @@ def print_platform_info(): platform_name = platform.system() # platform info print('PLATFORM INFORMATION') - print('system : ', platform_name) - print('Platform Info : ', platform.platform()) + print_term('system', platform_name) + print_term('platform info', platform.platform()) if platform_name == 'Darwin': - print('Mac OS version : ', platform.mac_ver()) - print('release : ', platform.release()) - print('processor : ', platform.processor()) + print_term('mac OS version', platform.mac_ver()) + print_term('release', platform.release()) + print_term('processor', platform.processor()) # python info print('PYTHON INFORMATION') - print('version : ', platform.python_version()) - print('compiler : ', platform.python_compiler()) - print('build : ', platform.python_build()) + print_term('version', platform.python_version()) + print_term('compiler', platform.python_compiler()) + print_term('build', platform.python_build()) + print('\n') def check_platform_helper(): @@ -68,10 +71,11 @@ def print_ros2_info(): distro_name, distro_info, distro_data = distros print('ROS INFORMATION') - print('distribution name : ', distro_name) - print('distribution type : ', distro_info.get('distribution_type')) - print('distribution status : ', distro_info.get('distribution_status')) - print('release platforms : ', distro_data.get('release_platforms')) + print_term('distribution name', distro_name) + print_term('distribution type', distro_info.get('distribution_type')) + print_term('distribution status', distro_info.get('distribution_status')) + print_term('release platforms', distro_data.get('release_platforms')) + print('\n') def check_platform(): diff --git a/ros2doctor/ros2doctor/command/doctor.py b/ros2doctor/ros2doctor/command/doctor.py index 43f01b3e8..3cbf00551 100644 --- a/ros2doctor/ros2doctor/command/doctor.py +++ b/ros2doctor/ros2doctor/command/doctor.py @@ -41,6 +41,6 @@ def main(self, *, parser, args): class WtfCommand(DoctorCommand): - """Add `wtf` as alias to `doctor`.""" + """Use `wtf` as alias to `doctor`.""" pass diff --git a/ros2doctor/setup.py b/ros2doctor/setup.py index 8b253d913..200842c48 100644 --- a/ros2doctor/setup.py +++ b/ros2doctor/setup.py @@ -32,11 +32,12 @@ ], 'ros2doctor.checks': [ 'check_platform = ros2doctor.api.platform:check_platform', - 'check_network = ros2doctor.api.network:check_network', + 'check_network_config = ros2doctor.api.network:check_network_config', ], 'ros2doctor.report': [ 'report_platform = ros2doctor.api.platform:print_platform_info', 'report_ros_distro = ros2doctor.api.platform:print_ros2_info', + 'report_network_config = ros2doctor.api.network:print_network', ], } ) From f0b0ce9d32deb13f9e65f2ac5c9719c9d62b2fa8 Mon Sep 17 00:00:00 2001 From: claireyywang Date: Wed, 21 Aug 2019 13:29:08 -0700 Subject: [PATCH 06/10] update code format Signed-off-by: claireyywang --- ros2doctor/ros2doctor/api/format.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ros2doctor/ros2doctor/api/format.py b/ros2doctor/ros2doctor/api/format.py index 4d89abf9c..22125d3be 100644 --- a/ros2doctor/ros2doctor/api/format.py +++ b/ros2doctor/ros2doctor/api/format.py @@ -17,4 +17,4 @@ def print_term(k, v): """Print term only if it exists.""" if v: # TODO: 20 padding needs to be dynamically set - print('{:20}: {}'.format(k,v)) + print('{:20}: {}'.format(k, v)) From 5dec7e141bb3252bc30e15a69442c90fe78b9f74 Mon Sep 17 00:00:00 2001 From: claireyywang Date: Wed, 21 Aug 2019 14:18:14 -0700 Subject: [PATCH 07/10] revised code format Signed-off-by: claireyywang --- ros2doctor/ros2doctor/api/network.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/ros2doctor/ros2doctor/api/network.py b/ros2doctor/ros2doctor/api/network.py index d23821140..9172bcd2e 100644 --- a/ros2doctor/ros2doctor/api/network.py +++ b/ros2doctor/ros2doctor/api/network.py @@ -21,15 +21,13 @@ def _is_unix_like_platform(): - """Return True is conforms to UNIX/POSIX-style APIs.""" + """Return True if conforms to UNIX/POSIX-style APIs.""" return platform.system() in ['Linux', 'FreeBSD', 'Darwin'] def check_sys_ips(): - """Check if loopback and multicast IP addresses are present.""" - has_loopback = False - has_others = False - has_multicast = False + """Check if loopback and multicast IP addresses are found.""" + has_loopback, has_others, has_multicast = False, False, False for name, iface in ifcfg.interfaces().items(): flags = iface.get('flags') if 'LOOPBACK' in flags: From 0e3f0b6836b42e4fbf161a05c2b4032ca2cde71c Mon Sep 17 00:00:00 2001 From: Claire Wang Date: Wed, 21 Aug 2019 15:42:47 -0700 Subject: [PATCH 08/10] add ifcfg-pip rosdep key waiting for rosdistro PR approval https://github.com/ros/rosdistro/pull/22071 --- ros2doctor/package.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ros2doctor/package.xml b/ros2doctor/package.xml index c82ad9cb4..b891bf384 100644 --- a/ros2doctor/package.xml +++ b/ros2doctor/package.xml @@ -9,7 +9,7 @@ ros2cli - python3-ifcfg + ifcfg-pip python3-rosdistro-modules ament_copyright From 871a350d211544d0f176ba80114998b9e6dce278 Mon Sep 17 00:00:00 2001 From: claireyywang Date: Wed, 21 Aug 2019 15:40:18 -0700 Subject: [PATCH 09/10] added rosdep key ifcfg-pip Signed-off-by: claireyywang --- ros2doctor/package.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ros2doctor/package.xml b/ros2doctor/package.xml index c82ad9cb4..b891bf384 100644 --- a/ros2doctor/package.xml +++ b/ros2doctor/package.xml @@ -9,7 +9,7 @@ ros2cli - python3-ifcfg + ifcfg-pip python3-rosdistro-modules ament_copyright From 23890976cd0f0b3f271ab50a08a1cb7c67fcb216 Mon Sep 17 00:00:00 2001 From: claireyywang Date: Fri, 23 Aug 2019 14:05:31 -0700 Subject: [PATCH 10/10] revise code Signed-off-by: claireyywang --- ros2doctor/package.xml | 2 +- ros2doctor/ros2doctor/api/format.py | 2 +- ros2doctor/ros2doctor/api/network.py | 21 +++++++++------------ 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/ros2doctor/package.xml b/ros2doctor/package.xml index b891bf384..47101106f 100644 --- a/ros2doctor/package.xml +++ b/ros2doctor/package.xml @@ -9,7 +9,7 @@ ros2cli - ifcfg-pip + ifcfg_vendor python3-rosdistro-modules ament_copyright diff --git a/ros2doctor/ros2doctor/api/format.py b/ros2doctor/ros2doctor/api/format.py index 22125d3be..7241fca7b 100644 --- a/ros2doctor/ros2doctor/api/format.py +++ b/ros2doctor/ros2doctor/api/format.py @@ -16,5 +16,5 @@ def print_term(k, v): """Print term only if it exists.""" if v: - # TODO: 20 padding needs to be dynamically set + # TODO(clairewang): 20 padding needs to be dynamically set print('{:20}: {}'.format(k, v)) diff --git a/ros2doctor/ros2doctor/api/network.py b/ros2doctor/ros2doctor/api/network.py index 9172bcd2e..682671fc6 100644 --- a/ros2doctor/ros2doctor/api/network.py +++ b/ros2doctor/ros2doctor/api/network.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -import platform +import os import sys import ifcfg @@ -22,36 +22,33 @@ def _is_unix_like_platform(): """Return True if conforms to UNIX/POSIX-style APIs.""" - return platform.system() in ['Linux', 'FreeBSD', 'Darwin'] + return os.name == 'posix' -def check_sys_ips(): +def check_network_config_helper(): """Check if loopback and multicast IP addresses are found.""" - has_loopback, has_others, has_multicast = False, False, False + has_loopback, has_non_loopback, has_multicast = False, False, False for name, iface in ifcfg.interfaces().items(): flags = iface.get('flags') if 'LOOPBACK' in flags: has_loopback = True else: - has_others = True + has_non_loopback = True if 'MULTICAST' in flags: has_multicast = True - return has_loopback, has_others, has_multicast + return has_loopback, has_non_loopback, has_multicast def check_network_config(): """Conduct network checks and output error/warning messages.""" - result = False - has_loopback, has_others, has_multicast = check_sys_ips() + has_loopback, has_non_loopback, has_multicast = check_network_config_helper() if not has_loopback: sys.stderr.write('ERROR: No loopback IP address is found.\n') - if not has_others: + if not has_non_loopback: sys.stderr.write('WARNING: Only loopback IP address is found.\n') if not has_multicast: sys.stderr.write('WARNING: No multicast IP address is found.\n') - if has_loopback and has_others and has_multicast: - result = True - return result + return has_loopback and has_non_loopback and has_multicast def print_network():