cmdbsyncer 4.4.1__tar.gz → 4.5.0.dev1__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 (562) hide show
  1. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/PKG-INFO +2 -1
  2. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/__init__.py +26 -1
  3. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/api/rules.py +2 -2
  4. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/api/syncer.py +5 -0
  5. cmdbsyncer-4.5.0.dev1/application/buildinfo.txt +1 -0
  6. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/changelog/v4.4.md +6 -1
  7. cmdbsyncer-4.5.0.dev1/application/changelog/v4.5.md +31 -0
  8. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/docu_links.py +5 -0
  9. cmdbsyncer-4.5.0.dev1/application/helpers/host_import_file.py +229 -0
  10. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/helpers/import_hostnames.py +5 -0
  11. cmdbsyncer-4.5.0.dev1/application/helpers/jinja_help.py +202 -0
  12. cmdbsyncer-4.5.0.dev1/application/helpers/lookup_table.py +104 -0
  13. cmdbsyncer-4.5.0.dev1/application/helpers/page_title.py +70 -0
  14. cmdbsyncer-4.5.0.dev1/application/helpers/secret_access.py +154 -0
  15. cmdbsyncer-4.5.0.dev1/application/helpers/shadow_data.py +56 -0
  16. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/helpers/syncer_jinja.py +52 -1
  17. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/mcp_server.py +4 -0
  18. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/models/account.py +12 -0
  19. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/models/host.py +61 -0
  20. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/models/host_labels.py +13 -4
  21. cmdbsyncer-4.5.0.dev1/application/models/lookup_table.py +23 -0
  22. cmdbsyncer-4.5.0.dev1/application/models/secret.py +190 -0
  23. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/models/user.py +2 -0
  24. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/module_registry.py +18 -4
  25. cmdbsyncer-4.5.0.dev1/application/modules/custom_attributes/ordering.py +126 -0
  26. cmdbsyncer-4.5.0.dev1/application/modules/custom_attributes/views.py +164 -0
  27. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/modules/plugin.py +35 -9
  28. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/modules/rule/list_source.py +4 -3
  29. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/modules/rule/views.py +27 -0
  30. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/ansible/site_syncer.py +1 -0
  31. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/__init__.py +97 -2
  32. cmdbsyncer-4.5.0.dev1/application/plugins/checkmk/admin_views.py +299 -0
  33. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/cmk2.py +3 -2
  34. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/cmk_rules.py +200 -86
  35. cmdbsyncer-4.5.0.dev1/application/plugins/checkmk/config_checks/__init__.py +74 -0
  36. cmdbsyncer-4.5.0.dev1/application/plugins/checkmk/config_checks/base.py +202 -0
  37. cmdbsyncer-4.5.0.dev1/application/plugins/checkmk/config_checks/httpv2.py +461 -0
  38. cmdbsyncer-4.5.0.dev1/application/plugins/checkmk/config_checks/pdf.py +234 -0
  39. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/dcd.py +20 -0
  40. cmdbsyncer-4.5.0.dev1/application/plugins/checkmk/download_catalog.py +71 -0
  41. cmdbsyncer-4.5.0.dev1/application/plugins/checkmk/folder_view.py +360 -0
  42. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/inits.py +43 -5
  43. cmdbsyncer-4.5.0.dev1/application/plugins/checkmk/ldap_connections.py +202 -0
  44. cmdbsyncer-4.5.0.dev1/application/plugins/checkmk/ldap_models.py +81 -0
  45. cmdbsyncer-4.5.0.dev1/application/plugins/checkmk/ldap_views.py +144 -0
  46. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/models.py +22 -37
  47. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/passwords.py +10 -6
  48. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/rule_passwords.py +7 -5
  49. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/rules.py +53 -0
  50. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/syncer.py +2 -2
  51. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/tests/test_cmk2.py +2 -1
  52. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/tests/test_cmk_conditions.py +50 -7
  53. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/tests/test_cmk_rules.py +80 -10
  54. cmdbsyncer-4.5.0.dev1/application/plugins/checkmk/tests/test_config_checks.py +450 -0
  55. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/tests/test_dcd.py +41 -0
  56. cmdbsyncer-4.5.0.dev1/application/plugins/checkmk/tests/test_folder_view.py +225 -0
  57. cmdbsyncer-4.5.0.dev1/application/plugins/checkmk/tests/test_ldap_connections.py +165 -0
  58. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/tests/test_rules.py +89 -0
  59. cmdbsyncer-4.5.0.dev1/application/plugins/checkmk/tests/test_setup_rule_form_helpers.py +102 -0
  60. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/tests/test_syncer.py +3 -3
  61. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/views.py +376 -125
  62. cmdbsyncer-4.5.0.dev1/application/plugins/op5/__init__.py +42 -0
  63. cmdbsyncer-4.5.0.dev1/application/plugins/op5/op5.py +127 -0
  64. cmdbsyncer-4.5.0.dev1/application/plugins/op5/plugin.json +14 -0
  65. cmdbsyncer-4.5.0.dev1/application/plugins/op5/tests/test_op5.py +68 -0
  66. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/rules/__init__.py +11 -5
  67. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/rules/rule_definitions.py +5 -1
  68. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/rules/rule_import_export.py +87 -23
  69. cmdbsyncer-4.5.0.dev1/application/plugins/servicenow/tests/__init__.py +3 -0
  70. cmdbsyncer-4.5.0.dev1/application/templates/admin/_checkmk_download_help.html +158 -0
  71. cmdbsyncer-4.5.0.dev1/application/templates/admin/_config_check_findings.html +99 -0
  72. cmdbsyncer-4.5.0.dev1/application/templates/admin/_group_fold.html +158 -0
  73. cmdbsyncer-4.5.0.dev1/application/templates/admin/account_list.html +53 -0
  74. cmdbsyncer-4.5.0.dev1/application/templates/admin/checkmk_config_checks.html +89 -0
  75. cmdbsyncer-4.5.0.dev1/application/templates/admin/checkmk_config_checks_report.html +88 -0
  76. cmdbsyncer-4.5.0.dev1/application/templates/admin/checkmk_folder_debug.html +152 -0
  77. cmdbsyncer-4.5.0.dev1/application/templates/admin/checkmk_folders.html +127 -0
  78. cmdbsyncer-4.5.0.dev1/application/templates/admin/checkmk_settings_create.html +6 -0
  79. cmdbsyncer-4.5.0.dev1/application/templates/admin/checkmk_settings_edit.html +6 -0
  80. cmdbsyncer-4.5.0.dev1/application/templates/admin/custom_attribute_list.html +354 -0
  81. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/file/modals/form.html +1 -1
  82. cmdbsyncer-4.5.0.dev1/application/templates/admin/host_csv_import_preview.html +167 -0
  83. cmdbsyncer-4.5.0.dev1/application/templates/admin/host_import_error.html +6 -0
  84. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/host_list.html +141 -36
  85. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/master.html +8 -2
  86. cmdbsyncer-4.5.0.dev1/application/templates/admin/model/_jinja_help.html +205 -0
  87. cmdbsyncer-4.5.0.dev1/application/templates/admin/model/_label_condition_editor.html +275 -0
  88. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/model/checkmk_rule_mngmt_create.html +1 -0
  89. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/model/checkmk_rule_mngmt_edit.html +1 -0
  90. cmdbsyncer-4.5.0.dev1/application/templates/admin/secret_reveal.html +26 -0
  91. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/debug_host.html +167 -65
  92. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/views/account.py +38 -2
  93. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/views/default.py +7 -6
  94. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/views/host.py +469 -96
  95. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/views/host_filters.py +44 -29
  96. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/views/host_renderers.py +25 -0
  97. cmdbsyncer-4.5.0.dev1/application/views/host_secrets.py +46 -0
  98. cmdbsyncer-4.5.0.dev1/application/views/lookup_table.py +128 -0
  99. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/views/project.py +4 -4
  100. cmdbsyncer-4.5.0.dev1/application/views/secret.py +220 -0
  101. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/cmdbsyncer.egg-info/PKG-INFO +2 -1
  102. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/cmdbsyncer.egg-info/SOURCES.txt +55 -0
  103. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/cmdbsyncer.egg-info/requires.txt +1 -0
  104. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/pyproject.toml +1 -1
  105. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/requirements-extras.txt +1 -0
  106. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_api.py +21 -9
  107. cmdbsyncer-4.5.0.dev1/tests/test_checkmk_download_catalog.py +81 -0
  108. cmdbsyncer-4.5.0.dev1/tests/test_config_checks_pdf_smoke.py +104 -0
  109. cmdbsyncer-4.5.0.dev1/tests/test_custom_attribute_order.py +178 -0
  110. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_default_view.py +3 -1
  111. cmdbsyncer-4.5.0.dev1/tests/test_host_keyvalue_filter.py +75 -0
  112. cmdbsyncer-4.5.0.dev1/tests/test_jinja_help.py +122 -0
  113. cmdbsyncer-4.5.0.dev1/tests/test_lookup_table.py +142 -0
  114. cmdbsyncer-4.5.0.dev1/tests/test_page_title.py +78 -0
  115. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_plugin_ssti.py +9 -0
  116. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_rule_import_override.py +35 -0
  117. cmdbsyncer-4.5.0.dev1/tests/test_secret_store_scope.py +602 -0
  118. cmdbsyncer-4.5.0.dev1/tests/test_shadow_source.py +97 -0
  119. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_template_merge_fields.py +57 -16
  120. cmdbsyncer-4.5.0.dev1/tests/test_web_requests_smoke.py +337 -0
  121. cmdbsyncer-4.4.1/application/buildinfo.txt +0 -1
  122. cmdbsyncer-4.4.1/application/modules/custom_attributes/views.py +0 -37
  123. cmdbsyncer-4.4.1/application/plugins/checkmk/admin_views.py +0 -282
  124. cmdbsyncer-4.4.1/application/templates/admin/host_csv_import_preview.html +0 -91
  125. cmdbsyncer-4.4.1/tests/test_web_requests_smoke.py +0 -182
  126. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/LICENSE +0 -0
  127. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/README.md +0 -0
  128. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/_version.py +0 -0
  129. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/api/__init__.py +0 -0
  130. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/api/inventory.py +0 -0
  131. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/api/objects.py +0 -0
  132. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/api/views.py +0 -0
  133. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/auth/views.py +0 -0
  134. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/changelog/.pages +0 -0
  135. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/changelog/v3.10.md +0 -0
  136. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/changelog/v3.11.md +0 -0
  137. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/changelog/v3.12.md +0 -0
  138. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/changelog/v3.5.md +0 -0
  139. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/changelog/v3.7.md +0 -0
  140. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/changelog/v3.8.md +0 -0
  141. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/changelog/v3.9.md +0 -0
  142. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/changelog/v4.0.md +0 -0
  143. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/changelog/v4.1.md +0 -0
  144. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/changelog/v4.2.md +0 -0
  145. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/changelog/v4.3.md +0 -0
  146. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/cli.py +0 -0
  147. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/config.py +0 -0
  148. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/enterprise.py +0 -0
  149. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/helpers/__init__.py +0 -0
  150. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/helpers/audit.py +0 -0
  151. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/helpers/cron.py +0 -0
  152. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/helpers/db_analysis.py +0 -0
  153. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/helpers/get_account.py +0 -0
  154. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/helpers/host_maintenance.py +0 -0
  155. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/helpers/inventory.py +0 -0
  156. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/helpers/label_hash.py +0 -0
  157. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/helpers/label_history.py +0 -0
  158. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/helpers/local_config_file.py +0 -0
  159. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/helpers/local_config_presets.py +0 -0
  160. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/helpers/mongo_keys.py +0 -0
  161. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/helpers/notification_channels.py +0 -0
  162. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/helpers/notification_dispatch.py +0 -0
  163. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/helpers/plugins.py +0 -0
  164. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/helpers/retention.py +0 -0
  165. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/helpers/sates.py +0 -0
  166. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/helpers/sql.py +0 -0
  167. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/helpers/stale_indexes.py +0 -0
  168. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/helpers/tablib_formater.py +0 -0
  169. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/helpers/tests/__init__.py +0 -0
  170. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/helpers/tests/test_sql.py +0 -0
  171. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/helpers/timezone.py +0 -0
  172. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/models/__init__.py +0 -0
  173. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/models/config.py +0 -0
  174. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/models/cron.py +0 -0
  175. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/models/field_approval.py +0 -0
  176. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/models/forms.py +0 -0
  177. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/models/host_cleanup.py +0 -0
  178. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/models/host_create_time.py +0 -0
  179. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/models/host_inventory_tree.py +0 -0
  180. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/models/host_label_event.py +0 -0
  181. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/models/host_templates.py +0 -0
  182. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/models/notification_channel.py +0 -0
  183. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/models/notification_rule.py +0 -0
  184. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/models/notification_state.py +0 -0
  185. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/models/project.py +0 -0
  186. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/models/saved_search.py +0 -0
  187. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/models/states.py +0 -0
  188. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/modules/__init__.py +0 -0
  189. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/modules/custom_attributes/models.py +0 -0
  190. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/modules/custom_attributes/rules.py +0 -0
  191. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/modules/debug.py +0 -0
  192. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/modules/email.py +0 -0
  193. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/modules/inventory/__init__.py +0 -0
  194. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/modules/log/command_output.py +0 -0
  195. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/modules/log/log.py +0 -0
  196. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/modules/log/models.py +0 -0
  197. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/modules/log/views.py +0 -0
  198. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/modules/rule/__init__.py +0 -0
  199. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/modules/rule/filter.py +0 -0
  200. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/modules/rule/list_source_views.py +0 -0
  201. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/modules/rule/match.py +0 -0
  202. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/modules/rule/models.py +0 -0
  203. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/modules/rule/rewrite.py +0 -0
  204. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/modules/rule/rule.py +0 -0
  205. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/modules/search_parser.py +0 -0
  206. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/modules/statefile.py +0 -0
  207. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/notices/strict_certificate_verification.txt +0 -0
  208. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/__init__.py +0 -0
  209. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/ansible/__init__.py +0 -0
  210. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/ansible/admin_views.py +0 -0
  211. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/ansible/inventory.py +0 -0
  212. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/ansible/models.py +0 -0
  213. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/ansible/playbook_rules.py +0 -0
  214. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/ansible/plugin.json +0 -0
  215. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/ansible/rules.py +0 -0
  216. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/ansible/runner.py +0 -0
  217. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/ansible/seed.py +0 -0
  218. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/ansible/tests/__init__.py +0 -0
  219. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/ansible/tests/test_runner_ssh_env.py +0 -0
  220. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/ansible/views.py +0 -0
  221. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/bmc_remedy/__init__.py +0 -0
  222. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/bmc_remedy/bmc_remedy.py +0 -0
  223. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/bmc_remedy/plugin.json +0 -0
  224. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/bi.py +0 -0
  225. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/data/ruleset_examples.json +0 -0
  226. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/data/rulesets_2.4.json +0 -0
  227. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/data/rulesets_2.5.json +0 -0
  228. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/data_quality.py +0 -0
  229. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/downtimes.py +0 -0
  230. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/folder_attributes.py +0 -0
  231. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/groups.py +0 -0
  232. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/helpers.py +0 -0
  233. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/import_v1.py +0 -0
  234. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/import_v2.py +0 -0
  235. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/inventorize.py +0 -0
  236. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/list_source.py +0 -0
  237. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/notification_rules.py +0 -0
  238. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/plugin.json +0 -0
  239. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/poolfolder.py +0 -0
  240. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/rule_analysis_runner.py +0 -0
  241. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/rulesets_catalog.py +0 -0
  242. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/sitepool.py +0 -0
  243. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/sites.py +0 -0
  244. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/tags.py +0 -0
  245. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/tests/__init__.py +0 -0
  246. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/tests/test_assign_template.py +0 -0
  247. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/tests/test_bi.py +0 -0
  248. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/tests/test_data_quality.py +0 -0
  249. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/tests/test_downtimes.py +0 -0
  250. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/tests/test_groups.py +0 -0
  251. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/tests/test_helpers.py +0 -0
  252. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/tests/test_import_v1.py +0 -0
  253. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/tests/test_import_v2.py +0 -0
  254. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/tests/test_inventorize.py +0 -0
  255. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/tests/test_list_source.py +0 -0
  256. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/tests/test_notification_rules.py +0 -0
  257. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/tests/test_passwords.py +0 -0
  258. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/tests/test_poolfolder.py +0 -0
  259. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/tests/test_rule_analysis_runner.py +0 -0
  260. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/tests/test_rule_passwords.py +0 -0
  261. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/tests/test_sitepool.py +0 -0
  262. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/tests/test_sites.py +0 -0
  263. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/tests/test_tags.py +0 -0
  264. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/tests/test_user_generation.py +0 -0
  265. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/tests/test_users.py +0 -0
  266. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/user_generation.py +0 -0
  267. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/user_models.py +0 -0
  268. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/checkmk/users.py +0 -0
  269. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/cisco_dna/__init__.py +0 -0
  270. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/cisco_dna/plugin.json +0 -0
  271. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/cisco_dna/syncer.py +0 -0
  272. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/cron.py +0 -0
  273. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/csv/__init__.py +0 -0
  274. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/csv/csv.py +0 -0
  275. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/csv/plugin.json +0 -0
  276. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/eda/__init__.py +0 -0
  277. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/eda/admin_views.py +0 -0
  278. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/eda/models.py +0 -0
  279. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/eda/plugin.json +0 -0
  280. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/eda/repeats.py +0 -0
  281. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/eda/rules.py +0 -0
  282. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/eda/sender.py +0 -0
  283. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/eda/tests/__init__.py +0 -0
  284. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/eda/tests/test_eda.py +0 -0
  285. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/eda/tests/test_repeats.py +0 -0
  286. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/eda/views.py +0 -0
  287. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/file_requests.py +0 -0
  288. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/idoit/__init__.py +0 -0
  289. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/idoit/admin_views.py +0 -0
  290. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/idoit/models.py +0 -0
  291. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/idoit/plugin.json +0 -0
  292. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/idoit/rules.py +0 -0
  293. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/idoit/syncer.py +0 -0
  294. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/idoit/views.py +0 -0
  295. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/jdisc/__init__.py +0 -0
  296. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/jdisc/applications.py +0 -0
  297. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/jdisc/devices.py +0 -0
  298. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/jdisc/executables.py +0 -0
  299. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/jdisc/jdisc.py +0 -0
  300. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/jdisc/plugin.json +0 -0
  301. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/jira/__init__.py +0 -0
  302. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/jira/jira.py +0 -0
  303. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/jira/plugin.json +0 -0
  304. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/jira_cloud/__init__.py +0 -0
  305. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/jira_cloud/admin_views.py +0 -0
  306. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/jira_cloud/export.py +0 -0
  307. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/jira_cloud/jira_cloud.py +0 -0
  308. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/jira_cloud/models.py +0 -0
  309. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/jira_cloud/plugin.json +0 -0
  310. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/jira_cloud/rules.py +0 -0
  311. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/jira_cloud/schema_sync.py +0 -0
  312. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/jira_cloud/tests/__init__.py +0 -0
  313. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/jira_cloud/tests/test_attribute_value.py +0 -0
  314. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/jira_cloud/views.py +0 -0
  315. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/json/__init__.py +0 -0
  316. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/json/json.py +0 -0
  317. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/json/plugin.json +0 -0
  318. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/ldap/__init__.py +0 -0
  319. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/ldap/admin_views.py +0 -0
  320. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/ldap/ldap.py +0 -0
  321. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/ldap/plugin.json +0 -0
  322. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/ldap/views.py +0 -0
  323. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/maintenance/__init__.py +0 -0
  324. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/maintenance/db_commands.py +0 -0
  325. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/maintenance/plugin.json +0 -0
  326. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/maintenance/tests/__init__.py +0 -0
  327. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/maintenance/tests/test_delete_all_hosts.py +0 -0
  328. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/maintenance/tests/test_delete_inventory.py +0 -0
  329. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/mssql/__init__.py +0 -0
  330. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/mssql/plugin.json +0 -0
  331. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/mysql/__init__.py +0 -0
  332. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/mysql/mysql.py +0 -0
  333. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/mysql/plugin.json +0 -0
  334. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/netbox/__init__.py +0 -0
  335. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/netbox/admin_views.py +0 -0
  336. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/netbox/cluster.py +0 -0
  337. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/netbox/contacts.py +0 -0
  338. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/netbox/dataflow.py +0 -0
  339. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/netbox/devices.py +0 -0
  340. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/netbox/interfaces.py +0 -0
  341. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/netbox/ips.py +0 -0
  342. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/netbox/models.py +0 -0
  343. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/netbox/netbox.py +0 -0
  344. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/netbox/networks.py +0 -0
  345. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/netbox/plugin.json +0 -0
  346. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/netbox/prefixes.py +0 -0
  347. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/netbox/rules.py +0 -0
  348. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/netbox/tests/__init__.py +0 -0
  349. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/netbox/tests/test_import_filter.py +0 -0
  350. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/netbox/utils.py +0 -0
  351. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/netbox/views.py +0 -0
  352. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/netbox/virtualmachines.py +0 -0
  353. {cmdbsyncer-4.4.1/application/plugins/servicenow → cmdbsyncer-4.5.0.dev1/application/plugins/op5}/tests/__init__.py +0 -0
  354. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/prtg/__init__.py +0 -0
  355. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/prtg/plugin.json +0 -0
  356. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/prtg/prtg.py +0 -0
  357. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/pyodbc/__init__.py +0 -0
  358. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/pyodbc/plugin.json +0 -0
  359. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/pyodbc/pyodbc.py +0 -0
  360. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/rest/__init__.py +0 -0
  361. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/rest/plugin.json +0 -0
  362. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/rest/rest.py +0 -0
  363. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/rules/admin_views.py +0 -0
  364. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/rules/autorules.py +0 -0
  365. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/rules/models.py +0 -0
  366. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/rules/plugin.json +0 -0
  367. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/rules/views.py +0 -0
  368. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/servicenow/__init__.py +0 -0
  369. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/servicenow/admin_views.py +0 -0
  370. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/servicenow/plugin.json +0 -0
  371. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/servicenow/syncer.py +0 -0
  372. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/servicenow/tests/test_table_request.py +0 -0
  373. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/servicenow/views.py +0 -0
  374. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/syncer_shell.py +0 -0
  375. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/vmware/__init__.py +0 -0
  376. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/vmware/admin_views.py +0 -0
  377. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/vmware/custom_attributes.py +0 -0
  378. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/vmware/models.py +0 -0
  379. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/vmware/plugin.json +0 -0
  380. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/vmware/rules.py +0 -0
  381. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/vmware/views.py +0 -0
  382. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/vmware/vmware.py +0 -0
  383. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/yml/__init__.py +0 -0
  384. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/yml/plugin.json +0 -0
  385. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins/yml/yml.py +0 -0
  386. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/plugins_cli.py +0 -0
  387. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/static/cmdbsyncer_mark.png +0 -0
  388. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/static/css/cmdbsyncer.css +0 -0
  389. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/static/favicon.png +0 -0
  390. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/static/js/Sortable.min.js +0 -0
  391. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/static/js/main.js +0 -0
  392. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/static/logo_white.png +0 -0
  393. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/static/vendor/README.md +0 -0
  394. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/static/vendor/ansible.svg +0 -0
  395. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/static/vendor/checkmk.svg +0 -0
  396. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/static/vendor/idoit.svg +0 -0
  397. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/static/vendor/jira.svg +0 -0
  398. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/static/vendor/netbox.svg +0 -0
  399. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/static/vendor/vmware.svg +0 -0
  400. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/_brand.html +0 -0
  401. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/_theme.html +0 -0
  402. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/_timezone.html +0 -0
  403. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/_host_tabs.html +0 -0
  404. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/account_create.html +0 -0
  405. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/account_edit.html +0 -0
  406. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/account_field_help.html +0 -0
  407. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/account_pick_type.html +0 -0
  408. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/ansible_playbook_run.html +0 -0
  409. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/ansible_project_detail.html +0 -0
  410. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/ansible_rule_list.html +0 -0
  411. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/ansible_run_details.html +0 -0
  412. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/assign_project_form.html +0 -0
  413. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/bulk_label_form.html +0 -0
  414. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/changelog_archive.html +0 -0
  415. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/checkmk_data_quality.html +0 -0
  416. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/checkmk_list_rule_debug.html +0 -0
  417. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/checkmk_rule_mngmt_list.html +0 -0
  418. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/checkmk_rule_optimization.html +0 -0
  419. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/checkmk_settings_list.html +0 -0
  420. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/checkmk_test_folder_scope.html +0 -0
  421. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/checkmk_user_generation_preview.html +0 -0
  422. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/checkmk_user_generation_rule_list.html +0 -0
  423. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/copy_as_new_form.html +0 -0
  424. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/data_quality.html +0 -0
  425. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/data_quality_lowercase_preview.html +0 -0
  426. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/file/list.html +0 -0
  427. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/first_steps.html +0 -0
  428. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/host_details.html +0 -0
  429. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/host_edit.html +0 -0
  430. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/host_inventory_tree.html +0 -0
  431. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/host_relations_graph.html +0 -0
  432. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/host_timeline.html +0 -0
  433. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/index.html +0 -0
  434. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/ldap_search.html +0 -0
  435. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/local_config_editor.html +0 -0
  436. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/model/_action_picker.html +0 -0
  437. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/model/_folder_builder.html +0 -0
  438. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/model/_list_source_preview.html +0 -0
  439. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/model/_notification_plugin_picker.html +0 -0
  440. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/model/_ruleset_autocomplete.html +0 -0
  441. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/model/checkmk_notification_rule_create.html +0 -0
  442. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/model/checkmk_notification_rule_edit.html +0 -0
  443. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/model/checkmk_rule_create.html +0 -0
  444. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/model/checkmk_rule_edit.html +0 -0
  445. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/model/clone_confirm.html +0 -0
  446. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/model/inline_list_base.html +0 -0
  447. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/model/list_source_create.html +0 -0
  448. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/model/list_source_edit.html +0 -0
  449. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/module_overview.html +0 -0
  450. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/object_list.html +0 -0
  451. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/project_edit.html +0 -0
  452. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/project_import.html +0 -0
  453. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/project_import_cmk.html +0 -0
  454. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/project_list.html +0 -0
  455. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/project_overview.html +0 -0
  456. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/servicenow_query.html +0 -0
  457. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/set_account_form.html +0 -0
  458. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/set_cmk_version_form.html +0 -0
  459. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/admin/set_template_form.html +0 -0
  460. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/api_tokens.html +0 -0
  461. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/base.html +0 -0
  462. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/change_password.html +0 -0
  463. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/csrf_error.html +0 -0
  464. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/debug.html +0 -0
  465. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/email/newuser.html +0 -0
  466. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/email/notification.html +0 -0
  467. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/email/resetpassword.html +0 -0
  468. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/formular.html +0 -0
  469. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/license_info.html +0 -0
  470. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/login.html +0 -0
  471. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/logout_confirm.html +0 -0
  472. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/request_password.html +0 -0
  473. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/set_2fa.html +0 -0
  474. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/templates/set_theme.html +0 -0
  475. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/themes/dracula.css +0 -0
  476. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/themes/gruvbox-dark.css +0 -0
  477. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/themes/gruvbox-light.css +0 -0
  478. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/themes/nord.css +0 -0
  479. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/themes_registry.py +0 -0
  480. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/views/_form_fields.py +0 -0
  481. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/views/_form_sections.py +0 -0
  482. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/views/account_select.py +0 -0
  483. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/views/config.py +0 -0
  484. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/views/cron.py +0 -0
  485. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/views/data_quality.py +0 -0
  486. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/views/field_approval.py +0 -0
  487. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/views/fileadmin.py +0 -0
  488. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/views/first_steps.py +0 -0
  489. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/views/host_inventory_grid.py +0 -0
  490. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/views/host_widgets.py +0 -0
  491. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/views/license.py +0 -0
  492. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/views/menu_links.py +0 -0
  493. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/views/module_overview.py +0 -0
  494. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/views/notification_channel.py +0 -0
  495. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/views/notification_rule.py +0 -0
  496. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/views/saved_search.py +0 -0
  497. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/views/template_select.py +0 -0
  498. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/application/views/user.py +0 -0
  499. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/cmdbsyncer.egg-info/dependency_links.txt +0 -0
  500. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/cmdbsyncer.egg-info/entry_points.txt +0 -0
  501. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/cmdbsyncer.egg-info/top_level.txt +0 -0
  502. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/requirements-ansible-windows.txt +0 -0
  503. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/requirements-ansible.txt +0 -0
  504. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/requirements.txt +0 -0
  505. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/setup.cfg +0 -0
  506. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/syncerapi/__init__.py +0 -0
  507. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/syncerapi/v1/__init__.py +0 -0
  508. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/syncerapi/v1/core/__init__.py +0 -0
  509. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/syncerapi/v1/inventory/__init__.py +0 -0
  510. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/syncerapi/v1/rest/__init__.py +0 -0
  511. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_account_macro.py +0 -0
  512. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_active_templates.py +0 -0
  513. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_ansible_cmk_roles.py +0 -0
  514. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_ansible_inventory.py +0 -0
  515. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_api_csrf_invariant.py +0 -0
  516. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_config_dir.py +0 -0
  517. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_cron_missing_account.py +0 -0
  518. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_csrf_config.py +0 -0
  519. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_data_quality_duplicates.py +0 -0
  520. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_disabled_row_style.py +0 -0
  521. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_eda_web_smoke.py +0 -0
  522. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_enterprise_quiet.py +0 -0
  523. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_folder_builder_js.py +0 -0
  524. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_global_account_presets.py +0 -0
  525. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_host_cleanup.py +0 -0
  526. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_host_create_time.py +0 -0
  527. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_host_label_edit.py +0 -0
  528. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_host_roundtrip_smoke.py +0 -0
  529. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_host_template_filter.py +0 -0
  530. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_host_template_resync.py +0 -0
  531. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_import_hostnames.py +0 -0
  532. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_jinja_get_list.py +0 -0
  533. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_jinja_hash.py +0 -0
  534. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_label_history.py +0 -0
  535. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_ldap_search_filter.py +0 -0
  536. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_local_config_presets.py +0 -0
  537. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_logging_config.py +0 -0
  538. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_model_indexes.py +0 -0
  539. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_mongo_keys.py +0 -0
  540. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_plugin.py +0 -0
  541. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_plugins_cli.py +0 -0
  542. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_regex_condition_limits.py +0 -0
  543. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_rule.py +0 -0
  544. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_rule_export_templates.py +0 -0
  545. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_rule_filename_detect.py +0 -0
  546. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_rule_list_rows.py +0 -0
  547. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_rule_list_source.py +0 -0
  548. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_rule_match.py +0 -0
  549. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_rule_registry_complete.py +0 -0
  550. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_search_parser.py +0 -0
  551. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_security_fixes.py +0 -0
  552. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_stale_indexes.py +0 -0
  553. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_timezone.py +0 -0
  554. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_user_scope_smoke.py +0 -0
  555. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_view_permission_flags.py +0 -0
  556. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_web_account_password_chars.py +0 -0
  557. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_web_account_password_deferred_save.py +0 -0
  558. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_web_ansible_account_inventory.py +0 -0
  559. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_web_boot_smoke.py +0 -0
  560. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_web_debug_pages.py +0 -0
  561. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/tests/test_web_list_source.py +0 -0
  562. {cmdbsyncer-4.4.1 → cmdbsyncer-4.5.0.dev1}/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.1
3
+ Version: 4.5.0.dev1
4
4
  Summary: Rule-based modular synchronizer for Checkmk, Netbox, Ansible, I-DOIT, Jira CMDB and 15+ other CMDB/monitoring systems
5
5
  Author-email: Kuhn & Ruess GmbH <info@kuhn-ruess.de>
6
6
  Maintainer-email: Bastian Kuhn <mail@bastian-kuhn.de>
@@ -56,6 +56,7 @@ Requires-Dist: mysql-connector-python==9.1.0; extra == "extras"
56
56
  Requires-Dist: pyvim==3.0.3; extra == "extras"
57
57
  Requires-Dist: pyvmomi==8.0.3.0.1; extra == "extras"
58
58
  Requires-Dist: mcp==1.10.1; extra == "extras"
59
+ Requires-Dist: fpdf2==2.8.9; extra == "extras"
59
60
  Provides-Extra: ansible
60
61
  Requires-Dist: ansible==10.5.0; extra == "ansible"
61
62
  Requires-Dist: cmdbsyncer-inventory>=0.2.0; extra == "ansible"
@@ -467,6 +467,10 @@ if not CLI_MODE:
467
467
  insecure = False
468
468
  return {'show_https_warning': insecure}
469
469
 
470
+ # pylint: disable-next=import-outside-toplevel
471
+ from application.helpers.page_title import page_title
472
+ app.add_template_global(page_title)
473
+
470
474
  @app.template_filter('localtime')
471
475
  def _localtime(value, fmt='%Y-%m-%d %H:%M:%S'):
472
476
  """
@@ -764,6 +768,28 @@ def _register_web_layer(): # pylint: disable=too-many-locals,too-many-statement
764
768
 
765
769
  _register_all_plugin_admin_views(admin)
766
770
 
771
+ # .-- Modules: shared data at the bottom
772
+ # Lookup Tables and the Secret Store serve every module, so they sit
773
+ # below the modules, after a divider. Registered after the plugins
774
+ # because Flask-Admin keeps the registration order.
775
+ from application.views.menu_links import AccessMenuLink
776
+ from application.models.lookup_table import LookupTable
777
+ from application.views.lookup_table import LookupTableView
778
+ from application.models.secret import Secret
779
+ from application.views.secret import SecretView
780
+ lookup_view = LookupTableView(LookupTable, name="Lookup Tables",
781
+ category="Modules",
782
+ menu_icon_type='fa', menu_icon_value='fa-table')
783
+ secret_view = SecretView(Secret, name="Secret Store", endpoint="secret",
784
+ category="Modules",
785
+ menu_icon_type='fa', menu_icon_value='fa-lock')
786
+ admin.add_link(AccessMenuLink(
787
+ name='', url='#', category='Modules', class_name='dropdown-divider',
788
+ access=lambda: lookup_view.is_accessible() or secret_view.is_accessible()))
789
+ admin.add_view(lookup_view)
790
+ admin.add_view(secret_view)
791
+ #.
792
+
767
793
  # .-- Top bar grouping
768
794
  # The bar holds three groups: the working views (Objects, Modules,
769
795
  # Projects), the read-only tools (Log, Files) and the administration
@@ -811,7 +837,6 @@ def _register_web_layer(): # pylint: disable=too-many-locals,too-many-statement
811
837
  # compact. Each of the three topics gets its own sub menu, so Settings
812
838
  # itself stays a short list.
813
839
  from application.views.account import AccountModelView, ChildAccountModelView
814
- from application.views.menu_links import AccessMenuLink
815
840
  from flask_login import current_user as _menu_user
816
841
 
817
842
  _add_sub_menu(admin, "Accounts", 'fa-user-circle')
@@ -235,9 +235,9 @@ class RulesExport(Resource):
235
235
  'passwords and role assignments — treat as secret. Skipped by '
236
236
  'default.')
237
237
  @API.param('include_passwords',
238
- 'Set to ``1`` to also export the Checkmk password store '
238
+ 'Set to ``1`` to also export the Secret Store '
239
239
  '(``cmk_passwords``). The entries stay encrypted with this '
240
- 'instance key — treat as secret. Skipped by default.')
240
+ 'instance key, treat as secret. Skipped by default.')
241
241
  @API.response(200, 'Every rule, grouped by ``rule_type``.',
242
242
  RULES_EXPORT_RESPONSE)
243
243
  @API.response(401, 'Authentication failed', ERROR)
@@ -72,6 +72,8 @@ CRON_STATUS = API.model('cron_status', {
72
72
  'is_running': fields.Boolean(description='True while a run is in flight'),
73
73
  'last_message': fields.String(description='Last progress / result line'),
74
74
  'has_error': fields.Boolean(description='True iff the last run failed'),
75
+ 'enabled': fields.Boolean(description='False if the group is disabled '
76
+ 'or no longer exists'),
75
77
  })
76
78
 
77
79
  CRON_LIST_RESPONSE = API.model('cron_list_response', {
@@ -247,6 +249,8 @@ class SyncerCronApi(Resource):
247
249
  """Return the current status of every CronGroup."""
248
250
  try:
249
251
  response = []
252
+ enabled = {group.name: bool(group.enabled)
253
+ for group in CronGroup.objects.only('name', 'enabled')}
250
254
  for entry in CronStats.objects:
251
255
  last_start = entry.last_start
252
256
  if last_start:
@@ -261,6 +265,7 @@ class SyncerCronApi(Resource):
261
265
  'is_running': entry.is_running,
262
266
  'last_message': entry.last_message,
263
267
  'has_error': entry.failure,
268
+ 'enabled': enabled.get(entry.group, False),
264
269
  })
265
270
  return {
266
271
  'result': response,
@@ -0,0 +1 @@
1
+ BUILD_DATE=2026-10-29T19:15:50Z
@@ -1,9 +1,14 @@
1
1
  # Version 4.4
2
2
 
3
- ## Version 4.4.1
3
+ ## Unreleased
4
4
  - FIX: REST import: entries without the hostname field are skipped instead of aborting the whole import
5
5
  - FIX: Checkmk users: an empty row under Roles or Contact Groups is no longer sent to Checkmk, which rejected the user because of it
6
+ - FIX: Files: creating a folder, uploading, renaming or editing a file works again when the syncer runs under a sub-path such as /cmdbsyncer — the dialog sent its form to the address without that path
7
+ - FEAT: Accounts: a new import source can run as "Shadow Source" next to the current one — its data is stored beside the hosts without changing them, and the host details and Debug Host compare it with the live data and the rule outcomes; the shadow data can be cleared from the account and host list
6
8
  - FIX: Checkmk Site Pools: the member sites of a switched-off pool are readable again in the dark themes
9
+ - FEAT: Checkmk DCD Rules: the text fields have the Jinja help, and {{ HOST_FOLDER }} gives the folder the host export puts the host in and {{ HOST_POOL_SITE }} the site its site pool assigned
10
+ - FEAT: Checkmk Setup Rules: the Jinja help of the value shows how a password in the rule points to an entry of the Secret Store
11
+ - FIX: Checkmk password export no longer fails for Secret Store entries without a comment, such as secrets written by an import — the entry's Checkmk ident is used as comment
7
12
  - FIX: Rules with a Pasted List: switching the rule source to the list no longer hides the Enabled and Last Match checkboxes
8
13
  - FIX: Host list: the page is about a fifth smaller for hosts with many labels and loads faster
9
14
  - FIX: Checkmk host export: a folder Checkmk refuses to create is reported in the terminal with Checkmk's reason — before, only the hosts in it failed later with "folder could not be found"
@@ -0,0 +1,31 @@
1
+ # Version 4.5
2
+
3
+ ## Unreleased
4
+
5
+ - FEAT: New OP5 Monitor import: `op5 import_hosts` and `op5 inventorize_hosts` read all hosts with address, alias, host groups, contacts, contact groups, parents and custom variables from an account of type OP5 Monitor
6
+ - FEAT: New Ansible playbook `deploy_configs/install/install_redhat.yml` installs the Syncer on RedHat, Rocky or Alma with MongoDB, Gunicorn and Apache, either as its own virtual host or under a sub-path
7
+ - FEAT: API: the cron status (`/api/v1/syncer/cron/`) tells whether a cron group is enabled, so the Checkmk plugin no longer monitors disabled or deleted cron groups
8
+ - FEAT: Checkmk: new Manage LDAP Connections maintains the LDAP connections Checkmk logs its users in with, including contact groups and roles from directory groups; server and bind password come from an LDAP account, `checkmk export_ldap_connections` creates, updates or removes them
9
+ - FEAT: `rules export_all_rules --zip` writes the export compressed into a zip archive, and `rules import_rules` reads such an archive back as it is
10
+ - FEAT: Checkmk Settings: Fill in from checkmk.com loads the current Checkmk versions on click and fills in version, edition and the filename of the installation file for the chosen platform, including the Checkmk Appliance; a new Download Proxy is used for the download of the installation file and for this list
11
+ - FEAT: Checkmk Setup Rules: the new option Per Template evaluates a rule once per CMDB template of the host, each time with only that template's labels, so a contact group and the services of one template no longer mix with those of another template on the same host; the host debug page shows these rules per template
12
+ - FEAT: The account list is grouped by account type, each group under a heading with the type's name and its number of accounts that folds the group away like the Global Custom Attributes, with Expand all and Collapse all; sorting by a column shows the plain list
13
+ - FEAT: Browser tab titles name the page first, e.g. "Edit web01 · Hosts · Objects" or "Filter · Rules · Ansible", so open tabs can be told apart
14
+ - FEAT: Host list: new filter Checkmk Attribute Key:Value finds hosts by the attributes of their last Checkmk sync, the green label badges
15
+ - FEAT: Host list: show up to 500 hosts per page
16
+ - FEAT: Host list: new action Remove Template takes one CMDB template off the selected hosts and keeps their other templates
17
+ - FEAT: Lookup Tables: maintain a long key/value list in the UI and read it in any Jinja field with `{{ lookup('table', key) }}`, e.g. to set an attribute from the value of another one
18
+ - FEAT: Custom Attributes and Rewrite Attributes: a Jinja help next to the template fields lists the lookup tables, variables, functions and filters and inserts them with one click
19
+ - FEAT: Global Custom Attributes: the rule list is grouped by the attribute each rule sets (a rule with several attributes in a group of that combination), shows every rule's place in the order the rules run, and the order can be changed by drag and drop or with the arrow keys, including moving a rule into another attribute's group. Each group folds away with a click on its heading
20
+ - FEAT: Secret Store: the Checkmk password store is now Modules > Secret Store and holds passwords, tokens and certificates for every module, global or bound to a host. Rules reach a host's entry with `{{ secret('key') }}` (plaintext with `{{ secret_value('key') }}`), entries of an archived host are kept as orphaned and can be bound to another host, certificates are shown for copying, and the host overview lists the entries of the host with masked values. New roles: Secret Store, and Secret Store: show plaintext values. Users limited to accounts or templates only reach entries of their own hosts, never global ones. Lookup Tables and the Secret Store sit at the bottom of the Modules menu
21
+ - FEAT: Host import: Import CSV / YAML also takes YAML files (several at once, several hosts per file as a list or as documents separated by ---, also YAML-like files whose certificate lines are out of indentation), and "Bulk add hosts" is now "Add hosts manually" with a format switch (auto, host list, CSV, YAML, key/value list)
22
+ - FEAT: Host import preview: every import and every manual add opens a preview where the values of each host, added columns and a template per host can be edited, chosen columns go into the Secret Store instead of becoming labels, and the account of the imported hosts is picked. Users limited to accounts only get their own accounts and cannot overwrite hosts outside their scope
23
+ - FEAT: Checkmk Setup Rules: the Jinja help sits next to the Value Template and the Folder, the new placeholder `{{ HOST_FOLDER }}` puts a rule into the folder its host lands in (rules per host only), and the Host label and Service label conditions are entered as compact key and value pairs with suggestions from the existing labels. The Host label condition now takes several labels as well, all of them must match
24
+ - FEAT: Checkmk > Folders and Folder Options: the folders the host export would use, with the hosts landing in each and the folder options (contact groups, permissions, title, ...) sent to Checkmk, per Checkmk account. The debug of a folder shows which host and which Export Rule with which conditions gave which option and how the values merge. Calculated from the syncer alone without touching Checkmk or the pools, users limited to accounts or templates only see the folders and options of their own hosts
25
+ - FEAT: Checkmk menu sorted into groups with dividers: the host export rules with the Pools first, then the rules for setup rules, groups, tags, users, downtimes, notifications, DCD and BI, then the Checkmk Server and the inventory from Checkmk, and at the bottom the views to check the result (Folders and Folder Options, Preview Generated Users, Data Quality Check, Cache). The menus are a little denser so the long ones fit the screen
26
+ - FEAT: Checkmk > Data Quality > Configuration Checks: pick a Checkmk account and the checks to run and see the problems they find, split by topic with a summary of the counts on top, and download them as a PDF report in the syncer design (needs the optional package fpdf2 from the extras, the page works without it). The first check looks at the HTTP checks: services that are WARN, CRIT or UNKNOWN in the monitoring right now with their output and the rule behind them, the same URL checked twice, website and certificate checked by two separate checks that one check_httpv2 check can do, and old check_http rules that are not migrated or still run next to their migrated rule. The checks only read from Checkmk. The Data Quality Check moved into the same Data Quality submenu
27
+
28
+ ## Version 4.5.0
29
+
30
+ (Initial 4.5 release — entries currently live in the Unreleased section
31
+ above. They get folded down into this section when the release is cut.)
@@ -10,12 +10,17 @@ with the structure at https://docs.cmdbsyncer.de/.
10
10
  docu_links = {
11
11
  'rewrite' : 'https://docs.cmdbsyncer.de/basics/rewrite_attributes/',
12
12
  'accounts' : 'https://docs.cmdbsyncer.de/basics/accounts/',
13
+ 'lookup_tables': 'https://docs.cmdbsyncer.de/basics/lookup_tables/',
14
+ 'jinja_functions': 'https://docs.cmdbsyncer.de/advanced/jinja_functions/',
13
15
  'cmk_inventory_attributes': 'https://docs.cmdbsyncer.de/checkmk/inventorize/',
14
16
  'cmk_groups': 'https://docs.cmdbsyncer.de/checkmk/groups_management/',
15
17
  'cmk_user_generation': 'https://docs.cmdbsyncer.de/checkmk/user_generation/',
16
18
  'cmk_setup_rules': 'https://docs.cmdbsyncer.de/checkmk/rules_management/',
19
+ 'cmk_sites': 'https://docs.cmdbsyncer.de/ansible/cmk_sites/',
17
20
  'cmk_hosttags': 'https://docs.cmdbsyncer.de/checkmk/create_hosttags/',
18
21
  'cmk_password_store': 'https://docs.cmdbsyncer.de/checkmk/password_store/',
22
+ 'cmk_ldap_connections': 'https://docs.cmdbsyncer.de/checkmk/ldap_connections/',
23
+ 'cmk_folders': 'https://docs.cmdbsyncer.de/checkmk/folders/',
19
24
 
20
25
  # Enterprise features — referenced from cmdbsyncer_enterprise views.
21
26
  'ent_overview': 'https://docs.cmdbsyncer.de/enterprise/',
@@ -0,0 +1,229 @@
1
+ """
2
+ YAML rows and Secret Store columns for the manual host import.
3
+
4
+ The host list imports a CSV through a preview where the user picks the
5
+ hostname column. YAML (an uploaded file or text pasted into Manual add) goes
6
+ through the same preview: a mapping of ``key: value`` pairs is one host, a
7
+ list of mappings or several documents separated by ``---`` are several
8
+ hosts, and every key becomes a column. Columns the user marks as secret are not written as
9
+ labels but into the Secret Store, bound to the imported host.
10
+ """
11
+ import json
12
+ import re
13
+
14
+ import yaml
15
+
16
+ from application.helpers.secret_access import can_bind
17
+ from application.models.secret import store_host_secret
18
+
19
+ YAML_SUFFIXES = ('.yml', '.yaml')
20
+
21
+ # Column names preselected as secret on the preview.
22
+ SECRET_HINTS = ('token', 'password', 'secret', 'certificate', 'cert')
23
+
24
+
25
+ # A first line like ``cluster: name``, ``---`` or ``- key: value``. A
26
+ # hostname never holds ``: ``, so a plain hostname list is never taken
27
+ # for YAML.
28
+ _YAML_START = re.compile(r'^(---|- |[A-Za-z0-9_.-]+:(\s|$))')
29
+
30
+
31
+ def is_yaml_filename(filename):
32
+ """True for a file the import reads as YAML."""
33
+ return (filename or '').lower().endswith(YAML_SUFFIXES)
34
+
35
+
36
+ def looks_like_yaml(text):
37
+ """True when pasted text is YAML rather than hostnames or CSV."""
38
+ for line in (text or '').splitlines():
39
+ stripped = line.strip()
40
+ if not stripped or stripped.startswith('#'):
41
+ continue
42
+ return bool(_YAML_START.match(stripped))
43
+ return False
44
+
45
+
46
+ def _cell(value):
47
+ """A YAML value as the string a CSV cell would hold."""
48
+ if value is None:
49
+ return ''
50
+ if isinstance(value, (dict, list)):
51
+ return json.dumps(value)
52
+ return str(value)
53
+
54
+
55
+ def _strict_entries(text):
56
+ """Mappings of ``text`` read as real YAML; ValueError when it is not."""
57
+ try:
58
+ documents = list(yaml.safe_load_all(text))
59
+ except yaml.YAMLError as exc:
60
+ raise ValueError(str(exc)) from exc
61
+ entries = []
62
+ for data in documents:
63
+ if data is None:
64
+ continue
65
+ for entry in data if isinstance(data, list) else [data]:
66
+ if not isinstance(entry, dict):
67
+ raise ValueError("expected 'key: value' lines")
68
+ entries.append(entry)
69
+ return entries
70
+
71
+
72
+ # Top-level key of the YAML-like format: ``key: value`` or ``key:``.
73
+ _FLAT_KEY = re.compile(r'^([A-Za-z_][\w.-]*):(?:\s+(.*))?$')
74
+ _BLOCK_INDICATOR = re.compile(r'^[|>][-+]?$')
75
+
76
+
77
+ def _block_value(indicator, lines):
78
+ """
79
+ Value of a ``key: |`` / ``key: >`` block in the YAML-like format.
80
+
81
+ Its lines may carry any indentation (certificate bodies often start at
82
+ column 0 between indented BEGIN/END lines), so every line is stripped
83
+ on the left; a PEM chain comes out as clean, unindented lines.
84
+ """
85
+ while lines and not lines[-1].strip():
86
+ lines = lines[:-1]
87
+ stripped = [line.strip() for line in lines]
88
+ if indicator.startswith('>'):
89
+ value = ' '.join(line for line in stripped if line)
90
+ else:
91
+ value = '\n'.join(stripped)
92
+ if not indicator.endswith('-'):
93
+ value += '\n'
94
+ return value
95
+
96
+
97
+ def _plain_value(value):
98
+ """A plain ``key: value`` value, surrounding quotes removed."""
99
+ value = (value or '').strip()
100
+ if len(value) > 1 and value[0] == value[-1] and value[0] in ('"', "'"):
101
+ return value[1:-1]
102
+ return value
103
+
104
+
105
+ # A ``key: value``, ``key=value`` or ``key<TAB>value`` line of a pasted
106
+ # key/value list; split at the first separator, so URLs keep their port.
107
+ _KV_LINE = re.compile(r'^\s*([A-Za-z_][\w .-]*?)\s*(?::|=|\t)\s*(.*)$')
108
+
109
+
110
+ def _flat_entries(text, filename, key_value=False):
111
+ """
112
+ Mappings of the YAML-like format: flat ``key: value`` lines, a ``key: |``
113
+ block continues over every following line (whatever its indentation)
114
+ up to the next top-level key, ``---`` separates hosts. Raises
115
+ ValueError naming the first line that fits none of this.
116
+
117
+ With ``key_value`` it reads a pasted key/value list instead: lines may
118
+ also be ``key=value`` or ``key<TAB>value`` and an empty line separates
119
+ hosts as well. Inside a block only a ``key:`` line ends it, so base64
120
+ lines ending in ``=`` stay part of a certificate.
121
+ """
122
+ entries, current, block = [], {}, None
123
+
124
+ def close_block():
125
+ if block:
126
+ current[block[0]] = _block_value(block[1], block[2])
127
+
128
+ def close_host():
129
+ if current:
130
+ entries.append(dict(current))
131
+ current.clear()
132
+
133
+ for number, line in enumerate(text.splitlines(), start=1):
134
+ if line.strip() == '---' or (key_value and not line.strip()):
135
+ close_block()
136
+ block = None
137
+ close_host()
138
+ continue
139
+ match = _FLAT_KEY.match(line.rstrip())
140
+ if match is None and key_value and block is None:
141
+ match = _KV_LINE.match(line.rstrip())
142
+ if match:
143
+ close_block()
144
+ block = None
145
+ key, value = match.group(1).strip(), (match.group(2) or '').strip()
146
+ if _BLOCK_INDICATOR.match(value):
147
+ block = (key, value, [])
148
+ else:
149
+ current[key] = _plain_value(value)
150
+ continue
151
+ if block:
152
+ block[2].append(line)
153
+ continue
154
+ if not line.strip() or line.lstrip().startswith('#'):
155
+ continue
156
+ raise ValueError(f"{filename}, line {number}: not a 'key: value' line")
157
+ close_block()
158
+ close_host()
159
+ return entries
160
+
161
+
162
+ def key_value_rows(text, filename='pasted text'):
163
+ """Rows of a pasted key/value list (see ``_flat_entries``)."""
164
+ return [{key: _cell(value) for key, value in entry.items()}
165
+ for entry in _flat_entries(text, filename, key_value=True)]
166
+
167
+
168
+ def yaml_rows(files):
169
+ """
170
+ Rows of the given ``(filename, text)`` YAML files, one dict per host.
171
+ A file may hold several hosts: a list of mappings, or several
172
+ documents separated by ``---`` (each a mapping or a list of them).
173
+
174
+ Files that are only YAML-like (block lines out of indentation, as
175
+ certificate chains often come) are read by a tolerant parser for flat
176
+ ``key: value`` files when strict YAML fails. Raises ValueError with a
177
+ short message naming the file and line when both fail.
178
+ """
179
+ rows = []
180
+ for filename, text in files:
181
+ try:
182
+ entries = _strict_entries(text)
183
+ except ValueError:
184
+ entries = _flat_entries(text, filename)
185
+ for entry in entries:
186
+ rows.append({str(key): _cell(value) for key, value in entry.items()})
187
+ return rows
188
+
189
+
190
+ def rows_columns(rows):
191
+ """``(columns, data_rows)`` of row dicts, columns in first-seen order."""
192
+ columns = []
193
+ for row in rows:
194
+ for key in row:
195
+ if key not in columns:
196
+ columns.append(key)
197
+ data_rows = [[row.get(col, '') for col in columns] for row in rows]
198
+ return columns, data_rows
199
+
200
+
201
+ def suggested_secret_columns(columns, hostname_column):
202
+ """Columns whose name looks like it holds a secret."""
203
+ return [col for col in columns
204
+ if col != hostname_column
205
+ and any(hint in col.lower() for hint in SECRET_HINTS)]
206
+
207
+
208
+ def split_secrets(row, secret_columns):
209
+ """Take the secret columns out of ``row``; returns them as a dict."""
210
+ secrets = {}
211
+ for col in secret_columns:
212
+ value = row.pop(col, None)
213
+ if value not in (None, ''):
214
+ secrets[col] = value
215
+ return secrets
216
+
217
+
218
+ def store_row_secrets(user, host, secrets, source):
219
+ """
220
+ Write ``secrets`` into the Secret Store, bound to ``host``, when
221
+ ``user`` may bind entries to that host. Returns ``(stored, refused)``.
222
+ """
223
+ if not secrets:
224
+ return 0, 0
225
+ if not can_bind(user, host):
226
+ return 0, len(secrets)
227
+ for key, value in secrets.items():
228
+ store_host_secret(host, key, value, source)
229
+ return len(secrets), 0
@@ -102,7 +102,12 @@ def update_import_host(host_obj, labels, config, **kwargs):
102
102
  the importing account. Saved only when the account may own it, a
103
103
  host of another master account stays as it is. Returns whether it
104
104
  was saved. Extra keywords go to `set_account()`.
105
+
106
+ A shadow source account only stores its labels as shadow data of
107
+ the host, see `Host.update_shadow()`.
105
108
  """
109
+ if config.get('shadow_mode'):
110
+ return host_obj.update_shadow(labels, config)
106
111
  host_obj.update_host(labels)
107
112
  if host_obj.set_account(account_dict=config, **kwargs):
108
113
  host_obj.save()
@@ -0,0 +1,202 @@
1
+ """
2
+ Jinja help for template fields
3
+
4
+ What the "Jinja help" panel next to a template field lists: the syncer's
5
+ own functions and filters, a few Jinja basics, the variables a rule hands
6
+ in and the existing lookup tables. Every entry has a snippet that a click
7
+ inserts into the field.
8
+
9
+ ``tests/test_jinja_help.py`` checks that every function and filter
10
+ registered in ``syncer_jinja`` has an entry here, so a new one cannot be
11
+ added without its help.
12
+ """
13
+ # pylint: disable=import-outside-toplevel
14
+ from application.docu_links import docu_links
15
+
16
+ # (name, snippet, description). The snippets are one line: the template
17
+ # fields are single line inputs. `attribute` stands for the name of a host
18
+ # attribute.
19
+ FUNCTIONS = (
20
+ ('lookup',
21
+ "{{ lookup('table', attribute, default='unknown') }}",
22
+ "Value of a lookup table (Modules > Lookup Tables) for a key: the second "
23
+ "column, or the column named as third argument."),
24
+ ('get_list',
25
+ "{% for item in get_list(attribute) %}{{ item }},{% endfor %}",
26
+ "Turns a list, a list literal or a comma separated string into a list."),
27
+ ('merge_list_of_dicts',
28
+ "{{ merge_list_of_dicts(attribute)['key'] }}",
29
+ "Merges a list of dicts into one dict, empty values are dropped."),
30
+ ('eval',
31
+ "{{ eval(attribute) }}",
32
+ "Reads a string holding a Python literal (list, dict, number)."),
33
+ ('defined',
34
+ "{{ defined(attribute, 'fallback') }}",
35
+ "The value, or the fallback when it is empty, 'false' or 'none'."),
36
+ ('hash_value',
37
+ "{{ hash_value(attribute) }}",
38
+ "Short stable hash of a value, e.g. to make a label of a long list."),
39
+ ('cmk_cleanup_tag_id',
40
+ "{{ cmk_cleanup_tag_id(attribute) }}",
41
+ "Cleans a value up to a valid Checkmk host tag id."),
42
+ ('cmk_cleanup_hostname',
43
+ "{{ cmk_cleanup_hostname(attribute) }}",
44
+ "Cleans a value up to a valid Checkmk host name."),
45
+ ('cmk_password',
46
+ "{{ cmk_password('name') }}",
47
+ "Checkmk password store reference of a global Secret Store entry."),
48
+ ('secret',
49
+ "{{ secret('key') }}",
50
+ "Checkmk password store reference of the Secret Store entry of this host "
51
+ "(or the global entry of that name)."),
52
+ ('secret_value',
53
+ "{{ secret_value('key') }}",
54
+ "Plaintext of that Secret Store entry, e.g. a certificate."),
55
+ ('get_ip_network',
56
+ "{{ get_ip_network(attribute) }}",
57
+ "Network of an address with mask: 10.1.2.3/255.255.255.0 gives "
58
+ "10.1.2.0/255.255.255.0."),
59
+ ('get_ip_interface',
60
+ "{{ get_ip_interface(attribute) }}",
61
+ "Address with prefix length: 10.1.2.3/255.255.255.0 gives 10.1.2.3/24."),
62
+ ('get_ip4_interface',
63
+ "{{ get_ip4_interface(attribute) }}",
64
+ "Same as get_ip_interface."),
65
+ ('datetime',
66
+ "{{ datetime.datetime.now().strftime('%Y-%m-%d') }}",
67
+ "The Python datetime module, e.g. for the current date."),
68
+ )
69
+
70
+ FILTERS = (
71
+ ('hash',
72
+ "{{ attribute | hash }}",
73
+ "Filter form of hash_value."),
74
+ )
75
+
76
+ BASICS = (
77
+ ('if / else',
78
+ "{% if attribute == 'value' %}yes{% else %}no{% endif %}",
79
+ "Different values depending on a condition."),
80
+ ('default',
81
+ "{{ attribute | default('unknown') }}",
82
+ "Fallback for a host without the attribute (otherwise the whole value "
83
+ "is empty)."),
84
+ ('lower / upper',
85
+ "{{ attribute | lower }}",
86
+ "Lower case (upper for upper case)."),
87
+ ('replace',
88
+ "{{ attribute | replace('old', 'new') }}",
89
+ "Replaces text in the value."),
90
+ ('split',
91
+ "{{ attribute.split('.')[0] }}",
92
+ "Part of a value, e.g. the short name of an FQDN."),
93
+ ('ACCOUNT',
94
+ "{{ACCOUNT:account_name:field}}",
95
+ "A field of an account, e.g. its address or password."),
96
+ )
97
+
98
+ # The variables the host based rules (Custom Attributes, Rewrite
99
+ # Attributes) hand in besides the host's attributes.
100
+ RULE_VARIABLES = (
101
+ ('HOSTNAME', "{{ HOSTNAME }}", "Name of the host."),
102
+ ('FIRST_MATCHING_TAG', "{{ FIRST_MATCHING_TAG }}",
103
+ "Attribute name the first condition of the rule matched."),
104
+ ('FIST_MATCHING_VALUE', "{{ FIST_MATCHING_VALUE }}",
105
+ "Attribute value the first condition of the rule matched."),
106
+ ('any attribute', "{{ attribute }}",
107
+ "Every attribute of the host is a variable of its own name."),
108
+ )
109
+
110
+ # The variables of a Checkmk Setup Rule rendered per host.
111
+ SETUP_RULE_VARIABLES = (
112
+ ('HOSTNAME', "{{ HOSTNAME }}", "Name of the host."),
113
+ ('HOST_FOLDER', "{{ HOST_FOLDER }}",
114
+ "Folder the host lands in (Checkmk > Export Rules: Move to Folder or "
115
+ "Pool Folder), e.g. as rule folder. Per host only: a rule from a list "
116
+ "or a Static Rule has no host."),
117
+ ('loop', "{{ loop }}",
118
+ "Current entry when Loop over List is set (loop_idx: its index)."),
119
+ ('any attribute', "{{ attribute }}",
120
+ "Every attribute of the host is a variable of its own name."),
121
+ )
122
+
123
+
124
+ # The variables of a Checkmk DCD Rule.
125
+ DCD_RULE_VARIABLES = (
126
+ ('HOSTNAME', "{{ HOSTNAME }}", "Name of the host."),
127
+ ('HOST_FOLDER', "{{ HOST_FOLDER }}",
128
+ "Folder the host lands in (Checkmk > Export Rules: Move to Folder or "
129
+ "Pool Folder), e.g. as folder of a creation rule. Per host only: a rule "
130
+ "from a list or a Static Rule has no host."),
131
+ ('HOST_POOL_SITE', "{{ HOST_POOL_SITE }}",
132
+ "Site the site pool assigned to the host in the host export (empty "
133
+ "without one), e.g. as site of the connection. Per host only."),
134
+ ('cmk_site', "{{ cmk_site }}",
135
+ "Checkmk site of the account the export runs for."),
136
+ ('account', "{{ account.address }}",
137
+ "A field or custom field of that account (passwords are left out)."),
138
+ ('any attribute', "{{ attribute }}",
139
+ "Every attribute of the host is a variable of its own name, from a "
140
+ "pasted list its columns."),
141
+ )
142
+
143
+ # How a password in the value of a Checkmk Setup Rule points to the Secret
144
+ # Store. Checkmk 2.3+ holds a password as such a tuple; a stored_password
145
+ # only names the ident the password export writes, the secret itself stays
146
+ # out of the rule.
147
+ CHECKMK_RULE_PASSWORDS = (
148
+ ('host secret',
149
+ "('cmk_postprocessed', 'stored_password', ('{{ secret(\"key\") }}', ''))",
150
+ "Replaces the password tuple in the value with a reference to the "
151
+ "Secret Store entry of this host (or the global entry of that name), "
152
+ "e.g. one an import stored. Export the passwords to Checkmk first."),
153
+ ('global secret',
154
+ "('cmk_postprocessed', 'stored_password', ('{{ cmk_password(\"name\") }}', ''))",
155
+ "The same with a global Secret Store entry. An "
156
+ "('cmk_postprocessed', 'explicit_password', ...) tuple of a rule copied "
157
+ "from Checkmk is replaced like this; Checkmk shows its secret only as "
158
+ "******."),
159
+ )
160
+
161
+
162
+ def _entries(group, items):
163
+ return [{'group': group, 'name': name, 'snippet': snippet, 'text': text}
164
+ for name, snippet, text in items]
165
+
166
+
167
+ def lookup_tables():
168
+ """
169
+ Name and columns of every lookup table. Only the header line is
170
+ parsed: a table can be long and the panel needs nothing else.
171
+ """
172
+ from application.models.lookup_table import LookupTable
173
+ from application.modules.rule.list_source import parse_list_source
174
+ tables = []
175
+ for entry in LookupTable.objects.only('name', 'entries').order_by('name'):
176
+ header = (entry.entries or '').strip('\r\n').split('\n', 1)[0]
177
+ columns = parse_list_source(header).columns
178
+ tables.append({'name': entry.name, 'key': columns[0] if columns else '',
179
+ 'columns': columns[1:]})
180
+ return tables
181
+
182
+
183
+ def jinja_help(fields, note='', variables=RULE_VARIABLES, extra=()):
184
+ """
185
+ What the help panel of a form needs: the fields (outcome field names)
186
+ it is shown for, a note on when they are rendered, the entries (with
187
+ the variables the form's rule hands in, then the ``(group, items)``
188
+ pairs of ``extra``) and the lookup tables.
189
+ """
190
+ entries = _entries('Variables', variables)
191
+ for group, items in extra:
192
+ entries += _entries(group, items)
193
+ return {
194
+ 'fields': list(fields),
195
+ 'note': note,
196
+ 'entries': (entries
197
+ + _entries('Syncer functions', FUNCTIONS)
198
+ + _entries('Syncer filters', FILTERS)
199
+ + _entries('Jinja basics', BASICS)),
200
+ 'tables': lookup_tables(),
201
+ 'docs': docu_links['jinja_functions'],
202
+ }