cmdbsyncer 4.4.0__tar.gz → 4.4.2__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.4.2}/PKG-INFO +1 -1
- cmdbsyncer-4.4.2/application/buildinfo.txt +1 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/changelog/v4.3.md +1 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/changelog/v4.4.md +39 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/get_account.py +13 -8
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/account.py +16 -9
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/host.py +8 -4
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/host_templates.py +41 -4
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/plugin.py +35 -7
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/rule/rule.py +15 -11
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/search_parser.py +28 -3
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/ansible/__init__.py +25 -8
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/ansible/inventory.py +29 -65
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/ansible/runner.py +14 -4
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/ansible/tests/test_runner_ssh_env.py +37 -1
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/cmk2.py +8 -1
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/cmk_rules.py +108 -40
- cmdbsyncer-4.4.2/application/plugins/checkmk/data/ruleset_examples.json +31 -0
- cmdbsyncer-4.4.2/application/plugins/checkmk/data/rulesets_2.4.json +11717 -0
- cmdbsyncer-4.4.2/application/plugins/checkmk/data/rulesets_2.5.json +10961 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/dcd.py +5 -1
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/models.py +10 -5
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/rules.py +12 -6
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/sitepool.py +18 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/syncer.py +5 -3
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_cmk_rules.py +152 -1
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_dcd.py +8 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_rules.py +56 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_sitepool.py +75 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_syncer.py +4 -3
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_users.py +18 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/users.py +12 -2
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/views.py +1 -1
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/cron.py +33 -3
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/dataflow.py +2 -1
- cmdbsyncer-4.4.2/application/plugins/netbox/tests/test_same_host_url.py +29 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/utils.py +13 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/rest/rest.py +1 -2
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/static/css/cmdbsyncer.css +16 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/host_list.html +4 -1
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/model/_list_source_preview.html +3 -1
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/debug_host.html +6 -4
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/host.py +8 -10
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/host_filters.py +8 -12
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/host_renderers.py +11 -18
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/cmdbsyncer.egg-info/PKG-INFO +1 -1
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/cmdbsyncer.egg-info/SOURCES.txt +8 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/pyproject.toml +2 -1
- cmdbsyncer-4.4.2/tests/test_account_master_cache_smoke.py +50 -0
- cmdbsyncer-4.4.2/tests/test_active_templates.py +56 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_ansible_cmk_roles.py +27 -0
- cmdbsyncer-4.4.2/tests/test_ansible_inventory.py +65 -0
- cmdbsyncer-4.4.2/tests/test_cron_stale_lock_smoke.py +57 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_import_hostnames.py +9 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_plugin.py +21 -4
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_rule.py +120 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_search_parser.py +22 -8
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_security_fixes.py +23 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_web_list_source.py +4 -0
- cmdbsyncer-4.4.0/application/buildinfo.txt +0 -1
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/LICENSE +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/README.md +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/_version.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/api/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/api/inventory.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/api/objects.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/api/rules.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/api/syncer.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/api/views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/auth/views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/changelog/.pages +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/changelog/v3.10.md +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/changelog/v3.11.md +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/changelog/v3.12.md +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/changelog/v3.5.md +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/changelog/v3.7.md +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/changelog/v3.8.md +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/changelog/v3.9.md +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/changelog/v4.0.md +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/changelog/v4.1.md +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/changelog/v4.2.md +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/cli.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/config.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/docu_links.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/enterprise.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/audit.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/cron.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/db_analysis.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/host_maintenance.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/import_hostnames.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/inventory.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/label_hash.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/label_history.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/local_config_file.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/local_config_presets.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/mongo_keys.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/notification_channels.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/notification_dispatch.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/plugins.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/retention.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/sates.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/sql.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/stale_indexes.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/syncer_jinja.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/tablib_formater.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/tests/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/tests/test_sql.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/timezone.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/mcp_server.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/config.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/cron.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/field_approval.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/forms.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/host_cleanup.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/host_create_time.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/host_inventory_tree.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/host_label_event.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/host_labels.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/notification_channel.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/notification_rule.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/notification_state.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/project.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/saved_search.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/states.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/user.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/module_registry.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/custom_attributes/models.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/custom_attributes/rules.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/custom_attributes/views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/debug.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/email.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/inventory/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/log/command_output.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/log/log.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/log/models.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/log/views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/rule/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/rule/filter.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/rule/list_source.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/rule/list_source_views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/rule/match.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/rule/models.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/rule/rewrite.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/rule/views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/statefile.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/notices/strict_certificate_verification.txt +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/ansible/admin_views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/ansible/models.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/ansible/playbook_rules.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/ansible/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/ansible/rules.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/ansible/seed.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/ansible/site_syncer.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/ansible/tests/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/ansible/views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/bmc_remedy/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/bmc_remedy/bmc_remedy.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/bmc_remedy/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/admin_views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/bi.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/data_quality.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/downtimes.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/folder_attributes.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/groups.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/helpers.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/import_v1.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/import_v2.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/inits.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/inventorize.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/list_source.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/notification_rules.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/passwords.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/poolfolder.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/rule_analysis_runner.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/rule_passwords.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/rulesets_catalog.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/sites.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tags.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_assign_template.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_bi.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_cmk2.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_cmk_conditions.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_data_quality.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_downtimes.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_groups.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_helpers.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_import_v1.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_import_v2.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_inventorize.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_list_source.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_notification_rules.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_passwords.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_poolfolder.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_rule_analysis_runner.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_rule_passwords.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_sites.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_tags.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_user_generation.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/user_generation.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/user_models.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/cisco_dna/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/cisco_dna/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/cisco_dna/syncer.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/csv/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/csv/csv.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/csv/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/eda/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/eda/admin_views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/eda/models.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/eda/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/eda/repeats.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/eda/rules.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/eda/sender.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/eda/tests/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/eda/tests/test_eda.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/eda/tests/test_repeats.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/eda/views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/file_requests.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/idoit/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/idoit/admin_views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/idoit/models.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/idoit/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/idoit/rules.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/idoit/syncer.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/idoit/views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jdisc/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jdisc/applications.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jdisc/devices.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jdisc/executables.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jdisc/jdisc.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jdisc/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jira/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jira/jira.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jira/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jira_cloud/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jira_cloud/admin_views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jira_cloud/export.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jira_cloud/jira_cloud.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jira_cloud/models.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jira_cloud/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jira_cloud/rules.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jira_cloud/schema_sync.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jira_cloud/tests/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jira_cloud/tests/test_attribute_value.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jira_cloud/views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/json/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/json/json.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/json/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/ldap/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/ldap/admin_views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/ldap/ldap.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/ldap/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/ldap/views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/maintenance/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/maintenance/db_commands.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/maintenance/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/maintenance/tests/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/maintenance/tests/test_delete_all_hosts.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/maintenance/tests/test_delete_inventory.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/mssql/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/mssql/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/mysql/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/mysql/mysql.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/mysql/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/admin_views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/cluster.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/contacts.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/devices.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/interfaces.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/ips.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/models.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/netbox.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/networks.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/prefixes.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/rules.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/tests/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/tests/test_import_filter.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/virtualmachines.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/prtg/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/prtg/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/prtg/prtg.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/pyodbc/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/pyodbc/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/pyodbc/pyodbc.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/rest/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/rest/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/rules/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/rules/admin_views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/rules/autorules.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/rules/models.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/rules/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/rules/rule_definitions.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/rules/rule_import_export.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/rules/views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/servicenow/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/servicenow/admin_views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/servicenow/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/servicenow/syncer.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/servicenow/tests/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/servicenow/tests/test_table_request.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/servicenow/views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/syncer_shell.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/vmware/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/vmware/admin_views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/vmware/custom_attributes.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/vmware/models.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/vmware/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/vmware/rules.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/vmware/views.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/vmware/vmware.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/yml/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/yml/plugin.json +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/yml/yml.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins_cli.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/static/cmdbsyncer_mark.png +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/static/favicon.png +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/static/js/Sortable.min.js +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/static/js/main.js +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/static/logo_white.png +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/static/vendor/README.md +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/static/vendor/ansible.svg +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/static/vendor/checkmk.svg +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/static/vendor/idoit.svg +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/static/vendor/jira.svg +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/static/vendor/netbox.svg +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/static/vendor/vmware.svg +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/_brand.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/_theme.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/_timezone.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/_host_tabs.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/account_create.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/account_edit.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/account_field_help.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/account_pick_type.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/ansible_playbook_run.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/ansible_project_detail.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/ansible_rule_list.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/ansible_run_details.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/assign_project_form.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/bulk_label_form.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/changelog_archive.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/checkmk_data_quality.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/checkmk_list_rule_debug.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/checkmk_rule_mngmt_list.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/checkmk_rule_optimization.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/checkmk_settings_list.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/checkmk_test_folder_scope.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/checkmk_user_generation_preview.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/checkmk_user_generation_rule_list.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/copy_as_new_form.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/data_quality.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/data_quality_lowercase_preview.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/file/list.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/file/modals/form.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/first_steps.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/host_csv_import_preview.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/host_details.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/host_edit.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/host_inventory_tree.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/host_relations_graph.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/host_timeline.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/index.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/ldap_search.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/local_config_editor.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/master.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/model/_action_picker.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/model/_folder_builder.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/model/_notification_plugin_picker.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/model/_ruleset_autocomplete.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/model/checkmk_notification_rule_create.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/model/checkmk_notification_rule_edit.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/model/checkmk_rule_create.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/model/checkmk_rule_edit.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/model/checkmk_rule_mngmt_create.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/model/checkmk_rule_mngmt_edit.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/model/clone_confirm.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/model/inline_list_base.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/model/list_source_create.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/model/list_source_edit.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/module_overview.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/object_list.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/project_edit.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/project_import.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/project_import_cmk.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/project_list.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/project_overview.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/servicenow_query.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/set_account_form.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/set_cmk_version_form.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/set_template_form.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/api_tokens.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/base.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/change_password.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/csrf_error.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/debug.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/email/newuser.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/email/notification.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/email/resetpassword.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/formular.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/license_info.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/login.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/logout_confirm.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/request_password.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/set_2fa.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/set_theme.html +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/themes/dracula.css +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/themes/gruvbox-dark.css +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/themes/gruvbox-light.css +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/themes/nord.css +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/themes_registry.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/_form_fields.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/_form_sections.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/account.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/account_select.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/config.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/cron.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/data_quality.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/default.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/field_approval.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/fileadmin.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/first_steps.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/host_inventory_grid.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/host_widgets.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/license.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/menu_links.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/module_overview.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/notification_channel.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/notification_rule.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/project.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/saved_search.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/template_select.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/user.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/cmdbsyncer.egg-info/dependency_links.txt +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/cmdbsyncer.egg-info/entry_points.txt +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/cmdbsyncer.egg-info/requires.txt +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/cmdbsyncer.egg-info/top_level.txt +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/requirements-ansible-windows.txt +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/requirements-ansible.txt +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/requirements-extras.txt +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/requirements.txt +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/setup.cfg +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/syncerapi/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/syncerapi/v1/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/syncerapi/v1/core/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/syncerapi/v1/inventory/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/syncerapi/v1/rest/__init__.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_account_macro.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_api.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_api_csrf_invariant.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_config_dir.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_cron_missing_account.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_csrf_config.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_data_quality_duplicates.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_default_view.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_disabled_row_style.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_eda_web_smoke.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_enterprise_quiet.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_folder_builder_js.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_global_account_presets.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_host_cleanup.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_host_create_time.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_host_label_edit.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_host_roundtrip_smoke.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_host_template_filter.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_host_template_resync.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_jinja_get_list.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_jinja_hash.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_label_history.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_ldap_search_filter.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_local_config_presets.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_logging_config.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_model_indexes.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_mongo_keys.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_plugin_ssti.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_plugins_cli.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_regex_condition_limits.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_rule_export_templates.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_rule_filename_detect.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_rule_import_override.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_rule_list_rows.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_rule_list_source.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_rule_match.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_rule_registry_complete.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_stale_indexes.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_template_merge_fields.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_timezone.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_user_scope_smoke.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_view_permission_flags.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_web_account_password_chars.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_web_account_password_deferred_save.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_web_ansible_account_inventory.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_web_boot_smoke.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_web_debug_pages.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_web_requests_smoke.py +0 -0
- {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/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.4.
|
|
3
|
+
Version: 4.4.2
|
|
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>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
BUILD_DATE=2026-11-10T09:35:59Z
|
|
@@ -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,44 @@
|
|
|
1
1
|
# Version 4.4
|
|
2
2
|
|
|
3
|
+
## Version 4.4.2
|
|
4
|
+
- SEC: Netbox Dataflow: the API token only goes to the address of the account; a page link of the answer pointing to another host no longer gets it
|
|
5
|
+
- FIX: Cron Groups: after a restart of the container a group no longer stays marked as running, when another process got the number of its old run
|
|
6
|
+
- FIX: Accounts: a change, like the master flag, reaches every process of the web interface and REST API within a minute; before, some kept the old account until a restart
|
|
7
|
+
- FIX: Checkmk: a host export with --limit creates a host that a rule turns into a cluster right away; before, the host was deleted and only came back as cluster with the next full run
|
|
8
|
+
- FIX: Checkmk DCD Rules: Restrict Source Hosts renders Jinja like the other fields, e.g. {{ HOSTNAME }}; a line that renders empty is left out
|
|
9
|
+
- FIX: Checkmk: rule export: a rule with a stored password, for example Kubernetes on Checkmk 2.5, is no longer updated on every run
|
|
10
|
+
- FIX: Ansible: playbooks started from the web interface find ansible-playbook in the Syncer's venv, also when the web server runs under systemd without the venv on its PATH
|
|
11
|
+
- FIX: Checkmk: Manage OMD Server creates a missing site again, including the initial cmkadmin password, instead of failing on the update step
|
|
12
|
+
|
|
13
|
+
## Version 4.4.1
|
|
14
|
+
- FIX: REST import: entries without the hostname field are skipped instead of aborting the whole import
|
|
15
|
+
- FIX: Checkmk users: an empty row under Roles or Contact Groups is no longer sent to Checkmk, which rejected the user because of it
|
|
16
|
+
- FIX: Checkmk Site Pools: the member sites of a switched-off pool are readable again in the dark themes
|
|
17
|
+
- FIX: Rules with a Pasted List: switching the rule source to the list no longer hides the Enabled and Last Match checkboxes
|
|
18
|
+
- FIX: Host list: the page is about a fifth smaller for hosts with many labels and loads faster
|
|
19
|
+
- 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"
|
|
20
|
+
- 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
|
|
21
|
+
- FIX: Checkmk rule export: CMDB templates are read once per run instead of once for every host
|
|
22
|
+
- 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
|
|
23
|
+
- FIX: Ansible Checkmk agent playbook: hosts without any agent step switched on are skipped before Ansible connects to them
|
|
24
|
+
- FIX: Ansible inventory: several times faster and with considerably less memory on large host counts
|
|
25
|
+
- FIX: Ansible projects no longer hand out each other's cached variables, each project computes its own
|
|
26
|
+
- FIX: `ansible update_cache` rebuilds the whole Ansible cache instead of reusing the old values
|
|
27
|
+
- 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
|
|
28
|
+
- FIX: Checkmk rule export: correcting the description of a rule no longer replaces a password in its value with the masked `******` Checkmk shows
|
|
29
|
+
- 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
|
|
30
|
+
- 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
|
|
31
|
+
- 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
|
|
32
|
+
- FIX: The host list shows the Search options button only once again; after a search it appeared a second time next to the filters
|
|
33
|
+
- 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
|
|
34
|
+
- 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
|
|
35
|
+
- 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
|
|
36
|
+
- FIX: CMDB templates are listed alphabetically in the Templates view and in every template selection, like Set Template on the host list
|
|
37
|
+
- 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
|
|
38
|
+
- 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
|
|
39
|
+
- 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
|
|
40
|
+
- 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
|
|
41
|
+
|
|
3
42
|
## Version 4.4.0
|
|
4
43
|
|
|
5
44
|
### Setup
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Helper to get Account
|
|
3
3
|
"""
|
|
4
4
|
import copy
|
|
5
|
+
import time
|
|
5
6
|
from contextlib import contextmanager
|
|
6
7
|
from contextvars import ContextVar
|
|
7
8
|
|
|
@@ -67,11 +68,13 @@ _CHILD_OWNED_FIELDS = ('typ', 'username', 'password', 'address', 'object_type')
|
|
|
67
68
|
# Internal serialisation artefacts that never leave this layer.
|
|
68
69
|
_INTERNAL_FIELDS = ('custom_fields', 'password_crypted', 'plugin_settings')
|
|
69
70
|
|
|
70
|
-
# In-process cache: ``{(lookup_key, is_id): account_dict}``.
|
|
71
|
-
# the same handful of accounts for every host/rule, so
|
|
72
|
-
# and the secrets-manager hook off the hot path.
|
|
73
|
-
# save/delete
|
|
74
|
-
#
|
|
71
|
+
# In-process cache: ``{(lookup_key, is_id): (loaded_at, account_dict)}``.
|
|
72
|
+
# Sync runs read the same handful of accounts for every host/rule, so
|
|
73
|
+
# caching keeps Mongo and the secrets-manager hook off the hot path.
|
|
74
|
+
# Account save/delete clears it through mongoengine signals, but only in
|
|
75
|
+
# the process that saved; the other web workers read the account again
|
|
76
|
+
# after ACCOUNT_CACHE_SECONDS.
|
|
77
|
+
ACCOUNT_CACHE_SECONDS = 60
|
|
75
78
|
_account_cache = {}
|
|
76
79
|
|
|
77
80
|
|
|
@@ -177,10 +180,12 @@ def get_account_by_name(name, is_id=False):
|
|
|
177
180
|
Get Account by Name or Return False
|
|
178
181
|
"""
|
|
179
182
|
cache_key = (str(name), is_id)
|
|
180
|
-
|
|
181
|
-
if
|
|
183
|
+
entry = _account_cache.get(cache_key)
|
|
184
|
+
if entry and time.monotonic() - entry[0] < ACCOUNT_CACHE_SECONDS:
|
|
185
|
+
cached = entry[1]
|
|
186
|
+
else:
|
|
182
187
|
cached = _build_account_dict(name, is_id)
|
|
183
|
-
_account_cache[cache_key] = cached
|
|
188
|
+
_account_cache[cache_key] = (time.monotonic(), cached)
|
|
184
189
|
# Defensive copy — callers must not mutate the cached entry.
|
|
185
190
|
return copy.deepcopy(cached)
|
|
186
191
|
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"""
|
|
2
2
|
Account
|
|
3
3
|
"""
|
|
4
|
+
import time
|
|
5
|
+
|
|
4
6
|
from bson.errors import InvalidId
|
|
5
7
|
from mongoengine import DENY
|
|
6
8
|
from mongoengine.errors import ValidationError
|
|
@@ -230,6 +232,7 @@ class Account(db.Document):
|
|
|
230
232
|
return f"{self.name} ({self.typ})"
|
|
231
233
|
|
|
232
234
|
|
|
235
|
+
IS_MASTER_CACHE_SECONDS = 60
|
|
233
236
|
_IS_MASTER_CACHE = {}
|
|
234
237
|
|
|
235
238
|
# Hosts an import had to leave alone because a master account owns them.
|
|
@@ -273,13 +276,17 @@ def account_is_master(account_id):
|
|
|
273
276
|
Whether the account with *account_id* is flagged as master.
|
|
274
277
|
|
|
275
278
|
An import asks this once per host it does not own, so the answer is
|
|
276
|
-
cached for
|
|
277
|
-
(
|
|
279
|
+
cached for IS_MASTER_CACHE_SECONDS; a change of the flag reaches a
|
|
280
|
+
running process (web workers) within that time. Unknown or malformed
|
|
281
|
+
ids (legacy data) count as "not master".
|
|
278
282
|
"""
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
283
|
+
entry = _IS_MASTER_CACHE.get(account_id)
|
|
284
|
+
if entry and time.monotonic() - entry[0] < IS_MASTER_CACHE_SECONDS:
|
|
285
|
+
return entry[1]
|
|
286
|
+
try:
|
|
287
|
+
account = Account.objects(id=account_id).only('is_master').first()
|
|
288
|
+
except (ValidationError, InvalidId):
|
|
289
|
+
account = None
|
|
290
|
+
is_master = bool(account and account.is_master)
|
|
291
|
+
_IS_MASTER_CACHE[account_id] = (time.monotonic(), is_master)
|
|
292
|
+
return is_master
|
|
@@ -310,12 +310,16 @@ class Host(HostLabelsMixin, db.Document):
|
|
|
310
310
|
Return all Hosts eligible for export. Only rows that are not
|
|
311
311
|
soft-deleted and whose lifecycle_state is 'active' (or missing
|
|
312
312
|
for legacy rows) are returned.
|
|
313
|
+
|
|
314
|
+
Like the other export helpers below, the queryset does not cache
|
|
315
|
+
its documents: an export walks every host once, a cached queryset
|
|
316
|
+
held all of them in memory until the run ended.
|
|
313
317
|
"""
|
|
314
318
|
return Host.objects(
|
|
315
319
|
Host.active_q()
|
|
316
320
|
& Q(is_object__ne=True)
|
|
317
321
|
& Q(deleted_at__exists=False)
|
|
318
|
-
)
|
|
322
|
+
).no_cache()
|
|
319
323
|
|
|
320
324
|
@staticmethod
|
|
321
325
|
def objects_by_filter(object_list):
|
|
@@ -327,9 +331,9 @@ class Host(HostLabelsMixin, db.Document):
|
|
|
327
331
|
active = Host.active_q() & Q(deleted_at__exists=False)
|
|
328
332
|
if not object_list:
|
|
329
333
|
logger.debug("HOST FILTER OFF")
|
|
330
|
-
return Host.objects(active & Q(is_object__ne=True))
|
|
334
|
+
return Host.objects(active & Q(is_object__ne=True)).no_cache()
|
|
331
335
|
logger.debug("HOST FILTER %s", object_list)
|
|
332
|
-
return Host.objects(active & Q(object_type__in=object_list))
|
|
336
|
+
return Host.objects(active & Q(object_type__in=object_list)).no_cache()
|
|
333
337
|
|
|
334
338
|
@staticmethod
|
|
335
339
|
def active_non_template():
|
|
@@ -343,7 +347,7 @@ class Host(HostLabelsMixin, db.Document):
|
|
|
343
347
|
Host.active_q()
|
|
344
348
|
& Q(deleted_at__exists=False)
|
|
345
349
|
& Q(object_type__ne='template')
|
|
346
|
-
)
|
|
350
|
+
).no_cache()
|
|
347
351
|
|
|
348
352
|
|
|
349
353
|
@staticmethod
|
|
@@ -26,20 +26,57 @@ def parse_cmdb_match(cmdb_match):
|
|
|
26
26
|
return key, value
|
|
27
27
|
|
|
28
28
|
|
|
29
|
-
def active_templates(host):
|
|
29
|
+
def active_templates(host, cache=None):
|
|
30
30
|
"""
|
|
31
31
|
The templates a host carries that still contribute something. An
|
|
32
32
|
archived (soft-deleted) template keeps its assignment so a restore
|
|
33
33
|
brings it back, but it must not feed an export or be presented as
|
|
34
34
|
contributing in the meantime.
|
|
35
35
|
|
|
36
|
+
``cache`` is a dict the caller keeps over a run of many hosts. Reading
|
|
37
|
+
``host.cmdb_templates`` loads the template documents from the
|
|
38
|
+
database for every single host; with the cache each template is
|
|
39
|
+
loaded once.
|
|
40
|
+
|
|
36
41
|
Returns:
|
|
37
42
|
list: the host's non-archived templates.
|
|
38
43
|
"""
|
|
39
|
-
|
|
44
|
+
if cache is None:
|
|
45
|
+
templates = host.cmdb_templates or []
|
|
46
|
+
else:
|
|
47
|
+
templates = _cached_templates(host, cache)
|
|
48
|
+
return [tmpl for tmpl in templates
|
|
40
49
|
if not getattr(tmpl, 'deleted_at', None)]
|
|
41
50
|
|
|
42
51
|
|
|
52
|
+
def _cached_templates(host, cache):
|
|
53
|
+
"""
|
|
54
|
+
The templates of ``host`` out of ``cache`` (template id -> template),
|
|
55
|
+
the missing ones loaded with one query. Reads the references as
|
|
56
|
+
stored, so the host does not load them itself.
|
|
57
|
+
"""
|
|
58
|
+
raw = getattr(host, '_data', None)
|
|
59
|
+
if not isinstance(raw, dict):
|
|
60
|
+
return host.cmdb_templates or []
|
|
61
|
+
template_ids = []
|
|
62
|
+
for ref in raw.get('cmdb_templates') or []:
|
|
63
|
+
# A DBRef as loaded, or a template document once assigned/read
|
|
64
|
+
template_id = getattr(ref, 'pk', None) or getattr(ref, 'id', None)
|
|
65
|
+
if template_id is None:
|
|
66
|
+
return host.cmdb_templates or []
|
|
67
|
+
template_ids.append(template_id)
|
|
68
|
+
missing = [tid for tid in template_ids if tid not in cache]
|
|
69
|
+
if missing:
|
|
70
|
+
# pylint: disable-next=import-outside-toplevel,cyclic-import
|
|
71
|
+
from application.models.host import Host
|
|
72
|
+
for template in Host.objects(pk__in=missing):
|
|
73
|
+
cache[template.pk] = template
|
|
74
|
+
for template_id in missing:
|
|
75
|
+
# A deleted template: nothing to contribute
|
|
76
|
+
cache.setdefault(template_id, None)
|
|
77
|
+
return [cache[tid] for tid in template_ids if cache[tid] is not None]
|
|
78
|
+
|
|
79
|
+
|
|
43
80
|
def merged_attribute_keys():
|
|
44
81
|
"""
|
|
45
82
|
The attribute keys configured as merged in the System Config.
|
|
@@ -99,7 +136,7 @@ def get_template(template_name):
|
|
|
99
136
|
|
|
100
137
|
def assignable_templates(template_names=None):
|
|
101
138
|
"""
|
|
102
|
-
Queryset of the active CMDB templates, optionally narrowed to
|
|
139
|
+
Queryset of the active CMDB templates, ordered by name, optionally narrowed to
|
|
103
140
|
``template_names`` — the allowlist of a template-restricted user
|
|
104
141
|
(``User.template_scope()``). ``None`` means unrestricted.
|
|
105
142
|
|
|
@@ -111,7 +148,7 @@ def assignable_templates(template_names=None):
|
|
|
111
148
|
query = Host.objects(object_type='template', deleted_at__exists=False)
|
|
112
149
|
if template_names is not None:
|
|
113
150
|
query = query.filter(hostname__in=list(template_names))
|
|
114
|
-
return query
|
|
151
|
+
return query.order_by('hostname')
|
|
115
152
|
|
|
116
153
|
|
|
117
154
|
def template_ids_for_names(template_names):
|
|
@@ -222,6 +222,10 @@ class Plugin():
|
|
|
222
222
|
# on first use and then kept for the whole run.
|
|
223
223
|
merged_attributes = None
|
|
224
224
|
|
|
225
|
+
# CMDB templates by id, loaded on first use and then kept for the
|
|
226
|
+
# whole run (see active_templates()).
|
|
227
|
+
template_cache = None
|
|
228
|
+
|
|
225
229
|
|
|
226
230
|
|
|
227
231
|
name = "Undefined"
|
|
@@ -607,7 +611,7 @@ class Plugin():
|
|
|
607
611
|
for a host that carries a template at all — an export run must
|
|
608
612
|
not query the config document per host.
|
|
609
613
|
"""
|
|
610
|
-
templates =
|
|
614
|
+
templates = self.host_templates(db_host)
|
|
611
615
|
if not templates:
|
|
612
616
|
return
|
|
613
617
|
if self.merged_attributes is None:
|
|
@@ -632,6 +636,15 @@ class Plugin():
|
|
|
632
636
|
value = merge_attribute_values(attributes[key], value)
|
|
633
637
|
attributes[key] = value
|
|
634
638
|
|
|
639
|
+
def host_templates(self, db_host):
|
|
640
|
+
"""
|
|
641
|
+
The active CMDB templates of the host, each template loaded once
|
|
642
|
+
per plugin instance instead of once per host.
|
|
643
|
+
"""
|
|
644
|
+
if self.template_cache is None:
|
|
645
|
+
self.template_cache = {}
|
|
646
|
+
return active_templates(db_host, self.template_cache)
|
|
647
|
+
|
|
635
648
|
@staticmethod
|
|
636
649
|
def flush_host_cache(db_host):
|
|
637
650
|
"""
|
|
@@ -664,6 +677,21 @@ class Plugin():
|
|
|
664
677
|
setattr(db_host, '_cache_dirty', True)
|
|
665
678
|
|
|
666
679
|
def get_attributes(self, db_host, cache, persist_cache=True):
|
|
680
|
+
"""
|
|
681
|
+
Retrieve and process host attributes with caching support, see
|
|
682
|
+
_compute_attributes().
|
|
683
|
+
|
|
684
|
+
The custom attribute, rewrite and filter engines and the attribute
|
|
685
|
+
set itself each write a cache slot. They are collected and the host
|
|
686
|
+
is saved once — unless ``persist_cache=False``, then the caller
|
|
687
|
+
flushes them itself (see flush_host_cache()).
|
|
688
|
+
"""
|
|
689
|
+
attributes = self._compute_attributes(db_host, cache)
|
|
690
|
+
if persist_cache:
|
|
691
|
+
self.flush_host_cache(db_host)
|
|
692
|
+
return attributes
|
|
693
|
+
|
|
694
|
+
def _compute_attributes(self, db_host, cache):
|
|
667
695
|
"""
|
|
668
696
|
Retrieve and process host attributes with caching support.
|
|
669
697
|
|
|
@@ -694,7 +722,7 @@ class Plugin():
|
|
|
694
722
|
# earlier run left in it goes, or it would be served again
|
|
695
723
|
# the day the timestamp leaves the rules.
|
|
696
724
|
if db_host.cache.pop(cache, None) is not None:
|
|
697
|
-
self._persist_cache(db_host,
|
|
725
|
+
self._persist_cache(db_host, False)
|
|
698
726
|
cache = False
|
|
699
727
|
else:
|
|
700
728
|
db_host.cache.setdefault(cache, {})
|
|
@@ -730,7 +758,7 @@ class Plugin():
|
|
|
730
758
|
self.custom_attributes.get_outcomes(
|
|
731
759
|
db_host,
|
|
732
760
|
attributes,
|
|
733
|
-
persist_cache=
|
|
761
|
+
persist_cache=False,
|
|
734
762
|
)
|
|
735
763
|
)
|
|
736
764
|
|
|
@@ -739,7 +767,7 @@ class Plugin():
|
|
|
739
767
|
for rewrite, value in self.rewrite.get_outcomes(
|
|
740
768
|
db_host,
|
|
741
769
|
attributes,
|
|
742
|
-
persist_cache=
|
|
770
|
+
persist_cache=False,
|
|
743
771
|
).items():
|
|
744
772
|
realname = rewrite[4:]
|
|
745
773
|
if rewrite.startswith('add_'):
|
|
@@ -760,17 +788,17 @@ class Plugin():
|
|
|
760
788
|
attributes_filtered = self.filter.get_outcomes(
|
|
761
789
|
db_host,
|
|
762
790
|
attributes,
|
|
763
|
-
persist_cache=
|
|
791
|
+
persist_cache=False,
|
|
764
792
|
)
|
|
765
793
|
data['filtered'] = attributes_filtered
|
|
766
794
|
if attributes_filtered.get('ignore_host') and cache:
|
|
767
795
|
db_host.cache[cache]['attributes'] = data
|
|
768
|
-
self._persist_cache(db_host,
|
|
796
|
+
self._persist_cache(db_host, False)
|
|
769
797
|
return False
|
|
770
798
|
|
|
771
799
|
if cache:
|
|
772
800
|
db_host.cache[cache]['attributes'] = data
|
|
773
|
-
self._persist_cache(db_host,
|
|
801
|
+
self._persist_cache(db_host, False)
|
|
774
802
|
return data
|
|
775
803
|
|
|
776
804
|
def _attributes_depend_on_time(self):
|
|
@@ -396,14 +396,16 @@ class Rule():
|
|
|
396
396
|
conditions = rule['conditions']
|
|
397
397
|
|
|
398
398
|
no_match_reason = None
|
|
399
|
-
|
|
399
|
+
# Every condition that made the rule hit: the one that matched
|
|
400
|
+
# for 'any' rules, all of them for 'all' rules.
|
|
401
|
+
match_reasons = []
|
|
400
402
|
if condition_typ == 'any':
|
|
401
403
|
for condition in conditions:
|
|
402
404
|
if self.handle_match(condition, hostname):
|
|
403
405
|
rule_hit = True
|
|
404
406
|
no_match_reason = None
|
|
405
407
|
if self.debug:
|
|
406
|
-
|
|
408
|
+
match_reasons = [dict(condition)]
|
|
407
409
|
break # We have a hit, no need to check more
|
|
408
410
|
if self.debug:
|
|
409
411
|
no_match_reason = dict(condition)
|
|
@@ -416,10 +418,10 @@ class Rule():
|
|
|
416
418
|
if self.debug:
|
|
417
419
|
no_match_reason = dict(condition)
|
|
418
420
|
break # One was no hit, no need for loop
|
|
419
|
-
if self.debug and rule_hit
|
|
420
|
-
#
|
|
421
|
-
#
|
|
422
|
-
|
|
421
|
+
if self.debug and rule_hit:
|
|
422
|
+
# The rule only hits because every condition matched,
|
|
423
|
+
# so all of them are the reason, not just one.
|
|
424
|
+
match_reasons = [dict(c) for c in conditions]
|
|
423
425
|
|
|
424
426
|
elif condition_typ == 'anyway':
|
|
425
427
|
rule_hit = True
|
|
@@ -430,18 +432,20 @@ class Rule():
|
|
|
430
432
|
"group": self.name,
|
|
431
433
|
"hit": rule_hit,
|
|
432
434
|
'no_match_reason': no_match_reason,
|
|
433
|
-
'
|
|
435
|
+
'match_reasons': match_reasons,
|
|
434
436
|
"condition_type": _RULE_DESCRIPTIONS[condition_typ],
|
|
435
437
|
"name": rule['name'],
|
|
436
438
|
"id": str(rule['_id']),
|
|
437
439
|
"last_match": str(rule['last_match']),
|
|
438
440
|
}
|
|
439
441
|
self.debug_lines.append(debug_data)
|
|
440
|
-
# Show WHY the rule hit or missed:
|
|
441
|
-
#
|
|
442
|
-
#
|
|
442
|
+
# Show WHY the rule hit or missed: on a hit every condition
|
|
443
|
+
# that matched (all of them for 'all' rules, the matching one
|
|
444
|
+
# for 'any' rules), on a miss the first failing condition of
|
|
445
|
+
# an 'all' rule or the last checked one of an 'any' rule.
|
|
443
446
|
if rule_hit:
|
|
444
|
-
deciding =
|
|
447
|
+
deciding = " AND ".join(
|
|
448
|
+
format_condition(c) for c in match_reasons)
|
|
445
449
|
if deciding:
|
|
446
450
|
deciding = f"matched: {deciding}"
|
|
447
451
|
else:
|
|
@@ -288,6 +288,31 @@ def _dict_match_expr(field_name, regex_str, target):
|
|
|
288
288
|
}}
|
|
289
289
|
|
|
290
290
|
|
|
291
|
+
def value_regex_query(path, regex_str):
|
|
292
|
+
"""
|
|
293
|
+
Case-insensitive regex match on one label/inventory value, numbers
|
|
294
|
+
included. `$regex` alone only ever matches strings, so `vlan:5`
|
|
295
|
+
missed a label stored as the integer 5. The `$expr` branch matches
|
|
296
|
+
the value converted to a string (numbers, booleans); a missing,
|
|
297
|
+
null or non-convertible value converts to null and never matches.
|
|
298
|
+
The plain `$regex` branch stays for list values, whose elements
|
|
299
|
+
`$regex` matches one by one.
|
|
300
|
+
"""
|
|
301
|
+
return {'$or': [
|
|
302
|
+
{path: {'$regex': regex_str, '$options': 'i'}},
|
|
303
|
+
{'$expr': {'$regexMatch': {
|
|
304
|
+
'input': {'$convert': {
|
|
305
|
+
'input': f'${path}',
|
|
306
|
+
'to': 'string',
|
|
307
|
+
'onError': None,
|
|
308
|
+
'onNull': None,
|
|
309
|
+
}},
|
|
310
|
+
'regex': regex_str,
|
|
311
|
+
'options': 'i',
|
|
312
|
+
}}},
|
|
313
|
+
]}
|
|
314
|
+
|
|
315
|
+
|
|
291
316
|
_DATE_TERM_RE = re.compile(r'^(?P<operator>>=|<=|>|<)?\s*(?P<date>\S+)$')
|
|
292
317
|
_ISO_DATE_RE = re.compile(r'^(?P<year>\d{4})-(?P<month>\d{1,2})-(?P<day>\d{1,2})$')
|
|
293
318
|
|
|
@@ -423,11 +448,11 @@ def _leaf_to_mongo(field, value, mode, tzinfo):
|
|
|
423
448
|
return {'hostname': {'$regex': regex_str, '$options': 'i'}}
|
|
424
449
|
|
|
425
450
|
if field.startswith('labels.') or field.startswith('inventory.'):
|
|
426
|
-
return
|
|
451
|
+
return value_regex_query(field, regex_str)
|
|
427
452
|
|
|
428
453
|
return {'$or': [
|
|
429
|
-
|
|
430
|
-
|
|
454
|
+
value_regex_query(f'labels.{field}', regex_str),
|
|
455
|
+
value_regex_query(f'inventory.{field}', regex_str),
|
|
431
456
|
]}
|
|
432
457
|
|
|
433
458
|
|
|
@@ -72,6 +72,7 @@ def load_rules(project=None):
|
|
|
72
72
|
AnsibleRewriteAttributesRule.objects(**rule_filter).order_by('sort_field')
|
|
73
73
|
|
|
74
74
|
ansible_rules = AnsibleVariableRule()
|
|
75
|
+
ansible_rules.cache_name = f'ansible_variables{project_suffix}'
|
|
75
76
|
ansible_rules.rules = \
|
|
76
77
|
AnsibleCustomVariablesRule.objects(**rule_filter).order_by('sort_field')
|
|
77
78
|
|
|
@@ -79,6 +80,7 @@ def load_rules(project=None):
|
|
|
79
80
|
'filter': attribute_filter,
|
|
80
81
|
'rewrite': attribute_rewrite,
|
|
81
82
|
'actions': ansible_rules,
|
|
83
|
+
'cache_key': f'ansible{project_suffix}',
|
|
82
84
|
}
|
|
83
85
|
#.
|
|
84
86
|
# .-- Debug Host — shared backend for CLI + HTML debug page
|
|
@@ -112,7 +114,7 @@ def get_ansible_debug_data(hostname, project_name=None):
|
|
|
112
114
|
if not db_host:
|
|
113
115
|
return None, None, None
|
|
114
116
|
|
|
115
|
-
attributes = syncer.get_attributes(db_host, '
|
|
117
|
+
attributes = syncer.get_attributes(db_host, rules['cache_key'])
|
|
116
118
|
extra_attributes = {}
|
|
117
119
|
if attributes:
|
|
118
120
|
hidden_fields = ('ansible_password', 'ansible_ssh_pass')
|
|
@@ -148,7 +150,7 @@ def debug_ansible_rules(hostname, project_name, debug): # pylint: disable=unuse
|
|
|
148
150
|
if not db_host:
|
|
149
151
|
return
|
|
150
152
|
|
|
151
|
-
attributes = syncer.get_attributes(db_host, '
|
|
153
|
+
attributes = syncer.get_attributes(db_host, rules['cache_key'])
|
|
152
154
|
|
|
153
155
|
if not attributes:
|
|
154
156
|
print(f"{ColorCodes.FAIL}THIS HOST IS IGNORED BY RULE{ColorCodes.ENDC}")
|
|
@@ -168,6 +170,24 @@ def debug_ansible_rules(hostname, project_name, debug): # pylint: disable=unuse
|
|
|
168
170
|
#.
|
|
169
171
|
# .-- Ansible Cache
|
|
170
172
|
|
|
173
|
+
def clear_ansible_cache():
|
|
174
|
+
"""
|
|
175
|
+
Drop every Ansible cache slot of every host: the attribute set, the
|
|
176
|
+
filter, rewrite and variable outcomes of all projects, and the custom
|
|
177
|
+
attributes they are computed from.
|
|
178
|
+
"""
|
|
179
|
+
slot_names = Host.objects.aggregate([
|
|
180
|
+
{'$project': {'slot': {'$objectToArray': '$cache'}}},
|
|
181
|
+
{'$unwind': '$slot'},
|
|
182
|
+
{'$group': {'_id': '$slot.k'}},
|
|
183
|
+
])
|
|
184
|
+
slots = [entry['_id'] for entry in slot_names
|
|
185
|
+
if entry['_id'].lower().startswith('ansible')
|
|
186
|
+
or entry['_id'] == 'CustomAttributeRule']
|
|
187
|
+
if slots:
|
|
188
|
+
Host.objects(cache__ne={}).update(
|
|
189
|
+
**{f'unset__cache__{slot}': 1 for slot in slots})
|
|
190
|
+
|
|
171
191
|
def _inner_update_cache(account=False):
|
|
172
192
|
"""
|
|
173
193
|
Update Cache of Ansible
|
|
@@ -175,14 +195,10 @@ def _inner_update_cache(account=False):
|
|
|
175
195
|
# pylint: disable=unused-argument
|
|
176
196
|
# Account Variable needed because of cronjobs
|
|
177
197
|
print(f"{ColorCodes.OKGREEN}Delete current Cache{ColorCodes.ENDC}")
|
|
178
|
-
|
|
198
|
+
clear_ansible_cache()
|
|
179
199
|
print(f"{ColorCodes.OKGREEN}Build new Cache{ColorCodes.ENDC}")
|
|
180
|
-
|
|
181
|
-
syncer = AnsibleInventory()
|
|
200
|
+
syncer = _build_ansible_provider()
|
|
182
201
|
syncer.name = "Rebuild Ansible Cache"
|
|
183
|
-
syncer.filter = rules['filter']
|
|
184
|
-
syncer.rewrite = rules['rewrite']
|
|
185
|
-
syncer.actions = rules['actions']
|
|
186
202
|
# Do the action which triggers the caches
|
|
187
203
|
syncer.get_full_inventory(show_status=True)
|
|
188
204
|
|
|
@@ -320,6 +336,7 @@ def _build_ansible_provider(project=None):
|
|
|
320
336
|
syncer.filter = rules['filter']
|
|
321
337
|
syncer.rewrite = rules['rewrite']
|
|
322
338
|
syncer.actions = rules['actions']
|
|
339
|
+
syncer.cache_key = rules['cache_key']
|
|
323
340
|
return syncer
|
|
324
341
|
|
|
325
342
|
|