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.
Files changed (506) hide show
  1. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/PKG-INFO +1 -1
  2. cmdbsyncer-4.4.2/application/buildinfo.txt +1 -0
  3. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/changelog/v4.3.md +1 -0
  4. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/changelog/v4.4.md +39 -0
  5. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/get_account.py +13 -8
  6. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/account.py +16 -9
  7. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/host.py +8 -4
  8. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/host_templates.py +41 -4
  9. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/plugin.py +35 -7
  10. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/rule/rule.py +15 -11
  11. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/search_parser.py +28 -3
  12. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/ansible/__init__.py +25 -8
  13. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/ansible/inventory.py +29 -65
  14. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/ansible/runner.py +14 -4
  15. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/ansible/tests/test_runner_ssh_env.py +37 -1
  16. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/cmk2.py +8 -1
  17. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/cmk_rules.py +108 -40
  18. cmdbsyncer-4.4.2/application/plugins/checkmk/data/ruleset_examples.json +31 -0
  19. cmdbsyncer-4.4.2/application/plugins/checkmk/data/rulesets_2.4.json +11717 -0
  20. cmdbsyncer-4.4.2/application/plugins/checkmk/data/rulesets_2.5.json +10961 -0
  21. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/dcd.py +5 -1
  22. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/models.py +10 -5
  23. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/rules.py +12 -6
  24. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/sitepool.py +18 -0
  25. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/syncer.py +5 -3
  26. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_cmk_rules.py +152 -1
  27. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_dcd.py +8 -0
  28. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_rules.py +56 -0
  29. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_sitepool.py +75 -0
  30. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_syncer.py +4 -3
  31. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_users.py +18 -0
  32. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/users.py +12 -2
  33. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/views.py +1 -1
  34. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/cron.py +33 -3
  35. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/dataflow.py +2 -1
  36. cmdbsyncer-4.4.2/application/plugins/netbox/tests/test_same_host_url.py +29 -0
  37. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/utils.py +13 -0
  38. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/rest/rest.py +1 -2
  39. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/static/css/cmdbsyncer.css +16 -0
  40. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/host_list.html +4 -1
  41. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/model/_list_source_preview.html +3 -1
  42. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/debug_host.html +6 -4
  43. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/host.py +8 -10
  44. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/host_filters.py +8 -12
  45. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/host_renderers.py +11 -18
  46. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/cmdbsyncer.egg-info/PKG-INFO +1 -1
  47. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/cmdbsyncer.egg-info/SOURCES.txt +8 -0
  48. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/pyproject.toml +2 -1
  49. cmdbsyncer-4.4.2/tests/test_account_master_cache_smoke.py +50 -0
  50. cmdbsyncer-4.4.2/tests/test_active_templates.py +56 -0
  51. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_ansible_cmk_roles.py +27 -0
  52. cmdbsyncer-4.4.2/tests/test_ansible_inventory.py +65 -0
  53. cmdbsyncer-4.4.2/tests/test_cron_stale_lock_smoke.py +57 -0
  54. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_import_hostnames.py +9 -0
  55. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_plugin.py +21 -4
  56. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_rule.py +120 -0
  57. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_search_parser.py +22 -8
  58. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_security_fixes.py +23 -0
  59. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_web_list_source.py +4 -0
  60. cmdbsyncer-4.4.0/application/buildinfo.txt +0 -1
  61. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/LICENSE +0 -0
  62. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/README.md +0 -0
  63. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/__init__.py +0 -0
  64. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/_version.py +0 -0
  65. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/api/__init__.py +0 -0
  66. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/api/inventory.py +0 -0
  67. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/api/objects.py +0 -0
  68. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/api/rules.py +0 -0
  69. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/api/syncer.py +0 -0
  70. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/api/views.py +0 -0
  71. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/auth/views.py +0 -0
  72. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/changelog/.pages +0 -0
  73. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/changelog/v3.10.md +0 -0
  74. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/changelog/v3.11.md +0 -0
  75. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/changelog/v3.12.md +0 -0
  76. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/changelog/v3.5.md +0 -0
  77. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/changelog/v3.7.md +0 -0
  78. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/changelog/v3.8.md +0 -0
  79. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/changelog/v3.9.md +0 -0
  80. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/changelog/v4.0.md +0 -0
  81. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/changelog/v4.1.md +0 -0
  82. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/changelog/v4.2.md +0 -0
  83. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/cli.py +0 -0
  84. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/config.py +0 -0
  85. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/docu_links.py +0 -0
  86. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/enterprise.py +0 -0
  87. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/__init__.py +0 -0
  88. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/audit.py +0 -0
  89. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/cron.py +0 -0
  90. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/db_analysis.py +0 -0
  91. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/host_maintenance.py +0 -0
  92. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/import_hostnames.py +0 -0
  93. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/inventory.py +0 -0
  94. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/label_hash.py +0 -0
  95. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/label_history.py +0 -0
  96. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/local_config_file.py +0 -0
  97. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/local_config_presets.py +0 -0
  98. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/mongo_keys.py +0 -0
  99. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/notification_channels.py +0 -0
  100. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/notification_dispatch.py +0 -0
  101. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/plugins.py +0 -0
  102. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/retention.py +0 -0
  103. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/sates.py +0 -0
  104. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/sql.py +0 -0
  105. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/stale_indexes.py +0 -0
  106. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/syncer_jinja.py +0 -0
  107. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/tablib_formater.py +0 -0
  108. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/tests/__init__.py +0 -0
  109. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/tests/test_sql.py +0 -0
  110. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/helpers/timezone.py +0 -0
  111. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/mcp_server.py +0 -0
  112. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/__init__.py +0 -0
  113. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/config.py +0 -0
  114. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/cron.py +0 -0
  115. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/field_approval.py +0 -0
  116. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/forms.py +0 -0
  117. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/host_cleanup.py +0 -0
  118. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/host_create_time.py +0 -0
  119. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/host_inventory_tree.py +0 -0
  120. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/host_label_event.py +0 -0
  121. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/host_labels.py +0 -0
  122. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/notification_channel.py +0 -0
  123. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/notification_rule.py +0 -0
  124. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/notification_state.py +0 -0
  125. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/project.py +0 -0
  126. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/saved_search.py +0 -0
  127. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/states.py +0 -0
  128. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/models/user.py +0 -0
  129. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/module_registry.py +0 -0
  130. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/__init__.py +0 -0
  131. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/custom_attributes/models.py +0 -0
  132. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/custom_attributes/rules.py +0 -0
  133. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/custom_attributes/views.py +0 -0
  134. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/debug.py +0 -0
  135. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/email.py +0 -0
  136. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/inventory/__init__.py +0 -0
  137. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/log/command_output.py +0 -0
  138. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/log/log.py +0 -0
  139. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/log/models.py +0 -0
  140. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/log/views.py +0 -0
  141. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/rule/__init__.py +0 -0
  142. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/rule/filter.py +0 -0
  143. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/rule/list_source.py +0 -0
  144. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/rule/list_source_views.py +0 -0
  145. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/rule/match.py +0 -0
  146. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/rule/models.py +0 -0
  147. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/rule/rewrite.py +0 -0
  148. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/rule/views.py +0 -0
  149. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/modules/statefile.py +0 -0
  150. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/notices/strict_certificate_verification.txt +0 -0
  151. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/__init__.py +0 -0
  152. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/ansible/admin_views.py +0 -0
  153. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/ansible/models.py +0 -0
  154. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/ansible/playbook_rules.py +0 -0
  155. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/ansible/plugin.json +0 -0
  156. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/ansible/rules.py +0 -0
  157. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/ansible/seed.py +0 -0
  158. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/ansible/site_syncer.py +0 -0
  159. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/ansible/tests/__init__.py +0 -0
  160. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/ansible/views.py +0 -0
  161. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/bmc_remedy/__init__.py +0 -0
  162. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/bmc_remedy/bmc_remedy.py +0 -0
  163. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/bmc_remedy/plugin.json +0 -0
  164. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/__init__.py +0 -0
  165. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/admin_views.py +0 -0
  166. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/bi.py +0 -0
  167. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/data_quality.py +0 -0
  168. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/downtimes.py +0 -0
  169. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/folder_attributes.py +0 -0
  170. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/groups.py +0 -0
  171. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/helpers.py +0 -0
  172. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/import_v1.py +0 -0
  173. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/import_v2.py +0 -0
  174. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/inits.py +0 -0
  175. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/inventorize.py +0 -0
  176. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/list_source.py +0 -0
  177. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/notification_rules.py +0 -0
  178. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/passwords.py +0 -0
  179. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/plugin.json +0 -0
  180. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/poolfolder.py +0 -0
  181. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/rule_analysis_runner.py +0 -0
  182. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/rule_passwords.py +0 -0
  183. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/rulesets_catalog.py +0 -0
  184. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/sites.py +0 -0
  185. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tags.py +0 -0
  186. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/__init__.py +0 -0
  187. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_assign_template.py +0 -0
  188. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_bi.py +0 -0
  189. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_cmk2.py +0 -0
  190. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_cmk_conditions.py +0 -0
  191. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_data_quality.py +0 -0
  192. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_downtimes.py +0 -0
  193. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_groups.py +0 -0
  194. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_helpers.py +0 -0
  195. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_import_v1.py +0 -0
  196. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_import_v2.py +0 -0
  197. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_inventorize.py +0 -0
  198. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_list_source.py +0 -0
  199. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_notification_rules.py +0 -0
  200. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_passwords.py +0 -0
  201. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_poolfolder.py +0 -0
  202. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_rule_analysis_runner.py +0 -0
  203. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_rule_passwords.py +0 -0
  204. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_sites.py +0 -0
  205. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_tags.py +0 -0
  206. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/tests/test_user_generation.py +0 -0
  207. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/user_generation.py +0 -0
  208. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/checkmk/user_models.py +0 -0
  209. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/cisco_dna/__init__.py +0 -0
  210. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/cisco_dna/plugin.json +0 -0
  211. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/cisco_dna/syncer.py +0 -0
  212. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/csv/__init__.py +0 -0
  213. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/csv/csv.py +0 -0
  214. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/csv/plugin.json +0 -0
  215. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/eda/__init__.py +0 -0
  216. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/eda/admin_views.py +0 -0
  217. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/eda/models.py +0 -0
  218. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/eda/plugin.json +0 -0
  219. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/eda/repeats.py +0 -0
  220. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/eda/rules.py +0 -0
  221. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/eda/sender.py +0 -0
  222. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/eda/tests/__init__.py +0 -0
  223. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/eda/tests/test_eda.py +0 -0
  224. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/eda/tests/test_repeats.py +0 -0
  225. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/eda/views.py +0 -0
  226. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/file_requests.py +0 -0
  227. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/idoit/__init__.py +0 -0
  228. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/idoit/admin_views.py +0 -0
  229. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/idoit/models.py +0 -0
  230. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/idoit/plugin.json +0 -0
  231. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/idoit/rules.py +0 -0
  232. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/idoit/syncer.py +0 -0
  233. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/idoit/views.py +0 -0
  234. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jdisc/__init__.py +0 -0
  235. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jdisc/applications.py +0 -0
  236. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jdisc/devices.py +0 -0
  237. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jdisc/executables.py +0 -0
  238. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jdisc/jdisc.py +0 -0
  239. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jdisc/plugin.json +0 -0
  240. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jira/__init__.py +0 -0
  241. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jira/jira.py +0 -0
  242. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jira/plugin.json +0 -0
  243. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jira_cloud/__init__.py +0 -0
  244. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jira_cloud/admin_views.py +0 -0
  245. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jira_cloud/export.py +0 -0
  246. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jira_cloud/jira_cloud.py +0 -0
  247. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jira_cloud/models.py +0 -0
  248. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jira_cloud/plugin.json +0 -0
  249. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jira_cloud/rules.py +0 -0
  250. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jira_cloud/schema_sync.py +0 -0
  251. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jira_cloud/tests/__init__.py +0 -0
  252. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jira_cloud/tests/test_attribute_value.py +0 -0
  253. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/jira_cloud/views.py +0 -0
  254. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/json/__init__.py +0 -0
  255. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/json/json.py +0 -0
  256. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/json/plugin.json +0 -0
  257. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/ldap/__init__.py +0 -0
  258. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/ldap/admin_views.py +0 -0
  259. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/ldap/ldap.py +0 -0
  260. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/ldap/plugin.json +0 -0
  261. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/ldap/views.py +0 -0
  262. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/maintenance/__init__.py +0 -0
  263. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/maintenance/db_commands.py +0 -0
  264. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/maintenance/plugin.json +0 -0
  265. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/maintenance/tests/__init__.py +0 -0
  266. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/maintenance/tests/test_delete_all_hosts.py +0 -0
  267. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/maintenance/tests/test_delete_inventory.py +0 -0
  268. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/mssql/__init__.py +0 -0
  269. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/mssql/plugin.json +0 -0
  270. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/mysql/__init__.py +0 -0
  271. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/mysql/mysql.py +0 -0
  272. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/mysql/plugin.json +0 -0
  273. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/__init__.py +0 -0
  274. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/admin_views.py +0 -0
  275. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/cluster.py +0 -0
  276. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/contacts.py +0 -0
  277. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/devices.py +0 -0
  278. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/interfaces.py +0 -0
  279. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/ips.py +0 -0
  280. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/models.py +0 -0
  281. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/netbox.py +0 -0
  282. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/networks.py +0 -0
  283. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/plugin.json +0 -0
  284. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/prefixes.py +0 -0
  285. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/rules.py +0 -0
  286. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/tests/__init__.py +0 -0
  287. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/tests/test_import_filter.py +0 -0
  288. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/views.py +0 -0
  289. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/netbox/virtualmachines.py +0 -0
  290. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/prtg/__init__.py +0 -0
  291. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/prtg/plugin.json +0 -0
  292. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/prtg/prtg.py +0 -0
  293. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/pyodbc/__init__.py +0 -0
  294. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/pyodbc/plugin.json +0 -0
  295. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/pyodbc/pyodbc.py +0 -0
  296. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/rest/__init__.py +0 -0
  297. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/rest/plugin.json +0 -0
  298. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/rules/__init__.py +0 -0
  299. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/rules/admin_views.py +0 -0
  300. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/rules/autorules.py +0 -0
  301. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/rules/models.py +0 -0
  302. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/rules/plugin.json +0 -0
  303. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/rules/rule_definitions.py +0 -0
  304. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/rules/rule_import_export.py +0 -0
  305. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/rules/views.py +0 -0
  306. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/servicenow/__init__.py +0 -0
  307. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/servicenow/admin_views.py +0 -0
  308. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/servicenow/plugin.json +0 -0
  309. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/servicenow/syncer.py +0 -0
  310. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/servicenow/tests/__init__.py +0 -0
  311. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/servicenow/tests/test_table_request.py +0 -0
  312. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/servicenow/views.py +0 -0
  313. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/syncer_shell.py +0 -0
  314. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/vmware/__init__.py +0 -0
  315. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/vmware/admin_views.py +0 -0
  316. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/vmware/custom_attributes.py +0 -0
  317. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/vmware/models.py +0 -0
  318. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/vmware/plugin.json +0 -0
  319. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/vmware/rules.py +0 -0
  320. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/vmware/views.py +0 -0
  321. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/vmware/vmware.py +0 -0
  322. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/yml/__init__.py +0 -0
  323. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/yml/plugin.json +0 -0
  324. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins/yml/yml.py +0 -0
  325. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/plugins_cli.py +0 -0
  326. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/static/cmdbsyncer_mark.png +0 -0
  327. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/static/favicon.png +0 -0
  328. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/static/js/Sortable.min.js +0 -0
  329. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/static/js/main.js +0 -0
  330. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/static/logo_white.png +0 -0
  331. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/static/vendor/README.md +0 -0
  332. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/static/vendor/ansible.svg +0 -0
  333. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/static/vendor/checkmk.svg +0 -0
  334. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/static/vendor/idoit.svg +0 -0
  335. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/static/vendor/jira.svg +0 -0
  336. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/static/vendor/netbox.svg +0 -0
  337. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/static/vendor/vmware.svg +0 -0
  338. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/_brand.html +0 -0
  339. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/_theme.html +0 -0
  340. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/_timezone.html +0 -0
  341. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/_host_tabs.html +0 -0
  342. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/account_create.html +0 -0
  343. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/account_edit.html +0 -0
  344. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/account_field_help.html +0 -0
  345. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/account_pick_type.html +0 -0
  346. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/ansible_playbook_run.html +0 -0
  347. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/ansible_project_detail.html +0 -0
  348. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/ansible_rule_list.html +0 -0
  349. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/ansible_run_details.html +0 -0
  350. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/assign_project_form.html +0 -0
  351. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/bulk_label_form.html +0 -0
  352. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/changelog_archive.html +0 -0
  353. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/checkmk_data_quality.html +0 -0
  354. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/checkmk_list_rule_debug.html +0 -0
  355. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/checkmk_rule_mngmt_list.html +0 -0
  356. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/checkmk_rule_optimization.html +0 -0
  357. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/checkmk_settings_list.html +0 -0
  358. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/checkmk_test_folder_scope.html +0 -0
  359. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/checkmk_user_generation_preview.html +0 -0
  360. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/checkmk_user_generation_rule_list.html +0 -0
  361. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/copy_as_new_form.html +0 -0
  362. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/data_quality.html +0 -0
  363. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/data_quality_lowercase_preview.html +0 -0
  364. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/file/list.html +0 -0
  365. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/file/modals/form.html +0 -0
  366. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/first_steps.html +0 -0
  367. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/host_csv_import_preview.html +0 -0
  368. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/host_details.html +0 -0
  369. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/host_edit.html +0 -0
  370. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/host_inventory_tree.html +0 -0
  371. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/host_relations_graph.html +0 -0
  372. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/host_timeline.html +0 -0
  373. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/index.html +0 -0
  374. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/ldap_search.html +0 -0
  375. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/local_config_editor.html +0 -0
  376. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/master.html +0 -0
  377. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/model/_action_picker.html +0 -0
  378. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/model/_folder_builder.html +0 -0
  379. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/model/_notification_plugin_picker.html +0 -0
  380. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/model/_ruleset_autocomplete.html +0 -0
  381. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/model/checkmk_notification_rule_create.html +0 -0
  382. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/model/checkmk_notification_rule_edit.html +0 -0
  383. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/model/checkmk_rule_create.html +0 -0
  384. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/model/checkmk_rule_edit.html +0 -0
  385. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/model/checkmk_rule_mngmt_create.html +0 -0
  386. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/model/checkmk_rule_mngmt_edit.html +0 -0
  387. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/model/clone_confirm.html +0 -0
  388. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/model/inline_list_base.html +0 -0
  389. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/model/list_source_create.html +0 -0
  390. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/model/list_source_edit.html +0 -0
  391. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/module_overview.html +0 -0
  392. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/object_list.html +0 -0
  393. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/project_edit.html +0 -0
  394. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/project_import.html +0 -0
  395. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/project_import_cmk.html +0 -0
  396. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/project_list.html +0 -0
  397. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/project_overview.html +0 -0
  398. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/servicenow_query.html +0 -0
  399. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/set_account_form.html +0 -0
  400. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/set_cmk_version_form.html +0 -0
  401. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/admin/set_template_form.html +0 -0
  402. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/api_tokens.html +0 -0
  403. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/base.html +0 -0
  404. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/change_password.html +0 -0
  405. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/csrf_error.html +0 -0
  406. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/debug.html +0 -0
  407. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/email/newuser.html +0 -0
  408. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/email/notification.html +0 -0
  409. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/email/resetpassword.html +0 -0
  410. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/formular.html +0 -0
  411. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/license_info.html +0 -0
  412. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/login.html +0 -0
  413. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/logout_confirm.html +0 -0
  414. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/request_password.html +0 -0
  415. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/set_2fa.html +0 -0
  416. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/templates/set_theme.html +0 -0
  417. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/themes/dracula.css +0 -0
  418. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/themes/gruvbox-dark.css +0 -0
  419. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/themes/gruvbox-light.css +0 -0
  420. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/themes/nord.css +0 -0
  421. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/themes_registry.py +0 -0
  422. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/_form_fields.py +0 -0
  423. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/_form_sections.py +0 -0
  424. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/account.py +0 -0
  425. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/account_select.py +0 -0
  426. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/config.py +0 -0
  427. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/cron.py +0 -0
  428. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/data_quality.py +0 -0
  429. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/default.py +0 -0
  430. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/field_approval.py +0 -0
  431. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/fileadmin.py +0 -0
  432. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/first_steps.py +0 -0
  433. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/host_inventory_grid.py +0 -0
  434. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/host_widgets.py +0 -0
  435. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/license.py +0 -0
  436. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/menu_links.py +0 -0
  437. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/module_overview.py +0 -0
  438. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/notification_channel.py +0 -0
  439. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/notification_rule.py +0 -0
  440. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/project.py +0 -0
  441. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/saved_search.py +0 -0
  442. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/template_select.py +0 -0
  443. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/application/views/user.py +0 -0
  444. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/cmdbsyncer.egg-info/dependency_links.txt +0 -0
  445. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/cmdbsyncer.egg-info/entry_points.txt +0 -0
  446. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/cmdbsyncer.egg-info/requires.txt +0 -0
  447. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/cmdbsyncer.egg-info/top_level.txt +0 -0
  448. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/requirements-ansible-windows.txt +0 -0
  449. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/requirements-ansible.txt +0 -0
  450. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/requirements-extras.txt +0 -0
  451. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/requirements.txt +0 -0
  452. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/setup.cfg +0 -0
  453. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/syncerapi/__init__.py +0 -0
  454. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/syncerapi/v1/__init__.py +0 -0
  455. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/syncerapi/v1/core/__init__.py +0 -0
  456. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/syncerapi/v1/inventory/__init__.py +0 -0
  457. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/syncerapi/v1/rest/__init__.py +0 -0
  458. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_account_macro.py +0 -0
  459. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_api.py +0 -0
  460. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_api_csrf_invariant.py +0 -0
  461. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_config_dir.py +0 -0
  462. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_cron_missing_account.py +0 -0
  463. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_csrf_config.py +0 -0
  464. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_data_quality_duplicates.py +0 -0
  465. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_default_view.py +0 -0
  466. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_disabled_row_style.py +0 -0
  467. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_eda_web_smoke.py +0 -0
  468. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_enterprise_quiet.py +0 -0
  469. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_folder_builder_js.py +0 -0
  470. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_global_account_presets.py +0 -0
  471. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_host_cleanup.py +0 -0
  472. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_host_create_time.py +0 -0
  473. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_host_label_edit.py +0 -0
  474. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_host_roundtrip_smoke.py +0 -0
  475. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_host_template_filter.py +0 -0
  476. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_host_template_resync.py +0 -0
  477. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_jinja_get_list.py +0 -0
  478. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_jinja_hash.py +0 -0
  479. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_label_history.py +0 -0
  480. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_ldap_search_filter.py +0 -0
  481. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_local_config_presets.py +0 -0
  482. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_logging_config.py +0 -0
  483. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_model_indexes.py +0 -0
  484. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_mongo_keys.py +0 -0
  485. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_plugin_ssti.py +0 -0
  486. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_plugins_cli.py +0 -0
  487. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_regex_condition_limits.py +0 -0
  488. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_rule_export_templates.py +0 -0
  489. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_rule_filename_detect.py +0 -0
  490. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_rule_import_override.py +0 -0
  491. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_rule_list_rows.py +0 -0
  492. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_rule_list_source.py +0 -0
  493. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_rule_match.py +0 -0
  494. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_rule_registry_complete.py +0 -0
  495. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_stale_indexes.py +0 -0
  496. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_template_merge_fields.py +0 -0
  497. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_timezone.py +0 -0
  498. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_user_scope_smoke.py +0 -0
  499. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_view_permission_flags.py +0 -0
  500. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_web_account_password_chars.py +0 -0
  501. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_web_account_password_deferred_save.py +0 -0
  502. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_web_ansible_account_inventory.py +0 -0
  503. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_web_boot_smoke.py +0 -0
  504. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_web_debug_pages.py +0 -0
  505. {cmdbsyncer-4.4.0 → cmdbsyncer-4.4.2}/tests/test_web_requests_smoke.py +0 -0
  506. {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.0
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}``. Sync runs read
71
- # the same handful of accounts for every host/rule, so caching keeps Mongo
72
- # and the secrets-manager hook off the hot path. Invalidated on Account
73
- # save/delete via mongoengine signals so the web app picks up edits
74
- # without a process restart.
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
- cached = _account_cache.get(cache_key)
181
- if cached is None:
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 the lifetime of the process. Unknown or malformed ids
277
- (legacy data) count as "not master".
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
- if account_id not in _IS_MASTER_CACHE:
280
- try:
281
- account = Account.objects(id=account_id).only('is_master').first()
282
- except (ValidationError, InvalidId):
283
- account = None
284
- _IS_MASTER_CACHE[account_id] = bool(account and account.is_master)
285
- return _IS_MASTER_CACHE[account_id]
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
- return [tmpl for tmpl in (host.cmdb_templates or [])
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 = active_templates(db_host)
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, persist_cache)
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=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=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=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, persist_cache)
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, persist_cache)
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
- match_reason = None
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
- match_reason = dict(condition)
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 and conditions:
420
- # All conditions matched — surface the last one as the
421
- # representative match (mirrors no_match_reason shape).
422
- match_reason = dict(conditions[-1])
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
- 'match_reason': match_reason,
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: for 'all' rules the first
441
- # failing condition, for 'any' rules the matching one (on a
442
- # miss, the last condition checked — all of them failed).
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 = format_condition(match_reason)
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 {field: {'$regex': regex_str, '$options': 'i'}}
451
+ return value_regex_query(field, regex_str)
427
452
 
428
453
  return {'$or': [
429
- {f'labels.{field}': {'$regex': regex_str, '$options': 'i'}},
430
- {f'inventory.{field}': {'$regex': regex_str, '$options': 'i'}},
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, 'ansible')
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, 'ansible')
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
- Host.objects.filter(cache__ansible__exists=True).update(unset__cache__ansible=1)
198
+ clear_ansible_cache()
179
199
  print(f"{ColorCodes.OKGREEN}Build new Cache{ColorCodes.ENDC}")
180
- rules = load_rules()
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