cmdbsyncer 4.1.0.dev22__tar.gz → 4.1.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/PKG-INFO +1 -1
  2. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/__init__.py +7 -2
  3. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/_version.py +34 -5
  4. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/api/views.py +5 -2
  5. cmdbsyncer-4.1.2/application/buildinfo.txt +1 -0
  6. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/changelog/v4.1.md +18 -1
  7. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/config.py +8 -0
  8. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/helpers/local_config_presets.py +5 -0
  9. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/models/host.py +4 -4
  10. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/models/user.py +2 -2
  11. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/rules/rule_definitions.py +1 -0
  12. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/admin/master.html +2 -2
  13. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/views/field_approval.py +10 -6
  14. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/cmdbsyncer.egg-info/PKG-INFO +1 -1
  15. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/pyproject.toml +1 -1
  16. cmdbsyncer-4.1.0.dev22/application/buildinfo.txt +0 -1
  17. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/LICENSE +0 -0
  18. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/README.md +0 -0
  19. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/api/__init__.py +0 -0
  20. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/api/inventory.py +0 -0
  21. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/api/objects.py +0 -0
  22. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/api/rules.py +0 -0
  23. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/api/syncer.py +0 -0
  24. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/auth/views.py +0 -0
  25. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/changelog/.pages +0 -0
  26. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/changelog/v3.10.md +0 -0
  27. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/changelog/v3.11.md +0 -0
  28. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/changelog/v3.12.md +0 -0
  29. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/changelog/v3.5.md +0 -0
  30. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/changelog/v3.7.md +0 -0
  31. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/changelog/v3.8.md +0 -0
  32. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/changelog/v3.9.md +0 -0
  33. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/changelog/v4.0.md +0 -0
  34. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/cli.py +0 -0
  35. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/docu_links.py +0 -0
  36. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/enterprise.py +0 -0
  37. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/helpers/__init__.py +0 -0
  38. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/helpers/audit.py +0 -0
  39. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/helpers/cron.py +0 -0
  40. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/helpers/get_account.py +0 -0
  41. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/helpers/inventory.py +0 -0
  42. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/helpers/local_config_file.py +0 -0
  43. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/helpers/mongo_keys.py +0 -0
  44. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/helpers/notification_channels.py +0 -0
  45. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/helpers/notification_dispatch.py +0 -0
  46. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/helpers/plugins.py +0 -0
  47. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/helpers/sates.py +0 -0
  48. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/helpers/sql.py +0 -0
  49. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/helpers/syncer_jinja.py +0 -0
  50. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/helpers/tablib_formater.py +0 -0
  51. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/helpers/tests/__init__.py +0 -0
  52. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/helpers/tests/test_sql.py +0 -0
  53. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/mcp_server.py +0 -0
  54. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/models/__init__.py +0 -0
  55. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/models/account.py +0 -0
  56. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/models/config.py +0 -0
  57. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/models/cron.py +0 -0
  58. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/models/field_approval.py +0 -0
  59. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/models/forms.py +0 -0
  60. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/models/host_inventory_tree.py +0 -0
  61. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/models/notification_channel.py +0 -0
  62. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/models/notification_rule.py +0 -0
  63. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/models/notification_state.py +0 -0
  64. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/models/saved_search.py +0 -0
  65. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/models/states.py +0 -0
  66. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/modules/__init__.py +0 -0
  67. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/modules/custom_attributes/models.py +0 -0
  68. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/modules/custom_attributes/rules.py +0 -0
  69. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/modules/custom_attributes/views.py +0 -0
  70. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/modules/debug.py +0 -0
  71. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/modules/email.py +0 -0
  72. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/modules/inventory/__init__.py +0 -0
  73. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/modules/log/log.py +0 -0
  74. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/modules/log/models.py +0 -0
  75. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/modules/log/views.py +0 -0
  76. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/modules/plugin.py +0 -0
  77. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/modules/rule/__init__.py +0 -0
  78. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/modules/rule/filter.py +0 -0
  79. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/modules/rule/match.py +0 -0
  80. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/modules/rule/models.py +0 -0
  81. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/modules/rule/rewrite.py +0 -0
  82. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/modules/rule/rule.py +0 -0
  83. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/modules/rule/views.py +0 -0
  84. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/modules/statefile.py +0 -0
  85. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/notices/strict_certificate_verification.txt +0 -0
  86. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/__init__.py +0 -0
  87. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/ansible/__init__.py +0 -0
  88. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/ansible/admin_views.py +0 -0
  89. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/ansible/inventory.py +0 -0
  90. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/ansible/models.py +0 -0
  91. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/ansible/playbook_rules.py +0 -0
  92. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/ansible/plugin.json +0 -0
  93. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/ansible/rules.py +0 -0
  94. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/ansible/runner.py +0 -0
  95. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/ansible/site_syncer.py +0 -0
  96. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/ansible/views.py +0 -0
  97. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/bmc_remedy/__init__.py +0 -0
  98. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/bmc_remedy/bmc_remedy.py +0 -0
  99. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/bmc_remedy/plugin.json +0 -0
  100. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/__init__.py +0 -0
  101. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/admin_views.py +0 -0
  102. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/bi.py +0 -0
  103. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/cmk2.py +0 -0
  104. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/cmk_rules.py +0 -0
  105. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/dcd.py +0 -0
  106. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/downtimes.py +0 -0
  107. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/groups.py +0 -0
  108. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/helpers.py +0 -0
  109. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/import_v1.py +0 -0
  110. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/import_v2.py +0 -0
  111. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/inits.py +0 -0
  112. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/inventorize.py +0 -0
  113. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/models.py +0 -0
  114. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/notification_rules.py +0 -0
  115. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/passwords.py +0 -0
  116. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/plugin.json +0 -0
  117. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/poolfolder.py +0 -0
  118. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/rules.py +0 -0
  119. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/sites.py +0 -0
  120. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/syncer.py +0 -0
  121. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/tags.py +0 -0
  122. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/tests/__init__.py +0 -0
  123. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/tests/test_bi.py +0 -0
  124. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/tests/test_cmk2.py +0 -0
  125. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/tests/test_cmk_rules.py +0 -0
  126. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/tests/test_dcd.py +0 -0
  127. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/tests/test_downtimes.py +0 -0
  128. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/tests/test_groups.py +0 -0
  129. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/tests/test_helpers.py +0 -0
  130. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/tests/test_import_v1.py +0 -0
  131. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/tests/test_import_v2.py +0 -0
  132. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/tests/test_inventorize.py +0 -0
  133. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/tests/test_notification_rules.py +0 -0
  134. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/tests/test_passwords.py +0 -0
  135. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/tests/test_poolfolder.py +0 -0
  136. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/tests/test_rules.py +0 -0
  137. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/tests/test_sites.py +0 -0
  138. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/tests/test_syncer.py +0 -0
  139. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/tests/test_tags.py +0 -0
  140. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/tests/test_users.py +0 -0
  141. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/users.py +0 -0
  142. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/checkmk/views.py +0 -0
  143. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/cisco_dna/__init__.py +0 -0
  144. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/cisco_dna/plugin.json +0 -0
  145. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/cisco_dna/syncer.py +0 -0
  146. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/cron.py +0 -0
  147. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/csv/__init__.py +0 -0
  148. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/csv/csv.py +0 -0
  149. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/csv/plugin.json +0 -0
  150. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/file_requests.py +0 -0
  151. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/idoit/__init__.py +0 -0
  152. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/idoit/admin_views.py +0 -0
  153. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/idoit/models.py +0 -0
  154. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/idoit/plugin.json +0 -0
  155. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/idoit/rules.py +0 -0
  156. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/idoit/syncer.py +0 -0
  157. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/idoit/views.py +0 -0
  158. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/jdisc/__init__.py +0 -0
  159. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/jdisc/applications.py +0 -0
  160. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/jdisc/devices.py +0 -0
  161. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/jdisc/executables.py +0 -0
  162. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/jdisc/jdisc.py +0 -0
  163. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/jdisc/plugin.json +0 -0
  164. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/jira/__init__.py +0 -0
  165. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/jira/jira.py +0 -0
  166. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/jira/plugin.json +0 -0
  167. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/jira_cloud/__init__.py +0 -0
  168. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/jira_cloud/admin_views.py +0 -0
  169. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/jira_cloud/export.py +0 -0
  170. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/jira_cloud/jira_cloud.py +0 -0
  171. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/jira_cloud/models.py +0 -0
  172. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/jira_cloud/plugin.json +0 -0
  173. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/jira_cloud/rules.py +0 -0
  174. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/jira_cloud/schema_sync.py +0 -0
  175. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/jira_cloud/views.py +0 -0
  176. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/json/__init__.py +0 -0
  177. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/json/json.py +0 -0
  178. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/json/plugin.json +0 -0
  179. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/ldap/__init__.py +0 -0
  180. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/ldap/ldap.py +0 -0
  181. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/ldap/plugin.json +0 -0
  182. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/maintenance/__init__.py +0 -0
  183. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/maintenance/plugin.json +0 -0
  184. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/mssql/__init__.py +0 -0
  185. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/mssql/plugin.json +0 -0
  186. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/mysql/__init__.py +0 -0
  187. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/mysql/mysql.py +0 -0
  188. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/mysql/plugin.json +0 -0
  189. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/netbox/__init__.py +0 -0
  190. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/netbox/admin_views.py +0 -0
  191. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/netbox/cluster.py +0 -0
  192. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/netbox/contacts.py +0 -0
  193. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/netbox/dataflow.py +0 -0
  194. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/netbox/devices.py +0 -0
  195. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/netbox/interfaces.py +0 -0
  196. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/netbox/ips.py +0 -0
  197. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/netbox/models.py +0 -0
  198. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/netbox/netbox.py +0 -0
  199. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/netbox/networks.py +0 -0
  200. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/netbox/plugin.json +0 -0
  201. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/netbox/prefixes.py +0 -0
  202. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/netbox/rules.py +0 -0
  203. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/netbox/views.py +0 -0
  204. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/netbox/virtualmachines.py +0 -0
  205. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/prtg/__init__.py +0 -0
  206. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/prtg/plugin.json +0 -0
  207. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/prtg/prtg.py +0 -0
  208. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/pyodbc/__init__.py +0 -0
  209. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/pyodbc/plugin.json +0 -0
  210. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/pyodbc/pyodbc.py +0 -0
  211. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/rest/__init__.py +0 -0
  212. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/rest/plugin.json +0 -0
  213. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/rest/rest.py +0 -0
  214. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/rules/__init__.py +0 -0
  215. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/rules/admin_views.py +0 -0
  216. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/rules/autorules.py +0 -0
  217. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/rules/models.py +0 -0
  218. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/rules/plugin.json +0 -0
  219. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/rules/rule_import_export.py +0 -0
  220. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/rules/views.py +0 -0
  221. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/syncer_shell.py +0 -0
  222. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/vmware/__init__.py +0 -0
  223. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/vmware/admin_views.py +0 -0
  224. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/vmware/custom_attributes.py +0 -0
  225. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/vmware/models.py +0 -0
  226. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/vmware/plugin.json +0 -0
  227. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/vmware/rules.py +0 -0
  228. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/vmware/views.py +0 -0
  229. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/vmware/vmware.py +0 -0
  230. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/yml/__init__.py +0 -0
  231. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/yml/plugin.json +0 -0
  232. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins/yml/yml.py +0 -0
  233. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/plugins_cli.py +0 -0
  234. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/static/css/cmdbsyncer.css +0 -0
  235. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/static/js/main.js +0 -0
  236. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/static/logo_white.png +0 -0
  237. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/_brand.html +0 -0
  238. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/_theme.html +0 -0
  239. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/admin/_host_tabs.html +0 -0
  240. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/admin/account_pick_type.html +0 -0
  241. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/admin/ansible_playbook_run.html +0 -0
  242. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/admin/ansible_project_detail.html +0 -0
  243. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/admin/ansible_rule_list.html +0 -0
  244. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/admin/bulk_label_form.html +0 -0
  245. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/admin/changelog_archive.html +0 -0
  246. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/admin/checkmk_rule_mngmt_list.html +0 -0
  247. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/admin/checkmk_settings_list.html +0 -0
  248. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/admin/copy_as_new_form.html +0 -0
  249. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/admin/data_quality.html +0 -0
  250. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/admin/file/list.html +0 -0
  251. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/admin/file/modals/form.html +0 -0
  252. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/admin/host_details.html +0 -0
  253. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/admin/host_edit.html +0 -0
  254. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/admin/host_inventory_tree.html +0 -0
  255. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/admin/host_list.html +0 -0
  256. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/admin/host_relations_graph.html +0 -0
  257. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/admin/host_timeline.html +0 -0
  258. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/admin/index.html +0 -0
  259. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/admin/local_config_editor.html +0 -0
  260. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/admin/model/clone_confirm.html +0 -0
  261. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/admin/model/inline_list_base.html +0 -0
  262. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/admin/object_list.html +0 -0
  263. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/admin/set_cmk_version_form.html +0 -0
  264. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/admin/set_template_form.html +0 -0
  265. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/base.html +0 -0
  266. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/change_password.html +0 -0
  267. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/debug.html +0 -0
  268. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/debug_host.html +0 -0
  269. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/email/newuser.html +0 -0
  270. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/email/notification.html +0 -0
  271. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/email/resetpassword.html +0 -0
  272. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/formular.html +0 -0
  273. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/license_info.html +0 -0
  274. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/login.html +0 -0
  275. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/logout_confirm.html +0 -0
  276. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/request_password.html +0 -0
  277. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/set_2fa.html +0 -0
  278. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/templates/set_theme.html +0 -0
  279. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/themes/dracula.css +0 -0
  280. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/themes/gruvbox-dark.css +0 -0
  281. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/themes/gruvbox-light.css +0 -0
  282. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/themes/nord.css +0 -0
  283. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/themes_registry.py +0 -0
  284. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/views/_form_fields.py +0 -0
  285. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/views/_form_sections.py +0 -0
  286. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/views/account.py +0 -0
  287. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/views/config.py +0 -0
  288. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/views/cron.py +0 -0
  289. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/views/data_quality.py +0 -0
  290. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/views/default.py +0 -0
  291. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/views/fileadmin.py +0 -0
  292. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/views/host.py +0 -0
  293. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/views/host_filters.py +0 -0
  294. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/views/host_renderers.py +0 -0
  295. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/views/host_widgets.py +0 -0
  296. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/views/license.py +0 -0
  297. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/views/notification_channel.py +0 -0
  298. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/views/notification_rule.py +0 -0
  299. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/views/saved_search.py +0 -0
  300. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/application/views/user.py +0 -0
  301. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/cmdbsyncer.egg-info/SOURCES.txt +0 -0
  302. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/cmdbsyncer.egg-info/dependency_links.txt +0 -0
  303. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/cmdbsyncer.egg-info/entry_points.txt +0 -0
  304. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/cmdbsyncer.egg-info/requires.txt +0 -0
  305. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/cmdbsyncer.egg-info/top_level.txt +0 -0
  306. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/requirements-ansible.txt +0 -0
  307. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/requirements-extras.txt +0 -0
  308. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/requirements.txt +0 -0
  309. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/setup.cfg +0 -0
  310. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/syncerapi/__init__.py +0 -0
  311. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/syncerapi/v1/__init__.py +0 -0
  312. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/syncerapi/v1/core/__init__.py +0 -0
  313. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/syncerapi/v1/inventory/__init__.py +0 -0
  314. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/syncerapi/v1/rest/__init__.py +0 -0
  315. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/tests/test_api.py +0 -0
  316. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/tests/test_api_csrf_invariant.py +0 -0
  317. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/tests/test_default_view.py +0 -0
  318. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/tests/test_mongo_keys.py +0 -0
  319. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/tests/test_plugin.py +0 -0
  320. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/tests/test_plugin_ssti.py +0 -0
  321. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/tests/test_plugins_cli.py +0 -0
  322. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/tests/test_rule.py +0 -0
  323. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/tests/test_rule_match.py +0 -0
  324. {cmdbsyncer-4.1.0.dev22 → cmdbsyncer-4.1.2}/tests/test_webhook_token_hash.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cmdbsyncer
3
- Version: 4.1.0.dev22
3
+ Version: 4.1.2
4
4
  Summary: Rule-based modular synchronizer for Checkmk, Netbox, Ansible, I-DOIT, Jira CMDB and 15+ other CMDB/monitoring systems
5
5
  Author-email: Kuhn & Ruess GmbH <info@kuhn-ruess.de>
6
6
  Maintainer-email: Bastian Kuhn <mail@bastian-kuhn.de>
@@ -252,12 +252,16 @@ if not CLI_MODE:
252
252
  """
253
253
  Feed the navbar badge in master.html. Runs on every admin
254
254
  request, so it must be cheap and fail-soft — the count is a
255
- nicety, not a correctness requirement.
255
+ nicety, not a correctness requirement. The workflow only
256
+ applies when the operator has nominated critical labels in
257
+ APPROVAL_REQUIRED_LABELS, so the badge stays hidden otherwise.
256
258
  """
257
259
  # pylint: disable=import-outside-toplevel
258
260
  from flask_login import current_user as _user
259
261
  if not app.config.get('CMDB_MODE'):
260
262
  return {'pending_approval_count': 0}
263
+ if not app.config.get('APPROVAL_REQUIRED_LABELS'):
264
+ return {'pending_approval_count': 0}
261
265
  try:
262
266
  if not _user.is_authenticated:
263
267
  return {'pending_approval_count': 0}
@@ -557,7 +561,8 @@ def _register_web_layer(): # pylint: disable=too-many-locals,too-many-statement
557
561
  admin.add_sub_category(name="Backups", parent_name="Settings")
558
562
  from application.models.field_approval import FieldApproval
559
563
  from application.views.field_approval import FieldApprovalView
560
- admin.add_view(FieldApprovalView(FieldApproval, name="Approvals",
564
+ admin.add_view(FieldApprovalView(FieldApproval,
565
+ name="Critical Label Approvals",
561
566
  category="Settings",
562
567
  menu_icon_type='fa',
563
568
  menu_icon_value='fa-hourglass-half'))
@@ -94,13 +94,42 @@ def _has_unreleased_entries():
94
94
  return bool(match and match.group(1).strip())
95
95
 
96
96
 
97
- def get_display_version():
98
- """Display form: ``4.0.0`` / ``4.0.0-dev`` / ``3.12-LTS3``.
97
+ def _installed_version():
98
+ """The version recorded in installed-package metadata, or None.
99
+
100
+ `pyproject.toml` carries the authoritative pre-release counter
101
+ (``4.1.0.dev22`` etc.) but is gone after ``pip install``. The wheel's
102
+ dist-info keeps it, so ``importlib.metadata`` recovers the suffix on
103
+ both PyPI installs and editable installs. Source checkouts without
104
+ an installation just fall through to the changelog-derived version.
105
+ """
106
+ try:
107
+ from importlib.metadata import ( # pylint: disable=import-outside-toplevel
108
+ PackageNotFoundError, version as _md_version,
109
+ )
110
+ return _md_version('cmdbsyncer')
111
+ except (PackageNotFoundError, ImportError, ModuleNotFoundError):
112
+ return None
99
113
 
100
- PEP 440 stores LTS as ``3.12+lts3``; users see the conventional
101
- ``-LTS`` form. ``-dev`` is appended on the main line while an
102
- ``## Unreleased`` section is open.
114
+
115
+ def get_display_version():
116
+ """Display form: ``4.0.0`` / ``4.0.0-dev22`` / ``3.12-LTS3``.
117
+
118
+ Resolution:
119
+ - LTS lines keep their ``-LTS`` suffix (PEP 440 stores it as ``+lts``).
120
+ - If the installed metadata carries a pre-release suffix (``.devN``,
121
+ ``aN``, ``bN``, ``rcN``), surface it as ``-dev22`` / ``-rc1`` etc.
122
+ so users can tell which dev build they are on.
123
+ - Otherwise, while an ``## Unreleased`` section is still open in the
124
+ active changelog, append a bare ``-dev`` (source checkouts before
125
+ the next pre-release is cut).
103
126
  """
104
127
  if '+lts' in __version__:
105
128
  return __version__.replace('+lts', '-LTS')
129
+ installed = _installed_version()
130
+ if installed:
131
+ match = re.search(r'\.(dev\d+|a\d+|b\d+|rc\d+)$', installed)
132
+ if match:
133
+ base = installed[:match.start()]
134
+ return f'{base}-{match.group(1)}'
106
135
  return f'{__version__}-dev' if _has_unreleased_entries() else __version__
@@ -14,9 +14,12 @@ API_BP = Blueprint('api', __name__)
14
14
 
15
15
  # Rate-limit API auth failures per client IP. Only 401 responses deduct from
16
16
  # the bucket, so legitimate high-volume API traffic is not throttled — only
17
- # brute-force / credential-stuffing attempts are.
17
+ # brute-force / credential-stuffing attempts are. Uses its own bucket
18
+ # (API_RATE_LIMIT), independent of the much stricter form-login budget
19
+ # (AUTH_RATE_LIMIT, used by /auth) — otherwise a polling monitoring agent
20
+ # whose creds are momentarily wrong can lock the whole API for an hour.
18
21
  limiter.limit(
19
- lambda: app.config.get('AUTH_RATE_LIMIT', '3 per minute; 10 per hour'),
22
+ lambda: app.config.get('API_RATE_LIMIT', '30 per minute; 300 per hour'),
20
23
  deduct_when=lambda response: response.status_code == 401,
21
24
  )(API_BP)
22
25
 
@@ -0,0 +1 @@
1
+ BUILD_DATE=2026-05-18T12:46:22Z
@@ -1,6 +1,22 @@
1
1
  # Version 4.1
2
2
 
3
- ## Unreleased
3
+ ## Version 4.1.2
4
+
5
+ ### Hosts
6
+ - FIX: Label names containing `.` or `$` are again run through the configured `REPLACERS` before the MongoDB-key check, so imports that relied on replacers to sanitize such names no longer fail
7
+
8
+ ### Rules
9
+ - FIX: "Export all rules" now also includes cronjob groups, so a full rule export/import no longer silently drops the schedule configuration
10
+
11
+ ### UI
12
+ - FIX: Settings menu entry "Approvals" renamed to "Critical Label Approvals" and only shown when `APPROVAL_REQUIRED_LABELS` is actually configured (was always visible in CMDB mode even when the workflow was inactive)
13
+
14
+ ## Version 4.1.1
15
+
16
+ ### API
17
+ - FIX: Separate `API_RATE_LIMIT` for `/api/v1` (default `30/min; 300/hour`) so a few 401s no longer lock out monitoring polling for the rest of the hour
18
+
19
+ ## Version 4.1.0
4
20
 
5
21
  ### Ansible
6
22
  - FEAT: Trigger Ansible playbook runs from the host UI with live output and per-host run history
@@ -107,6 +123,7 @@
107
123
  - FIX: PyPI installs now ship every plugin's `plugin.json` (was only the `.py` files), and the user `plugins/` directory plus `disabled_plugins.json` next to `app.wsgi` are picked up correctly instead of being looked for inside `site-packages`
108
124
  - FEAT: Offline installation bundle always ships base, extras and ansible Python dependencies plus the default Ansible playbook collection, and the bundled `install.sh` deploys the playbooks to `/opt/cmdbsyncer/ansible` (override via `ANSIBLE_TARGET`, skip with `SKIP_ANSIBLE=1`, replace existing target with `FORCE=1`)
109
125
  - FEAT: New `make release-pre` target ships sequential pre-release builds (`.devN` / `aN` / `bN` / `rcN`) to PyPI without requiring a hand-edit before each upload; `tools/build_offline_bundle.sh --syncer-version 4.1.0.dev3 --enterprise-version 0.3.9.dev1` pins the offline bundle to those pre-releases so QA can test them on air-gapped systems
126
+ - FEAT: Header version display surfaces the installed pre-release counter — `4.1.0-dev22` / `4.1.0-rc1` etc. — instead of the bare `-dev` suffix, so operators can tell which build is running
110
127
 
111
128
  ### Refactor
112
129
  - REFACTOR: `application/views/host.py` split into focused modules (widgets, filters, renderers)
@@ -196,6 +196,14 @@ class BaseConfig():
196
196
  # Applied per client IP to the POST handler; GET (rendering the form) is
197
197
  # not rate-limited.
198
198
  AUTH_RATE_LIMIT = '3 per minute; 10 per hour'
199
+ # Rate limit for the /api/v1 namespace. Only 401 responses deduct from
200
+ # the bucket (see application/api/views.py), so legitimate polling
201
+ # never spends quota. Picked generous enough that a misconfigured
202
+ # monitoring agent producing repeated 401s does not lock out the whole
203
+ # API for the rest of the hour, while still throttling credential
204
+ # stuffing. Set tighter via local_config.py if your network is fully
205
+ # trusted, or looser if you have many polling clients.
206
+ API_RATE_LIMIT = '30 per minute; 300 per hour'
199
207
  # Flask-Limiter storage backend. Default is in-process memory, which is
200
208
  # fine for single-worker deployments. For multiple workers, set to
201
209
  # e.g. 'redis://localhost:6379' or 'mongodb://localhost:27017/cmdb-api'.
@@ -158,6 +158,11 @@ PRESETS = [
158
158
  'default': '3 per minute; 10 per hour',
159
159
  'hint': 'Per-IP rate limit for login + password-reset POSTs '
160
160
  '(Flask-Limiter syntax).'},
161
+ {'key': 'API_RATE_LIMIT', 'type': 'str',
162
+ 'default': '30 per minute; 300 per hour',
163
+ 'hint': 'Per-IP rate limit for /api/v1. Only 401 responses '
164
+ 'count, so legitimate polling never spends quota. '
165
+ 'Raise if your monitoring polls many endpoints.'},
161
166
  {'key': 'RATELIMIT_STORAGE_URI', 'type': 'str',
162
167
  'default': 'memory://',
163
168
  'hint': 'Backend for rate-limit counters. Use redis:// or '
@@ -411,7 +411,6 @@ class Host(db.Document):
411
411
  but checks first if needed and also sets
412
412
  set_import_sync and import_seen as needed
413
413
  """
414
- validate_mongo_keys(labels, "label")
415
414
  if app.config['LABELS_ITERATE_FIRST_LEVEL']:
416
415
  for key, value in list(labels.items()):
417
416
  if isinstance(value, dict):
@@ -419,9 +418,10 @@ class Host(db.Document):
419
418
  labels[f'{key}_{sub_key}'] = sub_value
420
419
  del labels[key]
421
420
  label_dict = dict(map(lambda kv: (self._fix_key(kv[0]), kv[1]), labels.items()))
422
- # Re-validate after _fix_key so a LOWERCASE/REPLACER config that
423
- # strips a key down to an empty / MongoDB-reserved form cannot slip
424
- # past the input check.
421
+ # Validate only after _fix_key: REPLACERS are the intended way to
422
+ # turn `.`/`$` in incoming label names into MongoDB-safe keys, so
423
+ # the check must run on the post-replacer form. Anything still
424
+ # invalid here is rejected with a clear error.
425
425
  validate_mongo_keys(label_dict, "label")
426
426
  if self.get_labels() != label_dict:
427
427
  self.set_import_sync()
@@ -16,8 +16,8 @@ roles = [
16
16
  ('host', "Hosts"),
17
17
  ('objects', "Objects"),
18
18
  ('hard_delete', "Permanently delete archived objects"),
19
- ('approval', "Approve or reject pending field changes"),
20
- ('approval_bypass', "Skip the approval queue when editing critical fields"),
19
+ ('approval', "Approve or reject pending critical-label changes"),
20
+ ('approval_bypass', "Skip the approval queue when editing critical labels"),
21
21
  ('account', "Account Management"),
22
22
  ('log', "Log View"),
23
23
  ('global_attributes', "Global Attributes"),
@@ -44,6 +44,7 @@ rules = {
44
44
  'vmware_custom_attributes': ('application.plugins.vmware.models', 'VMwareCustomAttributes'),
45
45
  'vmware_rewrite_attributes': ('application.plugins.vmware.models', 'VMwareRewriteAttributes'),
46
46
  'syncer_rule_automation': ('application.plugins.rules.models', 'SyncerRuleAutomation'),
47
+ 'cron_groups': ('application.models.cron', 'CronGroup'),
47
48
  }
48
49
 
49
50
 
@@ -361,11 +361,11 @@
361
361
  {% if pending_approval_count and pending_approval_count > 0 %}
362
362
  <li id='pending-approvals' class="nav-item">
363
363
  <a href="{{ pending_approval_url }}" class="nav-link"
364
- title="Pending approvals waiting for a second admin">
364
+ title="Critical label changes waiting for approval">
365
365
  <i class="fa fa-hourglass-half"></i>
366
366
  <span class="badge badge-warning"
367
367
  style="background:#f39c12;color:#000;">
368
- {{ pending_approval_count }} waiting
368
+ {{ pending_approval_count }} label approvals
369
369
  </span>
370
370
  </a>
371
371
  </li>
@@ -39,10 +39,14 @@ class FieldApprovalView(ModelView): # pylint: disable=too-many-public-methods,t
39
39
  column_filters = ('status', 'hostname', 'field_name', 'requested_by_email')
40
40
 
41
41
  def is_accessible(self):
42
- # The approval queue is part of the CMDB workflow — hide it (and
43
- # its menu link) when the install is running in plain syncer mode.
42
+ # The approval queue only applies when the operator has nominated
43
+ # critical labels in APPROVAL_REQUIRED_LABELS; with the default
44
+ # empty list nothing can ever land in the queue, so hide the menu
45
+ # entry entirely. Also hidden outside CMDB mode.
44
46
  if not app.config.get('CMDB_MODE'):
45
47
  return False
48
+ if not app.config.get('APPROVAL_REQUIRED_LABELS'):
49
+ return False
46
50
  return current_user.is_authenticated and (
47
51
  current_user.global_admin
48
52
  or current_user.has_right('approval')
@@ -56,8 +60,8 @@ class FieldApprovalView(ModelView): # pylint: disable=too-many-public-methods,t
56
60
  def action_approve(self, ids):
57
61
  """Apply each pending change to its host and mark the row approved."""
58
62
  if not self._can_decide():
59
- flash('Approval requires the "Approve or reject pending field '
60
- 'changes" role.', 'error')
63
+ flash('Approval requires the "Approve or reject pending '
64
+ 'critical-label changes" role.', 'error')
61
65
  return redirect(request.referrer or url_for('.index_view'))
62
66
  applied, skipped = 0, 0
63
67
  for approval in FieldApproval.objects(id__in=ids, status='pending'):
@@ -95,8 +99,8 @@ class FieldApprovalView(ModelView): # pylint: disable=too-many-public-methods,t
95
99
  def action_reject(self, ids):
96
100
  """Mark each pending change as rejected without touching the host."""
97
101
  if not self._can_decide():
98
- flash('Approval requires the "Approve or reject pending field '
99
- 'changes" role.', 'error')
102
+ flash('Approval requires the "Approve or reject pending '
103
+ 'critical-label changes" role.', 'error')
100
104
  return redirect(request.referrer or url_for('.index_view'))
101
105
  rejected = 0
102
106
  for approval in FieldApproval.objects(id__in=ids, status='pending'):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cmdbsyncer
3
- Version: 4.1.0.dev22
3
+ Version: 4.1.2
4
4
  Summary: Rule-based modular synchronizer for Checkmk, Netbox, Ansible, I-DOIT, Jira CMDB and 15+ other CMDB/monitoring systems
5
5
  Author-email: Kuhn & Ruess GmbH <info@kuhn-ruess.de>
6
6
  Maintainer-email: Bastian Kuhn <mail@bastian-kuhn.de>
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "cmdbsyncer"
7
- version = "4.1.0.dev22"
7
+ version = "4.1.2"
8
8
  description = "Rule-based modular synchronizer for Checkmk, Netbox, Ansible, I-DOIT, Jira CMDB and 15+ other CMDB/monitoring systems"
9
9
  readme = "README.md"
10
10
  license = { text = "MIT" }
@@ -1 +0,0 @@
1
- BUILD_DATE=2026-05-13T08:07:31Z
File without changes
File without changes