From b6f7556801d1a0993e935dd5fb92c1fdbbcfb713 Mon Sep 17 00:00:00 2001 From: Kyle Fazzari Date: Wed, 8 Apr 2020 13:34:45 -0700 Subject: [PATCH 1/2] api: create _artifact_generation.py from __init__.py Signed-off-by: Kyle Fazzari --- sros2/sros2/api/{__init__.py => _artifact_generation.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sros2/sros2/api/{__init__.py => _artifact_generation.py} (100%) diff --git a/sros2/sros2/api/__init__.py b/sros2/sros2/api/_artifact_generation.py similarity index 100% rename from sros2/sros2/api/__init__.py rename to sros2/sros2/api/_artifact_generation.py From 6e53e90f5089e6565b53df1a4821c8604cd2d0b6 Mon Sep 17 00:00:00 2001 From: Kyle Fazzari Date: Wed, 8 Apr 2020 13:47:00 -0700 Subject: [PATCH 2/2] api: split off _artifact_generation.py from __init__.py Signed-off-by: Kyle Fazzari --- sros2/sros2/api/__init__.py | 64 ++++++++++++++++++++++++ sros2/sros2/api/_artifact_generation.py | 65 +------------------------ sros2/sros2/api/_utilities.py | 9 ++++ sros2/sros2/verb/generate_artifacts.py | 4 +- 4 files changed, 77 insertions(+), 65 deletions(-) create mode 100644 sros2/sros2/api/__init__.py diff --git a/sros2/sros2/api/__init__.py b/sros2/sros2/api/__init__.py new file mode 100644 index 00000000..1a0343ed --- /dev/null +++ b/sros2/sros2/api/__init__.py @@ -0,0 +1,64 @@ +# Copyright 2016-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. + +from collections import namedtuple + +HIDDEN_NODE_PREFIX = '_' + +NodeName = namedtuple('NodeName', ('node', 'ns', 'fqn')) +TopicInfo = namedtuple('Topic', ('fqn', 'type')) + + +def get_node_names(*, node, include_hidden_nodes=False): + node_names_and_namespaces = node.get_node_names_and_namespaces() + return [ + NodeName( + node=t[0], + ns=t[1], + fqn=t[1] + ('' if t[1].endswith('/') else '/') + t[0]) + for t in node_names_and_namespaces + if ( + include_hidden_nodes or + (t[0] and not t[0].startswith(HIDDEN_NODE_PREFIX)) + ) + ] + + +def get_topics(node_name, func): + names_and_types = func(node_name.node, node_name.ns) + return [ + TopicInfo( + fqn=t[0], + type=t[1]) + for t in names_and_types] + + +def get_subscriber_info(node, node_name): + return get_topics(node_name, node.get_subscriber_names_and_types_by_node) + + +def get_publisher_info(node, node_name): + return get_topics(node_name, node.get_publisher_names_and_types_by_node) + + +def get_service_info(node, node_name): + return get_topics(node_name, node.get_service_names_and_types_by_node) + + +def get_client_info(node, node_name): + return get_topics(node_name, node.get_client_names_and_types_by_node) + + +def distribute_key(source_keystore_path, taget_keystore_path): + raise NotImplementedError() diff --git a/sros2/sros2/api/_artifact_generation.py b/sros2/sros2/api/_artifact_generation.py index d59c761f..85223e7c 100644 --- a/sros2/sros2/api/_artifact_generation.py +++ b/sros2/sros2/api/_artifact_generation.py @@ -12,75 +12,14 @@ # See the License for the specific language governing permissions and # limitations under the License. -from collections import namedtuple -import os -import sys - from sros2.policy import load_policy -from . import _key, _keystore, _permission, _policy - -HIDDEN_NODE_PREFIX = '_' - -NodeName = namedtuple('NodeName', ('node', 'ns', 'fqn')) -TopicInfo = namedtuple('Topic', ('fqn', 'type')) - - -def get_node_names(*, node, include_hidden_nodes=False): - node_names_and_namespaces = node.get_node_names_and_namespaces() - return [ - NodeName( - node=t[0], - ns=t[1], - fqn=t[1] + ('' if t[1].endswith('/') else '/') + t[0]) - for t in node_names_and_namespaces - if ( - include_hidden_nodes or - (t[0] and not t[0].startswith(HIDDEN_NODE_PREFIX)) - ) - ] - - -def get_topics(node_name, func): - names_and_types = func(node_name.node, node_name.ns) - return [ - TopicInfo( - fqn=t[0], - type=t[1]) - for t in names_and_types] - - -def get_subscriber_info(node, node_name): - return get_topics(node_name, node.get_subscriber_names_and_types_by_node) - - -def get_publisher_info(node, node_name): - return get_topics(node_name, node.get_publisher_names_and_types_by_node) - - -def get_service_info(node, node_name): - return get_topics(node_name, node.get_service_names_and_types_by_node) - - -def get_client_info(node, node_name): - return get_topics(node_name, node.get_client_names_and_types_by_node) - - -def distribute_key(source_keystore_path, taget_keystore_path): - raise NotImplementedError() - - -def get_keystore_path_from_env(): - root_keystore_env_var = 'ROS_SECURITY_ROOT_DIRECTORY' - root_keystore_path = os.getenv(root_keystore_env_var) - if root_keystore_path is None: - print('%s is empty' % root_keystore_env_var, file=sys.stderr) - return root_keystore_path +from . import _key, _keystore, _permission, _policy, _utilities def generate_artifacts(keystore_path=None, identity_names=[], policy_files=[]): if keystore_path is None: - keystore_path = get_keystore_path_from_env() + keystore_path = _utilities.get_keystore_path_from_env() if keystore_path is None: return False if not _keystore.is_valid_keystore(keystore_path): diff --git a/sros2/sros2/api/_utilities.py b/sros2/sros2/api/_utilities.py index adee18b1..88996d71 100644 --- a/sros2/sros2/api/_utilities.py +++ b/sros2/sros2/api/_utilities.py @@ -15,6 +15,7 @@ import datetime import os +import sys from cryptography import x509 from cryptography.hazmat.backends import default_backend as cryptography_backend @@ -24,6 +25,7 @@ from cryptography.hazmat.primitives.asymmetric import ec _DOMAIN_ID_ENV = 'ROS_DOMAIN_ID' +_KEYSTORE_DIR_ENV = 'ROS_SECURITY_ROOT_DIRECTORY' def create_symlink(*, src, dst): @@ -40,6 +42,13 @@ def domain_id() -> str: return os.getenv(_DOMAIN_ID_ENV, '0') +def get_keystore_path_from_env(): + root_keystore_path = os.getenv(_KEYSTORE_DIR_ENV) + if root_keystore_path is None: + print('%s is empty' % _KEYSTORE_DIR_ENV, file=sys.stderr) + return root_keystore_path + + def create_smime_signed_file(cert_path, key_path, unsigned_file_path, signed_file_path): # Load the CA cert and key from disk with open(cert_path, 'rb') as cert_file: diff --git a/sros2/sros2/verb/generate_artifacts.py b/sros2/sros2/verb/generate_artifacts.py index c5d6de60..912eadcf 100644 --- a/sros2/sros2/verb/generate_artifacts.py +++ b/sros2/sros2/verb/generate_artifacts.py @@ -23,7 +23,7 @@ def DirectoriesCompleter(): def FilesCompleter(*, allowednames, directories): return None -from sros2.api import generate_artifacts +from sros2.api import _artifact_generation from sros2.verb import VerbExtension @@ -44,7 +44,7 @@ def add_arguments(self, parser, cli_name): def main(self, *, args): try: - success = generate_artifacts( + success = _artifact_generation.generate_artifacts( args.keystore_root_path, args.security_contexts, args.policy_files) except FileNotFoundError as e: raise RuntimeError(str(e))