20230807171019_postmaster_filter_regex_operator.rb 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. # Copyright (C) 2012-2023 Zammad Foundation, https://zammad-foundation.org/
  2. class PostmasterFilterRegexOperator < ActiveRecord::Migration[6.1]
  3. def change
  4. # return if it's a new setup
  5. return if !Setting.exists?(name: 'system_init_done')
  6. update_postmaster_filter
  7. update_monitoring_settings
  8. end
  9. private
  10. OPERATOR_MAPPING = {
  11. 'contains' => 'matches regex',
  12. 'contains not' => 'does not match regex',
  13. }.freeze
  14. def update_postmaster_filter
  15. PostmasterFilter.in_batches.each_record do |filter|
  16. next if filter.match.blank?
  17. filter.match.each_value do |condition|
  18. next if !relevant_filter_condition?(condition)
  19. regex = condition_regex_value(condition[:value])
  20. next if regex.blank?
  21. update_condition(condition, regex)
  22. end
  23. filter.save!
  24. end
  25. end
  26. def update_monitoring_settings
  27. %w[nagios icinga monit].each do |monitoring_name|
  28. setting_name = "#{monitoring_name}_sender"
  29. value = Setting.get(setting_name)
  30. regex = condition_regex_value(value)
  31. next if regex.blank?
  32. Setting.set(setting_name, regex)
  33. end
  34. end
  35. def relevant_filter_condition?(condition)
  36. return false if condition[:operator].blank?
  37. return false if OPERATOR_MAPPING.keys.exclude?(condition[:operator])
  38. true
  39. end
  40. def condition_regex_value(value)
  41. match = %r{^regex:(?<value>.+?)$}.match(value)
  42. return if match.blank?
  43. match[:value]
  44. end
  45. def update_condition(condition, regex)
  46. condition[:operator] = OPERATOR_MAPPING[condition[:operator]]
  47. condition[:value] = regex
  48. end
  49. end