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
|