cmdbsyncer 4.4.0__tar.gz → 4.5.0.dev0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/PKG-INFO +2 -1
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/__init__.py +26 -1
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/api/rules.py +2 -2
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/api/syncer.py +5 -0
- cmdbsyncer-4.5.0.dev0/application/buildinfo.txt +1 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/changelog/v4.3.md +1 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/changelog/v4.4.md +34 -0
- cmdbsyncer-4.5.0.dev0/application/changelog/v4.5.md +29 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/docu_links.py +5 -0
- cmdbsyncer-4.5.0.dev0/application/helpers/host_import_file.py +229 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/helpers/import_hostnames.py +5 -0
- cmdbsyncer-4.5.0.dev0/application/helpers/jinja_help.py +202 -0
- cmdbsyncer-4.5.0.dev0/application/helpers/lookup_table.py +104 -0
- cmdbsyncer-4.5.0.dev0/application/helpers/page_title.py +70 -0
- cmdbsyncer-4.5.0.dev0/application/helpers/secret_access.py +154 -0
- cmdbsyncer-4.5.0.dev0/application/helpers/shadow_data.py +56 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/helpers/syncer_jinja.py +52 -1
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/mcp_server.py +4 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/models/account.py +12 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/models/host.py +69 -4
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/models/host_labels.py +13 -4
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/models/host_templates.py +41 -4
- cmdbsyncer-4.5.0.dev0/application/models/lookup_table.py +23 -0
- cmdbsyncer-4.5.0.dev0/application/models/secret.py +190 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/models/user.py +2 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/module_registry.py +18 -4
- cmdbsyncer-4.5.0.dev0/application/modules/custom_attributes/ordering.py +126 -0
- cmdbsyncer-4.5.0.dev0/application/modules/custom_attributes/views.py +164 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/modules/plugin.py +67 -13
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/modules/rule/list_source.py +4 -3
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/modules/rule/rule.py +15 -11
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/modules/rule/views.py +27 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/modules/search_parser.py +28 -3
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/ansible/__init__.py +25 -8
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/ansible/inventory.py +29 -65
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/ansible/site_syncer.py +1 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/__init__.py +97 -2
- cmdbsyncer-4.5.0.dev0/application/plugins/checkmk/admin_views.py +299 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/cmk2.py +11 -3
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/cmk_rules.py +285 -112
- cmdbsyncer-4.5.0.dev0/application/plugins/checkmk/config_checks/__init__.py +74 -0
- cmdbsyncer-4.5.0.dev0/application/plugins/checkmk/config_checks/base.py +202 -0
- cmdbsyncer-4.5.0.dev0/application/plugins/checkmk/config_checks/httpv2.py +461 -0
- cmdbsyncer-4.5.0.dev0/application/plugins/checkmk/config_checks/pdf.py +234 -0
- cmdbsyncer-4.5.0.dev0/application/plugins/checkmk/data/ruleset_examples.json +31 -0
- cmdbsyncer-4.5.0.dev0/application/plugins/checkmk/data/rulesets_2.4.json +11717 -0
- cmdbsyncer-4.5.0.dev0/application/plugins/checkmk/data/rulesets_2.5.json +10961 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/dcd.py +20 -0
- cmdbsyncer-4.5.0.dev0/application/plugins/checkmk/download_catalog.py +71 -0
- cmdbsyncer-4.5.0.dev0/application/plugins/checkmk/folder_view.py +360 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/inits.py +43 -5
- cmdbsyncer-4.5.0.dev0/application/plugins/checkmk/ldap_connections.py +202 -0
- cmdbsyncer-4.5.0.dev0/application/plugins/checkmk/ldap_models.py +81 -0
- cmdbsyncer-4.5.0.dev0/application/plugins/checkmk/ldap_views.py +144 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/models.py +32 -42
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/passwords.py +10 -6
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/rule_passwords.py +7 -5
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/rules.py +65 -6
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/sitepool.py +18 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/syncer.py +4 -4
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/tests/test_cmk2.py +2 -1
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/tests/test_cmk_conditions.py +50 -7
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/tests/test_cmk_rules.py +176 -11
- cmdbsyncer-4.5.0.dev0/application/plugins/checkmk/tests/test_config_checks.py +450 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/tests/test_dcd.py +41 -0
- cmdbsyncer-4.5.0.dev0/application/plugins/checkmk/tests/test_folder_view.py +225 -0
- cmdbsyncer-4.5.0.dev0/application/plugins/checkmk/tests/test_ldap_connections.py +165 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/tests/test_rules.py +145 -0
- cmdbsyncer-4.5.0.dev0/application/plugins/checkmk/tests/test_setup_rule_form_helpers.py +102 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/tests/test_sitepool.py +75 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/tests/test_syncer.py +3 -3
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/tests/test_users.py +18 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/users.py +12 -2
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/views.py +377 -126
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/rest/rest.py +1 -2
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/rules/__init__.py +11 -5
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/rules/rule_definitions.py +5 -1
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/rules/rule_import_export.py +87 -23
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/static/css/cmdbsyncer.css +16 -0
- cmdbsyncer-4.5.0.dev0/application/templates/admin/_checkmk_download_help.html +158 -0
- cmdbsyncer-4.5.0.dev0/application/templates/admin/_config_check_findings.html +99 -0
- cmdbsyncer-4.5.0.dev0/application/templates/admin/_group_fold.html +158 -0
- cmdbsyncer-4.5.0.dev0/application/templates/admin/account_list.html +53 -0
- cmdbsyncer-4.5.0.dev0/application/templates/admin/checkmk_config_checks.html +89 -0
- cmdbsyncer-4.5.0.dev0/application/templates/admin/checkmk_config_checks_report.html +88 -0
- cmdbsyncer-4.5.0.dev0/application/templates/admin/checkmk_folder_debug.html +152 -0
- cmdbsyncer-4.5.0.dev0/application/templates/admin/checkmk_folders.html +127 -0
- cmdbsyncer-4.5.0.dev0/application/templates/admin/checkmk_settings_create.html +6 -0
- cmdbsyncer-4.5.0.dev0/application/templates/admin/checkmk_settings_edit.html +6 -0
- cmdbsyncer-4.5.0.dev0/application/templates/admin/custom_attribute_list.html +354 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/file/modals/form.html +1 -1
- cmdbsyncer-4.5.0.dev0/application/templates/admin/host_csv_import_preview.html +167 -0
- cmdbsyncer-4.5.0.dev0/application/templates/admin/host_import_error.html +6 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/host_list.html +145 -37
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/master.html +8 -2
- cmdbsyncer-4.5.0.dev0/application/templates/admin/model/_jinja_help.html +205 -0
- cmdbsyncer-4.5.0.dev0/application/templates/admin/model/_label_condition_editor.html +275 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/model/_list_source_preview.html +3 -1
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/model/checkmk_rule_mngmt_create.html +1 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/model/checkmk_rule_mngmt_edit.html +1 -0
- cmdbsyncer-4.5.0.dev0/application/templates/admin/secret_reveal.html +26 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/debug_host.html +173 -69
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/views/account.py +38 -2
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/views/default.py +7 -6
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/views/host.py +477 -106
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/views/host_filters.py +52 -41
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/views/host_renderers.py +36 -18
- cmdbsyncer-4.5.0.dev0/application/views/host_secrets.py +46 -0
- cmdbsyncer-4.5.0.dev0/application/views/lookup_table.py +128 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/views/project.py +4 -4
- cmdbsyncer-4.5.0.dev0/application/views/secret.py +220 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/cmdbsyncer.egg-info/PKG-INFO +2 -1
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/cmdbsyncer.egg-info/SOURCES.txt +55 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/cmdbsyncer.egg-info/requires.txt +1 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/pyproject.toml +2 -1
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/requirements-extras.txt +1 -0
- cmdbsyncer-4.5.0.dev0/tests/test_active_templates.py +56 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_ansible_cmk_roles.py +27 -0
- cmdbsyncer-4.5.0.dev0/tests/test_ansible_inventory.py +65 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_api.py +21 -9
- cmdbsyncer-4.5.0.dev0/tests/test_checkmk_download_catalog.py +81 -0
- cmdbsyncer-4.5.0.dev0/tests/test_config_checks_pdf_smoke.py +104 -0
- cmdbsyncer-4.5.0.dev0/tests/test_custom_attribute_order.py +178 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_default_view.py +3 -1
- cmdbsyncer-4.5.0.dev0/tests/test_host_keyvalue_filter.py +75 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_import_hostnames.py +9 -0
- cmdbsyncer-4.5.0.dev0/tests/test_jinja_help.py +122 -0
- cmdbsyncer-4.5.0.dev0/tests/test_lookup_table.py +142 -0
- cmdbsyncer-4.5.0.dev0/tests/test_page_title.py +78 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_plugin.py +21 -4
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_plugin_ssti.py +9 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_rule.py +120 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_rule_import_override.py +35 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_search_parser.py +22 -8
- cmdbsyncer-4.5.0.dev0/tests/test_secret_store_scope.py +602 -0
- cmdbsyncer-4.5.0.dev0/tests/test_shadow_source.py +97 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_template_merge_fields.py +57 -16
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_web_list_source.py +4 -0
- cmdbsyncer-4.5.0.dev0/tests/test_web_requests_smoke.py +337 -0
- cmdbsyncer-4.4.0/application/buildinfo.txt +0 -1
- cmdbsyncer-4.4.0/application/modules/custom_attributes/views.py +0 -37
- cmdbsyncer-4.4.0/application/plugins/checkmk/admin_views.py +0 -282
- cmdbsyncer-4.4.0/application/templates/admin/host_csv_import_preview.html +0 -91
- cmdbsyncer-4.4.0/tests/test_web_requests_smoke.py +0 -182
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/LICENSE +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/README.md +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/_version.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/api/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/api/inventory.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/api/objects.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/api/views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/auth/views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/changelog/.pages +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/changelog/v3.10.md +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/changelog/v3.11.md +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/changelog/v3.12.md +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/changelog/v3.5.md +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/changelog/v3.7.md +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/changelog/v3.8.md +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/changelog/v3.9.md +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/changelog/v4.0.md +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/changelog/v4.1.md +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/changelog/v4.2.md +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/cli.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/config.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/enterprise.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/helpers/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/helpers/audit.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/helpers/cron.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/helpers/db_analysis.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/helpers/get_account.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/helpers/host_maintenance.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/helpers/inventory.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/helpers/label_hash.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/helpers/label_history.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/helpers/local_config_file.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/helpers/local_config_presets.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/helpers/mongo_keys.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/helpers/notification_channels.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/helpers/notification_dispatch.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/helpers/plugins.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/helpers/retention.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/helpers/sates.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/helpers/sql.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/helpers/stale_indexes.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/helpers/tablib_formater.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/helpers/tests/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/helpers/tests/test_sql.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/helpers/timezone.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/models/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/models/config.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/models/cron.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/models/field_approval.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/models/forms.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/models/host_cleanup.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/models/host_create_time.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/models/host_inventory_tree.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/models/host_label_event.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/models/notification_channel.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/models/notification_rule.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/models/notification_state.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/models/project.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/models/saved_search.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/models/states.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/modules/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/modules/custom_attributes/models.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/modules/custom_attributes/rules.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/modules/debug.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/modules/email.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/modules/inventory/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/modules/log/command_output.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/modules/log/log.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/modules/log/models.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/modules/log/views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/modules/rule/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/modules/rule/filter.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/modules/rule/list_source_views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/modules/rule/match.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/modules/rule/models.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/modules/rule/rewrite.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/modules/statefile.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/notices/strict_certificate_verification.txt +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/ansible/admin_views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/ansible/models.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/ansible/playbook_rules.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/ansible/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/ansible/rules.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/ansible/runner.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/ansible/seed.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/ansible/tests/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/ansible/tests/test_runner_ssh_env.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/ansible/views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/bmc_remedy/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/bmc_remedy/bmc_remedy.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/bmc_remedy/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/bi.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/data_quality.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/downtimes.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/folder_attributes.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/groups.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/helpers.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/import_v1.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/import_v2.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/inventorize.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/list_source.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/notification_rules.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/poolfolder.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/rule_analysis_runner.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/rulesets_catalog.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/sites.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/tags.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/tests/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/tests/test_assign_template.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/tests/test_bi.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/tests/test_data_quality.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/tests/test_downtimes.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/tests/test_groups.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/tests/test_helpers.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/tests/test_import_v1.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/tests/test_import_v2.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/tests/test_inventorize.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/tests/test_list_source.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/tests/test_notification_rules.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/tests/test_passwords.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/tests/test_poolfolder.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/tests/test_rule_analysis_runner.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/tests/test_rule_passwords.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/tests/test_sites.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/tests/test_tags.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/tests/test_user_generation.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/user_generation.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/checkmk/user_models.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/cisco_dna/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/cisco_dna/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/cisco_dna/syncer.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/cron.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/csv/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/csv/csv.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/csv/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/eda/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/eda/admin_views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/eda/models.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/eda/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/eda/repeats.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/eda/rules.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/eda/sender.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/eda/tests/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/eda/tests/test_eda.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/eda/tests/test_repeats.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/eda/views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/file_requests.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/idoit/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/idoit/admin_views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/idoit/models.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/idoit/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/idoit/rules.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/idoit/syncer.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/idoit/views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/jdisc/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/jdisc/applications.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/jdisc/devices.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/jdisc/executables.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/jdisc/jdisc.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/jdisc/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/jira/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/jira/jira.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/jira/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/jira_cloud/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/jira_cloud/admin_views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/jira_cloud/export.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/jira_cloud/jira_cloud.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/jira_cloud/models.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/jira_cloud/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/jira_cloud/rules.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/jira_cloud/schema_sync.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/jira_cloud/tests/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/jira_cloud/tests/test_attribute_value.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/jira_cloud/views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/json/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/json/json.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/json/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/ldap/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/ldap/admin_views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/ldap/ldap.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/ldap/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/ldap/views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/maintenance/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/maintenance/db_commands.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/maintenance/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/maintenance/tests/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/maintenance/tests/test_delete_all_hosts.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/maintenance/tests/test_delete_inventory.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/mssql/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/mssql/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/mysql/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/mysql/mysql.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/mysql/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/netbox/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/netbox/admin_views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/netbox/cluster.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/netbox/contacts.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/netbox/dataflow.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/netbox/devices.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/netbox/interfaces.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/netbox/ips.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/netbox/models.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/netbox/netbox.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/netbox/networks.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/netbox/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/netbox/prefixes.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/netbox/rules.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/netbox/tests/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/netbox/tests/test_import_filter.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/netbox/utils.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/netbox/views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/netbox/virtualmachines.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/prtg/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/prtg/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/prtg/prtg.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/pyodbc/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/pyodbc/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/pyodbc/pyodbc.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/rest/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/rest/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/rules/admin_views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/rules/autorules.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/rules/models.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/rules/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/rules/views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/servicenow/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/servicenow/admin_views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/servicenow/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/servicenow/syncer.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/servicenow/tests/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/servicenow/tests/test_table_request.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/servicenow/views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/syncer_shell.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/vmware/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/vmware/admin_views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/vmware/custom_attributes.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/vmware/models.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/vmware/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/vmware/rules.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/vmware/views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/vmware/vmware.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/yml/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/yml/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins/yml/yml.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/plugins_cli.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/static/cmdbsyncer_mark.png +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/static/favicon.png +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/static/js/Sortable.min.js +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/static/js/main.js +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/static/logo_white.png +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/static/vendor/README.md +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/static/vendor/ansible.svg +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/static/vendor/checkmk.svg +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/static/vendor/idoit.svg +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/static/vendor/jira.svg +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/static/vendor/netbox.svg +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/static/vendor/vmware.svg +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/_brand.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/_theme.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/_timezone.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/_host_tabs.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/account_create.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/account_edit.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/account_field_help.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/account_pick_type.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/ansible_playbook_run.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/ansible_project_detail.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/ansible_rule_list.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/ansible_run_details.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/assign_project_form.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/bulk_label_form.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/changelog_archive.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/checkmk_data_quality.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/checkmk_list_rule_debug.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/checkmk_rule_mngmt_list.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/checkmk_rule_optimization.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/checkmk_settings_list.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/checkmk_test_folder_scope.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/checkmk_user_generation_preview.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/checkmk_user_generation_rule_list.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/copy_as_new_form.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/data_quality.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/data_quality_lowercase_preview.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/file/list.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/first_steps.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/host_details.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/host_edit.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/host_inventory_tree.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/host_relations_graph.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/host_timeline.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/index.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/ldap_search.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/local_config_editor.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/model/_action_picker.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/model/_folder_builder.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/model/_notification_plugin_picker.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/model/_ruleset_autocomplete.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/model/checkmk_notification_rule_create.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/model/checkmk_notification_rule_edit.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/model/checkmk_rule_create.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/model/checkmk_rule_edit.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/model/clone_confirm.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/model/inline_list_base.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/model/list_source_create.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/model/list_source_edit.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/module_overview.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/object_list.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/project_edit.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/project_import.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/project_import_cmk.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/project_list.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/project_overview.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/servicenow_query.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/set_account_form.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/set_cmk_version_form.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/admin/set_template_form.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/api_tokens.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/base.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/change_password.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/csrf_error.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/debug.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/email/newuser.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/email/notification.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/email/resetpassword.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/formular.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/license_info.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/login.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/logout_confirm.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/request_password.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/set_2fa.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/templates/set_theme.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/themes/dracula.css +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/themes/gruvbox-dark.css +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/themes/gruvbox-light.css +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/themes/nord.css +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/themes_registry.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/views/_form_fields.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/views/_form_sections.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/views/account_select.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/views/config.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/views/cron.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/views/data_quality.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/views/field_approval.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/views/fileadmin.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/views/first_steps.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/views/host_inventory_grid.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/views/host_widgets.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/views/license.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/views/menu_links.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/views/module_overview.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/views/notification_channel.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/views/notification_rule.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/views/saved_search.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/views/template_select.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/application/views/user.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/cmdbsyncer.egg-info/dependency_links.txt +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/cmdbsyncer.egg-info/entry_points.txt +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/cmdbsyncer.egg-info/top_level.txt +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/requirements-ansible-windows.txt +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/requirements-ansible.txt +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/requirements.txt +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/setup.cfg +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/syncerapi/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/syncerapi/v1/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/syncerapi/v1/core/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/syncerapi/v1/inventory/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/syncerapi/v1/rest/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_account_macro.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_api_csrf_invariant.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_config_dir.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_cron_missing_account.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_csrf_config.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_data_quality_duplicates.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_disabled_row_style.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_eda_web_smoke.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_enterprise_quiet.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_folder_builder_js.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_global_account_presets.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_host_cleanup.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_host_create_time.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_host_label_edit.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_host_roundtrip_smoke.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_host_template_filter.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_host_template_resync.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_jinja_get_list.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_jinja_hash.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_label_history.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_ldap_search_filter.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_local_config_presets.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_logging_config.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_model_indexes.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_mongo_keys.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_plugins_cli.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_regex_condition_limits.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_rule_export_templates.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_rule_filename_detect.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_rule_list_rows.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_rule_list_source.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_rule_match.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_rule_registry_complete.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_security_fixes.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_stale_indexes.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_timezone.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_user_scope_smoke.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_view_permission_flags.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_web_account_password_chars.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_web_account_password_deferred_save.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_web_ansible_account_inventory.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_web_boot_smoke.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_web_debug_pages.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.5.0.dev0}/tests/test_webhook_token_hash.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cmdbsyncer
|
|
3
|
-
Version: 4.
|
|
3
|
+
Version: 4.5.0.dev0
|
|
4
4
|
Summary: Rule-based modular synchronizer for Checkmk, Netbox, Ansible, I-DOIT, Jira CMDB and 15+ other CMDB/monitoring systems
|
|
5
5
|
Author-email: Kuhn & Ruess GmbH <info@kuhn-ruess.de>
|
|
6
6
|
Maintainer-email: Bastian Kuhn <mail@bastian-kuhn.de>
|
|
@@ -56,6 +56,7 @@ Requires-Dist: mysql-connector-python==9.1.0; extra == "extras"
|
|
|
56
56
|
Requires-Dist: pyvim==3.0.3; extra == "extras"
|
|
57
57
|
Requires-Dist: pyvmomi==8.0.3.0.1; extra == "extras"
|
|
58
58
|
Requires-Dist: mcp==1.10.1; extra == "extras"
|
|
59
|
+
Requires-Dist: fpdf2==2.8.9; extra == "extras"
|
|
59
60
|
Provides-Extra: ansible
|
|
60
61
|
Requires-Dist: ansible==10.5.0; extra == "ansible"
|
|
61
62
|
Requires-Dist: cmdbsyncer-inventory>=0.2.0; extra == "ansible"
|
|
@@ -467,6 +467,10 @@ if not CLI_MODE:
|
|
|
467
467
|
insecure = False
|
|
468
468
|
return {'show_https_warning': insecure}
|
|
469
469
|
|
|
470
|
+
# pylint: disable-next=import-outside-toplevel
|
|
471
|
+
from application.helpers.page_title import page_title
|
|
472
|
+
app.add_template_global(page_title)
|
|
473
|
+
|
|
470
474
|
@app.template_filter('localtime')
|
|
471
475
|
def _localtime(value, fmt='%Y-%m-%d %H:%M:%S'):
|
|
472
476
|
"""
|
|
@@ -764,6 +768,28 @@ def _register_web_layer(): # pylint: disable=too-many-locals,too-many-statement
|
|
|
764
768
|
|
|
765
769
|
_register_all_plugin_admin_views(admin)
|
|
766
770
|
|
|
771
|
+
# .-- Modules: shared data at the bottom
|
|
772
|
+
# Lookup Tables and the Secret Store serve every module, so they sit
|
|
773
|
+
# below the modules, after a divider. Registered after the plugins
|
|
774
|
+
# because Flask-Admin keeps the registration order.
|
|
775
|
+
from application.views.menu_links import AccessMenuLink
|
|
776
|
+
from application.models.lookup_table import LookupTable
|
|
777
|
+
from application.views.lookup_table import LookupTableView
|
|
778
|
+
from application.models.secret import Secret
|
|
779
|
+
from application.views.secret import SecretView
|
|
780
|
+
lookup_view = LookupTableView(LookupTable, name="Lookup Tables",
|
|
781
|
+
category="Modules",
|
|
782
|
+
menu_icon_type='fa', menu_icon_value='fa-table')
|
|
783
|
+
secret_view = SecretView(Secret, name="Secret Store", endpoint="secret",
|
|
784
|
+
category="Modules",
|
|
785
|
+
menu_icon_type='fa', menu_icon_value='fa-lock')
|
|
786
|
+
admin.add_link(AccessMenuLink(
|
|
787
|
+
name='', url='#', category='Modules', class_name='dropdown-divider',
|
|
788
|
+
access=lambda: lookup_view.is_accessible() or secret_view.is_accessible()))
|
|
789
|
+
admin.add_view(lookup_view)
|
|
790
|
+
admin.add_view(secret_view)
|
|
791
|
+
#.
|
|
792
|
+
|
|
767
793
|
# .-- Top bar grouping
|
|
768
794
|
# The bar holds three groups: the working views (Objects, Modules,
|
|
769
795
|
# Projects), the read-only tools (Log, Files) and the administration
|
|
@@ -811,7 +837,6 @@ def _register_web_layer(): # pylint: disable=too-many-locals,too-many-statement
|
|
|
811
837
|
# compact. Each of the three topics gets its own sub menu, so Settings
|
|
812
838
|
# itself stays a short list.
|
|
813
839
|
from application.views.account import AccountModelView, ChildAccountModelView
|
|
814
|
-
from application.views.menu_links import AccessMenuLink
|
|
815
840
|
from flask_login import current_user as _menu_user
|
|
816
841
|
|
|
817
842
|
_add_sub_menu(admin, "Accounts", 'fa-user-circle')
|
|
@@ -235,9 +235,9 @@ class RulesExport(Resource):
|
|
|
235
235
|
'passwords and role assignments — treat as secret. Skipped by '
|
|
236
236
|
'default.')
|
|
237
237
|
@API.param('include_passwords',
|
|
238
|
-
'Set to ``1`` to also export the
|
|
238
|
+
'Set to ``1`` to also export the Secret Store '
|
|
239
239
|
'(``cmk_passwords``). The entries stay encrypted with this '
|
|
240
|
-
'instance key
|
|
240
|
+
'instance key, treat as secret. Skipped by default.')
|
|
241
241
|
@API.response(200, 'Every rule, grouped by ``rule_type``.',
|
|
242
242
|
RULES_EXPORT_RESPONSE)
|
|
243
243
|
@API.response(401, 'Authentication failed', ERROR)
|
|
@@ -72,6 +72,8 @@ CRON_STATUS = API.model('cron_status', {
|
|
|
72
72
|
'is_running': fields.Boolean(description='True while a run is in flight'),
|
|
73
73
|
'last_message': fields.String(description='Last progress / result line'),
|
|
74
74
|
'has_error': fields.Boolean(description='True iff the last run failed'),
|
|
75
|
+
'enabled': fields.Boolean(description='False if the group is disabled '
|
|
76
|
+
'or no longer exists'),
|
|
75
77
|
})
|
|
76
78
|
|
|
77
79
|
CRON_LIST_RESPONSE = API.model('cron_list_response', {
|
|
@@ -247,6 +249,8 @@ class SyncerCronApi(Resource):
|
|
|
247
249
|
"""Return the current status of every CronGroup."""
|
|
248
250
|
try:
|
|
249
251
|
response = []
|
|
252
|
+
enabled = {group.name: bool(group.enabled)
|
|
253
|
+
for group in CronGroup.objects.only('name', 'enabled')}
|
|
250
254
|
for entry in CronStats.objects:
|
|
251
255
|
last_start = entry.last_start
|
|
252
256
|
if last_start:
|
|
@@ -261,6 +265,7 @@ class SyncerCronApi(Resource):
|
|
|
261
265
|
'is_running': entry.is_running,
|
|
262
266
|
'last_message': entry.last_message,
|
|
263
267
|
'has_error': entry.failure,
|
|
268
|
+
'enabled': enabled.get(entry.group, False),
|
|
264
269
|
})
|
|
265
270
|
return {
|
|
266
271
|
'result': response,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
BUILD_DATE=2026-10-29T12:50:13Z
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
- FIX: An import source delivering a hostname that is not text now reports a readable error instead of a traceback
|
|
18
18
|
- FIX: Inventorize runs only write a host to the database when an attribute really changed, which noticeably speeds up large Netbox inventories
|
|
19
19
|
- FIX: A database problem while looking up CMDB templates is written to the log instead of silently looking like "no template matched"
|
|
20
|
+
- FIX: A Checkmk "Move to Folder" or "Create Empty Folder" value wrapped in a Jinja condition, like `{% if var is defined %}/{{var}}|{'title': '{{var}}'}{% endif %}`, can be saved again instead of being rejected as invalid folder options
|
|
20
21
|
|
|
21
22
|
## Version 4.3.5
|
|
22
23
|
- FIX: Inventorize applied `rewrite_hostname` twice for CSV, JSON, REST, YML, MySQL, ODBC, JDisc and LDAP accounts, so a template that appends something to the name, a domain for example, missed the host the import had created
|
|
@@ -1,5 +1,39 @@
|
|
|
1
1
|
# Version 4.4
|
|
2
2
|
|
|
3
|
+
## Unreleased
|
|
4
|
+
- FIX: REST import: entries without the hostname field are skipped instead of aborting the whole import
|
|
5
|
+
- FIX: Checkmk users: an empty row under Roles or Contact Groups is no longer sent to Checkmk, which rejected the user because of it
|
|
6
|
+
- FIX: Files: creating a folder, uploading, renaming or editing a file works again when the syncer runs under a sub-path such as /cmdbsyncer — the dialog sent its form to the address without that path
|
|
7
|
+
- FEAT: Accounts: a new import source can run as "Shadow Source" next to the current one — its data is stored beside the hosts without changing them, and the host details and Debug Host compare it with the live data and the rule outcomes; the shadow data can be cleared from the account and host list
|
|
8
|
+
- FIX: Checkmk Site Pools: the member sites of a switched-off pool are readable again in the dark themes
|
|
9
|
+
- FEAT: Checkmk DCD Rules: the text fields have the Jinja help, and {{ HOST_FOLDER }} gives the folder the host export puts the host in and {{ HOST_POOL_SITE }} the site its site pool assigned
|
|
10
|
+
- FEAT: Checkmk Setup Rules: the Jinja help of the value shows how a password in the rule points to an entry of the Secret Store
|
|
11
|
+
- FIX: Checkmk password export no longer fails for Secret Store entries without a comment, such as secrets written by an import — the entry's Checkmk ident is used as comment
|
|
12
|
+
- FIX: Rules with a Pasted List: switching the rule source to the list no longer hides the Enabled and Last Match checkboxes
|
|
13
|
+
- FIX: Host list: the page is about a fifth smaller for hosts with many labels and loads faster
|
|
14
|
+
- FIX: Checkmk host export: a folder Checkmk refuses to create is reported in the terminal with Checkmk's reason — before, only the hosts in it failed later with "folder could not be found"
|
|
15
|
+
- FIX: Exports to Checkmk, Netbox, i-doit, VMware and Jira write each host once per run instead of once per rule set and keep less in memory on large host counts
|
|
16
|
+
- FIX: Checkmk rule export: CMDB templates are read once per run instead of once for every host
|
|
17
|
+
- FIX: Ansible Checkmk agent playbook: a failed host creation, agent download, registration or discovery shows the error message instead of only "the output has been hidden", with the automation secret masked
|
|
18
|
+
- FIX: Ansible Checkmk agent playbook: hosts without any agent step switched on are skipped before Ansible connects to them
|
|
19
|
+
- FIX: Ansible inventory: several times faster and with considerably less memory on large host counts
|
|
20
|
+
- FIX: Ansible projects no longer hand out each other's cached variables, each project computes its own
|
|
21
|
+
- FIX: `ansible update_cache` rebuilds the whole Ansible cache instead of reusing the old values
|
|
22
|
+
- FIX: Checkmk rule export: a rule with Keep Value is no longer deleted and created again on every run when its comment in Checkmk differs, so the value adjusted in Checkmk, including a password, is kept
|
|
23
|
+
- FIX: Checkmk rule export: correcting the description of a rule no longer replaces a password in its value with the masked `******` Checkmk shows
|
|
24
|
+
- FIX: Checkmk rule export: when several Setup Rules produce the very same Checkmk rule, it is created only once and its description no longer changes on every run
|
|
25
|
+
- FIX: Checkmk rule export: when Checkmk holds an outdated copy of a rule next to the current one, the outdated copy is deleted instead of first being updated and the current one deleted as a duplicate
|
|
26
|
+
- FIX: Checkmk rule export: an update of a rule that runs into the request timeout is no longer sent to Checkmk a second time, so a slow Checkmk costs one timeout per rule instead of two and the update is not applied twice
|
|
27
|
+
- FIX: The host list shows the Search options button only once again; after a search it appeared a second time next to the filters
|
|
28
|
+
- FIX: The Checkmk Settings offer the editions of Checkmk 2.5 (Community, Pro, Ultimate, Ultimate with Multi-Tenancy), so the Ansible site management can install and update 2.5 sites
|
|
29
|
+
- FIX: The Ansible site update updates sites to Checkmk 2.5 without stopping at its version and edition questions, and stops on a failed pre-flight check instead of continuing with a broken site
|
|
30
|
+
- FIX: The searchable Checkmk ruleset picker in the Setup rule form now also lists the rulesets when the Syncer was installed with pip, the ruleset lists were missing from the package
|
|
31
|
+
- FIX: CMDB templates are listed alphabetically in the Templates view and in every template selection, like Set Template on the host list
|
|
32
|
+
- FIX: Searching or filtering the host list by a label or inventory value now also finds numbers, e.g. `vlan:5` for a label stored as the number 5, including partial matches and regex
|
|
33
|
+
- FIX: A Checkmk "Move to Folder" or "Create Empty Folder" value wrapped in a Jinja condition, like `{% if var is defined %}/{{var}}|{'title': '{{var}}'}{% endif %}`, can be saved again instead of being rejected as invalid folder options
|
|
34
|
+
- FIX: Host Debug page now lists every condition that matched for an "ALL must match" rule instead of only one, and the hint for a matching rule without a new outcome no longer claims an earlier rule set the value when the outcome was simply empty
|
|
35
|
+
- FIX: The host action "Redistribute Site Pool" now really moves the selected hosts: the next export assigns them the least-loaded site of their pool again instead of keeping the old one
|
|
36
|
+
|
|
3
37
|
## Version 4.4.0
|
|
4
38
|
|
|
5
39
|
### Setup
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Version 4.5
|
|
2
|
+
|
|
3
|
+
## Unreleased
|
|
4
|
+
|
|
5
|
+
- FEAT: API: the cron status (`/api/v1/syncer/cron/`) tells whether a cron group is enabled, so the Checkmk plugin no longer monitors disabled or deleted cron groups
|
|
6
|
+
- FEAT: Checkmk: new Manage LDAP Connections maintains the LDAP connections Checkmk logs its users in with, including contact groups and roles from directory groups; server and bind password come from an LDAP account, `checkmk export_ldap_connections` creates, updates or removes them
|
|
7
|
+
- FEAT: `rules export_all_rules --zip` writes the export compressed into a zip archive, and `rules import_rules` reads such an archive back as it is
|
|
8
|
+
- FEAT: Checkmk Settings: Fill in from checkmk.com loads the current Checkmk versions on click and fills in version, edition and the filename of the installation file for the chosen platform, including the Checkmk Appliance; a new Download Proxy is used for the download of the installation file and for this list
|
|
9
|
+
- FEAT: Checkmk Setup Rules: the new option Per Template evaluates a rule once per CMDB template of the host, each time with only that template's labels, so a contact group and the services of one template no longer mix with those of another template on the same host; the host debug page shows these rules per template
|
|
10
|
+
- FEAT: The account list is grouped by account type, each group under a heading with the type's name and its number of accounts that folds the group away like the Global Custom Attributes, with Expand all and Collapse all; sorting by a column shows the plain list
|
|
11
|
+
- FEAT: Browser tab titles name the page first, e.g. "Edit web01 · Hosts · Objects" or "Filter · Rules · Ansible", so open tabs can be told apart
|
|
12
|
+
- FEAT: Host list: new filter Checkmk Attribute Key:Value finds hosts by the attributes of their last Checkmk sync, the green label badges
|
|
13
|
+
- FEAT: Host list: show up to 500 hosts per page
|
|
14
|
+
- FEAT: Host list: new action Remove Template takes one CMDB template off the selected hosts and keeps their other templates
|
|
15
|
+
- FEAT: Lookup Tables: maintain a long key/value list in the UI and read it in any Jinja field with `{{ lookup('table', key) }}`, e.g. to set an attribute from the value of another one
|
|
16
|
+
- FEAT: Custom Attributes and Rewrite Attributes: a Jinja help next to the template fields lists the lookup tables, variables, functions and filters and inserts them with one click
|
|
17
|
+
- FEAT: Global Custom Attributes: the rule list is grouped by the attribute each rule sets (a rule with several attributes in a group of that combination), shows every rule's place in the order the rules run, and the order can be changed by drag and drop or with the arrow keys, including moving a rule into another attribute's group. Each group folds away with a click on its heading
|
|
18
|
+
- FEAT: Secret Store: the Checkmk password store is now Modules > Secret Store and holds passwords, tokens and certificates for every module, global or bound to a host. Rules reach a host's entry with `{{ secret('key') }}` (plaintext with `{{ secret_value('key') }}`), entries of an archived host are kept as orphaned and can be bound to another host, certificates are shown for copying, and the host overview lists the entries of the host with masked values. New roles: Secret Store, and Secret Store: show plaintext values. Users limited to accounts or templates only reach entries of their own hosts, never global ones. Lookup Tables and the Secret Store sit at the bottom of the Modules menu
|
|
19
|
+
- FEAT: Host import: Import CSV / YAML also takes YAML files (several at once, several hosts per file as a list or as documents separated by ---, also YAML-like files whose certificate lines are out of indentation), and "Bulk add hosts" is now "Add hosts manually" with a format switch (auto, host list, CSV, YAML, key/value list)
|
|
20
|
+
- FEAT: Host import preview: every import and every manual add opens a preview where the values of each host, added columns and a template per host can be edited, chosen columns go into the Secret Store instead of becoming labels, and the account of the imported hosts is picked. Users limited to accounts only get their own accounts and cannot overwrite hosts outside their scope
|
|
21
|
+
- FEAT: Checkmk Setup Rules: the Jinja help sits next to the Value Template and the Folder, the new placeholder `{{ HOST_FOLDER }}` puts a rule into the folder its host lands in (rules per host only), and the Host label and Service label conditions are entered as compact key and value pairs with suggestions from the existing labels. The Host label condition now takes several labels as well, all of them must match
|
|
22
|
+
- FEAT: Checkmk > Folders and Folder Options: the folders the host export would use, with the hosts landing in each and the folder options (contact groups, permissions, title, ...) sent to Checkmk, per Checkmk account. The debug of a folder shows which host and which Export Rule with which conditions gave which option and how the values merge. Calculated from the syncer alone without touching Checkmk or the pools, users limited to accounts or templates only see the folders and options of their own hosts
|
|
23
|
+
- FEAT: Checkmk menu sorted into groups with dividers: the host export rules with the Pools first, then the rules for setup rules, groups, tags, users, downtimes, notifications, DCD and BI, then the Checkmk Server and the inventory from Checkmk, and at the bottom the views to check the result (Folders and Folder Options, Preview Generated Users, Data Quality Check, Cache). The menus are a little denser so the long ones fit the screen
|
|
24
|
+
- FEAT: Checkmk > Data Quality > Configuration Checks: pick a Checkmk account and the checks to run and see the problems they find, split by topic with a summary of the counts on top, and download them as a PDF report in the syncer design (needs the optional package fpdf2 from the extras, the page works without it). The first check looks at the HTTP checks: services that are WARN, CRIT or UNKNOWN in the monitoring right now with their output and the rule behind them, the same URL checked twice, website and certificate checked by two separate checks that one check_httpv2 check can do, and old check_http rules that are not migrated or still run next to their migrated rule. The checks only read from Checkmk. The Data Quality Check moved into the same Data Quality submenu
|
|
25
|
+
|
|
26
|
+
## Version 4.5.0
|
|
27
|
+
|
|
28
|
+
(Initial 4.5 release — entries currently live in the Unreleased section
|
|
29
|
+
above. They get folded down into this section when the release is cut.)
|
|
@@ -10,12 +10,17 @@ with the structure at https://docs.cmdbsyncer.de/.
|
|
|
10
10
|
docu_links = {
|
|
11
11
|
'rewrite' : 'https://docs.cmdbsyncer.de/basics/rewrite_attributes/',
|
|
12
12
|
'accounts' : 'https://docs.cmdbsyncer.de/basics/accounts/',
|
|
13
|
+
'lookup_tables': 'https://docs.cmdbsyncer.de/basics/lookup_tables/',
|
|
14
|
+
'jinja_functions': 'https://docs.cmdbsyncer.de/advanced/jinja_functions/',
|
|
13
15
|
'cmk_inventory_attributes': 'https://docs.cmdbsyncer.de/checkmk/inventorize/',
|
|
14
16
|
'cmk_groups': 'https://docs.cmdbsyncer.de/checkmk/groups_management/',
|
|
15
17
|
'cmk_user_generation': 'https://docs.cmdbsyncer.de/checkmk/user_generation/',
|
|
16
18
|
'cmk_setup_rules': 'https://docs.cmdbsyncer.de/checkmk/rules_management/',
|
|
19
|
+
'cmk_sites': 'https://docs.cmdbsyncer.de/ansible/cmk_sites/',
|
|
17
20
|
'cmk_hosttags': 'https://docs.cmdbsyncer.de/checkmk/create_hosttags/',
|
|
18
21
|
'cmk_password_store': 'https://docs.cmdbsyncer.de/checkmk/password_store/',
|
|
22
|
+
'cmk_ldap_connections': 'https://docs.cmdbsyncer.de/checkmk/ldap_connections/',
|
|
23
|
+
'cmk_folders': 'https://docs.cmdbsyncer.de/checkmk/folders/',
|
|
19
24
|
|
|
20
25
|
# Enterprise features — referenced from cmdbsyncer_enterprise views.
|
|
21
26
|
'ent_overview': 'https://docs.cmdbsyncer.de/enterprise/',
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
"""
|
|
2
|
+
YAML rows and Secret Store columns for the manual host import.
|
|
3
|
+
|
|
4
|
+
The host list imports a CSV through a preview where the user picks the
|
|
5
|
+
hostname column. YAML (an uploaded file or text pasted into Manual add) goes
|
|
6
|
+
through the same preview: a mapping of ``key: value`` pairs is one host, a
|
|
7
|
+
list of mappings or several documents separated by ``---`` are several
|
|
8
|
+
hosts, and every key becomes a column. Columns the user marks as secret are not written as
|
|
9
|
+
labels but into the Secret Store, bound to the imported host.
|
|
10
|
+
"""
|
|
11
|
+
import json
|
|
12
|
+
import re
|
|
13
|
+
|
|
14
|
+
import yaml
|
|
15
|
+
|
|
16
|
+
from application.helpers.secret_access import can_bind
|
|
17
|
+
from application.models.secret import store_host_secret
|
|
18
|
+
|
|
19
|
+
YAML_SUFFIXES = ('.yml', '.yaml')
|
|
20
|
+
|
|
21
|
+
# Column names preselected as secret on the preview.
|
|
22
|
+
SECRET_HINTS = ('token', 'password', 'secret', 'certificate', 'cert')
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
# A first line like ``cluster: name``, ``---`` or ``- key: value``. A
|
|
26
|
+
# hostname never holds ``: ``, so a plain hostname list is never taken
|
|
27
|
+
# for YAML.
|
|
28
|
+
_YAML_START = re.compile(r'^(---|- |[A-Za-z0-9_.-]+:(\s|$))')
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def is_yaml_filename(filename):
|
|
32
|
+
"""True for a file the import reads as YAML."""
|
|
33
|
+
return (filename or '').lower().endswith(YAML_SUFFIXES)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def looks_like_yaml(text):
|
|
37
|
+
"""True when pasted text is YAML rather than hostnames or CSV."""
|
|
38
|
+
for line in (text or '').splitlines():
|
|
39
|
+
stripped = line.strip()
|
|
40
|
+
if not stripped or stripped.startswith('#'):
|
|
41
|
+
continue
|
|
42
|
+
return bool(_YAML_START.match(stripped))
|
|
43
|
+
return False
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _cell(value):
|
|
47
|
+
"""A YAML value as the string a CSV cell would hold."""
|
|
48
|
+
if value is None:
|
|
49
|
+
return ''
|
|
50
|
+
if isinstance(value, (dict, list)):
|
|
51
|
+
return json.dumps(value)
|
|
52
|
+
return str(value)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _strict_entries(text):
|
|
56
|
+
"""Mappings of ``text`` read as real YAML; ValueError when it is not."""
|
|
57
|
+
try:
|
|
58
|
+
documents = list(yaml.safe_load_all(text))
|
|
59
|
+
except yaml.YAMLError as exc:
|
|
60
|
+
raise ValueError(str(exc)) from exc
|
|
61
|
+
entries = []
|
|
62
|
+
for data in documents:
|
|
63
|
+
if data is None:
|
|
64
|
+
continue
|
|
65
|
+
for entry in data if isinstance(data, list) else [data]:
|
|
66
|
+
if not isinstance(entry, dict):
|
|
67
|
+
raise ValueError("expected 'key: value' lines")
|
|
68
|
+
entries.append(entry)
|
|
69
|
+
return entries
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
# Top-level key of the YAML-like format: ``key: value`` or ``key:``.
|
|
73
|
+
_FLAT_KEY = re.compile(r'^([A-Za-z_][\w.-]*):(?:\s+(.*))?$')
|
|
74
|
+
_BLOCK_INDICATOR = re.compile(r'^[|>][-+]?$')
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def _block_value(indicator, lines):
|
|
78
|
+
"""
|
|
79
|
+
Value of a ``key: |`` / ``key: >`` block in the YAML-like format.
|
|
80
|
+
|
|
81
|
+
Its lines may carry any indentation (certificate bodies often start at
|
|
82
|
+
column 0 between indented BEGIN/END lines), so every line is stripped
|
|
83
|
+
on the left; a PEM chain comes out as clean, unindented lines.
|
|
84
|
+
"""
|
|
85
|
+
while lines and not lines[-1].strip():
|
|
86
|
+
lines = lines[:-1]
|
|
87
|
+
stripped = [line.strip() for line in lines]
|
|
88
|
+
if indicator.startswith('>'):
|
|
89
|
+
value = ' '.join(line for line in stripped if line)
|
|
90
|
+
else:
|
|
91
|
+
value = '\n'.join(stripped)
|
|
92
|
+
if not indicator.endswith('-'):
|
|
93
|
+
value += '\n'
|
|
94
|
+
return value
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def _plain_value(value):
|
|
98
|
+
"""A plain ``key: value`` value, surrounding quotes removed."""
|
|
99
|
+
value = (value or '').strip()
|
|
100
|
+
if len(value) > 1 and value[0] == value[-1] and value[0] in ('"', "'"):
|
|
101
|
+
return value[1:-1]
|
|
102
|
+
return value
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
# A ``key: value``, ``key=value`` or ``key<TAB>value`` line of a pasted
|
|
106
|
+
# key/value list; split at the first separator, so URLs keep their port.
|
|
107
|
+
_KV_LINE = re.compile(r'^\s*([A-Za-z_][\w .-]*?)\s*(?::|=|\t)\s*(.*)$')
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def _flat_entries(text, filename, key_value=False):
|
|
111
|
+
"""
|
|
112
|
+
Mappings of the YAML-like format: flat ``key: value`` lines, a ``key: |``
|
|
113
|
+
block continues over every following line (whatever its indentation)
|
|
114
|
+
up to the next top-level key, ``---`` separates hosts. Raises
|
|
115
|
+
ValueError naming the first line that fits none of this.
|
|
116
|
+
|
|
117
|
+
With ``key_value`` it reads a pasted key/value list instead: lines may
|
|
118
|
+
also be ``key=value`` or ``key<TAB>value`` and an empty line separates
|
|
119
|
+
hosts as well. Inside a block only a ``key:`` line ends it, so base64
|
|
120
|
+
lines ending in ``=`` stay part of a certificate.
|
|
121
|
+
"""
|
|
122
|
+
entries, current, block = [], {}, None
|
|
123
|
+
|
|
124
|
+
def close_block():
|
|
125
|
+
if block:
|
|
126
|
+
current[block[0]] = _block_value(block[1], block[2])
|
|
127
|
+
|
|
128
|
+
def close_host():
|
|
129
|
+
if current:
|
|
130
|
+
entries.append(dict(current))
|
|
131
|
+
current.clear()
|
|
132
|
+
|
|
133
|
+
for number, line in enumerate(text.splitlines(), start=1):
|
|
134
|
+
if line.strip() == '---' or (key_value and not line.strip()):
|
|
135
|
+
close_block()
|
|
136
|
+
block = None
|
|
137
|
+
close_host()
|
|
138
|
+
continue
|
|
139
|
+
match = _FLAT_KEY.match(line.rstrip())
|
|
140
|
+
if match is None and key_value and block is None:
|
|
141
|
+
match = _KV_LINE.match(line.rstrip())
|
|
142
|
+
if match:
|
|
143
|
+
close_block()
|
|
144
|
+
block = None
|
|
145
|
+
key, value = match.group(1).strip(), (match.group(2) or '').strip()
|
|
146
|
+
if _BLOCK_INDICATOR.match(value):
|
|
147
|
+
block = (key, value, [])
|
|
148
|
+
else:
|
|
149
|
+
current[key] = _plain_value(value)
|
|
150
|
+
continue
|
|
151
|
+
if block:
|
|
152
|
+
block[2].append(line)
|
|
153
|
+
continue
|
|
154
|
+
if not line.strip() or line.lstrip().startswith('#'):
|
|
155
|
+
continue
|
|
156
|
+
raise ValueError(f"{filename}, line {number}: not a 'key: value' line")
|
|
157
|
+
close_block()
|
|
158
|
+
close_host()
|
|
159
|
+
return entries
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
def key_value_rows(text, filename='pasted text'):
|
|
163
|
+
"""Rows of a pasted key/value list (see ``_flat_entries``)."""
|
|
164
|
+
return [{key: _cell(value) for key, value in entry.items()}
|
|
165
|
+
for entry in _flat_entries(text, filename, key_value=True)]
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def yaml_rows(files):
|
|
169
|
+
"""
|
|
170
|
+
Rows of the given ``(filename, text)`` YAML files, one dict per host.
|
|
171
|
+
A file may hold several hosts: a list of mappings, or several
|
|
172
|
+
documents separated by ``---`` (each a mapping or a list of them).
|
|
173
|
+
|
|
174
|
+
Files that are only YAML-like (block lines out of indentation, as
|
|
175
|
+
certificate chains often come) are read by a tolerant parser for flat
|
|
176
|
+
``key: value`` files when strict YAML fails. Raises ValueError with a
|
|
177
|
+
short message naming the file and line when both fail.
|
|
178
|
+
"""
|
|
179
|
+
rows = []
|
|
180
|
+
for filename, text in files:
|
|
181
|
+
try:
|
|
182
|
+
entries = _strict_entries(text)
|
|
183
|
+
except ValueError:
|
|
184
|
+
entries = _flat_entries(text, filename)
|
|
185
|
+
for entry in entries:
|
|
186
|
+
rows.append({str(key): _cell(value) for key, value in entry.items()})
|
|
187
|
+
return rows
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def rows_columns(rows):
|
|
191
|
+
"""``(columns, data_rows)`` of row dicts, columns in first-seen order."""
|
|
192
|
+
columns = []
|
|
193
|
+
for row in rows:
|
|
194
|
+
for key in row:
|
|
195
|
+
if key not in columns:
|
|
196
|
+
columns.append(key)
|
|
197
|
+
data_rows = [[row.get(col, '') for col in columns] for row in rows]
|
|
198
|
+
return columns, data_rows
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
def suggested_secret_columns(columns, hostname_column):
|
|
202
|
+
"""Columns whose name looks like it holds a secret."""
|
|
203
|
+
return [col for col in columns
|
|
204
|
+
if col != hostname_column
|
|
205
|
+
and any(hint in col.lower() for hint in SECRET_HINTS)]
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
def split_secrets(row, secret_columns):
|
|
209
|
+
"""Take the secret columns out of ``row``; returns them as a dict."""
|
|
210
|
+
secrets = {}
|
|
211
|
+
for col in secret_columns:
|
|
212
|
+
value = row.pop(col, None)
|
|
213
|
+
if value not in (None, ''):
|
|
214
|
+
secrets[col] = value
|
|
215
|
+
return secrets
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
def store_row_secrets(user, host, secrets, source):
|
|
219
|
+
"""
|
|
220
|
+
Write ``secrets`` into the Secret Store, bound to ``host``, when
|
|
221
|
+
``user`` may bind entries to that host. Returns ``(stored, refused)``.
|
|
222
|
+
"""
|
|
223
|
+
if not secrets:
|
|
224
|
+
return 0, 0
|
|
225
|
+
if not can_bind(user, host):
|
|
226
|
+
return 0, len(secrets)
|
|
227
|
+
for key, value in secrets.items():
|
|
228
|
+
store_host_secret(host, key, value, source)
|
|
229
|
+
return len(secrets), 0
|
|
@@ -102,7 +102,12 @@ def update_import_host(host_obj, labels, config, **kwargs):
|
|
|
102
102
|
the importing account. Saved only when the account may own it, a
|
|
103
103
|
host of another master account stays as it is. Returns whether it
|
|
104
104
|
was saved. Extra keywords go to `set_account()`.
|
|
105
|
+
|
|
106
|
+
A shadow source account only stores its labels as shadow data of
|
|
107
|
+
the host, see `Host.update_shadow()`.
|
|
105
108
|
"""
|
|
109
|
+
if config.get('shadow_mode'):
|
|
110
|
+
return host_obj.update_shadow(labels, config)
|
|
106
111
|
host_obj.update_host(labels)
|
|
107
112
|
if host_obj.set_account(account_dict=config, **kwargs):
|
|
108
113
|
host_obj.save()
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Jinja help for template fields
|
|
3
|
+
|
|
4
|
+
What the "Jinja help" panel next to a template field lists: the syncer's
|
|
5
|
+
own functions and filters, a few Jinja basics, the variables a rule hands
|
|
6
|
+
in and the existing lookup tables. Every entry has a snippet that a click
|
|
7
|
+
inserts into the field.
|
|
8
|
+
|
|
9
|
+
``tests/test_jinja_help.py`` checks that every function and filter
|
|
10
|
+
registered in ``syncer_jinja`` has an entry here, so a new one cannot be
|
|
11
|
+
added without its help.
|
|
12
|
+
"""
|
|
13
|
+
# pylint: disable=import-outside-toplevel
|
|
14
|
+
from application.docu_links import docu_links
|
|
15
|
+
|
|
16
|
+
# (name, snippet, description). The snippets are one line: the template
|
|
17
|
+
# fields are single line inputs. `attribute` stands for the name of a host
|
|
18
|
+
# attribute.
|
|
19
|
+
FUNCTIONS = (
|
|
20
|
+
('lookup',
|
|
21
|
+
"{{ lookup('table', attribute, default='unknown') }}",
|
|
22
|
+
"Value of a lookup table (Modules > Lookup Tables) for a key: the second "
|
|
23
|
+
"column, or the column named as third argument."),
|
|
24
|
+
('get_list',
|
|
25
|
+
"{% for item in get_list(attribute) %}{{ item }},{% endfor %}",
|
|
26
|
+
"Turns a list, a list literal or a comma separated string into a list."),
|
|
27
|
+
('merge_list_of_dicts',
|
|
28
|
+
"{{ merge_list_of_dicts(attribute)['key'] }}",
|
|
29
|
+
"Merges a list of dicts into one dict, empty values are dropped."),
|
|
30
|
+
('eval',
|
|
31
|
+
"{{ eval(attribute) }}",
|
|
32
|
+
"Reads a string holding a Python literal (list, dict, number)."),
|
|
33
|
+
('defined',
|
|
34
|
+
"{{ defined(attribute, 'fallback') }}",
|
|
35
|
+
"The value, or the fallback when it is empty, 'false' or 'none'."),
|
|
36
|
+
('hash_value',
|
|
37
|
+
"{{ hash_value(attribute) }}",
|
|
38
|
+
"Short stable hash of a value, e.g. to make a label of a long list."),
|
|
39
|
+
('cmk_cleanup_tag_id',
|
|
40
|
+
"{{ cmk_cleanup_tag_id(attribute) }}",
|
|
41
|
+
"Cleans a value up to a valid Checkmk host tag id."),
|
|
42
|
+
('cmk_cleanup_hostname',
|
|
43
|
+
"{{ cmk_cleanup_hostname(attribute) }}",
|
|
44
|
+
"Cleans a value up to a valid Checkmk host name."),
|
|
45
|
+
('cmk_password',
|
|
46
|
+
"{{ cmk_password('name') }}",
|
|
47
|
+
"Checkmk password store reference of a global Secret Store entry."),
|
|
48
|
+
('secret',
|
|
49
|
+
"{{ secret('key') }}",
|
|
50
|
+
"Checkmk password store reference of the Secret Store entry of this host "
|
|
51
|
+
"(or the global entry of that name)."),
|
|
52
|
+
('secret_value',
|
|
53
|
+
"{{ secret_value('key') }}",
|
|
54
|
+
"Plaintext of that Secret Store entry, e.g. a certificate."),
|
|
55
|
+
('get_ip_network',
|
|
56
|
+
"{{ get_ip_network(attribute) }}",
|
|
57
|
+
"Network of an address with mask: 10.1.2.3/255.255.255.0 gives "
|
|
58
|
+
"10.1.2.0/255.255.255.0."),
|
|
59
|
+
('get_ip_interface',
|
|
60
|
+
"{{ get_ip_interface(attribute) }}",
|
|
61
|
+
"Address with prefix length: 10.1.2.3/255.255.255.0 gives 10.1.2.3/24."),
|
|
62
|
+
('get_ip4_interface',
|
|
63
|
+
"{{ get_ip4_interface(attribute) }}",
|
|
64
|
+
"Same as get_ip_interface."),
|
|
65
|
+
('datetime',
|
|
66
|
+
"{{ datetime.datetime.now().strftime('%Y-%m-%d') }}",
|
|
67
|
+
"The Python datetime module, e.g. for the current date."),
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
FILTERS = (
|
|
71
|
+
('hash',
|
|
72
|
+
"{{ attribute | hash }}",
|
|
73
|
+
"Filter form of hash_value."),
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
BASICS = (
|
|
77
|
+
('if / else',
|
|
78
|
+
"{% if attribute == 'value' %}yes{% else %}no{% endif %}",
|
|
79
|
+
"Different values depending on a condition."),
|
|
80
|
+
('default',
|
|
81
|
+
"{{ attribute | default('unknown') }}",
|
|
82
|
+
"Fallback for a host without the attribute (otherwise the whole value "
|
|
83
|
+
"is empty)."),
|
|
84
|
+
('lower / upper',
|
|
85
|
+
"{{ attribute | lower }}",
|
|
86
|
+
"Lower case (upper for upper case)."),
|
|
87
|
+
('replace',
|
|
88
|
+
"{{ attribute | replace('old', 'new') }}",
|
|
89
|
+
"Replaces text in the value."),
|
|
90
|
+
('split',
|
|
91
|
+
"{{ attribute.split('.')[0] }}",
|
|
92
|
+
"Part of a value, e.g. the short name of an FQDN."),
|
|
93
|
+
('ACCOUNT',
|
|
94
|
+
"{{ACCOUNT:account_name:field}}",
|
|
95
|
+
"A field of an account, e.g. its address or password."),
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
# The variables the host based rules (Custom Attributes, Rewrite
|
|
99
|
+
# Attributes) hand in besides the host's attributes.
|
|
100
|
+
RULE_VARIABLES = (
|
|
101
|
+
('HOSTNAME', "{{ HOSTNAME }}", "Name of the host."),
|
|
102
|
+
('FIRST_MATCHING_TAG', "{{ FIRST_MATCHING_TAG }}",
|
|
103
|
+
"Attribute name the first condition of the rule matched."),
|
|
104
|
+
('FIST_MATCHING_VALUE', "{{ FIST_MATCHING_VALUE }}",
|
|
105
|
+
"Attribute value the first condition of the rule matched."),
|
|
106
|
+
('any attribute', "{{ attribute }}",
|
|
107
|
+
"Every attribute of the host is a variable of its own name."),
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
# The variables of a Checkmk Setup Rule rendered per host.
|
|
111
|
+
SETUP_RULE_VARIABLES = (
|
|
112
|
+
('HOSTNAME', "{{ HOSTNAME }}", "Name of the host."),
|
|
113
|
+
('HOST_FOLDER', "{{ HOST_FOLDER }}",
|
|
114
|
+
"Folder the host lands in (Checkmk > Export Rules: Move to Folder or "
|
|
115
|
+
"Pool Folder), e.g. as rule folder. Per host only: a rule from a list "
|
|
116
|
+
"or a Static Rule has no host."),
|
|
117
|
+
('loop', "{{ loop }}",
|
|
118
|
+
"Current entry when Loop over List is set (loop_idx: its index)."),
|
|
119
|
+
('any attribute', "{{ attribute }}",
|
|
120
|
+
"Every attribute of the host is a variable of its own name."),
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
# The variables of a Checkmk DCD Rule.
|
|
125
|
+
DCD_RULE_VARIABLES = (
|
|
126
|
+
('HOSTNAME', "{{ HOSTNAME }}", "Name of the host."),
|
|
127
|
+
('HOST_FOLDER', "{{ HOST_FOLDER }}",
|
|
128
|
+
"Folder the host lands in (Checkmk > Export Rules: Move to Folder or "
|
|
129
|
+
"Pool Folder), e.g. as folder of a creation rule. Per host only: a rule "
|
|
130
|
+
"from a list or a Static Rule has no host."),
|
|
131
|
+
('HOST_POOL_SITE', "{{ HOST_POOL_SITE }}",
|
|
132
|
+
"Site the site pool assigned to the host in the host export (empty "
|
|
133
|
+
"without one), e.g. as site of the connection. Per host only."),
|
|
134
|
+
('cmk_site', "{{ cmk_site }}",
|
|
135
|
+
"Checkmk site of the account the export runs for."),
|
|
136
|
+
('account', "{{ account.address }}",
|
|
137
|
+
"A field or custom field of that account (passwords are left out)."),
|
|
138
|
+
('any attribute', "{{ attribute }}",
|
|
139
|
+
"Every attribute of the host is a variable of its own name, from a "
|
|
140
|
+
"pasted list its columns."),
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
# How a password in the value of a Checkmk Setup Rule points to the Secret
|
|
144
|
+
# Store. Checkmk 2.3+ holds a password as such a tuple; a stored_password
|
|
145
|
+
# only names the ident the password export writes, the secret itself stays
|
|
146
|
+
# out of the rule.
|
|
147
|
+
CHECKMK_RULE_PASSWORDS = (
|
|
148
|
+
('host secret',
|
|
149
|
+
"('cmk_postprocessed', 'stored_password', ('{{ secret(\"key\") }}', ''))",
|
|
150
|
+
"Replaces the password tuple in the value with a reference to the "
|
|
151
|
+
"Secret Store entry of this host (or the global entry of that name), "
|
|
152
|
+
"e.g. one an import stored. Export the passwords to Checkmk first."),
|
|
153
|
+
('global secret',
|
|
154
|
+
"('cmk_postprocessed', 'stored_password', ('{{ cmk_password(\"name\") }}', ''))",
|
|
155
|
+
"The same with a global Secret Store entry. An "
|
|
156
|
+
"('cmk_postprocessed', 'explicit_password', ...) tuple of a rule copied "
|
|
157
|
+
"from Checkmk is replaced like this; Checkmk shows its secret only as "
|
|
158
|
+
"******."),
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
def _entries(group, items):
|
|
163
|
+
return [{'group': group, 'name': name, 'snippet': snippet, 'text': text}
|
|
164
|
+
for name, snippet, text in items]
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
def lookup_tables():
|
|
168
|
+
"""
|
|
169
|
+
Name and columns of every lookup table. Only the header line is
|
|
170
|
+
parsed: a table can be long and the panel needs nothing else.
|
|
171
|
+
"""
|
|
172
|
+
from application.models.lookup_table import LookupTable
|
|
173
|
+
from application.modules.rule.list_source import parse_list_source
|
|
174
|
+
tables = []
|
|
175
|
+
for entry in LookupTable.objects.only('name', 'entries').order_by('name'):
|
|
176
|
+
header = (entry.entries or '').strip('\r\n').split('\n', 1)[0]
|
|
177
|
+
columns = parse_list_source(header).columns
|
|
178
|
+
tables.append({'name': entry.name, 'key': columns[0] if columns else '',
|
|
179
|
+
'columns': columns[1:]})
|
|
180
|
+
return tables
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
def jinja_help(fields, note='', variables=RULE_VARIABLES, extra=()):
|
|
184
|
+
"""
|
|
185
|
+
What the help panel of a form needs: the fields (outcome field names)
|
|
186
|
+
it is shown for, a note on when they are rendered, the entries (with
|
|
187
|
+
the variables the form's rule hands in, then the ``(group, items)``
|
|
188
|
+
pairs of ``extra``) and the lookup tables.
|
|
189
|
+
"""
|
|
190
|
+
entries = _entries('Variables', variables)
|
|
191
|
+
for group, items in extra:
|
|
192
|
+
entries += _entries(group, items)
|
|
193
|
+
return {
|
|
194
|
+
'fields': list(fields),
|
|
195
|
+
'note': note,
|
|
196
|
+
'entries': (entries
|
|
197
|
+
+ _entries('Syncer functions', FUNCTIONS)
|
|
198
|
+
+ _entries('Syncer filters', FILTERS)
|
|
199
|
+
+ _entries('Jinja basics', BASICS)),
|
|
200
|
+
'tables': lookup_tables(),
|
|
201
|
+
'docs': docu_links['jinja_functions'],
|
|
202
|
+
}
|