cmdbsyncer 4.3.4__tar.gz → 4.4.0__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 (501) hide show
  1. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/PKG-INFO +37 -36
  2. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/README.md +36 -35
  3. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/__init__.py +11 -0
  4. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/api/syncer.py +123 -4
  5. cmdbsyncer-4.4.0/application/buildinfo.txt +1 -0
  6. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/changelog/v4.3.md +27 -0
  7. cmdbsyncer-4.4.0/application/changelog/v4.4.md +47 -0
  8. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/config.py +12 -0
  9. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/docu_links.py +1 -0
  10. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/helpers/get_account.py +38 -4
  11. cmdbsyncer-4.4.0/application/helpers/import_hostnames.py +110 -0
  12. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/helpers/inventory.py +38 -27
  13. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/helpers/local_config_presets.py +11 -0
  14. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/helpers/plugins.py +8 -0
  15. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/helpers/syncer_jinja.py +79 -10
  16. cmdbsyncer-4.4.0/application/helpers/timezone.py +97 -0
  17. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/mcp_server.py +1 -1
  18. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/models/account.py +9 -2
  19. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/models/host.py +83 -231
  20. cmdbsyncer-4.4.0/application/models/host_create_time.py +31 -0
  21. cmdbsyncer-4.4.0/application/models/host_labels.py +222 -0
  22. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/module_registry.py +24 -0
  23. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/modules/plugin.py +194 -15
  24. cmdbsyncer-4.4.0/application/modules/rule/list_source.py +277 -0
  25. cmdbsyncer-4.4.0/application/modules/rule/list_source_views.py +259 -0
  26. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/modules/rule/match.py +71 -0
  27. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/modules/rule/models.py +70 -2
  28. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/modules/rule/rule.py +135 -4
  29. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/modules/rule/views.py +2 -0
  30. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/modules/search_parser.py +136 -13
  31. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/ansible/__init__.py +8 -10
  32. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/ansible/admin_views.py +21 -0
  33. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/ansible/inventory.py +20 -1
  34. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/ansible/models.py +9 -3
  35. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/ansible/playbook_rules.py +46 -23
  36. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/ansible/runner.py +63 -1
  37. cmdbsyncer-4.4.0/application/plugins/ansible/tests/__init__.py +1 -0
  38. cmdbsyncer-4.4.0/application/plugins/ansible/tests/test_runner_ssh_env.py +86 -0
  39. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/ansible/views.py +24 -12
  40. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/bmc_remedy/bmc_remedy.py +6 -9
  41. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/__init__.py +22 -2
  42. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/admin_views.py +25 -1
  43. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/bi.py +12 -22
  44. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/cmk2.py +16 -2
  45. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/cmk_rules.py +300 -38
  46. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/data_quality.py +1 -1
  47. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/dcd.py +63 -22
  48. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/downtimes.py +32 -4
  49. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/groups.py +21 -85
  50. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/helpers.py +67 -1
  51. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/import_v2.py +5 -11
  52. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/inits.py +36 -2
  53. cmdbsyncer-4.4.0/application/plugins/checkmk/list_source.py +59 -0
  54. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/models.py +27 -36
  55. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/notification_rules.py +66 -49
  56. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/syncer.py +365 -29
  57. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/tags.py +90 -41
  58. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/tests/test_cmk2.py +36 -0
  59. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/tests/test_cmk_rules.py +260 -0
  60. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/tests/test_dcd.py +123 -1
  61. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/tests/test_downtimes.py +38 -1
  62. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/tests/test_import_v2.py +5 -5
  63. cmdbsyncer-4.4.0/application/plugins/checkmk/tests/test_list_source.py +329 -0
  64. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/tests/test_notification_rules.py +248 -14
  65. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/tests/test_syncer.py +311 -3
  66. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/tests/test_tags.py +84 -51
  67. cmdbsyncer-4.4.0/application/plugins/checkmk/tests/test_user_generation.py +632 -0
  68. cmdbsyncer-4.4.0/application/plugins/checkmk/user_generation.py +399 -0
  69. cmdbsyncer-4.4.0/application/plugins/checkmk/user_models.py +105 -0
  70. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/users.py +26 -17
  71. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/views.py +469 -92
  72. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/cisco_dna/syncer.py +9 -8
  73. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/csv/csv.py +11 -19
  74. cmdbsyncer-4.4.0/application/plugins/eda/__init__.py +75 -0
  75. cmdbsyncer-4.4.0/application/plugins/eda/admin_views.py +32 -0
  76. cmdbsyncer-4.4.0/application/plugins/eda/models.py +151 -0
  77. cmdbsyncer-4.4.0/application/plugins/eda/plugin.json +23 -0
  78. cmdbsyncer-4.4.0/application/plugins/eda/repeats.py +182 -0
  79. cmdbsyncer-4.4.0/application/plugins/eda/rules.py +70 -0
  80. cmdbsyncer-4.4.0/application/plugins/eda/sender.py +180 -0
  81. cmdbsyncer-4.4.0/application/plugins/eda/tests/__init__.py +1 -0
  82. cmdbsyncer-4.4.0/application/plugins/eda/tests/test_eda.py +183 -0
  83. cmdbsyncer-4.4.0/application/plugins/eda/tests/test_repeats.py +203 -0
  84. cmdbsyncer-4.4.0/application/plugins/eda/views.py +261 -0
  85. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/idoit/__init__.py +1 -1
  86. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/idoit/models.py +5 -2
  87. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/idoit/rules.py +4 -6
  88. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/idoit/syncer.py +27 -26
  89. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/idoit/views.py +10 -1
  90. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/jdisc/devices.py +8 -15
  91. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/jira/jira.py +5 -7
  92. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/jira_cloud/export.py +20 -10
  93. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/jira_cloud/jira_cloud.py +3 -6
  94. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/jira_cloud/models.py +5 -2
  95. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/jira_cloud/views.py +11 -1
  96. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/ldap/ldap.py +141 -16
  97. cmdbsyncer-4.4.0/application/plugins/ldap/plugin.json +38 -0
  98. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/ldap/views.py +10 -3
  99. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/maintenance/__init__.py +4 -2
  100. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/mysql/mysql.py +12 -21
  101. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/netbox/__init__.py +60 -0
  102. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/netbox/admin_views.py +5 -3
  103. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/netbox/dataflow.py +4 -8
  104. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/netbox/devices.py +46 -35
  105. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/netbox/interfaces.py +101 -76
  106. cmdbsyncer-4.4.0/application/plugins/netbox/ips.py +157 -0
  107. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/netbox/models.py +42 -11
  108. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/netbox/netbox.py +3 -7
  109. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/netbox/views.py +43 -2
  110. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/netbox/virtualmachines.py +47 -35
  111. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/prtg/prtg.py +4 -8
  112. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/pyodbc/pyodbc.py +9 -21
  113. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/rest/rest.py +6 -17
  114. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/rules/rule_definitions.py +6 -1
  115. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/servicenow/syncer.py +23 -23
  116. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/servicenow/tests/test_table_request.py +60 -11
  117. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/vmware/custom_attributes.py +22 -11
  118. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/vmware/models.py +5 -2
  119. cmdbsyncer-4.4.0/application/plugins/vmware/views.py +24 -0
  120. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/yml/yml.py +6 -17
  121. cmdbsyncer-4.4.0/application/templates/_timezone.html +28 -0
  122. cmdbsyncer-4.4.0/application/templates/admin/checkmk_list_rule_debug.html +84 -0
  123. cmdbsyncer-4.4.0/application/templates/admin/checkmk_user_generation_preview.html +225 -0
  124. cmdbsyncer-4.4.0/application/templates/admin/checkmk_user_generation_rule_list.html +15 -0
  125. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/data_quality.html +2 -2
  126. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/host_inventory_tree.html +2 -2
  127. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/host_list.html +2 -0
  128. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/host_timeline.html +2 -2
  129. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/ldap_search.html +39 -4
  130. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/master.html +12 -2
  131. cmdbsyncer-4.4.0/application/templates/admin/model/_list_source_preview.html +190 -0
  132. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/model/checkmk_rule_mngmt_create.html +1 -0
  133. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/model/checkmk_rule_mngmt_edit.html +1 -0
  134. cmdbsyncer-4.4.0/application/templates/admin/model/list_source_create.html +8 -0
  135. cmdbsyncer-4.4.0/application/templates/admin/model/list_source_edit.html +8 -0
  136. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/object_list.html +2 -0
  137. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/api_tokens.html +3 -3
  138. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/base.html +1 -0
  139. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/debug_host.html +14 -6
  140. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/views/account.py +22 -4
  141. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/views/cron.py +6 -1
  142. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/views/host.py +218 -170
  143. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/views/host_filters.py +6 -2
  144. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/views/host_renderers.py +7 -2
  145. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/cmdbsyncer.egg-info/PKG-INFO +37 -36
  146. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/cmdbsyncer.egg-info/SOURCES.txt +46 -0
  147. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/pyproject.toml +1 -1
  148. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/syncerapi/v1/__init__.py +1 -0
  149. cmdbsyncer-4.4.0/tests/test_ansible_cmk_roles.py +282 -0
  150. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_api.py +52 -0
  151. cmdbsyncer-4.4.0/tests/test_eda_web_smoke.py +124 -0
  152. cmdbsyncer-4.4.0/tests/test_host_create_time.py +91 -0
  153. cmdbsyncer-4.4.0/tests/test_host_roundtrip_smoke.py +501 -0
  154. cmdbsyncer-4.4.0/tests/test_import_hostnames.py +362 -0
  155. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_jinja_get_list.py +12 -0
  156. cmdbsyncer-4.4.0/tests/test_ldap_search_filter.py +59 -0
  157. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_logging_config.py +17 -8
  158. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_plugin.py +158 -1
  159. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_rule.py +157 -0
  160. cmdbsyncer-4.4.0/tests/test_rule_list_rows.py +265 -0
  161. cmdbsyncer-4.4.0/tests/test_rule_list_source.py +243 -0
  162. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_rule_match.py +193 -0
  163. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_search_parser.py +136 -0
  164. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_security_fixes.py +7 -0
  165. cmdbsyncer-4.4.0/tests/test_timezone.py +121 -0
  166. cmdbsyncer-4.4.0/tests/test_web_account_password_chars.py +137 -0
  167. cmdbsyncer-4.4.0/tests/test_web_account_password_deferred_save.py +183 -0
  168. cmdbsyncer-4.4.0/tests/test_web_ansible_account_inventory.py +107 -0
  169. cmdbsyncer-4.4.0/tests/test_web_debug_pages.py +120 -0
  170. cmdbsyncer-4.4.0/tests/test_web_list_source.py +123 -0
  171. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_web_requests_smoke.py +60 -0
  172. cmdbsyncer-4.3.4/application/buildinfo.txt +0 -1
  173. cmdbsyncer-4.3.4/application/plugins/ldap/plugin.json +0 -24
  174. cmdbsyncer-4.3.4/application/plugins/netbox/ips.py +0 -112
  175. cmdbsyncer-4.3.4/application/plugins/vmware/views.py +0 -15
  176. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/LICENSE +0 -0
  177. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/_version.py +0 -0
  178. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/api/__init__.py +0 -0
  179. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/api/inventory.py +0 -0
  180. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/api/objects.py +0 -0
  181. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/api/rules.py +0 -0
  182. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/api/views.py +0 -0
  183. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/auth/views.py +0 -0
  184. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/changelog/.pages +0 -0
  185. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/changelog/v3.10.md +0 -0
  186. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/changelog/v3.11.md +0 -0
  187. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/changelog/v3.12.md +0 -0
  188. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/changelog/v3.5.md +0 -0
  189. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/changelog/v3.7.md +0 -0
  190. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/changelog/v3.8.md +0 -0
  191. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/changelog/v3.9.md +0 -0
  192. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/changelog/v4.0.md +0 -0
  193. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/changelog/v4.1.md +0 -0
  194. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/changelog/v4.2.md +0 -0
  195. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/cli.py +0 -0
  196. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/enterprise.py +0 -0
  197. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/helpers/__init__.py +0 -0
  198. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/helpers/audit.py +0 -0
  199. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/helpers/cron.py +0 -0
  200. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/helpers/db_analysis.py +0 -0
  201. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/helpers/host_maintenance.py +0 -0
  202. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/helpers/label_hash.py +0 -0
  203. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/helpers/label_history.py +0 -0
  204. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/helpers/local_config_file.py +0 -0
  205. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/helpers/mongo_keys.py +0 -0
  206. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/helpers/notification_channels.py +0 -0
  207. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/helpers/notification_dispatch.py +0 -0
  208. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/helpers/retention.py +0 -0
  209. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/helpers/sates.py +0 -0
  210. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/helpers/sql.py +0 -0
  211. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/helpers/stale_indexes.py +0 -0
  212. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/helpers/tablib_formater.py +0 -0
  213. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/helpers/tests/__init__.py +0 -0
  214. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/helpers/tests/test_sql.py +0 -0
  215. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/models/__init__.py +0 -0
  216. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/models/config.py +0 -0
  217. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/models/cron.py +0 -0
  218. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/models/field_approval.py +0 -0
  219. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/models/forms.py +0 -0
  220. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/models/host_cleanup.py +0 -0
  221. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/models/host_inventory_tree.py +0 -0
  222. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/models/host_label_event.py +0 -0
  223. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/models/host_templates.py +0 -0
  224. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/models/notification_channel.py +0 -0
  225. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/models/notification_rule.py +0 -0
  226. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/models/notification_state.py +0 -0
  227. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/models/project.py +0 -0
  228. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/models/saved_search.py +0 -0
  229. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/models/states.py +0 -0
  230. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/models/user.py +0 -0
  231. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/modules/__init__.py +0 -0
  232. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/modules/custom_attributes/models.py +0 -0
  233. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/modules/custom_attributes/rules.py +0 -0
  234. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/modules/custom_attributes/views.py +0 -0
  235. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/modules/debug.py +0 -0
  236. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/modules/email.py +0 -0
  237. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/modules/inventory/__init__.py +0 -0
  238. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/modules/log/command_output.py +0 -0
  239. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/modules/log/log.py +0 -0
  240. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/modules/log/models.py +0 -0
  241. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/modules/log/views.py +0 -0
  242. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/modules/rule/__init__.py +0 -0
  243. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/modules/rule/filter.py +0 -0
  244. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/modules/rule/rewrite.py +0 -0
  245. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/modules/statefile.py +0 -0
  246. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/notices/strict_certificate_verification.txt +0 -0
  247. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/__init__.py +0 -0
  248. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/ansible/plugin.json +0 -0
  249. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/ansible/rules.py +0 -0
  250. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/ansible/seed.py +0 -0
  251. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/ansible/site_syncer.py +0 -0
  252. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/bmc_remedy/__init__.py +0 -0
  253. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/bmc_remedy/plugin.json +0 -0
  254. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/folder_attributes.py +0 -0
  255. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/import_v1.py +0 -0
  256. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/inventorize.py +0 -0
  257. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/passwords.py +0 -0
  258. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/plugin.json +0 -0
  259. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/poolfolder.py +0 -0
  260. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/rule_analysis_runner.py +0 -0
  261. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/rule_passwords.py +0 -0
  262. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/rules.py +0 -0
  263. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/rulesets_catalog.py +0 -0
  264. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/sitepool.py +0 -0
  265. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/sites.py +0 -0
  266. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/tests/__init__.py +0 -0
  267. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/tests/test_assign_template.py +0 -0
  268. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/tests/test_bi.py +0 -0
  269. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/tests/test_cmk_conditions.py +0 -0
  270. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/tests/test_data_quality.py +0 -0
  271. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/tests/test_groups.py +0 -0
  272. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/tests/test_helpers.py +0 -0
  273. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/tests/test_import_v1.py +0 -0
  274. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/tests/test_inventorize.py +0 -0
  275. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/tests/test_passwords.py +0 -0
  276. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/tests/test_poolfolder.py +0 -0
  277. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/tests/test_rule_analysis_runner.py +0 -0
  278. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/tests/test_rule_passwords.py +0 -0
  279. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/tests/test_rules.py +0 -0
  280. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/tests/test_sitepool.py +0 -0
  281. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/tests/test_sites.py +0 -0
  282. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/checkmk/tests/test_users.py +0 -0
  283. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/cisco_dna/__init__.py +0 -0
  284. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/cisco_dna/plugin.json +0 -0
  285. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/cron.py +0 -0
  286. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/csv/__init__.py +0 -0
  287. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/csv/plugin.json +0 -0
  288. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/file_requests.py +0 -0
  289. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/idoit/admin_views.py +0 -0
  290. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/idoit/plugin.json +0 -0
  291. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/jdisc/__init__.py +0 -0
  292. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/jdisc/applications.py +0 -0
  293. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/jdisc/executables.py +0 -0
  294. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/jdisc/jdisc.py +0 -0
  295. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/jdisc/plugin.json +0 -0
  296. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/jira/__init__.py +0 -0
  297. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/jira/plugin.json +0 -0
  298. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/jira_cloud/__init__.py +0 -0
  299. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/jira_cloud/admin_views.py +0 -0
  300. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/jira_cloud/plugin.json +0 -0
  301. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/jira_cloud/rules.py +0 -0
  302. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/jira_cloud/schema_sync.py +0 -0
  303. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/jira_cloud/tests/__init__.py +0 -0
  304. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/jira_cloud/tests/test_attribute_value.py +0 -0
  305. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/json/__init__.py +0 -0
  306. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/json/json.py +0 -0
  307. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/json/plugin.json +0 -0
  308. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/ldap/__init__.py +0 -0
  309. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/ldap/admin_views.py +0 -0
  310. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/maintenance/db_commands.py +0 -0
  311. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/maintenance/plugin.json +0 -0
  312. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/maintenance/tests/__init__.py +0 -0
  313. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/maintenance/tests/test_delete_all_hosts.py +0 -0
  314. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/maintenance/tests/test_delete_inventory.py +0 -0
  315. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/mssql/__init__.py +0 -0
  316. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/mssql/plugin.json +0 -0
  317. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/mysql/__init__.py +0 -0
  318. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/mysql/plugin.json +0 -0
  319. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/netbox/cluster.py +0 -0
  320. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/netbox/contacts.py +0 -0
  321. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/netbox/networks.py +0 -0
  322. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/netbox/plugin.json +0 -0
  323. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/netbox/prefixes.py +0 -0
  324. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/netbox/rules.py +0 -0
  325. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/netbox/tests/__init__.py +0 -0
  326. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/netbox/tests/test_import_filter.py +0 -0
  327. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/netbox/utils.py +0 -0
  328. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/prtg/__init__.py +0 -0
  329. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/prtg/plugin.json +0 -0
  330. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/pyodbc/__init__.py +0 -0
  331. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/pyodbc/plugin.json +0 -0
  332. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/rest/__init__.py +0 -0
  333. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/rest/plugin.json +0 -0
  334. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/rules/__init__.py +0 -0
  335. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/rules/admin_views.py +0 -0
  336. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/rules/autorules.py +0 -0
  337. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/rules/models.py +0 -0
  338. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/rules/plugin.json +0 -0
  339. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/rules/rule_import_export.py +0 -0
  340. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/rules/views.py +0 -0
  341. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/servicenow/__init__.py +0 -0
  342. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/servicenow/admin_views.py +0 -0
  343. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/servicenow/plugin.json +0 -0
  344. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/servicenow/tests/__init__.py +0 -0
  345. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/servicenow/views.py +0 -0
  346. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/syncer_shell.py +0 -0
  347. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/vmware/__init__.py +0 -0
  348. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/vmware/admin_views.py +0 -0
  349. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/vmware/plugin.json +0 -0
  350. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/vmware/rules.py +0 -0
  351. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/vmware/vmware.py +0 -0
  352. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/yml/__init__.py +0 -0
  353. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins/yml/plugin.json +0 -0
  354. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/plugins_cli.py +0 -0
  355. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/static/cmdbsyncer_mark.png +0 -0
  356. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/static/css/cmdbsyncer.css +0 -0
  357. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/static/favicon.png +0 -0
  358. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/static/js/Sortable.min.js +0 -0
  359. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/static/js/main.js +0 -0
  360. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/static/logo_white.png +0 -0
  361. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/static/vendor/README.md +0 -0
  362. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/static/vendor/ansible.svg +0 -0
  363. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/static/vendor/checkmk.svg +0 -0
  364. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/static/vendor/idoit.svg +0 -0
  365. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/static/vendor/jira.svg +0 -0
  366. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/static/vendor/netbox.svg +0 -0
  367. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/static/vendor/vmware.svg +0 -0
  368. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/_brand.html +0 -0
  369. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/_theme.html +0 -0
  370. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/_host_tabs.html +0 -0
  371. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/account_create.html +0 -0
  372. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/account_edit.html +0 -0
  373. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/account_field_help.html +0 -0
  374. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/account_pick_type.html +0 -0
  375. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/ansible_playbook_run.html +0 -0
  376. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/ansible_project_detail.html +0 -0
  377. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/ansible_rule_list.html +0 -0
  378. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/ansible_run_details.html +0 -0
  379. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/assign_project_form.html +0 -0
  380. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/bulk_label_form.html +0 -0
  381. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/changelog_archive.html +0 -0
  382. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/checkmk_data_quality.html +0 -0
  383. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/checkmk_rule_mngmt_list.html +0 -0
  384. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/checkmk_rule_optimization.html +0 -0
  385. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/checkmk_settings_list.html +0 -0
  386. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/checkmk_test_folder_scope.html +0 -0
  387. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/copy_as_new_form.html +0 -0
  388. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/data_quality_lowercase_preview.html +0 -0
  389. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/file/list.html +0 -0
  390. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/file/modals/form.html +0 -0
  391. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/first_steps.html +0 -0
  392. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/host_csv_import_preview.html +0 -0
  393. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/host_details.html +0 -0
  394. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/host_edit.html +0 -0
  395. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/host_relations_graph.html +0 -0
  396. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/index.html +0 -0
  397. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/local_config_editor.html +0 -0
  398. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/model/_action_picker.html +0 -0
  399. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/model/_folder_builder.html +0 -0
  400. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/model/_notification_plugin_picker.html +0 -0
  401. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/model/_ruleset_autocomplete.html +0 -0
  402. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/model/checkmk_notification_rule_create.html +0 -0
  403. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/model/checkmk_notification_rule_edit.html +0 -0
  404. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/model/checkmk_rule_create.html +0 -0
  405. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/model/checkmk_rule_edit.html +0 -0
  406. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/model/clone_confirm.html +0 -0
  407. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/model/inline_list_base.html +0 -0
  408. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/module_overview.html +0 -0
  409. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/project_edit.html +0 -0
  410. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/project_import.html +0 -0
  411. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/project_import_cmk.html +0 -0
  412. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/project_list.html +0 -0
  413. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/project_overview.html +0 -0
  414. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/servicenow_query.html +0 -0
  415. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/set_account_form.html +0 -0
  416. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/set_cmk_version_form.html +0 -0
  417. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/admin/set_template_form.html +0 -0
  418. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/change_password.html +0 -0
  419. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/csrf_error.html +0 -0
  420. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/debug.html +0 -0
  421. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/email/newuser.html +0 -0
  422. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/email/notification.html +0 -0
  423. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/email/resetpassword.html +0 -0
  424. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/formular.html +0 -0
  425. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/license_info.html +0 -0
  426. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/login.html +0 -0
  427. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/logout_confirm.html +0 -0
  428. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/request_password.html +0 -0
  429. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/set_2fa.html +0 -0
  430. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/templates/set_theme.html +0 -0
  431. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/themes/dracula.css +0 -0
  432. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/themes/gruvbox-dark.css +0 -0
  433. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/themes/gruvbox-light.css +0 -0
  434. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/themes/nord.css +0 -0
  435. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/themes_registry.py +0 -0
  436. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/views/_form_fields.py +0 -0
  437. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/views/_form_sections.py +0 -0
  438. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/views/account_select.py +0 -0
  439. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/views/config.py +0 -0
  440. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/views/data_quality.py +0 -0
  441. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/views/default.py +0 -0
  442. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/views/field_approval.py +0 -0
  443. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/views/fileadmin.py +0 -0
  444. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/views/first_steps.py +0 -0
  445. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/views/host_inventory_grid.py +0 -0
  446. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/views/host_widgets.py +0 -0
  447. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/views/license.py +0 -0
  448. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/views/menu_links.py +0 -0
  449. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/views/module_overview.py +0 -0
  450. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/views/notification_channel.py +0 -0
  451. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/views/notification_rule.py +0 -0
  452. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/views/project.py +0 -0
  453. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/views/saved_search.py +0 -0
  454. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/views/template_select.py +0 -0
  455. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/application/views/user.py +0 -0
  456. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/cmdbsyncer.egg-info/dependency_links.txt +0 -0
  457. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/cmdbsyncer.egg-info/entry_points.txt +0 -0
  458. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/cmdbsyncer.egg-info/requires.txt +0 -0
  459. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/cmdbsyncer.egg-info/top_level.txt +0 -0
  460. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/requirements-ansible-windows.txt +0 -0
  461. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/requirements-ansible.txt +0 -0
  462. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/requirements-extras.txt +0 -0
  463. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/requirements.txt +0 -0
  464. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/setup.cfg +0 -0
  465. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/syncerapi/__init__.py +0 -0
  466. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/syncerapi/v1/core/__init__.py +0 -0
  467. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/syncerapi/v1/inventory/__init__.py +0 -0
  468. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/syncerapi/v1/rest/__init__.py +0 -0
  469. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_account_macro.py +0 -0
  470. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_api_csrf_invariant.py +0 -0
  471. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_config_dir.py +0 -0
  472. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_cron_missing_account.py +0 -0
  473. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_csrf_config.py +0 -0
  474. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_data_quality_duplicates.py +0 -0
  475. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_default_view.py +0 -0
  476. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_disabled_row_style.py +0 -0
  477. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_enterprise_quiet.py +0 -0
  478. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_folder_builder_js.py +0 -0
  479. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_global_account_presets.py +0 -0
  480. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_host_cleanup.py +0 -0
  481. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_host_label_edit.py +0 -0
  482. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_host_template_filter.py +0 -0
  483. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_host_template_resync.py +0 -0
  484. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_jinja_hash.py +0 -0
  485. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_label_history.py +0 -0
  486. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_local_config_presets.py +0 -0
  487. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_model_indexes.py +0 -0
  488. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_mongo_keys.py +0 -0
  489. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_plugin_ssti.py +0 -0
  490. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_plugins_cli.py +0 -0
  491. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_regex_condition_limits.py +0 -0
  492. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_rule_export_templates.py +0 -0
  493. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_rule_filename_detect.py +0 -0
  494. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_rule_import_override.py +0 -0
  495. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_rule_registry_complete.py +0 -0
  496. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_stale_indexes.py +0 -0
  497. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_template_merge_fields.py +0 -0
  498. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_user_scope_smoke.py +0 -0
  499. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_view_permission_flags.py +0 -0
  500. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_web_boot_smoke.py +0 -0
  501. {cmdbsyncer-4.3.4 → cmdbsyncer-4.4.0}/tests/test_webhook_token_hash.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cmdbsyncer
3
- Version: 4.3.4
3
+ Version: 4.4.0
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>
@@ -102,31 +102,24 @@ CMDBsyncer is a powerful, web-based tool designed to solve the complex challenge
102
102
 
103
103
  ## ⚡ Quick Start
104
104
 
105
- Get started quickly using Docker Compose:
105
+ Every release is published as a container image — nothing to clone, nothing to build:
106
106
 
107
107
  ```bash
108
- # Clone the repository
109
- git clone https://github.com/your-username/cmdbsyncer.git
110
- cd cmdbsyncer
111
-
112
- # For production: check out the last released version.
113
- # For testing the bleeding edge: stay on main.
114
- git checkout stable
115
-
116
- # Start the application
117
- ./helper up
118
-
119
- # Access the container
120
- ./helper shell
108
+ # Fetch the compose file and start CMDBsyncer together with its MongoDB
109
+ curl -O https://raw.githubusercontent.com/kuhn-ruess/cmdbsyncer/main/docker-compose.registry.yml
110
+ docker compose -f docker-compose.registry.yml up -d
121
111
 
122
112
  # Create your first user
123
- ./helper create_user 'your-email@example.com'
113
+ docker compose -f docker-compose.registry.yml exec api \
114
+ ./cmdbsyncer sys create_user 'your-email@example.com'
124
115
 
125
- # Access the web interface
126
- # Open http://your-host:5003 in your browser
116
+ # Open http://your-host:8080 in your browser
127
117
  ```
128
118
 
129
- This runs a development version that you can use to test everything.
119
+ The compose file tracks `latest`. Replace the tag with `4.3.3` to pin a release
120
+ or with `4.3` to stay on a minor line; the images cover `linux/amd64` and
121
+ `linux/arm64`. Full walkthrough — configuration volume, upgrades, reverse proxy
122
+ — in [Installation with Docker](https://docs.cmdbsyncer.de/installation/setup_docker/).
130
123
 
131
124
  ## 📸 Screenshots
132
125
 
@@ -257,35 +250,43 @@ This runs a development version that you can use to test everything.
257
250
 
258
251
  ### Production Installation
259
252
 
260
- 1. **Clone the repository and pick a version**
253
+ 1. **Fetch the compose file**
261
254
  ```bash
262
- git clone https://github.com/your-username/cmdbsyncer.git
263
- cd cmdbsyncer
264
-
265
- # Use the stable branch (last released version) for production:
266
- git checkout stable
267
- # …or pin to a specific release tag for reproducible deployments:
268
- # git checkout v3.12.12
255
+ curl -O https://raw.githubusercontent.com/kuhn-ruess/cmdbsyncer/main/docker-compose.registry.yml
269
256
  ```
270
- See [RELEASE.md](RELEASE.md) for the full branching/versioning policy.
271
257
 
272
- 2. **Configure environment**
273
- ```bash
274
- # Copy and edit configuration files
275
- cp docker-compose.prod.yml docker-compose.yml
276
- # Edit the configuration as needed
277
- ```
258
+ 2. **Pick a version**
259
+
260
+ Edit the `image:` line. `ghcr.io/kuhn-ruess/cmdbsyncer:latest` follows every
261
+ release, `:4.3.3` pins one, `:4.3` stays on a minor line.
262
+ See [RELEASE.md](RELEASE.md) for the full branching/versioning policy.
278
263
 
279
264
  3. **Start the application**
280
265
  ```bash
281
- docker-compose up -d
266
+ docker compose -f docker-compose.registry.yml up -d
282
267
  ```
283
268
 
284
269
  4. **Create admin user**
285
270
  ```bash
286
- ./helper create_user 'admin@your-domain.com'
271
+ docker compose -f docker-compose.registry.yml exec api \
272
+ ./cmdbsyncer sys create_user 'admin@your-domain.com'
287
273
  ```
288
274
 
275
+ The `config` volume in that file holds `local_config.py`, and with it the key
276
+ every stored account password is encrypted with. Keep it across upgrades and
277
+ back it up together with the database.
278
+
279
+ #### Building the image yourself
280
+
281
+ For a fork, a custom base image or a preinstalled plugin:
282
+
283
+ ```bash
284
+ git clone https://github.com/kuhn-ruess/cmdbsyncer.git
285
+ cd cmdbsyncer
286
+ git checkout lts/3.12 # or a release tag: git checkout v4.3.3
287
+ docker compose up -d
288
+ ```
289
+
289
290
  ### Development Installation
290
291
 
291
292
  For development and testing purposes:
@@ -34,31 +34,24 @@ CMDBsyncer is a powerful, web-based tool designed to solve the complex challenge
34
34
 
35
35
  ## ⚡ Quick Start
36
36
 
37
- Get started quickly using Docker Compose:
37
+ Every release is published as a container image — nothing to clone, nothing to build:
38
38
 
39
39
  ```bash
40
- # Clone the repository
41
- git clone https://github.com/your-username/cmdbsyncer.git
42
- cd cmdbsyncer
43
-
44
- # For production: check out the last released version.
45
- # For testing the bleeding edge: stay on main.
46
- git checkout stable
47
-
48
- # Start the application
49
- ./helper up
50
-
51
- # Access the container
52
- ./helper shell
40
+ # Fetch the compose file and start CMDBsyncer together with its MongoDB
41
+ curl -O https://raw.githubusercontent.com/kuhn-ruess/cmdbsyncer/main/docker-compose.registry.yml
42
+ docker compose -f docker-compose.registry.yml up -d
53
43
 
54
44
  # Create your first user
55
- ./helper create_user 'your-email@example.com'
45
+ docker compose -f docker-compose.registry.yml exec api \
46
+ ./cmdbsyncer sys create_user 'your-email@example.com'
56
47
 
57
- # Access the web interface
58
- # Open http://your-host:5003 in your browser
48
+ # Open http://your-host:8080 in your browser
59
49
  ```
60
50
 
61
- This runs a development version that you can use to test everything.
51
+ The compose file tracks `latest`. Replace the tag with `4.3.3` to pin a release
52
+ or with `4.3` to stay on a minor line; the images cover `linux/amd64` and
53
+ `linux/arm64`. Full walkthrough — configuration volume, upgrades, reverse proxy
54
+ — in [Installation with Docker](https://docs.cmdbsyncer.de/installation/setup_docker/).
62
55
 
63
56
  ## 📸 Screenshots
64
57
 
@@ -189,35 +182,43 @@ This runs a development version that you can use to test everything.
189
182
 
190
183
  ### Production Installation
191
184
 
192
- 1. **Clone the repository and pick a version**
185
+ 1. **Fetch the compose file**
193
186
  ```bash
194
- git clone https://github.com/your-username/cmdbsyncer.git
195
- cd cmdbsyncer
196
-
197
- # Use the stable branch (last released version) for production:
198
- git checkout stable
199
- # …or pin to a specific release tag for reproducible deployments:
200
- # git checkout v3.12.12
187
+ curl -O https://raw.githubusercontent.com/kuhn-ruess/cmdbsyncer/main/docker-compose.registry.yml
201
188
  ```
202
- See [RELEASE.md](RELEASE.md) for the full branching/versioning policy.
203
189
 
204
- 2. **Configure environment**
205
- ```bash
206
- # Copy and edit configuration files
207
- cp docker-compose.prod.yml docker-compose.yml
208
- # Edit the configuration as needed
209
- ```
190
+ 2. **Pick a version**
191
+
192
+ Edit the `image:` line. `ghcr.io/kuhn-ruess/cmdbsyncer:latest` follows every
193
+ release, `:4.3.3` pins one, `:4.3` stays on a minor line.
194
+ See [RELEASE.md](RELEASE.md) for the full branching/versioning policy.
210
195
 
211
196
  3. **Start the application**
212
197
  ```bash
213
- docker-compose up -d
198
+ docker compose -f docker-compose.registry.yml up -d
214
199
  ```
215
200
 
216
201
  4. **Create admin user**
217
202
  ```bash
218
- ./helper create_user 'admin@your-domain.com'
203
+ docker compose -f docker-compose.registry.yml exec api \
204
+ ./cmdbsyncer sys create_user 'admin@your-domain.com'
219
205
  ```
220
206
 
207
+ The `config` volume in that file holds `local_config.py`, and with it the key
208
+ every stored account password is encrypted with. Keep it across upgrades and
209
+ back it up together with the database.
210
+
211
+ #### Building the image yourself
212
+
213
+ For a fork, a custom base image or a preinstalled plugin:
214
+
215
+ ```bash
216
+ git clone https://github.com/kuhn-ruess/cmdbsyncer.git
217
+ cd cmdbsyncer
218
+ git checkout lts/3.12 # or a release tag: git checkout v4.3.3
219
+ docker compose up -d
220
+ ```
221
+
221
222
  ### Development Installation
222
223
 
223
224
  For development and testing purposes:
@@ -467,6 +467,17 @@ if not CLI_MODE:
467
467
  insecure = False
468
468
  return {'show_https_warning': insecure}
469
469
 
470
+ @app.template_filter('localtime')
471
+ def _localtime(value, fmt='%Y-%m-%d %H:%M:%S'):
472
+ """
473
+ Render a stored (UTC) timestamp in the timezone of the browser
474
+ that asked for the page: ``{{ job.last_start|localtime }}``.
475
+ Storage stays UTC everywhere — this is presentation only.
476
+ """
477
+ # pylint: disable=import-outside-toplevel
478
+ from application.helpers.timezone import format_local
479
+ return format_local(value, fmt)
480
+
470
481
  bootstrap = Bootstrap(app)
471
482
 
472
483
  login_manager = LoginManager()
@@ -1,8 +1,9 @@
1
1
  """
2
2
  Syncer API.
3
3
 
4
- Read-only access to log entries, cron status, host counters, plus a
5
- webhook trigger for cron groups. Authenticated via ``@require_token``;
4
+ Read-only access to log entries, cron status, host counters, the
5
+ repeated Event Driven Ansible events, plus a webhook trigger for cron
6
+ groups. Authenticated via ``@require_token``;
6
7
  a user with ``api_roles = ['syncer']`` (or ``'all'``) can call this
7
8
  namespace. The ``/cron/trigger/<group>`` route additionally accepts an
8
9
  ``X-Webhook-Token`` header tied to the CronGroup, so external systems
@@ -14,12 +15,16 @@ from flask import request
14
15
  from flask_restx import Namespace, Resource, fields
15
16
 
16
17
  from application import log
17
- from application.api import require_token, scope_host_query
18
+ from application.api import (
19
+ api_scope_active, hostnames_in_scope, get_api_account_scope,
20
+ require_token, scope_host_query,
21
+ )
18
22
  from application.enterprise import run_hook as _ent_run_hook
19
23
  from application.helpers.audit import audit
20
24
  from application.modules.log.models import LogEntry
21
25
  from application.models.host import Host
22
26
  from application.models.cron import CronStats, CronGroup
27
+ from application.plugins.eda.repeats import DEFAULT_OFFENDER_LIMIT, collect_summary
23
28
 
24
29
  API = Namespace(
25
30
  'syncer',
@@ -98,6 +103,62 @@ HOSTS_STATS = API.model('hosts_stats', {
98
103
  description='Hosts whose ``last_import_seen`` is older than 24h'),
99
104
  })
100
105
 
106
+ EDA_COUNTS = {
107
+ 'events_24h': fields.Integer(description='Events sent (or tried) in '
108
+ 'the last 24 hours'),
109
+ 'failed_24h': fields.Integer(description='Of those, the ones the event '
110
+ 'stream did not accept'),
111
+ 'pending': fields.Integer(description='Open streaks below the '
112
+ 'threshold: sent, host still '
113
+ 'matches'),
114
+ 'repeating': fields.Integer(description='Open streaks at or above the '
115
+ 'threshold: sent again and '
116
+ 'again without effect'),
117
+ 'repeating_hosts': fields.Integer(description='Distinct hosts with a '
118
+ 'repeating event'),
119
+ 'failing': fields.Integer(description='Open streaks whose last send '
120
+ 'failed'),
121
+ 'max_sends': fields.Integer(description='Most sends of one open streak'),
122
+ }
123
+
124
+ EDA_ACCOUNT = API.model('eda_account', {
125
+ 'account': fields.String(description='EDA account the events go to'),
126
+ **EDA_COUNTS,
127
+ })
128
+
129
+ EDA_OFFENDER = API.model('eda_offender', {
130
+ 'account': fields.String(),
131
+ 'hostname': fields.String(),
132
+ 'event': fields.String(description='Event name as sent'),
133
+ 'rule': fields.String(description='Name of the Event Rule'),
134
+ 'rule_id': fields.String(),
135
+ 'sends': fields.Integer(description='Sends since the host matches'),
136
+ 'failures': fields.Integer(description='Of those, failed sends'),
137
+ 'threshold': fields.Integer(description='Threshold the streak was '
138
+ 'measured against'),
139
+ 'first_sent': fields.String(example='2026-10-10 06:00:00'),
140
+ 'last_sent': fields.String(example='2026-10-13 06:00:00'),
141
+ 'last_status': fields.String(example='success',
142
+ description='success or failure'),
143
+ 'last_http_status': fields.Integer(),
144
+ })
145
+
146
+ EDA_SUMMARY = API.model('eda_summary', {
147
+ **EDA_COUNTS,
148
+ 'min_sends': fields.Integer(description='Threshold override of the '
149
+ 'request, null = per account'),
150
+ 'accounts': fields.List(fields.Nested(EDA_ACCOUNT)),
151
+ 'offenders': fields.List(fields.Nested(EDA_OFFENDER),
152
+ description='Repeating streaks, most sends '
153
+ 'first'),
154
+ 'offenders_truncated': fields.Boolean(description='True when the '
155
+ 'limit cut the list'),
156
+ })
157
+
158
+ EDA_RESPONSE = API.model('eda_response', {
159
+ 'result': fields.Nested(EDA_SUMMARY),
160
+ })
161
+
101
162
  ERROR = API.model('error', {
102
163
  'error': fields.String(description='Human-readable error message'),
103
164
  })
@@ -371,7 +432,7 @@ class SyncerHostsApi(Resource):
371
432
  @require_token
372
433
  def get(self):
373
434
  """Return totals plus a 24-hour staleness counter."""
374
- ago_24h = datetime.now() - timedelta(hours=24)
435
+ ago_24h = datetime.utcnow() - timedelta(hours=24)
375
436
  # Restricted API users only see counters for the hosts they may
376
437
  # reach — their accounts, carrying their templates.
377
438
  return {
@@ -385,3 +446,61 @@ class SyncerHostsApi(Resource):
385
446
  last_import_seen__lt=ago_24h,
386
447
  )).count(),
387
448
  }, 200
449
+
450
+
451
+ def _int_arg(name, default, minimum):
452
+ """An integer query argument, None when it is not valid."""
453
+ value = request.args.get(name)
454
+ if value in (None, ''):
455
+ return default
456
+ try:
457
+ number = int(value)
458
+ except ValueError:
459
+ return None
460
+ return number if number >= minimum else None
461
+
462
+
463
+ def _eda_hostname_filter():
464
+ """Hosts a restricted API user may see, None when unrestricted."""
465
+ if not api_scope_active():
466
+ return None
467
+ scope = get_api_account_scope()
468
+
469
+ def allowed(hostnames):
470
+ return hostnames_in_scope(hostnames, scope)
471
+ return allowed
472
+
473
+
474
+ @API.route('/eda')
475
+ class SyncerEdaApi(Resource):
476
+ """Event Driven Ansible: events sent again and again without effect."""
477
+
478
+ @API.doc(security=['basicAuth', 'apiToken'], params={
479
+ 'account': 'Only this EDA account',
480
+ 'min_sends': 'Count a streak as repeating from this many sends on, '
481
+ 'instead of the repeat_threshold of each account',
482
+ 'limit': f'Most offenders listed (default {DEFAULT_OFFENDER_LIMIT})',
483
+ })
484
+ @API.response(200, 'Counters and repeating events.', EDA_RESPONSE)
485
+ @API.response(400, 'Invalid query argument', ERROR)
486
+ @API.response(401, 'Authentication failed', ERROR)
487
+ @require_token
488
+ def get(self):
489
+ """Return how many events repeat without effect, and which.
490
+
491
+ A streak starts when a host matches an Event Rule and counts
492
+ every send of that event. It ends (resolved) on the first run in
493
+ which the host no longer gives the event. A streak that is still
494
+ open after ``repeat_threshold`` sends (account field, default 3)
495
+ is repeating.
496
+ """
497
+ min_sends = _int_arg('min_sends', None, 1)
498
+ limit = _int_arg('limit', DEFAULT_OFFENDER_LIMIT, 0)
499
+ if (request.args.get('min_sends') and min_sends is None) or limit is None:
500
+ return {'error': 'min_sends must be >= 1, limit >= 0'}, 400
501
+ return {
502
+ 'result': collect_summary(
503
+ account=request.args.get('account') or None,
504
+ min_sends=min_sends, limit=limit,
505
+ hostname_filter=_eda_hostname_filter()),
506
+ }, 200
@@ -0,0 +1 @@
1
+ BUILD_DATE=2026-10-13T09:07:44Z
@@ -1,5 +1,32 @@
1
1
  # Version 4.3
2
2
 
3
+ ## Unreleased
4
+ - FIX: A new account password also takes effect when the change waits for an approval: after the approval the account kept its old password, and until then the new one was stored unencrypted
5
+ - FIX: An account value used through `{{ACCOUNT:name:field}}` now arrives exactly as stored, also when a password contains `{{`, `{%` or `{#`, which used to be read as a template and came out cut short or empty
6
+ - FIX: An Ansible variable reading an account through `{{ACCOUNT:<name>:<field>}}` gets the current value of the account in the inventory: after the account was created or changed, the inventory kept the value from before, or an empty one, until its cache was rebuilt
7
+ - FIX: Opening the debug page of a host no longer puts `********` into its Ansible inventory where a variable reads an account password through `{{ACCOUNT:<name>:password}}`; the debug page still hides the password
8
+ - FIX: The Checkmk notification rule export no longer overwrites the notification parameters chosen by hand in Checkmk — a rule with a custom plug-in whose parameter set had been switched was rewritten on every run and put back on the set holding the parameters of the syncer, and a changed rule could take over the Checkmk rule of an unchanged one sending to the same contact groups, so both swapped their settings; the parameters of a custom plug-in are now only used when the syncer creates a rule, afterwards they belong to Checkmk like those of a built-in plug-in
9
+ - FIX: A rule using `syncer_last_seen` or `syncer_last_sync` now gets the date the host page shows: both were only available on hosts an import had written them onto, so a rule that switches a host off after so many days without a sighting quietly fell back to its else value on every other host, and elsewhere was working with the date of the run before or, on a host the export had already cached, with the date that cache was built with
10
+ - FIX: Every host now records when it was created, whichever way it was created — so far only an import wrote that timestamp, so hosts added in the interface, copies and CSV imports had none
11
+ - FIX: Two Checkmk host tags carrying the same name no longer block the update of their whole tag group — Checkmk read them as a renamed tag and refused the change, so new tag values were never created and the host export kept failing on them
12
+ - FEAT: New option CMK_TAG_REPAIR lets Checkmk update the hosts and rules which use a changed tag group, for the case where Checkmk refuses the change and asks for that permission — the documentation says when that is safe and when it widens your rules
13
+ - FEAT: New option CMK_BULK_FALLBACK_SINGLE sends the hosts of a failed bulk request to Checkmk one by one, so a single rejected host no longer takes its whole batch down with it
14
+ - FIX: An own LDAP filter in the directory search now replaces the search filter of the account instead of being added to it, so a filter looking for something else than the imported hosts finds it; the account's filter can be switched back on with the box below the search field
15
+ - FIX: `./cmdbsyncer` commands start right away instead of setting up the Ansible default project first, which had every call open a database connection before it began — a command now starts in about a second where it waited half a minute on a slow or unreachable database
16
+ - FIX: Host timestamps are now written in UTC everywhere, so the "not seen for X days" cleanup, the stale marking and the API timestamps agree with each other on servers that do not run in UTC
17
+ - FIX: An import source delivering a hostname that is not text now reports a readable error instead of a traceback
18
+ - FIX: Inventorize runs only write a host to the database when an attribute really changed, which noticeably speeds up large Netbox inventories
19
+ - FIX: A database problem while looking up CMDB templates is written to the log instead of silently looking like "no template matched"
20
+
21
+ ## Version 4.3.5
22
+ - 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
23
+ - FIX: When Checkmk applies a bulk host update or create only in part ("Some actions failed"), the log now names each skipped host with the reason Checkmk gives, in one entry, instead of only the host names. A host is also no longer edited several times per export, so the Checkmk audit log no longer fills up with "Nothing was changed" entries, and a host whose attribute was removed is no longer reported as faulty although the removal worked. A bulk update request carries as many hosts as CMK_BULK_UPDATE_OPERATIONS allows, so this needs no more requests than before
24
+ - FIX: A Move to Folder rule whose folder option has no value for a host (it renders to False, True or None, for example a city the host does not have) no longer writes that into the Checkmk folder: Checkmk 2.5 then failed to list any folder and every export stopped with "Mismatch between endpoint and internal data format". The option is left out with a warning naming folder and attribute, a value like this already in a folder is removed, and when Checkmk can no longer list its folders the export continues and repairs the folders its rules manage
25
+ - FIX: A playbook run with an SSH password no longer fails on every host with "Invalid/incorrect password" when the application runs as the web server user — ssh was trying to write its known_hosts into that user's home directory, which is not writable; each run now keeps its known_hosts with its other temporary files, and a run that still hits this says so in the log instead of blaming the password
26
+ - FIX: A Checkmk rule that Checkmk refuses to update is left in place instead of being deleted — a value the target rejects (for example a password store reference written in a format a newer Checkmk no longer accepts) made the export delete the rule and then fail to recreate it, so the rule was gone after every run
27
+ - FEAT: The Checkmk rule export can be tried out before it runs: `export_rules --dry-run` reads the site and prints every rule it would create, update and delete, with the value it would write and the reason behind every deletion, and sends nothing to Checkmk
28
+ - FIX: `--debug` on the Checkmk rule export now shows the full error of a failed run, the same as the other export commands do, instead of only the difference behind each deletion
29
+
3
30
  ## Version 4.3.4
4
31
  - FIX: A user the directory created can now log in — a successful directory bind ended in a server error for anybody who has no local password, which is every user created on first login
5
32
  - FIX: A directory login that fails records what went wrong, so an unreachable server, a service account with the wrong password and a group mapping naming a role that does not exist can be told apart in Settings → Log
@@ -0,0 +1,47 @@
1
+ # Version 4.4
2
+
3
+ ## Version 4.4.0
4
+
5
+ ### Setup
6
+ - FEAT: New account option "http_proxy" sends every HTTP request of that account through a proxy — for a target system like ServiceNow that is only reachable through the corporate proxy; `direct` sends a single account past a proxy the environment sets for everything else
7
+
8
+ ### Interface
9
+ - FEAT: The times the interface shows for hosts — created, last seen, last synced, the host timeline, the inventory trees, the data quality page and the API token list — are converted to the timezone of the computer you are reading them on, while they stay stored in UTC; cron and log timestamps are unchanged, they are written in the server's own time
10
+
11
+ ### Hosts & Objects
12
+ - FEAT: One imported record can create several hosts: a `rewrite_hostname` template that renders a list, for example `{{ [HOSTNAME, HOSTNAME | replace('SRV01', 'RTR01')] }}`, imports one host per entry, each with all attributes of the record; every importer handles it the same way, and a template that renders a plain name works exactly as before
13
+ - FEAT: The host and object search finds entries by the day they were created: `created:today`, `created:yesterday` or `created:2026-09-22`, and `created:>=2026-09-01` together with `created:<=2026-09-07` for a range; the day is the one on your own clock — hosts that were created before the syncer recorded a creation time are matched by the day their entry was written to the database
14
+ - FEAT: CMDB objects can be debugged like hosts: the bug icon in the object list opens the same debug page with the object's attributes, matching rules and outcomes, and the new target "Netbox Objects" shows the IP address, prefix, interface, contact and dataflow rules that apply to a host or object
15
+
16
+ ### Rules
17
+ - FEAT: Rules can take a pasted list (CSV, semicolon or tab separated, e.g. copied from a spreadsheet) as their input instead of the hosts: switch the new Rule source to "From a pasted list", and the first line of the list names the columns, which become variables for the outcomes; the rule renders its outcomes once per row instead of once per host, and the form shows the column variables (a click inserts one into the field you were editing), the first rows and every problem with its line while you paste. Available for the Checkmk Setup Rules (rows that only differ in the service name are joined into one Checkmk rule), DCD rules, BI rules and aggregations, notification rules and downtimes, the i-doit custom attributes, the Jira export rules, the Netbox devices, virtual machines, clusters, prefixes, interfaces, IP addresses, contacts and Dataflow fields, the VMware custom attributes, the Ansible custom variables and the Ansible playbook fire rules; where a row stands for one object (an i-doit or Jira object, a Netbox device, the device or virtual machine of Netbox interfaces, an inventory host, the host of a downtime or of a playbook run), its `hostname` or `name` column names it
18
+ - FEAT: Two new condition types, Older Than and Newer Than, compare the value of an attribute holding a date against the clock — they are offered as a value match only, because a hostname and an attribute name are never a date — so a rule can be limited to the hosts that were not seen for longer than a given age (2d, 12h, 30m, 1w or a plain number of days) — and, the other way round, to the ones seen since; the same thing needed a Jinja expression before
19
+ - FIX: A rule working with the date a host was last seen is no longer answered out of the export cache, so a host switched off after days without a sighting is switched on again as soon as it is back instead of keeping the state it was given while it was missing; only the rule sets that work with a date are affected, every other one stays cached and exports as fast as before
20
+ - FIX: "Foreach Value in List" now also accepts an attribute name ending in *, so hosts carrying their groups in several attributes — one per team, each a comma separated list — are read as one list instead of yielding nothing
21
+
22
+ ### Checkmk
23
+ - FIX: Checkmk downtimes with a duration are no longer set again on every run, and the Duration field reads host attributes like every other field of a downtime
24
+ - FIX: The folder of a Checkmk DCD creation rule now renders its Jinja variables (a host attribute or a column of the pasted list), and one connection Checkmk refuses no longer keeps the others of the same export from being created
25
+
26
+ ### Checkmk - Setup Rules
27
+ - FEAT: The Checkmk rule export calculates its rules about three times faster, so a big inventory spends far less time in "Loop over Hosts and collect distinct rules"
28
+ - FEAT: Every Checkmk Setup Rule has a debug page, reached by its bug icon in the rule list: for a rule built from a pasted list it shows every row with the number of rules it produced and the Checkmk rules the export would send, without contacting Checkmk; for a rule built per host it opens the host debug page with that rule preselected
29
+
30
+ ### Checkmk - User Generation
31
+ - FEAT: Checkmk users can be generated from host attributes — one user per LDAP group the hosts carry, named after the group and given the mail address that group has in the directory; a new rule under Checkmk says which attributes hold the group names, and existing users created by hand are never overwritten
32
+ - FEAT: The Checkmk user generation can rewrite a group name before it is looked up, for hosts that carry it in a different shape than the directory uses — a prefix dropped, a domain cut off; a value the rewrite empties is skipped instead of creating a user from whatever the search filter alone finds
33
+ - FEAT: The fields of a generated Checkmk user can name the group both ways: {{name}} as it was searched in the directory and {{original_name}} as the host carried it before the rewrite
34
+ - FEAT: Checkmk roles and contact groups of a generated user are Jinja too, so a group can say which ones it deserves — an entry that renders to nothing is dropped and one that renders to several names becomes all of them
35
+ - FEAT: New page "Preview Generated Users" under Checkmk shows what the generation rules would make of the hosts you have right now — which groups were found, what the directory returned for them and which Checkmk user each one becomes, without writing anything
36
+ - FEAT: The Checkmk user generation can be debugged from the command line: `--debug` shows which subtree, filter and attribute the group lookup used and which groups the directory did not return, and `--search-filter` tries another group filter out without anybody editing the rules first
37
+
38
+ ### Event Driven Ansible
39
+ - FEAT: New module Event Driven Ansible: rules decide which hosts send which event to an Event Driven Ansible event stream or webhook, and the cronjob "EDA: Send Events" sends them, for example to start the TLS or bakery registration of a Checkmk agent that the Checkmk inventory reports as not registered; the same event is sent again only after a configurable number of hours, and every event sent is listed in the Event History
40
+ - FEAT: Event Driven Ansible shows under Repeated Events which hosts keep getting the same event without effect: every event counts its sends while the host still matches the rule, it counts as repeating from a threshold set on the account (default 3 sends) and as resolved as soon as the host no longer matches; the REST endpoint `/api/v1/syncer/eda` returns the counters and the repeating events for monitoring with Checkmk
41
+
42
+ ### Ansible
43
+ - FEAT: The Checkmk agent and server playbooks take the new variable `cmk_agent_host_name` as the host name they report to Checkmk; it defaults to the inventory name, so a host can be known in Checkmk by its short name while Ansible connects to its FQDN, or the other way round
44
+ - FIX: The shipped Checkmk agent and server playbooks work with an automation secret that contains special characters such as €, ö, spaces, quotes, $ or backslashes, and no longer show the secret in the Ansible output
45
+
46
+ ### LDAP
47
+ - FEAT: Every field of an LDAP account now explains in the form what it configures
@@ -365,10 +365,22 @@ class BaseConfig():
365
365
  CMK_BULK_DELETE_OPERATIONS = 50
366
366
 
367
367
  CMK_DONT_DELETE_TAGS = True
368
+ # Allow Checkmk to update hosts and rules which use a changed tag group.
369
+ # WARNING: Checkmk repairs a removed tag by deleting the condition from
370
+ # every rule which uses it. The rule stays, but without that condition it
371
+ # matches more hosts than before. Combined with CMK_DONT_DELETE_TAGS = False
372
+ # every value which disappears from the source can silently widen a rule.
373
+ # A renamed tag is uncritical, there the condition gets the new id.
374
+ CMK_TAG_REPAIR = False
368
375
 
369
376
  CMK_BULK_UPDATE_HOSTS = True
370
377
  CMK_BULK_UPDATE_OPERATIONS = 50
371
378
 
379
+ # Retry the hosts of a failed bulk request one by one, so that one broken
380
+ # host does not block its whole batch. Costs one request per host of a
381
+ # failed batch, therefore off by default.
382
+ CMK_BULK_FALLBACK_SINGLE = False
383
+
372
384
  CMK_LOWERCASE_FOLDERNAMES = True
373
385
  CMK_LOWERCASE_LABEL_VALUES = False
374
386
 
@@ -12,6 +12,7 @@ docu_links = {
12
12
  'accounts' : 'https://docs.cmdbsyncer.de/basics/accounts/',
13
13
  'cmk_inventory_attributes': 'https://docs.cmdbsyncer.de/checkmk/inventorize/',
14
14
  'cmk_groups': 'https://docs.cmdbsyncer.de/checkmk/groups_management/',
15
+ 'cmk_user_generation': 'https://docs.cmdbsyncer.de/checkmk/user_generation/',
15
16
  'cmk_setup_rules': 'https://docs.cmdbsyncer.de/checkmk/rules_management/',
16
17
  'cmk_hosttags': 'https://docs.cmdbsyncer.de/checkmk/create_hosttags/',
17
18
  'cmk_password_store': 'https://docs.cmdbsyncer.de/checkmk/password_store/',
@@ -20,7 +20,18 @@ SECRET_ACCOUNT_FIELDS = ('password', 'password_crypted')
20
20
 
21
21
  SECRET_PLACEHOLDER = '********'
22
22
 
23
- _mask_secrets = ContextVar('mask_account_secrets', default=False)
23
+ _mask_secrets = ContextVar('mask_account_secrets', default=None)
24
+
25
+
26
+ class SecretMasking: # pylint: disable=too-few-public-methods
27
+ """
28
+ State of one `mask_account_secrets` block. `used` turns True once a
29
+ secret was replaced by the placeholder, so the caller knows its
30
+ results hold placeholders instead of real values.
31
+ """
32
+
33
+ def __init__(self):
34
+ self.used = False
24
35
 
25
36
 
26
37
  @contextmanager
@@ -34,10 +45,14 @@ def mask_account_secrets():
34
45
  `checkmk`) could add a rule whose outcome is the macro, open the
35
46
  debug page and read the password of *any* account — bypassing the
36
47
  `account` role that guards the account views.
48
+
49
+ Yields a `SecretMasking`: whatever was computed inside the block and
50
+ cached for later runs carries the placeholder when its `used` is set.
37
51
  """
38
- token = _mask_secrets.set(True)
52
+ masking = SecretMasking()
53
+ token = _mask_secrets.set(masking)
39
54
  try:
40
- yield
55
+ yield masking
41
56
  finally:
42
57
  _mask_secrets.reset(token)
43
58
 
@@ -71,8 +86,25 @@ def clear_account_cache(*_args, **_kwargs):
71
86
  _account_cache.clear()
72
87
 
73
88
 
89
+ def clear_host_caches(*_args, **_kwargs):
90
+ """
91
+ Drop the per host outcome caches. Wired to Account save/delete.
92
+
93
+ Rule outcomes are cached with every {{ACCOUNT:...}} macro already
94
+ resolved, so the exports reading them (e.g. the Ansible inventory)
95
+ would keep serving what the account held when the cache was built,
96
+ or an empty value when it did not exist yet. Saving a rule drops
97
+ the caches for the same reason.
98
+ """
99
+ # Imported here: the host model renders Jinja, which imports this module.
100
+ from application.models.host import Host # pylint: disable=import-outside-toplevel
101
+ Host.objects(cache__ne={}).update(set__cache={})
102
+
103
+
74
104
  signals.post_save.connect(clear_account_cache, sender=Account)
75
105
  signals.post_delete.connect(clear_account_cache, sender=Account)
106
+ signals.post_save.connect(clear_host_caches, sender=Account)
107
+ signals.post_delete.connect(clear_host_caches, sender=Account)
76
108
 
77
109
 
78
110
  def _resolve_password(account):
@@ -164,7 +196,9 @@ def get_account_variable(macro):
164
196
  inner = macro.strip().removeprefix('{{').removesuffix('}}')
165
197
  _, account, var = (part.strip() for part in inner.split(':'))
166
198
  value = get_account_by_name(account)[var]
167
- if var in SECRET_ACCOUNT_FIELDS and _mask_secrets.get():
199
+ masking = _mask_secrets.get()
200
+ if var in SECRET_ACCOUNT_FIELDS and masking is not None:
201
+ masking.used = True
168
202
  return SECRET_PLACEHOLDER
169
203
  return value
170
204
  except (ValueError, KeyError, AccountNotFoundError) as exc: