foreman_expire_hosts 6.0.1 → 7.0.4
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.
- checksums.yaml +4 -4
- data/README.md +1 -0
- data/app/controllers/concerns/foreman_expire_hosts/api/v2/hosts_controller_extensions.rb +2 -0
- data/app/controllers/concerns/foreman_expire_hosts/host_controller_extensions.rb +20 -15
- data/app/helpers/concerns/foreman_expire_hosts/audits_helper_extensions.rb +2 -0
- data/app/helpers/concerns/foreman_expire_hosts/hosts_helper_extensions.rb +4 -22
- data/app/helpers/expire_hosts_mailer_helper.rb +2 -0
- data/app/helpers/foreman_expire_hosts/hosts_helper.rb +16 -0
- data/app/mailers/expire_hosts_mailer.rb +2 -0
- data/app/models/concerns/foreman_expire_hosts/host_ext.rb +3 -1
- data/app/models/host_status/expiration_status.rb +2 -0
- data/app/models/setting/expire_hosts.rb +2 -0
- data/app/overrides/add_expired_on_field_to_host_form.rb +2 -0
- data/app/overrides/add_expired_on_field_to_host_show.rb +2 -0
- data/app/overrides/deleted_expired_host_comment_in_audits.rb +2 -0
- data/app/services/foreman_expire_hosts/action/base.rb +5 -1
- data/app/services/foreman_expire_hosts/action/delete_expired_hosts.rb +3 -0
- data/app/services/foreman_expire_hosts/action/stop_expired_hosts.rb +3 -1
- data/app/services/foreman_expire_hosts/expiry_edit_authorizer.rb +2 -0
- data/app/services/foreman_expire_hosts/notification/base.rb +8 -3
- data/app/services/foreman_expire_hosts/notification/deleted_hosts.rb +2 -0
- data/app/services/foreman_expire_hosts/notification/expiry_warning.rb +2 -0
- data/app/services/foreman_expire_hosts/notification/failed_deleted_hosts.rb +2 -0
- data/app/services/foreman_expire_hosts/notification/failed_stopped_hosts.rb +2 -0
- data/app/services/foreman_expire_hosts/notification/stopped_hosts.rb +2 -0
- data/app/services/foreman_expire_hosts/safe_destroy.rb +7 -5
- data/app/services/foreman_expire_hosts/ui_notifications/hosts/base.rb +3 -1
- data/app/services/foreman_expire_hosts/ui_notifications/hosts/expiry_warning.rb +2 -0
- data/app/services/foreman_expire_hosts/ui_notifications/hosts/stopped_host.rb +2 -0
- data/app/views/api/v2/hosts/expiration.json.rabl +2 -0
- data/app/views/hosts/_expired_on_field.html.erb +11 -20
- data/app/views/hosts/select_multiple_expiration.html.erb +10 -15
- data/config/routes.rb +2 -0
- data/db/migrate/20150427101516_add_expiry_on_to_hosts.rb +2 -0
- data/db/seeds.d/80_expire_hosts_ui_notification.rb +2 -0
- data/extra/foreman_expire_hosts.cron +8 -0
- data/lib/expire_hosts_notifications.rb +2 -0
- data/lib/foreman_expire_hosts.rb +2 -0
- data/lib/foreman_expire_hosts/engine.rb +22 -10
- data/lib/foreman_expire_hosts/version.rb +3 -1
- data/lib/tasks/expired_hosts.rake +3 -1
- data/test/factories/foreman_expire_hosts_factories.rb +2 -0
- data/test/functional/api/v2/hosts_controller_test.rb +2 -0
- data/test/functional/concerns/hosts_controller_extensions_test.rb +3 -1
- data/test/helpers/hosts_helper_test.rb +5 -0
- data/test/lib/expire_hosts_notifications_test.rb +20 -1
- data/test/test_plugin_helper.rb +2 -0
- data/test/unit/concerns/host_extensions_test.rb +3 -1
- data/test/unit/expire_hosts_mailer_test.rb +6 -0
- data/test/unit/expiry_edit_authorizer_test.rb +2 -0
- data/test/unit/host_status/expiration_status_test.rb +2 -0
- data/test/unit/safe_destroy_test.rb +2 -0
- metadata +61 -42
- data/.gitignore +0 -15
- data/.rubocop.yml +0 -73
- data/.rubocop_todo.yml +0 -42
- data/Gemfile +0 -3
- data/app/assets/javascripts/foreman_expire_hosts/application.js +0 -3
- data/app/assets/javascripts/foreman_expire_hosts/datepicker_for_host_expired_on_field.js +0 -27
- data/app/assets/stylesheets/foreman_expire_hosts/application.scss +0 -4
- data/app/overrides/add_js_to_host_index.rb +0 -6
- data/foreman_expire_hosts.gemspec +0 -26
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: b5afc13d619d302e3e05ae902ff90f65d5eefd05e03b00369c7e3ca538260555
         | 
| 4 | 
            +
              data.tar.gz: 9cdf5ad3a41cdc45a2fe0d4f5c0dc850e0a658abc72e20c83a436b5279a19268
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: e65dddbebf6e2140e12fd05adf1b4584284c7e422a5399642eaf7e59e423b86561dbc9a7c0071835fbbffa50d3e34985ce31b1d1d3f955147e0849b2d8ea0d50
         | 
| 7 | 
            +
              data.tar.gz: 4786bb290163e8f868dbe81d377d3747143cd5bcf3e00194625ea7f1c88f2ef0f6840fb2ccce7f5561a005140cacd6ea625a98b1b9fb45da4bf3444387a6047e
         | 
    
        data/README.md
    CHANGED
    
    | @@ -18,6 +18,7 @@ This plugin will send two warning notifications before host expiry (see Settings | |
| 18 18 | 
             
            | >= 1.16         | ~> 4.0         |
         | 
| 19 19 | 
             
            | >= 1.17         | ~> 5.0         |
         | 
| 20 20 | 
             
            | >= 1.18         | ~> 6.0         |
         | 
| 21 | 
            +
            | >= 1.24         | ~> 7.0         |
         | 
| 21 22 |  | 
| 22 23 | 
             
            # Screenshots
         | 
| 23 24 | 
             
            
         | 
| @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            module ForemanExpireHosts
         | 
| 2 4 | 
             
              module HostControllerExtensions
         | 
| 3 5 | 
             
                def self.prepended(base)
         | 
| @@ -11,23 +13,20 @@ module ForemanExpireHosts | |
| 11 13 | 
             
                def select_multiple_expiration; end
         | 
| 12 14 |  | 
| 13 15 | 
             
                def update_multiple_expiration
         | 
| 14 | 
            -
                  expiration_date = params[:host][:expired_on]
         | 
| 15 | 
            -
                  expiration_date = Date.parse(expiration_date) if expiration_date.present?
         | 
| 16 | 
            -
             | 
| 17 16 | 
             
                  failed_hosts = {}
         | 
| 18 17 |  | 
| 19 18 | 
             
                  @hosts.each do |host|
         | 
| 20 19 | 
             
                    begin
         | 
| 21 20 | 
             
                      host.expired_on = expiration_date
         | 
| 22 21 | 
             
                      host.save!
         | 
| 23 | 
            -
                    rescue StandardError =>  | 
| 24 | 
            -
                      failed_hosts[host.name] =  | 
| 22 | 
            +
                    rescue StandardError => e
         | 
| 23 | 
            +
                      failed_hosts[host.name] = e
         | 
| 25 24 | 
             
                      message = if expiration_date.present?
         | 
| 26 25 | 
             
                                  _('Failed to set expiration date for %{host} to %{expiration_date}.') % { :host => host, :expiration_date => l(expiration_date) }
         | 
| 27 26 | 
             
                                else
         | 
| 28 27 | 
             
                                  _('Failed to clear expiration date for %s.') % host
         | 
| 29 28 | 
             
                                end
         | 
| 30 | 
            -
                      Foreman::Logging.exception(message,  | 
| 29 | 
            +
                      Foreman::Logging.exception(message, e)
         | 
| 31 30 | 
             
                    end
         | 
| 32 31 | 
             
                  end
         | 
| 33 32 |  | 
| @@ -48,15 +47,21 @@ module ForemanExpireHosts | |
| 48 47 | 
             
                private
         | 
| 49 48 |  | 
| 50 49 | 
             
                def validate_multiple_expiration
         | 
| 51 | 
            -
                   | 
| 52 | 
            -
             | 
| 53 | 
            -
             | 
| 54 | 
            -
                   | 
| 55 | 
            -
             | 
| 56 | 
            -
             | 
| 57 | 
            -
             | 
| 58 | 
            -
             | 
| 59 | 
            -
                     | 
| 50 | 
            +
                  expiration_date
         | 
| 51 | 
            +
                rescue ArgumentError
         | 
| 52 | 
            +
                  error _('Invalid expiration date!')
         | 
| 53 | 
            +
                  redirect_to(hosts_path) && (return false)
         | 
| 54 | 
            +
                end
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                def expiration_date
         | 
| 57 | 
            +
                  @expiration_date ||= begin
         | 
| 58 | 
            +
                    year = params['host']['expired_on(1i)']
         | 
| 59 | 
            +
                    month = params['host']['expired_on(2i)']
         | 
| 60 | 
            +
                    day = params['host']['expired_on(3i)']
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                    return if year.empty? && month.empty? && day.empty?
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                    Date.parse("#{year}-#{month}-#{day}")
         | 
| 60 65 | 
             
                  end
         | 
| 61 66 | 
             
                end
         | 
| 62 67 |  | 
| @@ -1,19 +1,9 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            module ForemanExpireHosts
         | 
| 2 4 | 
             
              module HostsHelperExtensions
         | 
| 3 5 | 
             
                extend ActiveSupport::Concern
         | 
| 4 6 |  | 
| 5 | 
            -
                module Overrides
         | 
| 6 | 
            -
                  def multiple_actions
         | 
| 7 | 
            -
                    actions = super
         | 
| 8 | 
            -
                    actions << [_('Change Expiration'), select_multiple_expiration_hosts_path] if authorized_for(:controller => :hosts, :action => :select_multiple_expiration)
         | 
| 9 | 
            -
                    actions
         | 
| 10 | 
            -
                  end
         | 
| 11 | 
            -
                end
         | 
| 12 | 
            -
             | 
| 13 | 
            -
                included do
         | 
| 14 | 
            -
                  prepend Overrides
         | 
| 15 | 
            -
                end
         | 
| 16 | 
            -
             | 
| 17 7 | 
             
                def host_expiry_warning_message(host)
         | 
| 18 8 | 
             
                  return nil unless host.expires?
         | 
| 19 9 |  | 
| @@ -33,18 +23,10 @@ module ForemanExpireHosts | |
| 33 23 | 
             
                  distance_of_time_in_words(to_time, Time.current, options)
         | 
| 34 24 | 
             
                end
         | 
| 35 25 |  | 
| 36 | 
            -
                def  | 
| 37 | 
            -
                  content_tag :span, class: 'input-group-addon' do
         | 
| 38 | 
            -
                    content_tag :span, content, options
         | 
| 39 | 
            -
                  end
         | 
| 40 | 
            -
                end
         | 
| 41 | 
            -
             | 
| 42 | 
            -
                def datepicker_f(form, attr, options = {})
         | 
| 26 | 
            +
                def datepicker_f(form, attr, options = {}, html_options = {})
         | 
| 43 27 | 
             
                  field(form, attr, options) do
         | 
| 44 28 | 
             
                    addClass options, 'form-control'
         | 
| 45 | 
            -
                     | 
| 46 | 
            -
                    addon = input_group_addon('', :class => 'glyphicon glyphicon-calendar')
         | 
| 47 | 
            -
                    input_group date, addon
         | 
| 29 | 
            +
                    form.date_select(attr, options, html_options)
         | 
| 48 30 | 
             
                  end
         | 
| 49 31 | 
             
                end
         | 
| 50 32 | 
             
              end
         | 
| @@ -0,0 +1,16 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module ForemanExpireHosts
         | 
| 4 | 
            +
              module HostsHelper
         | 
| 5 | 
            +
                def expire_hosts_host_multiple_actions
         | 
| 6 | 
            +
                  actions = []
         | 
| 7 | 
            +
                  if authorized_for(:controller => :hosts, :action => :select_multiple_expiration)
         | 
| 8 | 
            +
                    actions << {
         | 
| 9 | 
            +
                      action: [_('Change Expiration'), select_multiple_expiration_hosts_path],
         | 
| 10 | 
            +
                      priority: 200
         | 
| 11 | 
            +
                    }
         | 
| 12 | 
            +
                  end
         | 
| 13 | 
            +
                  actions
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
            end
         | 
| @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            module ForemanExpireHosts
         | 
| 2 4 | 
             
              module HostExt
         | 
| 3 5 | 
             
                extend ActiveSupport::Concern
         | 
| @@ -13,7 +15,7 @@ module ForemanExpireHosts | |
| 13 15 |  | 
| 14 16 | 
             
                  scope :expiring, -> { where('expired_on IS NOT NULL') }
         | 
| 15 17 | 
             
                  scope :with_expire_date, ->(date) { expiring.where('expired_on = ?', date) }
         | 
| 16 | 
            -
                  scope :expired, -> { expiring.where('expired_on  | 
| 18 | 
            +
                  scope :expired, -> { expiring.where('expired_on <= ?', Date.today) }
         | 
| 17 19 | 
             
                  scope :expiring_today, -> { expiring.with_expire_date(Date.today) }
         | 
| 18 20 | 
             
                  scope :expired_past_grace_period, -> { expiring.where('expired_on <= ?', Date.today - Setting[:days_to_delete_after_host_expiration].to_i) }
         | 
| 19 21 |  | 
| @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            module ForemanExpireHosts
         | 
| 2 4 | 
             
              module Action
         | 
| 3 5 | 
             
                class Base
         | 
| @@ -21,8 +23,10 @@ module ForemanExpireHosts | |
| 21 23 | 
             
                      next if result.nil?
         | 
| 22 24 |  | 
| 23 25 | 
             
                      if result
         | 
| 26 | 
            +
                        logger.info "Action #{self.class.name} for host #{host.name} was successful."
         | 
| 24 27 | 
             
                        self.successful_hosts << host
         | 
| 25 28 | 
             
                      else
         | 
| 29 | 
            +
                        logger.info "Action #{self.class.name} for host #{host.name} failed."
         | 
| 26 30 | 
             
                        self.failed_hosts << host
         | 
| 27 31 | 
             
                      end
         | 
| 28 32 | 
             
                    end
         | 
| @@ -54,7 +58,7 @@ module ForemanExpireHosts | |
| 54 58 | 
             
                    }
         | 
| 55 59 | 
             
                  end
         | 
| 56 60 |  | 
| 57 | 
            -
                  delegate :logger, :to => : | 
| 61 | 
            +
                  delegate :logger, :to => :ForemanExpireHosts
         | 
| 58 62 | 
             
                end
         | 
| 59 63 | 
             
              end
         | 
| 60 64 | 
             
            end
         | 
| @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            module ForemanExpireHosts
         | 
| 2 4 | 
             
              module Action
         | 
| 3 5 | 
             
                class DeleteExpiredHosts < Base
         | 
| @@ -8,6 +10,7 @@ module ForemanExpireHosts | |
| 8 10 | 
             
                  end
         | 
| 9 11 |  | 
| 10 12 | 
             
                  def action(host)
         | 
| 13 | 
            +
                    logger.info "Destroying expired host #{host}."
         | 
| 11 14 | 
             
                    SafeDestroy.new(host).destroy!
         | 
| 12 15 | 
             
                  end
         | 
| 13 16 |  | 
| @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            module ForemanExpireHosts
         | 
| 2 4 | 
             
              module Action
         | 
| 3 5 | 
             
                class StopExpiredHosts < Base
         | 
| @@ -11,7 +13,7 @@ module ForemanExpireHosts | |
| 11 13 | 
             
                    return false unless host.supports_power?
         | 
| 12 14 | 
             
                    return unless host.power.ready?
         | 
| 13 15 |  | 
| 14 | 
            -
                    logger.info "Powering down expired host in grace period #{host}"
         | 
| 16 | 
            +
                    logger.info "Powering down expired host in grace period #{host}."
         | 
| 15 17 | 
             
                    host.power.stop
         | 
| 16 18 | 
             
                  rescue StandardError
         | 
| 17 19 | 
             
                    false
         | 
| @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            module ForemanExpireHosts
         | 
| 2 4 | 
             
              module Notification
         | 
| 3 5 | 
             
                class Base
         | 
| @@ -26,22 +28,25 @@ module ForemanExpireHosts | |
| 26 28 | 
             
                  def deliver_mail_notification(recipient, hosts)
         | 
| 27 29 | 
             
                    return true if hosts.empty?
         | 
| 28 30 |  | 
| 31 | 
            +
                    logger.info "Deliving mail notification '#{humanized_name}' for hosts #{hosts.to_sentence} to #{recipient}."
         | 
| 32 | 
            +
             | 
| 29 33 | 
             
                    build_mail_notification(recipient, hosts).deliver_now
         | 
| 30 | 
            -
                  rescue SocketError, Net::SMTPError =>  | 
| 34 | 
            +
                  rescue SocketError, Net::SMTPError => e
         | 
| 31 35 | 
             
                    message = _('Failed to deliver %{notification_name} for Hosts %{hosts}') % {
         | 
| 32 36 | 
             
                      :notification_name => humanized_name,
         | 
| 33 37 | 
             
                      :hosts => hosts.map(&:name).to_sentence
         | 
| 34 38 | 
             
                    }
         | 
| 35 | 
            -
                    Foreman::Logging.exception(message,  | 
| 39 | 
            +
                    Foreman::Logging.exception(message, e)
         | 
| 36 40 | 
             
                  end
         | 
| 37 41 |  | 
| 38 42 | 
             
                  def deliver_ui_notifications
         | 
| 39 43 | 
             
                    all_hosts.each do |host|
         | 
| 44 | 
            +
                      logger.info "Deliving UI notification '#{humanized_name}' for host '#{host}'."
         | 
| 40 45 | 
             
                      build_ui_notification(host).deliver!
         | 
| 41 46 | 
             
                    end
         | 
| 42 47 | 
             
                  end
         | 
| 43 48 |  | 
| 44 | 
            -
                  delegate :logger, :to => : | 
| 49 | 
            +
                  delegate :logger, :to => :ForemanExpireHosts
         | 
| 45 50 |  | 
| 46 51 | 
             
                  def humanized_name
         | 
| 47 52 | 
             
                    _('Notification')
         | 
| @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            module ForemanExpireHosts
         | 
| 2 4 | 
             
              class SafeDestroy
         | 
| 3 5 | 
             
                # See http://projects.theforeman.org/issues/14702 for reasoning.
         | 
| @@ -13,18 +15,18 @@ module ForemanExpireHosts | |
| 13 15 | 
             
                  # See https://community.theforeman.org/t/how-to-properly-destroy-a-content-host/8621
         | 
| 14 16 | 
             
                  # for reasoning.
         | 
| 15 17 | 
             
                  if subject.is_a?(Host::Base) && with_katello?
         | 
| 16 | 
            -
                    Katello::RegistrationManager.unregister_host( | 
| 18 | 
            +
                    Katello::RegistrationManager.unregister_host(subject)
         | 
| 17 19 | 
             
                  else
         | 
| 18 20 | 
             
                    subject.destroy!
         | 
| 19 21 | 
             
                  end
         | 
| 20 | 
            -
                rescue ActiveRecord::RecordNotDestroyed =>  | 
| 22 | 
            +
                rescue ActiveRecord::RecordNotDestroyed => e
         | 
| 21 23 | 
             
                  message = _('Failed to delete %{class_name} %{subject}: %{message} - Errors: %{errors}') % {
         | 
| 22 24 | 
             
                    :class_name => subject.class.name,
         | 
| 23 25 | 
             
                    :subject => subject,
         | 
| 24 | 
            -
                    :message =>  | 
| 25 | 
            -
                    :errors =>  | 
| 26 | 
            +
                    :message => e.message,
         | 
| 27 | 
            +
                    :errors => e.record.errors.full_messages.to_sentence
         | 
| 26 28 | 
             
                  }
         | 
| 27 | 
            -
                  Foreman::Logging.exception(message,  | 
| 29 | 
            +
                  Foreman::Logging.exception(message, e)
         | 
| 28 30 | 
             
                  false
         | 
| 29 31 | 
             
                end
         | 
| 30 32 |  | 
| @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            module ForemanExpireHosts
         | 
| 2 4 | 
             
              module UINotifications
         | 
| 3 5 | 
             
                module Hosts
         | 
| @@ -46,7 +48,7 @@ module ForemanExpireHosts | |
| 46 48 |  | 
| 47 49 | 
             
                    def redeliver!
         | 
| 48 50 | 
             
                      recipients = find_notification.notification_recipients
         | 
| 49 | 
            -
                      recipients.update_all(seen: false) | 
| 51 | 
            +
                      recipients.update_all(seen: false)
         | 
| 50 52 | 
             
                      recipients.pluck(:user_id).each do |user_id|
         | 
| 51 53 | 
             
                        ::UINotifications::CacheHandler.new(user_id).clear
         | 
| 52 54 | 
             
                      end
         | 
| @@ -1,22 +1,13 @@ | |
| 1 | 
            -
            <% if @host.can_modify_expiry_date? %>
         | 
| 2 | 
            -
              <%= stylesheet 'foreman_expire_hosts/application' %>
         | 
| 3 | 
            -
              <%= javascript 'foreman_expire_hosts/application' %>
         | 
| 4 | 
            -
            <% end %>
         | 
| 5 1 | 
             
            <%= datepicker_f f, :expired_on,
         | 
| 6 | 
            -
                        | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
                        | 
| 17 | 
            -
                       :help_block => ('<span class="pficon-warning-triangle-o"></span> '.html_safe + _('You are not allowed to change the expiry date of this host.') unless @host.can_modify_expiry_date?),
         | 
| 18 | 
            -
                       :readonly => !@host.can_modify_expiry_date?,
         | 
| 19 | 
            -
                       :help_inline  => popover('Auto Expiry', _('Host will be deleted automatically on given expiry date.') + '<br>'.html_safe +
         | 
| 20 | 
            -
                                                _('Leave blank to keep the host until deleted manually')),
         | 
| 21 | 
            -
                       :onfocus      => 'append_shortcuts()'
         | 
| 2 | 
            +
                       {
         | 
| 3 | 
            +
                         :label => _('Expires on'),
         | 
| 4 | 
            +
                         :autocomplete => false,
         | 
| 5 | 
            +
                         :include_blank => true,
         | 
| 6 | 
            +
                         :use_month_numbers => false,
         | 
| 7 | 
            +
                         :start_year => Date.today.year,
         | 
| 8 | 
            +
                         :help_block => ('<span class="pficon-warning-triangle-o"></span> '.html_safe + _('You are not allowed to change the expiry date of this host.') unless @host.can_modify_expiry_date?),
         | 
| 9 | 
            +
                         :disabled => !@host.can_modify_expiry_date?,
         | 
| 10 | 
            +
                         :help_inline  => popover('Auto Expiry', _('Expired hosts will be deleted automatically after the grace period has passed.') + '<br>'.html_safe +
         | 
| 11 | 
            +
                                                  _('If you do not want this host to expire and do not want it to be deleted automatically, do not specify an expiry date.'))
         | 
| 12 | 
            +
                       }
         | 
| 22 13 | 
             
            %>
         | 
| @@ -1,23 +1,18 @@ | |
| 1 | 
            -
            <%= stylesheet 'foreman_expire_hosts/application' %>
         | 
| 2 | 
            -
            <%= javascript 'foreman_expire_hosts/application' %>
         | 
| 3 1 | 
             
            <%= render 'selected_hosts', :hosts => @hosts %>
         | 
| 4 2 |  | 
| 5 3 | 
             
            <%= form_for :host, :url => update_multiple_expiration_hosts_path(:host_ids => params[:host_ids]) do |f| %>
         | 
| 6 4 |  | 
| 7 | 
            -
            <%= _(' | 
| 5 | 
            +
            <%= _('Hosts will be deleted automatically on the given expiry date. Leave blank to clear expiration date.') %>
         | 
| 8 6 |  | 
| 9 7 | 
             
            <%= datepicker_f f, :expired_on,
         | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
                 :autocomplete => false,
         | 
| 20 | 
            -
                 :placeholder  => 'dd/mm/yyyy',
         | 
| 21 | 
            -
                 :onfocus      => 'append_shortcuts()'
         | 
| 8 | 
            +
              {
         | 
| 9 | 
            +
                :autocomplete => false,
         | 
| 10 | 
            +
                :include_blank => true,
         | 
| 11 | 
            +
                :use_month_numbers => false,
         | 
| 12 | 
            +
                :start_year => Date.today.year
         | 
| 13 | 
            +
              },
         | 
| 14 | 
            +
              {
         | 
| 15 | 
            +
                :onchange => 'tfm.hosts.table.toggleMultipleOkButton(this);'
         | 
| 16 | 
            +
              }
         | 
| 22 17 | 
             
            %>
         | 
| 23 18 | 
             
            <% end %>
         | 
    
        data/config/routes.rb
    CHANGED
    
    | @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            Foreman::Application.routes.draw do
         | 
| 2 4 | 
             
              post 'expired_hosts/select_multiple_expiration' => 'hosts#select_multiple_expiration', as: 'select_multiple_expiration_hosts'
         | 
| 3 5 | 
             
              post 'expired_hosts/update_multiple_expiration' => 'hosts#update_multiple_expiration', as: 'update_multiple_expiration_hosts'
         | 
| @@ -0,0 +1,8 @@ | |
| 1 | 
            +
            SHELL=/bin/sh
         | 
| 2 | 
            +
            PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            RAILS_ENV=production
         | 
| 5 | 
            +
            FOREMAN_HOME=/usr/share/foreman
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            # Send out notifications about expired hosts
         | 
| 8 | 
            +
            45 7 * * *      foreman    /usr/sbin/foreman-rake expired_hosts:deliver_notifications >>/var/log/foreman/expired_hosts.log 2>&1
         | 
    
        data/lib/foreman_expire_hosts.rb
    CHANGED
    
    
| @@ -1,5 +1,6 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            require 'deface'
         | 
| 2 | 
            -
            require 'bootstrap-datepicker-rails'
         | 
| 3 4 |  | 
| 4 5 | 
             
            module ForemanExpireHosts
         | 
| 5 6 | 
             
              class Engine < ::Rails::Engine
         | 
| @@ -24,7 +25,7 @@ module ForemanExpireHosts | |
| 24 25 |  | 
| 25 26 | 
             
                initializer 'foreman_expire_hosts.register_plugin', :before => :finisher_hook do |_app|
         | 
| 26 27 | 
             
                  Foreman::Plugin.register :foreman_expire_hosts do
         | 
| 27 | 
            -
                    requires_foreman '>= 1. | 
| 28 | 
            +
                    requires_foreman '>= 1.24'
         | 
| 28 29 | 
             
                    register_custom_status HostStatus::ExpirationStatus
         | 
| 29 30 |  | 
| 30 31 | 
             
                    # strong parameters
         | 
| @@ -34,22 +35,29 @@ module ForemanExpireHosts | |
| 34 35 | 
             
                      permission :edit_host_expiry,
         | 
| 35 36 | 
             
                                 {},
         | 
| 36 37 | 
             
                                 :resource_type => 'Host'
         | 
| 37 | 
            -
                      permission :edit_hosts,
         | 
| 38 | 
            -
                                 { :hosts => [:select_multiple_expiration, :update_multiple_expiration] },
         | 
| 39 | 
            -
                                 :resource_type => 'Host'
         | 
| 40 38 | 
             
                    end
         | 
| 41 39 |  | 
| 40 | 
            +
                    # Extend built in permissions
         | 
| 41 | 
            +
                    Foreman::AccessControl.permission(:edit_hosts).actions.concat [
         | 
| 42 | 
            +
                      'hosts/select_multiple_expiration',
         | 
| 43 | 
            +
                      'hosts/update_multiple_expiration'
         | 
| 44 | 
            +
                    ]
         | 
| 45 | 
            +
             | 
| 42 46 | 
             
                    extend_rabl_template 'api/v2/hosts/main', 'api/v2/hosts/expiration'
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                    describe_host do
         | 
| 49 | 
            +
                      multiple_actions_provider :expire_hosts_host_multiple_actions
         | 
| 50 | 
            +
                    end
         | 
| 43 51 | 
             
                  end
         | 
| 44 52 | 
             
                end
         | 
| 45 53 |  | 
| 46 54 | 
             
                config.to_prepare do
         | 
| 47 55 | 
             
                  begin
         | 
| 48 | 
            -
                    Host::Managed. | 
| 49 | 
            -
                    HostsHelper. | 
| 50 | 
            -
                    HostsController. | 
| 51 | 
            -
                    AuditsHelper. | 
| 52 | 
            -
                    ::Api::V2::HostsController. | 
| 56 | 
            +
                    ::Host::Managed.include ForemanExpireHosts::HostExt
         | 
| 57 | 
            +
                    ::HostsHelper.include ForemanExpireHosts::HostsHelperExtensions
         | 
| 58 | 
            +
                    ::HostsController.prepend ForemanExpireHosts::HostControllerExtensions
         | 
| 59 | 
            +
                    ::AuditsHelper.include ForemanExpireHosts::AuditsHelperExtensions
         | 
| 60 | 
            +
                    ::Api::V2::HostsController.include ForemanExpireHosts::Api::V2::HostsControllerExtensions
         | 
| 53 61 | 
             
                  rescue StandardError => e
         | 
| 54 62 | 
             
                    Rails.logger.warn "ForemanExpireHosts: skipping engine hook (#{e})"
         | 
| 55 63 | 
             
                  end
         | 
| @@ -61,4 +69,8 @@ module ForemanExpireHosts | |
| 61 69 | 
             
                  end
         | 
| 62 70 | 
             
                end
         | 
| 63 71 | 
             
              end
         | 
| 72 | 
            +
             | 
| 73 | 
            +
              def self.logger
         | 
| 74 | 
            +
                Foreman::Logging.logger('foreman_expire_hosts')
         | 
| 75 | 
            +
              end
         | 
| 64 76 | 
             
            end
         | 
| @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            # Tasks
         | 
| 2 4 | 
             
            namespace :expired_hosts do
         | 
| 3 5 | 
             
              desc 'Delete all expired hosts, send notification email about expiring hosts'
         | 
| @@ -24,7 +26,7 @@ namespace :test do | |
| 24 26 | 
             
            end
         | 
| 25 27 |  | 
| 26 28 | 
             
            namespace :foreman_expire_hosts do
         | 
| 27 | 
            -
              task :rubocop do
         | 
| 29 | 
            +
              task :rubocop => :environment do
         | 
| 28 30 | 
             
                begin
         | 
| 29 31 | 
             
                  require 'rubocop/rake_task'
         | 
| 30 32 | 
             
                  RuboCop::RakeTask.new(:rubocop_foreman_expire_hosts) do |task|
         | 
| @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            require 'test_plugin_helper'
         | 
| 2 4 |  | 
| 3 5 | 
             
            class HostsControllerTest < ActionController::TestCase
         | 
| @@ -68,7 +70,7 @@ class HostsControllerTest < ActionController::TestCase | |
| 68 70 | 
             
                test 'should set expiration date' do
         | 
| 69 71 | 
             
                  expiration_date = Date.today + 14
         | 
| 70 72 | 
             
                  params = { :host_ids => @hosts.map(&:id),
         | 
| 71 | 
            -
                             :host => {  | 
| 73 | 
            +
                             :host => { 'expired_on(1i)' => expiration_date.day.to_s, 'expired_on(2i)' => expiration_date.month.to_s, 'expired_on(3i)' => expiration_date.year.to_s } }
         | 
| 72 74 |  | 
| 73 75 | 
             
                  post :update_multiple_expiration, params: params, session: set_session_user.merge(:user => users(:admin).id)
         | 
| 74 76 |  | 
| @@ -1,7 +1,12 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            require 'test_plugin_helper'
         | 
| 2 4 |  | 
| 3 5 | 
             
            class HostsHelperTest < ActionView::TestCase
         | 
| 4 6 | 
             
              include HostsHelper
         | 
| 7 | 
            +
              include HostDescriptionHelper
         | 
| 8 | 
            +
              include PuppetRelatedHelper
         | 
| 9 | 
            +
              include ForemanExpireHosts::HostsHelper
         | 
| 5 10 | 
             
              include ApplicationHelper
         | 
| 6 11 |  | 
| 7 12 | 
             
              describe '#multiple_actions' do
         | 
| @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            require 'test_plugin_helper'
         | 
| 2 4 | 
             
            require 'notifications_test_helper'
         | 
| 3 5 |  | 
| @@ -117,6 +119,23 @@ class ExpireHostsNotificationsTest < ActiveSupport::TestCase | |
| 117 119 | 
             
                  assert_equal 1, ActionMailer::Base.deliveries.count
         | 
| 118 120 | 
             
                  assert_includes ActionMailer::Base.deliveries.first.subject, 'Failed to stop expired hosts'
         | 
| 119 121 | 
             
                end
         | 
| 122 | 
            +
             | 
| 123 | 
            +
                context 'with a host expiring today' do
         | 
| 124 | 
            +
                  let(:host) { FactoryBot.create(:host, :expires_today, :on_compute_resource, :owner => user) }
         | 
| 125 | 
            +
                  let(:delete_date) { Date.today + Setting[:days_to_delete_after_host_expiration].to_i }
         | 
| 126 | 
            +
             | 
| 127 | 
            +
                  it 'should stop the host and show the correct delete date' do
         | 
| 128 | 
            +
                    power_mock.expects(:stop).returns(true)
         | 
| 129 | 
            +
                    ExpireHostsNotifications.stop_expired_hosts
         | 
| 130 | 
            +
                    assert_equal 1, ActionMailer::Base.deliveries.count
         | 
| 131 | 
            +
                    assert_includes ActionMailer::Base.deliveries.first.subject, 'Stopped expired hosts'
         | 
| 132 | 
            +
                    assert_includes ActionMailer::Base.deliveries.first.body, "These hosts will be destroyed on #{delete_date}."
         | 
| 133 | 
            +
             | 
| 134 | 
            +
                    travel_to delete_date do
         | 
| 135 | 
            +
                      assert_includes Host.expired_past_grace_period, host
         | 
| 136 | 
            +
                    end
         | 
| 137 | 
            +
                  end
         | 
| 138 | 
            +
                end
         | 
| 120 139 | 
             
              end
         | 
| 121 140 |  | 
| 122 141 | 
             
              context '#deliver_expiry_warning_notification' do
         | 
| @@ -150,7 +169,7 @@ class ExpireHostsNotificationsTest < ActiveSupport::TestCase | |
| 150 169 | 
             
                    ExpireHostsNotifications.deliver_expiry_warning_notification
         | 
| 151 170 | 
             
                    notification = Notification.find_by(notification_blueprint_id: blueprint.id, subject_id: hosts.first.id)
         | 
| 152 171 | 
             
                    assert_not_nil notification
         | 
| 153 | 
            -
                    assert_equal 1, NotificationRecipient.where(notification_id: notification.id).update_all(seen: true) | 
| 172 | 
            +
                    assert_equal 1, NotificationRecipient.where(notification_id: notification.id).update_all(seen: true)
         | 
| 154 173 | 
             
                    ExpireHostsNotifications.deliver_expiry_warning_notification
         | 
| 155 174 | 
             
                    assert_equal 1, NotificationRecipient.where(notification_id: notification.id, seen: false).count
         | 
| 156 175 | 
             
                  end
         | 
    
        data/test/test_plugin_helper.rb
    CHANGED
    
    
| @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            require 'test_plugin_helper'
         | 
| 2 4 |  | 
| 3 5 | 
             
            class ForemanExpireHostsHostExtTest < ActiveSupport::TestCase
         | 
| @@ -180,7 +182,7 @@ class ForemanExpireHostsHostExtTest < ActiveSupport::TestCase | |
| 180 182 | 
             
                end
         | 
| 181 183 |  | 
| 182 184 | 
             
                test 'should only exist in correct scopes' do
         | 
| 183 | 
            -
                  exists_only_in_scopes(@host, ['expiring', 'expiring_today'])
         | 
| 185 | 
            +
                  exists_only_in_scopes(@host, ['expiring', 'expired', 'expiring_today'])
         | 
| 184 186 | 
             
                end
         | 
| 185 187 | 
             
              end
         | 
| 186 188 |  | 
| @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            require 'test_plugin_helper'
         | 
| 2 4 |  | 
| 3 5 | 
             
            class ExpireHostMailerTest < ActionMailer::TestCase
         | 
| @@ -35,6 +37,10 @@ class ExpireHostMailerTest < ActionMailer::TestCase | |
| 35 37 | 
             
                  assert_includes mail.subject, 'Stopped expired hosts in Foreman'
         | 
| 36 38 | 
             
                end
         | 
| 37 39 |  | 
| 40 | 
            +
                test 'should include a deletion date' do
         | 
| 41 | 
            +
                  assert_includes mail.body, "These hosts will be destroyed on #{Date.today}."
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
             | 
| 38 44 | 
             
                test 'should show mitigation text if authorized' do
         | 
| 39 45 | 
             
                  ForemanExpireHosts::ExpiryEditAuthorizer.any_instance.stubs(:authorized?).returns(true)
         | 
| 40 46 | 
             
                  assert_includes mail.body.to_s, 'Please change their expiry date'
         | 
    
        metadata
    CHANGED
    
    | @@ -1,18 +1,18 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: foreman_expire_hosts
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version:  | 
| 4 | 
            +
              version: 7.0.4
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Nagarjuna Rachaneni
         | 
| 8 8 | 
             
            - Timo Goebel
         | 
| 9 | 
            -
            autorequire: | 
| 9 | 
            +
            autorequire:
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date:  | 
| 12 | 
            +
            date: 2021-02-02 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 | 
            -
              name:  | 
| 15 | 
            +
              name: deface
         | 
| 16 16 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 17 17 | 
             
                requirements:
         | 
| 18 18 | 
             
                - - ">="
         | 
| @@ -26,13 +26,13 @@ dependencies: | |
| 26 26 | 
             
                  - !ruby/object:Gem::Version
         | 
| 27 27 | 
             
                    version: '0'
         | 
| 28 28 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 29 | 
            -
              name:  | 
| 29 | 
            +
              name: rdoc
         | 
| 30 30 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 31 31 | 
             
                requirements:
         | 
| 32 32 | 
             
                - - ">="
         | 
| 33 33 | 
             
                  - !ruby/object:Gem::Version
         | 
| 34 34 | 
             
                    version: '0'
         | 
| 35 | 
            -
              type: : | 
| 35 | 
            +
              type: :development
         | 
| 36 36 | 
             
              prerelease: false
         | 
| 37 37 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 38 38 | 
             
                requirements:
         | 
| @@ -40,65 +40,85 @@ dependencies: | |
| 40 40 | 
             
                  - !ruby/object:Gem::Version
         | 
| 41 41 | 
             
                    version: '0'
         | 
| 42 42 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 43 | 
            -
              name:  | 
| 43 | 
            +
              name: rubocop
         | 
| 44 44 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 45 45 | 
             
                requirements:
         | 
| 46 | 
            -
                - - " | 
| 46 | 
            +
                - - "~>"
         | 
| 47 47 | 
             
                  - !ruby/object:Gem::Version
         | 
| 48 | 
            -
                    version:  | 
| 48 | 
            +
                    version: 0.80.0
         | 
| 49 49 | 
             
              type: :development
         | 
| 50 50 | 
             
              prerelease: false
         | 
| 51 51 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 52 52 | 
             
                requirements:
         | 
| 53 | 
            -
                - - " | 
| 53 | 
            +
                - - "~>"
         | 
| 54 54 | 
             
                  - !ruby/object:Gem::Version
         | 
| 55 | 
            -
                    version:  | 
| 55 | 
            +
                    version: 0.80.0
         | 
| 56 56 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 57 | 
            -
              name: rubocop
         | 
| 57 | 
            +
              name: rubocop-minitest
         | 
| 58 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 59 | 
            +
                requirements:
         | 
| 60 | 
            +
                - - "~>"
         | 
| 61 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 62 | 
            +
                    version: 0.7.0
         | 
| 63 | 
            +
              type: :development
         | 
| 64 | 
            +
              prerelease: false
         | 
| 65 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 66 | 
            +
                requirements:
         | 
| 67 | 
            +
                - - "~>"
         | 
| 68 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 69 | 
            +
                    version: 0.7.0
         | 
| 70 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 71 | 
            +
              name: rubocop-performance
         | 
| 72 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 73 | 
            +
                requirements:
         | 
| 74 | 
            +
                - - "~>"
         | 
| 75 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 76 | 
            +
                    version: 1.5.2
         | 
| 77 | 
            +
              type: :development
         | 
| 78 | 
            +
              prerelease: false
         | 
| 79 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 80 | 
            +
                requirements:
         | 
| 81 | 
            +
                - - "~>"
         | 
| 82 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 83 | 
            +
                    version: 1.5.2
         | 
| 84 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 85 | 
            +
              name: rubocop-rails
         | 
| 58 86 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 59 87 | 
             
                requirements:
         | 
| 60 | 
            -
                - -  | 
| 88 | 
            +
                - - "~>"
         | 
| 61 89 | 
             
                  - !ruby/object:Gem::Version
         | 
| 62 | 
            -
                    version:  | 
| 90 | 
            +
                    version: 2.4.2
         | 
| 63 91 | 
             
              type: :development
         | 
| 64 92 | 
             
              prerelease: false
         | 
| 65 93 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 66 94 | 
             
                requirements:
         | 
| 67 | 
            -
                - -  | 
| 95 | 
            +
                - - "~>"
         | 
| 68 96 | 
             
                  - !ruby/object:Gem::Version
         | 
| 69 | 
            -
                    version:  | 
| 70 | 
            -
            description:  | 
| 71 | 
            -
               | 
| 97 | 
            +
                    version: 2.4.2
         | 
| 98 | 
            +
            description: |
         | 
| 99 | 
            +
              A Foreman plugin that allows hosts to expire at a configurable date.
         | 
| 100 | 
            +
              Hosts will be shut down and automatically deleted after a grace period.
         | 
| 72 101 | 
             
            email:
         | 
| 73 102 | 
             
            - nn.nagarjuna@gmail.com
         | 
| 74 103 | 
             
            - mail@timogoebel.name
         | 
| 75 104 | 
             
            executables: []
         | 
| 76 105 | 
             
            extensions: []
         | 
| 77 | 
            -
            extra_rdoc_files:
         | 
| 78 | 
            -
            - README.md
         | 
| 79 | 
            -
            - LICENSE
         | 
| 106 | 
            +
            extra_rdoc_files: []
         | 
| 80 107 | 
             
            files:
         | 
| 81 | 
            -
            - ".gitignore"
         | 
| 82 | 
            -
            - ".rubocop.yml"
         | 
| 83 | 
            -
            - ".rubocop_todo.yml"
         | 
| 84 | 
            -
            - Gemfile
         | 
| 85 108 | 
             
            - LICENSE
         | 
| 86 109 | 
             
            - README.md
         | 
| 87 | 
            -
            - app/assets/javascripts/foreman_expire_hosts/application.js
         | 
| 88 | 
            -
            - app/assets/javascripts/foreman_expire_hosts/datepicker_for_host_expired_on_field.js
         | 
| 89 | 
            -
            - app/assets/stylesheets/foreman_expire_hosts/application.scss
         | 
| 90 110 | 
             
            - app/controllers/concerns/foreman_expire_hosts/api/v2/hosts_controller_extensions.rb
         | 
| 91 111 | 
             
            - app/controllers/concerns/foreman_expire_hosts/host_controller_extensions.rb
         | 
| 92 112 | 
             
            - app/helpers/concerns/foreman_expire_hosts/audits_helper_extensions.rb
         | 
| 93 113 | 
             
            - app/helpers/concerns/foreman_expire_hosts/hosts_helper_extensions.rb
         | 
| 94 114 | 
             
            - app/helpers/expire_hosts_mailer_helper.rb
         | 
| 115 | 
            +
            - app/helpers/foreman_expire_hosts/hosts_helper.rb
         | 
| 95 116 | 
             
            - app/mailers/expire_hosts_mailer.rb
         | 
| 96 117 | 
             
            - app/models/concerns/foreman_expire_hosts/host_ext.rb
         | 
| 97 118 | 
             
            - app/models/host_status/expiration_status.rb
         | 
| 98 119 | 
             
            - app/models/setting/expire_hosts.rb
         | 
| 99 120 | 
             
            - app/overrides/add_expired_on_field_to_host_form.rb
         | 
| 100 121 | 
             
            - app/overrides/add_expired_on_field_to_host_show.rb
         | 
| 101 | 
            -
            - app/overrides/add_js_to_host_index.rb
         | 
| 102 122 | 
             
            - app/overrides/deleted_expired_host_comment_in_audits.rb
         | 
| 103 123 | 
             
            - app/services/foreman_expire_hosts/action/base.rb
         | 
| 104 124 | 
             
            - app/services/foreman_expire_hosts/action/delete_expired_hosts.rb
         | 
| @@ -127,7 +147,7 @@ files: | |
| 127 147 | 
             
            - config/routes.rb
         | 
| 128 148 | 
             
            - db/migrate/20150427101516_add_expiry_on_to_hosts.rb
         | 
| 129 149 | 
             
            - db/seeds.d/80_expire_hosts_ui_notification.rb
         | 
| 130 | 
            -
            - foreman_expire_hosts. | 
| 150 | 
            +
            - extra/foreman_expire_hosts.cron
         | 
| 131 151 | 
             
            - lib/expire_hosts_notifications.rb
         | 
| 132 152 | 
             
            - lib/foreman_expire_hosts.rb
         | 
| 133 153 | 
             
            - lib/foreman_expire_hosts/engine.rb
         | 
| @@ -148,7 +168,7 @@ homepage: https://github.com/theforeman/foreman_expire_hosts | |
| 148 168 | 
             
            licenses:
         | 
| 149 169 | 
             
            - GPL-3.0
         | 
| 150 170 | 
             
            metadata: {}
         | 
| 151 | 
            -
            post_install_message: | 
| 171 | 
            +
            post_install_message:
         | 
| 152 172 | 
             
            rdoc_options: []
         | 
| 153 173 | 
             
            require_paths:
         | 
| 154 174 | 
             
            - lib
         | 
| @@ -163,20 +183,19 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 163 183 | 
             
                - !ruby/object:Gem::Version
         | 
| 164 184 | 
             
                  version: '0'
         | 
| 165 185 | 
             
            requirements: []
         | 
| 166 | 
            -
             | 
| 167 | 
            -
             | 
| 168 | 
            -
            signing_key: 
         | 
| 186 | 
            +
            rubygems_version: 3.1.2
         | 
| 187 | 
            +
            signing_key:
         | 
| 169 188 | 
             
            specification_version: 4
         | 
| 170 189 | 
             
            summary: Foreman plugin for limiting host lifetime
         | 
| 171 190 | 
             
            test_files:
         | 
| 172 | 
            -
            - test/factories/foreman_expire_hosts_factories.rb
         | 
| 173 | 
            -
            - test/functional/api/v2/hosts_controller_test.rb
         | 
| 174 | 
            -
            - test/functional/concerns/hosts_controller_extensions_test.rb
         | 
| 175 | 
            -
            - test/helpers/hosts_helper_test.rb
         | 
| 176 | 
            -
            - test/lib/expire_hosts_notifications_test.rb
         | 
| 177 | 
            -
            - test/test_plugin_helper.rb
         | 
| 178 | 
            -
            - test/unit/concerns/host_extensions_test.rb
         | 
| 179 191 | 
             
            - test/unit/expire_hosts_mailer_test.rb
         | 
| 180 | 
            -
            - test/unit/expiry_edit_authorizer_test.rb
         | 
| 181 192 | 
             
            - test/unit/host_status/expiration_status_test.rb
         | 
| 182 193 | 
             
            - test/unit/safe_destroy_test.rb
         | 
| 194 | 
            +
            - test/unit/expiry_edit_authorizer_test.rb
         | 
| 195 | 
            +
            - test/unit/concerns/host_extensions_test.rb
         | 
| 196 | 
            +
            - test/factories/foreman_expire_hosts_factories.rb
         | 
| 197 | 
            +
            - test/lib/expire_hosts_notifications_test.rb
         | 
| 198 | 
            +
            - test/test_plugin_helper.rb
         | 
| 199 | 
            +
            - test/helpers/hosts_helper_test.rb
         | 
| 200 | 
            +
            - test/functional/api/v2/hosts_controller_test.rb
         | 
| 201 | 
            +
            - test/functional/concerns/hosts_controller_extensions_test.rb
         | 
    
        data/.gitignore
    DELETED
    
    
    
        data/.rubocop.yml
    DELETED
    
    | @@ -1,73 +0,0 @@ | |
| 1 | 
            -
            inherit_from:
         | 
| 2 | 
            -
              - .rubocop_todo.yml
         | 
| 3 | 
            -
             | 
| 4 | 
            -
            AllCops:
         | 
| 5 | 
            -
              TargetRubyVersion: 2.2
         | 
| 6 | 
            -
              TargetRailsVersion: 5.1
         | 
| 7 | 
            -
              Exclude:
         | 
| 8 | 
            -
                - 'Rakefile'
         | 
| 9 | 
            -
             | 
| 10 | 
            -
            Rails:
         | 
| 11 | 
            -
              Enabled: true
         | 
| 12 | 
            -
             | 
| 13 | 
            -
            Rails/Date:
         | 
| 14 | 
            -
              Enabled: false
         | 
| 15 | 
            -
             | 
| 16 | 
            -
            # Don't enforce documentation
         | 
| 17 | 
            -
            Style/Documentation:
         | 
| 18 | 
            -
              Enabled: false
         | 
| 19 | 
            -
             | 
| 20 | 
            -
            Metrics/MethodLength:
         | 
| 21 | 
            -
              Max: 40
         | 
| 22 | 
            -
             | 
| 23 | 
            -
            Naming/AccessorMethodName:
         | 
| 24 | 
            -
              Enabled: false
         | 
| 25 | 
            -
             | 
| 26 | 
            -
            Style/RedundantSelf:
         | 
| 27 | 
            -
              Enabled: false
         | 
| 28 | 
            -
             | 
| 29 | 
            -
            Metrics/ClassLength:
         | 
| 30 | 
            -
              Max: 500
         | 
| 31 | 
            -
             | 
| 32 | 
            -
            Naming/FileName:
         | 
| 33 | 
            -
              Exclude:
         | 
| 34 | 
            -
                  - 'db/seeds.d/*'
         | 
| 35 | 
            -
             | 
| 36 | 
            -
            Style/WordArray:
         | 
| 37 | 
            -
              Enabled: false
         | 
| 38 | 
            -
             | 
| 39 | 
            -
            Style/BracesAroundHashParameters:
         | 
| 40 | 
            -
              Enabled: false
         | 
| 41 | 
            -
             | 
| 42 | 
            -
            Style/RescueModifier:
         | 
| 43 | 
            -
              Enabled: false
         | 
| 44 | 
            -
             | 
| 45 | 
            -
            Style/ClassAndModuleChildren:
         | 
| 46 | 
            -
              Enabled: false
         | 
| 47 | 
            -
             | 
| 48 | 
            -
            Style/EachWithObject:
         | 
| 49 | 
            -
              Enabled: false
         | 
| 50 | 
            -
             | 
| 51 | 
            -
            Metrics/ParameterLists:
         | 
| 52 | 
            -
              Enabled: false
         | 
| 53 | 
            -
             | 
| 54 | 
            -
            Style/SymbolArray:
         | 
| 55 | 
            -
              Enabled: false
         | 
| 56 | 
            -
             | 
| 57 | 
            -
            Style/FormatString:
         | 
| 58 | 
            -
              Enabled: false
         | 
| 59 | 
            -
             | 
| 60 | 
            -
            Style/FormatStringToken:
         | 
| 61 | 
            -
              Enabled: false
         | 
| 62 | 
            -
             | 
| 63 | 
            -
            Style/HashSyntax:
         | 
| 64 | 
            -
              Enabled: false
         | 
| 65 | 
            -
             | 
| 66 | 
            -
            Rails/HasManyOrHasOneDependent:
         | 
| 67 | 
            -
              Enabled: false
         | 
| 68 | 
            -
             | 
| 69 | 
            -
            Style/CommentedKeyword:
         | 
| 70 | 
            -
              Enabled: false
         | 
| 71 | 
            -
             | 
| 72 | 
            -
            Rails/LexicallyScopedActionFilter:
         | 
| 73 | 
            -
              Enabled: false
         | 
    
        data/.rubocop_todo.yml
    DELETED
    
    | @@ -1,42 +0,0 @@ | |
| 1 | 
            -
            # This configuration was generated by
         | 
| 2 | 
            -
            # `rubocop --auto-gen-config`
         | 
| 3 | 
            -
            # on 2017-08-01 16:36:14 +0200 using RuboCop version 0.49.1.
         | 
| 4 | 
            -
            # The point is for the user to remove these configuration records
         | 
| 5 | 
            -
            # one by one as the offenses are removed from the code base.
         | 
| 6 | 
            -
            # Note that changes in the inspected code, or installation of new
         | 
| 7 | 
            -
            # versions of RuboCop, may require this file to be generated again.
         | 
| 8 | 
            -
             | 
| 9 | 
            -
            # Offense count: 12
         | 
| 10 | 
            -
            Metrics/AbcSize:
         | 
| 11 | 
            -
              Max: 51
         | 
| 12 | 
            -
             | 
| 13 | 
            -
            # Offense count: 4
         | 
| 14 | 
            -
            # Configuration parameters: CountComments, ExcludedMethods.
         | 
| 15 | 
            -
            Metrics/BlockLength:
         | 
| 16 | 
            -
              Max: 35
         | 
| 17 | 
            -
              Exclude:
         | 
| 18 | 
            -
                - 'test/**/*.rb'
         | 
| 19 | 
            -
             | 
| 20 | 
            -
            # Offense count: 3
         | 
| 21 | 
            -
            Metrics/CyclomaticComplexity:
         | 
| 22 | 
            -
              Max: 11
         | 
| 23 | 
            -
             | 
| 24 | 
            -
            # Offense count: 89
         | 
| 25 | 
            -
            # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
         | 
| 26 | 
            -
            # URISchemes: http, https
         | 
| 27 | 
            -
            Metrics/LineLength:
         | 
| 28 | 
            -
              Max: 362
         | 
| 29 | 
            -
             | 
| 30 | 
            -
            # Offense count: 1
         | 
| 31 | 
            -
            # Configuration parameters: CountComments.
         | 
| 32 | 
            -
            Metrics/ModuleLength:
         | 
| 33 | 
            -
              Max: 110
         | 
| 34 | 
            -
             | 
| 35 | 
            -
            # Offense count: 3
         | 
| 36 | 
            -
            Metrics/PerceivedComplexity:
         | 
| 37 | 
            -
              Max: 11
         | 
| 38 | 
            -
             | 
| 39 | 
            -
            # Offense count: 2
         | 
| 40 | 
            -
            Rails/OutputSafety:
         | 
| 41 | 
            -
              Exclude:
         | 
| 42 | 
            -
                - 'app/helpers/concerns/foreman_expire_hosts/audits_helper_extensions.rb'
         | 
    
        data/Gemfile
    DELETED
    
    
| @@ -1,27 +0,0 @@ | |
| 1 | 
            -
            var shortcuts = {"1 day": 1, "1 week": 7, "1 month": 30, "1 year": 365, "3 days": 3, "3 weeks": 21, "3 months": 90};
         | 
| 2 | 
            -
            function append_shortcuts() {
         | 
| 3 | 
            -
              if ($(".datepicker-days #datepicker_shortcuts").length == 0) {
         | 
| 4 | 
            -
                var shortcuts_html = "<div id='datepicker_shortcuts'><div>";
         | 
| 5 | 
            -
                var shortcut_item = 1;
         | 
| 6 | 
            -
                $.each(shortcuts, function (lable, days) {
         | 
| 7 | 
            -
                  var today = new Date();
         | 
| 8 | 
            -
                  today.setDate(today.getDate() + days);
         | 
| 9 | 
            -
                  if (shortcut_item == 5) {
         | 
| 10 | 
            -
                    shortcuts_html += "</div><div style='padding-top: 3px'>"
         | 
| 11 | 
            -
                  }
         | 
| 12 | 
            -
                  shortcuts_html += "<a style='width: 65px;' class='btn btn-default btn-xs' role='button' title='" + $.fn.datepicker.dates.en.monthsShort[today.getMonth()] + " " + today.getDate() + " " + today.getFullYear() + "' onclick='populate_date_from_days(" + days + ")'>" + lable + "</a> ";
         | 
| 13 | 
            -
                  shortcut_item += 1
         | 
| 14 | 
            -
                });
         | 
| 15 | 
            -
                shortcuts_html += "</div></div>";
         | 
| 16 | 
            -
                $(".datepicker-days table").before(shortcuts_html)
         | 
| 17 | 
            -
              }
         | 
| 18 | 
            -
            }
         | 
| 19 | 
            -
             | 
| 20 | 
            -
            function populate_date_from_days(shortcut_days) {
         | 
| 21 | 
            -
              var today = new Date();
         | 
| 22 | 
            -
              today.setDate(today.getDate() + shortcut_days);
         | 
| 23 | 
            -
              $('#host_expired_on').datepicker('setDate', today);
         | 
| 24 | 
            -
              $('#host_expired_on').datepicker('remove');
         | 
| 25 | 
            -
              //$('#host_expired_on').val(today.getDate()+'/'+(today.getMonth()+1)+'/'+today.getFullYear())
         | 
| 26 | 
            -
              //$('#host_expired_on').datepicker('hide')
         | 
| 27 | 
            -
            }
         | 
| @@ -1,26 +0,0 @@ | |
| 1 | 
            -
            require File.expand_path('lib/foreman_expire_hosts/version', __dir__)
         | 
| 2 | 
            -
            require 'date'
         | 
| 3 | 
            -
             | 
| 4 | 
            -
            Gem::Specification.new do |s|
         | 
| 5 | 
            -
              s.name        = 'foreman_expire_hosts'
         | 
| 6 | 
            -
              s.version     = ForemanExpireHosts::VERSION
         | 
| 7 | 
            -
              s.date        = Date.today.to_s
         | 
| 8 | 
            -
              s.authors     = ['Nagarjuna Rachaneni', 'Timo Goebel']
         | 
| 9 | 
            -
              s.email       = ['nn.nagarjuna@gmail.com', 'mail@timogoebel.name']
         | 
| 10 | 
            -
              s.summary     = 'Foreman plugin for limiting host lifetime'
         | 
| 11 | 
            -
              s.description = 'This Plugin will add new column expired_on to hosts to limit the lifetime of a host.'
         | 
| 12 | 
            -
              s.homepage    = 'https://github.com/theforeman/foreman_expire_hosts'
         | 
| 13 | 
            -
              s.licenses    = ['GPL-3.0']
         | 
| 14 | 
            -
             | 
| 15 | 
            -
              s.files =            `git ls-files`.split("\n")
         | 
| 16 | 
            -
              s.test_files =       `git ls-files test`.split("\n")
         | 
| 17 | 
            -
              s.extra_rdoc_files = `git ls-files doc`.split("\n") + Dir['README*', 'LICENSE']
         | 
| 18 | 
            -
             | 
| 19 | 
            -
              s.require_paths = ['lib']
         | 
| 20 | 
            -
             | 
| 21 | 
            -
              s.add_dependency 'bootstrap-datepicker-rails'
         | 
| 22 | 
            -
              s.add_dependency 'deface'
         | 
| 23 | 
            -
             | 
| 24 | 
            -
              s.add_development_dependency 'rdoc'
         | 
| 25 | 
            -
              s.add_development_dependency 'rubocop', '0.59.2'
         | 
| 26 | 
            -
            end
         |