From 07fdab726d0c06d3dd25344bf811b962087ac942 Mon Sep 17 00:00:00 2001 From: lnemsick-simp Date: Tue, 5 Oct 2021 15:12:35 -0400 Subject: [PATCH] (SIMP-9673) Write LDAP plugin and 389-DS integration test (#65) - Added - LDAP plugin - LDAP plugin acceptance test that demonstrates its use and integration with a 389-DS instance configured with the SIMP data schema - Initial LDAP plugin documentation, including a copy of the design documentation from Confluence. - Additional user documentation - Additional plugin developer documentation - Fixed - Few documentation typos in the plugin template and the file plugin - Maintenance updates - Added multiple plugin test that simultaneously uses the LDAP plugin and the file plugin - Reworked file plugin validator so it could be used in the test for multiple plugins - Fixed the OEL nodesets in the default suite (needed to be swapped) SIMP-9673 #close SIMP-9674 #close --- .fixtures.yml | 10 +- .gitlab-ci.yml | 105 +- CHANGELOG | 8 +- README.md | 748 ++++++++--- docs/Design_Prototype2.md | 71 +- docs/Use_of_LDAP_as_backend_for_simpkv.md | 549 ++++++++ .../LDAP DIT root.drawio | 1 + .../LDAP DIT root.png | Bin 0 -> 25357 bytes .../LDAP DIT snippet.drawio | 1 + .../LDAP DIT snippet.png | Bin 0 -> 14963 bytes .../Option 1 LDAP DIT.drawio | 1 + .../Option 1 LDAP DIT.png | Bin 0 -> 60847 bytes .../Option 2 LDAP DIT.drawio | 1 + .../Option 2 LDAP DIT.png | Bin 0 -> 134602 bytes .../SIMP OID Tree.drawio | 1 + .../SIMP OID Tree.png | Bin 0 -> 46209 bytes .../SIMP OID subtree option 1.drawio | 1 + .../SIMP OID subtree option 1.png | Bin 0 -> 21407 bytes .../SIMP OID subtree option 2.drawio | 1 + .../SIMP OID subtree option 2.png | Bin 0 -> 24759 bytes .../simpkv Key_Value Tree.drawio | 1 + .../simpkv Key_Value Tree.png | Bin 0 -> 48496 bytes .../simpkv retrieve operation.drawio | 1 + .../simpkv retrieve operation.png | Bin 0 -> 81411 bytes .../simpkv store operation.drawio | 1 + .../simpkv store operation.png | Bin 0 -> 65790 bytes docs/assets/LDAP_DIT_root.drawio | 1 + docs/assets/LDAP_DIT_root.png | Bin 0 -> 16462 bytes .../Logical_to_simpkv_DIT_mapping.drawio | 1 + docs/assets/Logical_to_simpkv_DIT_mapping.png | Bin 0 -> 85602 bytes docs/assets/simpkv_Key_Value_Tree.drawio | 1 + docs/assets/simpkv_Key_Value_Tree.png | Bin 0 -> 85014 bytes docs/assets/simpkv_OID_tree.drawio | 1 + docs/assets/simpkv_OID_tree.png | Bin 0 -> 34070 bytes docs/assets/simpkv_put_operation.drawio | 1 + docs/assets/simpkv_put_operation.png | Bin 0 -> 93877 bytes docs/simpkv_LDAP_DIT_and_schema.md | 123 ++ docs/simpkv_plugin_development_guide.md | 256 ++++ lib/puppet_x/simpkv/consul_provider.rb | 340 ----- lib/puppet_x/simpkv/file_plugin.rb | 15 +- lib/puppet_x/simpkv/ldap_plugin.rb | 1158 +++++++++++++++++ lib/puppet_x/simpkv/plugin_template.rb | 18 +- lib/puppet_x/simpkv/simpkv.rb | 14 +- spec/acceptance/helpers/ldap_utils.rb | 88 ++ spec/acceptance/helpers/test_data.rb | 2 +- spec/acceptance/helpers/utils.rb | 46 +- spec/acceptance/nodesets/oel.yml | 6 +- spec/acceptance/nodesets/oel7.yml | 6 +- .../suites/default/validate_file_entries.rb | 176 +-- .../suites/ldap_plugin/00_ldap_server_spec.rb | 95 ++ .../ldap_plugin/05_ldap_client_setup_spec.rb | 46 + .../suites/ldap_plugin/10_ldapi_spec.rb | 83 ++ .../suites/ldap_plugin/20_ldap_protos_spec.rb | 98 ++ .../suites/ldap_plugin/30_errors_spec.rb | 165 +++ .../suites/ldap_plugin/files/70simpkv.ldif | 44 + .../suites/ldap_plugin/files/bootstrap.ldif | 30 + .../ldap_plugin/ldap_test_configuration.rb | 100 ++ .../suites/ldap_plugin/nodesets/default.yml | 32 + .../suites/ldap_plugin/nodesets/oel.yml | 32 + .../ldap_plugin/validate_ldap_entries.rb | 181 +++ .../00_file_plugin_setup_spec.rb | 1 + .../multiple_plugins/00_ldap_server_spec.rb | 1 + .../05_ldap_client_setup_spec.rb | 1 + .../10_multiple_plugins_spec.rb | 98 ++ .../multiple_plugins/nodesets/default.yml | 25 + .../suites/multiple_plugins/nodesets/oel.yml | 25 + .../validate_multiple_plugins_entries.rb | 73 ++ spec/consul_support/README | 10 - spec/consul_support/Vagrantfile | 77 -- spec/consul_support/manifests/test.pp | 33 - spec/consul_support/prep_ci.sh | 14 - spec/consul_support/test/ca.crt | 22 - spec/consul_support/test/run.sh | 6 - spec/consul_support/test/server.crt | 22 - spec/consul_support/test/server.key | 28 - spec/unit/puppet_x/simpkv/ldap_plugin_spec.rb | 1127 ++++++++++++++++ spec/unit/puppet_x/simpkv/simpkv_spec.rb | 5 +- 77 files changed, 5334 insertions(+), 894 deletions(-) create mode 100644 docs/Use_of_LDAP_as_backend_for_simpkv.md create mode 100644 docs/Use_of_LDAP_as_backend_for_simpkv/LDAP DIT root.drawio create mode 100644 docs/Use_of_LDAP_as_backend_for_simpkv/LDAP DIT root.png create mode 100644 docs/Use_of_LDAP_as_backend_for_simpkv/LDAP DIT snippet.drawio create mode 100644 docs/Use_of_LDAP_as_backend_for_simpkv/LDAP DIT snippet.png create mode 100644 docs/Use_of_LDAP_as_backend_for_simpkv/Option 1 LDAP DIT.drawio create mode 100644 docs/Use_of_LDAP_as_backend_for_simpkv/Option 1 LDAP DIT.png create mode 100644 docs/Use_of_LDAP_as_backend_for_simpkv/Option 2 LDAP DIT.drawio create mode 100644 docs/Use_of_LDAP_as_backend_for_simpkv/Option 2 LDAP DIT.png create mode 100644 docs/Use_of_LDAP_as_backend_for_simpkv/SIMP OID Tree.drawio create mode 100644 docs/Use_of_LDAP_as_backend_for_simpkv/SIMP OID Tree.png create mode 100644 docs/Use_of_LDAP_as_backend_for_simpkv/SIMP OID subtree option 1.drawio create mode 100644 docs/Use_of_LDAP_as_backend_for_simpkv/SIMP OID subtree option 1.png create mode 100644 docs/Use_of_LDAP_as_backend_for_simpkv/SIMP OID subtree option 2.drawio create mode 100644 docs/Use_of_LDAP_as_backend_for_simpkv/SIMP OID subtree option 2.png create mode 100644 docs/Use_of_LDAP_as_backend_for_simpkv/simpkv Key_Value Tree.drawio create mode 100644 docs/Use_of_LDAP_as_backend_for_simpkv/simpkv Key_Value Tree.png create mode 100644 docs/Use_of_LDAP_as_backend_for_simpkv/simpkv retrieve operation.drawio create mode 100644 docs/Use_of_LDAP_as_backend_for_simpkv/simpkv retrieve operation.png create mode 100644 docs/Use_of_LDAP_as_backend_for_simpkv/simpkv store operation.drawio create mode 100644 docs/Use_of_LDAP_as_backend_for_simpkv/simpkv store operation.png create mode 100644 docs/assets/LDAP_DIT_root.drawio create mode 100644 docs/assets/LDAP_DIT_root.png create mode 100644 docs/assets/Logical_to_simpkv_DIT_mapping.drawio create mode 100644 docs/assets/Logical_to_simpkv_DIT_mapping.png create mode 100644 docs/assets/simpkv_Key_Value_Tree.drawio create mode 100644 docs/assets/simpkv_Key_Value_Tree.png create mode 100644 docs/assets/simpkv_OID_tree.drawio create mode 100644 docs/assets/simpkv_OID_tree.png create mode 100644 docs/assets/simpkv_put_operation.drawio create mode 100644 docs/assets/simpkv_put_operation.png create mode 100644 docs/simpkv_LDAP_DIT_and_schema.md create mode 100644 docs/simpkv_plugin_development_guide.md delete mode 100644 lib/puppet_x/simpkv/consul_provider.rb create mode 100644 lib/puppet_x/simpkv/ldap_plugin.rb create mode 100644 spec/acceptance/helpers/ldap_utils.rb create mode 100644 spec/acceptance/suites/ldap_plugin/00_ldap_server_spec.rb create mode 100644 spec/acceptance/suites/ldap_plugin/05_ldap_client_setup_spec.rb create mode 100644 spec/acceptance/suites/ldap_plugin/10_ldapi_spec.rb create mode 100644 spec/acceptance/suites/ldap_plugin/20_ldap_protos_spec.rb create mode 100644 spec/acceptance/suites/ldap_plugin/30_errors_spec.rb create mode 100644 spec/acceptance/suites/ldap_plugin/files/70simpkv.ldif create mode 100644 spec/acceptance/suites/ldap_plugin/files/bootstrap.ldif create mode 100644 spec/acceptance/suites/ldap_plugin/ldap_test_configuration.rb create mode 100644 spec/acceptance/suites/ldap_plugin/nodesets/default.yml create mode 100644 spec/acceptance/suites/ldap_plugin/nodesets/oel.yml create mode 100644 spec/acceptance/suites/ldap_plugin/validate_ldap_entries.rb create mode 120000 spec/acceptance/suites/multiple_plugins/00_file_plugin_setup_spec.rb create mode 120000 spec/acceptance/suites/multiple_plugins/00_ldap_server_spec.rb create mode 120000 spec/acceptance/suites/multiple_plugins/05_ldap_client_setup_spec.rb create mode 100644 spec/acceptance/suites/multiple_plugins/10_multiple_plugins_spec.rb create mode 100644 spec/acceptance/suites/multiple_plugins/nodesets/default.yml create mode 100644 spec/acceptance/suites/multiple_plugins/nodesets/oel.yml create mode 100644 spec/acceptance/suites/multiple_plugins/validate_multiple_plugins_entries.rb delete mode 100644 spec/consul_support/README delete mode 100644 spec/consul_support/Vagrantfile delete mode 100644 spec/consul_support/manifests/test.pp delete mode 100755 spec/consul_support/prep_ci.sh delete mode 100644 spec/consul_support/test/ca.crt delete mode 100755 spec/consul_support/test/run.sh delete mode 100644 spec/consul_support/test/server.crt delete mode 100644 spec/consul_support/test/server.key create mode 100644 spec/unit/puppet_x/simpkv/ldap_plugin_spec.rb diff --git a/.fixtures.yml b/.fixtures.yml index 2d45c82..da3c52f 100644 --- a/.fixtures.yml +++ b/.fixtures.yml @@ -1,8 +1,16 @@ --- fixtures: repositories: - stdlib: https://github.com/simp/puppetlabs-stdlib.git + ds389: https://github.com/simp/pupmod-simp-ds389.git + pki: https://github.com/simp/pupmod-simp-pki.git + selinux: https://github.com/simp/pupmod-simp-selinux.git simplib: https://github.com/simp/pupmod-simp-simplib.git + stdlib: https://github.com/simp/puppetlabs-stdlib.git + systemd: https://github.com/simp/puppet-systemd.git + vox_selinux: + repo: https://github.com/simp/pupmod-voxpupuli-selinux.git + branch: simp-master + # This needs to be in place for the rspec-puppet Hiera 5 hook to work # No idea why, it may be because Puppet sees a custom backend and loads all # of the global parts. diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index eca7bf6..beb40bc 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -332,21 +332,34 @@ pup7.x-unit: # Repo-specific content # ============================================================================== +# default suite: Exercises the file plugin with file plugin-specific +# validation and special cases +# ldap_suite: Exercises the ldap_plugin with ldap plugin-specific +# validation and special cases +# multiple_plugins: Exercises both the file and ldap plugins simultaneously with +# their respective plugin-specific validation: +# - Test configures the simpkv backend configuration to have +# both plugins +# - Test ensures both plugins are used in individual catalog +# runs +# - Test does NOT include plugin special cases found in the +# individual plugin suites +# +#---- default suite ---- +# Nodesets: default -> CentOS8 +# oel -> OEL8 +# centos7 -> CentOS7 +# oel7 -> OEL7 pup6.x: <<: *pup_6_x <<: *acceptance_base script: - 'bundle exec rake beaker:suites[default,default]' -pup6.x-fips: - <<: *pup_6_x - <<: *acceptance_base - script: - - 'BEAKER_fips=yes bundle exec rake beaker:suites[default,default]' - pup6.pe: <<: *pup_6_pe <<: *acceptance_base + <<: *with_SIMP_ACCEPTANCE_MATRIX_LEVEL_3 script: - 'bundle exec rake beaker:suites[default,default]' @@ -357,62 +370,98 @@ pup6.pe-fips: script: - 'BEAKER_fips=yes bundle exec rake beaker:suites[default,default]' -pup6.x.centos7: - <<: *pup_6_x +pup6.pe-centos7: + <<: *pup_6_pe <<: *acceptance_base script: - 'bundle exec rake beaker:suites[default,centos7]' -pup6.x.centos7-fips: - <<: *pup_6_x +pup6.pe-oel: + <<: *pup_6_pe <<: *acceptance_base - <<: *with_SIMP_ACCEPTANCE_MATRIX_LEVEL_3 script: - - 'BEAKER_fips=yes bundle exec rake beaker:suites[default,centos7]' + - 'bundle exec rake beaker:suites[default,oel]' -pup6.pe.centos7: +pup6.pe-oel7: <<: *pup_6_pe <<: *acceptance_base <<: *with_SIMP_ACCEPTANCE_MATRIX_LEVEL_3 + script: + - 'bundle exec rake beaker:suites[default,oel7]' + +pup7.x: + <<: *pup_7_x + <<: *acceptance_base + script: + - 'bundle exec rake beaker:suites[default,default]' + +pup7.x-centos7: + <<: *pup_7_x + <<: *acceptance_base + <<: *with_SIMP_ACCEPTANCE_MATRIX_LEVEL_3 script: - 'bundle exec rake beaker:suites[default,centos7]' -pup6.pe-oel: - <<: *pup_6_pe +#---- ldap_plugin suite ---- +# Nodesets: default -> CentOS8 + CentOS7 +# oel -> OEL8 + OEL7 +pup6.x-ldap_plugin: + <<: *pup_6_x <<: *acceptance_base script: - - 'bundle exec rake beaker:suites[default,oel]' + - 'bundle exec rake beaker:suites[ldap_plugin,default]' -pup6.pe-oel-fips: +pup6.pe-ldap_plugin: <<: *pup_6_pe <<: *acceptance_base <<: *with_SIMP_ACCEPTANCE_MATRIX_LEVEL_3 script: - - 'BEAKER_fips=yes bundle exec rake beaker:suites[default,oel]' + - 'bundle exec rake beaker:suites[ldap_plugin,default]' -pup6.pe.centos7-oel: +pup6.pe-ldap_plugin-fips: <<: *pup_6_pe <<: *acceptance_base <<: *with_SIMP_ACCEPTANCE_MATRIX_LEVEL_3 script: - - 'bundle exec rake beaker:suites[default,oel7]' + - 'BEAKER_fips=yes bundle exec rake beaker:suites[ldap_plugin,default]' -pup6.pe.centos7-oel-fips: +pup6.pe-ldap_plugin-oel: <<: *pup_6_pe <<: *acceptance_base - <<: *with_SIMP_ACCEPTANCE_MATRIX_LEVEL_3 script: - - 'BEAKER_fips=yes bundle exec rake beaker:suites[default,oel7]' + - 'bundle exec rake beaker:suites[ldap_plugin,oel]' -pup7.x: +pup7.x-ldap_plugin: <<: *pup_7_x <<: *acceptance_base script: - - 'bundle exec rake beaker:suites[default,default]' + - 'bundle exec rake beaker:suites[ldap_plugin,default]' -pup7.x.centos7: - <<: *pup_7_x +#---- multiple_plugins suite ---- +# Nodesets: default -> CentOS8 +# oel -> OEL8 +pup6.x-multiple_plugin: + <<: *pup_6_x <<: *acceptance_base <<: *with_SIMP_ACCEPTANCE_MATRIX_LEVEL_3 script: - - 'bundle exec rake beaker:suites[default,centos7]' + - 'bundle exec rake beaker:suites[multiple_plugin,default]' + +pup6.pe-multiple_plugins: + <<: *pup_6_pe + <<: *acceptance_base + script: + - 'bundle exec rake beaker:suites[multiple_plugins,default]' + +pup6.pe.multiple_plugins-fips: + <<: *pup_6_pe + <<: *acceptance_base + script: + - 'BEAKER_fips=yes bundle exec rake beaker:suites[multiple_plugins,default]' + +pup7.x.multiple_plugins: + <<: *pup_7_x + <<: *acceptance_base + script: + - 'bundle exec rake beaker:suites[multiple_plugins,default]' + diff --git a/CHANGELOG b/CHANGELOG index 0e26479..5ceb5ea 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,4 @@ -* Mon Jun 21 2021 Liz Nemsick - 0.8.0 +* Tue Sep 28 2021 Liz Nemsick - 0.8.0 - BREAKING CHANGES: - Added 'globals' and 'environments' root directories for global and Puppet-environment keys, respectively, in the normalized key paths @@ -27,11 +27,17 @@ - Plugin type is now determined from its filename. - Previous mechanism did not work when when multiple plugins were used. - Added + - LDAP plugin + - Acceptance test that demonstrates its use and integration with + a 389-DS instance configured with the SIMP data schema - More detailed plugin exception reporting in order to pinpoint plugin logic problems. - Now prints out the useful portion of the backtrace when an exception is raised. - Especially useful during plugin development. + - More background information for users + - More background information for plugin developers, which has now + been split out into its own document. * Wed Jun 16 2021 Chris Tessmer - 0.8.0 - Removed support for Puppet 5 diff --git a/README.md b/README.md index e57a934..d7096e3 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,9 @@ * [Overview](#overview) * [This is a SIMP module](#this-is-a-simp-module) * [Module Description](#module-description) +* [Setup](#setup) + * [What simpkv Affects](#what-simpkv-affects) + * [Setup Requirements](#setup-requirements) * [Terminology](#terminology) * [Usage](#usage) * [Single Backend Example](#single-backend-example) @@ -18,13 +21,24 @@ * [Binary Value Example](#binary-value-example) * [Global Key Example](#global-key-example) * [Auto-Default Backend](#auto-default-backend) - * [Backend Folder Layout](#backend-folder-layout) +* [Reference](#reference) + * [simpkv Function Reference](#simpkv-function-reference) * [simpkv Configuration Reference](#simpkv-configuration-reference) -* [File Store and Plugin](#file-store-and-plugin) + * [Backend Configuration Entries](#backend-configuration-entries) + * [Backend Selection](#backend-selection) + * [Backend Basic](#backend-basics) + * [Backend Folder Layout](#backend-folder-layout) + * [Backend Data Format](#backend-data-format) + * [File Plugin](#file-plugin) + * [File Plugin Requirements](#file-plugin-requirements) + * [File Plugin Configuration](#file-plugin-configuration) + * [LDAP Plugin](#ldap-plugin) + * [LDAP Plugin Requirements](#ldap-plugin-requirements) + * [LDAP Plugin Configuration](#ldap-plugin-configuration) + * [Debugging LDAP Integration Issues](#debugging-ldap-integration-issues) + * [Other Resources](#other-resources) * [Limitations](#limitations) * [Plugin Development](#plugin-development) - * [Plugin Loading](#plugin-loading) - * [Implementing the Store Interface API](#implementing-the-store-interface-api) * [simpkv Development](#simpkv-development) * [Unit tests](#unit-tests) * [Acceptance tests](#acceptance-tests) @@ -40,8 +54,6 @@ a compliance-management framework built on Puppet. If you find any issues, please submit them via [JIRA](https://simp-project.atlassian.net/). -Please read our [Contribution Guide](https://simp.readthedocs.io/en/stable/contributors_guide/index.html). - ## Module Description Provides an abstract library that allows Puppet to access one or more key/value @@ -59,50 +71,87 @@ This module provides of different key/value store instances * adapter software that loads and uses store-specific interface software provided by the simpkv module itself and other modules -* a Ruby API for the store interface software that developers can implement - to provide their own store interface -* a file-based store on the local filesystem and its interface software. +* interfaces for 2 types of stores + + * **local filesystem store**: Useful for module acceptance tests or small + sites that are not subject to high-performance and/or high-availability + requirements. + * **LDAP store**: Useful for large sites that are subject to high-performance + and/or high-availability requirements. + +* support for creating custom store interfaces + + * a Ruby API for the store interface software that developers can implement + to provide their own store interface + * a standard acceptance testing framework developers can use to verify their + store interfaces work as expected + * a developers guide. + +## Setup + +### What simpkv Affects + +simpkv manages the contents of one or more key/value stores via Puppet functions +which affect store, retrieve, and modify operations. + +### Setup Requirements + +simpkv has 3 main setup requirements: + +1. simpkv requires hieradata configuration (a `simpkv::options` Hash), when it + is used to manage the contents of key/value stores. + + * simpkv will operate without any configuration by internally configuring + itself to use the [auto-default local filesystem store](#auto-default-backend), + however, this key/value store is really only useful in Puppet module tests. + +2. simpkv expects each configured key/value store to be managed elsewhere. + + * You can manage LDAP servers with the `simp/ds389` module. - * Future versions of this module will provide a distributed key/value store. +3. simpkv expects any store-specific interface requirements to be addressed + elsewhere. -If you find any issues, they may be submitted to our -[bug tracker](https://simp-project.atlassian.net/). + * Some stores may impose other store-specific requirements in order for their + simpkv interface software to operate. For example, a store may require + packages to be installed on a server compiling the Puppet manifests. + * Any store-specific requirements will be listed in that store's interface + documentation. ## Terminology -The following terminology will be used throughout this document: +The following terminology will be used throughout the remainder of this document: -* backend - A specific key/value store, e.g., files on a local filesystem, - Consul, Etcd, Zookeeper. -* plugin - Ruby software that interfaces with a specific backend to - affect the operations requested in simpkv Puppet functions. -* plugin instance - Instance of the plugin that handles a unique backend - configuration. -* plugin adapter - Ruby software that loads, selects, and executes the - appropriate plugin software for a simpkv function call. +* **backend**- A specific key/value store that has unique configuration, (e.g., + directory of files on a local filesystem, LDAP server, Consul server, Etcd + server, Zookeeper server). + +* **plugin** - Ruby software that interfaces with a type of backend to affect + the operations requested in simpkv Puppet functions. For example, the 'ldap' + plugin manages simpkv data stored in an external LDAP server. ## Usage Using `simpkv` is simple: -* Use `simpkv` functions to store and retrieve key/value pairs in your Puppet +* Use `simpkv` functions to store or retrieve key/value pairs in your Puppet code. -* Configure the backend(s) to use in Hieradata. -* Reconfigure the backend(s) in Hieradata, as your needs change. +* Configure the backend(s) to use in hieradata. +* Reconfigure the backend(s) in hieradata, as your needs change. * No changes to your Puppet code will be required. * Just transfer your data from the old key/value store to the new one. The backend configuration of `simpkv` can be as simple as you want (one backend) -or complex (multiple backends servicing different applications). Examples of -both scenarios will be shown in this section, along with a configuration -reference. +or complex (multiple backends of different types servicing different +applications). Examples of both scenarios will be shown in this section. ### Single Backend Example -This example will store and retrieve host information using simpkv function -signatures that assume the default backend and hieradata that only configures -the default backend. +This example will store and retrieve host information using + +* simpkv function signatures that assume the default backend +* hieradata that only configures the default backend. To store a node's hostname and IP address: @@ -121,7 +170,7 @@ $result['keys'].each |$host, $info | { } ``` -In hieradata, configure the default backend in the ``simpkv::options`` Hash. This +In hieradata, configure the default backend in the ``simpkv::options`` Hash. This example, will configure simpkv's file backend. ```yaml @@ -132,9 +181,8 @@ simpkv::options: # all simpkv calls. backends: default: - # This is the advertised type for simpkv's file plugin. + # The plugin type and id must be specified. type: file - # This is a unique id for this configuration of the 'file' plugin. id: file # plugin-specific configuration @@ -144,10 +192,14 @@ simpkv::options: ### Multiple Backends Example -This example will store and retrieve host information using simpkv function -signatures that request a backend based on an application id and multi-backend -hieradata that supports the request. The function signatures and hieradata are -a little more complicated, but still relatively straightforward to understand. +This example will store and retrieve host information using + +* simpkv function signatures that request a backend based on an application + identifier +* multi-backend hieradata that supports the request. + +The function signatures and hieradata are a little more complicated, but still +relatively straightforward to understand. To store a node's hostname and IP address using the backend servicing `myapp1`: @@ -171,26 +223,34 @@ $result['keys'].each |$host, $info | { ``` In hieradata, configure multiple backends in the ``simpkv::options`` Hash. -This example will configure multiple instances of simpkv's file backend. +This example will configure a single instance of a LDAP backend and two +instances of file backend, assuming we are using simpkv's LDAP and file plugins, +respectively. It is artificially complex, but illustrates the flexibility you +have when configuring backends: + +* You can use any mix of backend types. +* You can use multiple instances of a backend type. + + * Each 'type' and 'id' specifies a unique configuration. + +* You can map different applications to the same backend. ```yaml # The backend configurations here will be inserted into simpkv::options # below via the alias function. -simpkv::backend::file_default: - type: file +simpkv::backend::ldap_default: + type: ldap id: default - root_path: "/var/simp/simpkv/file" + ldap_uri: ldapi://%2fvar%2frun%2fslapd-simp_data.socket simpkv::backend::file_myapp: type: file id: myapp - root_path: "/path/to/myapp" simpkv::backend::file_yourapp: type: file id: yourapp - root_path: "/path/to/yourapp" simpkv::options: @@ -198,27 +258,24 @@ simpkv::options: # * Includes application-specific backends and the required default backend. # * simpkv will use the appropriate backend for each simpkv function call. backends: - # backend for specific myapp application - "myapp_special_snowflake": "%{alias('simpkv::backend::file_default')}" + # Backend for specific myapp_special_snowflake* applications + "myapp_special_snowflake": "%{alias('simpkv::backend::file_myapp')}" - # backend for remaining myapp* applications, including myapp1 - "myapp": "%{alias('simpkv::backend::file_myapp')}" + # Backend for remaining myapp* applications, including myapp1 + "myapp": "%{alias('simpkv::backend::ldap_default')}" - # backend for all yourapp* applications + # Backend for all yourapp* applications "yourapp": "%{alias('simpkv::backend::file_yourapp')}" - # required default backend - "default": "%{alias('simpkv::backend::file_default')}" + # Required default backend for everything else, including simpkv + # function calls with no application identifier + "default": "%{alias('simpkv::backend::ldap_default')}" ``` In this example, we are setting the application identifier to `myapp1` in -our simpkv function calls. simpkv selects `myapp` as the backend to use for -`myapp1` using the following simple search algorithm: - -* First, it looks for a backend named for the application id. -* Next, it looks for the longest backend name matching the start of the - application id. -* Finally, if no match is found, it defaults to a backend named `default`. +our simpkv function calls. simpkv will select `myapp` as the backend to +use for `myapp1`, based on the simple matching algorithm described in +[Backend Selection](#backend-selection). ### Binary Value Example @@ -230,7 +287,7 @@ Below is an example of using simpkv for a binary value. To store the content of a generated keytab file: ```puppet -# Load in the binary content from a file. Returns a Binary Puppet type. +# Load in the binary content from a file. Returns a Binary Puppet type. $original_binary_content = binary_file('/path/to/keytabs/app.keytab') # Set a key/value pair with the binary content @@ -284,12 +341,13 @@ $result['keys'].each |$host, $info | { ### Auto-Default Backend -simpkv is intended to be configured via ``simpkv::options`` and any +simpkv is intended to be configured via `simpkv::options` and any application-specific configuration passed to the simpkv Puppet functions. -However, to facilitate rollout of simpkv capabilities, (specifically -use of simpkv internally in ``simplib::passgen``), when ``simpkv::options`` -is not set in hieradata, simpkv will automatically use the simpkv file store with -the configuration that is equivalent to the following hieradata: +However, to facilitate Puppet manifest testing and the rollout of simpkv +capabilities (specifically, the use of simpkv internally in `simplib::passgen`), +when `simpkv::options` is not set in hieradata, simpkv will automatically use +the 'file' plugin to store key/value data on the local filesystem. This is +equivalent to the following `simpkv::options` hieradata: ```yaml simpkv::options: @@ -302,83 +360,38 @@ simpkv::options: id: auto_default ``` -### Backend Folder Layout - -The storage in a simpkv backend can be notionally represented as a folder -tree with key files at terminal nodes. simpkv automatically sets up the -folder layout at the top level and the user specifies key files below that. -Specifically, - -* simpkv stores global keys in a `globals` sub-folder of the root folder. +The 'file' plugin id described [here](#file-plugin). - * Global keys are not tied to any specific Puppet environment. - * You must specify `'global' => true` in the options passed to - simpkv functions in order to access global keys. +## Reference -* simpkv stores all other keys in sub-folders named for the Puppet - environment in which each key was created. - - * The parent directory for all environment folders is - `/environments`. +### simpkv Function Reference -* Further sub-folder trees are allowed for global or environment-specific keys. - - * A relative paths in a key name indicates a sub-folder tree (e.g. - 'app1/keya'). - -* The actual representation of the root folder is backend specific. - - * For the 'file' backend, the root folder is a directory on the local file - system of the Puppet server. - -Below is an example of a folder tree for the `file` backend configured -with an `id` of `default`: - -``` -/var/simp/simpkv/file/default -│ -├── globals/ .............. Global keys parent -│ ├── app1/ ............. Folder for 'app1' global keys -│ │ └── global_keyq .. simpkv::put('app1/global_keyq', { 'global' => true }) -│ └── global_keyr ....... simpkv::put('global_keyr', { 'global'=> true }) -│ -├── environments/.......... Environment keys parent -│ ├── dev/ .............. Folder for 'dev' Puppet environment keys -│ │ └── app1/ -│ │ └── keya ...... simpkv::put('app1/keya') for a 'dev' env node -│ │ -│ └── production/ ....... Folder for 'production' Puppet environment keys -│ ├── app1/ -│ │ └── keya ...... simpkv::put('app1/keya') for a 'production' env node -│ ├── app2/ -│ │ ├── groupx/ -│ │ │ └── keyb -│ │ └── groupy/ -│ │ └── keyc .. simpkv::put('app2/groupy/keyc') in a 'production' node -│ └── keyd .......... simpkv::put('keyd') in a 'production' env node -└── -``` +See [REFERENCE.md](./REFERENCE.md) for the module's function reference. ### simpkv Configuration Reference The simpkv configuration used for each simpkv function call is comprised of -a merge of a function-provided options Hash, Hiera configuration specified -by the `simpkv::options` Hash, and global configuration defaults. The merge -is executed in a fashion to ensure the function-provided options take -precedence over the `simpkv::options` Hiera values. +a merge of + +* function-provided options Hash +* hieradata configuration specified by the `simpkv::options` Hash +* global configuration defaults. + +The merge is executed in a fashion to ensure the function-provided options take +precedence over the `simpkv::options` hieradata values and global defaults. The merged simpkv configuration contains global and backend-specific -configurations, along with an optional application identifier. The primary -keys in this Hash are as follows: +configurations, along with an optional, function-provided application +identifier. The primary keys in this Hash are as follows: -* `app_id`: Optional String in simpkv function calls, only. Specifies an +* `app_id`: Optional String from simpkv function calls, only. Specifies an application name that can be used to identify which backend configuration to use via fuzzy name matching, in the absence of the `backend` option. - (See [Backend Selection](#backend-selection)). * More flexible option than `backend`. * Useful for grouping together simpkv function calls found in different catalog resources. + * See [Backend Selection](#backend-selection). * `backend`: Optional String. Specifies a definitive backend configuration to use. @@ -390,9 +403,9 @@ keys in this Hash are as follows: * When absent, the backend configuration will be selected from the set of entries in `backends`, using the `app_id` option if specified. - (See [Backend Selection](#backend-selection)). + * See [Backend Selection](#backend-selection). -* `backends`: Required Hash. Specifies backend configurations. Each key +* `backends`: Required Hash. Specifies backend configurations. Each key is the name of a backend configuration and its value contains the corresponding configuration Hash. @@ -418,13 +431,16 @@ keys in this Hash are as follows: #### Backend Configuration Entries -Each backend configuration entry in `backends` is a Hash. The Hash must +Each backend configuration entry in `backends` is a Hash. The Hash must contain `type` and `id` keys, where the (`type`,`id`) pair defines a unique -configuration. +configuration (i.e., unique plugin instance). + +* `type` is the type of plugin, e.g., 'ldap'. + + * 'file' and 'ldap' are provided by the simpkv module. + * Other modules may provide their own plugins. -* `type` must be unique across all backend plugins, including those - provided by other modules. -* `id` must be unique for a each distinct configuration for a `type`. +* `id` is the instance identifier for a `type`. * Other keys for configuration specific to the backend may also be present. #### Backend Selection @@ -450,68 +466,411 @@ the merged simpkv options Hash as follows: * Otherwise, if the `app_id` option does not match any key in in the `backends` Hash or is not present, the `default` backend will be selected. -## File Store and Plugin +To clarify this backend selection algorithm, consider a site in which simpkv is +configured for multiple backends in the following ``simpkv::options`` Hash. + +```yaml +simpkv::options: + # Hash of backend configurations. + # * Includes application-specific backends and the required default backend. + # * simpkv will use the appropriate backend for each simpkv function call. + backends: + # Backend for specific myapp_special_snowflake* applications + "myapp_special_snowflake": + type: file + id: myapp_special_snowflake + + # Backend for remaining myapp* applications + "myapp": + type: file + id: myapp + + # Backend for all yourapp* applications + "yourapp": + type: file + id: yourapp + + # required default backend for everything else, including simpkv + # function calls with no application identifier + "default": + type: file + id: default +``` + +The following table shows the backend that simpkv will select make given the +options specified by the simpkv function call. + +| simpkv Function Call | Backend Selected | Comments | +|----------------------------------------------- | ------------------- | --------------------------------| +| `simpkv::get('key')` | `default` | No special handling requested | +| `simpkv::get('key', {'backend' => 'yourapp'})` | `yourapp` | Specific backend requested | +| `simpkv::get('key', {'backend' => 'oops'})` | N/A | Function will fail since 'oops' backend does not exist | +| `simpkv::get('key', {'app_id' => 'myapp'})` | `myapp` | Exact match | +| `simpkv::get('key', {'app_id' => 'myapp1'})` | `myapp` | Starts with match | +| `simpkv::get('key', {'app_id' => 'myapp_special'})` | `myapp` | Starts with match | +| `simpkv::get('key', {'app_id' => 'myapp_special_snowflake_for_bob'})` | `myapp_special_snowflake` | Starts with match | +| `simpkv::get('key', {'app_id' => 'otherapp'})` | `default` | No match so fallback to default | + +### Backend Basics + +This section describes details about the folder layout and format of data +stored by simpkv that you may find useful when you are inspecting data in +a backend. + +#### Backend Folder Layout + +The storage in a simpkv backend can be notionally represented as a folder +tree with key files at terminal nodes. simpkv automatically sets up the +folder layout at the top level and the user specifies key files below that. +Specifically, + +* simpkv stores global keys in a `globals` sub-folder of the root folder. + + * Global keys are not tied to any specific Puppet environment. + * You must specify `'global' => true` in the options passed to + simpkv functions in order to access global keys. + +* simpkv stores all other keys in sub-folders named for the Puppet + environment in which each key was created. + + * The parent directory for all environment folders is + `/environments`. + +* Further sub-folder trees are allowed for global or environment-specific keys. + + * A relative paths in a key name indicates a sub-folder tree (e.g. + `'app1/keya'`). + +For example, + +![simpkv Key/Value Tree](docs/assets/simpkv_Key_Value_Tree.png) + +The *actual* representation of the root folder and 'key file' is backend specific. + +### Backend Data Format + +Internally, simpkv automatically serializes each key's value and optional +metadata into a string for backend storage, and then deserializes it upon +retrieval. The string is a JSON representation of a Hash with at least 2 +attributes: + +* `value`: Always present. Key's value +* `metadata`: Always present. Key's metadata +* `encoding` and `original_encoding`: Only present when the key's value is a + Puppet Binary type. Indicates simpkv's internal encoding of the binary data + into a representation suitable for JSON. + + * simpkv uses strict Base64 encoding. + +This serialization simplifies plugin development, but does limit the types of +data that can be stored in the value and metadata. simpkv works with the +following types: + +* *Simple type*: String, boolean, or numeric values +* *Standard complex type*: Hash, Array, or nested Hash/Array structure whose + terminal nodes are simple types +* *Binary type*: Puppet Binary type when it is the key's value, only; not in + any complex values or metadata -simpkv provides a file-based key/value store and its plugin. This file store -maintains individual key files on a **local** filesystem, has a backend type `file`, -and supports the following plugin-specific configuration parameters. +The table below shows a few examples of the serialization for clarification. -* `root_path`: Root directory path for the key files + +| Value Type | Serialized String | +| ---------- | --------------------- | +| Simple without metadata | `{"value":10,"metadata":{}}` | +| Simple with metadata | `{"value":true,"metadata":{"verified":true,"user":"vsmith"}}` | +| Array with metadata | `{"value":[1,2,3],"metadata":{"originator":"njones","location":{"room":"29B","rack":10}}}` | +| Hash without metadata | `{"value":{"attr1":"hello","attr2":{"part1":9.898,"part2":[1,2,3]}},"metadata":{}` | +| Binary transformed by simpkv without metadata | `{"value":"","encoding":"base64","original_encoding":"ASCII-8BIT","metadata":{}"}` | + + +## File Plugin + +simpkv provides a plugin that maintains a file-based key/value store on the +local filesystem on the server on which the Puppet manifests are being compiled. +It effectively uses system commands to affect local filesystems changes. + +* This plugin is appropriate for Puppet module tests. +* This plugin can be used for small-sites in which there is only a single server + compiling Puppet manifests. + +### File Plugin Requirements + +* The file plugin must be configured for a local filesystem on the server + compiling the Puppet manifests. + + * The file locking mechanism the plugin uses to ensure the integrity of the + key files is only guaranteed to work on a **local** filesystem, and is + **not** suitable for shared filesystems such as NFS. + +* The file plugin must have write privileges for the configured `root_path` for + the user compiling the manifests. +* The file plugin must **not** be used for sites using distributed Puppet servers. + + * The file plugin has no mechanisms to distribute the key/store to other + compile servers. + +### File Plugin Configuration + +The plugin has a backend type `file`, and supports the following plugin-specific +configuration parameters. + +* `root_path`: Optional. Root directory path for the key files * Defaults to `/var/simp/simpkv/file/` when that directory can be created - or '/simp/simpkv/' otherwise. + or `/simp/simpkv/` otherwise. -* `lock_timeout_seconds`: Maximum number of seconds to wait for an exclusive - file lock on a file modifying operation before failing the operation. +* `lock_timeout_seconds`: Optional. Maximum number of seconds to wait for an + exclusive file lock on a file modifying operation before failing the + operation. * Defaults to 5 seconds. +Here is an example configuration for the file plugin: + +```yaml +simpkv::options: + backends: + default: + type: file + id: default +``` + +## LDAP Plugin + +simpkv provides a plugin to interface with a LDAP key/value store configured +with a simpkv LDAP schema. If your site is large and requires a +high-availability, distributed key/value store, LDAP is the appropriate +backend to use! The benefits of using LDAP are as follows: + +* LDAP supports the storage of any data, not just accounts data. +* LDAP is well defined protocol implemented by a wide variety of client and + server implementations. +* LDAP is secure. +* LDAP server implementations are highly performant. +* LDAP server implementations support replication. + +### LDAP Plugin Requirements + +The LDAP plugin has 4 main requirements: + +1. The package providing `ldapadd`, `ldapdelete`, `ldapmodify` and `ldapsearch` + (i.e. `openldap-clients`) must be installed on the system on which the Puppet + manifests will be compiled. + +2. The LDAP server must be loaded with the + [simpkv LDAP schema](docs/simpkv_LDAP_DIT_and_schema.md). + +3. The root Directory Name (DN) for the simpkv tree in LDAP must already + exist. + + * This corresponds to the LDAP plugin's `base_dn` configuration parameter. + +4. The supplied LDAP configuration must permit the user compiling the Puppet + manifests to modify the LDAP tree below that 'simpkv' root DN. + +**In addition**, if LDAPI is not the protocol being being used to communicate +with the LDAP server, the configured password file used for simple +authentication with the LDAP server **MUST** already exist before the catalog +is compiled. + +* Catalog compilation will fail if you attempt to create the file using a `file` + Puppet resource in the same catalog as simpkv function calls. This is because + the simpkv functions will be evaluated before the `file` resource in the + compilation. + +### LDAP Plugin Configuration + +The simpkv LDAP plugin is of type `ldap` and supports the following +plugin-specific configuration parameters. + +* `ldap_uri`: Required. The LDAP server URI. + + * This can be a LDAPI socket path or an ldap/ldaps URI specifying host and, + optionally, port. + * When using an 'ldap://' URI with StartTLS, `enable_tls` must be true and + `tls_cert`, `tls_key`, and `tls_cacert` must be configured. + * When using an 'ldaps://' URI, `tls_cert`, `tls_key`, and `tls_cacert` must + be configured. + +* `base_dn`: Optional. The root DN for the 'simpkv' tree in LDAP. + + * Defaults to 'ou=simpkv,o=puppet,dc=simp' + * Must already exist + +* `admin_dn`: Optional. The bind DN for simpkv administration. + + * Defaults to 'cn=Directory_Manager' + * This identity must have permission to modify the LDAP tree below `base_dn`. + +* `admin_pw_file`: Required for all but LDAPI. A file containing the simpkv + adminstration password. + + * Will be used for authentication when set, even with LDAPI. + * When unset for LDAPI, the `admin_dn` is assumed to be properly configured + for external EXTERNAL SASL authentication for the user compiling the manifest + (e.g., 'puppet' for 'puppet agent', 'root' for 'puppet apply' and the Bolt + user for Bolt plans). + +* `enable_tls`: Optional. Whether to enable TLS. + + * Defaults to true when `ldap_uri` is an 'ldaps://' URI, otherwise defaults + to false. + * Must be set to true to enable StartTLS when using an 'ldap://' URI. + * When true `tls_cert`, `tls_key` and `tls_cacert` must be set. + +* `tls_cert`: Required for StartTLS or TLS. The certificate file. +* `tls_key`: Required for StartTLS or TLS. The key file. +* `tls_cacert`: Required for StartTLS or TLS. The cacert file. +* `retries`: Optional. Number of times to retry an LDAP operation if the + server reports it is busy. + + * Defaults to 1. + +Here are some example configurations: + +* To use LDAPI (best option if the Puppet manifest compilation is being done on + the LDAP server), configure the LDAP plugin as follows: + +```yaml + simpkv::options: + backends: + default: + type: ldap + id: default + + # Set this to your LDAP server's LDAPI URI + ldap_uri: ldapi://%2fvar%2frun%2fslapd-simp_data.socket +``` + +* To use LDAPS, configure the LDAP plugin as follows: + +```yaml + simpkv::options: + backends: + default: + type: ldap + id: default + + # Set this to your LDAP server's LDAPS URI + ldap_uri: ldaps://ldap.example.com + + # Set this to the location of your administration DN password file + admin_pw_file: /etc/simp/simpkv_pw.txt + + # Set these to the appropriate certs for your server + tls_cert: /etc/pki/simp_apps/openldap/public/puppetserver.example.com.pub + tls_key: /etc/pki/simp_apps/openldap/private/puppetserver.example.com.pem + tls_cacert: /etc/pki/simp_apps/openldap/cacerts/cacerts.pem +``` + +* To use LDAP with StartTLS, configure the LDAP plugin as follows: + +```yaml + simpkv::options: + backends: + default: + type: ldap + id: default + + # Set this to your LDAP server's LDAP URI + ldap_uri: ldap://ldap.example.com + + # Set this to the location of your administration DN password file + admin_pw_file: /etc/simp/simpkv_pw.txt + + # Use StartTLS with the LDAP URI + enable_tls: true + + # Set these to the appropriate certs for your server + tls_cert: /etc/pki/simp_apps/openldap/public/puppetserver.example.com.pub + tls_key: /etc/pki/simp_apps/openldap/private/puppetserver.example.com.pem + tls_cacert: /etc/pki/simp_apps/openldap/cacerts/cacerts.pem +``` + + +The LDAP plugin creates the key/value store for each instance under its own +tree on the LDAP server. The tree's DN is *ou=,ou=instances,*, +where the instance id is the 'ldap' plugin's `id` configuration parameter. So, +you can actually use the same LDAP server for different plugin instances. + +Here is an example configuration of multiple instances with the same LDAPI +configuration: + +```yaml + simpkv::options: + backends: + # stored under the 'myapp' instance tree of the simp_data LDAP server + myapp: + type: ldap + id: myapp + ldap_uri: ldapi://%2fvar%2frun%2fslapd-simp_data.socket + + # stored under the 'default' instance tree of the simp_data LDAP server + default: + type: ldap + id: default + ldap_uri: ldapi://%2fvar%2frun%2fslapd-simp_data.socket +``` + +### Debugging LDAP Integration Issues + +When you are trying to debug LDAP integration issues, use the `--debug` +option during manifest compilation to see more details about what the +LDAP plugin is doing. For example, + +```shell +puppet apply -t --debug my_manifests.pp +``` + +Using this option will log the exact LDAP commands used during simpkv +function calls. + +### Other Resources + +The `ldap_plugin` acceptance test suite is complete example on how to use the +LDAP plugin. It demonstrates the following: + +* How to configure simpkv to use the LDAP plugin for LDAPI unencrypted LDAP, + LDAP + StartTLS, and LDAPS protocols. +* How to stand up simple 389-DS LDAP instances for those protocol options. + + Each 389-DS instance is + + * Created by the `simp/ds389` module. + * Bootstrapped with a LDIF that corresponds to the simpkv leg of the SIMP Data + Root Directory Information Tree (DIT) shown below. + ![SIMP Data Root DIT](docs/assets/LDAP_DIT_root.png) + + * Explicitly configured with non-standard ports, so as to not be confused + with LDAP servers used for accounts management. + * Loaded with the [simpkv LDAP schema](docs/simpkv_LDAP_DIT_and_schema.md). + ## Limitations * SIMP Puppet modules are generally intended to be used on a Red Hat Enterprise Linux-compatible distribution such as EL7 and EL8. -* simpkv's file plugin is only guaranteed to work on local filesystems. It may not - work on shared filesystems, such as NFS. - * `simpkv` only supports the use of binary data for the value when that data is a Puppet `Binary`. It does not support binary data which is a sub-element of - a more complex value type (e.g. `Array[Binary]` or `Hash` that has a key or + a more complex value type (e.g. `Array[Binary]` or `Hash` that has a key or value that is a `Binary`). +* `simpkv` does not support custom data types that cannot be serialized to JSON + by the Ruby libraries provided by Puppet. + +* simpkv's file plugin is only guaranteed to work on local filesystems. It may not + work on shared filesystems, such as NFS. + +* SIMP does not yet manage the LDAP server configured for simpkv data. + + * See the `ldap_plugin` acceptance test suite for an example of how to set up + a simple 389-DS LDAP instance for simpkv data. + ## Plugin Development -### Plugin Loading - -Each plugin (store interface) is written in pure Ruby and, to prevent -cross-environment contamination, is implemented as an anonymous class -that is automatically loaded by the simpkv adapter with each Puppet compile. -You do not have to do anything special to have your plugin loaded, provided -you follow the instructions in the next section. - -### Implementing the Store Interface API - -To create your own plugin - -* Create a `lib/puppet_x/simpkv` directory within your store plugin module. -* Copy `lib/puppet_x/simpkv/plugin_template.rb` from the simpkv module into that - directory with a name `_plugin.rb`. For example, - `nfs_file_plugin.rb`. -* **READ** all the documentation in your plugin skeleton, paying close attention - the `IMPORTANT NOTES` discussion. -* Implement the body of each method as identified by a `FIXME`. Be sure to - conform to the API for the method. -* Write unit tests for your plugin, using the unit tests for simpkv's file - plugin, `spec/unit/puppet_x/simpkv/file_plugin_spec.rb` as an example. That - test shows you how to instantiate an object of your plugin for testing - purposes. -* Write acceptance tests for your plugin, using the acceptance tests for - simpkv's file plugin in `spec/acceptances/suites/default/`, - as an example. That test uses a test module, `spec/support/simpkv_test` - and a plugin-specific validator to exercise the the simpkv API and verify its - operation with the file plugin. -* Document your plugin's type and configuration parameters in the README.md for - your store plugin module. +Please see [simpkv Plugin Development Guide](docs/simpkv_plugin_development_guide.md) +for details on how to write your own custom plugin. ## simpkv Development @@ -522,28 +881,53 @@ Please read our [Contribution Guide] (https://simp.readthedocs.io/en/stable/cont Unit tests, written in ``rspec-puppet`` can be run by calling: ```shell +bundle install bundle exec rake spec ``` ### Acceptance tests -To run the system tests, you need [Vagrant](https://www.vagrantup.com/) installed. Then, run: +This module includes [Beaker](https://github.com/voxpupuli/beaker) acceptance +tests using the SIMP [Beaker Helpers](https://github.com/simp/rubygem-simp-beaker-helpers). +By default the tests use [Vagrant](https://www.vagrantup.com/) with +[VirtualBox](https://www.virtualbox.org) as a back-end; Vagrant and VirtualBox +must both be installed to run these tests without modification. + +To execute all of the tests run the following: ```shell +bundle install bundle exec rake beaker:suites ``` -Some environment variables may be useful: +To execute an individual suite for a specific nodeset, add the suite and the +nodeset to the `beaker:suites` task. For example, + +```shell +bundle exec rake beaker:suites[ldap_plugin,default] +``` + +Some environment variables that may be useful: ```shell BEAKER_debug=true -BEAKER_provision=no BEAKER_destroy=no -BEAKER_use_fixtures_dir_for_modules=yes +BEAKER_fips=yes +BEAKER_provision=no ``` -* `BEAKER_debug`: show the commands being run on the STU and their output. -* `BEAKER_destroy=no`: prevent the machine destruction after the tests finish so you can inspect the state. -* `BEAKER_provision=no`: prevent the machine from being recreated. This can save a lot of time while you're writing the tests. -* `BEAKER_use_fixtures_dir_for_modules=yes`: cause all module dependencies to be loaded from the `spec/fixtures/modules` directory, based on the contents of `.fixtures.yml`. The contents of this directory are usually populated by `bundle exec rake spec_prep`. This can be used to run acceptance tests to run on isolated networks. +* `BEAKER_debug`: Show the commands being run on the virtual machines and their + output. +* `BEAKER_destroy=no`: Prevent the virtual machine destruction after the tests + finish so you can inspect the state. +* `BEAKER_fips=yes`: Enable FIPS-mode on the virtual machines. + + * This can take a long time, because it must enable FIPS in the kernel + command-line, rebuild the initramfs, then reboot. + +* `BEAKER_provision=no`: Prevent the virtual machine from being recreated. + + * This can save a lot of time while you're writing the tests. +Please refer to the [SIMP Beaker Helpers documentation](https://github.com/simp/rubygem-simp-beaker-helpers/blob/master/README.md) +for more information. diff --git a/docs/Design_Prototype2.md b/docs/Design_Prototype2.md index 2c6b38e..b6ba8d6 100644 --- a/docs/Design_Prototype2.md +++ b/docs/Design_Prototype2.md @@ -17,6 +17,7 @@ * [Rollout Considerations](#rollout-considerations) * [Design](#design) + * [Changes from Version 0.7.X](#changes-from-version-0.7.x) * [Changes from Version 0.6.X](#changes-from-version-0.6.x) * [simpkv Configuration](#simpkv-configuration) @@ -293,14 +294,17 @@ general requirements: * Getting this to work on specific shared file system types is deferred to a future requirement. -* simpkv may provide a Consul-based plugin +* simpkv must provide a plugin to interface with a high-availability, distributed + key/store + + * The first high-availability, distributed key/store to which simpkv will + interface will be LDAP. ### Future Requirements This is a placeholder for miscellaneous, additional simpkv requirements to be addressed, once it moves beyond the prototype stage. -* simpkv must provide a plugin for a remote key/value store, such as LDAP * simpkv must support audit operations on a key/value store * Auditing information to be provided must include: @@ -399,6 +403,48 @@ This section discusses at a high level the design to meet the second prototype requirements. For indepth understanding of the design, please refer to the prototype software and is tests. +### Changes from Version 0.7.X + +This section lists the changes that have been made to the simpkv function and +plugin APIs to address deficiencies found when developing the LDAP plugin. + +#### simpkv function API changes + +* The confusing 'environment' backend option in each simpkv Puppet + function has been replaced with a 'global' Boolean option. + + * Global keys are now specified by setting 'global' to true in lieu of + setting 'environment' to ''. + +* The key and folder name specification now restricts the allowed letter + characters to lowercase. + + +#### plugin API changes + +* 'globals' and 'environments' root directories have been added for global + and Puppet-environment keys, respectively, in the normalized key paths + in the backend. + + * This change makes the top-level organization of keys in the backend + explicit, and thus more understandable. + * The prefix used for global keys was changed from `` to + `/globals`. + * The prefix used for environment keys was changed from + `/` to + `/environments/`. + +* Plugin configuration has been split out into its own method, instead of being + done in the plugin constructor. + + * This minimal change allows the use of mock objects in the unit tests for + complex plugins, such as those that require connections to external servers. + +* Fixed the mechanism a plugin uses to advertise its type. + + * Plugin type is now determined from its filename. + * Previous mechanism did not work when when multiple plugins were used. + ### Changes from Version 0.6.X Major design/API changes since version 0.6.X are as follows: @@ -562,19 +608,10 @@ are specified and mapped to different application identifiers. type: file root_path: "/some/other/path" - simpkv::backend::consul: - id: consul - type: consul - - request_timeout_seconds: 15 - num_retries: 1 - uris: - - "consul+ssl+verify://1.2.3.4:8501/puppet" - - "consul+ssl+verify://1.2.3.5:8501/puppet" - auth: - ca_file: "/path/to/ca.crt" - cert_file: "/path/to/server.crt" - key_file: "/path/to/server.key" + simpkv::backend::ldap: + id: ldap + type: ldap + ldap_uri: ldapi://%2fvar%2frun%2fslapd-simp_data.socket simpkv::options: # global options @@ -592,10 +629,10 @@ are specified and mapped to different application identifiers. "myapp": "%{alias('simpkv::backend::file')}" # backend for all yourapp* applications - "yourapp": "%{alias('simpkv::backend::consul')}" + "yourapp": "%{alias('simpkv::backend::ldap')}" # required default backend - "default": "%{alias('simpkv::backend::consul')}" + "default": "%{alias('simpkv::backend::ldap')}" ``` diff --git a/docs/Use_of_LDAP_as_backend_for_simpkv.md b/docs/Use_of_LDAP_as_backend_for_simpkv.md new file mode 100644 index 0000000..019ce03 --- /dev/null +++ b/docs/Use_of_LDAP_as_backend_for_simpkv.md @@ -0,0 +1,549 @@ +The text below is a copy of the SIMP Project Confluence page of the same title +(created by Liz Nemsick and published on May 11, 2021). It has been preserved +here, so that it is available for interested users/developers who do not access +to that page. + +# Use of LDAP as backend for simpkv + +This page documents how 389DS can be used as a LDAP key/value store for simpkv. +It provides a basic overview of simpkv and then discusses Directory Information +Trees (DITs) that can be used to organize the data, an Object Identifier (OID) +tree and custom schemas to support those DITs, and the technology choices for +the implementation of the simpkv plugin interface to an 389DS instance. + +#### Table of Contents + + + +* [simpkv Overview](#simpkv-overview) + * [Operations supported](#operations-supported) + * [Backend logical structure](#backend-logical-structure) + * [Backend selection](#backend-selection) + * [simpkv plugin internals (10,000 foot view)](#simpkv-plugin-internals-10000-foot-view) + * [Value normalization](#value-normalization) +* [LDAP Directory Information Tree design](#ldap-directory-information-tree-design) + * [Requirements](#requirements) + * [Design Considerations](#design-considerations) + * [Root Tree](#root-tree) + * [simpkv Subtree Option 1](#simpkv-subtree-option-1) + * [simpkv Subtree Option 2](#simpkv-subtree-option-2) + * [Recommendation](#recommendation) +* [OID Subtree Design and Custom LDAP Schema](#oid-subtree-design-and-custom-ldap-schema) + * [SIMP OID Subtree](#simp-oid-subtree) + * [LDAP Custom Schema](#ldap-custom-schema) + * [simpkv DIT Option 1](#simpkv-dit-options-1) + * [simpkv DIT Option 2](#simpkv-dit-options-2) +* [Technologies for Plugin Implementation](#technologies-for-plugin-implementation) + * [Requirements](#requirements-1) + * [Options Considered](#options-considered) + * [Recommendation](#recommendaiton-1) + +## simpkv Overview + +The simp/simpkv module provides a library that allows Puppet to access one or +more key/value stores (aka backends), each of which, can be used to store +global keys and keys specific to Puppet environments. This section will +present an overview of simpkv. Please refer to the module +[design documentation](Design_Prototype2.md), [README](../README.md), and +[library documentation](../REFERENCE.md) for more details. + +### Operations supported + +The operations simpkv supports are as follows: + +| Function Name | Description | +| -------------------- | ----------------------------------------------------- | +| `simpkv::delete` | Deletes a key from a backend. | +| `simpkv::deletetree` | Deletes an entire folder from a backend. | +| `simpkv::exists` | Returns whether a key or key folder exists in a backend. | +| `simpkv::get` | Retrieves a key’s value and any user-provided metadata from a backend. | +| `simpkv::list` | Returns a listing of all keys and sub-folders in a folder in a backend. The list operation does *not* recurse through any sub-folders. Only information about the specified key folder is returned. | +| `simpkv::put` | Sets a key’s value and optional, user-provided metadata in a backend. | + +### Backend logical structure + +Logically, keys for a specific backend are organized within global and environment +directory trees below that backend's root directory. You can visualize this tree +as a filesystem in which a leaf node is a file named for the key and whose +contents contains the value for that key. For example, + +![simpkv Key/Value Tree](Use_of_LDAP_as_backend_for_simpkv/simpkv%20Key_Value%20Tree.png) + + +To facilitate implementations of this tree, key and folder names are restricted +to sequences of alphanumeric, `'.'`, `'_'`, `'-'`, and `'/'` characters, where + `'/'` is used as the path separator. Furthermore, when a folder or key +pecification contains a path, the path cannot contain relative path subsequences + (e.g., `'/./'` or `'/../'`). + +### Backend selection + +simpkv allows the user to select and configure one or more backends to be used +when `simpkv::*` functions are called in Puppet manifests during catalog +compilation. The configuration is largely made via hieradata. + +* Each backend has its own configuration. +* Each backend configuration block must specify simpkv plugin type (e.g., + ‘file’, ‘ldap’) and a user-provided instance identifier. + + * A plugin is a backend interface that actually affects the keystore operation + when a `simpkv::*` function is called during a Puppet catalog compilation. + For the ‘ldap' plugin, this will be the software that modifies key/value + pairs stored in an LDAP server. + * The same plugin can be used for multiple backend instances. + * The combination of plugin type and instance identifier uniquely identifies + a backend instance. + +* Each backend configuration block may specify additional, plugin-specific + configuration (such as LDAP server URL and port, TLS configuration,...). + +### simpkv plugin internals (10,000 foot view) + +Internally, simpkv constructs a plugin object for each unique backend, and uses +the plugin object to interface with it corresponding backend. When a +`simpkv::*` function is called, an internal adapter calls the plugin’s +corresponding API method with normalized arguments to affect the operation. +The adapter then (de)normalizes the results of the operation and reports them +back to the calling `simpkv::*` function. + +For example, for a `simpkv::put` operation using a LDAP plugin, the sequence of +operations is notionally as follows: + +![simpkv Store Operation for Non-global Key](Use_of_LDAP_as_backend_for_simpkv/simpkv%20store%20operation.png) + +Then, for a `simpkv::get` operation using a LDAP plugin, the sequence of operations is notionally as follows: + +![simpkv Retrieve Operation for Non-global Key](Use_of_LDAP_as_backend_for_simpkv/simpkv%20retrieve%20operation.png) + +#### Value normalization + +One of the normalizations done by the simpkv adapter involves the value and +optional, user-provided metadata associated with a key. In a `simpkv::put` +operation, the simpkv adapter serializes a key’s value and optional metadata +into a single JSON string and then sends that to the plugin for storage in the +backend. Then, after a key’s information has been retrieved by a plugin during +a `simpkv::get` or `simpkv::list` operation, the simpkv adapter deserializes +each JSON string back into the key’s value and metadata objects before serving +the results back to the calling function. This encoding of a key’s value an +metadata into a single string with a known, parsable format is intended to +simplify backend operations. + +The table below shows a few examples of the serialization for clarification. + + + +| Value Type | Serialization Example | +| ---------- | --------------------- | +| Basic value[1](#footnote1) without metadata | `{"value":"the value","metadata":{}}`

`{"value":10,"metadata":{}}` | +| Basic value with user-provided metadata[3](#footnote3) | `{"value":true,"metadata":{"optional":"user","extra":"data"}}` | +| Complex value[2](#footnote2) with basic sub-elements with no user-provided metadata | `{"value":[1,2,3],"metadata":{}` | +| Binary value[4](#footnote4) transformed by simpkv with no user-provided metadata | `{"value":"","encoding":"base64","original_encoding":"ASCII-8BIT","metadata":{}"}` | + +1: *Basic value* refers to a string, boolean, or numeric +value.[↵](#origin1) + +2: *Complex value* refers to an array or hash constructed +from basic values.[↵](#origin2) + +3: simpkv currently only supports metadata hashes +comprised of basic values.[↵](#origin3) + +4: simpkv currently provides limited support for binary +data. + * simpkv attempts to detect when the value is Puppet Binary type, transforms it into Base64 and records the transformation with ‘encoding' and 'original_encoding' attributes in the JSON. It then uses those attributes to properly deserialize back to the binary on a retrieval operation. + + * simpkv does does not support binary data in arrays, hashes, or the metadata. + [↵](#origin4) + +## LDAP Directory Information Tree design + +### Requirements + +* There must be one LDAP backend DIT for all SIMP application data. + + * This is distinct from the DIT containing user accounts data. + * Data to be stored must include simpkv data. + + * Data to be stored may in the future include other application data, (e.g., + IP firewall data). + +* The simpkv data must be a subtree of the DIT. +* The simpkv subtree must support partitioning the data into LDAP backend + instances. +* The simpkv subtree must allow storage of per-LDAP-backend-instance global and + environment-specific key/value entries. + + * Entries may be stored in subtrees within the LDAP instance subtree. + * Each key/value entry must be a leaf node in the LDAP instance subtree. + * The Distinguished Name (DN) to each key/value entry throughout the entire + DIT must be unique. + +* The JSON value of the key/value entry must be stored in some form in the + key/value entry. + + * The key/value entry may have a single attribute containing the JSON-encoded + value. + + * The key/value entry may have multiple attributes that map to the value’s + JSON attributes. + +* The tree must support efficient `simpkv::get`, `simpkv::exists`, and + `simpkv::list` operations. + + * Folder and/or key objects may store data in attributes to leverage LDAP + search capabilities. + + * The simpkv LDAP plugin should not have to retrieve the entire tree or + subtree in order to fulfill any of these operations. + +* Any custom schema attributeType or objectClass will be specified with an + Object Identifier (OID) below the official + [SIMP Object Identifier (OID)](http://www.oid-info.com/get/1.3.6.1.4.1.47012). + +### Design Considerations + +At first blush, the mapping of the logical simpkv tree structure into a LDAP +DIT appears to be straight forward, because LDAP is fundamentally a tree whose +leaf nodes hold data. For example, we could design a tree as follows: + +* Use Organizations or Organizational Units to represent folders in a key path + and other grouping (e.g., environments). + +* Create a custom schema element with key name and value attributes to + represent a key/value entry. + +* Construct the DN for a key/value node using each part of the key path as a + relative DN (RDN). + +So, for a key path `production/app1/key1` the key/value pair could be found at +the DN `simpkvKey=key1,ou=app1,ou=production,ou=environments,`, where `simpkvKey` is an attribute of a `simpkvEntry` LDAP +object used to store the key/value pair. Visually, this subtree in the DIT +would look something like the following: + +![LDAP DIT snippet](Use_of_LDAP_as_backend_for_simpkv/LDAP%20DIT%20snippet.png) + +Unfortunately, there is a nuance in 389DS that complicates that simple mapping: + +**__389DS instances treat DNs as case invariant strings.__** + +So, the key paths `production/app1/key1` and `production/App1/Key1` both +resolve to the same DN inside of 389DS, even though from simpkv’s perspective, +they were intended to be distinct. This unexpected collision in the backend +needs to be addressed either by simpkv or within the DIT itself. + +### Root Tree + +The proposed root tree to hold all SIMP data in LDAP is as follows: + +![LDAP DIT root](Use_of_LDAP_as_backend_for_simpkv/LDAP%20DIT%20root.png) + +This trivial root tree can be expanded in the future to hold data for other +Puppet applications or even site-specific data not associated with Puppet, +if necessary. + +### simpkv Subtree Option 1 + +The simplest design option enforces DN case invariance by requiring all the +values of all attributes used in a DN for a key/value pair to be lowercase. In +other words, change the experimental simpkv API to only allow lowercase letters, +numerals, and `'.'`, `'_'`, `'-'`, and `'/'` characters for all key names, +folder names, and plugin instance identifiers. Then, because each key’s DN is +unique and case invariant, the simple mapping scheme described in +[Design Considerations](#design-considerations) can be used. + +With this simple mapping, the proposed simpkv LDAP subtree will look nearly +like that of the logical key/value tree. It just inserts a few extra "folders" +into the tree in order to clarify the roles of the nodes beneath it. The new +"folders" are + +* 'instances' under which you will find an individual subtree for each backend + instance + +* 'globals' under which you will find a subtree for global keys for a backend + instance + +* 'environments' under which you will find individual subtrees for each Puppet + environment for a backend instance. + +Below is an example of the Option 1 DIT in which simpkvEntry is a custom LDAP +object class with `simpkvKey` and `simpkvJsonValue` attributes holding the key +and value, respectively: + +![Option 1 LDAP DIT](Use_of_LDAP_as_backend_for_simpkv/Option%201%20LDAP%20DIT.png) + +### simpkv Subtree Option 2 + +The second design option enforces DN case invariance without impacting the +existing simpkv API. Its simpkv subtree has the same essential layout as that of +Option 1, including the use of the 'instances', 'globals', and .environments' +grouping "folders". However, in this design + +* The LDAP plugin transforms any problematic attributes that are to be used in a + DN for a key/value pair to an encoded representation (e.g., hexadecimal, + Base 64) . For example, with a hexadecimal transformation, all backend + instance identifiers, key names, and folder names would be represented in hex, + minus the '0x' or '0X' preface. (The Puppet environment does not require + transformation, as Puppet environment names must be lowercase.) So, key paths + `production/app1/key1` and `production/App1/Key1` would be mapped to + `simpkvHexId=61707031,simpkvHexId=6b657931,ou=production,ou=environments,...` + and + `simpkvHexId=41707031,simpkvHexId=4b657931,ou=production,ou=environments,...` + respectively, where `simpkvHexId` is an attribute of both an LDAP object used + to represent backend identifiers/folders and an LDAP object used to store the + key/value pair. + +* Each node with an encoded identifier RDN includes an attribute with the raw + identifier. Although this means a little more data must be stored in the DIT, + this extra information will support external searches of the LDAP tree using + the raw backend instance identifiers, key names, and folder names. In other + words, users can search the LDAP tree without being forced to mimic the + transformations done in `simpkv::*` functions. + +Below is an example of the Option 2 DIT in which + +* `simpkvFolder` is a custom LDAP object class with `simpkvHexId` and `simpkvId` + attributes holding the transformed backend identifier/folder and raw + identifier/folder, respectively + +* `simpkvEntry` is a custom LDAP object class with `simpkvHexId`, `simpkvId` + and `simpkvJsonValue` attributes holding the transformed key, raw key and + JSON-formatted value, respectively. + +![Option 2 LDAP DIT](Use_of_LDAP_as_backend_for_simpkv/Option%202%20LDAP%20DIT.png) + +### Recommendation + +Option 1 is the recommended solution for the following reasons: + +* It yields a DIT that is simple to understand and navigate. +* An API change is not unexpected for `simp/simpkv`, since it is still + experimental (version < 1.0.0) and not enabled by default. +* SIMP can help users with the transition to lowercase key names for any + existing simpkv key paths or `simplib::passgen` password names (whether using + legacy mode or simpkv mode). + + * Any SIMP-provided module that uses simplib::passgen can be modified to + ensure the password names are downcased. + * The `simplib::passgen` function that uses simpkv can be modified to downcase + existing password names that have any uppercase letters and then to emit a + warning. + * The script SIMP will provide to import any existing simpkv key entries or + `simplib::passgen` passwords into a simpkv LDAP backend can check for + uppercase letters in the destination key paths and either skip the import + of the problematic entries, or convert to lowercase and warn the user of + the conversion. Then, it would be up to the user to make any adjustments to + the corresponding manifests. + +## OID Subtree Design and Custom LDAP Schema + +Either option for the LDAP DIT for SIMP data requires at least one custom LDAP +object class. The LDAP object class, in turn, must be specified by a unique OID. +This section proposes a SIMP OID subtree design to support LDAP OIDs and then +uses the OIDs in schemas for the two DIT options discussed above. + +### SIMP OID Subtree + +SIMP has an officially registered OID, 1.3.6.1.4.1.47012, under which all OIDs +for Puppet, SNMP, etc should reside. Once an OID is in use, its definition is +not supposed to change. In other words, an OID can be deprecated, but not +removed or reassigned a different name. So, the OID tree must be designed to +allow future expansion. + +Below is the proposed SIMP OID subtree showing the parent OIDs for attributes +and class objects needed for the SIMP DIT. + +![SIMP OID Tree](Use_of_LDAP_as_backend_for_simpkv/SIMP%20OID%20Tree.png) + +### LDAP Custom Schema + +#### simpkv DIT Option 1 + +The proposed custom schema for the simpkv DIT option 1 is shown below. It has a +custom object class, `simpkvEntry`, that is comprised of two custom attributes, +`simpkvKey` and `simpkvJsonValue`. + +* `simpkvKey` is a case-invariant string for the key (excluding path) + + * This is used as the final RDN of the DN for a key/value node. + +* `simpkvJsonValue` is a case-sensitive string for the JSON-formatted value. + + * In the future, we could write a custom syntax validator for this attribute. + +``` +################################################################################ +# +dn: cn=schema +# +################################################################################ +# +attributeTypes: ( + 1.3.6.1.4.1.47012.1.1.1.1.1.1 + NAME 'simpkvKey' + DESC 'key' + SUP name + SINGLE-VALUE + X-ORIGIN 'SIMP simpkv' + ) +# +################################################################################ +# +attributeTypes: ( + 1.3.6.1.4.1.47012.1.1.1.1.1.2 + NAME 'simpkvJsonValue' + DESC 'JSON-formatted value' + EQUALITY caseExactMatch + SUBSTR caseExactSubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 + SINGLE-VALUE + X-ORIGIN 'SIMP simpkv' + ) +# +################################################################################ +# +objectClasses: ( + 1.3.6.1.4.1.47012.1.1.1.1.2.1 + NAME 'simpkvEntry' + DESC 'simpkv entry' + SUP top + STRUCTURAL + MUST ( simpkvKey $ simpkvJsonValue ) + X-ORIGIN 'SIMP simpkv' + ) +``` + +The corresponding SIMP OID subtree is as follows: + +![SIMP OID subtree option 1](Use_of_LDAP_as_backend_for_simpkv/SIMP%20OID%20subtree%20option%201.png) + +#### simpkv DIT Option 2 + +The proposed custom schema for the simpkv DIT option 2 is shown below. It has +two custom object classes and three custom attributes. + +* Classes: + + * `simpkvFolder` is an object class for a node representing a backend + identifier or folder. + * `simpkvEntry` is an object class for a key/value node. + +* Attributes: + + * `simpkvHexId` is an attribute that is a case-invariant, hex-encoded string + for the backend identifier, folder or key (excluding path) + + * This is used as the final RDN of the DN for a node. + * In the future, we could write a custom syntax validator for this + attribute. + + * `simpkvId` is an attribute that is the raw, case-sensitive string for a + backend identifier, folder or key (excluding path) + + * `simpkvJsonValue` is an attribute that is a case-sensitive string for a + JSON-formatted value in a key/value node. + + * In the future, we could write a custom syntax validator for this + attribute. + +``` +################################################################################ +# +dn: cn=schema +# +################################################################################ +# +attributeTypes: ( + 1.3.6.1.4.1.47012.1.1.1.1.1.1 + NAME 'simpkvHexId' + DESC 'hex-encoded backend instance, folder, or key name' + SUP name + SINGLE-VALUE + X-ORIGIN 'SIMP simpkv' + ) +# +################################################################################ +# +attributeTypes: ( + 1.3.6.1.4.1.47012.1.1.1.1.1.2 + NAME 'simpkvId' + DESC 'backend instance, key or folder name' + EQUALITY caseExactMatch + SUBSTR caseExactSubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 + SINGLE-VALUE + X-ORIGIN 'SIMP simpkv' + ) +# +################################################################################ +# +attributeTypes: ( + 1.3.6.1.4.1.47012.1.1.1.1.1.3 + NAME 'simpkvJsonValue' + DESC 'JSON-formatted value' + EQUALITY caseExactMatch + SUBSTR caseExactSubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 + SINGLE-VALUE + X-ORIGIN 'SIMP simpkv' + ) +# +################################################################################ +# +objectClasses: ( + 1.3.6.1.4.1.47012.1.1.1.1.2.1 + NAME 'simpkvEntry' + DESC 'simpkv entry' + SUP top + STRUCTURAL + MUST ( simpkvHexId $ simpkvId $ simpkvJsonValue ) + X-ORIGIN 'SIMP simpkv' + ) +# +################################################################################ +# +objectClasses: ( + 1.3.6.1.4.1.47012.1.1.1.1.2.2 + NAME 'simpkvFolder' + DESC 'simpkv folder in which simpKvHexId represents the relative folder name in hex in the DN' + SUP top + STRUCTURAL + MUST ( simpkvHexId $ simpkvId ) + X-ORIGIN 'SIMP simpkv' + ) +``` + +The corresponding SIMP OID subtree is as follows: + +![SIMP OID subtree option 2](Use_of_LDAP_as_backend_for_simpkv/SIMP%20OID%20subtree%20option%202.png) + + +## Technologies for Plugin Implementation + +### Requirements + +* Plugins are written in Ruby and implement the simpkv plugin API. +* Plugins must be multi-thread safe. +* Plugins must be written to provide Puppet-environment isolation when executed + on the puppetserver. +* Manifests that use `simpkv::*` functions must be able to be compiled with + puppet agent, puppet apply or Bolt commands. This means the plugin code will + run in JRuby in the puppetserver, run in the Ruby installed with puppet-agent, + or run using the Bolt user’s Ruby into which the puppet gem is installed. + +### Options Considered + +| Option | PROs | CONs | +| ------- | ---- | ---- | +| Tools provided by openldap-utils RPM |
  • Existing, signed, vendor RPM.
  • Package will already be installed on host operating as the simpkv LDAP server.
  • Supports ldapi interface, which is faster than ldap/ldaps, while still being secure.
|
  • Requires openldap-utils RPM to be installed on host executing Bolt compiles.
  • To take advantage of ldapi either have to educate user on when ldapi should be configured OR create internal auto-ldapi-detection logic to use the ldapi interface when it is available <--> complexity.
| +| net-ldap Ruby gem | User can install gem without sysadmin support, when not on isolated network. |
  • Requires gem RPM packaging for use on isolated networks (e.g., simp-vendored-net-ldap RPM)
  • Requires gem installation into the puppetserver
  • Does not support ldapi.
| +| Support both tools provided by openldap-utils and net-ldap Ruby gem, using whichever it discovers is available | More installation flexibility when not on isolated networks. |
  • Increased code+test complexity.
  • Still has gem packaging issues on isolated systems for Bolt users.
  • User still needs to know when ldapi can be used, unless auto-discovery mechanism is built.
| + +### Recommendation + +Option 1 without the auto-discovery mechanism is recommended for the following reasons: + +* Options 2 and 3 require additional packaging in order to work on isolated + networks for Bolt users. So, if you are going to require a Bolt user to + install a package, anyways, might as well be an existing vendor package. +* The auto-discovery mechanism can be added after the initial implementation, + because it is not required for the LDAP plugin to function. diff --git a/docs/Use_of_LDAP_as_backend_for_simpkv/LDAP DIT root.drawio b/docs/Use_of_LDAP_as_backend_for_simpkv/LDAP DIT root.drawio new file mode 100644 index 0000000..2fd3ae1 --- /dev/null +++ b/docs/Use_of_LDAP_as_backend_for_simpkv/LDAP DIT root.drawio @@ -0,0 +1 @@ +5Vptc9o4EP41fISRLNvgjwkk7d2lvbRp75pPHYEVcDGWT5YD9NefZMvYsozjACGZCZkJ1uoN7T6PdldyD41Xmw8Mx4tP1CdhzwL+pocmPcuCYGSJLynZ5hJniHLBnAW+alQK7oLfRBemgU8STcQpDXkQ68IZjSIy45oMM0bXerMHGuqTxnhODMHdDIeFdOCU8n8Dny+UHLpeWfGRBPOFmnxkDfOKKZ4t54ymkZqxZ6GH7JNXr3AxFsgFyQL7dF0RoaseGjNKef602oxJKJVb6C3vd72ndrceRiLepQP+vLhcrZf3fvwlTD+vg+HfH6/6apRHHKakWEb2Y/m2UJEYRVhDFC7Xi4CTuxjPZM1a4EHIFnwVihIUjw9BGI5pSJkoRzSSPRLO6JIUQqEhL/uIGkY55gGNhLhvAyFQP4QwTjZ7Vwh3ehOAJHRFONuKJqoDsuFgqKyzLexoDzw7F60r5vXcXLaoWBYC0VbJscLVfDdJqVnxoJS7x27k65ebD98n1389er/u+eSf6+Wyj1xTsb6AoipSxhd0TiMcXpXSywxdRA4rNVS2uaE0Vkr/RTjfKlrhlFPdJGQT8MlG9c8KW1WIaGWirG05vBLsUb9YA03ZjLQsFipScczmhLc1VFqRquhiYct2BwA4moldtN9k2UAXjOFtpUFMg4gnlXlupUCHUX2SEdK51aELhKiGmvyHlBjare9wWMGRQWCaiu8kWMXLRwNyz2CwIOs1GI9d0IYEg677LYcaNKS0WmXmCJjEROClSDlsJSUJp3Rd5eNJGSh0ybZlVVYq6gwuljsBLBr/kG2F+1LF+8oclSpRui96yeWIZ2m0YCaHPobibleKjzpS/Bjr/nlHFhsGkvnP+c/g+8X0R+pM+qiZGkH8EDCyxnKAN0MPNHxdejQqcPQ8dugYPSlXDD7sDyx8nCy6EaWFf69IojYoH8ShZo/VR547cC0dcDbUkZQvQPVscX8OQIPRSB9raOlj5Ws0xjqZI3QMtvsz5QjfEs+ByXP3lb1ggcLqRim+4jSOCX/juoPW+ZTn+j9uUncaLrffpl+36Kp/t076lqG7nuWGXGqCZhQpVef+l9Kiop9km+CFaACdeFNWiqe5/L6ZXNyKyq8yPbTAN0ZIlt4y8f/uj0+yaoI5LuYSPz2fLu9sGE1omOt20jdQla41ZHA4DOYySZsJuxEhvyw2vgtVsQp8P9yXHeoJjNzx83W35xfdIQE9VHOZBhoszzPhYL0UHEwqjWn0EMxThqdCS5aLV1Iv0TSJ35OdbEf3Dg40WWuZZoLeC5nJa2BtPdSJ/At5wCR1GuIkCWa1YKUILXaFez3O2BNaGJHLCMg/2e7J84BZyh7L2KaIUSoRShmvNMdRnUKVNmA/He47HUOViumdhg27kDESYh486od43cMcuxaWeM5hEQ4qdpFinNoGcrroplH7EBiAvVXuGeA4DgXRs8M0C/iZV3gn2wpEdi0acIx9BaKmo76X2ligGQ8oF5777uJc5p3ZCdbcdJEcVOxUiLSo7cXMZPrpwx0A0B3A8OweAJ7FAxR70OkOdc/lAlwdfMWm8VwfYANP5h+g+EB9WGd3l3QupzB8GsQ6Xp5AdAswD0Da02A+AovWm4LYzu8oLFjOgRCzUA1U3vC8kGoKjPMU0w+k2yr8TJmwhuSBm+nrLRXwyjIeQDYxjpIsOslHmrIyT92lr9nw7yx7tevZq2ceZkBonzF8scw489l+8XTurTy8HQFPd7IjoaonjnBl6ZawQGhGmv5Y7+eZ3q/tRv2N7EyOU4dYLXHp7Pwcp8X5WQC9nPNrVLN5ufNsoGo3BfsvFFruAjr5PuOepOEK4dB7ikasne7OvlHz9qviueZpUX2IzlcWth4VerUtdQ98n/sugW3X+AesGhuOeylgv4WM8/yI8DVlS4MmRx3oH/W+jm05A88724G+KJZvW+W6Lt9pQ1f/Aw== \ No newline at end of file diff --git a/docs/Use_of_LDAP_as_backend_for_simpkv/LDAP DIT root.png b/docs/Use_of_LDAP_as_backend_for_simpkv/LDAP DIT root.png new file mode 100644 index 0000000000000000000000000000000000000000..186f1c9ee4a0d96ca8466cc6d00ae64dadc1c6ff GIT binary patch literal 25357 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

7<>1Hxfzx=`l4`HbkH$n=H&^b z9*ss+fv=mZD3?gm6@tdX#<*Z|`UeN^LN?hnIQeRWKi?^fDMM$w?d;cDyQc`_2lxE= ztWNav(%B>M@_@_vY!$MP)Uu$-muf^Q4uErtH8y`Z>|5 zRtll5am0EeW=G}5;XgTLPpVXxgsLZ5BXX?#*T`NXtOM%>x_#A1s{6-B{K#R81-}mb zkO;hRdypO-vMi8|;UI5Ush<+e0fIpiHh)Rgm!pMFNtZ7ZvlGfjI4;-%dIg;y zJ%KNUXJlj)#V}G*R-Y)eNdS)tO+^nh%)ps;fiP8Os^y^Mfnh2Vj3uzR_1E44T1|j? zOWk0qq+TxqJqer5rnt5~5UU;9e`G6Q*|iwOVgyWm(Oh1YzUOtNzlZpHzFv@UF#8@Z ztak{JWzOdm6cBIbZiHKfp0bt099LFXALP{auf}4nsq`Ncd(ZbB={><6ry}MZJtkK_ zKP3hw9^9r=zn(mitx7kHh~Re1rwdp?be>n6{BQdZ*`RqP^uE~n5B9F%!JP?GnR-!U zmcQy$m8ZwLpa||=_$WEwFrKqVK+nvK2X>|1HP+Q$GA?!*q#>Q0*c+J zq%`r*Z;q#+q9-iEj#LqFXx}Gh3`M*ZMKAm>{esSrZRW$P5tKeFD=RYP){2Q$Rq4ij zH*VfM$KIfIYY3B;d^iUgOTF`+0V?EAsn*t?^0u0OZ*cze&sQjyFomd33P$>pm)X&z zTvX^()uEcB5k`)VO1L2;6cmyWRp_G?vvVmv*np(5fGjn=sL`*7I7WPSa6pUt9~Lrw zhHF$Y++gW3$b$P(;NXFv23%rqM9ErsMNw|V0W2gLcV_?7ciFcY7rskku+aq2M{<*w zIpB+nXfzp=pZ6KER&-ouAbUu<=CNZ5WoZU$675a0E71W}f2&g{Mm!Vp&;CX&1D5kP zery$vAAiAmhQ%Rg#K}1dr#0~84KV!Tei%3}<{}ZTeKi_BfGV&YEgX@AT&gPJ9$+!% zK3zuV$D37wwp#xi^e5aUA38hZNrKFo9k2`-to`q$SZON}!-6a5X@m zpw9Sa@@)LK($Yu>A$FjT)`4-H+vL?rL=~1Y9zcQz573%i+uQ!kT>*7j3rG5o`yj+2 zk>%y(E$!MZx(9Q!6+CZ3X6A3@#<{Bj)_5Y`6N>}{Pn=gsU}F&Z4XL$jNo1mrmcxf@ zwY}uLL3#-EPxUXVT};U^rq0d=5d44h=0lugveyAEc!Gz*xk{20R}O3xBAN3+xed{(&7Aa0cTH7@OQyZu5(0tW)~{cJ zZy?`Yffv1+2`dG*8fbST$O_8Rnv{X78i2MX8^LiL!C5XXZc7{W@V@8r==9}SwV{TJ zzr(nVv$utlt-ecBGYg*qR)7!|*=C#Jb%WjIR?QJpd^Nal|+HTctO&PAoGKN zum=QoaM{ztIr^YMFhInQ0n(qWF_N1JvzxkYIs4e@*gcgL>4XuwDS#e@w4Z$st+UwL$sfvM>Vi2m{5Vc3quT#DE*==Egz%Hy1pI4wx7g=-Y+= E7l95r(f|Me literal 0 HcmV?d00001 diff --git a/docs/Use_of_LDAP_as_backend_for_simpkv/LDAP DIT snippet.drawio b/docs/Use_of_LDAP_as_backend_for_simpkv/LDAP DIT snippet.drawio new file mode 100644 index 0000000..90e1097 --- /dev/null +++ b/docs/Use_of_LDAP_as_backend_for_simpkv/LDAP DIT snippet.drawio @@ -0,0 +1 @@ +7Vjbcts2EP0aPtbDu6THkLLdaZRMYk2T+hEiIRIWCDAgqEu+vgsQFElRlp2pk6oz1fBBe3YBELvnLCBZXlzs7wUq8w88xdRy7XRveXPLdR3fdS312OmhQSZ20ACZIKkJ6oAl+Y6HYE1SXA0gyTmVpByCCWcMJ3KAISH4bhi25nS4aIkyPAKWCaItehN0+FeSytzgTjjrHL9jkuVm8ak7aRwrlGwywWtmVrRcb60/jbtA7Vx2A1Q5SvmuB3m3lhcLzmXzrdjHmKrktnlrxt094z3uR2AmXzPAxg+fF/d/zu/eb2dPj3L+5W6z+c3MskW0NhmpSFFutu+xqucGH0xAJQ9tyqodKShiYEVrzuTSeGywk5zQdIEOvFZvVEnIUGtFORfkO8QjCi4HAHALaQjhhoOIpRpp5hS4gphP7TadE+gD2g8CF6iS7dtwSlFZkZV+PzWwQCIjLOJS8sIErQmlMadc6M15vj8LdOg4u22qsJB434NMtu8xL7AUBwgx3rbwRhmeM23sXY9mgZk17zPMEAwZbmfHmY+LPYAWEMtgY8fV/OlgNSf07PFyzmS8HOR+sByiEguGJI4Ut6s+p+BLb6MdpJn2A6xzR6zjqyfYUkxRBW/xTneB0lJv5jmqSiN3w9JbptNyDOtxVwU19D3x/lFx9qVZWMWA/1utJBhZk+jm5saazHtQN3gkAyCB1CwWfIN7DPJCb+alY2YlCQ6gN3gRoiRjgFG8VhMoPhFoSO8MrDYO05YoISxb6Ji53yEPpnAK4jB2TXVPyUmaYqZUwCWSaHWUZMkJk7qyQQQP7De2oecF8Eox2E5nw6PChYw5g10hoomPQU87rDQVoVryqtHreYVc7DAvy+Yw5ONLMgmd52UyIOyPstO3R8XGKZwaxoQM5TzjDNHbDo30QYBTk/UuZsFVPXXCnrCUB9PwVC5Vy5NF2w7xnsi/1HCoRmM99jzztstp42CMZ5tUxWuR4EsKNBKEHpzhS+Vz/SZQZeBi9QSmSJLt8LR989q449YBIkWF0gyVug6gXNeef9S3AaG2mGNzWmM4qmF+YDdikJ12XGakrsevYEhokBMS7HIi8RJkqOwdXIeGBTzR+50dx+HFIr3+JPGP15S2u9vuWCR22Eb1ZeKHP6kU/vhqcKUyweqY6A1S5mPf1w3T1hvIy3+tvMLrkpc/PplrdQqwLRGcFVidJVekC/tUF+GZO5Zjj1XRXo7eXhXu/6p4iewvq2J6XaoIz6uiFDytE0k4uyJNBKeacM/87pj9Ukl4/xVJ/ANqT19Jbee6mD09z2xUluPT/V/kdHDK6TN9fvo2nAaz+0+m+cHb/fPl3f4N \ No newline at end of file diff --git a/docs/Use_of_LDAP_as_backend_for_simpkv/LDAP DIT snippet.png b/docs/Use_of_LDAP_as_backend_for_simpkv/LDAP DIT snippet.png new file mode 100644 index 0000000000000000000000000000000000000000..d42819562f8eab09962fe507e9f30174305d7921 GIT binary patch literal 14963 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 \ No newline at end of file diff --git a/docs/Use_of_LDAP_as_backend_for_simpkv/Option 1 LDAP DIT.png b/docs/Use_of_LDAP_as_backend_for_simpkv/Option 1 LDAP DIT.png new file mode 100644 index 0000000000000000000000000000000000000000..6afbf96cc01fb5aec7d2d8ffc72c8c46b4f4239f GIT binary patch literal 60847 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 literal 0 HcmV?d00001 diff --git a/docs/Use_of_LDAP_as_backend_for_simpkv/Option 2 LDAP DIT.drawio b/docs/Use_of_LDAP_as_backend_for_simpkv/Option 2 LDAP DIT.drawio new file mode 100644 index 0000000..630cf5a --- /dev/null +++ b/docs/Use_of_LDAP_as_backend_for_simpkv/Option 2 LDAP DIT.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/docs/Use_of_LDAP_as_backend_for_simpkv/Option 2 LDAP DIT.png b/docs/Use_of_LDAP_as_backend_for_simpkv/Option 2 LDAP DIT.png new file mode 100644 index 0000000000000000000000000000000000000000..9c31ed4782b7f4d6fb5aac606fdaaf39097642f3 GIT binary patch literal 134602 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%0D-1(l!5Ij#E5TGN_f*^!I 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

kmeF@VeRV9H_6;yi)@5HUCFo`-OQ^< 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 Ox}vC|kSk~U;J*Ol@=ap^ literal 0 HcmV?d00001 diff --git a/docs/Use_of_LDAP_as_backend_for_simpkv/SIMP OID Tree.drawio b/docs/Use_of_LDAP_as_backend_for_simpkv/SIMP OID Tree.drawio new file mode 100644 index 0000000..30c114e --- /dev/null +++ b/docs/Use_of_LDAP_as_backend_for_simpkv/SIMP OID Tree.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/docs/Use_of_LDAP_as_backend_for_simpkv/SIMP OID Tree.png b/docs/Use_of_LDAP_as_backend_for_simpkv/SIMP OID Tree.png new file mode 100644 index 0000000000000000000000000000000000000000..d9d94137645ca6f53781ad0456e2088a39015d66 GIT binary patch literal 46209 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 \ No newline at end of file diff --git a/docs/Use_of_LDAP_as_backend_for_simpkv/SIMP OID subtree option 1.png b/docs/Use_of_LDAP_as_backend_for_simpkv/SIMP OID subtree option 1.png new file mode 100644 index 0000000000000000000000000000000000000000..d914325c885d67b21e44e8c472b1011b60bb56be GIT binary patch literal 21407 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 literal 0 HcmV?d00001 diff --git a/docs/Use_of_LDAP_as_backend_for_simpkv/SIMP OID subtree option 2.drawio b/docs/Use_of_LDAP_as_backend_for_simpkv/SIMP OID subtree option 2.drawio new file mode 100644 index 0000000..005cd48 --- /dev/null +++ b/docs/Use_of_LDAP_as_backend_for_simpkv/SIMP OID subtree option 2.drawio @@ -0,0 +1 @@ +3Vvfc6I6FP5rnOk+yBASfj3WVru9czu3d73bdu/LDkpUukgYjFb3r98giYJERAVs24cOOSQhfOc7J18SbMGb6fIucsLJA3Gx39JUd9mCty1Ns3SD/Y8Nq8SAIEoM48hzExPYGvreb5w1zj0XzzImSohPvTBrHJIgwEOasTlRRN6y1UbEzz40dMY4Z+gPHT9vffZcOhFvpW7tX7E3nognA5XfmTqiMjfMJo5L3lIm2G3Bm4gQmlxNlzfYj6ETsCTtenvubgYW4YCWaWD2pqPn7+7dQ3+6fPxJF99+us9tqCXdLBx/zt+4f//wyEdMVwKGt4lHcT90hnH5jTm6BTsTOvVZCbDLkef7N8Qn0bo2HI1G2nDI7DMakV8b4OKaCxxRj8F77XvjgNkGhFIyjbsgAeXeB9amaapT1xgYjEywk39xjkXcN16mTByIO0ymmEYrVoXfNZMGnJIa4pR823rYUPXENkl5VweQM4uzarzpeQs8u+DYy/0Q9UI4/vd29L/23O3ftxfR9cuojXKIY5fxkBexPyBv3a2hE5F54OK4Q5WVSEQnZEwCx/+bkJAD/YopXXFAnTklzLTuhhWFD7I+xEuPvsQ9Kjov/UjduV3yh60LK15IRh0PdS8puWlG5tEQFzBR43mCOtEY0wKooNyzEfYd6i2yAznHT4WjTMWLQ2nkDeYU/7cK8RX4cmbsuDq2XCQLAEsbQKOiAAAiK60E3a1cCGxSWToEoFoXsmYO2cKY2JI+HRhb6xmsZrBGq1SjuPgjfW/bbF0S7bJReUYoaPlQKGTjTgDu9TrM5r02MO0K8tni2+v96Gnwfdqj3zq/w8n46aWt53x3WspK56cTvXISA4qSrySNVpz2ZIhqJV1dOg/ypo/EY2PeUERDejYxICPbRfJGvNUOSzbDOJ04xglBfz61GkwSZ1DFKkkVWAtVrqPIWaUqhDEFZvuZhGwtyyRdz+rT3fpChcnrs4tkBCfTTSYmiueYinTXuUzL55vzyFeNXpOxUQbxRcinix5rIlMhJCkJM/Sd2eyfwStbml5pH0MaImQoO3OARBzajWpDux5t2KCiaF4bWu9AG0pHhuxC5wUkqDHVqoVeSm9CSAPNWP8VebBugabrtmIjA9qqbgNkgKzb4uCFFjRUG6mWDi1USrxV+5CEmrUpxGL2NDVlF/NoX2YBBzLLjGFHr+NtS2ZYzx3eUJh7nr9NXK6oxKOFWfj9PYqhVMaR4i12XStbjFa+UyMddonthDHjRlh+xtxsMjsD0YMqf0OxlrLNnZmU6RAFMvwMQzdVQ9W1cvMqUBXDNDUIkWZDG1k1JWYg3wy+QqYKLiNeCj17WNFs9EsGPjGxXUrNAJSD2QlDnwUq9UhwoR3EapAGQH9fUOtVCMeApEprxHNS8jhAD6o8EYkHk67gUlmV14ZwNye1kWHLklL1zsjvnfuuE35MwguhlIESmNJEnWK/1eiyCeQA/xjsl+yJyl9QPZb9upVjPzM1wX6BfcoZM28a/lp8Iv4zer8r/sMq+P+uj5TOijMRPofjTPtAcabmnB7OwxDTzxRnmv6e4gyUWGt93igSEuywVjvytFaq1cpH0Z5Tlh3FoqOipWV1h31yRPKxChSoGApQkAJyHDouWq/tG9Tt1B+TB6JuN1Tr+jIFVDLZXUDslZ2ExJrorPBRLUUzLJWtUzUTmiY/Far+e678UifnjNTuU+mtJslG1f7dp51DHFPN8RWCzTRd9UQh30rMx3sRLBmOFaF89k4dUJGSD2cNNApODptkfXDvXujksNiFh9NkA3Kk6EuZDMkMnz2143oLdjmOLxNs/5qR4CmudwW/iErsmal6HxF4fteGOUYDIVYqd8TeLzUljP6Kl4zUzclxSX4ol1qKOW03COVxpxm1zCdIVRXz8JwCbEPRmsyb+1jWjZcAl1r0FfnwuMyp1zZD7/1YRwJmj/gujhqciE6JWbM4HZqKRLLb1UQxK25/yZEsj7a/hoHdPw== \ No newline at end of file diff --git a/docs/Use_of_LDAP_as_backend_for_simpkv/SIMP OID subtree option 2.png b/docs/Use_of_LDAP_as_backend_for_simpkv/SIMP OID subtree option 2.png new file mode 100644 index 0000000000000000000000000000000000000000..d05254e8baf586b0f6f88e346b7faeaabb2c6722 GIT binary patch literal 24759 zcmeFZ2UJttx;7d>1ySr3MC>R(WH&`AP>KnesYRxBVk5DTE9fOL@FZJ>gn zAib$5y@>RF--UjAfB)J0-h1x(&lu;9JMI`DkgUu#*PL&Co@aX5$Uu{elbaKTLUCzp zshOZqta$id!?6xtDcf}O0SdLAK~=Y)diuE%JX}ym(W<|HJ1Q>fPWGi9MXMbZ7kBXX zKIu$waPx8S^gZe2LWP&$eNVD8!Ij|R{QDYlQE@S0QH-#dC{|qbC|X%u3jPt3IVpt} zv-*9#gPV)jp8+u^MPY#B7Gh#2e!u5Jb#VJVjyZnCHjZAj)a6w*0tHZPWnKWEN_%ls+99mr1P>SJ2 z)YNqJ(ZevP$|}DH@pAC|Gl&t)R9NiyAZRnXl@m={Lc>VZfkM?bqUka<#KrZ^O*Ne< zIBx@QZ*L<}x|Xq(p1z8=o0y-bqY+w6&s<-}QPp2x+1$_+qiSI;X0C@pYZ=mfJh50~ zJr|;%1)AjUYoI0Rt?8z0VMZ6lsi4)2-BkRvVX-v`{%AcvO&wJorn!(Xh*OH4JmDgIhF~( zSVZvB+*zgcXd}uaTS6X-OyCuL|Tm|BPM|? zfF|0&!Gma^VPd3g?5q!$YsgsY!Vf8LH%Bq1F2>takKqZ|!Ar`j1hl)aFNt8KqN0X& z*Ot&GU>u|g4g@iho1`kqU5)6i#&mTtAmWHl#^P8lFAHULH-@Q{3dL6igHdMs!!YUw z1RwZeqAF(0#7f9WO2HpSXg_af6G;bOxCc>^>Wo}w=wzznhbEB;1T0z9%frV~il8H@ zh4m#_xGQ^EIg|agtwfFWooUi)E*@lKHAx~?Ra`?`RT3xafN{X$^z}r^u2x!N+8RWR z6cOi&Q`69rBsowp<`M))A7gJl9M0WS3nwF{5HvB$9x{ev+88f&1G<{7 zo0g@oHeH|KW~^+bVQPvq^F%xO=~%i;>58i8AZDcJX-d`7)79{#5{!)q;`&5aoVuBp zfhAeooPrZ$N|PL<9Gx|2W>$J|v9B%({xw$i_0uC;sT!Cw^qeFu%yC2us)3~%$;?mB z$cifEf=tBA2n|ZVI4lNsh- zT9!C}bzM^_ilnm&180F;K?W04agp|RBdVJaEg6<-`cfuFI_hMqlewvkBi2wyLIUHi zNif2QIT#o_=%`D&6Fel1bq(F9W1tqzy1o=Ctf!fS5mnO3#0Nu>CgRLA#c;+J5+>5_?o2S4U$G3lCANh=F!O+%8qJHb($YUw~$cQf=d^JW^u+?}Lp=9&hY zI13q?gO-e%myR07$)ACPcL>t@CgQI8&RB}O8Aex2RGaK>?m&Y9$z*94LkV>zR@sT^ zr0(hDg;i5_c2hTZbk&d`;l%a5a9Wa54l0fs42p{bU0lbFB*w&8x@-6tdifB{r99PL zq_o}Wmg-_8Pc1d7xR!~Gqm!=zMaor0N|eeJcN0asNqZU-$tG4bbyu8}KH17t9p|D$ zW%`Nvm@}B>bPpY(g`R_sr36;Ro8f5bN-}doqqU{996eO^d?Zy}%v}6^G{wz4bY0xV z3EC3kE)MP#b4Qw+mY$CTRas1wspsbA?k=gStR*h)q{~!Sk7=Xf?>=eQDMi9jNxnW3UdGNOKZ+&Qz(mEtg5qVR4ohjskd`)p zpZ=EaIxadmH!EFBRg#*srH_m=1?{Ngt&D_cO+$tSTHTZ4g+bzvnVPsJ+QAThbN0i5 zcWC%}$Phfdutt6+Fl|k`IKh=@BlP!6bzlj zQ1LMJ6W0(Wiu)5Vs!k*sQIeORsJVopr;n?FjINKVv6ZDK+L&qvA7f%HTqS9yP9&_i zjII|N=dDH{i+iCZsYW;jZ-x=b9ZDK8Txu-+$@}3ATVl}`|3KWGYrJsNoZ#& zO#gZ4X60w7XDn*s zX6l<1pfY0W1-c%&RrTsp$?$5 z)s(S*4~9G4sMx7*D+}Y-x9A9LKd?sS*0y`=wn%(Ab9@U??ciDLiEUeD4zO|_y1sqQ zYnAQS59ptGyyF7u(e@*cp4{1cjk#m1QEz$BOggQ}pE?%!t8nwIOZ9cs-Hpz4*RIql zE5YY(Zgo;~2K27ET7%3>!HYe7E3;Kf%i|HjxcRz6+UD1;K~;Ear#GkQlGJYaHDU`3 z)QLuKI7CsX5CM%478D9A#<~%OdU$0kl#wW07>W&rN^)GY2l?3H3V11b&wtlPLIy@! z^YqTKD{Ph;Zq2Ldnc(;$0yk=~mRHhNm@i3c)yvwzS_s{e|kU5;sq2No(X@P zpw!z0-kMWNI)8`1R5gU<7<`K=u)Nr+m zzU&EaVutxVWo+`@wFxGzlHDtC-aVEB1>R4&7;f!8|B}mP+Pb{lsA=5|tE{EeJl^tT{*E$ z`Od1eh;t~m2TAKU>}+`PG@8`bL@wT%Ua?VqrNskonm9fvb=~=@@6UARjx+ zI_zd-O;fI*0$>R^$t`N13>8gB-<#E-1D!oTS_tOFHSQ*?)Nk+nHu{WM9X`?51R~FBr*iLUm_9yvJg$`H1l;@PcgU#I$WOou($k*O}j7Du;;FL3e7HON$$jhR>XN9!ngEnPa^m~3mF zOKgq|{(xFa)8J}czwuZFicc9CA(R&%H!Ph&Tlh7l-@DR(L2TvY^QDWV=2oT2#%JA) zPc=&}8b;f?mPh2dB?YP7ZW^g>Hct#HU$VY_t6TWFy*l5F0V5*>H|Ym^9teJ+H|D@@ zQPU78K^-0$%BMdld(_2deM_*>w@I z{x#rzemwuh3-kSgZVK(%&~Yk+rB@|{CFK6iKK`xJD4W&a;g;!#Do_>ru*c@`kYA3$ zT~gpx@9nT>IC!<-GK%es07QolwGbBXoe&1R-~$C$AVf&P2W-@lA^+br%&DV`eHs_X zr#o5beSs(=SYwpHBa)t6_`dxaq&$hk73r<@5{?#1wD8N*v$LpZ9(bh4OnLtzV$-C# zmexaAn)_3O5$h92ju^49EL)ZN6;)NSS9HK5COxsrCBApeN}`XTdPYJ*?(OH>jhcW6 z^YCUAzu}$o@;ISgSK(`MX~|-V)#xCydXK0-t~QFG(htBQb3IMLrv|ZjuSFJ-ljEoP zsgUxjDwc=y$ea4s%_8+tv<(W1n^2A5b`@B09h1nLQRfA&8{ZrppIdht)_(QHT&duz z!<%^aKMM4>hCp`?W|p9Wn2iXG6U~X3O<4$-jR0acv#hY8&$b};wc$T;VF5ROsBBSh zB+fnK%XNJ2HLo;^X{A6PF>iR&{gX?ljdxvDzY|oJgkGEIl4UXZtKd%cKBv#;&7HF> zsN#L+;i8wR4#~#x7Z(>7zxVYeRvL##E{;1U&iG6Hu=VWhldtVak>QqdNu|i8+mm~g z22cLz>*FtemEe1H@0Fou>w^vl2fLmZ8+_j7j=fV=ni^uoQaQ3n@_%1=&(k8u@sXXMj50k`|D4^vr1fMyqpwq}ADF>W%*o{; zze0209A-7KG09jp6x|Ru689u171n?zzYy({(VNu$rHmW%b!RKDBp0s?HZ({YT&i&m zvaL4jGj|RtVXLAy8MJSTk#kQ~>Ey-J2AhmC6iXkNrPKGdJ&L6$?AW)>#w#R}*#0O@ zv1>L9mfN*9?$OZ{llQ5wX`@}OCn`qmcuC8CzA-1H(@MI1aOj5#we3NohcXO0Wh;s1 zDvoEZH1nh4;^It0VEt4~-AcVWy0RJ1+vx6sun^>HBcCcBv2ln#yoZ?56+srd?8x2LmlCJn zjb=Uzs2eqKpr%W!ro~$i6+dSm-HRvJ-c1%tge}Jlq}#F4!P+YI_Qyx1StrqB z+PEj{5A-mTf3Xg~jIg|NDa`0y+#C4d6=IW`QcG>*deN18%P_G6N=iy_&#A8Zxk@Li zA#0pp4}G}RE3&_}FRt-o%n&X8NPGuM&e~5y*ecg(v~eHo)QI+qmAlMM+x(C z4dLyYBKwT}&ixb@#LI08nyNtQ$^~nU$mTY5FD%-+aT>^V?%vIpC>$WQ9e)Y~0bX>c zIqNX8SJN+B4ca+_>h8c^gEv8C@HAELQ_|)5$u=dshO<95*l=dvRJytod@9fSXttb} zeFiSki?{KawPr4^g>*(bC1KsW(#hu|EUK41UCZ zo-8B}j!Q;Vj~-t+`nDdIdZ}_N5$v|-Xz`VG(O?|l2(mH3$u-lz%qr?d_T#VjF9kq(mFl%d>P=vTnxLJrUQ@9G?4wa;Y0k9jQytZ&H<@m zn+*P9#b*z{9I$+qHYin)k<~`cKs}f982lt>7E}CYPrmK?O!H%5pDS(S%#T;}3f)UP z|N6Z6f~)O2EO_6Jt$QDNDHKKWP#Nqkw`}8tCKzuX%V|`PW)A4RAS6bFqS$J}5vy$c zD)KeaUOstw{gQ&>HMvr;1+KJ(UuY=Djv;~9gqO8uw4jue-bb^Iy&WuUST_}1`*a2} zeI4Y}XdT-6%v8aa@Wm<9=4khbh|M8| zU;swzt8XQyxatRAIKL*@G}LVHb6KQ{3hT}-Uow7NO$<1F8ij0Kh)yytB?0m_v3Zkd z*CvjnfpH3ps1i~)5d42p=N1;;IcB|uukP*$NaZ_`!ih)6ybN;u7fz%wGAiP%9NdjE zhh6!S5P}L`yJj}v^gdMbX5`Hr+R`CU%lwZ$Jt(6j zWcJUTMzxI|GmZn_?GUR?^c*U)O8n3r&UGyMsWn4y;D zLKfjoB+5E-SOIg5m|Ap(Hl=olpDK;khtFPix=0!(IU!zmJ#!1!UPU#T@-Djz#J0!J zZn_#6M`QG+c$%8S{L$~%v~;}j4cm!$4dT@*FI7J0saks~Wg^2Q`WPm=*=$}Lx~`hr ztMR^X0_39;Clw8#et~3^@{@UH@N=3|YDn6=)EXuA&t+Q8XozwM^2FPm{S8TYj6#_^c#N+oGhAcSj$`d zApLEUmS;=hax9Bv|C=-1EAxIk?Lv&kE{q9#q5|lFdJo=o|$c<5@_gxq*5`m-l zT~t!2HVkq%Jk>ncfF^_*6cRoJxbYX7H%y)zd9c;V=~%?4hr8LiStRE^Xjhg67@kgn z`5ms19G&kd7>oH{$Sv#RUdUobeQp%A98|P8rdzqp=V|c>sg$7nTF#Y+%<8`KERb^} zr-a#;_Zu<`ulBh^Mz5TP>0qHWfm&=w+?EV~-QK-3Q-=K+xclaNDS5P&CeF1MNKPcR zB8JC;7#>!l;)>TUVtvkKVq;!p?3F+rg}9-C9r!Vk;BG=LRCsk9nNYiN&!lzcX=If; zR&!-SjkI=E>uGm`}+cQbzr`T6~w{8gB13#e$ofdCg-VO{pM*!H-;8_Xs7utwaahraMLf zzsBOl*qi|iee&hj3+FGmLqriMvP?4GZuco<_qshI=q|yEV+QvhZf+LNFbWA|OouQh zuN{S|ZM7TO$(5*fjL&6$kP*E3gjRP%biOMxH`^$n|Kbzm)zXPS_NR$6WVDm0Jn= zpD&Fc{w$Ud53V`CaX9|c+e_l*Yv%?M3_mZ9_afz3*}3`tl95pMbuEea6)8orBS9>A zj!U6B_hcaK{x&!HuyVF2n3IWF!tDTi@Y2Yj6P;;2=1-yU8~jDx?W8^u6dSl~*&`*k zUUaoLgbplnYP>Qc7b@eKPPehkU!@~+wV)W!=V zW|ya9Is&=_p~j)j`|e${2k(U>@2^Td>D>Q+%K!gL$`|>a^1W3xw3Dm)wpQ39264yu zW^(DAwKJo|X#K*kye;^UcSvUZ8)W&P#y0=mg#ou&cJ14i3N9z~e5t-}_fA(X--X$+ zgp!oBg$GrNLra#j)_#=*3W|gW^&(HV<3lzhppzYqEAxT<^PTO2O$9Ll7|oRYRI_ky z3?%0dEkWS+M~@tXiT=J6x3;C^=me6fp~c0(fEpo?uZ+I6sDXp;+_CS;?0LT*OHnBh zh#Rx@b-9?7hiA{8`}`QU0kMDS>6$rojx+8GMed-OGDO_!y1Kg6g!=7U54FET8N%&W z@C5{UY^USzzvMYT^s(^V`#FrY0<(&nWqPib3+kCPh@`f&V!8-o5g`?n`Wu;$fT!Xl z?{II3)rai!*}r`=q)$K=0`7iwuQ*N(?{)=D@n zTvL?`Lsc*T$j;KCL#&i#jHSNe6Ry8|wgCY*e1bmEt=?G`^|C>K2+s=9@}UY#9&tk8 z=rw&nFn{BZ$sC!m0K&GOTXgCgsk^j=~1~=p4X$Uz<_6-p?Rwnfv;>=!3igf zQ`bfp=s4n!g})E1`Nir15d;a65Cje*)?$tm#FM+SSo3CH=WB$N%8$Ar-;nG@prCVz zxAU=MDV}fUv;frOcDA_s(coQzId(~qVFh;JpA}0HzkFo*=TOZdjbsaZ&FoErP)aB$ zeerjqrF35pVmeLp!1BmGxSQ~i`G`p#INigYdAZ?O5)^ozo#i-a_y(cpfrqAr4Lod^ zON6n;BUhRkR9^&1vuFV-FbwUf_QeXBGIWBqbh}Kej1TZj3GD z7epwd^|nrJgzrE7Y@a{f%R>JUm9X{I{4C@3nTdZD*Hb+j=VX9|TyE{S~)nSIUY$=L!_G#>)S<^UKA7%G5@@b!Ic ztZHy~2q#1*08j<({{f&Lw_WQrwIM_hyu;fRkW^OI#lNsqlvi6((2cxQ>;7>HDoOFL zXnQ;7NWsDQBaQ#yoM00gyB3AP=9A9<22-7pYyZ12cz@N9z{xpHtE^?!M9)8wSLrWU zvvMTp+(L4{>p|$X_d;1Y09SvAmQn?T%(bHyq8wDQ;qCtsP&^@MdV5h@{IAax^56lR z!qwND;Cz1ZSJK6qo|3 z0DHVb!;m{ILNXPCy$H1MKoD)kht~2+cxC))8P>Fn9xi^sI=u8_jAzDnap3IY;u6eM zs!tE8Ng+eYy(_v2J%^>acw>@wyib*tT}bIId2>Kf4MJG#&i`2h69!qrtIk^75SFWr z;vOo?xGI*H(Vf-hzt&^kxuwY3b{jU?wTNFx7Q!B2L!vLU#f!H*a$l;?nIHJzwPol28se!T>s z^Ks~USBg6i5mHw(3HYCqZi(La_F&_>83e^yC50KkuK^$&g!VI@$=#V{y(eQ4^c|o#YSFdfAeJWCqTKA@ zLcPDOB~&KGlZucB1YKO-tIBnCB3K~U>E;gd&~h5mA?NSE`j`E6?ZMNlMsS(zyl&9u zK@Z9gJN=vcW%GDdJ5|YNoR*|85I`OFnWJFu_C)dz=_HJA`%yZqFrL;P0ax~}UQM3O zxFip0z?HSP|s#Hko{UbA{-m{{ja$7KS{$q z+_vm{_?6$nD5`iu5p{es5}H3^5@IwqMKoiq?`_35dl0zAQsas$)&2>kS;WfQVo39X zz@Ej(=9nZ-r|sCbEeSv|VSD+`o*uT<{swE3W`zL)30q7L8K<8*r5_QoA!H5#?6d)} ztM2YLguDP>%gaF!?vu9s2HAeS`3q#bSdSAmD@PRo8-S7mv`z3pMfYF$+Lwg1q1}Y) zq6>eePdxLlMFv7mK`{cgyz2d7H?bohx(^ka zt|fKGjWCjjsT?_M8M+gYer1tO5_vmUjGq9W@$4rPAYVU(02?UWjz>T@0GR;YNERhU zBYiW#VBPyyDlJ&90*(L}RFXsdMMx6_0444L`T;P-=TsLo(xyYkxR>Xi{N%3b4p%Ny zfa;+d4HIXHTB>$IP>x+f0fs<7Jk`+W-s^Ot#O`6m!&AJqdZv&>h%0IVk&Bi>;K#P1 zjAR;>1Wdq}9eB96@2(F`k9Tf>{`V@<*VM(JtN~3#BE;^Xn)=HRdXUN-*b^7l;maot zkFQw8Dz=xI!LE}85f}rv}b-PK!SR%qwR$Ufm^cOtu7`ZW3bKY6ehX zunsrq$0bp)PJvTPcPfdd{(|_Yf_ex9*5VW~09+E323FYu>LS-pf8xjtFIJSgHg53C z24U}zJ%x3Eh6wpQ#Opl^N3Q9APF+g|sBs{2{b5YNR}YwiutnJ^a!pXY3QH8AOdqTy z|91D(?{$vCi{6hA1QOtusoniySVmCT5P?s6*wtbr#OUT=^Kr4DaJj%^p+#0M&=+a#HU*tL+2WGp-hMU zP=28-P-0v-gb)a)k#yQ;5EAoV?pfI5=kSy|KrDUYjnDOINQ~T+`MHxPe4$tPZsPgZ zYi#G|9s^h!kMMhW^t)C$#7BUFz()jT73^Oee4*1>Y8+F{knEaCn{g#JEj)+Y`Ir9? zC{dOc#Q#oQv2rYuuo|?nPx^Dszo@`(APs~I=?+e|0>ScH%WayTb=*P#;}ppZpCXQK zddlkpj`GPpY<7Dd_C`oC+VULwm|T1csVXefknbSLMS<=Ip+_b=)@KgepByS&t~((u zVbSEBVs}^61nftU_g@p&lbX0kEl4w&>VRObh=r7lJ0Wy!pN@D~p!k(qf!=4)oNHUI zOz{a2dUt?V9$M`fs_kEr0gi%vq?FTBD*a1+M5%P;%!0zg;&WN^2gU?K=DJ`*jCS$IhA|*)@MZQroWm5w2u%pmkI(B|A( z9l??{wFoGo)#3iTL?Hi+Om=`lnAG3=vJSK-AUHyG?3nQ|p9;!L`KJ;Ap7?)83v%wn z8-;epxYX8%8 zu@MO$zY>s-grSOEbsH`@EPcitYwPKG^-4YDg#;^cK1F#+6mx~+4$!CZ7r%1mUrYw> zDI$UkwLka&rX`ZMfr&dIY|~uhb@;fEku7*Q{P8jS4Vih`17)<6*qD6c>YK-Hxolzi zY^+4)X&b*;4$)|xf%SJCm+W9!XIeP%{ncgm5Rsw@cHaI#%2CDjVw7S2Vlae!^Uo|01}WU%MOEvh=!ug#oaI-v*_-KcwHb z`{i$X`q;?%BIFG$y{xP?)m!k07%5gW1jof%gIN;|rjIng@)4*M?lsXQ4pFGw?rwnm zwx7ie!y($d1#fo|g$9HDDbJcp+=5SsDQskMMeq^-H5QErDr{6k{P(ifKowOn!I7D) z98!1@H6gwxx)7j=zO8uNIg~FKObnvMxxTXI?^67G^OXR_PqSEYC|sxo0S6%02Owr9 z2;UP}GAXi-z{QG`x1R)(Yi@3CfE>JVe}BNR81UXbc0v985zreoHU-x55ByQ7RE~^m z_t?x^K)Ra{;K2v3oBrh1-mG}j!VNMgOpYXpR%UjRuH~tebYS6IkR6Gf59^1<5(e{9VF!G+A`RdSwBJ3O@c##}wOZv%t5y&P4njkt~ zD{i2wY@uX%>Qg78>VZrQnad(Po*U>Bu^)CH5GDdcd?}b;=d#+k{`$w>=}0-6#?eNz-v{ zZXKf?rO%rJa}EA2?YR8x7q&}#>U4S{+}G){Z)Pu8cIZ_@=bX)+b^w~!D(4s0(DKw$Vz}$0lMP79J!5G5~<*}_Glglgbqf& zH$VM(!AprQV~YT6EkClAa_C?%2u@bJL4KC!-kdEnIu17+nwHc@;idm;Y#Def) z2#+({T$S==<}{=;NK5uHvJ4Y%_e`c@vuWZlgD9Ddc3#P;upx&q7pM>K$qvzaTCAtN z%-T13LScj`5ulGR9TV8Y(#s8wi9J#wTS@)Qo^mIt-}RBAO}-6iVXk*lR(56rQHP{h zP_Wz@G1I<_8k*NLN2-Hswg%?T*eAdpO~$g&XPgim6KOQ1b5x-!Jpp-?R!pJ|kD_?c z{$Ze4LP`?=LwD@ikpyI+&OWrwRO%E0`TkhEmxfT%Jz@R=8VFzl5|t^yc{w+6Nk(-R z&kWlg%Yp5Lt-RB^+!TP$1?~$NWqtYM73)f+jS$}gj(Og@(+Bi4NqQljLnVbE>>@Tl ziviWj)9o@&COOF*UL0vRCJW&@VcMbGYlQW9J%>XTCTL>{}gDFraJ=717d`2H> z0~N~q6BUvptxuvntp=&fCtOy1EWwu$oESm7k>~cbdkPXC4Ds7>F5YpKyA#Y$A5@@F z<&FscYHwLt{Sdm+$fB?Dp?mWKDyKfq?Csu)-@G1Tk-#=QXn3ljpI%$uH}r~Dji4S- z-~f{zzA*Zy3hUC2O*!}~6f0fv2i$NTz5{y(qSu=vX73c(JOJY!>?oZWd24z1F^kB? z>p)oo-eb@lH3Dtzq4-0H_zdvY;}Z?NwK=>Hc(R-FlYeR`UtslU?8QN$q6O^l>m}Ay z*ls{PsL*|cdHx}Cf$Phd=mnb0xF@M{esDnq_scDd5*FYY3{de*$wk^wnK1EF@&&|B zfhKt1h@cHCi<5B%ERxjM8+4Zava;%ScYByXsooZZzu%_xsp~{4l(DA0B|$$sW|#ug z&wP~l(S3DBa0A(!w3Ze{X1#l0j>B4(>FW^l6ArCv&5$;O=9hhL+qUfj`|wYjS#LvN zD?5@;Z|6pIdfV~E5yJvf6@@M1pmUO(9^^tZWIN?0~XA!G;VgJ0t&aLfgUKre2eWv5Ha1Ck6(Po ziqRFLv@Rh~qis;KNrJM}9O857T)CjpOj{W+8Nlh&B77%I-b@Xp0S|$zv#J{?1N|hi zvShCTOB2LtunO6j1|T?cfN&g?OEN5sp!E3%!ah{Kw|JH_5&9YW7N?`5wF|KALzCN% zvh?l;p9K4c(lps@#7cJZ)xlQY{EVx~?jb=U@x^e+XWXAkJ3e{!Mj>VPH@|j`8w=~fZEO1;}3(9UuR*zqk?IhY_or?Z`O`|wbReWrBUft5EgAmzVNb0iyqNs{UWJ0I2{Jpk`T?s4FcVgp zr_W>=0_D#uKT|3hyl^45|JV73X_>38cVsf4X=@nx@v+{VbF^gtw85=J!_~GjGxR*< z_syJ{W9TwdZ>`Lei-NjH58QD(i*x-3vB&-I(hZ?+BCYtPsjRL&5?o9R`FA#^UN$K= zXk@r;PC^zG5Kr*F6wNV%^#Ll?j+&uqod$dPO9q^&yxsHUKyK)5X!!M(N3Wv0Um;E_ehQOf2Xd5gI6Ntm7fb=P*E-QDRFbN@Ahw$9R7FJS!h|Px^hq^>Xaj zsq&K_`lSlUcloZZ&wPIvia&L`v-<#1zR`y<3ZXx+H`|3bbqwTsNHAe11@hX@&`Zgd&>N%J@vL!GA=mZf+b7!YeN#C?w z9l?+uXmUpR3^I2_6muci<=tq(Qnvd<)qT?2p9hh6>N2#eEvIi|e-U4!42aZF{N?-DrvvHe`zrxX6pZpYmbTYp zbTQ<2CG4a5v=y`P;K0Q|kQuJl$M)+HneM%n7bW85wYIIGg7nHbtI)ssec3Jf<^g6t zJ2aqm6A386rHNgehx`y05p>##-JgZ(zBrr%B~fs9;O}C*(wx=fCC_$*%>^ye_nbh( z`B0Pk^CaG>Ql~GL%VCNR{h@=R`{X z@kmt4Nu+KsIa*P3?RTBdA?l0F<#0vvy5Dul|5U>OolJ?!gh9Bx;>FN6|4X~Wk$L5C z1zvWgZp8*#Hem2j6{g=}N0Phh=u@-OKl``fMPpVv-U8n+E5TZ`uoW-LTP0GpUKFJm z{<~4_yC)3t!!HfLTUcsPO*;s&eiGJ1&miMouq^)jwe@#Lpf8Wp2=NDHV!|zoMC9K- zdX0A$XqbPDRJJm23b3Fdcq$NT4Xw{T_X1LqxE0?OfjT$f(H#vK`#$j8w7Tr#-$#8g=Mf@o z7@K|%v$PY?Y6D)YXQm5goa@(Pp(&0Mi5(pupX2`fR4KjBSrS%ylbcqSbEp2+k(XWh z`>@O38d&mvbD3e~?}x_5`fly?+V%HEnAjb+Nff{a?wKE)QrrK2hr$niY^gbwfrT$W zod5fnUK4YuhG1Vr!U~{zLJwSN{(WghK_V_Ps7(or&*C>E0Bp#mezf?%n+p1{1k701zM7!_+mlK zwYt0v9JQ)Hplf&B7IH`Jg0MMg&%E3C0RiX@7Og8Nh4ukZ&sNnqD#NLw!PmUC&KL3~ zl5&xT5@B4Sdt(oZt)56?6MASC;*;*Gbi0mBt#XG}tlVU**k#N$*Q4{>qp+UQK0`!H zn6X>h(|)-%JD@fN$kpYBg|UEOb)><~8!cAYjZ~I^v!9SYVnJDA4%uiUbZ#YoI2@Ol z3>Ba0dh(b>5~MZ&;J;M$FFTzVmvb)u6zO3;Xmgb_})JVGvrQ$ey(s*5t0-DpsxsuP=R#K1R`xVKpCSl7uQzr#u66+ z6ac*WO?zGATJnix%k7Zz8$l6Eh58wK2_(%!-J$r?qEWo!Bw$9VmCI5Rk)Ta z>5}r(#Ju?4$)wgn0EDLo4%eZ@yzI0c zL}RA+>7Ejx0M^*^9SZ1a!yKuyhYa4XXK>`D@xWu{yCO|crjwx2*i5SzZ4eMi<&wv9ZU_!~J`PaZ}hQ1VzA*_wU z#EjdHZMz=Vb~;YNfssk)W`3k;&&mkD0qz30d@?AN27fxUuU)q`xw^qNj2y&RX91!! zL_v%kQGwyEx$&VZ>n93hkp{G3c64JVkQ~Tyk3Ur$sM?_VG=(Qc;1G<*XCtI0{XTFj z+%N23wciUMJg0CzK+aPY(>ofybF}Sx`^~IwX*%z%5)+Sr-0hU{Hj%`m>N)cvi$54VvXXaWegP=OOQ zWp7CqF-x{hq!;~kih`q2=6Iur*PMAzPUtWGU(%4XtRo=&MdHaHxJz=_hJ1Rv2tY;q zOPw$-l{0G8VL#X~_U$x}BbYL%)B6!)%3|vr(vBJ;?tH@E0_;(0yy7mt1a? zl9z^HFFP9LbruXq&;~o6b{|Oia5n)IAN9a~9*2~KD9c4>e-)3olpP=0bbnWHPEyS@ z!n=Y?thyimxBH>5)NDD?(Sm z*%yRb1Pk9efenMZAcA-hd>;V5VZ+M%dhj|p_UaB)H6jde=qn@C7!pGC@1ylQnN)NT zC*m|9rG&1Cw+skgGw9?KBPME5Jb=?`gz-K4bHEaWdw@GcSZ?IB>*;x zDqaJnq(WCO#igxoh`n6~tTY^@=ruA`VmR87|ffCo%*m9*=(oRpa0p5Y&2#hCyQrLkro_#5b!_I{c`&dUM5$`dj75XB?!kqOyu zuzD;HQLE0j75J_df=sQdS@IA#NH`PrOutyN?QUMr^c-bEzzNeB>C1#DLu^TU)Q}gt z7oXOaR}ZKM*01zb&#g)V(mcw&U)M7Ggn}T~DW>+3ZyZ0xPG-;s`mV0Bq4}vzzhO!4 zI0=IbQk*%2x?>Rd21`cR4_B1Uy58c(5S{?8iBQ~ddN6UKAC9PfE)r2f?|)u`5(ITV z!e`9gaz-F$AY4y~3z)z#4_H$Hih%&M2038@2j5m}hpl)q!#Dk%w;2e^hb$Px5rk|0 z0AeQi6#?)-P>O~8c*FQcrIY=vc~rxX{h-T7o4pvh)}CcHuh4I&2gmNc=G71mAZ4ta zYW1>o;lAI%pemp#NdJy_9aJ400Sa{2LVkn zklBvIx1=SFpYJL;3Yal+NN@PUa~DR(rp&7S0jV_@RtRwRe4S~V%|yiBca9d=z5-lS z{F(wBpFz%v*u~5zXVt|xd<2x9QZKS}(U^PPhA5GbJkPt6KJF&{K4UWc$bhNNR+H-6 zH`*rymNL&j*^CYjuAKc=+zbT>R2G1}y)REFS8U6CdFi?dWE(ha(Bmr(F7NcF7I6Q^ zl=H}`C?q$T_8A!P=RhQjc`K9Nf9(^(RIKtwM+l6T$xjz|4$j#aI>lBOkN&7d1pvr^ zunQ1==xzMaXdiaejc7!thmLm?Ox(wV&dDm*Kax@mHdU!BDN^zPUqc3u`IYel(O@A# z!c0++8y|j8!iU=pG=TSHR;GzpAO>BKdSFlNDk5KngNiB2YHUa^o`s-{fcExJcLdym zLz{MWSBu$dVtii%?~)A0fUH**`5BlC5z-2H9Dlo`xd=FDvQ~KMixgR zvj9=wo1*yC{;F=XP~$(O)JuX!2p$T@CJ+-xJP8hj!6^!po@L|&52SvmVt`{uj)V2o zU;CBLvH<5s0s|I#)G-kP6Jo;v4{{)fz>tH-5W&I&9RuDFU;J7t8yl#{b%_xz3F(KdFr1-^5<4orbp$4uE;6(_~nM5ec0ji_9*KW z!Q)8}&*qPB($HTQp?21_Bs^c^Xic>73+s5tQ1Du!d=(osPhmsys7 zPRzXea^swf{jSlaqvj=b=TB_kQZ8bk*Syxg5mh~RjK?>s=1f|ta7kck7RF(NM4Qi= zHB+y5_nEw|QwTcB1;@-BJ6mE4Y~`hb>ZL71gssbW^zetPzMF7tX=%Om!|&VR`tuhr zR3zTtd`#~y$~vIEjZMgPZ?8yP=&vi{IfRCFik+vOi(MUTT&%@2=vtHrBUZ7Q(!(JgVEerXwBN?x7bkSTZ~j^cua-VCo=4lmt>-f3{PQ_7H!x~n zeR!omeGiW6y?$MF;K%S*xG7Z620FU0+rmk2qECkB{nBl;zOmg!sn5|&mbqrS0=9(m z{J80K$33nTm-fAZda@N>JDe{?PQv?(Y>Qb#Uuv0SuW!|Fd*e%zO5bUYwy?5%JX>|> z^+@=+{EU3*M(kwjmL|z2EgfAoARay3rjt<%ubM1c@uN5U-hBJ`T*LYr%Q<%Zm+NQt z$c^Xw&NW8VJi*F{KX-ja9G{3vv%m6#Pb8xuH22FpHfdQI$w8G2QpnxG?3A(7U3ao~ zpY%G(6geO&5jRDELm5kwnx`9zQr@Y&mfPy6Y8;0eYD~NnZ8!gT4Sf^6fH@`rGrmEe z)3y0f%Bm}<+Zq}8_0`MFp)Uq7^0(z4dHGpIzMDtBYACOhXnW6+TokQS?#nXQ-Kp7H zZL&|%*J79>G@M(2UR1@>X@R2ye}T5Hj0I^iOs>(GY}EhwdAd)5zmG+^3%CI=gIr+<`Yv8GO{UzUDvKAVGreY#*M z#pj+gwLvu3N?1-^%BMqXk%6%8>jUF%ouAO11s?|$Ef$s2oX+XXR+v?$tGQcnaK`OA(B~k@dX{;}i)>TM z__nleI;G^wi1Ir5l8!7eUXKF|fAzb2-li?=b>hFKzB}$@HX(OyOZeH1Epjb~M}FNo zzWj(|;!fT6$o=Ian;cZxAJ2v!@}o^{6SSPl(th;y(c1v(=DQc9z6^|9HZY! zv9PGv(Z5Fgw!DZ2VwDdUuisD=b$hq(w)yR^;6p-bLKKA+ZXl5_?LVV%eQC<}yL^oX z{NDnv33uCA_2Sd^6@TshdJz+sy0yV$#Pf~kAv*uq#Ut9%jGyYRpqchR(aXLcr5rizuCgtv`(mV*jzzW%g(M z=1+`M_TvGm-6aMOiag$CleLroX>`W4Ez4=&?q?3-k2VcJl!QRPCL`T0J4=>}OSIE3 zbC4zBlUeLzU#ib*hz@UZnp+b{IX}F8C^u~fIxJYsrn7gL@uptC9d!vl?4jSn%BXvP z_}uEUiIN;7bnI_``FZyh41eLi`rT~h*#(p7mrtKxl~#y`m}t{!`*mX~|D zrE`g!g}y?G6`D?{yLTSizdIOkWKCuSS*Z}i}&~8tt~Pwmlym!3_CV~>nv0>{t$S3-f4Y*Tbdx; zOw9Z3Dd+F@nzd4`-gMe7Hh(2u1r*tyyko`a$cA%g`8SKY%sYd{zRE8afvw|z`Gx*Y zc+J#?E*6gsijJbzijbt-37x94^5sO(7qWq`pVN?aj3x}@j#!@UA6%Bh4(4U zi=k5eJDg{KdT->x?8uwW;~3n1q|DYFj_8H9W@bHqk+nhd(I>Of8mvI1&=r%~{byj` zE!r)dD!#BBGOO*By&Cc`HZw2lVoGt!teFLDmG7O}t>(%=FY2m!+Oi5A^HPA1`td>t0zrR=~vJmxz8M4<(WRM3x zpSQJ~RwAcB&L0+DEV8>HY| zj8LGW6@d_<<)J`G6aqy-P$7{(5*`(*Adf;`0^x3*=|6CPyz7U3X3d^6>s$N#_S)yn z+QrAeM~a@htp$B=k{!ZZn(DY^(MFgiP3u7v7u^0qKh%K&IrO_8p+qKYB4r z;f(MuVDbkA<|EC$qq1<6SF6^QvGvc9vJ>V*&L6v-b^91$W)Xw0gNJ$>e#*?wc_dY$ z);Fnpcv;V)%?-b`St3708O4Xk>-4L6&Pl^Cuv0x-Z@1m4N>M2Z8j~Z5KT*_8*<1#T zfDK3t5V{{cc?IiV9$cMPg|No^xP{!nqgwIvk5BPpWrKQNVU5Bh11LbKQk~ z>fy@vgIaTIlpSU?NENFpc70X8SoTB%`t!Y$`E#{zTI-Jr&Ro2|=er(@h0F|aL?0WL z7oRjRlFR3#&g%N2P9J$&hZC3H;H=FO_=4K`6*Wb-o+CHK17ODo?v_rXX;&7ym0F-_{gyD^)@YX178p+*&BBXIjbJ=| zG^^y zP-!||9JUS4UBZdOoZ)B~&jE1Yd=-I9^z3 z5tA26tAh422Lg3<`sG8M3*|DAxJ#GfQ~Z%{anhbImE&p0_6ZNR^S}1+|8`+=_~^GX zybGmspy#t?;yDbFSsAsWCy||O!Qxq{&mY)j?|UGH=-kDtC{Tol&?J*76Cebg9`}o{ z0-Ls8XLRyRR}y={C0Txs4V|8xWBK3xBvV~SkLemT_bJY_Q3#g?Dw8>0mAQ9fV_3+d zXoK2sx4gyuVCaTYrxGcy?$>JbcYUN;$zlsP8)h0(Bn%Q%I^6d6Un3d&MG;d>gFe}e zS6@FkJnEmwGFHFgYqjA`$FcUlkDjqB(M&2b@X33=B^LDGz@J#x`spI&%x792yRFQ{ zRU44^W46)BxA{NZ3EnBZ%P{B;FO|wn1e;Q>{JYpby>X3sbHLFqZUjvu-{RVe9w7d6 zC`(+?v7>)~V6`Y_hgh=^%6=I25KY|I-mSWh+>2te)4n*LF&A&l-90wxzRT@hyIoaD z0o0qEA0~7?#OXJkRbenhDvKB2tCKlDNR8a6h4{VHBjwG6PE`dxe`aHe;H4ZMMC64-(}o)^ zjajrodRJqX?(5R8u6yL=)<(al@Qh30xNf2!UMc%r7^a^{iw;YGmb4R5aZT3p9@(Nw z-X>^l6!UejCLhSGVBX|g765?*UGexRNMmcEfv43+Rw!BazM-z#mW03rsK$2SR8>N_ z%be;i{42`jji8#vDfep^BduuUp1 zPhfXmTGE7XH~0Frh5Ho9fg%CJH%!1V(0#xb%f8e^JH!1`yF;9==Pg2o+k8J&7X0h0 zG$uH;)q~zZ9o({(PGv%!gaM#l-}xTz{PWlQ&n3^%7-t$upiwa~G0#DgNJ(pp^fgt+ zbT2jh8e~;1`MfbP@rql5eEe191rK5GKcWA(@)NTCLjk+7V1bb9u4Ev41wT5FEO/UY5Nsug/tojh5OMB5Wcg242gjW15ZzqW//pC2KIuiLNONblnIKFqbIimJ83H4zQyHvUK3q7evabh5+p4sRHwF/cXbFbq7ghBgCK/UH3/xfihhNC9YptEir3QseIh+CrNwFy3E1ijKkiTOoo1ZOE/WazHPjLIwTZNXs9pjEps33YRLYRU8zMNYl3rkWP7faJE95eWABscLf4ho+ZTfnEN2uDAL58/LNNmt8zteQfS4/xwur0Ldl38o2D6Fi+S1VIR+v0K3aZJkh2+rt1sRq8HV43Zod3/iavE+qVhnLg2e337+ZyZW3+/+eZgl3/4HZ28/H65xgA/9vITxTugXobHs8eYxkR3L587e89Gi/+wSfeF6uxflF1kBsM3b8aL8tlT//thtNkK1/y0T2+w3+UWsX6I0Wa/Evttn8b7Vd5IPfbjZoWk+XsV94etTlImHTThXv18lEGWlp2wVy19Aft0LQajX9NXTRXF8m8RJum+rZALnc1m+zdLkWZSuLOiMEiqvvIg0iyQmvsTRci2vzZIsS1b5i+aQBSz/fR+uoliB/Q8RvwjVrnjisixy8aiuxVupKJfNV5GsRJa+yyr5VQroocm7RmCOs9cjKjHIsfRUAiSmecMwnwvLou8jGuSXHBAXgQN1Do5Nmix28yxK1sNBZEEEX+A6iHA4Q3Q0EMHYPwsRQLkNEfkenUEEtgORPTYqKPkaJ7Mw7hMIoeCPtbqCzrmYPY4FCAicVxU+6BMHiNetI/eWdEqS2CTROts/B7m5IneyJMzHdC5HRsiBv4lW++XbGFt4LL+LVkt5kziayb/Dn7tUqHsuxVqkCjb395INiPSvmzhcP3vbl6UhfvUIcTgT8Y9kGyn9U76xlvK3SoVVtFioV7FgUFzYd3lTUIMShO7921uqQJcKhX1NNkBRUrAMVRTusuQwRfZAbQM0yPcoBpAY2NEqpQQdxj3ObPAwvzPsEAs7y/3U/yvcbMCEofFgiDAPUeIXn4oeImMAE61RRBUEyQFI3+/e8nE5/Hov//oh0kg+j5LjoXAhrYa8fZJmT8kyWYfx78fS04O7TXbpXLiozixMlyJzmSjqcVzEVQxzLqBr3jDseS8/1JQqSTwwu8Co0sXhqfNWR+F9SdPwvVQtn6kn74OY7/nSeDS1U0DKfTo2AshvbBVQj/v+SRB/sLXxxPLLYSCOgC6k9BGMcweMdwpZ4ghZrKlKj5CFFZpMg24g24wE6Ddj90xr3IxCwj0UlD681dZ9YFgL5TNgGPaOYcRMPFAOrv5tGJa60oPl5rDd5r2gWFOoOur6pwXoiboORl2hjzx6Gi6j4K61zpRedaIzFQ06X9dHzCAlC/Z8VLKDULvNe9Fctm9XzdnJ3v5ESksROTwCtVXn++tTbWll5KC20NjU1hllcI6CnWveDwty8bl0CgDkCABMXLn8BS4SQDxOOCO1EmA6kHyGubcnjKGdAxcIg7YujP18KNu2hjAQxFph6i4P72OJw+5Yx050V5T0LNfAkusxeDot2uNZtDFHpmFaIZcjsDSw3633xWEhDj66EJPTY3OS65uC8CtduKoCHGCP+YRziAgMMKhYkthNMfyCfWPe54yVQSBuqt8NFSjCziVgTUG8T6WfxmFUYG3qDEdjAlca41/oC0GMVXRZ20YFAdJuRBW5nrEkatv0YT5gf2D7sRCgA2N1tR/dlyVO4YjMB+wPbMtdIgzWujAC0oYwLp6u0LwPImeWdhI01e9qmg5tWDp7p7Hviow+vdPGHc6xN8ppU/2ORIxs9vYs3m32VuxlV5RkEW6fih2VJV5nbqJcJ2th77jEOCBdMTCLRSa7LI7W8ol0LoF6YPkqG/VWq7elynDwXoQIVx5cePJJhUUUFQEtU7n9pyVaZgKknoYh6tXs7yW+Lm2fh+ngtwkJO7Q5QaJ9SADQHGAfCURILUQmrdELRDj1YNn/bxr9iAbjgIgdbZwg0tfCQonHPwFEbMNjWmh6ggik+yjiOHHBJlwMhQuCoeUTUltmxoALWhfCOOSIzY7ZYZelomFQl63oed7J7LOieHYyI02OdWai0ELBSbzUZbOZKWwtSJk1s8xaPaCtlbK0YWfOYJ1UPsn6wzPalzO6QgDYCAR8OtN4EvBlS7n2yhXSZeaGiLpc0RpRY6+ztHJq5/tNwv416w8Xy672EzJ7d0G/U5nZ6/J+Y+m0G35EMWB0nN/jCvsy2wNt4abT8JN+tfNBBuaajXnBFhVoCqXYzNdX9I/VEa2RDn/7oVgGaVP0j/UcimW1TrPJ8u3D8kUcj9Yjwk6f2TTxp8ukjE32NEKyzGyyPHnO+1ICAKvgyjiVwOA5F877dPSa7rwbg1d2YzTRzfqVHBLl0MbHDPfKvrbqKRbOWQBn+q0+aUsbhCCupvU07x5BhDbV72j3SO0ZUNO69CtOHG556aBmn4MZ9kGd26YysntL330AioM9w5nuwW8cGAqZh0uxzPMHECFOPUDsJb1yLprHyst+Q27BB3c128EsdTymNY6Ta6Qt18gZLLu72iTwODxqfmohrXdfSTtHqJjK61jnW5Js8kH+W2TZew4sNeCm7nQnYM2ycNgazFwph++aXpSKOMyil3KlTua9nbw3pcV85nlf5JDVH6U0pFrQ+WhtWwYfnr3OCTUEO87eXEbXFPoNtOC64AXuBgSWtIHQo9gDk41R2LNjFnSUI9OjUPngQiVSqJRQRlAAKfOBabxR0LN/F9iEejo16nMsCrT5MKkxrgod+Yv643TANd6mFYg6C6KsQHxz7b62vEAfz7tsXDSCM8dC+ci9dUcuHGirpOlUqM+ilHDzYVEgGJ1SgiNVSlrVnFdK8FKlhBloVkp6CC4IW1NmKA6T1pBq0uoJX/dpXdc68YEdZZJ+VOzQWezkUrG3T2Yph55cIwIIIAl4JUBA9SFMfXFZ1IovalCRXngiTQciZQH1WOl8fTisTIltc06h518LPX94jXdfxAfI0Jm2KIwGJ/oqZGZaqKmckM7qHhY3Ng2Y9rcNixtGawOho9Y+dmhlQtGwKII+NnbJBOZ5V+PQPrRup/m0W6U9FCClS0ogqGxJgmd1Sc8paHVG6YSHNp3mzVoB1+UV94wBey2ZMNAqBnzaxEsBHHqTG7M3aE3Za5/EAQ4594LSVo3L2Wv/6W4j9YQy56icPhZ9QLcZAr6HynKvnqZIvG7+9yyEKpn0AJS7syN8lf9prVK/o5geq1vUPhfGLkwg6MI1C4AHODqVGii57jgghjSF6RVi3Pb+Tzb4sDa4RL+HKtnEo7C7+WR3d2x3A9S4HCI+thxHzSGmAMJo1AdkgUfKaTOVLMhxqJK6U4NGwGzct4+wCw+q7oDZQGCmNDKTcIDqERTOqZLN/ULktoP64lTJ5l10+nVO8ifIL2jeFZ2aDkjq2FOASJOUiwWwfTeU/JkmSgRHwCj9/z1ZCFXj/w== \ No newline at end of file diff --git a/docs/Use_of_LDAP_as_backend_for_simpkv/simpkv Key_Value Tree.png b/docs/Use_of_LDAP_as_backend_for_simpkv/simpkv Key_Value Tree.png new file mode 100644 index 0000000000000000000000000000000000000000..d9b6f21a33154b67a1ddbd063856acb5dae7cd43 GIT binary patch literal 48496 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 at_j(3*dK2ixM4vC|4yGW(kalg!~6&Tj`g$v literal 0 HcmV?d00001 diff --git a/docs/Use_of_LDAP_as_backend_for_simpkv/simpkv retrieve operation.drawio b/docs/Use_of_LDAP_as_backend_for_simpkv/simpkv retrieve operation.drawio new file mode 100644 index 0000000..a3f6d57 --- /dev/null +++ b/docs/Use_of_LDAP_as_backend_for_simpkv/simpkv retrieve operation.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/docs/Use_of_LDAP_as_backend_for_simpkv/simpkv retrieve operation.png b/docs/Use_of_LDAP_as_backend_for_simpkv/simpkv retrieve operation.png new file mode 100644 index 0000000000000000000000000000000000000000..c13d4cd5255fce43b3a574dbc7eb7b9ad8de141d GIT binary patch literal 81411 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 }r?ucdMiowYX4;?n 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 z%0D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 \ No newline at end of file diff --git a/docs/Use_of_LDAP_as_backend_for_simpkv/simpkv store operation.png b/docs/Use_of_LDAP_as_backend_for_simpkv/simpkv store operation.png new file mode 100644 index 0000000000000000000000000000000000000000..8968b00f5384d86a1d5563c5b47b67d8c3e5d5c5 GIT binary patch literal 65790 zcmeFYhgXx^x;JV;1slYM9Rv{@kdTlBQA#QSl28*sifJT)6w(u_oggaq4%oYZB1J(^ z!3v691R={PMFk=vz1^9$_CDV^XMf}V1NV**!eqYlo#iRNr_6_Re+qHN)P+;WjT<+E znN9{hewigt$BlzP<@iv!P#wb;aK_oevH!H}oS{6iOl}9q**QBi z;^Q6JdI`#$x;Q{l!7#WT+{?xI1%*2zVd(IG z#xuAa(Z42iafE^iR?_(*wpb+tO-eBMfw@d6H=!}R5Y z)d?x#o2b2BmoUx!S;Ky;mFCvE(CpNx<=C5{pTQXgo`*@9vl~!;75$-`ruUJ*!X`ApyWtpe6i@CVK9Uv(h&xZ zVSHPziRb*&%@vEe0O9Bq*DNccCa?Br28~M~aoYB*0ks zV1I(MYYYj+V)+ZCWK0a08AI}R(WnArf&;Nwj4#m#baDL?V5lGhl%eL~Lq!Qvf`2%R z8smy5#Kmd|5;$C-mN9tnSdu>`)(@$ICy4!EbXfwQ9xr1CvIq%Ewj76`uthkwGXaW` zD#9hm7&$E7**OM@q9DNhq2MQ+j0qv25P<3gFS^EAtzimTp(r^#9HAlk$`x{%nk&NM z&~YLqQ>|ga;(>e-(C{EpK#ad2h>2!|`HDgUad;%#TM`}=k5;ptSuBnafplR=)iD%& z7!L*~valL_2v|#@L_2e06jZrN#u7P)hJ|8Whyh?eINC3e6HE-1VyGO9$Oi?4jQ}JQ zBTC?bUj&YVq@*d);bK=KWi<>|0*=QeU=mbbLNF-CE0&I?!JNs#B6y59ngP0ed_$08 zjZ%t4vx0=7C?7Er8|Xrap$D*~R1Pi(&SGMG#B>r-At%aIDpi~!Bpk`nNJtVqm>=+h zfb=4XrGy}4NIU|~7U3Ccyf<0k?L`sL5JE4%@Bj=#8sMLxUx+vagtBoY ztRGjzcft6RxO7!$0-vt|bK#-B;2V7WMKG68e}un3+?nO?9fSU-SH(iG#TsO=I+To8 zFug@#0RkoqoB^dmF^B}3FOXdf7e(X2MTQ{QG5a)M?)ZeXbF-SELDaHh>Z`UDNqcK8q0L{5(@$( zJamjNA0M9JLx@u;RT_;tj2DiK3G(NH1t_F2I#wp;DllwukR+UHq&J2h7)}lgjG@Yv zz9==6>xERP*c_-BJi<{~JcM_sUx*6mXpEnj7f1B0eD8c|TR~iRrhx+26^k6cB#&-1~A!KqDmIq~$SP2XsB}fd5=aParOmv(q zR;W?Csu(_0hPM}#LJDSr8GTp@6qP#0g@W-$2T1*WgnWr_sMy5?s|xo*yF&eGU<@G^ zYyzhQw8XH1@=^p)zL(P1U!;onLCXL&34S;t_+|qT!}!Gn1wdu2KyMWdI$^3{x1)hP#Bq$VMK82!n{>8kq{rgW-_4{sLFfsW8sx zAISITCkW9;c>WCT1!5dxQbA*kLw0D!&;K|CecD?zS+li{)WP$-^l zR8|*xAm1A&a~At}@nU1+!V^?XFPsEL5{EFkVT5oRDg=li1_l@i^nw>B=Evjw!h8^7 zu2;O$MdFNO5<)}aK0ah36$p=zCLvH^p#+Vyw>MuQk_E{{3ZpVBR0NneRE-N3iV(7Z zpkQo52%1Ro#`(awG*>x8Nb!R*$s|P_SP3mDV(bIm-_G#ey|{=pCZ_g zE@5!Ee0gXL*N>zzZYz`_OdtxG1mhYMMTi(46kybCsK!-*NeB(n!~~!;J~Sx8l^sAN zq9_8FcoYiiOrzlvT-6FGROufgWXo9zP>w{2^y1LNIdFx;qf6PUq7D62g(wJ zF=O~LelS8pR6Go^A2 z0j6Y&yj|mkY2;4Je3p_K*YeYUcmu8b{JO>=8UBqZCN}L&F14ZM5ILG zEi@h?Scu?>6W|H#P=b^ekHH7SToVY`;D7`dA&=)B&yA6zusoR>OHp8gLYP8l3=;sZ z4?M`Gek>^lDu%`|fE~f$frmg4YkGx!5JT`pnHWo$H}m+J{*@YA|qU+jPoH$LIVV7D3eD=Cs2hhVL~(~G)AEoy0}WQ z0dj-}2AiH)=ae zt&x!eW#lk#OsqmqC#Z;VF>IU{pNBy}aS9{TNV+pRYvZhX^C#{X=O?RTvi@N>(@v{Ygk*IHj6kjR1=k#0CY!g?_QVeCGhE z!rvE%Ab8UxVLmbxRLsFJh*(ufI7KQ$`thkeXCi{>8>$L43NIs=$MT~BGo2T@3VzHx|nY;3rO#ffJ?X;?pw zSQX^w7vxRz=LL(vBs88-NC*A{hR0*XhpON#8HMfY3nM0kNV&)m91G#i<_9rjT+zN1 z1~xbpuMVKZJM#h)m_(%y49a5#CCKp9z_^%rxdJ%N7$pngqG71~G0wcu1mN8gG-x=I zisCr~{$u=&K2L(0;|E7Fm7oc_e91_*A73NK61f3tmYfTGAU1e}iAVc!s5B8m5TjDZ zE8?-?48A0?w z04+f>5+&Hn7bA}sB7Dd!DjO|%khnm$ilRYE zV}%621QiAD6-2}+K-WKcdr#`Ftkgd$u}%n)A}ISMC1iWqV!PQ?mTySTc_ z?^?LMd1uv6RV@I=lFVFlj-d!GS6| zmcwyIIs2nsIU-pAO%B`>xeQ=B5uOmFazzv9EIbUy#L?ks;5eYfz!(K!$boPPl#UQ! zVF@%GGnfJok&BR`a6c~JH^HCE6G@fw1T>UDb;Xfg1JO)mOc*pUo=cYZ~~U>isHz~9B>rZz+m4X@E(B}hUaOdECiEke^*yksF;d&LF0T$axgv+DGuNwRX$!) zr3(V#!;YgXmGQxW!oYBDI7bzuh(Wjpi76zM2*-D35}5S(gg{Q95df6|*bpTK9xn|D zk>FzEoKY%A_4|ia9xS9aYVX=O7nAx3q`Q7 z0SF<5A4I3aoxKDh8sAVQAFQrmqG>dy(nlHV?}brvwn3cn6Jt$M1g!^Wg7)B}d@+)zAGT zXSp?DF(&TXyAL z=>Fw|ZQuTQFONoC7N6bZy;Z#svJLra;l@nN>GEY!X1jLrUw^5=g51EWN^*k*!nW;GfOWW(xa>ohT@=78sSem#D3^wuo%L12_U;Y3J z29ZrtMz_Pp3LhPNQoda+KB&u|JHg^|+I@zTOUuVgi)7!f{kW1DZd^ltY@AJb<;x3v zi_PGuOUF*YGKXjA@2&V8JaN3~?PK=?F3pz>=PZytJ>wuUxriM%!Gd=Lyb(6~ZYFr1 zbw9Jyxn)0DD4x`7e0DkWKI7o-1r_&?jkV?v{y4wF)N|Z~B{rM2hJA4UR1<4|_?C$} zXpG_Ri8UA2{r${3zG}^$1s-`5XPhy!*gVeUhy7-4UXH5^X556xW%)xstd!s0ogX3! zQ!a)5{*w4&mnvJ3dnz%ov#-1S*R!$i)5jG9G}*Hq6~bIit<|y0?4j#r`02?}4d>09 z$`bD0Y0IR{?`k^dk??$Nc}rYO^Ftk+m8t1`<$Nv0v;9t6ox-=gzPFe6KsP<+jI&AXw1MdUw-up{(Zib)IJC1mhV~ zNaG+>I%rt?Z}&`xCPW|XxgJAz&_|B9vi}w$SnAQ4Z;iX<5UfW(cEGTkBj3v;(@$D- zg|{a6c`S4(+_l4eBl~WKNf<6R#QkZY=(R!hx-V&$dMGiV`K<1K%(I9w{k4Kk%?peK zw#YZN)_H0|4YJ8bPo17l}v*1yrw@p*gr$&D8vXDoe(y%9K z5A$cbeO_s{(ceb@HZgFXyQH>Gml1AKhQwli*xk^RnHfw8l@0wy1zTpG+ow5-v z4^(#gc-6&&+s}?h;PZwP--!37V|2}5N1H~E4;SB?R+{wS+KV?X(Wtv_v1toRZK9eY z`^%k9E<%oM41O|+OWuXK)foAEt=>aqA3Et_U+;zmJHiY@UxK#%ir5hYm#7{^jz6P} z=-+u1mnR+^RuLA@$k%Woy1}Fa{t^{VIMe=~;M5)Vv)-qBOO~`Dx>gzL6o%2xuK_D7 zZpEugnl(MFh;N%a+%z9%UP}FaC1*y`^_mWMMuVpH$xCETdH0#i9wo^&9p9AmlTSIN zExG0$R}o4795AKOgM2>bhHfO6vu8#Ah_xZY)vz2c9%$VE{kaF9xFJ&*n7#PUerkk= zVrW~VAw%0QsTlpto4&8h_Iu*~55)%`@A8}GUNNfMtr@lIZk_bE3`i|Jt6DcdI%i~z z%>?R58Z1$d^*o5F7QQ~QeAd^tm+Ob@T8=c7!}auqKbF`Jwohryk{mx(t&zJPb=*p} z|M`3Gu7u<#^S1EMG{H`DIKMy2uYFoT za(B{al$48$VXIQNwyb$&*epGy>QPBX-uJxDAM6=ml-BZfsExQ%ouOpX+#3a2A&Kbq zroY5bFg7+a2(RhM8Km7ledzYF{qK~;l*p2|pQrau;4nwcXMOHU19-IAQ#3)_|M{tU z`~-`(4O_O2iE30H=&9Q_gsD{iU$>tseVdEf^l;kV#oD(eIgdI%|ELu#`urPzez)uI zPciSKb*R`|os=SY$LWy+o~JIyKk}^Ch#>b?e|yt@^hbLm`^Lw4(Grh>C5Jgj-xR)| z*A<@n88%_AxM-y!^~jvuyy367qK%i9z#x`pXB2hr{*LuI?ADMS@t>KL6Q}odU#J&n zd_oW^ZB`t>UHo+%*0bXrF6sE-*QPy-zUpnz`r+fZz3JQcj5NMUIo(`3g0YkebSvye zeK%I6Z`4-5Ep9aY-Y_=oouIF*jE=3DrfVGXSToM3^83=p*|?iKWbXiNYZGaE)f4jB zw+{2GcS^6{+%>nbzGO;jypYESc*+T;(LUO#IL zQ8k>rFv3jxX+LnB?RV6@Q1tyu%TM6GdU(P*WWSw8@ZF%S6 zn$BHUZ#QmKow0s4y57c}f2r6HeJ}1(M<&B2N*FzIQ(P70bnJ*jg;uMoJn_iTD~b)V zY3gtiDJn^l`MwRk4|U4DQ@iWXVY~gOhc0;z^`$j+PifiPF{ZL^bMaZ(OP%uR z`#{E2;1gJ*#^aJi>@onvp7-a^mQj-;E-OF3%rj)EAueIHRT-v@12>Wbc()cwv+YP( zKZi=-rAk*42D_rC_xSg0Pa==M9c3wsoOk`*a+4}IUxL5U`#B!cI0=>GP*ph zn$9)A;jy*#pFT~Ys1$Zg@4#1nZxpmK_c@qEFxFI9DR*?QS9x-~#Xm&SyQUJJ}y02ag z+V?l#-y)u0plV!co!cg}zgw=-KN>fbt?pZ|J_YrC?rvCdc=ng$&0jnBJ+?biaHooM z=wrfx&h*UcWA5$le-I5{t3pmR2390flTK~OeYL11v9Pufzx{pZJt~gg@W`R_e7bs| z5$Z^CYsBNriYhy%R35lvH(>8D{!C+L#Q5;@qt|Vs1cj4w`^P#g%WEQrD+rEfmpcT1 zyGj1xbJxD9lQkGwT$^Lx?3N#9?)z*0QAKK~?!)i*9;9b>QCee>^j?+Ibs9cu1Utvh~{pV?YCq@L_hGe;UZGQqfEy}kZvil6T0xOOn z4IRiW%^>qs?^ZotJjQ*zSju}Au32KFZz|Z#(9gth;D`1v|J7~3dmzu@@%r8i^;PR_ znl4Q|SdFRrSb1kgVU^iH`80LU#)!bD5cdu37ak7}%2|7pLKa2r*<(D)R^Z2&*Ke3V z1^BZE?mtLHwb&=d&F;Rz-u@b_(r32#_uAQ<)2W>qdtBuaeGR_Tj1JE`+&D<|Y~Ix^ z0L6`JXXN-l%|mvZwNAeK`i!IgTQ_LBKs>8Hnw*IJUoU_s9B`ECS>KZX*9%~IGN6{r zmWvDj^GO&GuUjS>tN&W~-;4Rr253M&eP!~0J~4XkYrUG%{$tbs|8f3*?)<+C+kS0@ zxVGt5^RJXgCX`dqa{a>HXRLzv*7;6S{F&smGtm2*X?x!WIoiqIK6+5D)qhi%AuC5`|Uy0uBeL}Pfy>f>#tbb z7CiGVZc^Uxi>{qs`6ixGqiGZ9nbKwUEa)`brgjN%#Fu*k`1oW@6=~&06ub%wrXUeT!|HJl^{FTxb0vRMGY8@^(0z zCOjfBz}|WQwq5)Del-hlu=Lvhm4k}uP1=5+h}J^?$zFNrRnsB5tL|Xt!=>SzwSY&e z|0|DxxGaK1r~fRQ_uRT|uKkW>`i<|W0D?&A*LLHp(hRwOi zXZHc7w*Bvf2YVX?5F64Nd-x`hk;ebUu0l$c$IaA=J1LK5bzjWTF;jldwO=^WhpLcf z9#?jzqAVRkdD$bUTEDHZYfjRi2x+OPXm+ZZwxVoh-%v<}|C7I#T-BzkYg3Qy`Iz#m zCgo%4y`dH>_wr@Z#ygg^SL$~}J?C2d*}5OYG~J#+Epuxbk~bag{LEZhV#t{`*7%F> zd*qfySJ=ufKga}k+;DM)Cg;=5W@Wd%xb)p{2N9$>sKb%n&vj$lAhIHxqGxU%16`Rf z>_0}ZC?_Q}MBlV#Th>$aQJG=WOvsbJ3b{4En4%@!o=!WF{@$0nKTh^H*=PqeDVLw6 zRYBS|hXt3#X|!tAAllSMKVrW6P#tB$nO*&>`8N7%=Y2m3ZTt^w`|LJh=X5!zB(Wa_ z%0@Tpc51~X1$~mydg$-Z?``!m+eL$0Eg?>B7jg#b#*lfMkp(UFeQS5EKJ3+T=zA*f zgF~30cYVLGdzUVC&mH-*sj_dciNp%au0P)^M%(UtCR!ZQZD`G}e1WP+$lSj~IS`>4 zArjlmswu6(0==lD5buj zHzvE<_x>gAQS#x2v6h(bTl5^kH@7$<_2LVI-0?#9x)I0B4W0dv?z_cKVIsD~6Di5P z`$xF#Vtu#YfT+6v*S9Sbw+);wzvQ%hkL&NmVnJfL{nuSJ!px;^A9lNqPHNHArjD+J zh~dBHy7~j~5m%Ts4_s``I}>mEX(m90dtb>_)th@0FHtilJ11_Q{bjVh)g85Pv)yf< z$x#cc#(qxmn7^l)9r8?3kM2w>(IDm52I<>yI`TAzdA|GUKFfLm5}4N1yKYo^k1@;VaoH!X@^m z;X9Cs z*@r6=o-3U#HvD+Br=VA7k~rSq{!Q<q9j&LuC>mZ2zxU|!!Ix!iUM?DU8+-gbzn4-ryb-&!V3+#%_D^4WcKKp&$;aQH zapzF$Ev?#3lkVup3tWE1t)mZrpyN|#?%#57d-k0AFZp+G-FO%|y2M_8a4`XQN+-Qs?aGLM`xd5&}H*Fb&khjpDFQ@`2^AY>S--5og5Ft4ehnhYaa! z+kfb$4|yMT>wK!)YcVUwMn6zQ!&{p`3_D*meDyp~@`1O=EbC}yN@gRzgz;4?Eo`-M zj8pC2r?b^x`>}uExllTKqV~Z(wTkSk_=@?F zvtAAL**p8;d*t-3mF263%U5pk$Ca%)-LdBCF0HyR;dx1Xg6mehX*W+K;%DdoC`qY< z5OHSRC#GMpbkz2ry?3&2C&ZLoRr>Y*v%Hf?{jNJDd*S+?hu;RGS zI!p+zsv#ZPnB>q~GP|$OR#fcd5tb^p){opge}2CS#-gk9xH@rhyh{J|z?b@u_bzl) z`8w-w!-(zq2U{LBYXTFr{m^m}9ygrNy4^WrQhi|GhczcRUz_wt)wv%ww4`q(cRp@p z;{%`pZ|i{u+>5G(j?~8G!lN6C6#EvG@zD27Wqs=pCO2z`?4&!6?-W0?eBLzjy1jdB z_`;I?Q#uD8dJx78QLv*%K>T@EOYJ5fsZ#PmLS|UsTX=qV@rfCw0@1cxBb&YQL5N4S zd39cEdGd1{@oVl}2OB+Sy#M3D26u(*oqQ{)T+9qtJU^|IvSoS%w#(aVd=&+O2ee=Q9- ztW_Q4{M4;R#RjG1W=yDc>n&NC@Ro8b>(JX}qVAQ`&yL>MH2NdwiY3ILyZ+0^uR1$7 zHR9H(Cr=CH9lINc=K7)u|toxRE)Is z5avC0S2Py3C|b*4(hhOXpC6DX57`hO+4GW$ulfblqGx*l zxDt57rBAKv#_futKeMij>!a8AJMQZD+2Z1lwkaRqw&BVw5LBG|X$&fsH9fTH{^;!1 zm8(^$S|Z0sA#P?ZaTKQ&moj>hhfB($ekZC_jWaK(WC1+Q3Ho%1RSRlcRzGya`T5m< z$m{z{@z@WS#En=G0Yvb@9rhuw|A^8+Y*NHi)gEY=7rP>H;P~h4kUv+MZb9YRKbF*i zjtB3nC0{y7rTq)D5;{-nn8+K^tUuu$46}vFxI*XDp0N(hKf&Gq3Jq$&#iV(K8vw?> zfQ=3~z|Vi8NnTV{saw6Mtt_0UQ+|uuA9|?Ub9?mqCj#|Y^l?<=@R0yUf1vV!_T#=m zom=wVPb2q7woM(m;hT4VTzlyEhHcu~C)aLX`a4?Ma|b1RG=1ywfUZsdBn20$ z7ejR8{$vNI1IE4nTXWNdbcjpvVjv&>h{8@D{A1^W?FPg zKHi+_>ULc>vo^Ez$IE%0(wOr084&=?Q%lRV{ft(h;gcK6aBf?+om9X&gvAc-c`FY% z4OT}bOWUu0%AfZhrcSfbADq0GSTT0*-LEr@>7~CCCqHmh!)lPX@m1#2hN`isj@X>_ z&F^~F+LSxK8M*f4l9oEOckonDbI*aio3;*LLZeRpULOrS!ORWIHf&^%o|rQ^k6vi> z16r>7>X28DOSo^p&U*VSWA$y_V8y(X6=VHRq-k#(7=Hq@Ba4R{HdN=*D=zc|Y~UKA zX18V+d^|VqKuKm+|GtEwJVBR@zFPZsUH-QP@z)~uy-Hj(_Dy(nVVFyG_Z8MJM`zO( zKK29m;N*-IWBuI1dp|&M88W+53}WhE$(ewX|0CK3g6ZFqCv2vtH39+!IXdX^p~+pc z9GBJ?nv?tAFO1X-KHYWUb?VPuM^;4T(+_{vJ!9TK*1G43XNk$bYXSDW*uWYCn-TeA&;uM=9Vd8rQUX}7=ei?RwNm@r$M#Z;spMkn- z2YxsG7cS|sJ-WMg8Rtg7^b#Y3_m>Y``I+ldF*Z0B!*1@Wb=-(3nF9ZQ{oq(0vuM@= zlLCqU%CO0aSzV;BH%DLOr#c;%K3Ot0p}VZrBQ?J7M(OM?d(AxhYwtm(k1RS{YOeec zjT+duSJ$bVGqBO#YC-DfCHse~x+}J5YioC-Zb2>wRyF8e7mPi*-e%}(SKV_PbUWEQ z@^MWrJ6qL}IB(D3NkfreD_x>f4IIBW+e*bP`h4vMcXy*epE~NHW0e;PJim8zQ&qe%{Z+d~)>tabP^%{itIYq(jiq8r=RW zF7f`{0LQZwY_$CJ5vgN%{;T0{S1z3$9|lK0c9?uBp(SkF4wIW+V;ws$mvkIl*PdwE zJ^dGe1CYev+e9Vx9XL8h`L<@jyNH_gsyfm6&WF(p2e%=jGsdC@chL!3?~`d~Q~%_Q zE&6Jkn)ZufG5x``#@lDiARg^*tG||Pi27-hKb6-fI6K-j_s1Zr>PBr;FnMq^qnMNQ zN`>E!a9L`tFCA!{b|xewT|MM>HMO9kJ8x{(NY)W*eUe|r7%8>;E3QmnZI`U;*7hSx zBOy-RreP7gPaf_6BLpFKPVa{>8X(rXhR;QJjR}&_Rgk=cOUdsnP-cM#52kRUzIH=O#%2AiFLo8$p+dP+EL2C?FP%4e_Rw}v-% zxpeaOy6r!jl>qtPd9Q+bas>5c^yDnn1uF7+b2g^x=+`F=&rGgbbmfg1QWp!0>K5Ei zTar;wQ6SO8zd8GLXR;3X`;CzwUo6gwYg-X~N?Y8}_H{V^)FqImD(Z2Y^?bPS#_*5) zlOV(O`~t2lF=ajZ^u@-o%Lgx`Ar-9Zj%{l!A|PVJv7g(0$2Qe5eo40KW@LQKe};fK zF-CsxH_J(B&jR@6E<9uV;@-b`JPNlO(zVpib6ogsPQJZ~Bx9|z;uULFQQp@T^TVHj zkOA@IvUV(QQ#sJ4?k@fJc4Npu`r6fz+Ff&VL1N7ww*&07$JN~+Vi`>inAO>TwnA0? zs#I>Rg+2?n>tsaKm zh{7eQN8An##Hra2ZyK|B(T8Srb?%B?ge!|Gwcbj>=HBY88nWopWBN=n^NMZsmM0jg zuOcC0>huFi9lO+ScfUUzJA8T%S2*;Zumg&=yiD~KTxlIX^L+XX8 zm(s{Tn(G&Dthy9=1}>O#)3m$HkUu-;==@r)-K*`|;%a^m6cRSO8`EP*dZrFMp(y_O*mc zhQ`~J=jnE*+%BC8@mPB*YSy!hFP@lQvij8bqppS@Cnf@0>@Vcm4bM(NJBISWc=2dH*#dPZe<-=QRV&gn`Wnm9JJ7Rr?WhS5-P*CWh49oD zm{mGBknrHSmJ74x?g996(^Ugik+7rmD&H8%y>%;p&Xx5l?0>&BWVtsA!i!fR*NkRd z8dm16Y1x^szV+7JaJuqk6?L%VD3Si~*^_&e=QGmC-HM1@lU1@h978?rYT{O}{B=di zPIt^8d8ycT*ykmg9cwPL%iP-T>A#1}b?=(&$5NxF( zvB5@`cH2;TQuQp`N*gJ?ck|@su)LFpbYl%K6VIJmzmB4f|7d$c+aFV51-=HjSF#4; z=J^a{uX505?0S`dw6-iNe=KX`(G?_kHt*8VA(L= zq&j7y#v|P`$fn#UGx)IGU7wS0pSSoW1$`@x&Z9yM8MLMy1*`iSC9k>Lu_YPII5ewgA`YR(ff<@Yr~Ks*V70LXH{ppsBx$e5ZVRUrXC|r&CI2K}(sd7`|-B8(V!r%0_jrDab`bVtdNBY4eV%a$>PnW6v8T-PO0R zIsE)#50?EIn_)-*XuaY`#d>4L9ccdN!^=j=OTw6o@JYuX?FD)J$q%^m&X*T;*|oC={G>1SziaPgKNJqk_$+Lm%H{x<}HADys12qicO8RYK*(;WDJ9@3OPSHqv1z3 z^%&r(J+*Zi+CK3-ySpa9saRlAX;4ky`eo?yjd{udkg~QUDQ)$oEwAJ2XP?!Yr%~n~ z0W(ZLcVPeoXD4#P8pY7m9_r%%N@>GQY5ynZJ`WtSzj3?~9qMC^cO12U=g%=^J8GgU z`xXPs?f!q9>*-tnzkV^`IIGL1>07teSeMmk9Pe}$8I@8K(cdcOpKkeab^V~F$DXOF z#*3gZyL$7KKj*BDj|}zEY1GI`W7QsGLBa10!=2ZDT)lN9;k;8>8{Wxzwms$g1^3n8 zr;L9_sQ`CtFQ_TMS>3-Xb#ck(tVSN##SpXSj2(lqYOY1SzahC1 zM2Tgvj8|m0|GvBMp4atzQA-{pao@nT=rNp4RK~F0vZAf{&rTmVP;&aBNZ7FO>b?5d zYje6{2Ra)|-EN-l?#fJEAN%H!Wpu=ipoJ@!{1dYb)Uh&;rw(4?&bwbfJn*5oobw?! zGVViOw5}zls(!E5aLRWZ-=h2erilGK@4v5*sy03yc1fxQS5K`VS?F=3@KErRzg}2} zW~}iId1xIv)ynA-sD?|^ZLsM2TWG=MQ(wgYxO`fV!c=9be?Dxjv>MIVw7Tg&?YOu* z7Q1BGyU6cT`aa93RR)(l&5YzT2Tgdvb4_qnV;@sT=yUNO!&~~w`!?8aWw+EEFZ{5P z&QT0IT)yV;ZuZPAxx*verSmB{SKl7U{S)1ir|3P=`@scMRb0Fv6x0;_`#Sw!*Z6Jj zKoRDSr4&%z5A>Q;?9}n>%M^k+CLfhRTV>#1)S=6 z-GEYs(K9X;T5R6TSn6%hgO3N{NpDngkt(ptO8Ru!W1qXxR^-^JyEYF)j+#$f=XGZi z%i4e1c-Nqk_%E35W~bCUM+PsOOt3Ib8`ph5K52{HfEhIPMeX%Wkfs`H>&d=-+$-OH z@5SR5+GU%ymo|Eyt^g=9(vxf%{&Ki*TGaLO8Ci3>wg-ghB=!CizjzCO%|c>MFPyOb zExqz^;IdbfC)7-A_{&b(74KZu{EY`c*WTzwcw;?ZsgB?-PY9?hhBfXu4M0OWCEKb>iK} zEtuT&D(hv5QyQ%O9mdaU2&q2$W|@Wa_?9ikzMYUwqw98CR9H^Xst3KeW>8b*heE{k z30P1s0U}vYy=<&#D98mxLdPn4AHKM-=o1M-ogeZ&<#qZ5Q{s>9i})rcQz6!;$}Nyl zTRrVfq2}$|7bP~Bw&dMYB@{VXTeVas^OvPK0eb$~_Hx!Hi}ver{P`w3XL(kc*KnoxDs?X0nB1v1w_Y8LGDkQWKr{ zb1-6t;k>pMzd7wcD^VPPfQZx2L1+I@{(+;vGSYAEl8vSodvPAd8XF6WE?W0i3MhBp z{Pyv2-5-&OdF~BvtMnvZVDyx!cUH{Ww!M9cV4G*5iMN365bcxZ`P6tZ5Be4nHV^!S zVuquP706Sv?Cx9Fg?)SjHJuJBWUO{+r&zx-*08+1TVy$dHCjInbyUQ*$FFAuUl_vM zPqkirWwz)%#9}3GbNnEtPHi?J%liKM{Mn**p)KI`hn_nNn@EtHjB)11y7Pb4-uz21 z!!h7OdKQtf;y*>#NWazViY%-br>BhDGCB*0Mn(ChWq2Vb2ppE*ZLUOw6E zlUv>7EwN_%>T<)&56#@N&kSll9rPi018Oj~_um7u^45HvFG#!=}A{+HvEj%%$w0jl1Rer91zlSm*Y3AoO;7ANu`ojM@xT7SK;FSmueIH8O6(h#e4( z)MRS)vis}zxxb2;P!rwIes53!AHFq7h82fTC^N#EtZ=w1yrUXOpthX6a^6F3>`^pY>6Q-2-t>pCj(> z{~KNocUoqx+#G+NQnH`mdD>$9!|&4=U+qlgTLEZMN^TbK*)&?e@ndVO`X_$aE^YCF zI}cFnN8~MBjm6(=toQosOkyX@Ft*L(DZ72UPIEkL_(kfAKWojs#!dKQ+*^5OKJ@tg z)+0`+G47{Ze%evqCuiBqHy4g)H=pU8-L_qu+HhO95d42bQ;%>P5VZ6u#)7NcdpB$Q zPrgh&H*oIRlk@eXPg&ICSsw0FA-Z+uEU3u=Gp&}p)Z3iDW;~>8Y@o}f<-OC=ll9y4 zJpNoB*pp#ttb%Bp+78MQ#vQh)v(pK^byX)qa-fw?fAr-7sqFkXX`t9OFJS95OF z>@K5D?|wPU8s_~E*|v_e$(}hLh@58?z{5zMt4;Z|D8a=Uzz;47ikkt3yLeulYHH#M zia<8chK`>w1C)!QOtNE*@|F0Yt{U7y+>ln1uiiM-e$^YuMJw-S4ArM+r%1V>VRD!n~p!gu4L_94OF#h(&i09!9U z;!&7rbKknnZ22S4(>uUp2l>Jk*!!Rat;~MkoVTVxhW2bS;4WzUjq(6BeFL;U8fg9K zVD=F#_%De6Qo4d7Tm8vqYDc!|yA7t4lgJl5{dy|-^n8GCP>CK_pzH|m-iazZ^J*wk zZ3fXza(Xk_bdD`3wR^m$_@T9b->}PW8f%9+FcemER-KbfP?&E`TP)RT2ESigBt}j4 z^c*~!NAfz~EJvMVOP5!Czw3^RRr+nQk@f2iwlIoXv1_ zF5uSg9j*ADSy!O$Viri7eF{=W65z>$a@mh7mp(9$RA2PF0M4lGcW%;0=9sjX*U`aB zeV@*)oHn5YCpUa9x(55(~fw1wPEX+BKfYw?KcK5#y)B>v3t zb&6OEo6&gXDJY$`BWYKP)u&kouXdzPT%@3()x^Y(Lm<&4(`&XefT z4dSM<2Qrl|x%g9wLHP*2m@ukJcCPUZ3UN^s=-%zm&6l%y49l!C_-j z&Go2z>sC|US&w(aTC)>7S3;bW!p6HUvD{DQe-}%N*K8@7bfMf#14^0_os`(q>w!(y z>^$^pv5~kh3J;w~2Kq4OTo#Ed)si4bY~1nIhK6D%T2{rJU{@ zSTou-6R4nKMFcL_v~8ffm00@hcX~s*)e3#cx5s9!w{vZos%Ho6UfbR+FgPx+ zm5hxJz2INUiV>9$v^;oOtbI#5xMGiwKiAMwdKPu%XC3E`4g0~?NfQHZwAMU|YWT2i zia9}9*Rd~hV47pe{W`<7mBqCWuaQ?5*_~=ievg{we3_17|SfFe-ba#J|fU#O%keHyS=(cs`kwdu)%*)A5$Wvuc3a1 z{N~lUlf9)mj#kxM=un9$61-i#@T5^~D|?%@{c6+^ z;R+FtsYK_NkjgJLa^|VKYJpn<>4^`7$`|q!`|}Q%4GN8>Sm#t?5Nfl%*}iGv4eY*N z%SL(L7QOb)dD}VjCf+8@6cKV;GnQUa5#AN5+hM@UdM4WRFhcg#c2SV2G~uyDY@iIf z%37Oo;E>+}xcq)S!Xr2M^Ur3QAQR_Ul7ojy__>53%|!>%i9w=O(T)tMxgjY~c+fn> zbg<~a%jKOc+e}Y}XMmY=KXpn8)wUm760KQzo{e#K`?PPf2!)69p$xrYlgkcwAbwpiBlBI+E`11{+)t z{+c@Xz=(;iMSgz=XMY>DyKP6)lH8BCjW}r&l8k#ebjrzdday|JGu72FP-v`*<+N1Ze&bux1~@mmCCFU*t{vXM3|)(}8Eynj>bQfqLv$-n=dfe}$q?X5mLz$y2Oj)IrDM>oZDE1;?UyxH$JQ$Dex2sLUmb zTi@-fNE_!MI-Z>5Kmo;ZQ59v7q5j}{d36`hSULX$im=PJZ{=MLH+Xw-zo@thZt$SH z>3$Bm9HLEvoP}e?6IeoNxEqz|wi8pBl9I%b;=rPEmTWp#-|YRWrLy@e=g&^`hhP_P zFeWeIKMjQxMqarL=P+A-#L;@7p|7 zy!e6~|Bo3sSMoT&}Pt(J%q?CPIf;X67Q zQfwdN;GHP$V&WAgnK-gngi!_WmcSnHvIW7Becb@MC@o>ng0k%7oQzl z%)(=MT@&8HfB3Y}p<=UUZxr{)GHY$h?|)gYn5lS0uYF{pXogHrvN2_#5e1vlZ_yv23n6bxa;RyD zC-ij1WBlD$f~}SMEkeSxnscesPK^Wl#9c7qi{&Y1g9CTjU)mP$`WWE-Nk6|@=xGow z*cTP*x8Gd--`xO(`q*VNLpR$*WbANfeyf}(!>98k`$j%H>Td7R$_Fi#cZKYxb+K25 zA6a3vCo4Z26w~FsEvGQqOIr6RK8CEU)F*NDrOhbTC)7XN8M%C?_3-07`E7;gIFe%2 zMUFNySpl;}n~5T<`8k1$oZNWsF<8l_p|W9HJj^uQXzTl;rFRNN$o`7W89(c!lhF4X zBUx!-I1)M^jU!P#_vctvhlIS00&s=9@T?*ay7EAU;Z@xXEQlbhC`<+(=W%`a#*y3Ap8^$i$r)dtV$aueTM$8#IynxY)|IP(S zuEx;ak6?L<%lW!_`mC^Oqg{EjU@>Kxw4h`KPbpHUq(X?Xqo z#Hg$yW9(2v+0Hsn8pe)(Eh=f-P5V&(bM>s!L}6bUwW4nQeC1pR|9YHp|5V{y0bsY! zqlYU!7zo3w0)qYuCg72_$7bz{^1($(3J~*ka2q~bvR}GwhXP~2Ljd>?;`T*t6`eNB zD1^beZliZls6d7#o*{ekh%C9 zx@v=AiYxi7(ij!@(|0!Jz2~>2E7^yQaSn`pE8VmIW{20*Ioc$_M5^2?3>H7b+Z6QJ zwWCE>jqb4*7{5dCY9?AvT$hom8~vaKuPh#?`zlXb-frm9y9Unh;jGeVVSk+4w%b$O zqs^;ylqf6)x( z655O$^d5zHS}YC}M)gH75{Rk(3sr-E_VRwbIf8IXtJAFF4?C(KJMl0w!%sqJd2KB0 zR$dftt-=8d@w-GJnulVzRq8bP%QAf{^j!8y+$Q)G z(?4qir%8!r=U&*FE`)BB+{B;=d7k#ZVxxXL=Yf6sll15xP9rtf>CKS7U5`<^l5{_d4=@lYhiqvNE=8NJ^6h&|Y{-9P6^p#p}`QU1oww7w@ zN`I?Q5$ey|2YX@cTalZs5jhufdZSGNn%3cx+=iuMliX2+Ytm!aLKZue{&X^(nz$O+=RD-t5J%1K)z$ey}`qEa>rpGzM7j_e~=_z*5+>j{X zsY+qdH&v!T<1zDg>bbqwyV8vlImo;9jd824^F68|bC22;<<5?o=^8~hl|o39lA2F; z;T@@><|p;Npm zj=GXVvjlO}8^^ZoRpHH|piOG>bUYqd@Zw3t-q52u_OfX<=gv)gF<-IG*LOtO+!qA$ zR~yvgzK!nm@;1M>1EDb&6qstSkLyU2>)=Ak$iwF#!OS@-NVyG)EnUP;`RFbr{)+|S z;DFdusZsd+;G1_(QOIpM$89xMh5aj%Y%_+H6SwFZOCN;G-An}Az9c=874?-`enWA! zsJPO$tJ}$zi6B1q?kqA5E?}qP|GbGKPyIc}6n1Nh;cB>>H^4Y8GW*Z%$a9O)y^E%=h_FtwviNhH8T&v37_7b+*+IXXu8B-f8MnT~YD~EozJJN+5@TIF39;$Ci z_%6PS$b2k{t~#3+V{pzdE8zEv?^gDvyu3$8f~{*X=cw=g?o?rp_h+f~F70;Y%Sr?e6k;Z;w@$Sy)DTS2c9bI`8^ z9)bPuZ7#njG-Beuv?pmkn1R!6MTR!i^0swx%qZ87`fM+@hi{MWEskE1USi+wYp4x+ z?#h6K7$GMTe4h^S7=9rKC86Wa*VeVu?WxS4ive>Oh|)Gafrvki2n*d9F2^Q>F!EjD zuiD?mCsc2jSBD{Xpo#qHt8yH}j2LV`eOP^*BNCb#TGUpeejlJ|X&$uLN^W{EURDIm z(_yg4cIt@9hQD5^(|f%Nw=bJ@@;l00adW}mDp`%$+sxG)s;lcczDWqzx+errO>k)fxliq#g;##muV z^;n_jOE&UkJdm8+g+rx}`pWJ;fpUgq{)&9`gp2P^gYTKevi*UaU40U(@)6FPhhPu1 zksm22{NP}z=T0{LQhAfTY0dl4Ekg$k>a!E`cV1M6HG>!Q<(Y@ueb&2m)jst7S<^Li z3@in3@|_V8F6MyO7-I?!Gu(Q4{`@K!ImC4F0dr%ql)ddYW%&$mN8rOguA zr3(E7W~(_rg?}LlL|7hU#>2h%;nT@BWLbAYMd0V>*^jE`baF2C8ex;977IF$sqR1q z)FeGZpj&;JjEZp*fscit-XQ04p$_VcfD+R55Mu>y~)x-g7vL6e~0e2q{{@t2FL!1E_33jcJ ze*d;Pe0EcYTN~MttAitF4fx$GIcftO1pBJB_rg4(8@*M;Li44eQuCfHy`>_t@Bpv56pDGvy{5BZfy1N>{zVp>{eT_Rh=^Xo2`<*yS=_f*H{FOQ!wCQTvfWofA1#rLN_7HvhFGrJ{~H3 z$c>W-cHbRG=lRdY@lwuHX&3d1Y~tKUw?`~KXhB|L)BnJ{>9uK*-SFcPh|VWBS=nKH z7da?;xNEZ@l*kPApDcYZVxL58T8~_IuVMj{9bSHjH@IcaaGbFBmfoBH*i`k#H{qt@ z>RsE_ROU+lm$QDrGXAsoU9zg(iaZ<@Ap3k$E-S?(yxT^?_@X(@L|paW_ismL(NM zTU=hgR%T%4*{DYj$9k$7x7G#4FVl5*1{7svr($)9vv74zj=x?3UKJ z_B%I)`&15a2cqB&Yx#o3%LKe>P1?}>`VPflDFr9c$co!!;0NKg2?bk@geFJp&I#0L zNxA<;`1BZQkq`WSa2QE#OM0yyci)N3zvJb>XGpZVN|E%=E=g

f>p6PayLIwI0y$t(dNc;lEQ2%r$&rI`R^HS@&10u z&;*)Y`#}ME3I={PSWh^+z4Du8_+48fThaFGYNanJ@Q>X!&uRT;jy|c_4i4o1n!wd2 z1y61%EzqTXus3iH>uGx)Jp!6{>riOgYEOJ*rf7yDMiPJM{1XLjc!)++x-mNfm}zhN zS}*?p&;0*zo(c(6HPmcwUz-x8I+|M2_Kzb!ja z%tGHU4Ue^UwPsajqeteg$*jA+{SjK(x<;-q_3|EFd(;tn;#|{9U1PnTiZ0Uos!C5% zymfZz_cNG2)A#eoQd;808x!59;-Y*zcRu=%J1*T{rGsmm1Ff62J$Vm zjz1?%NmfgR*5blkB1z!A=ght+4BUR2*@qdlEml2pj?6~tT z^;u5v8Nm~@HUc-kk~lI<`@)z6LsgP0&y{(s&)q`_qa|(mMowVeS*)w=!)9q1d5>ap zcy^2yPP7Y^Z=n&Y6;>Mshi~dVWw^B%^mwp*8ErVMdiaapw~yzH-zP(-N|keCb-Gou z@s(g0lkC`2muTsV?1&dnA9vJVhe=iSS5MJ}4gDBY>qyq!pOE_S+mo}#!gB%U0_a4& zH$*T=+EN+$tL|>{9-)uY7sM`9vK0dxR{p55>9U@qNI@ zgp1zhEejta;W*(z&f*bl@PJ(`>+YMyCa$s0ll@+qO;R@{gr8hFW~rivJ4Az)Q^~o{ zh?s+*lM^gjct`mwbnQ={6A)Jc&&N>duTe^~0m6Khiey@$GR72;_fiZEhcI6)%Z!h~ zwG7X8i%vVDM}`A+qXb;fI5%Br-(N`DF3A5=w0JCB@a-H?Zvn*lL8NL@C0<-|1O^iC znV{*{raLq@>yx-z&y97qwDwjq=7eeKRo`Ezx8V8a3<=hM`BJY|6YoBiQ;U$=+6SlP zI{jnixF*UYOs~bQdycl$gwY&J&3>>0d2Cp1AAnG@NL_4Tu`OogsU>l#dSPV{fG4-= z!~o{Ef<+o}7tNMOJ?KU>)6&g;#9^hIj2B$6e{|}tQ{|*q?PDh|IvH_KdXw|f+WBG8 zZdK4ouvIt3Dk)FCKiY3w%&dIJg>UnsX1#UH_g&H``y{dr7h?L1EX&PMyGy6qQqLFS zrg1W(K_YM9X1DV~y{_sjCr$=3!Er;bw)PR(P;-~);h(-N;mEZm!g*ULGY&p3GP;w5*Jmf1!%r3F0f zd1hZn>=S>?D99&V9~3ReZY>@qsz+WIey<)1(1LB%7BghFMrJ@ zy@A{1f?_n^hr-XAsFZ>}f1L2(wj0byS_ZF(596K`QzRQsh{R0`GTo!uA^mPE!i(Nt z6%(2-_R+>k`ZL$ZM6`7I*+_9N?^l>d?!5LBHMtj6&o|zpk|LQjB(2viSgnv8Z!uaC zXO!v|`tzNQOkWdaBfrsvDE*A)&pB)Ue{r0d#|UR%Po6Ei7*gv6pj`g4+2yb$8H-`l zR{hu<%E+wsz%9e}s<;MWjEa(>ykObAJ14YNymTH3FarY$oClukyb76S0e|1NxE?~w zuq-&nVo9L`C>oTn%{RoqR9< zJN?77Qw_bJ4Pws``f{DdedHGg^3i4zyWvSz^43$nqY}Ng$^))JRRdGyId{GxQTWF3 zm_vR- z{TpEg*G7uvi@aA>(MR~~_)Zty6j`ulwg}jm{pxqfe7YqG)vGR4T91>bW0SFD5;nG( z_*G1XqezpKgA-WqP67Q zyNuT7MgdRdA)ctr)*Rqse=c#$2b1t=Sv!%P0krgd)xio_FpTo~LAiqSX`9yUZrG2{ zaT`MJ`3<%-Rt(2c)i(VXfno)!^|fZ=)Vw2kn`Tkxaosc>-CZRNd<^Ga+z3MJq%2tfu@@gyF z6@jsQFP)g(&FK_*^e4{7@+E)2dA<-s23}%|`+#&=8z*`X60C@)UsS9CP5_zVRuD^) zX>Y7reS_*VZb6RjSy7(*H6q%{RR+Cx&ekJQ^NI4!_ zdoUQ{J)Puf4tRF$tazG?R)QCgBMXtTW7z?wH4GNpvnK|`N;HO-Jx%6YtmgxX+ktB0syy?}VV84qf;PQ)FvjAKDzgTYp#E{|29at| zuc5|B3^UMW@WOfz2EPgv^IbfI7b--dMtSUsC4!u^{#7a!C7qg&c=ub5X$rT7{D@s$ z^~fGrI_<7fQ6YK$ixC?tXL@jQ9}ju*k1QG6P<7%|=HN6cNpJr6p3|AJ7HRymy-^K{ z^pKgMl^4eb`%x4xmhJZUb_13@XslzogKJki)P==IH@-_!sT~|UHu!OL;o{;%$ThSN zsLpJ)*^+S^S+b$iz$T4_GEc7Eob0X!o4!Na1ax3=E38;T+JbL6)G30>sOS2a3@ev~U zc8gWh{+SahUJ@-blzu{Fdv4F%wbF*)+PjIrqK^6(2dLrb+ZHCNrJdm ziKqBX1x)+yCF?FX6|Z+2ABUI^QYo5n3s6%m0!nY6(wcjcq6$)U@2IpyUZjYxt-pul z9MB%?A}Z}E1McI?4;=6ygPISgJJ&|YkFGjWa2oi|cgu5bjiU(9$I_il5Cd|^$CxGP zoy2Kt$%@zBCMM=K_F&yHoAK25i3|N)3$d9k3lf_vSlncv-UxP~@4|0})Xzrwz~2;) z=wL%W0`R1@C6up@tBnYHNR{n}D0G#4)sl<)pd4~e$H^(!O;^RsFrjRS=GueaL@bKX z{3YESDF(&-XaRLb^-;f~R+GkpBy1yCGg)=&$6&e5!7tqpFrm2fRMUlMKCSSKxt2{D zzQp?znhx7^_M|ltVFU?#wN|fu%h}RD8huw(hXs1#=!Bb*bs59*2*bIN@OFsxxQphUkdx9 z{Xg!n{1Wo98!=TitO*Lk;~|TSgT?gqWtY27G@@H3xzIy<;4m_Eb0j*`wb+q%22Tdw z60|?u2$_4eU2Yb2AAFs8f1a5+G!V@p&o_rM?a&wD*8V8OTg)ZTFG{vulrNxUdv2L? z9`k4yS@)bpGJHj=hvc4p39gqTrh>+=2;OP&aKLU+b=YdJk7q$u57*fILk*1+$7aSj zW|B=~eKVi1Nn>od=Pa7zPuwb0o!Qx3eK+l*X7a__eFYDRJ+?m17PXfbX6HK*z76r= z^|vtQgqP=ZPk+?LW~yd2N_$YrE#2@6T*|JnG*Xb--&qY_%Ca78h+vmr>;FZIx1z*t zBwtQ8SN?i30GG~E5U0RA4SE>01RJ&b;-3b6@mJr31>8@>^*U@MNn`0S-jtz1V~v_l z@wiwO=e+X0mDp;pr@xOY%2{=!Suzjom2gfOF%W>>LA*s}%F{so=tAA(v0fBSy1m^K zrFzMRWaxL0;p|SfH+vTmWtV&f>jJR(lwH17-`KLVwLbr@A?;bo!q!1-tV*X??-Mrm zA1s=!aU13pK#>lTE>z+`kjs>cC$y?GE{=QpF_id8xQ49_Vd;l>+P*2?eEKC(d9>QM zy1&3mJ7!2Ty0<@Mk=rq82mc|#?jn@OVR0g+{$#pt>7O7LwEZ`pqUe-HQF51C!-lU~ z3-qigVfOyFRb+%9klFa;t^pIH*cYQWMm#!S2i2%o23pC^XD?appD95MmMm}(gEB#t z5`IE0CIkmr@EPk4A6|um!shPL*JHuQa^GATqPeeEb|%z~w@iV{mwFwXv6Z|*4yAMh``4rwvwWd9Q6$^2Ng z9$OPu0AEnhLGyoPfr}tLD6U;#u;hf59!U!N$*>F)SMfkI7gGX_4OgG^Edg{DSs`-N ze+_h2;F13oazI<+uMDR*3&@h@o7&}k6y9eL>qo&Q<%pn{fmxL>XCGazcxk&+466 zP3-L4GXSnkYs@hgj^cXj?Z~3>d+8T88F|niif zbH&oY&H4~CX10zcOQ0I8>;SQqDekiK)D0+t8&r-Q0Qlz_lgd*+FQL+j7d5p{3PeMq zWEy1&sxtU#R+S3&@E8g|35Y$#?bdx+up;00)G^?;g37t3FTQCU`_}PZy*W|JIW;gs>`JNPvcE2X=;RTO6rahA_Lt=%J)EFT6S@Tw zlq!Cykt2X_{&s+IUcCU5JUf;_46j1=00a_8PFMTlUg`hkiyy_Td1DcJ{E@?i)mC|V z!Wqxx%i~PK3!=+*mnvDC?-zGJzjX6T-tU@pvLXpgMj8{UgO zo5<4LPE<92(8kF(6+LSxnPKtef|s?0Q!e?PP4)Q|Bk-jr%;)djhyI2rlB;)AXV#_J#l#h4`P*XoyHm{x z&4ARP>FoNvPrnlr8W56-=a^g}0K9`w5#UjJ^OxB19TaxgtNEcpWD;`*PpSGu(IHKG zA<{uwDnaH%?2HEGr)1sY=-$$h#ZSm|;e&xE|i-c+uADm;TS`HzN{aA>AItL;?59SQdxZN}Q+65RdsT-we8P-0Y57j3QOOCjm)rBYuctz(MCf z{o!BLn%*Gf4=d>yEyPKLtY6wmWC663ssc6Z9wFV}sU*aU2dBZj3Q-G58OKqhiwi~lMZt$W~>=I?wQW`w*-i$j2lLXd1QZ#zX!Q6z)kgAaIph3xkb zo_uG)@6|pRON|J4V{9Y=l=)jUooiU9_i=`{OeDwrqWRs0`JT_}UVL52ywly{bvvfP ztP-_1wjY<=TqK#rZn!`wZ>L2(YzSZ1v00wv7z@CnsFdDZ1XKOhcH4m#v31G!^FeFj zPmre7HV@lBVy9NrxGU*8*QKP_YJ^Hr-3T6tP7{P=U9#8E`8iCJ)Jh2BEnc-!9(WM; zsD_yZMIh9(|2Kw*Zi>*`^U#JOPnn|nqwQ)%0p9La(3OKI-~h3{Wh6VMveesw8?4wN z)3GJzV!T?4l=BDo%|;WuN5#f+dHlI9v$uhrd`8rLWkP>jwg2c6+PK(m__Af#Nnx8c zO{_Fmbq^2fD1fn|z*tL(Djy3BXx92wGVww^HPBDilX&tEPwSl8Ql#z|n_e^L*wID{ zNOGbCiTDMULldXUD=x`vz80wgxLV|_ebeg;Q_zrSJ#m4P!uLO^+)E+zt^uiwcfMvnL*|irT0K>h!127hp__6%o+gq zqiE~~Uvcj(JqSI2^D3@_)hzN`cv+PvXIB7@zUD~Z0Y7svj)Xs&pMAhM*6Y4Ry#GhL zOIH-9=uiURZ7@CT8{8o%X1KGn+RFYV-?$5=?^pk;0QzNlp)Q=Fuh`zCVBBYi(9jT+ z#us8ysE3_%ogQUcdr-aS`Tf}`GK~vhYnJujuXynNj5;sgOx zuVPq^B0vT(N(~Z)Uf2-~7w{o+_o5!@-9B_F0}O8KL`)iV^{_`kr_?nIp1_{?B(aDYu0p6^9+?e zQeZk%g`Xfp206$Zk91ANLJm?bvwi0@x=L$g$-w}ID22JXD`9JSY6ebOB$|d_p3C4+ zG3tl;ct+9@IFo9hU5-=9F&{1Z3%#VTf7QHgp>~oi8oKgJufVeX>v=4n@m`Ynm!#w9 zKWi^?HRqyM7PVekQmX8T*8k8P{Uc8y_PLl`Rk?ceodzj2qn%9}3b%13SNo$qY_clk zws9}=D))B~%^xvRJ9+sCW=xsHKvaBl8Sc+q-)*OL=(XK#Ey)yzgPQA4E(}x5wV+Ec zEk)irH5=I&8OjE-!v7bGK*aaG^KtSd`Rm~%f3VS$(2S&_CuKy!Tp920|i#b9|@l85n!V{g+ z>b>OroUEnMk~UV0Z{8{73b%Q43LM27?f1TL9D8xM(TD+Zp2VbOYQYS;O6G&UEmG5B zXkf$}E$Hl8F+u^mF@S{vmV9(v;Eq{pG~Y8IK_MxJl)SH^MPph2Yg&GP^U70DYNWH~ za5bCn4WQH{+K#Gt9cug7ArC%x|AqjH!j{~F4olC?4?`?G%fX*{l@^%e8=`ct9M5XF!3&e?8}H%~*c!3A2B?bxmxuOU6R` zJh*#aUJRpG$Ho=a8rgGxP-n$670kU_w z&)0!NaxSZ>tmZs4}`(i&@r6@f-PFaL2 zX0#bdBy;`%F+R~PU~3GdFCc%J-N_E>Z1ferm;05h+q*tzRctcAbA%_4|Gx99m4%rA z5X#XpsV-HLMh?mkYN>{+xvU(KNV^4Qd_sv0HQHd@nSFRs*p%Rd#nFCA zoxb(P*2U?rWHA_BmS0pe91A= zCD)3oN75!4eyF{9jIs~bSHD{7?fOno|J!2&g@M%mk;RuH&L`d<3l+luu=ty-pzdbV ztd0Su`qLmDRAMJqLfv}Jbf>JLtBTK9Uj7ZE`>ICWv+IZs=l;!WQ7 z03->={E4?a=qJaRpRP8pcn~7hkXl-#H@;2b9iS1Q-s` z1E)sKA=M_+R_Ku~rVKI8A1qS5F)rVu;d|pElN9*TRSR)$QURZpR-rY>l9pgnV?5Ty0tDd+K0IrEimvd>3Qqc z4=%=v5#(*ji(1 zs^_6adhF2+&_zAZ>uBI9TICtjQBmjh*n}Cr4(&Hq;?)!`_JtV%T`}Tfdn17YwSieW zxP7A{CN?HeZt;go%Tix?!{5+cHVgzaF?!jxn@dg%gwiO2k^;c0zO+a){0+r=Qp@D9 zjRP~4B5h+gD-X%zgPlh>aJ*$;IJB4h{Az6Eddpf?t68B!>(Zdq!Mv(QXNHqk-pqu{ zp?yy3`LJK~6KXP1o*Fb8WFQz3?IH$xh>DR(8*Hw3j%401Z#fX{-o9iJn7^Y%V+O{1RFT31l=FVp;@tqVW`iOp>ryE1xviVWinzxVlm%Hnkco9Fqm@!=82V(i#tQs5Ehc*1yt znsn1v)sCTPXJgVzS+roSF6JXMG#Kw@8(P_LCZ@~YCjKYD9e#(c9(8IIoa!;K7Y7Ds zS`@3prpZtXHgT8Sy<28B7+ufC#)0To!egHm@1}O=Rc`F|Hq+b3 z5&BnPI(xMzY02*@^Peg}YjLSaB3ZvtUYLFIcufJ2E3V!P>tn3>T-#U`J-la+!aBGit)3gUVgE{^I}!prHDowt4^SXXHKK z!WX;^%Ckt?8GeEx-Sg@4yR$!HZwGDMWIFsbV6S+Mr8kF&4&Bu$d?#qLuioFmJT_43 zzG|Kiy88@c(k12LI=C|s`0+aw9_Bo-jNpD+S|rQ>?SR-%?stSeis~T5;VbhyWUdRH$Yf*^kY36 z3^A#yGQS#VtBXgO|M0OJU3yJ!cSf!h6b+O&U_8fED!RCAwGNwL-Mx0_O(aJ*Td++) z>v{JB`K6hue<^N*+XtvLvW)m8mqsa1tAujKlnLiAT7&6LsyD-$ui?3q#&zlRw%-nG z6$s4+U{XGM$|%r!LiC`5}CjEw3-KkO}Em0!fyM>?6E^j#x1VM%e zc7rd}WMDokb5tqN!~AfJrdg&vcH8ftlUrPTi4Ojopu1;Jcq{u+7QJT{rHp+RyjX96 zBGmpV8ng>*lG$F!Z-#u!n(oXck$W+@t%P*5bP~_lB0rTBuPOf1py3cGi6uB;*7U!c zD<-Lqt&lb4k0i)a!`yzR1}89n9b|UB3M0A8u4-#tMF6iNsGic`@0c4wGDm}-kvA@5 zF8uD1Wm7alUjy!^@Bvk1*!_am`tobP7xG)sM3t9`#cRbx!<_g{dk3K9uuIEK4*Gz z{Kzq+)t-JXO+^m_gc;@EAA5xT+NczhEUnR;)t}#s0jZal!5iWO&U$|9?qv~*?CHIu=pnEM(& zDLriEhBTyC5ep?L*b(Y-aApQFis!VG^z>+mF9x2e@1 z;@Po;8!wm+7mHO(xF;F#d)Y_>!smC zB6-f5ac|g0mxu!?*{LwiHtd)VN~PX{FYKQVZn-iC&`Piw#CJR(9o;Bh{e0Alfm_;p zx}1gf=raYFWF>O^^&!6=z%Pn>Tu%ZV0bT54&A+>;06b!OqWN-<2AbdS4H?_9$2cQ_ zKCZR@E4ATSr*xoaRPPE*toGZx(yS=wT zPAw`Pk=iSB4Dn}TN9T=J$P}BUo3WV-3rQR6^S$&->AKXGvPDLY<(ZEDLsi7{5v=H? zp&JWzbGn}6b12T4k#}~*H6t)TqisBIa$e|v4dlR0mbuQSIzc^4_l}ei#)@&bNOm{p zR+!`>eQ3}X44xP-@{Z|-6@Ad8} z5Uk>SrndTgGy@CnT8ipy=Q|a-L%|6{BPy43@rle#9rC?ddW`FZ5Qh^0dZn!|jd`es znh~wuOsJN!%n#i+D#twUOVVQD?hCQELB1cOg5ij^3_gvSSL%z0{9f-LB@>TtSl<1t zFaALHU=PqYUz0~X+g&XX+*3L8Qw?)Y)e8I;2cCBv%U4+%n&kyFX)k~ zv1TC)SkEEO4@VA^IY0Jn9}z4ZMB}Fm>!2K}%TyBi?1N<J8Pd@ztP6{ZY3%{G64Lf>GdVnv<-wvzSYnH;mbq8s;okEeU;S`|iA^Wu>DJ#v9B6RJ$k^_*7%DJ{Wg& zU)R_-`-lQ$ZQ^94VSo_pyBRyh#lCrUg855a(#C#uWwBq?r?aaY*te%5JCJ5SRa9DP zzwcXK$Y$a_evxKk9zoZ2%;VIVTMCg~H?H|S`J>LyPZ9EM&0c}}HRa3wJ2RB81JfR= zynR*j2xl5}mq~1ss)}cSJ#hd_ludNTOHD61x5#aKwdf1|9&sl6B)8_{F}|%n#1T7U z?7c~*gM;I`#T9k&GSE|Ag)aaLME!Wj=yJifK;+FGgx_J5!?k*A8&edMac4GV8m{K< ze0CwjW4^KG{?6R5F?#JKtG_f*g2D``h=h%pdb<2@NYMlYj~jHe+nIk@7FD&)ls!1M zp?aZxthoC~*m5I-;8-&=?}Or5JfsT=ecuQYyT~xNXw}U9{nyV@^Vn-e=Wji0?wi>N zXP1{N(XpVqDt+ClrILwI`_pTaJZ$S5kQXlBz9AT>z&74{`^?*pT3GlIHO)YG1{04f zl7G1XKQb97N=jr>RpS_P)j8||q_BjZoL{^7;UZ$~jc+{yqaH!px4$&2OCZQ|R$21P z(ML7f``)QVeCV<^vN(rg7q_SA=R4a_BI2W%9sZU60~)-N?v9`VY_WU_}x7tnvvFu659 z9Gw-?OPV=~jBA%C_C3^N99^RRK`P{poZcwxxo`a&@LVdz?0_(LjQ`Z>-pjf5YREg! z72?ox=Q+lE>JzME4MJ{e*U$HRp&W0C67qWV5hYAM=0mj~C;qTDG<&Xpx19R!_@T|( zEZ8`m&6wIQJES*1e=2->sxfGJ%f|bT-q4MTZ1wHo#~NNQ;@m=lOL<3zo*Q-4xt^Nx zq1>7b+2EWX5$AH>yq^b_)_hrpk)4S!(;~PuFXYcs@Wr%HSxWtsLkg#VOWCyLJ+W>K9)S+bNQgq z74KFl>{k&P8H07!C@Io#?2}f8xyNd37+(XjYm3my4PycDdLgD57}B3U!e=p z>N}@pJzR2K#@f}`X(a}unW=7(;_@d}vZmtAv0Eb3%XVu6SONLR{i@~8V|6f5`l!(h zyMw5dr^iSeSIDPepS7GG2Mjx=Ka_ql(uy6km6qsBe=hjtsa7;tI?_@E0^5r@C_eNI z8eV)ir{o15YDj#}yt(~|fLNJB^!H_N+`G+%=zwG+o#*>5gG0mt^ho9F`?vNGE2pcc z?4`tG$bvr%B4hNhU&Uob^FN=T1}kwyo`cLV+fCpMMIeaenEm6fpZVuPT#&rL_g^1i zgZ1~&PR0h4)~1B(^3m| zXa&Bj0Z*P(BiP)2A9Vc_$ovUgG0s|Z#WdE~!zwx-=jQt`!eX5)Z_vsjtnDL3eBO&c z0@S4SdiXR9&f}Z8a|s$iJv1pYJ0IKD%KQsIa2 zaHTLe2GDI$VqaKx>`E9-7nE5j80xCF=@zjYoM?1ho&^0xwIGuHv*O(xD(teMwEco+ zyp~H>@>u^XhR92)U(lmF)8e^6rbzo7R#rVFFrO=8le2GDdJJnZHGcEnBFv2a7}}14 zy?t|?(5b0E8TsmwPB6c_^i=AX{M{0@mpYHOk`C*2BwKSsMh z5)IT*k1cH3jo~sy&nGWtV!l#H9;JO89OQwr%6lXS%%C1XLA={m3LeK-hsTBB3yeOV6OTWT#4d0UwMYN8s(WLuTeUq&s;qEiZkH>k z2bvkZ5JP%nYS*|tK6Axv{ybajqXkF`pCB2pC{peWS;sdSCBH})-bx9Sdq~s!3~tN| zh1ADx#MTv&PRadMQ1-3?cJ+}Qqq=~ac#HY*K3_Wstx z%0JTyy`V71l(-%+_co@I`51qQJQ>W@A^CjWqZ7MyznFeKwy^Ih=dTLKmx1!a7Y=zI zBU&%Juplb*{2AhM#muR7kmpeFCq-DebD#kw&;`dL^-IfEO}Yukr+H!czJre`T`92^ z80)j26JP|R_j%b+OY~Wx`2Df{-7(9?N`!wfB5%opz5-oNA+pMrYt2a-Ph+0i?998~ z`Z5T(_>Lgn+GEH9b;)4Dlwba6gALqVnUJqmpWm?o^#*p2J%r?IMtx9BA(atkP_OWw zscr7$p;bB}H?+ujVjEP#Kq?J`1$E)u zgn2YXncw4w$Rrhn8t@EspOo0&;RAQyysr-$=o57qI9FoZoe>$a4WAEldIu=TIn#Dc zcV3)HjBHImfZ0S=iQoMQCK3=58?kTvK~J;Z#)MF}V79FH3w5>b$0vQlFeA)egmYbO z4<5{JpNnpUY86h?9N4hegj=QjAqeIDx+3frUEF|h%C8|Ogy_)@kVBIR{-Ct;`qIN5 z*zbE%6+(NUT@m^-4)C=(@VL3gMb_ERI90`zth`lxfaZSXes*%w-pWI{yxNs8p{#B# zDb080H6}DCBno-+CyYVKWc&9bm3197N?6;J)ORa8PRaP9OEqK9z2*p*ikoPBD846f zv^dv7iL^ z@vX*td%(ib>`%RQ0GXq!$SEoR?i6&{D14d=N|qah4+6+mr6p7lo66wMdwc*De3Rnp zHG&+8z);_|ou!)=QZL2~t)XQ3L7X{1)A<_zZBNnLpPtHpiaI4DN%!s2Lt4kJs`Psi zF3BKvVp4oZcRUZXa{g8`n%K>lX>C`@OPmS|*0MShab5p=foYkb_iOg4FaCf(x(bzF z`ztN|MFYC)5psIT$s@1oTDhjeY=}+HYOXQN$BAXU86HZSY(GS9aO@`U*bX^vfu(5s zhaXm;77cX$to;1^@#SCi=@_i@CD_a~_Y-Cw$wB_nO<&CpL0S2jD+(2dxvEPD1n?7W zU)hzR>YbKDWSHBWI;D8#*ZEBq6;3i*O5x{{Kxg-sS`^b7PP%=$ZP44Tc?WzI9NNTM zecko%JZxG7Xx~9sz7RhEdp()axRI0|P+>u+4&bF@B4yA_`&%oe-7hnrbgmsZx2wfT ze47VncX8`k=c>ih=GMpy0(|P$*LV^}&If2RoLmxxplExizkt$z2^ zSjLJo7tyMDuP9~L;aqfqO^-4mVd{!c< zK^9AsT^o$Pr_*ufuUbE8)R^~=*m27`sSGg=3lHbnK&OyeC}azfNQhn$_owW)*)#2{ zUGSKBP8_v^EIvv05nep3EH6}Bih-?!+q`q$K3K?p-Q$%~{Fsgb_WyH$i~_`zdrKGB zAww~TgFK(na!&uvFUNbJ%cJJMnlR=Nf1_@tf$AC{_Ct&RAS{XZ7T+%*>w|VlnxlRAAHCtae3q+*$Eetf;k2YRtY$=LcR}aik-l-2g9O`>p zd^1awWUE{~@XSNAx^xhR?zfZNk@|F(qV3kqP#O1INi4}2iI}H#Cz8*g(!09_|8uFr zh~<92k2(}OnBY{&TiAbM%`9+ty}sfzbcm0jYp+L1|H4axWUBC==1Wi`u}9@ccw?VU z3obuT7PRl-qOnjaA2l|U756F@uc6JXNf23?URs+NS!^6c>EdMb_f{f*#aIMXfW+3r z5X~K>@z(rx_=T;+&GI;Jv*ZExjr75!+L4PSIMyz7vCh2xLzCpuXROeCH8bWmY6oI~ zohkKXe<{A41F$Q}8594pIj3I63W?l-eu_4dEF3R=VB^#wv+ZIfMzdn>r2i?v5jP~?~P|=Hab5NPm0nLfdE2#=E>9Uw1r*f}e&+zJEQ=8W5 zdAXr}-?xNd?TjUPLY1xgY8u4Y4U!HI<_;%~I5ypZBX4Ee^a- zBe{Bu-@6#^2*JAky@T#XYbZ3!X(Ho9gjOs3(oR}b&Q*=BTZsLPhE!0*`pn?2+?U_g zKa~kHz(Zzbz&t#{CVSoLgpd2^wP{^LfD(8-kq)>dfAlOdYy(ul-$4F4mJNBK{^#?G zzJ;YWoyp^ODv;CEJnPsd`Rm{VXiD~{EfVLl543jINGt6W+jjQ=q@V}#=!4x>t5r~( zL)-MV+S~xDyIhAwzfyI@vlRR`oaAzlqc6aGW>`LCe26aPXf6l~BUFXQKH3mWUw6lA z6(+m3*kdrkI2)p<>&2K&K=l|vdBkv`zrZj}<%u42{jP#6kD1Go2)rR3YUId@8GvAY zsN;*)N+>xErFFnQL}@f}U`N9`blu1bupr(2d>xGemV;MAQ7==MW4t&vAsv&HOS`SXS`8+#o1)FZ1PfWDp{j}RB{eIqJ(`SQZ;UMc2{qR)Re(B&% zEJ@5(&j3J$(u)mLP=NSXI`lCE9|%X)9$+5yK(B0g=oc{L4mIq8bb`*tSYRLs*aE5I z_eCf0-}s3=qfdyye6P9Z#eQPF?GGXmik|?PKe4V3&DRbc0aSAeqkh{>pyS$Be?4bB`zb+ne2$q7 z*AQ0UktB8S!7s1fU$`9U=tel1g{H|(apB{%gw{2aBtIU*V@j4k9K0))k=kUiEcaPo%5<-R;Nf}u$U#yg0 zy*G>t0G@7rUU@Ciy0@Lh57-<2F@g39P8mfH<&M~p%`zV&RxyoQ`v5}Z$d}$7&3ph@ z$@XWj<7VGJhMeQXGp?sOWX<0b*Y>F%TR48rw*hpeZ}W&$!5q4VikDV_{d}+%%+oT$ z3qsB;&j&p&$}Yhk2r?d#2gDUqrBOcN-Xhmzt9eZlEomd%{ZrE26JoTO#TT9~m*~(& zcqeJ)w_=>H@T5SeaQbK6lQ{1pY3zur(20hda$1DeyIe_0maj7Pr#w6r>9Gas-CTR0lIw!+F9!D&<|7^a+AZ7k`Eu-VE-B-&xB>;8ud7e_l{>p=UhUfakyet zoVUy+{sxmww};)OjYZ$ySwlH@R-y{PeOmp52mxaoqGk$wUd($9Mv-JM`3kOrYO%*w z)LGMTe8Jtd!Wt0f(Y_TV?@w_XOS((_9n7y7)`8)|Mz$1tD^j-rHny9ofcT!&*d!D~ z8sLd!3?<$#<<{f9jW6wi%GNdiMSBbTbRX3b9^3g3&8C4oMg3c6F8s+GiTAFsKo{=V zW@Kd^CHef+O0m}TqsNZfX;xocNV%<9jrVT9ti|+b$feU@;WqauliHU@|5`Y3^8Z)f z2cr_RA&RiHL#PZoin0p#cJp#~ZT|jf^g16~t#)QtLW;U?bzY}=iQTnsYfruWiu!~+ z-KZ;XW44KU8|&826QWCt9gnmt-zSZ}mTg^HGr8Q-PH0sRFCSTItmjsZ9IImI+tIgO$3|^ zZ85k}Zp|;@2!X=P8z%PO58;j@rV;#xM&|zOIq=?m$Lw|STI+Sw@%DFzziNdl5&GY# zy_`RdtG&8&)hPm^1hERqq2(fN(ggb2q;k~3} zjbaelE{-!!p+OJP4&mNMNaOVAYD9!kvic>Qsx1b;UTbzy^0QJ5d;Jd1y|!$0Sx9X2 zzZEqDg}83=>kuBj&Yuk!gsbu;m#mXxEr!2NN}w5W$tnkex9GFN@ljHSvQeK(hUP}{ zwEOUoZAlH#1Onlv{=J87q*?2&Xo>g!P?fjqN>|e?on8O=L8`8{p=zO35ZXzdhQPEm z@a5Su5c{$VCr#Q&OtC))(UIY8^*PuO9shGf1bILT)*}iZVUOJ8Y>d51NYMUr-pLBk z=ik2d_9E5p0lJAH6)b6jbGc#W`$F2%bVt%K-8Af|0n-v#WH}c>X$v>{ubl@DMh%c> zt%S$}qSMY`gt5a!gVIvQ^m~DYoG2&>am}IJ;(;KCQn%Bl9xd_ZxJhn@t@PscV1 z`-!nK=P^#bT4fiNUT}$U;x>1Hu$pKB3_W(2#<{gi52$T1%V(+@-x!&z;8Xii#u0ba zJ~PX;Rko3HZhTg!`qN!(`!!WTQ;53F=8ZM6ZS>h(698wFSmSDm2H=vC|bu_L^sgQC(2$hr^(UWHoud{;-v`g@x;Sal)g1 zut76^Csx{emZ(`*vJ6d)At(Kxsx`Cc^yl6tLL%<=+oF@8?mrY@EX=;}6DCzJ;}5Zs zKNDVorh~?kS|A#~nVw!QgjB>0?n=)R*skQi!`pC=W~YcYpN8s{_JK#H-=UQ5C8uJ939g2fw2D)&pmRxqUXHo* zed|*Xt;6k&qXddpadwT+I;tr*4-`mWH@Pb^Wk&UF<(sqXI&5lIn$@E^f{DcZ{)Y)I zLe6GvjesjIMuJ_Bz%iEYCU%9w~)&II=&1ll7-}xKK-)ccN zV;y`I4~Y!>{@#TXgCqX7Tffh0R+-DKh@mD~JFqjn-UaQFnc9b8wYCofC>od6%t2(y z4TZI+db&M#4ma9aPCSZ!4x{FIO^~5miH6A<)qdk`6?(v)=%|za*Z>w&@ev`I%^D1+ zmOT4kF-Qk#G}%9YmFA@dKcUKYqXiQTDhhHdC{K4PKCxjRKTKw*?B^|De|6q*6noiM z`Wlbteer?$bpBQ2_x@0>P)&?-%-uOX6)SdGdTM9RGr^OKSNyY#tNrU}Y17PmbR>^( zPY*w3f+3H=wGu|GMenB@UT|}18Wd`s3$_GjuGwOv7@7=?dS;Jey;0pF4q{Wvzq4_E zRRJrKuF>Z|Js%9pvm_fmA2@!xL`Y!u3)^j5n7aJRyL^WlH##-j(=UdE42u^tz)J$8 zQa(Iw1@Wy5MnV%1^!>y&hLp|wTTtrV{-|0bQsnUFv?||c6`i}*g_yGyT5`MYTvb<= z;p|d>x|(#A?>+N+lAk9yE#(wI0&zvGu`7Y!mKD0&4x%>+7%o=Je^u93@I_fx2l;Az zUXJFeQ8Sv3?fotj_pFKhr6!jtKGYRS5dmB_H0$lSn9|N_x$5AT6>|oRhKtdDHbeOf zShn;fgVN7b^zF0h(OP;RurZ&{MB00&<(4y_yusQwFsE6XUojp3QKj3$u@TgldVz#+ zJmKXd=dGXf2*+nQ=BgYp`qm?SzMX>eD7Th>1+0mg zke7-aIsmf6d;9N1x5Y2GJyT8$KVZ-0J$c{vm9agq`h1@dC4u|BYNRtgRu(iV$HzV_ ztU;}l0q?!)aNBJfIieTt-! z{)-?daVqEV;lfz4-IsAYX8@|;Q4?e48CSX9XWC0_ib$~DNptvmKBhd@@zT=b{JdQv zLw+mmvWj5s!(mOS(wCcLuN=~;aI%S_*ip5S?{g!5x^KNwkJPnw)!EwS{u=H#+$`&( zt$A_l_u=W?cb*~6hJs^duwgiN;-w@Z2l?k@4=K)N_HzeOTy(QagaljSbdcfqPdMVb zhP@GEX#+iz=dWe5gXHLUnCuWQ<0bMj&xW%+Mw(P-?+AjsfkNXCPGo~RieyO%VB@-#CqgO(_xMyMrfLs5 zlCH@31WV(JM)jXJjeflBBBW^*cU>WM0Lu0nDc<~mV*}{l%5DRe_#G^n*TA4;;uk?YVUO|;{sFI6I{wx_-=YH2A@^cPG!SUpmw-EAwPt7At;m^h;Wn z==#ac6?o&6brO3`AYAO^i>d??)HwPYz=At_dCKvxKYRUpVDY?=B7~h&&7l z=A}Cm8)OgttbUOqT=80)%ZXR~H;XI@6^8vzs#_8V9l|&B#EL&?>b;oiQaw0yVDO6# z>y+WU$G{cxP9b;WjcmK#YUM=FQZj0$R5WU+u)$*D^02>s!HQEjZOlog(l)`zMA-n_ zso_^@fyT+QiYH%z4pU0vQ7=hgL@c|woTEWqWPtS1O)P>4$O9DS1q4a~H;cyx+d`je zCPrqXe`>LfK2#Lq{l+5_d#8QSb#*NqDHhuht%PX$2${~G@SAIG-nf&H)=8RwUpxb8 zU0QHGKZX&ifEEXC=L7|%A!*&TEN1!?CWNihU@6D7x|EV2(es8zq8 zV%b_%W%Dn7FXeB772@6BIux?Wv0t-EjQFWFHoXCfTXEycCw{O8sLw0n!*5EevW+bu z-Leg)pnVT+omcn*&Q(vI^F7bh5?lHVLRGK9Md$KdJ{dPEZO3cJ zaCT5vwwkljLEdUf&@um>=E1^V+D+Rp-!@8zKIL5VaZPZvdS73v{mud7+`;8~zMofB zhVSHJag%!o;4h}q54U{6qLd!hSC1Mk>$UdhGDywoLn<$wI+qT7haCf7ASDWcd^H_pOSz8`+;Tz@hrk?$MV zt#my~thUIf1UR2KH@vVwtmipmv(YFmdT27X^7nvVNtDq(3(w89Zx(m+t7TWOr-q4V z)1O}*4?RLI5;L)0q+1lLn{ZvNVyk*4KVMMPl}NBGTUgmLa^u$b{317#==K7?`Bpt9 zC%2$hQbOO1>ITWsZx(uuoPC1Z={6KG0;U-Vplj{Vs!6I{vs%<`hV$7K;J9VBI9SAE z$$#FY$ok1pnRCiK=nSkV%6A;-cW95Z_UA4?_sV8Ui zEs7z_>!uVjTvqd*jIxcRZ70qT--y+%TAiKLx^|A`L6KqGR$E7UuX?b-m>NqPL26K- zfAox!-(rIN(g8^BI5R?U@H!$=HBQpGM8kTK?U-D_>Mwq}Z*!|8R!ca7MU=t$6*JSt zjB?@bM$H?itO}%=xrmc~Zl5!&qs+Qh{YF5tVt%P=*#PM;K*wSDpQ(8&A6W1{x#PplJdGiL%pcZ z@kT~@Jy%LN9Z5JhaL_77RG9zth=Hux1_C!SW=QwxJ@epJ_z-#0WGn9zR^+N2>gav zu>^T=DLRLp*hC?a@nd=Vf%kN?neN=OD=q-~(e;wHJ^|1>d(swEz6Qwu?u_oLANovK zp%8D7GI%6>cFkldE6!UjGlu!X^P6lXK4v}5?h~=`8<(Y?8O2J~wo3Y)v`=a{<;3U8 z%KjiMuq#Gdt!oZ?2mu5YcOU$wfjWKcBj=6Q>1|2M1<)W{4=*bl#Sv?01R@nu z1%h+%-bu0oMWl=Y5plj~&6Y?gtFLcPMv05XM$p?#i}>o7l|Na0o}mr(QmgIL>I@I4 zS-N^u8d|Z$<4*;!Lhq?Fn-j$D*LAZF#PKd6@l@<%bkbmnQOwj)`YJ4^N*2IFe&e4k zz8MNP&KUi;1jyYdG`|Ugf0hxo`QaF5WAIuZnKRw}G;CD^d>_we-*r&1tSG+P8*t%j zt;sfe&6KJOo;3*}t-}ZSGM}HO_l{I>9zo$~*C|koV!N$rduL+??QW?K<7!8mgW$oz zeO29Yw7TL8N5k*u6x6I@8jeH7+3$`%wiw0{9~^_A7XN@5&|&{N4F(G3X5PI|0b21PR)?Omd;o``33VpIVEAn02nm89Eol zUciGN@{PA(b?Da%!pdGD54dO$U>EiO2JDi5jZ{O38NwI|#5&*vtuZ-!%TXtAqso@J zp>ct%xuE!Q9{h^&XHud*JXaFs;b!?%9XPxzy6Ur_DS2E#gFgqFlNYl#+MNT6o@+Le zgZ8!T*0-n}zQ~IzX1;wEB_(sonw?oz508}96y%8SK)Z}eOwMmS_%I3!%Kw42Ir%+b zoB-88S#}N9f`O}^kult=6{lT8cP2&N1iQbbeCuW6f?2=1*!3$PY-1L;=fAMlt#Y`4 z2zV|SkjSr_S21DtZ3sA`O-Ew(=vH6Z^uZ*(cMO(0b|-BeDdDr>?g@~(!ZYjTN1{c& z!=xW2iKJ{El81m#iJgTet;^$->&`x{rXg|OgG$R#3^z1n^SbV+T%Fz)2(~7=ASa!p zbK!jN>5rQ)e?R?y3R+32|Gk0((+T_%Esqh8{%pBDQj{if7YYzGKeHy|H-WD!b~$Mb zpfrUGf3ZP|w-l{@117Pg<%1I!P#c(BwRhh#tX(K9KNO6HIj3NEr9z**l8Vssf)Gi7 zkT@@a(Gn>SMiOxwdY-Hp@6Q_JIfC$#dY_mLzTzadMjlu<1sv3!L!4pqsn6jWFR58o zF0o^Shn?%p%zWqGs^T{)A8oSjj32gxZ2~FXJ}P(B7ll#0Q%SsDOpjf@d9{#NluWX| z=acsV)F@J~VYqT4Sl$j*+ez5p>aU~Kn-O;$V*DuyUP_xikG(&dp-Ni{Y?3?--aJts z;Ud;q?QU-vMlcH*Knco872su34K0oNbcG`nl|*Jw@UK8Xio+sATFmB^k6u_I*Jvv= zZahkI{)|PVk!hVnl!aAyOXDfFx3iZnJv;V!y=K|JfD_@0zZM-2{V+li0uB*bh{2i1 z&9Jw0g_<8#u|lkU>puteX;_2_VuD}X9tSOw_;91|52(g+o~I`Z1g%t$(?77JrIzDV z49GyZv!0s*^ja16u9FmKYxz_(O7_v_KG=;J01;LXX{U+3+g{6*Geha-@IU{1x!O;& zR=Mgev%!Z?&0YrSfFjZiZwqE%34PM-h#NGXnP9dr9KrO&1Zm^;V(NC@R)T~AimX82 zX@Pan*W2mdPB`AHZY1{nyb}EDktk6nZg$Hm1`QpqGMJM{m}n__Ok0pV1-c8r$zaoI z0A|&t)>Gi&6+$y3S#ip5MZp7@sabWK5p}ca$CBTjL9qWy)!Q^2C(`nO>c1S2_x>Ci z*>I9&$k~cRC^{GLO&I-G7yhXVL8z#D!jLCqu5NFkF2rnRe^PFbGuDR<PUjkS-+BMH^E?6( z0BWt;l#uwg^2gtsM_~}#_y}DScwJs{eMYfCL5o`F6kdKukzpi2z2x7egRJNHekr|} zphssu~m3*5)h-F=ZYZuO3eH)zW)`0hXMly5{%levF3%08$F zT!!t{%T|iNaC(h`n&0vB z-_jmF2YkubNSMUjL2fGpUxbfBfj}^{E`LScgXXkdOXNwrAD^DhkKS9Rk&PK#pkWoe zAlqF;@+H4F(GZq{^Z`&KejRx&j0k#*+WO=As$Pohdj+a_;9eaP`=nl&HRu}W+W&jb zH@|jkUjA`wQD%~7{Be*Nsf3!JtY|o%((a|~LC`qVx^NlY=KNh^dAf^~upgD)$@K!gGUu02Gx|1U7 zk9vRh%~iq&%q}z>4x#SBn}0U9Hu1tkprHhRO49w#r32atVwwUb#b;bhGpEbwNqTkH zZ$=GBTYX_H0pcyYsJVs7tZFak9^q~G!&a)y?qxXjcn5Rbl>Xv`{lTpo9Tnh%ZPGP& zFRuI$?#D};nMdP>Q-qn+L=(V5ImfKz9CI?i3xdy@2L7Y`+7k@%`@H3Y&IUH{>zw$)T zz+&i-c)$SwFH=+-p-hBUqo0B3B53py92H(>h%eLxozz44kTq zchtLI>GV+2?7C9+Xt%;JclNCCwjil?1bZk8>`cFP6qSp} zMF!WsY3k?@qfBUVy-g;WFC=G%Koc$cfHdn89bYT|C#&!e5kb9YOb} zi8+1G%CB0g9G4QroJPV#4m3v{Kn~Zj@a4i%STyGf-rnLjgtwBvMl_4B`qO)lsENJK&~H_w%|yLLgU# zIpkB8p;d_8$^3l=Egb~31f26ewb-ydzUAW%yD(%~}VYa3)7#WV!g>vvXu zSps;to*q>r<)7>B3#=qJL%+r7!e zaH!~0pxG_MAQ_-kp$wMiqHsU^Z)A?~e@Eur{PtO}`_b8P?qv#CmtEX7&ceZ=0Fxn9 zFqsc6q3y|NcsRzvkF%O5m_P%Tb5FrNgA~vzP?qI1Qpqb*vw9F~2vy|eC{_uZN zty7CMSc@o${swh;0D;tr(`adEoNb(bT22;BjqVEfzKB}lk^A$=7Xn^X*5ZG`R``IB z((JSH$kz21d;*Xi`N<4{SLZ3${IHl(sd^LnMm3B#l830VyB_DdG>=aUUS16PItU|bXBcP7*gu5p9+?r z!;OB&1^`~XUXZlaRrM)BC4OV}z3^5WvNx;)t}yjWO9o~WzDscj||^g;ujiw z=v5svveG{CdwppKi7!#6og<~8YoCkB)mN}9%N^#)OF)Yv5Hj!FQ5pd1PLC(>)<9N~SGjEmzw#xHS zbj=1gAiKEDZGN8wVhp|2KH&YJvFf5x!oCEBCHCJXS$lAJV>mIF5$2-{Ark)5!sUl4 zoDi;UI`}xIoN&vG3XK-a=*(umw=S~m+g}w=sCnV2PM8_V_@~I&fJ783k;HHa*O8Fl zOChZAEPkZK%sbtk$Y5b?$wJ+UBP!F)4R#jNQA1aMlzRHw78c%;J|SVIeqr!VFc;Ai za7UUp1be)$kac<@z$vrAKlsp09fGZ>nUPu6?Sv!kB@NXQteeX9y4bn?f|U64w;nt% z8l9r-eDg5Wwu7)BGVzf1q%VQGQkqAIg*cS+ry`kaxi>eaONi&k9|B*orVCh+B)`!B? zcFEm)ERJksuc^o|SCPZEb76Ha}(OQ0CXm7-?n5BqO-B4zBWhPsq3@5A( z{K~V<9ANC{21Wtfrl4X~ZfL-JWv84&L~7qp$C5k}N;5z2w_-l4ba&%lz(_mwXHb>iJ5X zjyKXFi((>8hz{x&%|Z9n$KZZ$%wdrJHsg2jg@TO3Rp?BE)x5)@qz?uCtr2+fz$318trxZr14(eN zwPlYSc0u+#5OU_>k%blroxCJ9Smx>L8r1;? zbrMPmor(UC^J=b(AkEPM#Nhu@6N@bAp9>G{z3&~d*m^w$Y^2VSS?V#$K( zVP8@Qm509vJy}UQ$wi~SL33c%BfK_>zNvWDIOVrzBj{Q$5u&x&PVzuZhl-+UJ8@z8 z_Mmdl^9X(j)F{OWbG6<61`Bg`CC5)T9WOGC843cAY=x;pVf9*W-hoG{b5T2{ouvsy z+fY}RxI~VHgUOG;+@|;&RSf)nzILGp(2_8w<@={P6;p?hi6up|T*6KWcV{;}ZA;Y# zN$O`}LW-(-`1P5IIPc-PH3tXgebyqGfRY++Sv#+-72hp`g`UQS3!mdR4Q%Hpenzbf z?Wb3DKa6_NEwZSqezDCV*Z`(UIJ%9{x*RD=ve~^hynpaK!x)q9TW2`U8yqKZzLaVW zw-%+6SW^55)lz3C+G*d3)2zdBbM4do)?H5)*CM|UQL2f);%mpcrFRc&XT}^;a%A&$BUYSx5AY$!yK0)jx1l^UCZOB2UjNETkPiwkP}f?{9GJm9R~S zZb~MZ2MU6*%Qv2+N8(XGqetdII6C#zy`SejGmq@E(PEc3_E)i_fEMOu_OF0^O8!j- zIT*;;i2s&FiUILI61~~V|IA*Bk3K#y(9y!Aqn`o^q-YanSon8P|xf9bR5p4SklEq!VhmkQ^k5(qiP-`Ixr-EtG|i;q{IVA?4h^8 ziJ&~$i3_aTXT1R(yz#LOL~ykHC#WoRobL?}$G4RtQQGkJHFqaYaO-{WVjM{sQaPP& zkOLMT%#LKqPCEq$Wx~`ZllL){{n#Nb6x5lY^ytx@j|$vL+vZqCE1;q73BnMfU1*hd7<*j=;z^^Y6;1@b%A5sD1BNsS-<;g zNq&8{anfVP8rNqwnpvGse47SS+dGIXV{T`P?^&E|Cv8Lb2Y}gYAyvw$JLG=u;x?#m%zCff$^n!r1kNVdK zr{5;WZEpQGP4Wf$!wdFKDKL0j);Mzx{a^fHj&W+ZXmZ+vBnsnq)S!?1tP;FfU$!;3 zzHQoeZ8^!jGyHq=r6_6rj`{zPZo%ez;E5_F=hrmVBM4wuoNy1QVe#{SUm`QpkRG2R zAtpTKiz7XJ6hp;NKK!LaKo5LMeU8or$lrkIu^a}*S*RNk!PKZW{7usO)7oJQurns! zP}0adbRqG65P~;MM$?P4KLyWE*@G8Oxjy)tn2pALowmc^WDTns%}*oA<+DL=g*LJA?R$B1r%Fy1#8y2EH`$A0!R@rBQG6&qDnA4Z#UqF4nFG@a-RW3HwzBV zwITu1G{I+K`50dG9Wb9FEdaP66Bb~a%Hv}S?CMCTg-r6=5RcB3)>m1YEBEDVU|B32 zb*>HzLO9g-vV?;#O!lkY3vll39W1iRg)-4qt39ZT8t^20-^{TozX+1Cn||ebcJ=5k z_Yj@{r+7&rtITVKQdbX?VbbCH+GG)?9OE!$)iz}B;-sveSj@D=F+2sxA)EJjFuVU= zPHw)Q1-O0NG4XDES0+?3Gw^?rPtDUh7n&^%g)}3WV}$U^t^+;vP0B-5`cdpUeVd{{ zeH3?21}5LLEf`L|VEH%-H+KMTb5P;q{SJy3y%e5K7rCI;m;~F9*OjL;96BJ2usPpM z+xqgX{Z70AK|K$w8*(8Gs}B4-%zR@B{vcW3kvDA%VouPLtELGDH*Gt(f}x0$(Jl`P zh98aJ1T&PJv`EP-{%dJ$T-Ryg$5O`_HLhqQqpo=?O-2U!5sX^%#V>Z9lgLd8lY$*2IzI+q zU)g~hn*2~VdD2LQQuYinKhQ{l@kXpPbkDgSLh-_utB;!W%)~H?2AI9S83s&`S0*5C zy9F$j6X{=Cxm4T0vhmhD$dMZ^2kvk8!d`kSbJJ2o8m{>cxu!>m`NsyhCWtmI8_T;M zM)AUU^?{#1gJC=$Amg`LC<#Q*UW7vO_4TEL02O4TadDCNf%&Nb@>9#A`6 z2dY8ITl_wexh~6hW9eOf&F>+N+7+GmF!ZKh8KsHHrKWF7HbJmEiL7bN(-sb$8^}j- z_(=CP>|{UE=cv!{1p3`&b!;F~J+E+^$tmiTP55*bvGPMHG!TBH!)MXMru8SGZo>js zw$jPe!jvN?E|n97IM(1d%?038UKuazUl|XTO3OPEN#>pfb*mjxy&wbr;bMdSzf~eu z*>$e+#6DbnK|zLbN8FlOjL(- z#|$}D9^bKjlXy6=U9=zF^64Zvkkr=zha+4P0mvbn{pw^z4n!o2B%>R)RH#x(1@=n^ zP`v=?D==>Z!>Uraog)}l31i$P1CEje7e)|kZG?56m9q1L$8ls6Dytbz)uiU}T2`lW z1^?MgYO~%j~Zl*-wSyY4oSkEY4|qnNOM>5EP^sD5>Y}%lBy&MoaoILGvOM!qpQA%R}fd z$d()`=`nbbM^N~8m0J*r8{cT^w@hhGu>qCha@)G``;AU~wFQk^dt3v1#36l82$ z3Ya^Raz}yget8?R@7LfC7&}mg?BIgUjgNdPJUMZrC3s71Zj`N*0vNit0fv_cUR@G3 zm5M?t9V{xvbNXsp=&nc$$9BTZ585WC%P^_z4mn?<;NEoD6bt?{EGT98T9`qpkbN9F zRMk@NKR#bWe~7e@GGj;?)k}7H0#EhNU5usbHC}?qH2e7fh669sNbM%sL+4tcO5T+V z-hB)@*=~`3wwR&Vp5`rZF_mGlGpi+3vX3*tO-xB2Bv~Y2 zog;i|6JEkYsS*=zXfA@nz{QM{-Q-#D9CkOOkdx0L5?k8k~RnuOyOk zkLdEZ99HtX_&vK<7&HuED72`f!0##0DLi)+^$M1Rz`?iWiWKJp1Q^Qlv4QRJi<5?IZ;T?3;5YA<>*rd5Oau(&1o|w53X9j4H_oE@ z8Gt5d;XQH4qf=%hD>uLL%Lfk_ejg0BOYs9dqzzY#n-)UxKYQZX!C*zWJ5`gW6`f1C zJP!znZ)=K=q&wB^diK6E75A9^%8}{Ucx)erwl3G~)VUNTkWhGGUJY z-M`6uF_n>hA+XSKeqifOr^cFS&D z9ZLVb0H#j*MRjXl0hCu{h=~tl@SD9AT!HPFh{{Od z{_Z@~H0(dD9%S1L0^je9YrVH_TLM<(Prvo@^G z!>k*Mdm804P8ymh7{G3u_rtq`7cQ+8cJLOv&KabT_+Jaw0BGs@AoN@WLD~0pfDQ|y za{*7zQpD<9tqWFjeC3FK$NU3UC!LMadj&%utRkM*E(1Qu4rJ)BEq#QocJMImRYU>>Aw!+Lw0GlG&E2Uh9;7DbTu1;+AjQ=}c-YyG&qzJ@8J{tG zY_a>;9&66=7c5u7kjl^oGA{BTjZpwQGODiIn$Hc6f-|=Ph^%_`Sx`frWDhj6YW?l$ z6am^fNA83VfxJ(P*} z-b4uM0kgQy7nt(#{QEz63AqQGf^<5msX-*lR zTk~o#j&4PgZq_n(x1@?3MBd7NiM)Mk(}#J|P;S!Xz9D`ScSc`z2_D@|RpSty%c~%P zf3_4avG2#o|7n~ny@Y`9?(W)`l9N~q!9cq*B?!9om&1eQ4^a#-k&Y?_eWuG2fL*}x z(sI}&h!SCL@d9f}9qeODDZWw+abNNIZ+IK1NF|(^I{N>TDWgfU{72mYTJ>cAzapSK z!Ib=pYZ$%dj>#FPg0q(h_l|aKf$fgb*udmPgxl(-It3CvK&_7ZoVdGFMUa5W=w3nNwQ?@jei;c8D_tM!Tlyj)D$WT_+GyKFMl zg94t28{OncxAHVd6Du^s()y?QZij2Hpg+@ULm1Ud3~$Acw}gK+N$4rwRQtW+%vy{4 z=F_WCv4nkk>-c)y58DoucDFelX{qUC#B;!y#RHmL3|3h;?mu_=0Y=hY+Fu|*(+h2e z-NCeqrm=M=z?UK!a=Y{m4J*o1Fi)+xSt&ndZ)e{60wvC&h_>~35f z>ISeAzuL38`z-o}Z^`C#cuw8leYU;MzX0Fc!9Ku~l^#ET^FCz?*SlQ?j)8xuvd0oF z-i1v7`!r-ey5pBhlUi~VpZ0duy$vV83FKu+s2PJ{hyhRwuiaFY%I`V_#@#vptGp|Z zhr0dRjG+-dj3pvZV+vU(S+kB%*@mpyC6cYx8d*!064^?P)X%;|_H2Uo}?&*y#Lf8PIIfB6hE^S#e~-{;)-b*^(AD>#5G!DTdC9OQqLrd@8G&(VI+ zHV5?Qbkd=TSZ%`Hg6hs!uDVScchviN8ldzmf#W!kn@P-b9von1-v80eu2|(Cl2c># z5^o@Xj`jd(ISz9hq(*7|6Z)I;aS0!{F>*3v7Rq)ti{Pyela0&N!)EutiZ_&<{;+c* z;jtDv*G}oq^OwFSLAU3$ss52JuZFPIvW4C}>pXA|dn)(IejSgY!TLeX>o$Vt_%7@` z`13z3eCKPo1@HP;rbXyxR_5zg6?>r_^$Z%6ACfl5e}2#-Y?7@Vosl53Mymm2h9Hl$ z!PNG?Gp|LjzGsW0@Vd9OM&^T(j<4*uYqIykSWiVpjj_)lPqW((-sfR z|_QyFR#29d6!`>t#?1AK>8CDKCwE=rA_HS2OH6%F}jG zi$BP!oOj}di@(>NkbK!l)>g-Fe=vOUz>nN8Ff0j&C0%lcLhwJg;-gldep6|sLJbjr z)bg{9KrZ0x+JaBeC~vnQ1blrBBsKe`FAu(3Sh~GZpQ>J;6|R-Yx=Mu}z~=Lfr6!3? zE*@V7VXxzb@uv@+j5dl5JtxDO=i2i~Vv^2IT79D@(;&EiWgmfQpqMAjz`{E>o(bH^ z0O?!MQ3p9V2!Sqvl!Qe4jP!ZN(yB^z1qsTGnds=c8V=O`bbaUfAYv!=LdE?(a`Mi( zXB!iQ*II-swv?Wh8}xuFzU2p<58rGl%5m&Qft=FWc>-+?k>rLc%!Iwk+L)MYz=W-q>LF~s$BV%gKLi75k2T$0Ctkytp< z=uvLpCl@5v+USvHlc3XY7py#!;LDLfI@iv|a0}#>8_v3LkkWO9$LhET*~uhjkIyGk z`!O-|`rFA%IFA==UlH19OsH;!^5LP@_)3SdrHHtc^j%S;j_)*C+BJ=<#VwnseEzPg zfk%a2NoG}>YtuSbRqMlZ#?LmF@`5`?7Sm*;s^uYyy`M8$^94mWC(!W{a`7MNDE?wJ z5%A5g$bqM6_?E(>YN-z>_syEp($8^z>l>|3>%vW0cXc=L%hehEF4xQDv^9t|7XBlX zBXsmx&O4b2HTVhr zpVMRZXN?!K zT8K4MgzmRT8w^JNxT_UG(@UHl(&uqI-HsSun=rWdK)e;a28VW#|AQX8TS^6F+}}6PA2&z9 zivHV34cB8%N$rpTK6nN#oM0LoT#vPCXVp`G=*qYS6;T8C6h=|~r0EjefgEX!_-kNs zyb^u`O*NlFQ%x2`mi5Z%84z@g+o*!WRJ=%g`knc^&wuIqeaXC`&&#YrEUg8c=i#g6 z#kpf=buVug_QwyB-$aI{3m*O(75FISw-mTT=?7ZirGmRfng<{enxe-MZO;*k&U_aFFdyIK7RXL)Qj+bvi)<87Cmhg`Ikk z0(AX|TYOT7YuI79Cip-eQ_Q%y-%HzV9frsm`m%W47zX9-9)t*?aw++GjrF@=cSAbW z03lPv==F|yBkX2CnRE)H&CV0dOGM_|?kgs&P53<}$}~ zdC`a_+`CEJ@%h@t9Y!HYiFjmKC zZ7L$NKyw-n-tWiQOh$l_N7J~VZwGiDLI%7k>lp35-0zSLwF;6Af{|fG*Fl$7L)5a| z@FlcLoA(Au4V9AX77MrSf%b58)vodQKpjwOcULmLShy`X%|JeX-z`4ev9#YcV&o%S{YU^TtO@=Tbwt{IQ-m~S+Uk1KlzONSdo)4@lb`kFX`!7 zzAwZe}etU?>>l! zI;dCeu}`o}1Gv`A9jOjjpRFJ?ul1F5u#d(P<7T)QIc_KH*g?FkUR=a>P?0s^Po9LO zPT&GM=ek#!C6^TLomwwj0R1grwUS^zC5>{=GO^5~Rw#(+0$!%PwpN7UC?CFi?=9yp zn{+ENp1d%mDU!Z4%=TgC^iti0?cWDMlhE3&M180gIvfpzUQ$MHK$2obAl`kketESx zl5u)U0$=?&dZlfyQm(cL_zEY?A^4kW73SnO3u)GuCWgJax8Vrnz7I3fIMxR)5niT` zk`1QiU3*#5GZxH5_vDL?6^Hf`ycRz{OIf_<$``g3iM=Of1^R2AoI#2k({mF)^1hV; zByN;+kiLcYs&c!^1V_Yb$JFO_~bmY|qbPMJE9%SXggD~$$xdq!w4OaR)|U{W}O$Xq@_ z2%b>`gfZjZkJDFJ3O1q&)4K1itBotNB6U)xNrA*G;D)AIo%bldbl#ZSE9~n8(BgNA zTcEz9G7KfLP|)!B(M`iBq7~T&i&v@yxgIv{-umesgZuU&arEw>XZ07JrA}3*;-Nm$ z^`2g=o2g6*L&rv2_JPz$}92RlhD(kyRS`eO2(l1 zWzM#Kh2xKN(gjk6_tf67jK(Wzq|r<+vVSfT--U{Y2NZ>#!uptTDL>JMT|%O<#2NL< z&=pYe(-?+(S{A?onrL>DB@6_O#+Ro}Zjq`)d#5|>Sg66x;=(;$Vtt zUIA1pgZkPn<;_(afisVtplB)Q^iVz*N*ZPWWHcBthDZQTyihl#47i-8R!xO|NVzcZb4@oX|r*9=)?sTTPi9hDGfChL$CujHj@T*7QUon7e|gJ;7ra3Nki`Y z0tdoZ^Y1u#t~q^I_=L{pQO>ze{3W4-F@*ZP>H$i2#nKJy=@C@Hy0y=bD|5$4REytj zQvPR*o-(=xKs~}OMJd%}7l`8pdx_u3%m5hDS6x<)2+i}{sGQf-@K>S+l7TvCdLZ(bSPyypnt3%F6T&Hjw&dKA+`7h66hA#2n2al&nP|IC&-=I zD}|8tZyM#E11&OozDOcY3dZJSr$9x04(wA!Z!gMoa>J}O-~0mC78@j12f)Gq)5qLt z(2P*{;|bP}0TudBxhG_HQrR=Fk@E3@&$Th*PrbNZuAA;XzLe5a0#KjBgs-O+4DBFN&T6Tq|QH%Y6cS7A=+hgO1XptKmyrI9(uCw zh9gkxyIIv-IB2PhgQk&MCB_T;?xN!A+h7FT6IDmVehp1b5)x%E*y4uN-{zfoa#+-& zEdO@lhFcK3Q}f^XfxkidDJ%lM@Bab5n>@ditF|%!uI@DyTJ+l)Aq@hYe{%hAIvk1I zoryHwwCSyO;vn0+#)nif=R;cT+$}ynm1HN_c}5YO%ZbS6{rT7Dm8ky;zQTe7b*qzT ztus-E^uN_2g|4zd-(M*hUhcyjOXw1{{hEcEZ|ruBban1gIDeQ&*% zTvf^t6OWwa2@dO}2vYtOw%!k82f7^{?U4e!dhW33vX17DEQ4sc=Y~85T7uG7u_Q^! zltEo(LztJi?kFMihq~wnrD?BBNsNz1I)OJC9tq=yGz}C#ygh(u55^bfmSZ&0JUL;$C* z?YE&pw?Gg@Qcj0!phK@0$D@E9rf@ob3CjHt)j(dSlm7C*g@h1op~eBZ+STHchjV=w z)O?#Tg79v)ATc#+Zk!%cGX`lLc9a+-94nY9OEJk-Qk9Va`lJp1J^F zvBbFD9bk5ve@YKCQ|{(N_OKFeDJ%FJ#qL2AXIItHC+|a7BeDAM?oVjTP?R(=88T8x z?nxMJ0srXwEQM!p3Ka*eh;o?J0OBFA-NgBHV@w&itvPsVUSU{_P{Fzza)PK*N5DhQ#UowQ;BL|B@5EU9gd?>;}F@sns@~awxgC6|Xi|}`L z-nV3=?a@N|esB-pyMp;Z|*@>pdk`o$fv%<*1+6zDNlZ~cAAIvd2( zvY33|(vaEe3IUa)rS~0UeV_-GzKEo3R`SvvMvxQd%LlH|(#$!3^IWrHA!n?@wm^OG zF{14L_Ci1&<2U3?j0aVHGut61YJb@4-@^Ekh&ZIBDwo;NG#&v1k2EOWt7N65bXUA- zZYcs#35;o^=V=eN4(oMAU;F{|Q%x?mhtSm_4OY4)FEwbrqlNQ{ z8I>JV);y`cP`+wgZr5!F7e-t9eGSCqAaq~fV-PvA!<@j?G< z9na)IO|as~)f=2P)IigKA@AzR?B)lvNIR~X$9v*OM)lr7ZtnLL(gXB_>RC~$@4Uai zPE0L#A_|DuPT;woc+^`~*34MaIwz zDpCKj;o(8KL%ssN zfhwtBiWmYutFVJvJknQ^jm$0v-c%6@OyR^BMp1DO8XY(T`;`F}aXU&ad_NMw^eHB3 z7k|i`I>KEi4QWX<50PZ#M-m@`RQkh)Dlv$jQ?`afg)ii>x^h)MH*-WHjvW<>P*^&g z>5wsi+-b$;`Q&Ilzc|3PaxF%u>M=(Gr)Fw}V+Kx_vr@M4#3);^K+= zjA)@_0XJuawje%Ql#7c4HC{ayIi6&$3L6~4S08-%yt4>`Yd6b#Kg=p}(b5&6piz$C zmAX5}tT@1Jxr+1%Sb1BafPg}vF`&9#LmdYuUdnGMO;V~jn{;L zUu?J$m$@5jeOK?~88bLJIfh;M3rO)o1xkWfay)Y(F9P;NIVbyy3(QdrY0he|a4Wtm zy5)yd1UQI^CMpJ;9v%3^)?^Y{8q89x(LGuKJ7_axd&h6n3ClQn7CzSf9Q7*Gzt?me z60Zcv)dyV(o~jy0TYjeYQ@Z83xfp|qk739i?1XC^M3^G#D8-ED^4N~q#XpNQwZ!tp zL;0fEXacvh*qo~PfdB`>A~p>;hD}A1oI;x|hLNFp+8GBVML}nwsJ?6uY7-XhI;)mK zAdw3WY?4J~Z`5H=Sl$Ttk%l?aNcYT(jjj)@Y{4EF2@t~UD-bWtum8g$Q>&9(NHI;Jw9v`^j{L7-8ujO literal 0 HcmV?d00001 diff --git a/docs/assets/LDAP_DIT_root.drawio b/docs/assets/LDAP_DIT_root.drawio new file mode 100644 index 0000000..22f8de5 --- /dev/null +++ b/docs/assets/LDAP_DIT_root.drawio @@ -0,0 +1 @@ +5Vlbd5s4EP41frSPQIDh0bGTdNu0m8btbvLUoxgFU2PECuFLf/1KIBkEhOBcGp9T+xwbzehizXzfaEYewOl6d0lRsvxMfBwNTODvBnA2ME3XtfinEOwLgQNAIQho6BeiimAe/sKF0JDCLPRxqokYIRELE124IHGMF0yTIUrJVu/2QCJfEyQowA3BfIEiJR3Zpfzf0GdLKTccr1R8wGGwlIu75rhQ3KPFKqAki+WKAxM+5K9CvUZqLrn/dIl8sq2I4PkATikhrHha76Y4ErbV7XbxiPawH4pj1mcAwDdfry6/zy4+bbyfd2z2z8VqNYSO/HFsr0yCfW4h2SSULUlAYhSdl9KzfNNYTAt4q+xzRUjChQYX/sSM7aW3UcYIFy3ZOpJavAvZbCfH5429bMSkslDet5xeCpr7lqZISUYXuGOzhvQ1QzTArKujtIowRWUJaddLTNaY0T3vIFlgWs4IADm7IgKUKJUIDQ6j5EQTStG+0iEhYczSyjrXQlAuAi2jsYgLdZf3GGIY2hj+UPwQ1arsrxTlUDoCVoZbrLlBUSYtSDL+nYbrZLVpQG67DBmeJyj33pbHGR0uD2EUTUlEaN4bXoDp1AFdSNhgyvCul+dgi4WkVcG2jAeuJPGyEgkgeNzDFfMebz047iQlju7JtsrHV2UgtyXdl6q8pXQNLpaRwFCdb0VfHlVl866yRkXFW3dqlNgOfxZOCxdi6pdQ3OlLcbcnxV/i3Y9zvNxRkAY/gh/h98n9bWbPhrCdGmHyEFK8RWKCk6EHHL8vPVoN6B7HDh2jr8qVBh86GdBBrHdkRxdGn0WO9qNoCD1n5Jg6kixDh0ixATmy41yzARy5rj7X2NTnKvbYmOvVTji7QWN/IU+4UyIwaBLYeefjTaGwGgH5V5IlCWYnbjvD/H3Gc/zbq8y5j1b7b/c3e3g+nG/Todmw3cB0IiYsQXKKlKZz/suIUgzTPLpNeAfDTnalkj8F4vtqNrnmyhtRjpjgG8U4L6co/5z/9VmoZoghtRb/6cVyxeCG07iFme6nlFGywspTMYlxzXlShKIwiHlzwf2GufxMBb6JVKxD38/jehsw9MpEhPJi392FQ39IGB6snYUNNJie14SD+VZwMEADD9eSRwAlScQtx0ISiwI9d9+f4ido1WhrNxxlqNq36ijDeytHNYkruVaQTFVGf5ifjBqf1Cle8ZMSaeH1zdzUPJua2WbsT8TVk7BqhNI0XNTyxUMSqKWAo/EhJXwkC9R9yk8zF4i36Pfkncwio5uyEJPppHq+01LL9ly2V1bZGYNe71ql4n275XBVMoojHt02+gVf/5TUch0dfCpoHJuOWsATiQJQL0Of1j5cMr5+btrukPHTINbx8gSiO4D5DKQ9DeYXYNE8KYgdzh2JBdN+JsRMWAOVN34rSKEvy7P1dnXnJ1+j7Ms2HP/94bzl0uL4sPh4jdsLKo3CvqU0fm793Qtwve+UWy1onRQw7RowYX2K3qW4pQdRr3YyP4LLYy+/LauWKACzBvOX3WJ3uaxWp6Y8TVqjUyryLdMeed5vK1R5s/zXqrB1+dcgPP8f \ No newline at end of file diff --git a/docs/assets/LDAP_DIT_root.png b/docs/assets/LDAP_DIT_root.png new file mode 100644 index 0000000000000000000000000000000000000000..8ab2a949fd7c630c6257e372be664fb439c7b62a GIT binary patch literal 16462 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 literal 0 HcmV?d00001 diff --git a/docs/assets/Logical_to_simpkv_DIT_mapping.drawio b/docs/assets/Logical_to_simpkv_DIT_mapping.drawio new file mode 100644 index 0000000..b804b3b --- /dev/null +++ b/docs/assets/Logical_to_simpkv_DIT_mapping.drawio @@ -0,0 +1 @@ +7Vxtc5u4Fv41ntz7IQxIvH6M7bqd3bSTbe7utp8yGBRMgxGLsRP3118JJEBIxjh+aTpbT2YCEgg45znvB0Zwsnx5n/vZ4iMOUTICevgygtMRAIZh6uQfHdlWIzYwq4Eoj8NqSG8G7uPviJ3JBtdxiFbCUIFxUsSZOBjgNEVBIYz5eY6fxcMecRIKA5kfIWngPvATPqpZzfjfcVgs+IPZXjPxAcXRgl3cBU41MfeDpyjH65RdcQTgY/mrppc+X4s9/2rhh/i5NQTfjeAkx7iotpYvE5RQ4op0m+2YrZ8nR2kx5ASgu3f/+/jhn8f1w+bT9SxIQPhwbbCH2fjJGvHnsBOy4PgRk3UJSf2gmrD/WdNbHU/wOo9RTqY+oedmmGxF9P8qXmZPmxG8IX/ZuvjPlZ9l5F5nT2hrXI3AhJx3VV7NuPovvxSZrq5WLTGiT1LNzHM+GKf0zCzH4TooYpyStXSUbuIcp0tU3ul6FacR+X87vbmjlEnWUXlSSYCrED3666S4YswothwCJQsRPcYgl3lexAW6z6qHfiaYJ2OLYpmwaXqbDMSEdGQ/TpIJTnBergVR+aNUKHL8hFoz0IYeJBcZR4m/oqDVywftspBxdYPyAr20hhhL3yO8REW+JYewWWgweWPyZ5hs/7kBs+kwCC5aOLbZmM8kKKqXbjBENhiMDoAUPV+CVIfmLYrWYkEJEvqrRckKuuMncZSS7YBQh+ANjilVYiK7N2xiGYdhgqo1Mrry8iWiWkqrNAOo/tNlKXF0zaablG4mXT7FRbBglzqerSdgpekCgZWm6UisNHQFK52zsdKSWMnEG+hjf4XIv+knibnkcQtRakSypThFHRqzoeEcV4lpI8hdllqnYZALRAYBYHHz0WYRULAInotFpr1f2lBIbB7bZZQWaYXzYoEjnPrJLcYZY9o3VBRbRkF/XeDditBSSYZX/uoZblsJecfoJS6+sEvT7a+ldFpsb/rSmppu96nKFTFHzELtALHL/Ao/jxC3lOjzH7fv/5zOft94374W079mT0/XnG+UXL1wyFHiF/FGdCxUnGWn3uG4NFAMRo4lqmzgOuIS1Z2yszr4qG/jCKl2d9r8MN4I0OHGnXL7elWy+4YcYFjZi2z5Jbubrgo/DaiWKHKiPlsm/bWXaDkM5a3y0X+LBnIcT4SOA1QayLukBoJvQAM5F9BAhGv59gu7eLnTOovuNqeVeyfQXNZAzWW4l9JcUPNcEzqW6HM6prhS9WSSApPWc3VbhLNhabrnOrZlQkA34EUVI49l+5BMI75suCTXkas/5yvoatbws2xbM6ENLJ39oEghCCVxh66hee2fKUu/Bc4l/sYeayIq7nltLHBE1SrZ9ZdUdabzVVaFfmMSVyMSVAP9vsA5jd8bpT8/0BCISubA2E5pM2TW90Npv2rn3r6lKzgLZFaeLXCDKk4Og/9hNDhYKDyiZW3omBzgclwEVHGRaTlnIpWhoJSQNdnv3zgq/+ZunWWInv9OyGz8jrarnbmSDof2gLzjonTiXCO0kNqW2g70bYU/NMdFgZeqEJrsz/xlnFB8f0DJBtHzhktQjcbBEuQYw2ABXftMsFBlPk4Biysx7XUpOBAwuKGpgoML5tB+q3CoLSkxpG2z6IpOi+VKcDFsV4YLsHr8pKPgIutbmiSVWLg7Q3ZIgEO4ZpqeVR6c+HOU3OFVTBGlinZuOwfUUc/OcEgKnPC6SOKU3BFP3OuKRN0GIX+pgVAjdyoGBdwgt25/Vv7OCRkXaHrb9xLdXAgcTU6uQltTgMY0z4QZVb6+J9hq4qp3zeihBNwbqCjilD7A7w1TGDtIAKQLHOjR2+oAwzaA5lquYymdaYfHMReKL6CCdzOJfS2hzuidlPdmjUfWVCVm8bKscAn6FjTj03gZkYskMfGcZ/73dY7oNSOUopw637MZTkKUPxCNkD5pq00kyeAZVEW55LiunrUlXJ9MbKonckRNIo/YjXqkLsTRIZoSqCznjjj7RFrBpt6nIUVkLR3guBrP4QlB17ncT1MCUuMg/MLTm8eToem6jKc6mSIn9C6NL7nsUxVxfyHrZ0YWcWQ1lUP8A4F2YOpY7c3UyVzN9MxWQpcQw3D7U7pk5w7lMXkYipTXMGevb2QO9I2sA30jW2TutbE3nXuT5/62dQCT2TM4Op7E1lanxuqXHvm59Ygn51kurTeMAZn6tuJAyRw/CzqDDpAJzrKyahPeVP0i04D26MRBX6rk1GoCDlQT3mFqAphWLys9iZWWImNm9aSc1YEXibtspxVJe2IoXeeGD60YXRuertl6kwt2xaxOJ+w+c0BnqPLAZ4ZhY+0s3Rm1y5eea/9wa+cNhLH5k8DYERMQlvc62NY9QdzJ1zsLnbvlQ6UvBxTpyo6On75Cd3CbheXYmqiwbFeO+uvE8EWqc8a5igv/zprTwZiwdSAgAlq2jAhluQmeIBf84cPDp8/BOPy4df/Wr33/j9XTrcr8XImVoqeSiYdx64xFoFOwwRDZYOqKMo6rYAOAJ6j69Xbf9CtXvCZTvHt2Uu5lTPImYcDmBirNwzhYxxgnIb8hkL/OyQvkBwrye2eivsK0lcTl3YfH4v+k1OMBUd2+J1sVVe/eKYj32z1avOT6KnqIHuI/b+Zf1taUJx0OSrcc3biX4tZy5UizCHdyea9dq73u66jdXXdEr12vEJ+uS3iHwrIP77qDnXY7nrjb44WerC1OTgfvcePO0U9e+f2jbjencRTXOTP3cx0M5PrgDsvjlJ7sDJZKj73k9JZUnt1xmww5VlOa67PZC7l4VpKuN0P5A+lniiYDKrqcDOOSBOSpm6E5DjG7+grVsDujcTK70UqqtAsI6gzNEeoGDFU3B+ZHDjEyx0mPXLGpXNnd9ee3426Z4HLuljJgU6jtS8iSAsNt8bq4rwUUNbFetL09MZBDvlIMlGXyt2N86xeBf5TxNfvxfqaAY887PTvwPSBMOUIE7KEicGDP3PHhhgnNTvKz9jlOH3CoUQLfjIfRBxDZ+9jtRfTp2JN6GIowVmmK4NCAhhfeYKffgIvyAXFsJ4NqgU4ce7oiSO8jS2+z/47oHal7r5/jZeJXzdQ0QmUzlG/BIk7CW3+L15TOq8IPnvjeeIHz+Ds5voYGmc55fAts4Yh7eiZbs6r533HGG52hj/6LcOCtv+Kd1QFOEj9bxfNaWy0JNeN0zHKxqtR73Q9+ClMDuiUTy1BkZlUlk+7rzwokfaYvC6VRglpqqtPOb0PZthmGoimh20XsJwXKU79AY6pGju2HUSNP7vzF82/kmSbVx0BocabANPtLuGKUuqU7XSH1XVrSpT6shV96UAXhzuxvK5z+VV2YHtMqADljTdNGzlSoCfGTJVFgL1Xv/gRGB11BgKzHx1HTwZOgx0JRLaAPTpYl/lGcRrflMVOzGfnMOEeHMDn3MSm15SIOQ5SWyr/w+Ytk9L7FDqIxed4JVbrWlH57xhobzX7ZXpQRLT7BKXkqPy7Bj4hMPSMqV+12G7WU9KuZwS8uqXLoytriuV5EMVUVjB4L/CY+IvHK17Ev+/EJnr35AQlGtRF2O60TsGuEh7Y0ONwB4AtBSwOXfZ/C3P3xqld+yELnuqoZZO1/Utn8PkNB/BgHI+UXL3596uJYh8LhH2CrE8eu6lMXqk9bveJTF2S3+RJbhc/me3fw3f8B \ No newline at end of file diff --git a/docs/assets/Logical_to_simpkv_DIT_mapping.png b/docs/assets/Logical_to_simpkv_DIT_mapping.png new file mode 100644 index 0000000000000000000000000000000000000000..d604c14d73b3c88f6207a8bd3e34d2bfba251cdd GIT binary patch literal 85602 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%0AyjzTdorTIja*)B-ujPxbR85|p6zz8L;*u|$ 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

qaSl~ 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 literal 0 HcmV?d00001 diff --git a/docs/assets/simpkv_Key_Value_Tree.drawio b/docs/assets/simpkv_Key_Value_Tree.drawio new file mode 100644 index 0000000..2ec8f0e --- /dev/null +++ b/docs/assets/simpkv_Key_Value_Tree.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/docs/assets/simpkv_Key_Value_Tree.png b/docs/assets/simpkv_Key_Value_Tree.png new file mode 100644 index 0000000000000000000000000000000000000000..d677235f9da3d57f66ba5f808378cf3a164805a9 GIT binary patch literal 85014 zcmd42iC@g$_Xl1Xlr`B&iXu_XG|fz*WoByDrdgV;6gAWA`%E*9W-H(jg8Gv zA|Z@nV*_!pv9Wt=KL9)-*#-H6U$#019%EB_)A^N+jnl}aaBh;qD3r(rHXd+n-zN`0 zs92>-@_>hV`1vKM)jo-m1d%pDq4QA+lE5SIUZF~q2ql8VzBYbPKbSW(&>IeA!cZP? zG~5sTfcp6$0s~_D+9!wv%HIPbe4ta9)ByDC`>)#fI@@2%SI9;1A;pX)IiXHY^&9hKr)WI6Nkq z<;Uhxd4_PKm;=W%qp37ZAQr3-CzP;w(NT1aSb@+RSS;{_6do-?Gc`i9K@K&m@&5EM z0S^)A;fG;H6ToCRG8<(?qRB`Nc*KuLBsIGun2eySrA1Mmr) zWVTQ)!^@(?FcaAjNYjUF4LUdp4H_g;Ni?{`-=GWBqjW$7h7c2==OZPcGse%40W}b5 zYVZ;K3)2hWq9~0v!9)l&2r*=(zXnGRr{TaWkwPM%0R_Y04Q3&QBK6}bG;n_u3?cDw;}^V1TPgI8^{m zjf#j=v84!rFeZis1C!z43L-38X&e&Bq~k97;QKWt`tkd17ffm zk$*sdgc*rp5cNbYHjtgb=L9g+cm){H6d0gKW94E$Atq6mEE5C!!l45MG%hJ70v;&w zqa(lrt(ZedU=yDF7qZ7+?enKKfAg2S;QnuL*@faZrw!Aq-p<6x*{ra;KEt{j8L)YAlkY%Gng=JUC5qyUQ+F{ug>S0@saasFhyfKJ2)P_&WBF;In)NR%fM z@F-?7oJvO~Cz;4l4OR>G48sMi^%NP9hz^F}>V!OC!O3I|T(5z{ z17uhuBHSFMr1K&a2{G_QHcri_$&gIAE)W%ArE&vOhN9pNG93mg5n~ce@MMBXDiK76 z#h}9KM?PUZ(}8!#k|zz>9Klvs?28P4Uw_zAKkDbGlt(z#$PZL&VWNJ}#D zIkad%r_&WERoGg2uLu(%xr>C0cR&A80lh$3Ky<#+$$SJpl8O@{ z!}NFo5oL(+R}y$hQYM>8@q=;T2EHLWiE33SfCEk&8L9L~L>m2w3RM79o=64H#5i0s zm{Ol0K%vRJ7`{-Vj}D_pCa6U0Xa*c;CB`6*)JB7rJg8C-O+|2#DphniOU0Makw&ZT z;xTGv6plzF#1NDsrYt~VKvQ69Dq4l1`m+(hjnH{Y3|eWVqKM)MzesJQl&&+7)HoDL zLrWAfU;<>AiJ>r1RgoY_@Wb(;CK4eM3rCp%S8x$zIUJfKNfH@gfl4ug9*s6489KBd zTuDR;=@=;x0LPH~nLtm>FTRnncp^3v$%rC=C#*0DOc-P02@`1KKsjB*Gn)vCWWFGb z9By@#$Ng2dNSP?~_ z)3Ed~jmQLug)UNy`4U|uJpm)Z3KUoti$F}|MPhU`rids?l*Wj}6g5LESi4huIf+&Kl zOyI|u$!w}7K!C%?a3ydgHHpngAmc^hl0dm8QI4c3qX{ep4;B#-$+8+THpRd=x26q2a12Y_!;nkS7}C(g==UA}id)j53>qOdW?2NXF99I+4}u zGTCUdl;j76n?*QAq!wX>Y7t5?Maxqs%a}+j*WlG=P6R`i!1m)rNF%7>W)zbwg-0W! zqD*K%xroE(2#|Oz*$-vV2xYRQh`=yKf;kYQ5=zaOFtM0ofJ0%DBm!`!I6yZT9-G3| z`uU^9D!7P%h*WSfbS+l|Q$|ya3CJ)k;O+pVAxXyKC(`kz2(1DdPDE*VxCE=tN_hxG zv{{ox5a^>gW~0?onPL=Et2HS}W(;2$Nh1&_;Z&wkEmWw)JT8VCB^5;YE4lJSo>mcU zG#hj>6c{Htkp?BvsT>pmlbC4cDXlcfF(r^NFq2wk3QI~fn8HL+1QA;e8sj7Z8d9Q> zXGKe|NKBL(sEJln#_6L?QXv74qa=w)2);lOATUJ3xO{OKpHE{bC|Zq7NA%}#(WEG7 zpi&-&QAPO4!cRvVkd!5NoJF7ZmhD^faIC7@^SExu-SOG|616_g1 z{IxO@i6#*6iB?}^keIEo`|+dUfM+m7pnupHijl4m86#mhDJc+^AOWtDVzm&lKR41G z9jS<<@r*iFqzcIaW+vAX%z7wA6RF~27#N&iQVd0F)c{jMj5+}mm>{>tSC|-N5>%W_ zlqIrc7z|Avjtd~0^$Mm4$5G2=fy9_F7!+w1=wTw6ISJ3ug(XS+Vkn7dHAZesFhcd# zxLaf935W(B3LTXs;1YOLI37(82n0ll3nyzBN`oKOVASY|awJ`@lxj%kgh-`4Jjp1- zYE@J+Un+#NumY+qQOahqRep3?0yRPuhC}F+iB?ThCJ|_Gq*6gbYAGg_0mL*IN)j7* zA{>;MsKtrU1OZtriHSlpxdeVfcsP}uEJ`L*_*Uq^e_fzCfIv|Cqay;P+Hg6N$yC4- z{R6BxAP{g7jIL$M!{JF$94b~trO^3wl7<4_5owe}mOR-n+JqD-{OKBUViGF>9YIkm zl}IdJkD$V%X=ZdZR>+b`p~*5r02*$LWczD4i2-^B1!~gZbOw2XnWmCc4Xgl#P!%bV z2;_m#gd~3;6lg|6N0DGGoqwc18l%_H;7Kqjlt>7OG=NhnhGDWQK%y|x>TL8}5JhXu z{wzI@FQX9jVz{1+Bg+-^1PP3%6~@T1Vzd~m!0M%F7+b_K8WL4t3eZu_CR+8J%rk=T zVWdceUQf{`DFVWwSSFfb6dT3nXs7{7r@;)-(F{r=Lj>ar7*+?4Q-w1F*vLeVm`*a% z>1rI#55Y=S_zRK@9g<)i31WUoC$Ivh+2|OYpiA+V|oNGit5Ke`Ul`h985qUgB;C)1wb+MK(s(c zq2rU`u&@{b#}BIZLo>j+0z)8M9h02FL??599o29g0bg!H>%co2584{M$o*vF%3s4a<7&T0cB(wcv!lDrvwKFubm{Ju|NTdDz^+`I+2vUr+D{9?qXK z#_XG!aWpII+0U((3pV%L+dFP_Y^<%C|FhxyJHM_QU8i@7wmg3KLpZHy&z?PDryWCW zY$5;s;o50OTnw=+=x5`aVPj|ipC9pq9G%J>|J(Lg*Nm(T#Q(GeUl%&ih}F{n9o)v& z%YobPzk~kj8R}sx`yVmD*H2C@+J2iLcJ{{k@s}%oS&XAoOIrz~l6_wKQy4!Dxq{@$hYk$=>hY|{dDMTpoC00i$LtM) zI4(a}{gg=51kDd0cwG#SJvQfY(VmS59NrC{^dI?M$Jk;rxgQ(H+CrRsT9#&2hZ0Io z?tJ|@o%rh5@Q4bB|5w`>&{q7sakwoc*3Hq&oe){e*m3jo%wxFn&0kLn>L7~ffF|w4 z=(j2+`*Pi;6C&(?w&0O_D4}KF{d`}0SI5Jl`?K<;->a?#ekfS}@L|fb-eZ$x-QUut zN~Z_C2^DoA(t|;vkx9H6h6$U`?PZN zrOP+})A&LZXq@-Jd9W=+K6Zb*cG1$yH`&rP`(TrFt?LSoy}wK!abo?}X?ypPCDCtl z^wssGq9&Rb>~=qoo{*@$6V6O^89wJ<6@g&EXydwWc#h~S$(W~%<+@a`a)W0%4z&7O6kYXPvevRG`F!E0mKN4 zxHQb(wPl(`v2%KndFeKDqHe*Ilb6wu(Sw*yjdQ8~%l?>VPgq7)_4JWfp^o;&)$1;u z5N}&BEDg4m^-)`?VlE@6Mr#Z2EcJ1u+IeSmYYG! z-0wAGkhJ;NF6KFJ#s8Vpv2!bcyg|77$CQlfJi8U8?wxIWhcTTxaeu{f+z)2V&|7Tm zn#MpecJuG`H-t2;C)vG8l&|i^+Vv;KoSvyTxa`T=u(nwr;b) z-2Q-Y80^6XC1J3=YZk$Fs=Gbw!_F(|Cwm*2P8F${Z7zRkG0PPo1UaYULLAG8)q`^& z$f5N&g@9J>?(zPMcnCoJ#}+a!GZfn2>!3TKh0-7O)|ri*yrrmh9>cCVqBlWO9An2@_S{VM{byhk7|Yh14YcCF6At zj!s7TKW#pC_U#_=iy?+#rCh~+bNJ=U*WCj*ReHHXy(Zl#ocL^w{iO*B8~^mNvD*YX z&5AngW@lf)aJ@&eTQ)$zbb5sRG!L<#6UWI5KEJCVthv~9($)?AF{AzO7W6QIx)zSS zUgl`OI%5?!bLz4)MTZN_Mc300J(x2I89N2-VL20pk^Pw{V*vyR=eJ>XKTH0g8%=NW zAjnk9rlFr9+{#x&x`V$XzIT3|aV=s+=c@sl&13*d#tpZ>pbQ5@VN~C4^Ru(xII?k$ zds)BBOY@(c{QUJ*$-3NEb@Vfd!FF{^Th3MFhBg{zt=*YbJ!RCkzdB$$($(F*aWOm= zk~$qA`u?k(vO6IA=GikP!(L^ToV$GN5sTPzB=<{FzYg#_de@vkGKW3|*f@m@{0P*S zH=^fek16fY&c+R^Tk^xS?IGuX?rxUGFKrsvupqGez`H>X#RG=yeRz?_OIU!h8%&UA z{?%3*(AJC%H?u}`=46a;3j5lB?xRmIJMVeklfECCRbx!Zzt0eA?YtcRiQP)0<&rYT z6>fR_*RU3VwfAUa#*ebIb?QN0J-5=*Hq!|?dbszt#W$WgJRuL4Q)hcoF@s(=oqs;S z*1QeM{Hw4BfUU7+9LL(&CJ!3tcCM*;S=_BV6p!;i203K!-tS(f-SCfk^oX3^Gx;t# z5FhTeB-_8txC3;3vv2V*w~Wv*yXF8U(XrL{+cwfQmXrI%liAh(oEf*@eYrU2Fzk<_ zJB|YuR2_ln7hYXxha*WH|&k#QrddT(>vq+-bOtQXnXa{ zk|`OXry*6^vh3I<^TZ0zs|t%zc54-JuKw2`FJL=<(9|D{((#f-#s4sj(AJHxV50w=8qi#Dt7{4+)J&S2XSni2b|5LSXc|q zBea;RgU)oYcQA(hg$=M?D4{wVxP8^&)babWs~;9TtWRmR9fln1y!o>`80P%z_#uBr z&L{z#d|Z2boSprJI52Mej{$L2LAh+ZFeZ^^8J+{tEGTkz{ENn7fX4KFDcdH00HnX$kRKb)|~?JpR3 zs~_GPu{1N(wLeg`C%J=X+RoxQEzX~DWp8%%6Bf4Xudvg>CeIC2Bu%h|T!XC6a(%Jw zYmVn`Suc6Yqu@`&9;AQ9lxOD$t_yv(WAUHeb}cKkIuN^G4&>w#lASNdZsPz~WNmgd zF_aKr?p5;_xu&rIoFC49c92YOKyxr4!?m9eNp%N(utq z&{1PNWa^@n8Yk=JxRBgje#q~w-mT~y48@C_ux_^cz zU-B<8LVCS`B{Xai#Qp*J4`^YYp#(>_aohgoj=uG@aKP|qZ_aAP*jN@1c3#-~ek(K~ z^L72f+|H_7e^&vRp%{ctTsm(e*ksp1mS@irzxQ_4O7HBWj7ljV{D<)XF}(+nFFzZI z53{jkfG&{4-Q%bIdEGJ478{>;NWUNr?GC}XijX=3^t}%5d;j#!I0Obx4LUPq7&sV#msy0gwQK%B z>gu=#aJIj+eGz!V1sqtGaben@o;G%+z`oV>Nw>yB96L7vBikw5aQLqdodeD7FU^IM zAdZ9#FpAx+K=;2Qg+>4&Veb#a!4pSt;K``BLh^gR5CFnMHRHaA+t}8Ebs2>R+C2Zf z%&1m^x0~$1_m(U$CAQ3e)xSMAgD3o>{;O^5&|r`3zYdD;{UdG0X8^)!l<4C)Tgcog z0EG1`c5nOh(#B2zgjPpeQaVoJzkK=f6{tBP zwMX6kuDSVszuU9_j%;Ix1o$^*5UiS3-DG!(GI-&SFCs;ARa{WYr@OcJlF|PL@S)Y+ z0K?LqQ)Vx>v70}#qNDN+vj8_VF6HepVZ#FBlm3*g{zL#<_XAp+@82mxtAX%#$R|U< zxqSQRp3d{b5%R{eG_QfvA~xsiZU*83M0ZRtcf6EO7f<@TB{mjMptZXf^HE^O;#HQJ zhfXt8RbTeKxUr?+?%lg-87o(<>aJb*<4$i1k+|a1LsiHzX+3Gu90L=Lw#^5pf>6tz zJ?`}-^BPjAFP=a5D4T9IIuLkTE`Yep{a(l|JgN%nF@5^L2N~y5IPrD6!?&VTc`s^r z9=f<{tgOB9@Pr`qQQYcrBMh{IoJ04rJ;*oG)*z27A0H50-?ZfMx}iXk0xe#w1LBJ- zN54qX)*oOAx$55cm*140>c}49+S!Mjt0#aAz2y~To$kp$OUz%M=U%TGHGaWbtxnfn z&spG6A#!%HTzSEf!-EiC1X-b^Kr#k%PIQD!+>S5{aJr0aMEvlH` z@<>;U@C_da7p{KujWn=N4VSZky0FoohR-O|wBovQ@69Z&*xl~)PTfaZE#a0`K9z)$ zc_)yylHaMQ&T=aeh*0PF@X{x}-#<6A4$VIU`MmgiA1ync%Fqz&wjyLV@Y_H97Vr=N zA$`Yv$htR~gMDtfEpy)8RT~m=F6c>TpKy&+q59X%Gv7K+y$Bj){5^Fasmtvych{hr zH?K2&`}*e4$i~6L`nW6Oj2%uNd&=*fOHwB}}ZU+pAwR=+`h>wZ%h zMGdO=#qyl{CfaPbWy_WqQ^{~YKgYgMu{syXR<-@!g<%Kq>s%^7H>K2{N%?%iu(+Ua zIq~J8xju3J%0~f{QajHfPekZ`;|Ve;)swnf4$i-OXu*Pz?;kfDDKAe$_zdW?+iFSS zj(r;6<96q35pIZNp_(!7lQ??5DMF*dmfEaxe8Apwx@1M{{BmmOjZ{kbZJvC3bS(dJUS;iV)6^NMA3-X4A^fXq_v-!o9Eoqij9f4^((Tj&T_{=Fd@fm-^{;3c2y=gA*XF=m)8)ee(RDZ)#kUI&c)ADt*q+|e=6WX76=NxRc>Dmad%}zPsAhe^gy+b6 zC$T=zpWpUTCgyC}GCEHAr{qh4p03P)HBDbB0_Y<*$L zmPM{DQlJhK+_FfBK~sqXyDOOKdQRCGO4ar2aMQ0lf@+qS+s}aB@JvO7{J} z+}LmOYi__dANfM9FV0C=yFRPBA*!auu?!ea{E8K8=1#kHG_E5!sB{MlUmo)FDu3#( z-vYFQSRmdbU|MI}_Y-fPzubARhJVQme$a3~$ic-KPTDX%xb)?MZ`_)gquTZ!tB3Be z1`iFXw&pBr8)h4&UKEk zF9iyxe%W+y{n%L>R{vb}a^?);fqRjpo6BF)1IP4vY6lSA5bWm+w5}&}IvDA6;E9wA z9y68ntMAr5cwGGaQ?|C0$+*e-HyM5!gySt2qYG+*xETYjXP^Ly&l_#sy0#+vS%a2xzfJlF7B}#+o_Ngsi$xT9(S+bzegJqe|`@;daHDHLsU>p8WE2&(Q(* zJ|~cWI}jhRs1FV+_oU2_O`Bo5nME)hPJ5WWaR``-8y+Zn(1aX1B_rbmSnlbdh03-x zfgAef`a7&+={q-{I%#Au!W0|b8yKY4d3$Crn)+bfnm#|PJ_rbSo@m<2bdN*E*coSI zoiFBnddG+@JiBsE1d}M8^lf5cIN<3$pxN}o8rBX2pFkVHe52m$pF;4Mp^p>bM15;t zZVm7lu(7HIU`_K+Z8$Rf(Vk~Vi}&Mcu@&@*3!O_chn9OEqi1g_d1{~@tWYi_KP(?% zXWwHz88&xKTvx{$<8=28az0|-kTpdU=bZ4V`yi>AqC9WJ@XY!dGxl!EKH{4tHLR-` zT4?aRo9-3)RBK%ew`OAz;eUboj-SSk|K#wmEz5 zt`vtLaW=LKfvNP!f=9w8G(4&(d(?900AXkhq3Bii>XZQ!IWsHTLmJ*zU>+V=8*yQy zCgK`v>AOtw@Iw)}JDE=*MQ&R8dgm;}+<6{X>j4rgCav56KRWeT`AEtgaO~?#Tr6i* zQ`{^ZJG=997p5$|cdrM*PXF{Pdt|@dipsP~fXe#wH7T z+go`zf6K=9!x`1a2bdqnhm@3D4RV-Ue(RO>ESD8;C3R}Xj%8rUS$8l8V$SbaXBpIe zy*9Jh!z;2NyZUA~VV-?EI0jd5UCzpX@HDpm=6c2*p5p4>Z*!7nSTmP9RFzABAFZ&a zr1y>-NjdQdEOCNk*doX0!Az$xhs#R)FjqiTwqv%jJ#Rrn8h&Jeq}hv0zCFs5?iP|= zQ{NeQJwPUG_wx^mk>j1*J>Gep{}=iiLlHrPO`7#>K&b2T4qZ%mVOnLwOrW{hj6$Tk6Qx z+lISebLy>I1G;zs#U)2HHF}ojKwQ4(k9r-$#@MNfHRe|e@J3a;bD~+b6mojX7;vk> z^D|h3bUSPAqu^C-jA_%6sGTqOMeed&O?t64s~WF@EPV>DX6+gx*NA4nD9UoZl=8gM z^sc`b(5nl-^r~eLc+H7e6tn}1wL>*k+zOw(5v06DC3S=B>Z}`Ga4GmXNZ7fqbPZ@* z`C`rBlaE~6u4lZr0@HUTa&qDMAdKDcR9NyIelb`}r+wIGU#+=K0tTj1cg~#su83sE zS^oAl#Lcp5+M-hHA>0L|Iy$S}qu=h9&2%Up=4yEuysK=_pIQJA-#PBY4zz|A(5SbK zq1QQ1axdo>jhf!uYT*N8`GO z2O09QB-caG6Ya3G+YC-li|5S{5<)%D0n>i`iYLo*txU6NF;L@>1)prM-Q4C9m@Wy; zd}+yYJvXxYNk5P_a$GJkBxMN+W#0tJgw9U5?&HI!6m!qgytQl3m0l{WjV)r=_|@-6 zugRh?i1E3|x7OvI0~*s=mzv9R;-<~rwdC-rliSNbj&&M*-u{%suTVAARS3*^vqQh; zj14)EhaZxqFK_Y$cOyP8?ixQe_||Aq@?Ez{N3hEvMXfcHhgD1m+1QOB8w(OhAgoZ= zFfTNXm=4TsvJ-b`*gtYS!SUPIg8qUDjoRGHiz1ZN#1 z9e6Ed%{b@|t;(2Owm?Bi*HyWkJe)iGSjoW=$>~Lt)4yYjW)NrZT{!srw@3Z3E-$a? zW=q@moc#Kvq1(%I);$#&Ipf59{m`J3$MSX{sb_s2>_6z+wkK+xLULU5E-Ga6WiL<9 zd$2PT-`t!zoJArXxq12nRxh82FJCzS5bLZ8esI9Frh3lskZ&70#-Zk&ykD=s-sy9I z9>i*B4k3T(A5Nl@>uS!QYHQ0|lOtISx%7(-9^HNl?!Ez5&#lIH)Okv&ds%1yIkAC- z@7>y0&FJUlo$Md{Y`ZZms;l4D`rP+Vq#c<qlji?CL;f zBW&j7^u2Z|%ODMpzUACg-Dqf}pE)YgS-uW4VQU|!Rm?tGR4@h~fy7#5zH`!>y^hx(4M0t(ZSv zQ;5pm9xOBHp5iJLi5wrG4o3`rcf4z57wnvNzur z+>YS((*RQUak^uql~HE9ng{mh*9IA!rL`MieScPHk4Ejj-3-QBlS zhYdAtPY#|}T3Z!evV#A0%Qxqgrg@d|oj+#3+W#Wvq~T!Y_p}3>(o^@{Jk`N}+kE8s z>eu~RyKjoFf4p@e(A@Q&Uz1hc^K@a|_<@@j&gnWZT>mJ6awDT4l>lvdntXJ@{G~oY z2hVIpl(H^Gc%X}CuKf<;PK&i5s7KtiW01q9(g(Y{4*d+1HKT^ zBtGMW6xXwoYi_+LS#lsdZ#QVodgpUexJ4-OIJXSWUhGq_C%YOybMvkqYcAp)yuG*Q z(=Z2ZN^rr0Ev$`Ov*j+Sc=Y8d&JMmjmyomsy$@93M`O9lkx)ioU2zGqq>qUPt1E9JTy`u| z$K;=je!RQd$}EUEaP#CRK0?7I7x)A<4sqC2(zLtbayKVNdSvamuS-kE-8*-B%pK1i z&cR2|eECT=$t)eF4+Cq=U-krHGD+7x6saD!n*Pv@;Gi4&OIlN}vB;Ij3o2khY=_nG|QT<^n@b?FBw^9J1@Ez107O4r!@XV2Wb z_C;JmY&%;!?g(%lrK@kRo#F0YhFyw)Z1BJu-Z9=&UY|79@Y>3^8B&ALtgq9&Y7Rj2Xzg|TyQq^$o-Ntz9`ShPQ58N zhI9>BJbZowb|UgEt=a9+n|QV@4$;oYPa6>Lcj%3 zHGYF~DdcMH!`V}&x?kx)(#s2ndYuY$=?hgV&}9@EJ`$K4_UlR9&9!Ty!~ z59UrBrx=F{*#7ZS>gch#`vvotnsnG!zp86q4jo^c#WN?wo<5abU9qmZ4PS*gROFAz>=;<@`z=(!oFspIJc_g9 zVO_EF<{$0NclVh#nTVJ|TVFsR8{ahr3pN@6^Se+{optjpyM7-nT6Za*KYw}c^m__% z1u|zy7p->Wo%$Pzts|Bbuhkyfdu&UrGHY{m%YJLT`}>y3EkzCr_ktYcspFq-zeLFy zrrfCrzGM1&BWJea!a(6w!I!L-H-Ts0yo61Gcb^#iv$hxs?O??}^8RXZ2$4Q76iIq#p521-IsK+NZl-U+ zYJbQ3Dc>Hm2irTyV-fyKLN5Y`R=k=E0^aDPQcZzsfQYw)NYsY$vn;iA1LA367ICD^{t z=I4*YFAbmj`d(30$LZI!`u&^sMJ+q4nm<|k=p(pFdU)eySaY&Ix!n2V?rp*KFPls0 zh8+i9Jl^{*HTAe*)RkPB^aW*WTu;~Ye*Q9g3G}aBhI-`AUMt{%|l83jc~J2HelfP%qieJ z`(ZiDRrPQ|4kV>F#ia%%Dy&+Mf2f@G@-Xxzx+@O?iobk9e&r7AtTi76MM!LB_DlYm zf8y7DUo#Oqo;tRo}DD1o6E7|UYq2l*_BdgyZ4d={=Kko|? z$-(BS&`}M55h@JQxpxl7xq-5fx>G%KrEI6WFY+LH(QQfALR>-_NLyr1ufBPHo13L3 z2eRqx!iRxb#uGUp0efNMj@JGl4d=SNT={Nu*KuTVkMgL`k4$Bt=ZVyR*7Ux(AoQ?x zvz%GA{+@OJCWG8+k63#hZ0Yw89mmhk={a}hwQuC$3F?#oM->h(0%aM)CVWVy5nFZ% zB01JbW-;jRo;s-g4cN$06FN>G=h5lf*JEF|ohVlok3K#M+uzI0a$X1OG6+-L zIpLY zc93YUK48^Sod?LXe9tT;e0_e)bhjAP;VjpGIUHimNP)sHkdf*x&59>oT(?Z?HLmPn z+_KjA5U-?RZt@)_h+fu)6maaPghH_AB#8aQ_> zp$BvhUb|JY+=$bp7(Dx$Zz8&Wsqh zQU;`morB1GwRybLh13T#G@qJ+4kyzNvxl{xISVk}d41^r%>vfO9Ql?9fi28f`Mzt# zjzue@<_+GeK8fDGKQJN#jAu9Z3vy_XY7wY}n#{Jla7|?OVHd7l`2he9jsKOEsuvRC zA8m*~BpVU*xw&9JDBFUq`d=!8f#R>(_McbdJSIJ!>3P-H9h8+F^|MxexXuR)f1kbf zyvDEu62<#zGkRIoY{PQTh3J?pyoZIa!<@Ho9|LZX*MPG#>8mx%&Nx<; zMs@Uip1F_d)RS-@Iv^RaUPVg!>075(Bc^*!eLl});>+bn$akjL51Ey^Yglp>^k>JC zhK?>VU9$q|zOzK3SANDEdSy*0XJiZpsKr7Z4El3J9NIxCX4lvx^5iR1zQ>Ps^KwHk zj+d_m#ql5koqzaxm0f@G-puD$xTE(!Adza0S0WzvUBbJ9E%(k`Eyz89{=x4UxBhbG z(l6fkirhW!Ofr15v)u^@rzeRw{`Vb{eGkbR-rm_#^(qY!qbX)Y6*zC4c(xHAxRGFZ z7{i@6b2xY6RUbL1=lN5_o;SjC#*Dg!KR;*v(4SM+e%!LQuat$h9$-^@FPu@wmUN*= zUa;3)rX?diiPxFLn#d=}R**4?Uj&*AUGD!R#OX$m3zpz#5u}>ZZ--i7P8U9=C zWnN1vOwEWjwM%~TjBl5E|5RUF3b>mutw^+vS#OJt+i!NCbvYZ;*i#cmeazRa}& z;M$8pzo4^+0P$UIHncBwa{?Y}Oj|#@6+rn2#Uc1) zcFQ^ZyZRm?_06f;7Xc}*F?~hL)d@g?Wfn<#Zgut4Q~Nb{#+aX79qWn)HH*M3AxTgB z`L&;#d^&36w4l9#@P&h~Ebl8~%vb>QxOaBB&qU6NPbXhLC_m)ljJhufDwqSDzAu2+ zNYrf)vwx)h?0M$n>rpj7QcJV5vz_YtukHIIfedee%W>#!LV#uJFvVVM%BQ+XpF>6{ zqpV5lUzw3t7yM?89zD9K9!){C-_YIlJaPEuB(1I2FGaF9f|#kgJnCi1+R1gtj#YNI zAAH!6@@U?q!V|!zw}A~(Z1jKTXIYP0ee2x7NxRQY-&u+rc;eRQoj>;+U>!VJoSXE! z3|a={xVOF03uoD|Hkdgusjc{7N7}4Qn;OAg^J(klOZ}FD<{XF90s57B+x+NJ)6Ytj zpI*Q5eYIEO+jeq##lYb+e~nbV4Gh$@9YyUne^{*fD(D#Q_oM4X{hXlsE zo}cj-;r;d&b041yK`HKz9=oHc%lFF(Q;1!w{sSxy@v)bTXxUgkHwZZ!q$1V>*Ak|D zaXiS-@u)~t7;*QXi-V6QzMA44bA)g*a43R*Z>;jofs*g94C3J>(d98UAGQ`n-x(vV zD_*j6d;0Oc{NCnos#k?OUtX~vI>tM0zy3{n!?pUE-f!RJuBn`K8#|Nj6SV=HiyQV7 zZGDMo$hR%@IyL|Jf~8ji{zin-*^l9yFHas{aCx#z!LmFfI>(Ini}7fOTN!eJK9e#lV9}nj;jj0 zzRA08YjZ=}maDA@aZ6F9@IvuRe5ReKveIyDRBY4Qb9v4eSZ1(yTupNr4Ld= z1`02vQ8sPd*y*hJOc@-c1wm(ZLj1C=s2^u$8*Z(iy+_A+%(!~?&9F&%!n9ePjT?T} zZyxyW7HVhj{s+;=(&jRjT4}`yXr+4J7xS~Gc^^N?d?oj9FS&N*3S)!NyZ%S@&97-S z(rs&7nuOX3NHz|)Z|iaKUSZAWC}r#1`l6^>#PSmcH{{KC8Iy+3x5n)%pRB3W_JV^x-`9Pe ztly3r7yyfH7&#lGKw@w32;?`l5Z zsSV!caeb5cF5-moP}j#sxLwrzEyb#;ZF^xS9=+TWdh-Ypr$Vd0wmh*}^Cjfzx#p$A~qhXVJ%! zsaAjAGT`de^P~!5I_FD{^Ik+4yEgDRP;765WK*eMC$3uAj?m+wY;{>cYima0`c;)y zJnWQ*yJOSGObPO&Cn4Xd@$?pcmX;i^1!|Af*?4@y+e4a)n%o1QCCcGyn`!Q=-}rMI z{0+xB%}8eji39zRV7&C}X4n!rVP)i?eJkRZqhooM35DjpdaBjUwitm#XFHo5POJGJ zk`6lZIH?y%Q5YorVOVwt5mD1ImQlrNWKFksxlj)Ec8k`#%|QORBpz{gFB2DQ}n4<2@!w%Hvdj#K4~C+5V^V%U|% z*^`a2>@p=1p&wH?uY-KMQByEsXyk7ayJdEIcT$Dd$PD>^OE_)2<@2F0_!~6|ZBhqe z!A^F0hERnSJ&C<9-2BjRziYiUSCaFzSVKXENd$iBqNKFI>ME{G23&5|hn1=Ii^z1W zzayi62RZblbWXVQBmvGdcuzXgekk`4YO}CQHz_!s+D*v+vr?m7HXBiCnI0~MTn|o z0yijyNV+AGd}F3Aa)ou0B#-vZCn_vQyLlBmh4hlT;|=sgzluvFKU0uEw>(?SP~T

S5dgVz2y$k*BD% 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 z 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 IO_cwC0p1_No&W#< literal 0 HcmV?d00001 diff --git a/docs/assets/simpkv_OID_tree.drawio b/docs/assets/simpkv_OID_tree.drawio new file mode 100644 index 0000000..0c33ad2 --- /dev/null +++ b/docs/assets/simpkv_OID_tree.drawio @@ -0,0 +1 @@ +3VrbcqM4EP0aV2UfQkkIBDwmmSQ7u5vaVLKTzDxNYSNjMoAoId/m61cYyYCFbeJbxpOXoNYFOOeou9W4h26S2T3zs9EDDUjcM0Ew66FPPdOE0ALiX2GZlxZsWqUhZFEgB1WG5+gnaRrHUUDyholTGvMoaxoHNE3JgDdsPmN02hw2pHHzppkfEs3wPPBj3foaBXxUWl0bVPY/SRSO1J0hkD2JrwZLQz7yAzqtmdBtD90wSnl5lcxuSFxgp2Ap592t6V0+GCMp7zLBuUuGr1+C+4fnZPb4nU+evgevl8gsl5n48Vi+8fPnh0f5xHyuYJiOIk6eM39QtKeC6R66HvEkFi0oLodRHN/QmLLFaDQcDs3BQNhzzuiPJXDFyAlhPBLwXsVRmApbn3JOk2IJmnLJPnSXU2uLBriPbSx69BeXWBRrk1nNJIG4JzQhnM3FENULvHKKFCUCEodpxbEFUGkb1fi1LFtqS+oqXK5dQS8uJPrvYMLEGhM+5yzqjzn5b56RC/jHnqwENnEDqw1a1+wjfChoXdyAFgNXg3a5SerQInAsZB0NWQ1JEohdL5uU8RENaerHt5X1urJKdMks4l/FNTBs2fpW6/lUwAFUY64aqXih2qSi+a3eV01btNQ8RsdpQALZWstSTsdsQDZBId+c+ywkvIMaC1y6sI6cBumX0PH2Z5NNnt4+D1/6X5I7/nT9MxuFL18vbY27JjgVT/9QmklG3gjnc+ld/DGnzX2yKys7KaAmNBL36bSusYVBdCgnuR/XWOe6FVGzI9WMxD6PJs3A2MavnPpII/HMS4mYynUqx2Dh5hLlG8lZKypZPsbuwsE7bPr9pXVCJ7GHVNyOUkGHlsp+jt3VHPsg9vP83/6bSAUvzPMImMhzjZWd0RIyvZNGTO84EbMmbNerS/sSGAChbe62aD0SFomXJGwPH3z6aOr+AtG09cksbyOxKU2P6AbBRpbqB4LWTYgXf5sYPHZIs23P8CyMPGB70MKwSZtlYQO5CAPPAq6NXKtTuDvsTUppHi2mblaPlt98iI7WhVO4xd3kAjt+VZQQhGERV6KBMt9FceXUAjVI7hZhkf1gj5yuFW9VATlY+n7wQL0pbaiFkzxKsh+T2wLwcznYWgAYzkqgdoAWqF1bRfNDh+p2RYDtoToU+y7rjsCymOb31QpgIzLQ1DKYFmBMeFJc1kjub/JRgttM33YZ1jV2pGRw0/GwITAci7teB9FEXIbFZQnuXzlNX4pxi9y7HCTuWRt3jsAva4ZQ0zSE1nGYaPXqsL1Ye2E5AJ7JYafmHlXpVcWqjzrsKArrhdcsi0Ws5hFNzyU6tQDr6no9LbB6RTsO/OxsEPXACqIW0qV6LFe88cCpRbXzxdS2PhpTPYHKxllG+Pliann6zj8ppi1JaZRTg7LQCGhgiMMoYSnhRsaiic+JQQqDaOREZQ19VmUM2E8KnNN+Xvy7gAYysAENy9iboCvvxrq9PhAN5ioNpu1pNCy/Bjd4MI/Fg63xoCG2vY6X0lprAaNW2VuL39Yamsppth5pVZjuWkOD7iofWChHLI6x7QAM7KOVpWGH742/xddERcl27t75NVHnzjE7c7emioZRUwwiX2qs2FzwcN+i2oOOfjz95TZmy+fDjQG0M7m2tzu5+4V6vQ61A+q/xdZVpG1n1zwXduFB2D3unuqKOnwv6prDhKaA3XEE3BgiF5mu827YRbP6dVrp+aqf+KHb/wE= \ No newline at end of file diff --git a/docs/assets/simpkv_OID_tree.png b/docs/assets/simpkv_OID_tree.png new file mode 100644 index 0000000000000000000000000000000000000000..08d69e8a7825a588a7d8ea6337337cacb5d27626 GIT binary patch literal 34070 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 literal 0 HcmV?d00001 diff --git a/docs/assets/simpkv_put_operation.drawio b/docs/assets/simpkv_put_operation.drawio new file mode 100644 index 0000000..f0eccbf --- /dev/null +++ b/docs/assets/simpkv_put_operation.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/docs/assets/simpkv_put_operation.png b/docs/assets/simpkv_put_operation.png new file mode 100644 index 0000000000000000000000000000000000000000..fcee793e768984b118e6b8365aa1b8d4aa999390 GIT binary patch literal 93877 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 literal 0 HcmV?d00001 diff --git a/docs/simpkv_LDAP_DIT_and_schema.md b/docs/simpkv_LDAP_DIT_and_schema.md new file mode 100644 index 0000000..9131c32 --- /dev/null +++ b/docs/simpkv_LDAP_DIT_and_schema.md @@ -0,0 +1,123 @@ +#### Table of Contents + + +* [Introduction](#introduction) +* [simpkv DIT](#simpkv-dit) +* [simpkv OID Subtree and Custom LDAP Schema](#simpkv-oid-subtree-and-custom-ldap-schema) + * [simpkv OIDs](#simpkv-oids) + * [simpkv Custom LDAP Schema](#simpkv-custom-ldap-schema) + +## Introduction + +This document describes the simpkv subtree of SIMP Data LDAP Directory Information +Tree (DIT) and its custom LDAP schema. + +Readers are assumed to already have a basic understanding of simpkv and LDAP. + +## simpkv DIT + +SIMP has designed a LDAP DIT to store non-accounts, site data such as simpkv +data. The root of this DIT is depicted below and uses standard LDAP object +classes and attributes: + +![SIMP Data Root DIT](assets/LDAP_DIT_root.png) + +The subtree beneath the *simpkv* root Directory Name (DN), +*ou=simpkv,o=puppet,dc=simp*, has been designed explicitly to support simpkv +data. It is a simple mapping of the notional, file directory tree representation +of backend storage to a LDAP DIT, but it adds a tree for LDAP backend instances. + +A pictoral representation of this mapping is as follows: + +![Logical to simpkv DIT mapping](assets/Logical_to_simpkv_DIT_mapping.png) + +The simpkv subtree of the SIMP Data DIT uses both standard and custom LDAP +object classes and attributes. Specifically, + +* Folders in a key path, LDAP plugin instance identifiers and other grouping + added by either the simpkv adapter or the LDAP plugin (i.e., grouping for + types of keys) are represented by standard organizational units (`ou`). + +* Key/value entries are represented by a custom object class, `simpkvEntry` + with custom key name and value attributes, `simpkvKey` and `simpkvJson Value`. + +* The DN for a key/value node is constructed using each part of the key path + as a Relative DN (RDN). + + +## simpkv OID Subtree and Custom LDAP Schema + +The simpkv DIT data requires at a custom LDAP object class to hold the key +and JSON serialized value attributes. This custom LDAP object class and its +attributes must be specified by unique OIDs. This section describes the SIMP +OID subtree that was designed to support these custom LDAP OIDs and then +uses the OIDs in schemas for the simpkv DIT discussed above. + +### simpkv OIDs + +SIMP has an officially registered OID, +[1.3.6.1.4.1.47012](http://www.oid-info.com/get/1.3.6.1.4.1.47012), under which +all OIDs for Puppet, SNMP, etc. reside. Best practices for OID assignment +dictate that once an OID is in use, its definition is not supposed to change. +In other words, an OID can be deprecated, but not removed or reassigned a +different name. So, SIMP's OID tree has been designed to allow future expansion. + +Below is the (to be published) SIMP OID subtree showing the OIDs required for +simpkv's LDAP custom schema. It organizes the OIDs for attributes and class +objects under corresponding parent OIDs. + +![SIMP OID Tree](assets/simpkv_OID_tree.png) + +### simpkv Custom LDAP Schema + +The custom schema for the simpkv DIT uses the simpkv OIDs and is shown below. +It has a custom object class, `simpkvEntry`, that is comprised of two custom +attributes, `simpkvKey` and `simpkvJsonValue`. + +* `simpkvKey` is a case-invariant string for the key (excluding path) + + * This is used as the final RDN for a key/value node. + +* `simpkvJsonValue` is a case-sensitive string for the JSON-formatted value. + +``` +################################################################################ +# +dn: cn=schema +# +################################################################################ +# +attributeTypes: ( + 1.3.6.1.4.1.47012.1.1.1.1.1.1 + NAME 'simpkvKey' + DESC 'key' + SUP name + SINGLE-VALUE + X-ORIGIN 'SIMP simpkv' + ) +# +################################################################################ +# +attributeTypes: ( + 1.3.6.1.4.1.47012.1.1.1.1.1.2 + NAME 'simpkvJsonValue' + DESC 'JSON-formatted value' + EQUALITY caseExactMatch + SUBSTR caseExactSubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 + SINGLE-VALUE + X-ORIGIN 'SIMP simpkv' + ) +# +################################################################################ +# +objectClasses: ( + 1.3.6.1.4.1.47012.1.1.1.1.2.1 + NAME 'simpkvEntry' + DESC 'simpkv entry' + SUP top + STRUCTURAL + MUST ( simpkvKey $ simpkvJsonValue ) + X-ORIGIN 'SIMP simpkv' + ) +``` diff --git a/docs/simpkv_plugin_development_guide.md b/docs/simpkv_plugin_development_guide.md new file mode 100644 index 0000000..1992d47 --- /dev/null +++ b/docs/simpkv_plugin_development_guide.md @@ -0,0 +1,256 @@ +#### Table of Contents + + + +* [Introduction](#introduction) +* [Terminology](#terminology) +* [Plugin Overview](#plugin-overview) + * [Plugin Instance Lifecycle](#plugin-instance-lifecycle) + * [Plugin Loading ](#plugin-loading) + * [Why worry about cross contamination](#why-worry-about-cross-contamination) +* [Implementing the Plugin API](#implementing-the-plugin-api) + + + +## Introduction + +This is a developers guide for writing custom simpkv plugins. simpkv plugins +are the software interfaces used by simpkv functions to affect the requested +store, retrieve, and modify operations on the key/value stores. + +This guide assumes the plugin writer has the following prequisite knowledge: + +* A basic understanding of what [simpkv provides and how it used and configured](../README.md). +* Ruby +* rspec for unit testing (aka 'spec' testing). + +In addition, a basic understanding of how to acceptance test Puppet modules +using [Beaker](https://github.com/voxpupuli/beaker) is helpful. + +## Terminology + +The following terminology will be used throughout this document: + +* **backend**- A specific key/value store that has unique configuration, (e.g., + directory of files on a local filesystem, LDAP server, Consul server, Etcd + server, Zookeeper server). + +* **plugin** - Ruby anonymous class to interface with a type of backend to + affect the operations requested in simpkv Puppet functions. + + * The class implements the simpkv plugin API for a specific backend type. + * The class will be instantiated and configured for each backend configuration + of that type. + +* **plugin instance** - Instance of the plugin class that is configured for + specific backend configuration + + * Uniquely identified by configured plugin (`'type'`, `'id'`) pair. + +* **plugin adapter** - Internal simpkv Ruby software that loads plugin software, + instantiates plugin objects, and then executes a plugin API call on the appropriate + plugin object to affect a simpkv function call. It also normalizes key paths + and data to be stored (the key's value and metadata), so that plugins simply + manage storage of strings at specified paths. + +## Plugin Overview + +Before implementing a plugin, it is useful to have a basic understanding of the +simpkv internal framework for loading plugin software, instantiating plugin +objects, and then using those objects to affect store/retrieve/modify +operations. + +Conceptionally, you can divide the simpkv internals into 3 pieces: + +* *simpkv library*: A set of simpkv Puppet library functions that provide the + abstract key/value store API to Puppet manifests and does the following with + each simpkv API function call + + * Creates merged simpkv options for the plugin adapter and plugins using + configuration provided by simpkv function signature, `simpkv::options` + hieradata, internal defaults, and the Puppet environment for which the + compilation is being done. + + * Ensures the 'backend' attribute is set to identify the backend to use. + * Adds the 'environment' attribute with the name of the Puppet environment. + + * Ensures the simpkv plugin adapter is loaded and available for the duration + of the catalog run. + * Delegates the function to the corresponding plugin adapter function and + waits for the result. + * Returns the plugin adapter's function result to the requesting Puppet + manifest or fails, per `simpkv::options::softfail` configuration. + +* *simpkv adapter*: A Ruby plugin adapter that loads all available plugin Ruby + files when it is first loaded and then does the following for each function + that corresponds to a simpkv Puppet function call: + + * Ensures the appropriate plugin instance required for the simpkv function + call is constructed, configured, and then cached for the duration of the + catalog run. + + * Adds the appropriate prefix to the key path + + * `environments//` for Puppet environment keys. + * `globals/` for global keys. + + * Serializes the a key's value and metadata to a single string on `simpkv::put` + operation. + + * The stored format is a JSON string described in the [simpkv README](../README.md) + + * Delegates the function to the corresponding plugin adapter function and + waits for the result. + * Deserializes key value and metadata strings on `simpkv::get` or `simpkv::list` + operations back to value and metadata objects. + * Removes key path prefixes on a `simpkv::list` operation. + * Returns the result. + +* *instance plugin*: An instance of the Ruby plugin code for a plugin type that + affects the store operation, after being configured. + +The relationship among the simpkv internal pieces and the key/value store during +manifest compilation will be clarified by the following notional sequence +diagram for an example `simpkv::put` operation. These diagrams assumes we are +using the LDAP plugin and that the simpkv adapter has been loaded and has +already constructed and configured the 'default' LDAP plugin instance. + +![simpkv::put Internal Operation](assets/simpkv_put_operation.png) + +### Plugin Instance Lifecycle + + +All plugin files are loaded the first time any simpkv API function is evaluated +in a catalog compile (similar to using `require` for the each plugin file). +However, each plugin instance is only constructed and configured the first time +it is required for a simpkv function. Each plugin instance is then persisted +until the catalog compile finishes, so it can be used for any subsequent simpkv +function calls that require that backend configuration. + +The plugin instance caching during a catalog compile allows each plugin type +to use the most efficient mechanism available for affecting one or more +transactions with the backend. Just be aware there is not 'destructor' in Ruby. +The plugin objects will go out of scope when the catalog compile finishes, but +the object removal is subject to garbage collection. + +### Plugin Loading + +Each plugin is written in pure Ruby and, to prevent [cross-Puppet-environment +contamination](#why-worry-about-cross-contamination), is implemented as an +anonymous class that is automatically loaded by the simpkv adapter with each +Puppet compile. Specifically, the simpkv adapter will load any module file +whose + +* path is `/lib/puppet_x/simpkv` +* filename ends with `_plugin.rb` +* content contains valid Ruby and is an anonymous class with the Class + definition line that is **exactly** as shown in + [simpkv's plugin_template.rb](../lib/puppet_x/simpkv/plugin_template.rb). + +The simpkv adapter parses each plugin's filename to determine its type, +internally stores the anonymous class for that plugin in a Hash, and then +creates an instance from the stored anonymous class when needed. + + * It assumes the filename format is `_plugin.rb`. + * It only loads the first plugin for any type. + * It emits warnings for duplicate plugin names and malformed plugins. + +If this convoluted but necessary loading mechanism seems a bit complex, it is, +but don't worry! If you create an appropriately named plugin file in your +module, ensure your plugin filename is unique across all Puppet modules, and +follow the instructions provided for implementing and testing your plugin, +you will not have problems with plugin loading or +cross-Puppet-environment-contamination. + +#### Why worry about cross contamination + +[Puppet-environment cross contamination](https://tickets.puppetlabs.com/browse/SERVER-94) +occurs when Ruby code from Puppet modules in one Puppet environment is +erroneously used in a Puppet manifest compile for a different Puppet +environment. Puppet has done an excellent job of solving this contamination +problem for standard Ruby Puppet code (Puppet Ruby API functions, facts, custom +types and providers). Unfortunately, the infrastructure required for simpkv +falls outside the bounds of standard Puppet code. So, we have to take steps to +ensure cross-contamination does not occur in any of the simpkv internals, +including simpkv plugins. Specifically, we need to make sure that any Ruby code +simpkv internally loads in any given Puppet compiler instance is only from the +Puppet code for that Puppet environment. + +This code loading requirement means that simpkv cannot use load its adapter or +the software for a particular plugin using a normal Ruby `require`, such as +`require 'ldap_plugin'`. Other more oblique methods are required. + +When simpkv was developed, two primary solutions for ensuring that +cross-contamination does not occur were considered: + +* Generate plugin class names dynamically and ensure the Puppet environment is + part of the each class name. +* Use anonymous classes. + +Both are painful. Using the anonymous class method seemed the least painful of +the two. + +## Implementing Plugin API + +To create your own plugin + +1. Create a `lib/puppet_x/simpkv` directory within your plugin module. +2. Copy [simpkv's lib/puppet_x/simpkv/plugin_template.rb](../lib/puppet_x/simpkv/plugin_template.rb) + into that directory with a name `_plugin.rb`. For example, + `my_module_consul_plugin.rb`. +3. **READ all the documentation in your plugin skeleton**, paying close attention + the *SIMPKV PLUGIN REQUIREMENTS* discussion. + + * You may find it helpful to peruse simpkv's LDAP and file plugin + implementations if you have any questions about the API. + +4. Implement the body of each method as identified by a `FIXME`. + + * Make sure your implementation handles any exceptions, locally, and returns + exactly what the API dictates. + + +5. Write unit tests for your plugin, using the unit tests for simpkv's LDAP + and file plugins as examples. + + * Your plugin's tests can be written using the same unit test infrastructure + you use for Puppet module spec testing. + * The unit tests for simpkv's plugins can be found at + [spec/unit/puppet_x/simpkv/](../spec/unit/puppet_x/simpkv). + * Both plugin tests shows you how to instantiate an object of your plugin + for unit testing purposes. + + * This is simple, but something you normally don't have to worry about for + Puppet module testing. + + * The LDAP plugin test demonstrates how to using rspec mocking for simulating + external interactions. + + +6. Write acceptance tests for your plugin, using the acceptance tests for + simpkv's LDAP and file plugins in + [spec/acceptance/suites/ldap_plugin/](../spec/acceptances/suites/ldap_plugin), + and [spec/acceptance/suites/default/](../spec/acceptances/suites/default), + as examples. These tests use the + ['simpkv plugin test' shared_examples](../spec/acceptance/shared_examples/simpkv_plugin.rb) + to exercise and validatate plugin operation via a standard set of simpkv + function calls operations. + + * Use the *'simpkv plugin' shared_examples* if you want to ensure your + plugin works in the same fashion as the two plugins provided by simpkv. + * You will have to ensure [simpkv's simpkv_test module](../spec/support/modules/simpkv_test) + is in the module path for your test. + * You will have to provide a plugin-specific validator for these tests. + (See the comments within the *shared_examples* for details.) + * This *shared_examples* may use methods provided the + [SIMP Beaker Helpers Ruby Gem](https://github.com/simp/rubygem-simp-beaker-helpers). + + * Be sure to add simp-beaker-helpers to your gem file and add the appropriate + `include` directives in your `spec/spec_helper_acceptance.rb`. + +7. Document your plugin's type, configuration parameters and requirements in + the README.md for your plugin module. + + * Be sure to list any RPM packages or Ruby Gems that need to be installed + in order for your plugin to operate. diff --git a/lib/puppet_x/simpkv/consul_provider.rb b/lib/puppet_x/simpkv/consul_provider.rb deleted file mode 100644 index 587606f..0000000 --- a/lib/puppet_x/simpkv/consul_provider.rb +++ /dev/null @@ -1,340 +0,0 @@ -# vim: set expandtab ts=2 sw=2: -provider_class = Class.new do - require 'net/http' - require 'uri' - require 'base64' - - def self.name - 'consul' - end - - def initialize(url, auth) - @uri = URI.parse(url) - @resturi = URI.parse(url) - scheme_split = @uri.scheme.split("+") - # defaults - @resturi.scheme = "http" - @verifyssl = true - scheme_split.each do |modifier| - case modifier - when "ssl" - @resturi.scheme = "https" - when "nossl" - @resturi.scheme = "http" - when "verify" - @verifyssl = true - when "noverify" - @verifyssl = false - end - end - @auth = auth - @basepath = @uri.path.chomp("/") - # XXX: Todo: break out the rest client into a mixin - # - # self.extend($SIMPKV.restclient); - # - - end - - # Begin REST Client - - def rest_request(params = {}) - unless params.key?(:method) - params[:method] = 'GET' - end - http = Net::HTTP.new(@uri.host, @uri.port) - http.use_ssl = @resturi.scheme == 'https' - if (@resturi.scheme == 'https') - if (@auth != nil) - if (@auth.key?("ca_file")) - http.ca_file = @auth["ca_file"] - end - if (@auth.key?("cert_file")) - http.cert = OpenSSL::X509::Certificate.new(File.read(@auth["cert_file"])) - end - if (@auth.key?("key_file")) - http.key = OpenSSL::PKey::RSA.new(File.read(@auth["key_file"])) - end - end - if (@verifyssl == true) - http.verify_mode = OpenSSL::SSL::VERIFY_PEER - else - http.verify_mode = OpenSSL::SSL::VERIFY_NONE - end - end - case params[:method] - when 'GET' - request = Net::HTTP::Get.new(params[:path]) - when 'DELETE' - request = Net::HTTP::Delete.new(params[:path]) - when 'PUT' - request = Net::HTTP::Put.new(params[:path]) - request.body = params[:body].to_s - end - if (params.key?("headers")) - params["headers"].each do |key, value| - request[key] = value - end - end - response = http.request(request) - end - - # End REST Client - def consul_request(params) - headers = {} - if (@auth != nil) - headers['X-Consul-Token'] = @auth["token"] - end - params["headers"] = headers - rest_request(params) - end - def supports(params) - [ - "delete", - "deletetree", - 'get', - 'put', - 'exists', - 'list', - - 'atomic_create', - 'atomic_delete', - 'atomic_get', - 'atomic_put', - 'atomic_list', - - 'empty_value', - 'info', - 'provider', - 'supports', - ] - end - def provider(params) - "consul" - end - def get(params) - key = params['key'] - if (key == nil) - throw Exception - end - begin - response = consul_request(path: "/v1/kv" + @basepath + key) - if (response.class == Net::HTTPOK) - json = response.body - parsed = JSON.parse(json)[0]; - value = Base64.decode64(parsed['Value']); - elsif (response.class == Net::HTTPNotFound) - self.empty_value({})['value'] - else - end - rescue - nil - end - end - - def put(params) - retval = {} - debug = params['debug'] - key = params['key'] - value = params['value'] - - if (key == nil) - raise "Put requires 'key' to be specified" - end - - if (value == nil) - raise "Put requires 'value' to be specified" - end - response = consul_request(path: "/v1/kv" + @basepath + key, method: 'PUT', body: value) - if (debug == true) - retval["response_class"] = response.class - retval["response_body"] = response.body - end - if (response.class == Net::HTTPOK) - if (response.body == "true\n") - retval["result"] = true - else - retval["result"] = false - end - else - retval["result"] = false - end - unless (params["debug"] == true) - retval = retval["result"] - end - return retval - end - - def atomic_get(params) - key = params['key'] - if (key == nil) - throw Exception - end - begin - response = consul_request(path: "/v1/kv" + @basepath + key) - if (response.class == Net::HTTPOK) - json = response.body - parsed = JSON.parse(json)[0]; - parsed['value'] = Base64.decode64(parsed['Value']); - parsed - elsif (response.class == Net::HTTPNotFound) - self.empty_value({}) - else - throw Exception - end - rescue - throw Exception - end - end - def atomic_create(params) - empty = empty_value() - atomic_put(params.merge({ 'previous' => empty})) - end - def atomic_put(params) - key = params['key'] - value = params['value'] - previous = params['previous'] - - if (key == nil) - throw Exception - end - - if (value == nil) - throw Exception - end - if (previous == nil) - throw Exception - end - previndex=previous["ModifyIndex"] - path = "/v1/kv" + @basepath + key + "?cas=" + previndex.to_s - response = consul_request(path: path, method: 'PUT', body: value) - if (response.class == Net::HTTPOK) - if (response.body =~ /true/) - true - else - false - end - elsif(response.class == Net::HTTPInternalServerError) - false - else - false - end - end - def atomic_delete(params) - key = params['key'] - previous = params['previous'] - - if (key == nil) - throw Exception - end - if (previous == nil) - throw Exception - end - previndex=previous["ModifyIndex"] - response = consul_request(path: "/v1/kv" + @basepath + key + "?cas=" + previndex.to_s, method: 'DELETE') - if (response.class == Net::HTTPOK) - if (response.body =~ /true/) - true - else - false - end - else - false - end - end - def delete(params) - key = params['key'] - if (key == nil) - throw Exception - end - # Get the value of key first. This is the only way to tell if we try to delete a key - response = consul_request(path: "/v1/kv" + @basepath + key, method: 'DELETE') - if (response.class == Net::HTTPOK) - if (response.body =~ /true/) - true - else - false - end - else - false - end - end - def deletetree(params) - end - def info(params) - end - def atomic_list(params) - key = params['key'] - last_char = key.slice(key.size - 1,1) - if (last_char != "/") - key = key + "/" - end - if (key == nil) - throw Exception - end - retval = {} - begin - response = consul_request(path: "/v1/kv" + @basepath + key + "?recurse") - if (response.class == Net::HTTPOK) - json = response.body - value = JSON.parse(json) - else - return retval - end - rescue - return retval - end - - last_char = key.slice(key.size - 1,1) - if (last_char != "/") - key = key + "/" - end - reg = Regexp.new("^" + @basepath.gsub(/^\//, "") + key) - unless (value == nil) - value.each do |entry| - nkey = entry["Key"].gsub(reg,"") - retval[nkey] = entry - unless (entry["Value"] == nil) - retval[nkey]["value"] = Base64.decode64(entry["Value"]) - else - retval[nkey]["value"] = nil - end - retval[nkey].delete("Value") - retval[nkey].delete("Key") - end - end - retval - end - def list(params) - list = atomic_list(params) - retval = {} - unless (list == nil) - list.each do |key, entry| - retval[key] = entry["value"] - end - end - retval - end - def exists(params) - key = params['key'] - if (key == nil) - throw Exception - end - # Get the value of key first. This is the only way to tell if we try to delete a key - response = consul_request(path: "/v1/kv" + @basepath + key + "?keys", method: 'GET') - if (response.class == Net::HTTPOK) - true - elsif(response.class == Net::HTTPNotFound) - false - else - false - end - - end - def empty_value(params = {}) - { - "ModifyIndex" => 0, - "value" => nil - } - end -end diff --git a/lib/puppet_x/simpkv/file_plugin.rb b/lib/puppet_x/simpkv/file_plugin.rb index 08a8e38..dec7132 100644 --- a/lib/puppet_x/simpkv/file_plugin.rb +++ b/lib/puppet_x/simpkv/file_plugin.rb @@ -37,12 +37,13 @@ def initialize(name) # The plugin-specific configuration will be found in # `options['backends'][ options['backend'] ]`: # - # * `root_path`: root directory path; defaults to '/var/simp/simpkv/' when - # that directory can be created or '/simp/simpkv/' - # otherwise - # * `lock_timeout_seconds`: max seconds to wait for an exclusive file lock - # on a file modifying operation before failing the operation; defaults - # to 5 seconds + # * `root_path`: Optional. Root directory path + # - Defaults to '/var/simp/simpkv/' when that directory can be created + # or '/simp/simpkv/' otherwise + # + # * `lock_timeout_seconds`: Optional. Max seconds to wait for an exclusive file lock + # on a file modifying operation before failing the operation + # - Defaults to 5 seconds # # @param options Hash of global simpkv and backend-specific options # @raise RuntimeError if any required configuration is missing from options, @@ -59,8 +60,6 @@ def configure(options) options['backends'].has_key?(options['backend']) && options['backends'][ options['backend'] ].has_key?('id') && options['backends'][ options['backend'] ].has_key?('type') && - # self is not available to an anonymous class and can't use constants, - # so have to repeat what is already in self.type (options['backends'][ options['backend'] ]['type'] == 'file') ) raise("Plugin misconfigured: #{options}") diff --git a/lib/puppet_x/simpkv/ldap_plugin.rb b/lib/puppet_x/simpkv/ldap_plugin.rb new file mode 100644 index 0000000..1c75e7f --- /dev/null +++ b/lib/puppet_x/simpkv/ldap_plugin.rb @@ -0,0 +1,1158 @@ +# Plugin implementation of an interface to an LDAP key/value store +# +# Each plugin **MUST** be an anonymous class accessible only through +# a `plugin_class` local variable. +# DO NOT CHANGE THE LINE BELOW!!!! +plugin_class = Class.new do + require 'facter' + require 'pathname' + require 'set' + attr_accessor :existing_folders + + # NOTES FOR MAINTAINERS: + # - See simpkv/lib/puppet_x/simpkv/plugin_template.rb for important + # information about plugin responsibilties and restrictions. + # - One OBTW that will drive you crazy are limitations on anonymous classes. + # In typical Ruby code, using constants and class methods is quite normal. + # Unfortunately, you cannot use constants or class methods in an anonymous + # class, as they will be added to the Class Object, itself, and will not be + # available to the anonymous class. In other words, you will be tearing your + # hair out trying to figure out why normal Ruby code does not work here! + + ###### Public Plugin API ###### + + # Construct an instance of this plugin setting its instance name + # + # @param name Name to ascribe to this plugin instance + # + def initialize(name) + @name = name + + # Whether configuration required for public API has been set + @configured = false + + # Path to root of the key/value tree for this plugin instance + # - Relative to simpkv root tree + # - Don't need the the 'ldap/' prefix the simpkv adapter adds to @name... + # just want the configured id + @instance_path = File.join('instances', @name.gsub(%r{^ldap/},'')) + + # Maintain a list of folders that already exist to reduce the number of + # unnecessary ldap add operations over the lifetime of this plugin instance + @existing_folders = Set.new + + # Configuration to be set in configure() + # - Base DN of the simpkv tree + # - Number of times to retry an LDAP operation if the server reports it + # is busy + # - Base LDAP commands, each of which includes any environment variables, + # general standard options and any command-specific options + @base_dn = nil + @retries = nil + @ldapadd = nil + @ldapdelete = nil + @ldapmodify = nil + @ldapsearch = nil + + Puppet.debug("#{@name} simpkv plugin constructed") + end + + # Configure this plugin instance using global and plugin-specific + # configuration found in options + # + # The plugin-specific configuration will be found in + # `options['backends'][ options['backend'] ]`: + # + # * `ldap_uri`: Required. The LDAP server URI. + # - This can be a LDAPI socket path or an ldap/ldaps URI + # specifying host and port. + # - When using an 'ldap://' URI with StartTLS, `enable_tls` + # must be true and `tls_cert`, `tls_key`, and `tls_cacert` + # must be configured. + # - When using an 'ldaps://' URI, `tls_cert`, `tls_key`, and + # `tls_cacert` must be configured. + # + # * `base_dn`: Optional. The root DN for the 'simpkv' tree in LDAP. + # - Defaults to 'ou=simpkv,o=puppet,dc=simp' + # - Must already exist + # + # * `admin_dn`: Optional. The bind DN for simpkv administration. + # - Defaults to 'cn=Directory_Manager'. + # - This identity must have permission to modify the LDAP tree + # below `base_dn`. + # + # * `admin_pw_file`: Required for all but LDAPI. A file containing the simpkv + # adminstration password. + # - Will be used for authentication when set, even with + # LDAPI. + # - When unset for LDAPI, the admin_dn is assumed to + # be properly configured for external EXTERNAL SASL + # authentication for the user compiling the manifest + # (e.g., 'puppet' for 'puppet agent', 'root' for + # 'puppet apply' and the Bolt user for Bolt plans). + # + # * `enable_tls`: Optional. Whether to enable TLS. + # - Defaults to true when `ldap_uri` is an 'ldaps://' URI, + # otherwise defaults to false. + # - Must be set to true to enable StartTLS when using an + # 'ldap://' URI. + # - When true `tls_cert`, `tls_key` and `tls_cacert` must + # be set. + # + # * `tls_cert`: Required for StartTLS or TLS. The certificate file. + # * `tls_key`: Required for StartTLS or TLS. The key file. + # * `tls_cacert`: Required for StartTLS or TLS. The cacert file. + # * `retries`: Optional. Number of times to retry an LDAP operation if the + # server reports it is busy. + # - Defaults to 1. + # + # @param options Hash of global simpkv and backend-specific options + # + # @raise RuntimeError if ldap_uri is malformed, any required configuration is + # missing from options, or cannot connect to the LDAP server + # + def configure(options) + # backend config should already have been verified by simpkv adapter, but + # just in case... + unless ( + options.is_a?(Hash) && + options.has_key?('backend') && + options.has_key?('backends') && + options['backends'].is_a?(Hash) && + options['backends'].has_key?(options['backend']) && + options['backends'][ options['backend'] ].has_key?('id') && + options['backends'][ options['backend'] ].has_key?('type') && + (options['backends'][ options['backend'] ]['type'] == 'ldap') + ) + raise("Plugin misconfigured: #{options}") + end + + # parse and validate backend config options and then set variables needed + # for LDAP operations + opts = parse_config(options['backends'][options['backend']]) + @base_dn = opts[:base_dn] + @retries = opts[:retries] + set_base_ldap_commands(opts[:cmd_env], opts[:base_opts]) + + # verify LDAP config allows access and then ensure the base tree with + # 'globals' and 'environments' sub-folders is in place + verify_ldap_access + ensure_instance_tree + + @configured = true + Puppet.debug("#{@name} simpkv plugin configured") + end + + # @return unique identifier assigned to this plugin instance + def name + @name + end + + # Deletes a `key` from the configured backend. + # + # @param key String key + # + # @return results Hash + # * :result - Boolean indicating whether operation succeeded + # * :err_msg - String. Explanatory text upon failure; nil otherwise. + # + def delete(key) + Puppet.debug("#{@name} delete(#{key})") + unless @configured + return { + :result => false, + :err_msg => 'Internal error: delete called before configure' + } + end + + full_key_path = File.join(@instance_path, key) + cmd = %Q{#{@ldapdelete} "#{path_to_dn(full_key_path)}"} + deleted = false + err_msg = nil + done = false + retries = @retries + until done + result = run_command(cmd) + case result[:exitstatus] + when 0 + deleted = true + done = true + when ldap_code_no_such_object + deleted = true + done = true + when ldap_code_server_is_busy + if (retries == 0) + err_msg = result[:stderr] + done = true + end + else + err_msg = result[:stderr] + done = true + end + retries -= 1 + end + + { :result => deleted, :err_msg => err_msg } + end + + # Deletes a whole folder from the configured backend. + # + # @param keydir String key folder path + # + # @return results Hash + # * :result - Boolean indicating whether operation succeeded + # * :err_msg - String. Explanatory text upon failure; nil otherwise. + # + def deletetree(keydir) + Puppet.debug("#{@name} deletetree(#{keydir})") + unless @configured + return { + :result => false, + :err_msg => 'Internal error: deletetree called before configure' + } + end + + full_keydir_path = File.join(@instance_path, keydir) + cmd = %Q{#{@ldapdelete} -r "#{path_to_dn(full_keydir_path, false)}"} + deleted = false + err_msg = nil + done = false + retries = @retries + until done + result = run_command(cmd) + case result[:exitstatus] + when 0 + deleted = true + done = true + when ldap_code_no_such_object + deleted = true + done = true + when ldap_code_server_is_busy + if (retries == 0) + err_msg = result[:stderr] + done = true + end + else + err_msg = result[:stderr] + done = true + end + retries -= 1 + end + + if deleted + existing_folders.delete(full_keydir_path) + parent_path = full_keydir_path + "/" + existing_folders.delete_if { |path| path.start_with?(parent_path) } + end + + { :result => deleted, :err_msg => err_msg } + end + + # Returns whether key or key folder exists in the configured backend. + # + # @param key String key or key folder to check + # + # @return results Hash + # * :result - Boolean indicating whether key/key folder exists; + # nil if could not be determined + # * :err_msg - String. Explanatory text when status could not be + # determined; nil otherwise. + # + def exists(key) + Puppet.debug("#{@name} exists(#{key})") + unless @configured + return { + :result => nil, + :err_msg => 'Internal error: exists called before configure' + } + end + + # don't know if the key path is to a key or a folder so need to create a + # search filter for both an RDN of ou= or an RDN simpkvKey=. + full_key_path = File.join(@instance_path, key) + dn = path_to_dn(File.dirname(full_key_path), false) + leaf = File.basename(key) + search_filter = "(|(ou=#{leaf})(simpkvKey=#{leaf}))" + cmd = [ + @ldapsearch, + '-b', %Q{"#{dn}"}, + '-s one', + %Q{"#{search_filter}"}, + '1.1' # only print out the dn, no attributes + ].join(' ') + + found = false + err_msg = nil + done = false + retries = @retries + until done + result = run_command(cmd) + case result[:exitstatus] + when 0 + # Parent DN exists, but search may or may not have returned a result + # (i.e. search may have returned no matches). Have to parse console + # output to see if a dn was returned. + found = true if result[:stdout].match(%r{^dn: (ou=#{leaf})|(simpkvKey=#{leaf}),#{dn}}) + done = true + when ldap_code_no_such_object + # Some part of the parent DN does not exist, so it does not exist! + done = true + when ldap_code_server_is_busy + if (retries == 0) + found = nil + err_msg = result[:stderr] + done = true + end + else + found = nil + err_msg = result[:stderr] + done = true + end + retries -= 1 + end + + { :result => found, :err_msg => err_msg } + end + + # Retrieves the value stored at `key` from the configured backend. + # + # @param key String key + # + # @return results Hash + # * :result - String. Retrieved value for the key; nil if could not + # be retrieved + # * :err_msg - String. Explanatory text upon failure; nil otherwise. + # + def get(key) + Puppet.debug("#{@name} get(#{key})") + unless @configured + return { + :result => nil, + :err_msg => 'Internal error: get called before configure' + } + end + + full_key_path = File.join(@instance_path, key) + cmd = %Q{#{@ldapsearch} -b "#{path_to_dn(full_key_path)}"} + value = nil + err_msg = nil + done = false + retries = @retries + until done + result = run_command(cmd) + case result[:exitstatus] + when 0 + match = result[:stdout].match(/^simpkvJsonValue: (.*?)$/) + if match + value = match[1] + else + err_msg = "Key retrieval did not return key/value entry:" + err_msg += "\n#{result[:stdout]}" + end + done = true + when ldap_code_server_is_busy + if (retries == 0) + err_msg = result[:stderr] + done = true + end + else + err_msg = result[:stderr] + done = true + end + retries -= 1 + end + + { :result => value, :err_msg => err_msg } + end + + # Returns a listing of all keys/info pairs and sub-folders in a folder + # + # The list operation does not recurse through any sub-folders. Only + # information about the specified key folder is returned. + # + # This implementation is best effort. It will attempt to retrieve the + # information in a folder and only fail if the folder itself cannot be + # accessed. Individual key retrieval failures will be ignored. + # + # @return results Hash + # * :result - Hash of retrieved key and sub-folder info; nil if the + # retrieval operation failed + # + # * :keys - Hash of the key/value pairs for keys in the folder + # * :folders - Array of sub-folder names + # + # * :err_msg - String. Explanatory text upon failure; nil otherwise. + # + def list(keydir) + Puppet.debug("#{@name} list(#{keydir})") + unless @configured + return { + :result => nil, + :err_msg => 'Internal error: list called before configure' + } + end + full_keydir_path = File.join(@instance_path, keydir) + + cmd = [ + @ldapsearch, + '-b', %Q{"#{path_to_dn(full_keydir_path, false)}"}, + '-s', 'one', + ].join(' ') + + ldif_out = nil + err_msg = nil + done = false + retries = @retries + until done + result = run_command(cmd) + case result[:exitstatus] + when 0 + ldif_out = result[:stdout] + done = true + when ldap_code_no_such_object + err_msg = result[:stderr] + done = true + when ldap_code_server_is_busy + if (retries == 0) + err_msg = result[:stderr] + done = true + end + else + err_msg = result[:stderr] + done = true + end + retries -= 1 + end + + list = nil + unless ldif_out.nil? + if ldif_out.empty? + list = { :keys => {}, :folders => [] } + else + list = parse_list_ldif(ldif_out) + end + end + + { :result => list, :err_msg => err_msg } + end + + # Sets the data at `key` to a `value` in the configured backend. + # + # @param key String key + # @param value String value + # + # @return results Hash + # * :result - Boolean indicating whether operation succeeded + # * :err_msg - String. Explanatory text upon failure; nil otherwise. + # + def put(key, value) + Puppet.debug("#{@name} put(#{key},...)") + unless @configured + return { + :result => false, + :err_msg => 'Internal error: put called before configure' + } + end + + full_key_path = File.join(@instance_path, key) + + # We want to add the key/value entry if it does not exist, but only modify + # the value if its current value does not match the desired value. + # The modification restriction ensures that we do not update LDAP's + # modifyTimestamp unnecessarily. Accurate timestamps are important for + # keystore auditing! + # + # The tricky part is this add/update logic is that, at any point in this + # process, something else could be modifying the database at the same time. + # So, there is no point in checking for the existence of the key's folders + # or its key/value entry, because that info may not be accurate at the time + # we request our changes. Instead, try to add each folder/key node + # individually, and handle any "Already exists" failures appropriately for + # each node. + + results = nil + ldap_results = ensure_folder_path( File.dirname(full_key_path) ) + if ldap_results[:success] + # first try ldapadd for the key/value entry + ldif = entry_add_ldif(full_key_path, value) + + Puppet.debug("#{@name} Attempting add for #{full_key_path}") + ldap_results = ldap_add(ldif, false) + + if ldap_results[:success] + results = { :result => true, :err_msg => nil } + elsif (ldap_results[:exitstatus] == ldap_code_already_exists) + Puppet.debug("#{@name} #{full_key_path} already exists") + # ldapmodify only if necessary + results = update_value_if_changed(key, value) + else + results = { :result => false, :err_msg => ldap_results[:err_msg] } + end + else + results = { :result => false, :err_msg => ldap_results[:err_msg] } + end + + results + end + + ###### Internal Methods ###### + + # Ensure all folders in a folder path are present. + # + # Adds any folder not in @existing_folders + # + # @param folder_path the folder path to ensure + # + # @return results Hash + # * :success - Whether all folders are now present + # * :exitstatus - 0 when all folders are now present or the exit code of + # the first folder add operation that failed + # * :err_msg - nil when all folders are now present or the error message + # of the first folder add operation that failed + # + def ensure_folder_path(folder_path) + Puppet.debug("#{@name} ensure_folder_path(#{folder_path})") + # Handle each folder separately instead of all at once, so we don't have to + # use log scraping to understand what happened...log scraping is fragile! + ldif_file = nil + folders_ensured = true + results = nil + Pathname.new(folder_path).descend do |folder| + folder_str = folder.to_s + next if existing_folders.include?(folder_str) + ldif = folder_add_ldif(folder_str) + ldap_results = ldap_add(ldif, true) + if ldap_results[:success] + existing_folders.add(folder_str) + else + folders_ensured = false + results = ldap_results + break + end + end + + if folders_ensured + results = { :success => true, :exitstatus => 0, :err_msg => nil } + end + + results + end + + # Ensures the basic tree for this instance is created below the base DN + # base DN + # | - instances + # | | - + # | | | - globals + # | | | - environments + # | | -- + # | -- + # -- + def ensure_instance_tree + [ + File.join(@instance_path, 'globals'), + File.join(@instance_path, 'environments') + ].each do | folder| + # Have already verified access to the base DN, so going to *assume* any + # failures here are transient and will ignore them for now. If there is + # a persistent problem, it will be caught in the first key storage + # operation. + ensure_folder_path(folder) + end + end + + # @return LDIF to add a simpkvEntry containing a key/value pair + def entry_add_ldif(key, value) + <<~EOM + dn: #{path_to_dn(key)} + objectClass: simpkvEntry + objectClass: top + simpkvKey: #{File.basename(key)} + simpkvJsonValue: #{value} + EOM + end + + # @return LDIF to modify the value (simpkvJsonValue) of a + # a simpkvEntry containing a key/value pair + def entry_modify_ldif(key, value) + <<~EOM + dn: #{path_to_dn(key)} + changetype: modify + replace: simpkvJsonValue + simpkvJsonValue: #{value} + EOM + end + + # @return LDIF to add a folder (organizationalUnit) + def folder_add_ldif(folder) + <<~EOM + dn: #{path_to_dn(folder, false)} + ou: #{File.basename(folder)} + objectClass: top + objectClass: organizationalUnit + EOM + end + + # Execute ldapadd with the specified LDIF content + # + # - Used to add a folder (organizationalUnit) or a key/value pair (simpkvEntry). + # - When ignore_already_exists is true, the attributes of the existing + # element will NOT be changed. So, ignore_already_exists is most useful + # when you want to add a folder and don't care if it already exists. + # + # @param ldif LDIF with key/value pair or folder to add + # @param ignore_already_exists Whether to ignore 'Already exists' failure + # @return results Hash + # * :success - Whether the ldapadd succeeded; Will be true when + # the ldapadd failed with 'Already exists' return code, but + # ignore_already_exists is true. + # * :exitstatus - The exitstatus of the ldapadd operation + # * :err_msg - nil when :success is true or the error message of the + # ldapadd operation + # + def ldap_add(ldif, ignore_already_exists = false) + # Maintainers: Comment out this line to see actual LDIF content when + # debugging. Since may contain sensitive info, we don't want to allow this + # output normally. + #Puppet.debug( "#{@name} add ldif:\n#{ldif}" ) + ldif_file = Tempfile.new('ldap_add') + ldif_file.puts(ldif) + ldif_file.close + + cmd = "#{@ldapadd} -f #{ldif_file.path}" + added = false + exitstatus = nil + err_msg = nil + done = false + retries = @retries + until done + result = run_command(cmd) + case result[:exitstatus] + when 0 + added = true + exitstatus = 0 + done = true + when ldap_code_already_exists + if ignore_already_exists + added = true + exitstatus = 0 + else + err_msg = result[:stderr] + exitstatus = result[:exitstatus] + end + done = true + when ldap_code_server_is_busy + if (retries == 0) + err_msg = result[:stderr] + exitstatus = result[:exitstatus] + done = true + end + else + err_msg = result[:stderr] + exitstatus = result[:exitstatus] + done = true + end + retries -= 1 + end + + { :success => added, :exitstatus => exitstatus, :err_msg => err_msg } + ensure + ldif_file.close if ldif_file + ldif_file.unlink if ldif_file + end + + # LDAP return code for 'Already exists' + def ldap_code_already_exists + 68 + end + + # LDAP return code for 'No such object' + def ldap_code_no_such_object + 32 + end + + # LDAP return code for 'Server is busy' + def ldap_code_server_is_busy + 51 + end + + # Execute ldapmodify with the specified LDIF content + # + # - Used to modify the value (simpkvJsonValue) of an existing key/value pair + # (simpkvEntry) + # + # @param ldif LDIF with modification to affect + # @return results Hash + # * :success - Whether the ldapmodify succeeded + # * :exitstatus - The exitstatus of the ldapmodify operation + # * :err_msg - nil when :success is true or the error message of the + # ldapmodify operation + # + def ldap_modify(ldif) + # Maintainers: Comment out this line to see actual LDIF content when + # debugging. Since may contain sensitive info, we don't want to allow this + # output normally. + #Puppet.debug( "#{@name} modify ldif:\n#{ldif}" ) + ldif_file = Tempfile.new('ldap_modify') + ldif_file.puts(ldif) + ldif_file.close + + cmd = "#{@ldapmodify} -f #{ldif_file.path}" + modified = false + exitstatus = nil + err_msg = nil + done = false + retries = @retries + until done + result = run_command(cmd) + case result[:exitstatus] + when 0 + modified = true + done = true + when ldap_code_no_such_object + # DN got removed out from underneath us. Going to just accept this + # failure for now, as unclear the complication in the logic to turn + # around and add the entry is worth it. + err_msg = result[:stderr] + done = true + when ldap_code_server_is_busy + if (retries == 0) + err_msg = result[:stderr] + done = true + end + else + err_msg = result[:stderr] + done = true + end + exitstatus = result[:exitstatus] + retries -= 1 + end + + { :success => modified, :exitstatus => exitstatus, :err_msg => err_msg } + ensure + ldif_file.close if ldif_file + ldif_file.unlink if ldif_file + + end + + # @return DN corresponding to a path + # + # @param path Folder or key path in a keystore + # @param leaf_is_key Whether the final node in this path is a key + # + def path_to_dn(path, leaf_is_key = true) + parts = path.split('/') + dn = nil + if parts.empty? + dn = @base_dn + else + attribute = leaf_is_key ? 'simpkvKey' : 'ou' + dn = "#{attribute}=#{parts.pop}" + parts.reverse.each do |folder| + dn += ",ou=#{folder}" + end + dn += ",#{@base_dn}" + end + + dn + end + + # Extract and validate configuration for use with ldapsearch, ldapadd, + # ldapmodify, and ldapdelete commands + # + # Parses the following configuration + # * `ldap_uri`: Required. The LDAP server URI. + # - This can be a LDAPI socket path or an ldap/ldaps URI + # specifying host and, optionally, port. + # - When using an 'ldap://' URI with StartTLS, `enable_tls` + # must be true and `tls_cert`, `tls_key`, and `tls_cacert` + # must be configured. + # - When using an 'ldaps://' URI, `tls_cert`, `tls_key`, and + # `tls_cacert` must be configured. + # + # * `base_dn`: Optional. The root DN for the 'simpkv' tree in LDAP. + # - Defaults to 'ou=simpkv,o=puppet,dc=simp' + # - Must already exist + # + # * `admin_dn`: Optional. The bind DN for simpkv administration. + # - Defaults to 'cn=Directory_Manager' + # - This identity must have permission to modify the LDAP tree + # below `base_dn`. + # + # * `admin_pw_file`: Required for all but LDAPI. A file containing the simpkv + # adminstration password. + # - Will be used for authentication when set, even with + # LDAPI. + # - When unset for LDAPI, the admin_dn is assumed to + # be properly configured for external EXTERNAL SASL + # authentication for the user compiling the manifest + # (e.g., 'puppet' for 'puppet agent', 'root' for + # 'puppet apply' and the Bolt user for Bolt plans). + # + # * `enable_tls`: Optional. Whether to enable TLS. + # - Defaults to true when `ldap_uri` is an 'ldaps://' URI, + # otherwise defaults to false. + # - Must be set to true to enable StartTLS when using an + # 'ldap://' URI. + # - When true `tls_cert`, `tls_key` and `tls_cacert` must + # be set. + # + # * `tls_cert`: Required for StartTLS or TLS. The certificate file. + # * `tls_key`: Required for StartTLS or TLS. The key file. + # * `tls_cacert`: Required for StartTLS or TLS. The cacert file. + # * `retries`: Optional. Number of times to retry an LDAP operation if the + # server reports it is busy. + # - Defaults to 1. + # + # @param config Hash backend-specific options + # + # @return parsed config Hash + # * :base_dn - Base DN of the simpkv tree + # * :cmd_env - Any environment variables required for the ldap* commands + # * :base_opts - Base options for the ldap* commands which include the LDAP + # server URL and authentication options + # * :retries - Number of times a ldap* command should be retried + # + # @raise RuntimeError upon any of the following validation failures: + # * 'ldap_uri' option is missing + # * 'ldap_uri' does not begin with 'ldapi:', 'ldap:', or 'ldaps:' + # * 'admin_pw_file' is not configured + # * 'admin_pw_file' file does not exist + # * TLS configuration is not complete when 'ldap_uri' begins with 'ldaps:' + # or 'enable_tls' present and set to true + # + def parse_config(config) + opts = {} + + ldap_uri = config['ldap_uri'] + raise("Plugin missing 'ldap_uri' configuration") if ldap_uri.nil? + + # TODO this regex for URI or socket can be better! + unless ldap_uri.match(%r{^(ldapi|ldap|ldaps)://\S.}) + raise("Invalid 'ldap_uri' configuration: #{ldap_uri}") + end + + if config.key?('base_dn') + # TODO Detect when non-escaped characters exist and fail? + opts[:base_dn] = config['base_dn'] + else + opts[:base_dn] = 'ou=simpkv,o=puppet,dc=simp' + Puppet.debug("simpkv plugin #{name}: Using default base DN #{opts[:base_dn]}") + end + + admin_dn = nil + if config.key?('admin_dn') + admin_dn = config['admin_dn'] + else + #FIXME Should not use admin for whole tree + admin_dn = 'cn=Directory_Manager' + Puppet.debug("simpkv plugin #{name}: Using default simpkv admin DN #{admin_dn}") + end + + admin_pw_file = config.fetch('admin_pw_file', nil) + unless ldap_uri.start_with?('ldapi') + raise("Plugin missing 'admin_pw_file' configuration") if admin_pw_file.nil? + end + + if admin_pw_file + raise("Configured 'admin_pw_file' #{admin_pw_file} does not exist") unless File.exist?(admin_pw_file) + end + + if tls_enabled?(config) + opts[:cmd_env], extra_opts = parse_tls_config(config) + opts[:base_opts] = %Q{#{extra_opts} -x -D "#{admin_dn}" -y #{admin_pw_file} -H #{ldap_uri}} + else + opts[:cmd_env] = '' + if admin_pw_file + # unencrypted ldap or ldapi with simple authentication + opts[:base_opts] = %Q{-x -D "#{admin_dn}" -y #{admin_pw_file} -H #{ldap_uri}} + else + # ldapi with EXTERNAL SASL + opts[:base_opts] = "-Y EXTERNAL -H #{ldap_uri}" + end + end + + if config.key?('retries') + opts[:retries] = config['retries'] + else + opts[:retries] = 1 + Puppet.debug("simpkv plugin #{name}: Using retries = #{opts[:retries]}") + end + + opts + end + + # Parse the LDIF output for a ldapsearch that corresponds to a folder + # list operation + # + # @param ldif_out LDIF console output of the ldapsearch operation + # + # @return folder listing results Hash + # * :keys - Hash of the key/value pairs for keys in the folder + # * :folders - Array of sub-folder names + # + def parse_list_ldif(ldif_out) + folders = [] + keys = {} + ldif_out.split(/^dn: /).each do |ldif| + next if ldif.strip.empty? + if ldif.match(/objectClass: organizationalUnit/i) + rdn = ldif.split("\n").first.split(',').first + folder_match = rdn.match(/^ou=(\S+)$/) + if folder_match + folders << folder_match[1] + else + Puppet.debug("Unexpected organizationalUnit entry:\n#{ldif}") + end + elsif ldif.match(/objectClass: simpkvEntry/i) + key_match = ldif.match(/simpkvKey: (\S+)/i) + if key_match + key = key_match[1] + value_match = ldif.match(/simpkvJsonValue: (\{.+?\})\n/i) + if value_match + keys[key] = value_match[1] + else + Puppet.debug("simpkvEntry missing simpkvJsonValue:\n#{ldif}") + end + else + Puppet.debug("simpkvEntry missing simpkvKey:\n#{ldif}") + end + else + Puppet.debug("Found unexpected object in simpkv tree:\n#{ldif}") + end + end + { :keys => keys, :folders => folders } + end + + # @return Pair of string modifiers for StartTLS/TLS via ldap* commands: + # [ , ] + # + # @param config Hash backend-specific options + # + def parse_tls_config(config) + tls_cert = config.fetch('tls_cert', nil) + tls_key = config.fetch('tls_key', nil) + tls_cacert = config.fetch('tls_cacert', nil) + + if tls_cert.nil? || tls_key.nil? || tls_cacert.nil? + err_msg = "TLS configuration incomplete:" + err_msg += ' tls_cert, tls_key, and tls_cacert must all be set' + raise(err_msg) + end + + cmd_env = [ + "LDAPTLS_CERT=#{tls_cert}", + "LDAPTLS_KEY=#{tls_key}", + "LDAPTLS_CACERT=#{tls_cacert}" + ].join(' ') + + if config['ldap_uri'].match(/^ldap:/) + # StartTLS + extra_opts = '-ZZ' + else + # TLS + extra_opts = '' + end + + [ cmd_env, extra_opts ] + end + + # Execute a command + # + # - Pipes within the command can cause inconsistent results. + # - DON'T USE THEM. + # - TODO. We don't currently check for '|' and fail , because we use '|' + # as the OR operator within a LDAP search term. Need more sophisticated + # check than simply the existence of a '|' in the command string! + # - This method does not wrap the execution with a Timeout block, because + # the commands being executed by this plugin (ldapsearch, ldapadd, etc.) + # have built-in timeout mechanisms. + # + # @param command The command to execute + # + # @return results Hash + # * :success - Whether the exist status was 0 + # * :exitstatus - The exit status + # * :stdout - Messages sent to stdout + # * :stderr - Messages sent to stderr + # + def run_command(command) + Puppet.debug( "#{@name} executing: #{command}" ) + + out_pipe_r, out_pipe_w = IO.pipe + err_pipe_r, err_pipe_w = IO.pipe + pid = spawn(command, :out => out_pipe_w, :err => err_pipe_w) + out_pipe_w.close + err_pipe_w.close + + Process.wait(pid) + exitstatus = $?.nil? ? nil : $?.exitstatus + stdout = out_pipe_r.read + out_pipe_r.close + stderr = err_pipe_r.read + err_pipe_r.close + + stderr = "#{command} failed:\n#{stderr}" if exitstatus != 0 + + { + :success => (exitstatus == 0), + :exitstatus => exitstatus, + :stdout => stdout, + :stderr => stderr + } + end + + # Verifies ldap* commands exist and sets base commands used in LDAP + # operations + # + # @param cmd_env Any environment variables required for the ldap* commands + # @param base_opts Base options for the ldap* commands which include the LDAP + # server URL and authentication options + # + # @raise RuntimeError if ldapadd, ldapdelete, ldapmodify, or ldapsearch + # commands cannot be found + # + def set_base_ldap_commands(cmd_env, base_opts) + # make sure all the openldap-utils commands we need are available + ldapadd = Facter::Core::Execution.which('ldapadd') + ldapdelete = Facter::Core::Execution.which('ldapdelete') + ldapmodify = Facter::Core::Execution.which('ldapmodify') + ldapsearch = Facter::Core::Execution.which('ldapsearch') + + { + 'ldapadd' => ldapadd, + 'ldapdelete' => ldapdelete, + 'ldapmodify' => ldapmodify, + 'ldapsearch' => ldapsearch + }.each do |base_cmd, cmd| + if cmd.nil? + raise("Missing required #{base_cmd} command. Ensure openldap-clients RPM is installed") + end + end + + @ldapsearch = [ + cmd_env, + ldapsearch, + base_opts, + + # TODO switch to ldif_wrap when we drop support for EL7 + # - EL7 only supports ldif-wrap + # - EL8 says it supports ldif_wrap (--help and man page), but actually + # accepts ldif-wrap or ldif_wrap + '-o "ldif-wrap=no" -LLL' + ].join(' ') + + @ldapadd = [ + cmd_env, + ldapadd, + base_opts, + ].join(' ') + + @ldapmodify = [ + cmd_env, + ldapmodify, + base_opts, + ].join(' ') + + @ldapdelete = [ + cmd_env, + ldapdelete, + base_opts, + ].join(' ') + end + + # @return Whether configuration enables TLS + # + # @param config Hash backend-specific options + def tls_enabled?(config) + tls_enabled = false + ldap_uri = config['ldap_uri'] + if ldap_uri.start_with?('ldapi') + tls_enabled = false + elsif ldap_uri.match(/^ldaps:/) + tls_enabled = true + elsif config.key?('enable_tls') + tls_enabled = config['enable_tls'] + else + tls_enabled = false + end + + tls_enabled + end + + # Updates the value of an existing key if the value has changed + # + # Do nothing if value is the same, as we don't want to change LDAP's + # modifyTimestamp + # + # @param key String key + # @param value String value + # + # @return results Hash + # * :result - Boolean indicating whether operation succeeded + # * :err_msg - String. Explanatory text upon failure; nil otherwise. + # + def update_value_if_changed(key, value) + results = nil + full_key_path = File.join(@instance_path, key) + current_result = get(key) + if current_result[:result] + if current_result[:result] != value + Puppet.debug("#{@name} Attempting modify for #{full_key_path}") + ldif = entry_modify_ldif(full_key_path, value) + ldap_results = ldap_modify(ldif) + if ldap_results[:success] + results = { :result => true, :err_msg => nil } + else + results = { :result => false, :err_msg => ldap_results[:err_msg] } + end + else + # no change needed + Puppet.debug("#{@name} #{full_key_path} value already correct") + results = { :result => true, :err_msg => nil } + end + else + err_msg = "Failed to retrieve current value for comparison: #{current_result[:err_msg]}" + results = { :result => false, :err_msg => err_msg } + end + + results + end + + # Verifies can access the LDAP server at the base DN + # + def verify_ldap_access + cmd = [ + @ldapsearch, + '-b', %Q{"#{@base_dn}"}, + '-s base', + '1.1' # only print out the dn, no attributes + ].join(' ') + + found = false + err_msg = nil + done = false + retries = @retries + until done + result = run_command(cmd) + case result[:exitstatus] + when 0 + found = true + done = true + when ldap_code_server_is_busy + if (retries == 0) + err_msg = result[:stderr] + done = true + end + else + err_msg = result[:stderr] + done = true + end + retries -= 1 + end + + unless found + raise("Plugin could not access #{@base_dn}: #{err_msg}") + end + end +end + diff --git a/lib/puppet_x/simpkv/plugin_template.rb b/lib/puppet_x/simpkv/plugin_template.rb index c027a0f..a1d3f06 100644 --- a/lib/puppet_x/simpkv/plugin_template.rb +++ b/lib/puppet_x/simpkv/plugin_template.rb @@ -12,15 +12,17 @@ # # - The plugin code must implement the API in this template. # -# - The plugin code must protect from cross-puppet-environment contamination. +# - The plugin code **must** protect from cross-puppet-environment contamination. # Different versions of the module containing this plugin may be loaded # into the puppetserver at the same time. So, unlike normal Ruby library # code for which only one version will be loaded at a time (e.g., gems # installed in the puppetserver), you have to explicitly design this plugin # code to prevent cross-environment-contamination. This is why the plugin # architecture requires this class to be anonymous and loads it appropriately. -# You must provide similar protections for any supporting Ruby code that you -# package in the module (e.g., a separate connector class). +# You **must** provide similar protections for any supporting Ruby code that you +# package in the module (e.g., a separate connector class). If you are not +# sure how to do this, just keep all of your plugin code within its anonymous +# class. # # - The plugin code must allow multiple instances to be instantiated and run # concurrently. @@ -33,6 +35,10 @@ # - When accessing the backend in the put(), get(), ... methods, the plugin code # should catch exceptions, convert them to meaningful error messages and then # return the failed status in its public API. +# +# - If your plugin uses Ruby Gems that do not come standard with Puppet Ruby, +# you must list them as requirements in your plugin's documentation and +# should provide instructions on how to install those Gems. ############################################################################### @@ -70,6 +76,10 @@ def initialize(name) # Insert the appropriate description of configuration your plugin # supports. # + # The simpkv adapter will call this method before any of the public API methods + # retrieve or change keystore state (i.e., delete(), deletetree(), exists(), + # that get(), list(), put()). + # # The plugin-specific configuration will be found in # `options['backends'][ options['backend'] ]` # @@ -267,8 +277,6 @@ def get(key) # * :keys - Hash of the key/value pairs for keys in the folder # * :folders - Array of sub-folder names # - # * :result - Hash of retrieved key/value pairs; nil if the - # retrieval operation failed # * :err_msg - String. Explanatory text upon failure; nil otherwise. # def list(keydir) diff --git a/lib/puppet_x/simpkv/simpkv.rb b/lib/puppet_x/simpkv/simpkv.rb index 1985eec..a38f89c 100644 --- a/lib/puppet_x/simpkv/simpkv.rb +++ b/lib/puppet_x/simpkv/simpkv.rb @@ -73,10 +73,16 @@ def initialize @plugin_info[plugin_type][:source] Puppet.warning(msg) else - @plugin_info[plugin_type] = { - :class => plugin_class, - :source => filename - } + if plugin_class.nil? + msg = "Skipping load of simpkv plugin from #{filename}: " + + 'Internal error: Plugin missing required plugin_class definition' + Puppet.warning(msg) + else + @plugin_info[plugin_type] = { + :class => plugin_class, + :source => filename + } + end end rescue SyntaxError => e Puppet.warning("simpkv plugin from #{filename} failed to load: #{e.message}") diff --git a/spec/acceptance/helpers/ldap_utils.rb b/spec/acceptance/helpers/ldap_utils.rb new file mode 100644 index 0000000..f793154 --- /dev/null +++ b/spec/acceptance/helpers/ldap_utils.rb @@ -0,0 +1,88 @@ +module Acceptance + module Helpers + module LdapUtils + + # @return DN for a folder path + # + # @param folder Folder path + # @param base_dn Base DN + # + def build_folder_dn(folder, base_dn) + parts = folder.split('/') + dn = '' + parts.reverse.each { |subfolder| dn += "ou=#{subfolder}," } + dn += base_dn + dn + end + + # @return DN for a key path + # + # @param key_path Key path + # @param base_dn Base DN + # + def build_key_dn(key_path, base_dn) + key_name = File.basename(key_path) + key_folder = File.dirname(key_path) + "simpkvKey=#{key_name},#{build_folder_dn(key_folder, base_dn)}" + end + + # @return Command with the LDAP server uri option and options and + # environment variables for authentication + # + # **ASSUMES** ldap_backend_config is valid! + # + # @param base_command Base command to be run (e.g., ldapsearch) + # @param ldap_backend_config ldap backend configuration + # + def build_ldap_command(base_command, ldap_backend_config) + ldap_uri = ldap_backend_config['ldap_uri'] + admin_dn = ldap_backend_config.fetch('admin_dn', nil) + admin_pw_file = ldap_backend_config.fetch('admin_pw_file', nil) + + opts = nil + enable_tls = nil + if ldap_uri.match(/^ldapi:/) + enable_tls = false + elsif ldap_uri.match(/^ldaps:/) + enable_tls = true + elsif ldap_backend_config.key?('enable_tls') + enable_tls = ldap_backend_config['enable_tls'] + else + enable_tls = false + end + + if enable_tls + tls_cert = ldap_backend_config['tls_cert'] + tls_key = ldap_backend_config['tls_key'] + tls_cacert = ldap_backend_config['tls_cacert'] + + cmd_env = [ + "LDAPTLS_CERT=#{tls_cert}", + "LDAPTLS_KEY=#{tls_key}", + "LDAPTLS_CACERT=#{tls_cacert}" + ].join(' ') + + if ldap_uri.match(/^ldap:/) + # StartTLS + opts = %Q{-ZZ -x -D "#{admin_dn}" -y #{admin_pw_file} -H #{ldap_uri}} + else + # TLS + opts = %Q{-x -D "#{admin_dn}" -y #{admin_pw_file} -H #{ldap_uri}} + end + + else + cmd_env = '' + if admin_pw_file + # unencrypted ldap or ldapi with simple authentication + opts = %Q{-x -D "#{admin_dn}" -y #{admin_pw_file} -H #{ldap_uri}} + else + # ldapi with EXTERNAL SASL + opts = "-Y EXTERNAL -H #{ldap_uri}" + end + end + + "#{cmd_env} #{base_command} #{opts}" + end + end + end +end diff --git a/spec/acceptance/helpers/test_data.rb b/spec/acceptance/helpers/test_data.rb index f0b19f0..acb3c83 100644 --- a/spec/acceptance/helpers/test_data.rb +++ b/spec/acceptance/helpers/test_data.rb @@ -55,7 +55,7 @@ def generate_backend_hiera(backend_configs) backends = {} backend_configs.each do |name, config| backend_tag = "simpkv::backend::#{name}" - hiera[backend_tag] = config + hiera[backend_tag] = Marshal.load(Marshal.dump(config)) hiera[backend_tag]['id'] = name backends[name]= "%{alias('#{backend_tag}')}" end diff --git a/spec/acceptance/helpers/utils.rb b/spec/acceptance/helpers/utils.rb index 08afe0d..ac304ac 100644 --- a/spec/acceptance/helpers/utils.rb +++ b/spec/acceptance/helpers/utils.rb @@ -6,12 +6,54 @@ module Acceptance::Helpers; end module Acceptance::Helpers::Utils + # @return Backend configuration Hash for the backend corresponding to app_id and + # plugin_type + # + # FIXME: Selects the backend based on an exact match with app_id. Should use + # the fuzzy matching logic built into the simpkv API. + # + # @param app_id The app_id for a key or '', if none specified + # + # @param plugin_type The plugin type to verify or nil if no verification + # is required + # + # @param backend_hiera Hash of backend configuration ('simpkv::options' Hash) + # + # @raise RuntimeError if no backend for the app_id exists in backend_hiera + # + def backend_config_for_app_id(app_id, plugin_type, backend_hiera) + config = {} + + if backend_hiera['simpkv::options']['backends'].key?(app_id) + if backend_hiera['simpkv::options']['backends'][app_id].is_a?(String) + # Assume this is an alias for simpkv::backend:: + config = backend_hiera["simpkv::backend::#{app_id}"] + else + backend_hiera['simpkv::options']['backends'][app_id] + end + elsif backend_hiera['simpkv::options']['backends'].key?('default') + if backend_hiera['simpkv::options']['backends']['default'].is_a?(String) + # Assume this is an alias for simpkv::backend::default + config = backend_hiera['simpkv::backend::default'] + else + config = backend_hiera['simpkv::options']['backends']['default'] + end + end + + if config.empty? || ( !plugin_type.nil? && (config['type'] != plugin_type) ) + fail("No '#{plugin_type}' backend found for #{app_id}") + end + + config + end + # @return key string persisted to the backend for the key_data # # FIXME: If the data is binary and specified by the 'file' attribute, - # this method ASSUMES the file is in the simpkv_test module + # this method *ASSUMES *the file is in the simpkv_test module + # + # @param key_data Hash with key data corresponding to Simpkv_test::KeyData # - # @param key_data def key_data_string(key_data) key_hash = {} if key_data.key?('value') diff --git a/spec/acceptance/nodesets/oel.yml b/spec/acceptance/nodesets/oel.yml index 101da67..5d06091 100644 --- a/spec/acceptance/nodesets/oel.yml +++ b/spec/acceptance/nodesets/oel.yml @@ -6,11 +6,11 @@ end -%> HOSTS: - oel7: + oel8: roles: - default - platform: el-7-x86_64 - box: generic/oracle7 + platform: el-8-x86_64 + box: generic/oracle8 hypervisor: <%= hypervisor %> CONFIG: diff --git a/spec/acceptance/nodesets/oel7.yml b/spec/acceptance/nodesets/oel7.yml index 5d06091..101da67 100644 --- a/spec/acceptance/nodesets/oel7.yml +++ b/spec/acceptance/nodesets/oel7.yml @@ -6,11 +6,11 @@ end -%> HOSTS: - oel8: + oel7: roles: - default - platform: el-8-x86_64 - box: generic/oracle8 + platform: el-7-x86_64 + box: generic/oracle7 hypervisor: <%= hypervisor %> CONFIG: diff --git a/spec/acceptance/suites/default/validate_file_entries.rb b/spec/acceptance/suites/default/validate_file_entries.rb index c9e373b..8814f58 100644 --- a/spec/acceptance/suites/default/validate_file_entries.rb +++ b/spec/acceptance/suites/default/validate_file_entries.rb @@ -3,9 +3,17 @@ # Validate file-plugin-managed keys on the local filesystem # -# - Conforms to the API specified in 'a simpkv plugin test' shared_examples -# - Uses local filesystem commands, since the file plugin has to be on the -# same host as the file keystore +# For each key specification, +# - Selects the backend whose name matches its 'app_id' or 'default', when +# no match is found +# - Checks for the existence of the key in the appropriate location in the +# backend +# - When the key is supposed to exist and does exist, verifies the stored data +# +# Conforms to the API specified in 'a simpkv plugin test' shared_examples +# +# NOTE: Uses local filesystem commands, since the file plugin has to be on the +# same host as the file keystore. # # @param key_info Hash of key information whose format corresponds to the # Simpkv_test::KeyInfo type alias @@ -21,52 +29,24 @@ # # @return Whether validation of keys succeeded # -def validate_file_entries(key_info, keys_should_exist, backend_hiera, host) - if keys_should_exist - validate_file_entries_present(key_info, backend_hiera, host) - else - validate_file_entries_absent(key_info, backend_hiera, host) - end -end - -# Validate that file-plugin-managed keys exist on the local filesystem -# -# For each key specification, -# - Selects the backend whose name matches its 'app_id' or 'default', when -# no match is found -# - Checks for the existence of the appropriate file for the backend -# - Verifies the file content, when the file exists -# -# @param key_info Hash of key information whose format corresponds to the -# Simpkv_test::KeyInfo type alias +# @raise RuntimeError if the appropriate backend for each app_id within key_info +# cannot be found in backend_hiera # -# @param backend_hiera Hash of backend configuration ('simpkv::options' Hash) -# -# @param host Host object on which the validator will execute commands -# - Must be same host as file file keystore -# -# @return Whether validation of keys succeeded -# -def validate_file_entries_present(key_info, backend_hiera, host) +def validate_file_entries(key_info, keys_should_exist, backend_hiera, host) errors = [] key_info.each do |app_id, key_struct| - root_path = file_root_path_for_app_id(app_id, backend_hiera) + config = backend_config_for_app_id(app_id, 'file', backend_hiera) key_struct.each do |key_type, keys| - key_root_path = (key_type == 'global') ? "#{root_path}/globals" : "#{root_path}/environments/production" keys.each do |key, key_data| - key_path = "#{key_root_path}/#{key}" - expected_key_string = key_data_string(key_data) - result = on(host, "cat #{key_path}", :accept_all_exit_codes => true) - if result.exit_code == 0 - if result.stdout.strip != expected_key_string - errors << [ - "Contents of #{key_path} did not match expected:", - " Expected: #{expected_key_string}", - " Actual: #{result.stdout}" - ].join("\n") - end + result = {} + if keys_should_exist + result = validate_file_key_entry_present(key, key_type, key_data, config, host) else - errors << "Validation of #{key_path} presence and data failed: #{result.stderr}" + result = validate_file_key_entry_absent(key, key_type, config, host) + end + + unless result[:success] + errors << result[:err_msg] end end end @@ -84,63 +64,89 @@ def validate_file_entries_present(key_info, backend_hiera, host) end end -# Validate that file-plugin-managed keys do not exist on the local filesystem +# Validate a that file-plugin-managed key exists on the local filesystem and +# has the correct stored data # -# For each key specification, -# - Selects the backend whose name matches its 'app_id' or 'default', when -# no match is found -# - Checks for the existence of the appropriate file for the backend +# @param key Key name # -# @param key_info Hash of key information whose format corresponds to the -# Simpkv_test::KeyInfo type alias +# @param key_type 'env' or 'global' for a key tied to the Puppet-environment +# or a global key, respectively # -# @param backend_hiera Hash of backend configuration ('simpkv::options' Hash) +# @param key_data Hash of key data whose format corresponds to the +# Simpkv_test::KeyData type alias +# +# @param config Backend configuration # # @param host Host object on which the validator will execute commands # - Must be same host as file file keystore # -# @return Whether validation of keys succeeded +# @return results Hash +# * :success - whether the validation succeeded +# * :err_msg - error message upon failure or nil otherwise # -def validate_file_entries_absent(key_info, backend_hiera, host) - errors = [] - key_info.each do |app_id, key_struct| - root_path = file_root_path_for_app_id(app_id, backend_hiera) - key_struct.each do |key_type, keys| - key_root_path = (key_type == 'global') ? "#{root_path}/globals" : "#{root_path}/environments/production" - keys.each do |key, key_data| - key_path = "#{key_root_path}/#{key}" - result = on(host, "ls -l #{key_path}", :accept_all_exit_codes => true) - if result.exit_code == 0 - errors << "Validation of #{key_path} absence failed: #{result.stdout}" - end - end - end - end +def validate_file_key_entry_present(key, key_type, key_data, config, host) + result = { :success => true } - if errors.size == 0 - true - else - warn('Validation Failures:') - errors.each do |error| - warn(" #{error}") + key_path = filesystem_key_path(key, key_type, config) + cmd_result = on(host, "cat #{key_path}", :accept_all_exit_codes => true) + if cmd_result.exit_code == 0 + expected_key_string = key_data_string(key_data) + if cmd_result.stdout.strip != expected_key_string + result = { + :success => false, + :err_msg => [ + "Data for #{key} did not match expected:", + " Expected: #{expected_key_string}", + " Actual: #{result.stdout}" + ].join("\n") + } end - - false + else + result = { + :success => false, + :err_msg => "Validation of #{key} presence failed: Could not find #{key_path}" + } end + + result end -# @return Root path for the file backend that corresponds to the app_id +# Validate a that file-plugin-managed key does not exists on the local filesystem # -# @param app_id The app_id for a key or '', if none specified -# @param backend_hiera Hash of backend configuration ('simpkv::options' Hash) +# @param key Key name +# +# @param key_type 'env' or 'global' for a key tied to the Puppet-environment +# or a global key, respectively +# +# @param config Backend configuration +# +# @param host Host object on which the validator will execute commands +# - Must be same host as file file keystore # -def file_root_path_for_app_id(app_id, backend_hiera) - root_path = '' - if backend_hiera['simpkv::options']['backends'].keys.include?(app_id) - root_path = backend_hiera["simpkv::backend::#{app_id}"]['root_path'] - elsif backend_hiera['simpkv::options']['backends'].keys.include?('default') - root_path = backend_hiera['simpkv::backend::default']['root_path'] +# @return results Hash +# * :success - whether the validation succeeded +# * :err_msg - error message upon failure or nil otherwise +# +def validate_file_key_entry_absent(key, key_type, config, host) + result = { :success => true } + + key_path = filesystem_key_path(key, key_type, config) + cmd_result = on(host, "ls -l #{key_path}", :accept_all_exit_codes => true) + if result.exit_code == 0 + result = { + :success => false, + :err_msg => "Validation of #{key} absence failed: Found #{key_path}" + } end - root_path + result +end + +def filesystem_key_path(key, key_type, config) + root_path = config.key?('root_path') ? config['root_path'] : '/var/simp/simpkv/file/default' + if key_type == 'global' + File.join(root_path, 'globals', key) + else + File.join(root_path, 'environments', 'production', key) + end end diff --git a/spec/acceptance/suites/ldap_plugin/00_ldap_server_spec.rb b/spec/acceptance/suites/ldap_plugin/00_ldap_server_spec.rb new file mode 100644 index 0000000..27d7a72 --- /dev/null +++ b/spec/acceptance/suites/ldap_plugin/00_ldap_server_spec.rb @@ -0,0 +1,95 @@ +# frozen_string_literal: true + +require 'spec_helper_acceptance' +require_relative 'ldap_test_configuration' + +test_name 'ldap server setup' + +describe 'ldap server setup' do + include_context('ldap test configuration') + let(:bootstrap_ldif) { File.read(File.join(__dir__, 'files', 'bootstrap.ldif')) } + + hosts.each do |host| + context "host set up on #{host}" do + it 'has a proper FQDN' do + on(host, "hostname #{fact_on(host, 'fqdn')}") + on(host, 'hostname -f > /etc/hostname') + end + end + end + + # FIXMEs + # - This test does not yet use a SIMP profile to set up the simp_data LDAP + # instance. + # - This test manually works around the lack of schema management in + # simp/ds389 (SIMP-9676). + # - This test does not set an ACI in the simp_data LDAP instance that would + # allow the puppet user to access the instance via without a password. + # + hosts_with_role(hosts, 'ldap_server').each do |host| + context "LDAP server set up on #{host}" do + let(:manifest) do + 'include ds389' + end + + let(:hieradata) do + { + 'ds389::instances' => { + 'simp_data_without_tls' => { + 'base_dn' => ldap_instances['simp_data_without_tls'][:base_dn], + 'root_dn' => ldap_instances['simp_data_without_tls'][:root_dn], + 'root_dn_password' => ldap_instances['simp_data_without_tls'][:root_pw], + 'listen_address' => '0.0.0.0', + 'port' => ldap_instances['simp_data_without_tls'][:port], + 'bootstrap_ldif_content' => bootstrap_ldif + }, + + 'simp_data_with_tls' => { + 'base_dn' => ldap_instances['simp_data_with_tls'][:base_dn], + 'root_dn' => ldap_instances['simp_data_with_tls'][:root_dn], + 'root_dn_password' => ldap_instances['simp_data_with_tls'][:root_pw], + 'listen_address' => '0.0.0.0', + 'port' => ldap_instances['simp_data_with_tls'][:port], + 'secure_port' => ldap_instances['simp_data_with_tls'][:secure_port], + 'bootstrap_ldif_content' => bootstrap_ldif, + 'enable_tls' => true, + 'tls_params' => { + 'source' => certdir + } + } + } + } + end + + it 'disables firewall for LDAP access via custom ports' do + # FIXME ds389 module does NOT manage firewall rules. So, for hosts that + # have firewalld running by default, we need to make sure it is stopped + # or add our own rules. This should be a non-issue when SIMP provides + # a 389-DS instance for simpkv in the simp_ds389 module. + on(host, 'puppet resource service firewalld ensure=stopped') + end + + it 'works with no errors' do + set_hieradata_on(host, hieradata) + apply_manifest_on(host, manifest, catch_failures: true) + end + + it 'is idempotent' do + apply_manifest_on(host, manifest, catch_changes: true) + end + + it "applies a simpkv custom schema to all 389-DS instances on #{host}" do + ldap_instances.each do |instance,config| + src = File.join(__dir__, 'files', '70simpkv.ldif') + dest = "/etc/dirsrv/slapd-#{instance}/schema/70simpkv.ldif" + scp_to(host, src, dest) + on(host, "chown dirsrv:dirsrv #{dest}") + #FIXME use dsconf schema reload instead + on(host, %Q{schema-reload.pl -Z #{instance} -D "#{config[:root_dn]}" -w "#{config[:root_pw]}" -P LDAPI}) + on(host, "egrep 'ERR\s*-\s*schemareload' /var/log/dirsrv/slapd-#{instance}/errors", + :acceptable_exit_codes => [1]) + end + end + end + end +end diff --git a/spec/acceptance/suites/ldap_plugin/05_ldap_client_setup_spec.rb b/spec/acceptance/suites/ldap_plugin/05_ldap_client_setup_spec.rb new file mode 100644 index 0000000..6a69e0d --- /dev/null +++ b/spec/acceptance/suites/ldap_plugin/05_ldap_client_setup_spec.rb @@ -0,0 +1,46 @@ + +require 'spec_helper_acceptance' +require_relative 'ldap_test_configuration' + +test_name 'simpkv client setup' + +describe 'simpkv client setup' do + include_context('ldap test configuration') + + # FIXME Can't compile manifests with simpkv functions unless the files containing + # the admin passwords already exist on each host + context 'Ensure LDAP password files for clients exists prior to using simpkv functions' do + let(:manifest) { <<-EOM + file { '/etc/simp': ensure => 'directory' } + + file { '#{ldap_instances['simp_data_without_tls'][:admin_pw_file]}': + ensure => present, + owner => 'root', + group => 'root', + mode => '0400', + content => Sensitive('#{ldap_instances['simp_data_without_tls'][:admin_pw]}') + } + + file { '#{ldap_instances['simp_data_with_tls'][:admin_pw_file]}': + ensure => present, + owner => 'root', + group => 'root', + mode => '0400', + content => Sensitive('#{ldap_instances['simp_data_with_tls'][:admin_pw]}') + } + EOM + } + + hosts.each do |host| + it "should create admin pw files needed by ldap plugin on #{host}" do + apply_manifest_on(host, manifest, :catch_failures => true) + end + end + end + + context 'Ensure openldap-clients package is installed on clients prior to using simpkv functions' do + it 'should install openlap-clients package' do + install_package_unless_present_on(hosts, 'openldap-clients') + end + end +end diff --git a/spec/acceptance/suites/ldap_plugin/10_ldapi_spec.rb b/spec/acceptance/suites/ldap_plugin/10_ldapi_spec.rb new file mode 100644 index 0000000..f6d064f --- /dev/null +++ b/spec/acceptance/suites/ldap_plugin/10_ldapi_spec.rb @@ -0,0 +1,83 @@ +require 'spec_helper_acceptance' +require_relative 'ldap_test_configuration' +require_relative 'validate_ldap_entries' + +test_name 'ldap_plugin using ldapi' + +describe 'ldap_plugin using ldapi' do + include_context('ldap test configuration') + + # Arbitrarily using the 389-DS instance configured with TLS. + let(:ldap_instance_name) { 'simp_data_with_tls' } + let(:ldap_instance) { ldap_instances[ldap_instance_name] } + let(:ldap_uri) { "ldapi://%2fvar%2frun%2fslapd-#{ldap_instance_name}.socket" } + let(:common_ldap_config) {{ + 'type' => 'ldap', + 'ldap_uri' => ldap_uri, + 'base_dn' => ldap_instance[:simpkv_base_dn], + }} + + # Command to run on the test host to clear out all stored key data. + # - All stored in same 389-DS instance, so single clear command + let(:clear_data_cmd) { + [ + build_ldap_command('ldapdelete', common_ldap_config), + '-r', + %Q{"ou=instances,#{ldap_instance[:simpkv_base_dn]}"} + ].join(' ') + } + + # simpkv::options hieradata for 3 distinct backends + # - 2 use LDAPI with EXTERNAL SASL authentication + # - 1 uses LDAPI with simple authentication + let(:backend_hiera) { + backend_configs = { + id1 => common_ldap_config, + id2 => common_ldap_config, + id3 => common_ldap_config.merge({ + 'admin_dn' => ldap_instance[:admin_dn], + 'admin_pw_file' => ldap_instance[:admin_pw_file] + }) + } + + # will set each 'id' to its corresponding backend name, which + # results in a unique tree for that backend name beneath the + # simpkv tree in the 389-DS instance + generate_backend_hiera(backend_configs) + } + + hosts_with_role(hosts, 'ldap_server').each do |host| + context "simpkv ldap plugin on #{host} using ldapi" do + it_behaves_like 'a simpkv plugin test', host + + context 'LDAP-specific features' do + let(:manifest) { %Q{simpkv::put('mykey', "Value for mykey", {})} } + let(:get_ldap_attributes_cmd) { + dn = "simpkvKey=mykey,ou=production,ou=environments,ou=default,ou=instances,#{ldap_instance[:simpkv_base_dn]}" + [ + build_ldap_command('ldapsearch', common_ldap_config), + '-o "ldif-wrap=no"', + '-LLL', + %Q{-b "#{dn}"}, + '+' + ].join(' ') + } + + it 'should not change LDAP modifyTimestamp when no changes are made' do + # store a key and retrieve its LDAP modifyTimestamp + set_hiera_and_apply_on(host, backend_hiera, manifest) + result1 = on(host, get_ldap_attributes_cmd) + timestamp1 = result1.stdout.split("\n").delete_if{ |line| !line.start_with?('modifyTimestamp:') }.first + + # store a key with the same content and retrieve its LDAP modifyTimestamp + set_hiera_and_apply_on(host, backend_hiera, manifest) + result2 = on(host, get_ldap_attributes_cmd) + timestamp2 = result2.stdout.split("\n").delete_if{ |line| !line.start_with?('modifyTimestamp:') }.first + + # key was not modified, so timestamp should be the same + expect( timestamp2 ).to eq(timestamp1) + end + end + end + end +end diff --git a/spec/acceptance/suites/ldap_plugin/20_ldap_protos_spec.rb b/spec/acceptance/suites/ldap_plugin/20_ldap_protos_spec.rb new file mode 100644 index 0000000..d9f7fe8 --- /dev/null +++ b/spec/acceptance/suites/ldap_plugin/20_ldap_protos_spec.rb @@ -0,0 +1,98 @@ +require 'spec_helper_acceptance' +require_relative 'ldap_test_configuration' + +test_name 'ldap_plugin using unencrypted and encrypted LDAP' + +describe 'ldap_plugin using unencrypted and encrypted LDAP' do + include_context('ldap test configuration') + + # This test uses 2 389-DS instances (distinct LDAP servers) for 3 simpkv + # backends: + # * LDAP instance that requires encryption is used for 2 simpkv backends: + # - simpkv backend communicating via TLS + # - simpkv backend communicating via StartTLS + # * LDAP instance that does not allow encryption is used as 1 simpkv backend. + # + let(:ldap_with_tls) { ldap_instances['simp_data_with_tls'] } + let(:ldap_without_tls) { ldap_instances['simp_data_without_tls'] } + + hosts_with_role(hosts, 'ldap_server').each do |server| + context "with LDAP servers on #{server}" do + let(:server_fqdn) { fact_on(server, 'fqdn').strip } + let(:ldaps_uri) { "ldaps://#{server_fqdn}:#{ldap_with_tls[:secure_port]}" } + let(:ldap_starttls_uri) { "ldap://#{server_fqdn}:#{ldap_with_tls[:port]}" } + let(:ldap_uri) { "ldap://#{server_fqdn}:#{ldap_without_tls[:port]}" } + + hosts_with_role(hosts, 'client').each do |client| + context "with LDAP client #{client}" do + let(:client_fqdn) { fact_on(client, 'fqdn').strip } + let(:tls_cert) { "#{certdir}/public/#{client_fqdn}.pub" } + let(:tls_key) { "#{certdir}/private/#{client_fqdn}.pem" } + let(:tls_cacert) { "#{certdir}/cacerts/cacerts.pem" } + let(:ldaps_config) {{ + 'type' => 'ldap', + 'ldap_uri' => ldaps_uri, + 'base_dn' => ldap_with_tls[:simpkv_base_dn], + 'admin_dn' => ldap_with_tls[:admin_dn], + 'admin_pw_file' => ldap_with_tls[:admin_pw_file], + 'tls_cert' => tls_cert, + 'tls_key' => tls_key, + 'tls_cacert' => tls_cacert, + }} + + let(:ldap_starttls_config) {{ + 'type' => 'ldap', + 'ldap_uri' => ldap_starttls_uri, + 'base_dn' => ldap_with_tls[:simpkv_base_dn], + 'admin_dn' => ldap_with_tls[:admin_dn], + 'admin_pw_file' => ldap_with_tls[:admin_pw_file], + 'enable_tls' => true, + 'tls_cert' => tls_cert, + 'tls_key' => tls_key, + 'tls_cacert' => tls_cacert, + }} + + let(:ldap_config) {{ + 'type' => 'ldap', + 'ldap_uri' => ldap_uri, + 'base_dn' => ldap_without_tls[:simpkv_base_dn], + 'admin_dn' => ldap_without_tls[:admin_dn], + 'admin_pw_file' => ldap_without_tls[:admin_pw_file] + }} + + # Command to run on the test host to clear out all stored key data. + let(:clear_data_cmd) { + [ + build_ldap_command('ldapdelete', ldaps_config), + '-r', + %Q{"ou=instances,#{ldap_with_tls[:simpkv_base_dn]}"}, + ' ; ', + + build_ldap_command('ldapdelete', ldap_config), + '-r', + %Q{"ou=instances,#{ldap_without_tls[:simpkv_base_dn]}"}, + ].join(' ') + } + + # simpkv::options hieradata for 3 distinct backends + let(:backend_hiera) { + backend_configs = { + id1 => ldaps_config, + id2 => ldap_starttls_config, + id3 => ldap_config + } + + # will set each 'id' to its corresponding backend name, which + # results in unique trees for that backend name beneath the + # simpkv tree in the 389-DS instances + generate_backend_hiera(backend_configs) + } + + context "simpkv ldap_plugin on #{client} using ldap with & without TLS to #{server}" do + it_behaves_like 'a simpkv plugin test', client + end + end + end + end + end +end diff --git a/spec/acceptance/suites/ldap_plugin/30_errors_spec.rb b/spec/acceptance/suites/ldap_plugin/30_errors_spec.rb new file mode 100644 index 0000000..cedaede --- /dev/null +++ b/spec/acceptance/suites/ldap_plugin/30_errors_spec.rb @@ -0,0 +1,165 @@ +require 'spec_helper_acceptance' +require_relative 'ldap_test_configuration' + +test_name 'ldap_plugin errors' + +describe 'ldap_plugin errors' do + include_context('ldap test configuration') + + # The purpose of this test is twofold: + # - Make sure typical configuration error cases cause compilation errors. + # - Make sure the error message that pop out are useful! + # + # This test uses 2 389-DS instances (distinct LDAP servers) for testing + # ldap_plugin errors related to communication with the LDAP servers + # * LDAP instance that requires encryption (TLS or StartTLS) + # * LDAP instance that does not allow encryption + # + let(:ldap_with_tls) { ldap_instances['simp_data_with_tls'] } + let(:ldap_without_tls) { ldap_instances['simp_data_without_tls'] } + + # key will go to the default backend + let(:manifest) { %Q{simpkv::put('mykey', "Value for mykey", {})} } + let(:new_pki_certs_dir) { '/etc/pki/simp-testing-new' } + + context 'TLS error test prep' do + it 'generates a second set of host PKI certificates' do + # Generate and install new PKI certificates to a different directory + # on each SUT + # - Uses PKI-generation-infrastructure already available on the node + # with the default role + server = only_host_with_role(hosts, 'default') + host_dir = '/root/pki' + on(server, "cd #{host_dir}; cat #{host_dir}/pki.hosts | xargs bash make.sh") + + Dir.mktmpdir do |cert_dir| + scp_from(server, host_dir, cert_dir) + hosts.each { |sut| copy_pki_to(sut, cert_dir, new_pki_certs_dir) } + end + end + end + + hosts_with_role(hosts, 'ldap_server').each do |server| + context "with LDAP servers on #{server}" do + let(:server_fqdn) { fact_on(server, 'fqdn').strip } + let(:valid_ldaps_uri) { "ldaps://#{server_fqdn}:#{ldap_with_tls[:secure_port]}" } + let(:valid_ldap_uri) { "ldap://#{server_fqdn}:#{ldap_without_tls[:port]}" } + let(:failed_regex) { + # The full failure message tells the user the ldapsearch command that failed + # and its error messages, so that the user doesn't have to apply the manifest + # with --debug to figure out what is going on! + %r{Unable to construct 'ldap/default': Plugin could not access ou=simpkv,o=puppet,dc=simp.*ldapsearch} + } + + hosts_with_role(hosts, 'client').each do |client| + context "with LDAP client #{client}" do + + # valid backend config for ldap + let(:valid_ldap_config) {{ + 'type' => 'ldap', + 'ldap_uri' => valid_ldap_uri, + 'base_dn' => ldap_without_tls[:simpkv_base_dn], + 'admin_dn' => ldap_without_tls[:admin_dn], + 'admin_pw_file' => ldap_without_tls[:admin_pw_file] + }} + + + context 'with LDAP configuration errors' do + it 'fails to compile when LDAP URI has invalid host' do + bad_uri = 'ldap://oops.test.local' + invalid_config = valid_ldap_config.merge({ 'ldap_uri' => bad_uri }) + backend_configs = { 'default' => invalid_config } + backend_hiera = generate_backend_hiera(backend_configs) + + result = set_hiera_and_apply_on(client, backend_hiera, manifest, + { :expect_failures => true } ) + + expect( result.stderr ).to match(failed_regex) + end + + it 'fails to compile when LDAP URI has invalid port' do + # Our simpkv LDAP servers are intentionally not on the standard + # port (389) for LDAP, because they do not contain accounts data. + bad_uri = "ldap://#{server_fqdn}:389" + invalid_config = valid_ldap_config.merge({ 'ldap_uri' => bad_uri }) + backend_configs = { 'default' => invalid_config } + backend_hiera = generate_backend_hiera(backend_configs) + + result =set_hiera_and_apply_on(client, backend_hiera, manifest, + { :expect_failures => true } ) + + expect( result.stderr ).to match(failed_regex) + end + + it 'fails to compile when base DN is invalid' do + bad_base_dn = valid_ldap_config['base_dn'] + ',dc=oops' + invalid_config = valid_ldap_config.merge({ 'base_dn' => bad_base_dn }) + backend_configs = { 'default' => invalid_config } + backend_hiera = generate_backend_hiera(backend_configs) + + result = set_hiera_and_apply_on(client, backend_hiera, manifest, + { :expect_failures => true } ) + + expect( result.stderr ).to match(failed_regex) + end + + it 'fails to compile when admin DN is invalid' do + bad_admin_dn = valid_ldap_config['admin_dn'] + ',dc=oops' + invalid_config = valid_ldap_config.merge({ 'admin_dn' => bad_admin_dn }) + backend_configs = { 'default' => invalid_config } + backend_hiera = generate_backend_hiera(backend_configs) + + result = set_hiera_and_apply_on(client, backend_hiera, manifest, + { :expect_failures => true } ) + + expect( result.stderr ).to match(failed_regex) + end + + it 'fails to compile when admin password is invalid' do + # create a password file that has the right permissions but wrong content + bad_admin_pw_file = '/root/wrong_admin_password.txt' + on(client, "echo wrong_admin_password > #{bad_admin_pw_file}") + on(client, "chmod 600 #{bad_admin_pw_file}") + + invalid_config = valid_ldap_config.merge({ 'admin_pw_file' => bad_admin_pw_file }) + backend_configs = { 'default' => invalid_config } + backend_hiera = generate_backend_hiera(backend_configs) + + result = set_hiera_and_apply_on(client, backend_hiera, manifest, + { :expect_failures => true } ) + + expect( result.stderr ).to match(failed_regex) + end + + it 'fails to compile when TLS certs are invalid' do + # client is using different certs than the LDAP server knows about! + client_fqdn = fact_on(client, 'fqdn').strip + tls_cert = "#{new_pki_certs_dir}/public/#{client_fqdn}.pub" + tls_key = "#{new_pki_certs_dir}/private/#{client_fqdn}.pem" + tls_cacert = "#{new_pki_certs_dir}/cacerts/cacerts.pem" + + invalid_config = { + 'type' => 'ldap', + 'ldap_uri' => valid_ldaps_uri, + 'base_dn' => ldap_with_tls[:simpkv_base_dn], + 'admin_dn' => ldap_with_tls[:admin_dn], + 'admin_pw_file' => ldap_with_tls[:admin_pw_file], + 'tls_cert' => tls_cert, + 'tls_key' => tls_key, + 'tls_cacert' => tls_cacert, + } + + backend_configs = { 'default' => invalid_config } + backend_hiera = generate_backend_hiera(backend_configs) + + result = set_hiera_and_apply_on(client, backend_hiera, manifest, + { :expect_failures => true } ) + + expect( result.stderr ).to match(failed_regex) + end + end + end + end + end + end +end diff --git a/spec/acceptance/suites/ldap_plugin/files/70simpkv.ldif b/spec/acceptance/suites/ldap_plugin/files/70simpkv.ldif new file mode 100644 index 0000000..d58b8c2 --- /dev/null +++ b/spec/acceptance/suites/ldap_plugin/files/70simpkv.ldif @@ -0,0 +1,44 @@ +# 70simpkv.ldif - Used for simpkv entries +################################################################################ +# +dn: cn=schema +# +################################################################################ +# +attributeTypes: ( + 1.3.6.1.4.1.47012.1.1.1.1.1.1 + NAME 'simpkvKey' + DESC 'key' + SUP name + SINGLE-VALUE + X-ORIGIN 'SIMP simpkv' + ) +# +################################################################################ +# +attributeTypes: ( + 1.3.6.1.4.1.47012.1.1.1.1.1.2 + NAME 'simpkvJsonValue' + DESC 'JSON-formatted value' + EQUALITY caseExactMatch + SUBSTR caseExactSubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 + SINGLE-VALUE + X-ORIGIN 'SIMP simpkv' + ) +# +################################################################################ +# +objectClasses: ( + 1.3.6.1.4.1.47012.1.1.1.1.2.1 + NAME 'simpkvEntry' + DESC 'simpkv entry' + SUP top + STRUCTURAL + MUST ( simpkvKey $ simpkvJsonValue ) + X-ORIGIN 'SIMP simpkv' + ) +# +################################################################################ +# + diff --git a/spec/acceptance/suites/ldap_plugin/files/bootstrap.ldif b/spec/acceptance/suites/ldap_plugin/files/bootstrap.ldif new file mode 100644 index 0000000..24ac9a1 --- /dev/null +++ b/spec/acceptance/suites/ldap_plugin/files/bootstrap.ldif @@ -0,0 +1,30 @@ +# Create the top-level database +dn: cn="dc=simp",cn=mapping tree,cn=config +cn: dc=simp +objectClass: top +objectClass: extensibleObject +objectClass: nsMappingTree +nsslapd-state: backend +nsslapd-backend: UserData + +dn: dc=simp +dc: simp +objectClass: top +objectClass: domain + +dn: ou=Aliases,dc=simp +ou: Aliases +objectClass: top +objectClass: organizationalUnit + +dn: o=puppet,dc=simp +o: puppet +objectClass: top +objectClass: organization + +dn: ou=simpkv,o=puppet,dc=simp +ou: simpkv +objectClass: top +objectClass: organizationalUnit +description: Root directory of all simpkv LDAP trees + diff --git a/spec/acceptance/suites/ldap_plugin/ldap_test_configuration.rb b/spec/acceptance/suites/ldap_plugin/ldap_test_configuration.rb new file mode 100644 index 0000000..495bec0 --- /dev/null +++ b/spec/acceptance/suites/ldap_plugin/ldap_test_configuration.rb @@ -0,0 +1,100 @@ +# Common configuration for the ldap plugin test +# +# * LDAP configuration needed to set up and access the LDAP +# instances containing simpkv data. +# - One instance will be TLS enabled and the other will not. +# +# * Context for 'a simpkv plugin test' shared_examples +# * Methods from Acceptance::Helpers::LdapUtils that the LDAP tests use +# to build their respective keystore clear data commands +# +require 'acceptance/helpers/ldap_utils' +require_relative 'validate_ldap_entries' + +shared_context 'ldap test configuration' do + include Acceptance::Helpers::LdapUtils + + # TODO Create a separate administrator bind DN and configure it appropriately + # for LDAPI via an ACI + # - This test configures the ldap_plugin to use the appropriate instance root + # dn and password as its admin user, instead of a specific simpkv admin + # user and password for the simpkv subtree within the instance. + # - The 'simp' 389-DS instances do not have an ACI set up for account-to-DN + # mapping for the 'root' user. + # + let(:base_dn) { 'dc=simp' } + let(:root_dn) { 'cn=Directory_Manager' } + let(:simpkv_base_dn) { "ou=simpkv,o=puppet,#{base_dn}"} + let(:admin_dn) { root_dn } + + let(:ldap_instances) { { + 'simp_data_without_tls' => { + # ds389::instance config + :base_dn => base_dn, + :root_dn => root_dn, + :root_pw => 'P@ssw0rdP@ssw0rd!N0TLS', + :port => 387, + + # simpkv ldap_plugin config + :simpkv_base_dn => simpkv_base_dn, + :admin_dn => admin_dn, + :admin_pw => 'P@ssw0rdP@ssw0rd!N0TLS', + :admin_pw_file => '/etc/simp/simp_data_without_tls_pw.txt', + }, + + 'simp_data_with_tls' => { + # ds389::instance config + :base_dn => base_dn, + :root_dn => root_dn, + :root_pw => 'P@ssw0rdP@ssw0rd!TLS', + :port => 388, # for StartTLS + :secure_port => 637, + + # simpkv ldap_plugin config + :simpkv_base_dn => simpkv_base_dn, + :admin_dn => admin_dn, + :admin_pw => 'P@ssw0rdP@ssw0rd!TLS', + :admin_pw_file => '/etc/simp/simp_data_with_tls_pw.txt', + } + + } } + + # PKI general + let(:certdir) { '/etc/pki/simp-testing/pki' } + + + # Context for 'a simpkv plug test' shared_examples + + # Method object to validate key/folder entries in an LDAP instance + # - Conforms to the API specified in 'a simpkv plugin test' shared_examples + let(:validator) { method(:validate_ldap_entries) } + + # The ids below are the backend/app_id names used in the test: + # - One must be 'default' or simpkv::options validation will fail. + # - 'a simpkv plugin test' shared_examples assumes there is a one-to-one + # mapping of the app_ids in the input key data to the backend names. + # Although simpkv supports fuzzy logic for that mapping, we set the + # backend names/app_ids to the same values, here, for simplicity. The + # fuzzy mapping logic is tested in the unit test. + # - The input-data-generator currently supports exactly 3 app_ids. + # - 'default' app_id is mapped to '' in the generated input key data, which, in + # turn causes simpkv functions to be called in the test manifests without + # an app_id set. In other words, 'default' maps to the expected, normal + # usage of simpkv functions. + # + let(:id1) { 'default' } + let(:id2) { 'custom' } + let(:id3) { 'custom_snowflake' } + + + # Hash of initial key information for the 3 test backends/app_ids. + # + # 'a simpkv plugin test' uses this data to test key storage operations + # and then transform the data into subsets that it uses to test key/folder + # existence, folder lists, and key and folder delete operations. + let(:initial_key_info) { + generate_initial_key_info(id1, id2, id3) + } + +end + diff --git a/spec/acceptance/suites/ldap_plugin/nodesets/default.yml b/spec/acceptance/suites/ldap_plugin/nodesets/default.yml new file mode 100644 index 0000000..da20de0 --- /dev/null +++ b/spec/acceptance/suites/ldap_plugin/nodesets/default.yml @@ -0,0 +1,32 @@ +<% + if ENV['BEAKER_HYPERVISOR'] + hypervisor = ENV['BEAKER_HYPERVISOR'] + else + hypervisor = 'vagrant' + end +-%> +HOSTS: + el8: + roles: + - default + - ldap_server + - client + platform: el-8-x86_64 + box: generic/centos8 + hypervisor: <%= hypervisor %> + + el7: + roles: + - client + platform: el-7-x86_64 + box: centos/7 + hypervisor: <%= hypervisor %> + +CONFIG: + log_level: verbose + type: aio + vagrant_memsize: 1024 + vagrant_cpus: 2 +<% if ENV['BEAKER_PUPPET_COLLECTION'] -%> + puppet_collection: <%= ENV['BEAKER_PUPPET_COLLECTION'] %> +<% end -%> diff --git a/spec/acceptance/suites/ldap_plugin/nodesets/oel.yml b/spec/acceptance/suites/ldap_plugin/nodesets/oel.yml new file mode 100644 index 0000000..7e61c8c --- /dev/null +++ b/spec/acceptance/suites/ldap_plugin/nodesets/oel.yml @@ -0,0 +1,32 @@ +<% + if ENV['BEAKER_HYPERVISOR'] + hypervisor = ENV['BEAKER_HYPERVISOR'] + else + hypervisor = 'vagrant' + end +-%> +HOSTS: + oel8: + roles: + - default + - ldap_server + - client + platform: el-8-x86_64 + box: generic/oracle8 + hypervisor: <%= hypervisor %> + + oel7: + roles: + - client + platform: el-7-x86_64 + box: generic/oracle7 + hypervisor: <%= hypervisor %> + +CONFIG: + log_level: verbose + type: aio + vagrant_memsize: 1024 + vagrant_cpus: 2 +<% if ENV['BEAKER_PUPPET_COLLECTION'] -%> + puppet_collection: <%= ENV['BEAKER_PUPPET_COLLECTION'] %> +<% end -%> diff --git a/spec/acceptance/suites/ldap_plugin/validate_ldap_entries.rb b/spec/acceptance/suites/ldap_plugin/validate_ldap_entries.rb new file mode 100644 index 0000000..7722853 --- /dev/null +++ b/spec/acceptance/suites/ldap_plugin/validate_ldap_entries.rb @@ -0,0 +1,181 @@ +require 'acceptance/helpers/ldap_utils' +require 'acceptance/helpers/utils' +include Acceptance::Helpers::LdapUtils +include Acceptance::Helpers::Utils + +# Validate ldap-plugin-managed keys on the LDAP server +# +# For each key specification, +# - Selects the backend whose name matches its 'app_id' or 'default', when +# no match is found +# - Checks for the existence of the key in the appropriate location in the +# backend +# - When the key is supposed to exist and does exist, verifies the stored data +# +# Conforms to the API specified in 'a simpkv plugin test' shared_examples +# +# @param key_info Hash of key information whose format corresponds to the +# Simpkv_test::KeyInfo type alias +# +# @param keys_should_exist Whether keys should exist +# - true = verify keys are present with correct stored data +# - false = verify keys are absent +# +# @param backend_hiera Hash of backend configuration ('simpkv::options' Hash) +# +# @param host Host object on which the validator will execute commands +# - LDAP keystore not assumed to be on +# +# @return Whether validation of keys succeeded +# +# @raise RuntimeError if the appropriate backend for each app_id within key_info +# cannot be found in backend_hiera +# +def validate_ldap_entries(key_info, keys_should_exist, backend_hiera, host) + #TODO: Make the iteration through keys and backend config selection part + # of the test infrastructure instead of having this code replicated + # in each plugin-provided validator + # + errors = [] + key_info.each do |app_id, key_struct| + config = backend_config_for_app_id(app_id, 'ldap', backend_hiera) + key_struct.each do |key_type, keys| + keys.each do |key, key_data| + result = {} + if keys_should_exist + result = validate_ldap_key_entry_present(key, key_type, key_data, config, host) + else + result = validate_ldap_key_entry_absent(key, key_type, config, host) + end + + unless result[:success] + errors << result[:err_msg] + end + end + end + end + + if errors.size == 0 + true + else + warn('Validation Failures:') + errors.each do |error| + warn(" #{error}") + end + + false + end +end + +# Validate that a ldap-plugin-managed key exists on the LDAP server and has +# the correct stored data +# +# @param key Key name +# +# @param key_type 'env' or 'global' for a key tied to the Puppet-environment +# or a global key, respectively +# +# @param key_data Hash of key data whose format corresponds to the +# Simpkv_test::KeyData type alias +# +# @param config Backend configuration +# +# @param host Host object on which the validator will execute commands +# +# @return results Hash +# * :success - whether the validation succeeded +# * :err_msg - error message upon failure or nil otherwise +# +def validate_ldap_key_entry_present(key, key_type, key_data, config, host) + result = { :success => true } + + full_path = ldap_key_path(key, key_type, config) + dn = build_key_dn(full_path, config['base_dn']) + cmd = build_ldapsearch_cmd(dn, config, false) + cmd_result = on(host, cmd, :accept_all_exit_codes => true) + if cmd_result.stdout.match(%r{^dn: .*#{dn}}).nil? + result = { + :success => false, + :err_msg => "Validation of #{key} presence failed: Could not find #{dn}" + } + else + expected_key_string = key_data_string(key_data) + if cmd_result.stdout.match(/simpkvJsonValue: #{Regexp.escape(expected_key_string)}/).nil? + result = { + :success => false, + :err_msg => [ + "Data for #{key} did not match expected:", + " Expected: simpkvJsonValue: #{expected_key_string}", + " Actual: #{result.stdout}" + ].join("\n") + } + end + end + + result +end + +# Validate that a ldap-plugin-managed key does not exist on the LDAP server +# +# @param key Key name +# +# @param key_type 'env' or 'global' for a key tied to the Puppet-environment +# or a global key, respectively +# +# @param config Backend configuration +# +# @param host Host object on which the validator will execute commands +# +# @return results Hash +# * :success - whether the validation succeeded +# * :err_msg - error message upon failure or nil otherwise +# +def validate_ldap_key_entry_absent(key, key_type, config, host) + result = { :success => true } + + full_path = ldap_key_path(key, key_type, config) + dn = build_key_dn(full_path, config['base_dn']) + cmd = build_ldapsearch_cmd(dn, config, true) + cmd_result = on(host, cmd, :accept_all_exit_codes => true) + unless cmd_result.exit_code == 32 # No such object + result = { + :success => false, + :err_msg => "Validation of #{key} absence failed: Found #{dn}:\n#{result.stdout}" + } + end + + result +end + +# @return keypath for the key +def ldap_key_path(key, key_type, config) + plugin_instance_path = File.join('instances', config['id']) + if key_type == 'global' + File.join(plugin_instance_path, 'globals', key) + else + File.join(plugin_instance_path, 'environments', 'production', key) + end +end + +# @return ldapsearch command to list or check the existence of a DN +# +# @param dn DN to search for +# @param config LDAP backend config +# @param existence_only whether to just check for existence of the DN or +# query for a listing of the DN +# +def build_ldapsearch_cmd(dn, config, existence_only) + [ + build_ldap_command('ldapsearch', config), + '-s base', + "-b #{dn}", + + # TODO switch to ldif_wrap when we drop support for EL7 + # - EL7 only supports ldif-wrap + # - EL8 says it supports ldif_wrap (--help and man page), but actually + # accepts ldif-wrap or ldif_wrap + '-o "ldif-wrap=no"', + '-LLL', + existence_only ? '1.1' : '' + ].join(' ') +end diff --git a/spec/acceptance/suites/multiple_plugins/00_file_plugin_setup_spec.rb b/spec/acceptance/suites/multiple_plugins/00_file_plugin_setup_spec.rb new file mode 120000 index 0000000..89de272 --- /dev/null +++ b/spec/acceptance/suites/multiple_plugins/00_file_plugin_setup_spec.rb @@ -0,0 +1 @@ +../default/00_file_plugin_setup_spec.rb \ No newline at end of file diff --git a/spec/acceptance/suites/multiple_plugins/00_ldap_server_spec.rb b/spec/acceptance/suites/multiple_plugins/00_ldap_server_spec.rb new file mode 120000 index 0000000..025e1d1 --- /dev/null +++ b/spec/acceptance/suites/multiple_plugins/00_ldap_server_spec.rb @@ -0,0 +1 @@ +../ldap_plugin/00_ldap_server_spec.rb \ No newline at end of file diff --git a/spec/acceptance/suites/multiple_plugins/05_ldap_client_setup_spec.rb b/spec/acceptance/suites/multiple_plugins/05_ldap_client_setup_spec.rb new file mode 120000 index 0000000..4232cca --- /dev/null +++ b/spec/acceptance/suites/multiple_plugins/05_ldap_client_setup_spec.rb @@ -0,0 +1 @@ +../ldap_plugin/05_ldap_client_setup_spec.rb \ No newline at end of file diff --git a/spec/acceptance/suites/multiple_plugins/10_multiple_plugins_spec.rb b/spec/acceptance/suites/multiple_plugins/10_multiple_plugins_spec.rb new file mode 100644 index 0000000..e75e247 --- /dev/null +++ b/spec/acceptance/suites/multiple_plugins/10_multiple_plugins_spec.rb @@ -0,0 +1,98 @@ +require 'spec_helper_acceptance' +require_relative '../ldap_plugin/ldap_test_configuration' +require_relative 'validate_multiple_plugins_entries' + +test_name 'multiple plugins' + +# This test verifies that the simpkv API supports the use of different plugins +# simultaneously. It uses 1 file plugin instance and 2 ldap plugin instances. +# The ldap plugins are configured to use different 389-DS instances (LDAP +# servers). +# +# Without a running puppetserver, the file plugin only works when the +# file keystore is on the test host on which manifests are being compiled. So, +# for test simplicity, we will have also have the LDAP keystores on the test +# host and we will use LDAPI to communicate with the LDAP servers. + +describe 'multiple plugins' do + # We will use the LDAP instances configuration, id1, id2, id3, and + # initial_key_info defined in this context, but override the validator + # with one that handles both file and LDAP backends + include_context('ldap test configuration') + + let(:file_backend_config) {{ + 'type' => 'file', + 'root_path' => "/var/simp/simpkv/file/#{id1}" + }} + + let(:file_clear_data_cmd) { 'rm -rf /var/simp/simpkv/file' } + + let(:ldap1_name) { 'simp_data_with_tls' } + let(:ldap1) { ldap_instances[ldap1_name] } + let(:ldap1_uri) { "ldapi://%2fvar%2frun%2fslapd-#{ldap1_name}.socket" } + let(:ldap1_backend_config) {{ + 'type' => 'ldap', + 'ldap_uri' => ldap1_uri, + 'base_dn' => ldap1[:simpkv_base_dn], + 'admin_dn' => ldap1[:admin_dn], + 'admin_pw_file' => ldap1[:admin_pw_file] + }} + + let(:ldap1_clear_data_cmd) { + [ + build_ldap_command('ldapdelete', ldap1_backend_config), + '-r', + %Q{"ou=instances,#{ldap1[:simpkv_base_dn]}"} + ].join(' ') + } + + let(:ldap2_name) { 'simp_data_without_tls' } + let(:ldap2) { ldap_instances[ldap2_name] } + let(:ldap2_uri) { "ldapi://%2fvar%2frun%2fslapd-#{ldap2_name}.socket" } + let(:ldap2_backend_config) {{ + 'type' => 'ldap', + 'ldap_uri' => ldap2_uri, + 'base_dn' => ldap2[:simpkv_base_dn], + 'admin_dn' => ldap2[:admin_dn], + 'admin_pw_file' => ldap2[:admin_pw_file] + }} + + let(:ldap2_clear_data_cmd) { + [ + build_ldap_command('ldapdelete', ldap2_backend_config), + '-r', + %Q{"ou=instances,#{ldap2[:simpkv_base_dn]}"} + ].join(' ') + } + + # Command to run on the test host to clear out all stored key data. + let(:clear_data_cmd) { + [ + file_clear_data_cmd, + ldap1_clear_data_cmd, + ldap2_clear_data_cmd + ].join(' ; ') + } + + let(:backend_hiera) { + backend_configs = { + id1 => file_backend_config, + id2 => ldap1_backend_config, + id3 => ldap2_backend_config + } + + generate_backend_hiera(backend_configs) + } + + hosts.each do |host| + context "with LDAP and file keystores on #{host}" do + # Method object to validate key/folder entries in a file or LDAP instance + # - Conforms to the API specified in 'a simpkv plugin test' shared_examples + # - Defined here to override validator pulled in when we included the + # 'ldap test configuration' context + let(:validator) { method(:validate_multiple_plugin_entries) } + + it_behaves_like 'a simpkv plugin test', host + end + end +end diff --git a/spec/acceptance/suites/multiple_plugins/nodesets/default.yml b/spec/acceptance/suites/multiple_plugins/nodesets/default.yml new file mode 100644 index 0000000..e34fde7 --- /dev/null +++ b/spec/acceptance/suites/multiple_plugins/nodesets/default.yml @@ -0,0 +1,25 @@ +<% + if ENV['BEAKER_HYPERVISOR'] + hypervisor = ENV['BEAKER_HYPERVISOR'] + else + hypervisor = 'vagrant' + end +-%> +HOSTS: + el8: + roles: + - default + - ldap_server + - client + platform: el-8-x86_64 + box: generic/centos8 + hypervisor: <%= hypervisor %> + +CONFIG: + log_level: verbose + synced_folder : disabled + type: aio + vagrant_memsize: 1024 +<% if ENV['BEAKER_PUPPET_COLLECTION'] -%> + puppet_collection: <%= ENV['BEAKER_PUPPET_COLLECTION'] %> +<% end -%> diff --git a/spec/acceptance/suites/multiple_plugins/nodesets/oel.yml b/spec/acceptance/suites/multiple_plugins/nodesets/oel.yml new file mode 100644 index 0000000..b810ffd --- /dev/null +++ b/spec/acceptance/suites/multiple_plugins/nodesets/oel.yml @@ -0,0 +1,25 @@ +<% + if ENV['BEAKER_HYPERVISOR'] + hypervisor = ENV['BEAKER_HYPERVISOR'] + else + hypervisor = 'vagrant' + end +-%> +HOSTS: + oel8: + roles: + - default + - ldap_server + - client + platform: el-8-x86_64 + box: generic/oracle8 + hypervisor: <%= hypervisor %> + +CONFIG: + log_level: verbose + synced_folder : disabled + type: aio + vagrant_memsize: 1024 +<% if ENV['BEAKER_PUPPET_COLLECTION'] -%> + puppet_collection: <%= ENV['BEAKER_PUPPET_COLLECTION'] %> +<% end -%> diff --git a/spec/acceptance/suites/multiple_plugins/validate_multiple_plugins_entries.rb b/spec/acceptance/suites/multiple_plugins/validate_multiple_plugins_entries.rb new file mode 100644 index 0000000..1ca40d0 --- /dev/null +++ b/spec/acceptance/suites/multiple_plugins/validate_multiple_plugins_entries.rb @@ -0,0 +1,73 @@ +require 'acceptance/helpers/utils' +require_relative '../default/validate_file_entries' +require_relative '../ldap_plugin/validate_ldap_entries' + +include Acceptance::Helpers::Utils + +# Validate keys managed by file and ldap plugins on filesystems and LDAP servers, +# respectively +# +# For each key specification, +# - Selects the backend whose name matches its 'app_id' or 'default', when +# no match is found +# - Checks for the existence of the key in the appropriate location in the +# backend +# - When the key is supposed to exist and does exist, verifies the stored +# content +# +# Conforms to the API specified in 'a simpkv plugin test' shared_examples +# +# NOTE: Uses local filesystem commands for keys managed by the file plugin, +# since the file plugin has to be on the same host as the file keystore. +# +# @param key_info Hash of key information whose format corresponds to the +# Simpkv_test::KeyInfo type alias +# +# @param keys_should_exist Whether keys should exist +# - true = verify keys are present with correct stored data +# - false = verify keys are absent +# +# @param backend_hiera Hash of backend configuration ('simpkv::options' Hash) +# +# @param host Host object on which the validator will execute commands +# - LDAP keystore not assumed to be on +# +# @return Whether validation of keys succeeded +# +def validate_multiple_plugin_entries(key_info, keys_should_exist, backend_hiera, host) + errors = [] + key_info.each do |app_id, key_struct| + config = backend_config_for_app_id(app_id, nil, backend_hiera) + unless (config['type'] == 'file') || (config['type'] == 'ldap') + fail("Unsupported backend type '#{config['type']}' found in backend hiera:\n#{backend_hiera}") + end + + key_struct.each do |key_type, keys| + keys.each do |key, key_data| + result = {} + if keys_should_exist + exp = "validate_#{config['type']}_key_entry_present(key, key_type, key_data, config, host)" + result = eval(exp) + else + exp = "validate_#{config['type']}_key_entry_absent(key, key_type, config, host)" + result = eval(exp) + end + + unless result[:success] + errors << result[:err_msg] + end + end + end + end + + if errors.size == 0 + true + else + warn('Validation Failures:') + errors.each do |error| + warn(" #{error}") + end + + false + end +end diff --git a/spec/consul_support/README b/spec/consul_support/README deleted file mode 100644 index 5345dd7..0000000 --- a/spec/consul_support/README +++ /dev/null @@ -1,10 +0,0 @@ -Files in this directory are for the consul simpkv provider tests -(spec tests and what appears to be manual tests). The files have -been moved from the top directory to here, but - - **HAVE NOT BEEN FIXED** - -Also, it is unclear if the Vagrantfile needs to be moved back into -top-level directory in order for TraviCI to be able to use the -'vagrant' service that is configured in the .travis.yml....Couldn't -find any documentation on the vagrant service. diff --git a/spec/consul_support/Vagrantfile b/spec/consul_support/Vagrantfile deleted file mode 100644 index 7749aa7..0000000 --- a/spec/consul_support/Vagrantfile +++ /dev/null @@ -1,77 +0,0 @@ -# vim: set ft=ruby: -Vagrant.configure(2) do |config| - ENV['VAGRANT_DEFAULT_PROVIDER'] = 'docker' - ENV['VAGRANT_NO_PARALLEL'] = 'yes' - config.vm.define "consul-ssl" do |config| - config.vm.synced_folder ".", "/vagrant" - config.vm.provider "docker" do |d| - d.image = "consul:0.9.2" - d.has_ssh = false - d.env = { - "CONSUL_LOCAL_CONFIG" => '{ - "addresses": { - "https":"0.0.0.0" - }, - "ports" : { - "https" : 8501 - }, - "key_file" : "/vagrant/test/server.key", - "cert_file" : "/vagrant/test/server.crt", - "ca_file" : "/vagrant/test/ca.crt" - }' - } - d.ports = [ - "10500:8500", - "10501:8501", - ] - end - end - config.vm.define "consul-ssl-auth" do |config| - config.vm.synced_folder ".", "/vagrant" - config.vm.provider "docker" do |d| - d.image = "consul:0.9.2" - d.has_ssh = false - d.env = { - "CONSUL_LOCAL_CONFIG" => '{ - "addresses": { - "https":"0.0.0.0" - }, - "ports" : { - "https" : 8501 - }, - "key_file" : "/vagrant/test/server.key", - "cert_file" : "/vagrant/test/server.crt", - "ca_file" : "/vagrant/test/ca.crt", - "verify_incoming" : true - }' - } - d.ports = [ - "10504:8500", - "10503:8501", - ] - end - end - config.vm.define "etcd" do |config| - config.vm.synced_folder ".", "/vagrant", disabled: true - config.vm.provider "docker" do |d| - d.image = "elcolio/etcd" - d.has_ssh = false - d.ports = [ - "10379:2379", - ] - end - end - # vagrant_root = File.dirname(__FILE__); - # config.vm.define "puppet" do |config| - # config.vm.synced_folder ".", "/vagrant", disabled: true - # config.vm.provider "docker" do |d| - # d.image = "simpproject/centos:7-ruby21" - # d.has_ssh = true - # d.volumes = [ - # "#{vagrant_root}:/vagrant:z", - # ] - # d.cmd = [ "bash", "-c", "sudo yum install -y openssh-server && sudo /usr/sbin/sshd"] - # end - - # end -end diff --git a/spec/consul_support/manifests/test.pp b/spec/consul_support/manifests/test.pp deleted file mode 100644 index 3e95319..0000000 --- a/spec/consul_support/manifests/test.pp +++ /dev/null @@ -1,33 +0,0 @@ -class simpkv::test( -$url = 'mock://' -) { - $supports = simpkv::supports({'url' => $url}) - notify { "supports = ${supports}": } - $provider = simpkv::provider({'url' => $url}) - notify { "provider = ${provider}": } - $loopvar = { - '/meats/pork' => 'test1', - '/meats/chicken' => 'test4', - '/meats/turkey' => 'test5', - '/meats/beef' => 'test2', - '/fruits/apple' => 'test3', - '/fruits/banana' => 'test4', - }.each |$key, $value| { - simpkv::put({ 'url' => $url, 'key' => $key, 'value' => $value}); - $get = simpkv::get({'url' => $url, 'key' => $key}); - notify { "${key} get = ${get}": } - $atomic_get = simpkv::atomic_get({'url' => $url, 'key' => $key}); - notify { "${key} atomic_get = ${atomic_get}": } - simpkv::atomic_put({'url' => $url, 'key' => $key, 'value' => 'testzor', 'previous' => $atomic_get}); - $atomic_put = simpkv::atomic_get({'url' => $url, 'key' => $key}); - notify { "${key} atomic_put = ${atomic_put}": } - $info = simpkv::info({'url' => $url}) - notify { "${key} info = ${info}": } - } - $list = simpkv::list({ 'url' => $url, 'key' => '/meats' }) - notify { "first list = ${list}": } - simpkv::delete({'url' => $url, 'key' => '/meats/pork'}) - $listm = simpkv::list({'url' => $url, 'key' => '/meats' }) - notify { "second list = ${listm}": } - simpkv::put({ 'url' => $url, 'key' => "/hosts/${trusted[certname]}/ipaddress", 'value' => $::ipaddress}) -} diff --git a/spec/consul_support/prep_ci.sh b/spec/consul_support/prep_ci.sh deleted file mode 100755 index 0fd859d..0000000 --- a/spec/consul_support/prep_ci.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh - -dir=$(readlink -f $(dirname $0)) -docker pull consul -docker run -d -p "10500:8500" -p "10501:8501" -v "$dir:/vagrant" -e CONSUL_LOCAL_CONFIG='{ "addresses": { "https":"0.0.0.0" }, "ports" : { "https" : 8501 }, "key_file" : "/vagrant/test/server.key", "cert_file" : "/vagrant/test/server.crt", "ca_file" : "/vagrant/test/ca.crt"}' consul:0.8.5 -docker run -d -p "10504:8500" -p "10503:8501" -v "$dir:/vagrant" -e CONSUL_LOCAL_CONFIG='{ "addresses": { "https":"0.0.0.0" }, "ports" : { "https" : 8501 }, "key_file" : "/vagrant/test/server.key", "cert_file" : "/vagrant/test/server.crt", "ca_file" : "/vagrant/test/ca.crt", "verify_incoming": true}' consul:0.8.5 -sleep 5 -for i in $(docker ps -aq) -do - docker inspect "${i}" - docker logs "${i}" -done -curl -kvvvv https://172.17.0.1:10501 -curl -kvvvv --cacert $dir/test/ca.pem --cert $dir/test/server.crt --key $dir/test/server.key https://172.17.0.1:10503 diff --git a/spec/consul_support/test/ca.crt b/spec/consul_support/test/ca.crt deleted file mode 100644 index a5b3041..0000000 --- a/spec/consul_support/test/ca.crt +++ /dev/null @@ -1,22 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIJAMkaYZYjQlkWMA0GCSqGSIb3DQEBCwUAMHIxCzAJBgNV -BAYTAlVTMQswCQYDVQQIDAJNRDESMBAGA1UEBwwJQmFsdGltb3JlMRgwFgYDVQQK -DA9Pbnl4cG9pbnQsIEluYy4xEzARBgNVBAsMClJTUEVDIFRFU1QxEzARBgNVBAMM -CjE3Mi4xNy4wLjEwHhcNMTcwNDI3MTYxMTMxWhcNMTgwNDI3MTYxMTMxWjByMQsw -CQYDVQQGEwJVUzELMAkGA1UECAwCTUQxEjAQBgNVBAcMCUJhbHRpbW9yZTEYMBYG -A1UECgwPT255eHBvaW50LCBJbmMuMRMwEQYDVQQLDApSU1BFQyBURVNUMRMwEQYD -VQQDDAoxNzIuMTcuMC4xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA -0bu9VvNj7upczDMQGI7JLa4QJ3AnnyVNy3nWOWEUjSBdsG9ahHVwG9Tv6uyJgorU -jzeNgwAt10jiM7YB6UA//xgLuAD3VpjpySfrPlYfm4FsnehgCPMglsX7LEmdu2OW -ynuz5WDqqHD1MoVUQG3PlEjx7zxXZWhYKIk93fdYnOiYatySmMXY/kt7123mx8ZI -4DSFr5fGvs3is14HjYdEjRl55QZNJcUrsyU+g/yaqjBc2pAyOhHPiWLO5sNSqTFw -C0/FQ4TJFqrD5OwyguE3bedxGsQiq3SpkYlB9Th55NO35eIemMJCd0FkThVPuaPX -+OH1mPDB27PcSG4fUy5ewQIDAQABo1AwTjAdBgNVHQ4EFgQU/01DyE+GpbN+I5VY -pSrIPXIH3bswHwYDVR0jBBgwFoAU/01DyE+GpbN+I5VYpSrIPXIH3bswDAYDVR0T -BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAcBCNtUFZvo1LoxdmioWupqP0P7xO -nkGupqyfh3EoUqRhI7P7hSPUJnmdOqPcmOGjv9wKcOFVKDBmvDaM8Z+09Xqg734O -J1ejVhfuOsurx91/3CLlF7IgnL/HpFxq3xRX5sZyf0jkRL5NY6EdMwXLzfhU5ZVC -0R1Ruwd61u1AfPgiNlSQExBQba1E8AOAR7Z0wBSgomgZ92TrcwjbnSmbG1YCQ2mP -5oXf512wgMq9I+ypJlPSxrm6xd9Sgi1QT4f5fnsAvKny7zONwe/ItmYwGH5geAPW -vwcgzSyLkETlYkXAa6IE968GsJkJSnE28zmywNjiZA07KhQMoLwnlMbF/Q== ------END CERTIFICATE----- diff --git a/spec/consul_support/test/run.sh b/spec/consul_support/test/run.sh deleted file mode 100755 index 7fa2e7c..0000000 --- a/spec/consul_support/test/run.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh -bundle install --path=vendor -rpath="$(dirname $(dirname $0))/spec/fixtures/modules" -mkdir spec/fixtures/modules -ln -s . spec/fixtures/modules/simpkv -bundle exec puppet apply --modulepath=${rpath} -e 'class {"simpkv::test": url => "consul://172.17.0.1:8500/puppet" }' diff --git a/spec/consul_support/test/server.crt b/spec/consul_support/test/server.crt deleted file mode 100644 index a5b3041..0000000 --- a/spec/consul_support/test/server.crt +++ /dev/null @@ -1,22 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIJAMkaYZYjQlkWMA0GCSqGSIb3DQEBCwUAMHIxCzAJBgNV -BAYTAlVTMQswCQYDVQQIDAJNRDESMBAGA1UEBwwJQmFsdGltb3JlMRgwFgYDVQQK -DA9Pbnl4cG9pbnQsIEluYy4xEzARBgNVBAsMClJTUEVDIFRFU1QxEzARBgNVBAMM -CjE3Mi4xNy4wLjEwHhcNMTcwNDI3MTYxMTMxWhcNMTgwNDI3MTYxMTMxWjByMQsw -CQYDVQQGEwJVUzELMAkGA1UECAwCTUQxEjAQBgNVBAcMCUJhbHRpbW9yZTEYMBYG -A1UECgwPT255eHBvaW50LCBJbmMuMRMwEQYDVQQLDApSU1BFQyBURVNUMRMwEQYD -VQQDDAoxNzIuMTcuMC4xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA -0bu9VvNj7upczDMQGI7JLa4QJ3AnnyVNy3nWOWEUjSBdsG9ahHVwG9Tv6uyJgorU -jzeNgwAt10jiM7YB6UA//xgLuAD3VpjpySfrPlYfm4FsnehgCPMglsX7LEmdu2OW -ynuz5WDqqHD1MoVUQG3PlEjx7zxXZWhYKIk93fdYnOiYatySmMXY/kt7123mx8ZI -4DSFr5fGvs3is14HjYdEjRl55QZNJcUrsyU+g/yaqjBc2pAyOhHPiWLO5sNSqTFw -C0/FQ4TJFqrD5OwyguE3bedxGsQiq3SpkYlB9Th55NO35eIemMJCd0FkThVPuaPX -+OH1mPDB27PcSG4fUy5ewQIDAQABo1AwTjAdBgNVHQ4EFgQU/01DyE+GpbN+I5VY -pSrIPXIH3bswHwYDVR0jBBgwFoAU/01DyE+GpbN+I5VYpSrIPXIH3bswDAYDVR0T -BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAcBCNtUFZvo1LoxdmioWupqP0P7xO -nkGupqyfh3EoUqRhI7P7hSPUJnmdOqPcmOGjv9wKcOFVKDBmvDaM8Z+09Xqg734O -J1ejVhfuOsurx91/3CLlF7IgnL/HpFxq3xRX5sZyf0jkRL5NY6EdMwXLzfhU5ZVC -0R1Ruwd61u1AfPgiNlSQExBQba1E8AOAR7Z0wBSgomgZ92TrcwjbnSmbG1YCQ2mP -5oXf512wgMq9I+ypJlPSxrm6xd9Sgi1QT4f5fnsAvKny7zONwe/ItmYwGH5geAPW -vwcgzSyLkETlYkXAa6IE968GsJkJSnE28zmywNjiZA07KhQMoLwnlMbF/Q== ------END CERTIFICATE----- diff --git a/spec/consul_support/test/server.key b/spec/consul_support/test/server.key deleted file mode 100644 index c5e984c..0000000 --- a/spec/consul_support/test/server.key +++ /dev/null @@ -1,28 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDRu71W82Pu6lzM -MxAYjsktrhAncCefJU3LedY5YRSNIF2wb1qEdXAb1O/q7ImCitSPN42DAC3XSOIz -tgHpQD//GAu4APdWmOnJJ+s+Vh+bgWyd6GAI8yCWxfssSZ27Y5bKe7PlYOqocPUy -hVRAbc+USPHvPFdlaFgoiT3d91ic6Jhq3JKYxdj+S3vXbebHxkjgNIWvl8a+zeKz -XgeNh0SNGXnlBk0lxSuzJT6D/JqqMFzakDI6Ec+JYs7mw1KpMXALT8VDhMkWqsPk -7DKC4Tdt53EaxCKrdKmRiUH1OHnk07fl4h6YwkJ3QWROFU+5o9f44fWY8MHbs9xI -bh9TLl7BAgMBAAECggEBAKDUps0Wt3tunNq6DY3HcN5mrFyR1NBletKeC3jUyT2v -pCi4O2F37RBqqdAsswY4D+gDYbEjYgPFEDE3UR/c9TZY6iOgGgt+F0j6I5sZ0AMf -rHsqxvoV9ten2oSLrzkTlX6QfdNYDpo8hMrJE2KU0qmThnM+goZxDamIFLkyA/HN -yAEe5v5UAikG7F6nZcyaBLkOBpaIXjNjaxze3x9jPLDvcNt6ttnUezxvE8iPeyVh -SlBJi5GfyTJW45wgRqGu+ElsOW8xl3patdXWNpAFokGQ+M89dO/aVxFR727ElJJP -sm32r2XgJrZATbagS4IQQwifmJPZyD2XqrjuqiApVwECgYEA73znpNrLxE1GbT8U -8mbKIcBEX9BxfeS23Tucmi9U4j7KXgDdYcQI5lK/bCMzFkwgTPxJeC8WP0iXPoww -eeglnXFY9RHIhwpaMTT/48r5hLMw7yI0DN02CF09v9D6Mx+rFX3+SdinpUjry9rH -sk2HNBHYJftC5UxLS+M0d2srR/UCgYEA4DGme1OPT06ZhwcXKMPEZfKby2FlbND0 -EHgcuwyE4n0HnzfN3nswJF0A65rhyTZjmpPtGEjd7EJDBDw8HR/34p1dP2Mmv4Bd -Crzm8lgTx46vXTZPWcroHr2UxoTNtEZRmyn7pK5rkEVdJ7Jle/6DJQn9VcB4Ahhq -O7YHMKx/WB0CgYAYirhCUJmpGDIrZ9eBr77vDoDzQK0gtZt3uHAn7MnKFZ0vXO9S -4X/3+mrbbhACLPLycLgmtMyW152IL12YYI3aQI9ZLeVa0VjEyiWe9mHzk1lkaCDl -YJX07Xkyevvo2Uny/eJdNvKXIY3oahck0oUUdO+tlL4aOWNN946c3kKlMQKBgG4A -bos8aKilDDdwhzB9PbQ34bFczIMj01zxUkeE0P7AEilRHDX5g5mT+Iuhpv8vLJf/ -1OmBd0IhEPjXBTfVI6+RPtuHLs/vj7dhEIAAL1RO8kRuDWklYdcTdhghuTym9AuK -Aeq/mg9juV1s7tZz/q0Bxcd5dGiyyg0aN1Tujl0RAoGAUaHPSARAgZRhQHogvmMq -TbbdDmMJU5XqEwuYpFGv2mvnpFjvtPAhBdkZBZhEllWNyL92XVq13NHFRiZxdtJq -CqHZeRNGEKUU5YsyQddxNHZQxVEB5I82Bhjlydta44Fxx036/FV2JlZ+S4CAtNQX -+cJ7ih5HgUyt365M8s0pRiI= ------END PRIVATE KEY----- diff --git a/spec/unit/puppet_x/simpkv/ldap_plugin_spec.rb b/spec/unit/puppet_x/simpkv/ldap_plugin_spec.rb new file mode 100644 index 0000000..f6b3772 --- /dev/null +++ b/spec/unit/puppet_x/simpkv/ldap_plugin_spec.rb @@ -0,0 +1,1127 @@ +require 'spec_helper' + +require 'fileutils' +require 'tmpdir' + +# mimic loading that is done in simpkv.rb +project_dir = File.join(File.dirname(__FILE__), '..', '..', '..', '..') +plugin_file = File.join(project_dir, 'lib', 'puppet_x', 'simpkv', 'ldap_plugin.rb') +plugin_class = nil +obj = Object.new +obj.instance_eval(File.read(plugin_file), plugin_file) + +############################################################################### +# The ldap plugin is significantly tested in its acceptance test So, the +# testing here is largely for code paths not otherwise tested. +############################################################################### + +describe 'simpkv ldap plugin anonymous class' do + before(:each) do + @tmpdir = Dir.mktmpdir + @admin_pw_file = File.join(@tmpdir, 'admin_pw.txt') + File.open(@admin_pw_file, 'w') { |file| file.puts('P@ssw0rdP@ssw0rd!') } + @options = { + 'backends' => { + 'default' => { + 'id' => 'default', + 'type' => 'ldap', + 'ldap_uri' => 'ldapi://simpkv.ldap.example.com', + }, + 'unencrypted' => { + 'id' => 'unencrypted', + 'type' => 'ldap', + 'ldap_uri' => 'ldap://simpkv.ldap.example.com', + 'admin_pw_file' => @admin_pw_file, + }, + 'starttls' => { + 'id' => 'starttls', + 'type' => 'ldap', + 'ldap_uri' => 'ldap://simpkv.ldap.example.com', + 'admin_pw_file' => @admin_pw_file, + 'enable_tls' => true, + 'tls_cert' => '/certdir/public/client.example.com.pub', + 'tls_key' => '/certdir/private/client.example.com.pem', + 'tls_cacert' => '/certdir/cacerts/cacerts.pem' + }, + 'tls' => { + 'id' => 'tls', + 'type' => 'ldap', + 'ldap_uri' => 'ldaps://simpkv.ldap.example.com', + 'admin_pw_file' => @admin_pw_file, + 'tls_cert' => '/certdir/public/client.example.com.pub', + 'tls_key' => '/certdir/private/client.example.com.pem', + 'tls_cacert' => '/certdir/cacerts/cacerts.pem' + } + } + } + end + + after(:each) do + FileUtils.remove_entry_secure(@tmpdir) + end + + # DNs here assume production environment keys and default backend + let(:key) { 'environments/production/mykey' } + let(:base_key) { File.basename(key) } + let(:full_key_path) { "instances/default/#{key}" } + let(:production_dn) { 'ou=production,ou=environments,ou=default,ou=instances,ou=simpkv,o=puppet,dc=simp'} + let(:key_dn) { "simpkvKey=#{base_key},#{production_dn}" } + let(:value) { 'myvalue' } + let(:stored_value) { %Q{{"value":"#{value}","metadata":{}}} } + + let(:folder) { 'environments/production/myfolder' } + let(:base_folder) { File.basename(folder) } +# let(:full_folder_path) { "instances/default/#{folder}" } + let(:folder_dn) { "ou=#{base_folder},#{production_dn}" } + + let(:ldap_busy_response) {{ + :success => false, + :exitstatus => 51, + :stdout => '', + :stderr => 'ldapxxx failed:\nServer busy' + }} + + let(:ldap_no_such_object_response) {{ + :success => false, + :exitstatus => 32, + :stdout => '', + :stderr => 'No such object' + }} + + let(:ldap_other_error_response) {{ + :success => false, + :exitstatus => 1, + :stdout => '', + :stderr => 'ldapxxx failed:\nOther error' + }} + + # success response from run_command for which we only care about + # :success or :exitstatus + let(:success_response_simple) {{ :success => true, :exitstatus => 0 }} + + context '#initialize' do + it 'is expected to set name' do + plugin_name = 'ldap/test' + plugin = plugin_class.new(plugin_name) + expect(plugin.name).to eq plugin_name + end + end + + # See parse_config tests for other permutations of valid and invalid config + context '#configure' do + before(:each) do + @plugin = plugin_class.new('ldap/default') + end + + it 'should succeed using valid config' do + options = @options.merge( {'backend' => 'default' } ) + + expect(@plugin).to receive(:set_base_ldap_commands) + expect(@plugin).to receive(:verify_ldap_access) + expect(@plugin).to receive(:ensure_instance_tree) + expect{ @plugin.configure(options) }.to_not raise_error + end + + context 'error cases' do + it 'should fail when options is not a Hash' do + expect { @plugin.configure('oops') } + .to raise_error(/Plugin misconfigured/) + end + + it "should fail when options missing 'backend' key" do + expect { @plugin.configure({}) } + .to raise_error(/Plugin misconfigured/) + end + + it "should fail when options missing 'backends' key" do + options = { 'backend' => 'test' } + expect { @plugin.configure(options) } + .to raise_error(/Plugin misconfigured: {.*backend.*}/) + end + + it "should fail when options 'backends' key is not a Hash" do + options = { + 'backend' => 'test', + 'backends' => 'oops' + } + expect { @plugin.configure(options) } + .to raise_error(/Plugin misconfigured/) + end + + it "should fail when options 'backends' does not have the specified backend" do + options = { + 'backend' => 'test', + 'backends' => { + 'test1' => { 'id' => 'test', 'type' => 'file'} + } + } + expect { @plugin.configure(options) } + .to raise_error(/Plugin misconfigured/) + end + + it "should fail when the correct 'backends' element has no 'id' key" do + options = { + 'backend' => 'test', + 'backends' => { + 'test1' => { 'id' => 'test', 'type' => 'file'}, + 'test' => {} + } + } + + expect { @plugin.configure(options) } + .to raise_error(/Plugin misconfigured/) + end + + it "should fail when the correct 'backends' element has no 'type' key" do + options = { + 'backend' => 'test', + 'backends' => { + 'test1' => { 'id' => 'test', 'type' => 'file'}, + 'test' => { 'id' => 'test' } + } + } + expect { @plugin.configure(options) } + .to raise_error(/Plugin misconfigured/) + end + + it "should fail when the correct 'backends' element has wrong 'type' value" do + options = { + 'backend' => 'test', + 'backends' => { + 'test1' => { 'id' => 'test', 'type' => 'file'}, + 'test' => { 'id' => 'test', 'type' => 'file' } + } + } + expect { @plugin.configure(options) } + .to raise_error(/Plugin misconfigured/) + end + end + end + + context 'public API' do + before(:each) do + @plugin = plugin_class.new('ldap/default') + end + + context 'when public API called before configure' do + it '#delete should return failure' do + result = @plugin.delete(key) + expect(result[:result]).to be false + expect(result[:err_msg]).to eq 'Internal error: delete called before configure' + end + + it '#deletetree should return failure' do + result = @plugin.deletetree(folder) + expect(result[:result]).to be false + expect(result[:err_msg]).to eq 'Internal error: deletetree called before configure' + end + + it '#exists should return failure' do + result = @plugin.exists(key) + expect(result[:result]).to be_nil + expect(result[:err_msg]).to eq 'Internal error: exists called before configure' + end + + it '#get should return failure' do + result = @plugin.get(key) + expect(result[:result]).to be_nil + expect(result[:err_msg]).to eq 'Internal error: get called before configure' + end + + it '#list should return failure' do + result = @plugin.list(folder) + expect(result[:result]).to be_nil + expect(result[:err_msg]).to eq 'Internal error: list called before configure' + end + + it '#put should return failure' do + result = @plugin.put(key, value) + expect(result[:result]).to be false + expect(result[:err_msg]).to eq 'Internal error: put called before configure' + end + end + + context 'after configure' do + before(:each) do + options = @options.merge( {'backend' => 'default' } ) + expect(Facter::Core::Execution).to receive(:which).with('ldapadd').and_return('/usr/bin/ldapadd') + expect(Facter::Core::Execution).to receive(:which).with('ldapdelete').and_return('/usr/bin/ldapdelete') + expect(Facter::Core::Execution).to receive(:which).with('ldapmodify').and_return('/usr/bin/ldapmodify') + expect(Facter::Core::Execution).to receive(:which).with('ldapsearch').and_return('/usr/bin/ldapsearch') + expect(@plugin).to receive(:verify_ldap_access) + expect(@plugin).to receive(:ensure_instance_tree) + @plugin.configure(options) + end + + + describe '#delete' do + it 'should return success when retries succeed' do + # ldapdelete will return busy code first time and then success + expect(@plugin).to receive(:run_command).with(/ldapdelete/) + .and_return(ldap_busy_response, success_response_simple) + + result = @plugin.delete(key) + expect(result[:result]).to be true + expect(result[:err_msg]).to be_nil + end + + it 'should return failure when retries fail' do + # ldapdelete will return busy code both times + expect(@plugin).to receive(:run_command).with(/ldapdelete/) + .and_return(ldap_busy_response, ldap_busy_response) + + result = @plugin.delete(key) + expect(result[:result]).to be false + expect(result[:err_msg]).to eq(ldap_busy_response[:stderr]) + end + + it 'should return failure when other ldapdelete failure occurs' do + expect(@plugin).to receive(:run_command).with(/ldapdelete/) + .and_return(ldap_other_error_response) + + result = @plugin.delete(key) + expect(result[:result]).to be false + expect(result[:err_msg]).to eq(ldap_other_error_response[:stderr]) + end + end + + describe '#deletetree' do + it 'should remove the folder tree from the intenral set of existing folders upon success' do + @plugin.existing_folders.add('instances/default/globals/app1') + @plugin.existing_folders.add('instances/default/globals/app1/group1') + @plugin.existing_folders.add('instances/default/globals/app1/group1/user1') + @plugin.existing_folders.add('instances/default/globals/app1/group2/user1') + @plugin.existing_folders.add('instances/default/globals/app2') + + expect(@plugin).to receive(:run_command).with(/ldapdelete/) + .and_return(success_response_simple) + + result = @plugin.deletetree('globals/app1') + expect(result[:result]).to be true + expect(result[:err_msg]).to be_nil + + expected_folders = Set.new + expected_folders.add('instances/default/globals/app2') + expect(@plugin.existing_folders).to eq(expected_folders) + end + + it 'should return success when retries succeed' do + # ldapdelete will return busy code first time and then success + expect(@plugin).to receive(:run_command).with(/ldapdelete/) + .and_return(ldap_busy_response, success_response_simple) + + result = @plugin.deletetree(folder) + expect(result[:result]).to be true + expect(result[:err_msg]).to be_nil + end + + it 'should return failure when retries fail' do + # ldapdelete will return busy code both times + expect(@plugin).to receive(:run_command).with(/ldapdelete/) + .and_return(ldap_busy_response, ldap_busy_response) + + result = @plugin.deletetree(folder) + expect(result[:result]).to be false + expect(result[:err_msg]).to eq(ldap_busy_response[:stderr]) + end + + it 'should return failure when other ldapdelete failure occurs' do + expect(@plugin).to receive(:run_command).with(/ldapdelete/) + .and_return(ldap_other_error_response) + + result = @plugin.deletetree(folder) + expect(result[:result]).to be false + expect(result[:err_msg]).to eq(ldap_other_error_response[:stderr]) + end + end + + describe '#exists' do + let(:success_response_dn_match) {{ + :success => true, + :exitstatus => 0, + :stdout => "dn: #{key_dn}" + }} + + it 'should return success when retries succeed' do + # ldapsearch will return busy code first time and then success + expect(@plugin).to receive(:run_command).with(/ldapsearch/) + .and_return(ldap_busy_response, success_response_dn_match) + + result = @plugin.exists(key) + expect(result[:result]).to be true + expect(result[:err_msg]).to be_nil + end + + it 'should return failure when retries fail' do + # ldapsearch will return busy code both times + expect(@plugin).to receive(:run_command).with(/ldapsearch/) + .and_return(ldap_busy_response, ldap_busy_response) + + result = @plugin.exists(key) + expect(result[:result]).to be_nil + expect(result[:err_msg]).to eq(ldap_busy_response[:stderr]) + end + + it 'should return failure when other ldapsearch failure occurs' do + expect(@plugin).to receive(:run_command).with(/ldapsearch/) + .and_return(ldap_other_error_response) + + result = @plugin.exists(key) + expect(result[:result]).to be_nil + expect(result[:err_msg]).to eq(ldap_other_error_response[:stderr]) + end + end + + describe '#get' do + let(:success_response_simpkvKey) {{ + :success => true, + :exitstatus => 0, + :stdout => <<~EOM + dn: #{key_dn} + objectClass: simpkvEntry + objectClass: top + simpkvKey: #{base_key} + simpkvJsonValue: #{stored_value} + EOM + }} + + it 'should return success when retries succeed' do + # ldapsearch will return busy code first time and then success + expect(@plugin).to receive(:run_command).with(/ldapsearch/) + .and_return(ldap_busy_response, success_response_simpkvKey) + + result = @plugin.get(key) + expect(result[:result]).to eq(stored_value) + expect(result[:err_msg]).to be_nil + end + + it 'should fail when simpkvKey object missing simpkvJsonValue attribute' do + # successful query result, but instead of simpkvJsonValue attribute + # has simpkvValue attribute + success_response_malformed_simpkvKey = { + :success => true, + :exitstatus => 0, + :stdout => <<~EOM + dn: #{key_dn} + objectClass: simpkvEntry + objectClass: top + simpkvKey: #{base_key} + simpkvValue: #{stored_value} + EOM + } + + expect(@plugin).to receive(:run_command).with(/ldapsearch/) + .and_return(success_response_malformed_simpkvKey) + + result = @plugin.get(key) + expect(result[:result]).to be_nil + expect(result[:err_msg]).to match(%r{Key retrieval did not return key/value entry}) + end + + it 'should return failure when retries fail' do + # ldapsearch will return busy code both times + expect(@plugin).to receive(:run_command).with(/ldapsearch/) + .and_return(ldap_busy_response, ldap_busy_response) + + result = @plugin.get(key) + expect(result[:result]).to be_nil + expect(result[:err_msg]).to eq(ldap_busy_response[:stderr]) + end + + it 'should return failure when other ldapsearch failure occurs' do + expect(@plugin).to receive(:run_command).with(/ldapsearch/) + .and_return(ldap_other_error_response) + + result = @plugin.get(key) + expect(result[:result]).to be_nil + expect(result[:err_msg]).to eq(ldap_other_error_response[:stderr]) + end + end + + describe '#list' do + let(:success_response_not_empty) {{ + :success => true, + :exitstatus => 0, + :stdout => <<~EOM + dn: #{folder_dn} + ou: #{base_folder} + objectClass: top + objectClass: organizationalUnit + + dn: #{key_dn} + objectClass: simpkvEntry + objectClass: top + simpkvKey: #{base_key} + simpkvJsonValue: #{stored_value} + EOM + }} + + it 'should return success when retries succeed' do + # ldapsearch will return busy code first time and then success + expect(@plugin).to receive(:run_command).with(/ldapsearch/) + .and_return(ldap_busy_response, success_response_not_empty) + + result = @plugin.list(File.dirname(folder)) + expected_list = { + :keys => { base_key => stored_value }, + :folders => [ base_folder ] + } + + expect(result[:result]).to eq(expected_list) + expect(result[:err_msg]).to be_nil + end + + + it 'should return failure when retries fail' do + # ldapsearch will return busy code both times + expect(@plugin).to receive(:run_command).with(/ldapsearch/) + .and_return(ldap_busy_response, ldap_busy_response) + + result = @plugin.list(key) + expect(result[:result]).to be_nil + expect(result[:err_msg]).to eq(ldap_busy_response[:stderr]) + end + + it 'should return failure when other ldapsearch failure occurs' do + expect(@plugin).to receive(:run_command).with(/ldapsearch/) + .and_return(ldap_other_error_response) + + result = @plugin.list(key) + expect(result[:result]).to be_nil + expect(result[:err_msg]).to eq(ldap_other_error_response[:stderr]) + end + end + + describe '#put' do + let(:failed_ldap_result) {{ + :success => false, + :exitstatus => 1, + :err_msg => 'Some interim ldap operation failed' + }} + + let(:successful_ldap_result) {{ + :success => true, + :exitstatus => 0 + }} + + let(:failed_update_result) {{ + :result => false, + :err_msg => 'Update failed' + }} + + it 'should return failure when ensure_folder_path fails' do + expect(@plugin).to receive(:ensure_folder_path) + .with('instances/default/environments/production') + .and_return(failed_ldap_result) + + result = @plugin.put(key, value) + expect(result[:result]).to be false + expect(result[:err_msg]).to eq(failed_ldap_result[:err_msg]) + end + + + it "should return failure when ldap_add with 'already exists' error and update_value_if_changed fails" do + expect(@plugin).to receive(:ensure_folder_path) + .with('instances/default/environments/production') + .and_return(successful_ldap_result) + + already_exists_result = { + :success => false, + :exitstatus => 68, + :err_msg => 'Already exists' + } + expect(@plugin).to receive(:ldap_add).and_return(already_exists_result) + expect(@plugin).to receive(:update_value_if_changed).with(key,value) + .and_return(failed_update_result) + + result = @plugin.put(key, value) + expect(result).to eq(failed_update_result) + end + + it 'should return failure when ldap_add fails with other error' do + expect(@plugin).to receive(:ensure_folder_path) + .with('instances/default/environments/production') + .and_return(successful_ldap_result) + + expect(@plugin).to receive(:ldap_add).and_return(failed_ldap_result) + result = @plugin.put(key, value) + expect(result[:result]).to be false + expect(result[:err_msg]).to eq(failed_ldap_result[:err_msg]) + end + end + end + end + + context 'internal methods' do + before(:each) do + @plugin = plugin_class.new('ldap/ldapi') + options = @options.merge( {'backend' => 'default' } ) + + # allow instead of expect because of set_base_ldap_commands test + allow(Facter::Core::Execution).to receive(:which).with('ldapadd').and_return('/usr/bin/ldapadd') + allow(Facter::Core::Execution).to receive(:which).with('ldapdelete').and_return('/usr/bin/ldapdelete') + allow(Facter::Core::Execution).to receive(:which).with('ldapmodify').and_return('/usr/bin/ldapmodify') + allow(Facter::Core::Execution).to receive(:which).with('ldapsearch').and_return('/usr/bin/ldapsearch') + + expect(@plugin).to receive(:verify_ldap_access) + expect(@plugin).to receive(:ensure_instance_tree) + @plugin.configure(options) + end + + describe '#ensure_folder_path' do + it 'should return success when no folders in existing_folders & all ldap_add ' do + @plugin.existing_folders.clear + + [ + 'dn: ou=instances,ou=simpkv,o=puppet,dc=simp', + 'dn: ou=default,ou=instances,ou=simpkv,o=puppet,dc=simp', + 'dn: ou=environments,ou=default,ou=instances,ou=simpkv,o=puppet,dc=simp', + 'dn: ou=production,ou=environments,ou=default,ou=instances,ou=simpkv,o=puppet,dc=simp' + ].each do |dn| + expect(@plugin).to receive(:ldap_add).with(/#{dn}/, true) + .and_return(success_response_simple) + end + + expect(@plugin.ensure_folder_path(File.dirname(full_key_path))) + .to eq(success_response_simple.merge({ :err_msg => nil })) + + expected_folders = Set.new + expected_folders.add('instances') + expected_folders.add('instances/default') + expected_folders.add('instances/default/environments') + expected_folders.add('instances/default/environments/production') + expect(@plugin.existing_folders).to eq(expected_folders) + end + + it 'should return success when some folders in existing_folders & ldap_add succeeds for new folders' do + @plugin.existing_folders.clear + @plugin.existing_folders.add('instances') + @plugin.existing_folders.add('instances/default') + @plugin.existing_folders.add('instances/default/environments') + dn = 'dn: ou=production,ou=environments,ou=default,ou=instances,ou=simpkv,o=puppet,dc=simp' + + expect(@plugin).to receive(:ldap_add).with(/#{dn}/, true) + .and_return(success_response_simple) + + expect(@plugin.ensure_folder_path(File.dirname(full_key_path))) + .to eq(success_response_simple.merge({ :err_msg => nil })) + end + + it 'should return failure if any ldap_add fails' do + @plugin.existing_folders.clear + @plugin.existing_folders.add('instances') + @plugin.existing_folders.add('instances/default') + + dn1 = 'dn: ou=environments,ou=default,ou=instances,ou=simpkv,o=puppet,dc=simp' + expect(@plugin).to receive(:ldap_add).with(/#{dn1}/, true) + .and_return(success_response_simple) + + dn2 = 'dn: ou=production,ou=environments,ou=default,ou=instances,ou=simpkv,o=puppet,dc=simp' + failed_add_response = { + :success => false, + :exitstatus => 1, + :err_msg => 'ldapadd failed' + + } + + expect(@plugin).to receive(:ldap_add).with(/#{dn2}/, true) + .and_return(failed_add_response) + + expect(@plugin.ensure_folder_path(File.dirname(full_key_path))) + .to eq(failed_add_response) + + failed_folder = 'instances/default/environments/production' + expect(@plugin.existing_folders.include?(failed_folder)).to be false + end + end + + describe '#ldap_add' do + let(:ldap_already_exists_response) {{ + :success => false, + :exitstatus => 68, + :stdout => '', + :stderr => 'ldapadd failed:\nDN already exists' + }} + + context 'ignore_already_exists=false (default)' do + it 'should return failure when ldapadd fails because DN already exists' do + expect(@plugin).to receive(:run_command).with(/ldapadd/) + .and_return(ldap_already_exists_response) + + result = @plugin.ldap_add('some ldif') + expect(result[:success]).to be false + expect(result[:exitstatus]).to eq(ldap_already_exists_response[:exitstatus]) + expect(result[:err_msg]).to eq(ldap_already_exists_response[:stderr]) + end + + it 'should return success when retries succeed' do + # ldapadd will return busy code first time and then success + expect(@plugin).to receive(:run_command).with(/ldapadd/) + .and_return(ldap_busy_response, success_response_simple) + + result = @plugin.ldap_add('some ldif') + expect(result[:success]).to be true + expect(result[:exitstatus]).to eq 0 + expect(result[:err_msg]).to be_nil + end + + it 'should return failure when retries fail' do + # ldapadd will return busy code both times + expect(@plugin).to receive(:run_command).with(/ldapadd/) + .and_return(ldap_busy_response, ldap_busy_response) + + result = @plugin.ldap_add('some ldif') + expect(result[:success]).to be false + expect(result[:exitstatus]).to eq(ldap_busy_response[:exitstatus]) + expect(result[:err_msg]).to eq(ldap_busy_response[:stderr]) + end + + it 'should return failure when other ldapadd failure occurs' do + expect(@plugin).to receive(:run_command).with(/ldapadd/) + .and_return(ldap_other_error_response) + + result = @plugin.ldap_add('some ldif') + expect(result[:success]).to be false + expect(result[:exitstatus]).to eq(ldap_other_error_response[:exitstatus]) + expect(result[:err_msg]).to eq(ldap_other_error_response[:stderr]) + end + end + + context 'ignore_already_exists=true' do + it 'should return success when ldapadd fails because DN already exists' do + expect(@plugin).to receive(:run_command).with(/ldapadd/) + .and_return(ldap_already_exists_response) + + result = @plugin.ldap_add('some ldif', true) + expect(result[:success]).to be true + expect(result[:exitstatus]).to eq 0 + expect(result[:err_msg]).to be_nil + end + end + end + + describe '#ldap_modify' do + it 'should return success when retries succeed' do + # ldapmodify will return busy code first time and then success + expect(@plugin).to receive(:run_command).with(/ldapmodify/) + .and_return(ldap_busy_response, success_response_simple) + + result = @plugin.ldap_modify('some LDIF content') + expect(result[:success]).to be true + expect(result[:exitstatus]).to eq 0 + expect(result[:err_msg]).to be_nil + end + + it 'should return failure when retries fail' do + # ldapmodify will return busy code both times + expect(@plugin).to receive(:run_command).with(/ldapmodify/) + .and_return(ldap_busy_response, ldap_busy_response) + + result = @plugin.ldap_modify('some LDIF content') + expect(result[:success]).to be false + expect(result[:exitstatus]).to eq(ldap_busy_response[:exitstatus]) + expect(result[:err_msg]).to eq(ldap_busy_response[:stderr]) + end + + it 'should return failure when DN no longer exists' do + expect(@plugin).to receive(:run_command).with(/ldapmodify/) + .and_return(ldap_no_such_object_response) + + result = @plugin.ldap_modify('some LDIF content') + expect(result[:success]).to be false + expect(result[:exitstatus]).to eq(ldap_no_such_object_response[:exitstatus]) + expect(result[:err_msg]).to eq(ldap_no_such_object_response[:stderr]) + end + + it 'should return failure when other ldapmodify failure occurs' do + expect(@plugin).to receive(:run_command).with(/ldapmodify/) + .and_return(ldap_other_error_response) + + result = @plugin.ldap_modify('some LDIF content') + expect(result[:success]).to be false + expect(result[:exitstatus]).to eq(ldap_other_error_response[:exitstatus]) + expect(result[:err_msg]).to eq(ldap_other_error_response[:stderr]) + end + end + + describe '#path_to_dn' do + context 'leaf_is_key=true (default)' do + it 'should return DN for simpkvKey node when path has no folders' do + actual = @plugin.path_to_dn('key') + expect(actual).to eq('simpkvKey=key,ou=simpkv,o=puppet,dc=simp') + end + + it 'should return DN for simpkvKey node when path has folders' do + actual = @plugin.path_to_dn('environments/dev/key') + expect(actual).to eq('simpkvKey=key,ou=dev,ou=environments,ou=simpkv,o=puppet,dc=simp') + end + end + + context 'leaf_is_folder=false' do + it 'should return DN for ou node when path has no folders' do + actual = @plugin.path_to_dn('folder', false) + expect(actual).to eq('ou=folder,ou=simpkv,o=puppet,dc=simp') + end + + it 'should return DN for ou node when path has folders' do + actual = @plugin.path_to_dn('environments/dev/folder', false) + expect(actual).to eq('ou=folder,ou=dev,ou=environments,ou=simpkv,o=puppet,dc=simp') + end + end + end + + describe '#parse_config' do + context 'valid configuration' do + it 'should default base_dn to ou=simpkv,o=puppet,dc=simp' do + config = @options['backends']['default'] + opts = @plugin.parse_config(config) + expect(opts[:base_dn]).to eq('ou=simpkv,o=puppet,dc=simp') + end + + it 'should default admin_dn to cn=Directory_Manager' do + config = @options['backends']['unencrypted'] + opts = @plugin.parse_config(config) + expect(opts[:base_opts]).to match(/-D "cn=Directory_Manager"/) + end + + it 'should default retries to 1' do + config = @options['backends']['default'] + opts = @plugin.parse_config(config) + expect(opts[:retries]).to eq(1) + end + + it 'should transform valid ldapi config without admin_dn and admin_pw_file' do + config = @options['backends']['default'] + opts = @plugin.parse_config(config) + expect(opts[:cmd_env]).to eq('') + expect(opts[:base_opts]).to eq("-Y EXTERNAL -H #{config['ldap_uri']}") + end + + it 'should transform valid ldapi config with admin_dn and admin_pw_file' do + config = @options['backends']['default'].merge( { + 'admin_dn' => 'cn=My_Directory_Manager', + 'admin_pw_file' => @admin_pw_file + } ) + opts = @plugin.parse_config(config) + expect(opts[:cmd_env]).to eq('') + exp_base = [ + '-x', + %Q{-D "#{config['admin_dn']}"}, + "-y #{config['admin_pw_file']}", + "-H #{config['ldap_uri']}" + ].join(' ') + expect(opts[:base_opts]).to eq(exp_base) + end + + it 'should transform valid unencrypted ldap config' do + config = @options['backends']['unencrypted'] + opts = @plugin.parse_config(config) + expect(opts[:cmd_env]).to eq('') + exp_base = [ + '-x', + '-D "cn=Directory_Manager"', + "-y #{config['admin_pw_file']}", + "-H #{config['ldap_uri']}" + ].join(' ') + expect(opts[:base_opts]).to eq(exp_base) + end + + it 'should transform valid unencrypted ldap config with enable_tls=false' do + config = @options['backends']['unencrypted'].merge( {'enable_tls' => false} ) + opts = @plugin.parse_config(config) + expect(opts[:cmd_env]).to eq('') + + exp_base = [ + '-x', + '-D "cn=Directory_Manager"', + "-y #{config['admin_pw_file']}", + "-H #{config['ldap_uri']}" + ].join(' ') + expect(opts[:base_opts]).to eq(exp_base) + end + + it 'should transform valid encrypted ldap (StartTLS) config' do + config = @options['backends']['starttls'] + opts = @plugin.parse_config(config) + exp_env = [ + "LDAPTLS_CERT=#{config['tls_cert']}", + "LDAPTLS_KEY=#{config['tls_key']}", + "LDAPTLS_CACERT=#{config['tls_cacert']}" + ].join(' ') + expect(opts[:cmd_env]).to eq(exp_env) + + exp_base = [ + '-ZZ', + '-x', + '-D "cn=Directory_Manager"', + "-y #{config['admin_pw_file']}", + "-H #{config['ldap_uri']}" + ].join(' ') + expect(opts[:base_opts]).to eq(exp_base) + end + + it 'should transform valid encrypted ldaps config' do + config = @options['backends']['tls'] + opts = @plugin.parse_config(config) + exp_env = [ + "LDAPTLS_CERT=#{config['tls_cert']}", + "LDAPTLS_KEY=#{config['tls_key']}", + "LDAPTLS_CACERT=#{config['tls_cacert']}" + ].join(' ') + expect(opts[:cmd_env]).to eq(exp_env) + + exp_base = [ + '', + '-x', + '-D "cn=Directory_Manager"', + "-y #{config['admin_pw_file']}", + "-H #{config['ldap_uri']}" + ].join(' ') + expect(opts[:base_opts]).to eq(exp_base) + end + end + + context 'invalid configuration' do + it 'should fail when ldap_uri is missing' do + config = {} + expect{ @plugin.parse_config(config) } + .to raise_error(/Plugin missing 'ldap_uri' configuration/) + end + + it 'should fail if ldap_uri is malformed' do + config = { 'ldap_uri' => 'ldaps:/too.few.slashes.com' } + expect{ @plugin.parse_config(config) } + .to raise_error(/Invalid 'ldap_uri' configuration/) + end + + it 'should fail if admin_pw_file missing and not ldapi' do + config = Marshal.load(Marshal.dump(@options['backends']['unencrypted'])) + config.delete('admin_pw_file') + expect{ @plugin.parse_config(config) } + .to raise_error(/Plugin missing 'admin_pw_file' configuration/) + end + + it 'should fail if admin_pw_file does not exist' do + config = @options['backends']['default'].merge({ 'admin_pw_file' => '/does/not/exist' }) + expect{ @plugin.parse_config(config) } + .to raise_error(%r{Configured 'admin_pw_file' /does/not/exist does not exist}) + end + + it 'should fail if TLS configuration incomplete' do + config = Marshal.load(Marshal.dump(@options['backends']['tls'])) + config.delete('tls_cacert') + expect{ @plugin.parse_config(config) } + .to raise_error(/TLS configuration incomplete/) + end + end + end + + # all the weird error cases tested below could only happen if someone manually + # inserted entries into the LDIF tree + describe '#parse_list_ldif' do + it 'skips a malformed organizationalUnit' do + # don't know how this could ever happen...totally artifical example + ldif = <<~EOM + dn: #{folder_dn} + ou: #{base_folder} + objectClass: top + objectClass: organizationalUnit + + dn: custom=something,#{production_dn} + custom: something + objectClass: top + objectClass: organizationalUnit + objectClass: custom + + dn: #{key_dn} + objectClass: simpkvEntry + objectClass: top + simpkvKey: #{base_key} + simpkvJsonValue: #{stored_value} + EOM + + result = @plugin.parse_list_ldif(ldif) + expected = { + :keys => { base_key => stored_value }, + :folders => [ base_folder ] + } + expect(result).to eq(expected) + end + + it 'skips simpkvEntry missing the simpkvJsonValue attribute' do + ldif = <<~EOM + dn: #{folder_dn} + ou: #{base_folder} + objectClass: top + objectClass: organizationalUnit + + dn: #{key_dn} + objectClass: simpkvEntry + objectClass: top + simpkvKey: #{base_key} + EOM + + result = @plugin.parse_list_ldif(ldif) + expected = { :keys=> {}, :folders => [ base_folder ] } + expect(result).to eq(expected) + end + + it 'skips simpkvEntry missing the simpkvKey attribute' do + ldif = <<~EOM + dn: #{folder_dn} + ou: #{base_folder} + objectClass: top + objectClass: organizationalUnit + + dn: #{key_dn} + objectClass: simpkvEntry + objectClass: top + simpkvJsonValue: #{stored_value} + EOM + + result = @plugin.parse_list_ldif(ldif) + expected = { :keys=> {}, :folders => [ base_folder ] } + expect(result).to eq(expected) + end + + it 'skips any object that is not a simpkvEntry or organizationalUnit' do + ldif = <<~EOM + dn: #{folder_dn} + ou: #{base_folder} + objectClass: top + objectClass: organizationalUnit + + dn: custom=something,#{production_dn} + custom: something + objectClass: top + objectClass: custom + + dn: #{key_dn} + objectClass: simpkvEntry + objectClass: top + simpkvKey: #{base_key} + simpkvJsonValue: #{stored_value} + EOM + + result = @plugin.parse_list_ldif(ldif) + expected = { + :keys => { base_key => stored_value }, + :folders => [ base_folder ] + } + expect(result).to eq(expected) + end + end + + describe '#run_command' do + it 'returns success results when command succeeds' do + command = "ls #{__FILE__}" + result = @plugin.run_command(command) + expect( result[:success] ).to eq true + expect( result[:exitstatus] ).to eq 0 + expect( result[:stdout] ).to match "#{__FILE__}" + expect( result[:stderr] ).to eq '' + end + + it 'returns failed results when command fails' do + command = 'ls /some/missing/path1' + result = @plugin.run_command(command) + expect( result[:success] ).to eq false + expect( result[:exitstatus] ).to eq 2 + expect( result[:stdout] ).to eq '' + expect( result[:stderr] ).to match(/No such file or directory/) + end + end + + describe '#set_base_ldap_commands' do + it 'fails when ldap* commands cannot be found' do + expect(Facter::Core::Execution).to receive(:which).with('ldapadd').and_return(nil) + expect{ @plugin.set_base_ldap_commands('','some base opts') } + .to raise_error(/Missing required ldapadd command/) + end + end + + describe '#tls_enabled?' do + it 'returns false when using ldapi' do + config = @options['backends']['default'] + expect(@plugin.tls_enabled?(config)).to be false + end + + it 'returns true when using ldaps' do + config = @options['backends']['tls'] + expect(@plugin.tls_enabled?(config)).to be true + end + + it 'returns ignores enable_tls when using ldaps' do + config = @options['backends']['tls'].merge({ 'enable_tls' => false }) + expect(@plugin.tls_enabled?(config)).to be true + end + + it 'returns true when using ldap and enable_tls=true' do + config = @options['backends']['starttls'] + expect(@plugin.tls_enabled?(config)).to be true + end + + it 'returns false when using ldap and enable_tls=false' do + config = Marshal.load(Marshal.dump(@options['backends']['starttls'])) + config['enable_tls'] = false + expect(@plugin.tls_enabled?(config)).to be false + end + + it 'returns false when using ldap and enable_tls is absent' do + config = @options['backends']['unencrypted'] + expect(@plugin.tls_enabled?(config)).to be false + end + end + + describe '#update_value_if_changed' do + let(:new_stored_value) { '{"value":"new value","metadata":{}}' } + it 'should report failure when get() for the current value fails' do + failed_get_result = { :result => nil, 'err_msg' => 'No such object' } + expect(@plugin).to receive(:get).with(key).and_return(failed_get_result) + + result = @plugin.update_value_if_changed(key, new_stored_value) + expect(result[:result]).to be false + expect(result[:err_msg]).to match(/Failed to retrieve current value for comparison/) + end + + it 'should report failure when ldap_modify() fails' do + success_get_result = { :result => stored_value, 'err_msg' => nil } + expect(@plugin).to receive(:get).with(key).and_return(success_get_result) + expect(@plugin).to receive(:ldap_modify).with(/#{new_stored_value}/) + .and_return(ldap_other_error_response) + + result = @plugin.update_value_if_changed(key, new_stored_value) + expect(result[:result]).to be false + expect(result[:err_msg]).to eq(ldap_other_error_response[:err_msg]) + end + end + + # easiest way to test verify_ldap_access is via configure + describe '#verify_ldap_access' do + before(:each) do + @plugin2 = plugin_class.new('ldap/ldapi') + @options2 = @options.merge( {'backend' => 'default' } ) + expect(Facter::Core::Execution).to receive(:which).with('ldapadd').and_return('/usr/bin/ldapadd') + expect(Facter::Core::Execution).to receive(:which).with('ldapdelete').and_return('/usr/bin/ldapdelete') + expect(Facter::Core::Execution).to receive(:which).with('ldapmodify').and_return('/usr/bin/ldapmodify') + expect(Facter::Core::Execution).to receive(:which).with('ldapsearch').and_return('/usr/bin/ldapsearch') + end + + it 'should succeed when retries succeed' do + expect(@plugin2).to receive(:run_command).with(/ldapsearch/) + .and_return(ldap_busy_response, success_response_simple) + expect(@plugin2).to receive(:ensure_instance_tree) + + expect{ @plugin2.configure(@options2) }.to_not raise_error + end + + it 'should fail when retries fail' do + expect(@plugin2).to receive(:run_command).with(/ldapsearch/) + .and_return(ldap_busy_response, ldap_busy_response) + + expect{ @plugin2.configure(@options2) } + .to raise_error(/Plugin could not access ou=simpkv,o=puppet,dc=simp/) + end + end + end +end diff --git a/spec/unit/puppet_x/simpkv/simpkv_spec.rb b/spec/unit/puppet_x/simpkv/simpkv_spec.rb index c690d1c..ae49ece 100644 --- a/spec/unit/puppet_x/simpkv/simpkv_spec.rb +++ b/spec/unit/puppet_x/simpkv/simpkv_spec.rb @@ -67,6 +67,7 @@ expect( adapter.plugin_info ).to_not be_empty expect( adapter.plugin_info.keys.include?('file') ).to be true expect( adapter.plugin_info.keys.include?('failer') ).to be true + expect( adapter.plugin_info.keys.include?('ldap') ).to be true expect( adapter.plugin_info.keys.include?('malformed') ).to be false end @@ -324,8 +325,8 @@ context '#backends' do it 'should list available backend plugins' do - # currently only 2 plugins (one real and one for test only) - expect( @adapter.backends ).to eq([ 'failer', 'file' ]) + # currently only 3 plugins (2 real and 1 for test only) + expect( @adapter.backends.sort ).to eq([ 'failer', 'file', 'ldap' ]) end end