foreman_ansible 8.0.1 → 9.0.0
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/app/helpers/foreman_ansible/ansible_hostgroups_helper.rb +15 -0
- data/app/helpers/foreman_ansible/ansible_reports_helper.rb +0 -4
- data/lib/foreman_ansible/register.rb +5 -1
- data/lib/foreman_ansible/register.rb.orig +257 -0
- data/lib/foreman_ansible/version.rb +1 -1
- metadata +4 -4
- data/app/overrides/hostgroup_play_roles.rb +0 -9
- data/app/views/foreman_ansible/ansible_roles/_hostgroup_ansible_roles_button.erb +0 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: df3c4d8c1514c442f1da8c0c6ef356482f5edb63ca14df0e39ef83818076f22b
|
4
|
+
data.tar.gz: 253b5ef0614bb34d78ad96b7312537b496b4850ea34d6ba7a960f9df34da5e02
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b6f8201c41db492b56888c675cb460f88e5dae92aeb808487747783ba43031961a27f66eb2df975216385b8e003d2df645f4208f0a1f0d4bec44b0c02f878984
|
7
|
+
data.tar.gz: da19e080f0fa135ae2cb4757fae4a10a946989ecc953cf41eb774877b075bcfc68455707d4abc3a4265fdcb1421714572947bb14eefc709a8d825d6c23623987
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ForemanAnsible
|
4
|
+
module AnsibleHostgroupsHelper
|
5
|
+
def ansible_hostgroups_actions(hostgroup)
|
6
|
+
play_roles = if hostgroup.all_ansible_roles.empty?
|
7
|
+
{ action: (link_to _('Run all Ansible roles'), 'javascript:void(0);', disabled: true, title: 'No Roles assigned'), priority: 31 }
|
8
|
+
else
|
9
|
+
{ action: display_link_if_authorized(_('Run all Ansible roles'), hash_for_play_roles_hostgroup_path(id: hostgroup), 'data-no-turbolink': true, title: _('Run all Ansible roles on hosts belonging to this host group')), priority: 31 }
|
10
|
+
end
|
11
|
+
|
12
|
+
[play_roles] if User.current.can?(:create_job_invocations)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
Foreman::Plugin.register :foreman_ansible do
|
4
|
-
requires_foreman '>= 3.
|
4
|
+
requires_foreman '>= 3.4'
|
5
5
|
|
6
6
|
settings do
|
7
7
|
category :ansible, N_('Ansible') do
|
@@ -240,4 +240,8 @@ Foreman::Plugin.register :foreman_ansible do
|
|
240
240
|
describe_host do
|
241
241
|
multiple_actions_provider :ansible_hosts_multiple_actions
|
242
242
|
end
|
243
|
+
|
244
|
+
describe_hostgroup do
|
245
|
+
hostgroup_actions_provider :ansible_hostgroups_actions
|
246
|
+
end
|
243
247
|
end
|
@@ -0,0 +1,257 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
Foreman::Plugin.register :foreman_ansible do
|
4
|
+
requires_foreman '>= 3.3'
|
5
|
+
|
6
|
+
settings do
|
7
|
+
category :ansible, N_('Ansible') do
|
8
|
+
setting 'ansible_ssh_private_key_file',
|
9
|
+
type: :string,
|
10
|
+
description: N_('Use this to supply a path to an SSH Private Key '\
|
11
|
+
'that Ansible will use in lieu of a password '\
|
12
|
+
'Override with "ansible_ssh_private_key_file" '\
|
13
|
+
'host parameter'),
|
14
|
+
default: '',
|
15
|
+
full_name: N_('Private Key Path')
|
16
|
+
setting 'ansible_connection',
|
17
|
+
type: :string,
|
18
|
+
description: N_('Use this connection type by default when running '\
|
19
|
+
'Ansible playbooks. You can override this on hosts by '\
|
20
|
+
'adding a parameter "ansible_connection"'),
|
21
|
+
default: 'ssh',
|
22
|
+
full_name: N_('Connection type')
|
23
|
+
setting 'ansible_winrm_server_cert_validation',
|
24
|
+
type: :string,
|
25
|
+
description: N_('Enable/disable WinRM server certificate '\
|
26
|
+
'validation when running Ansible playbooks. You can override '\
|
27
|
+
'this on hosts by adding a parameter '\
|
28
|
+
'"ansible_winrm_server_cert_validation"'),
|
29
|
+
default: 'validate',
|
30
|
+
full_name: N_('WinRM cert Validation')
|
31
|
+
setting 'ansible_verbosity',
|
32
|
+
type: :integer,
|
33
|
+
description: N_('Foreman will add this level of verbosity for '\
|
34
|
+
'additional debugging output when running Ansible playbooks.'),
|
35
|
+
default: '0',
|
36
|
+
full_name: N_('Default verbosity level'),
|
37
|
+
value: nil,
|
38
|
+
collection: proc {
|
39
|
+
{ '0' => N_('Disabled'),
|
40
|
+
'1' => N_('Level 1 (-v)'),
|
41
|
+
'2' => N_('Level 2 (-vv)'),
|
42
|
+
'3' => N_('Level 3 (-vvv)'),
|
43
|
+
'4' => N_('Level 4 (-vvvv)') }
|
44
|
+
}
|
45
|
+
setting 'ansible_post_provision_timeout',
|
46
|
+
type: :integer,
|
47
|
+
description: N_('Timeout (in seconds) to set when Foreman will trigger a '\
|
48
|
+
'play Ansible roles task after a host is fully provisioned. '\
|
49
|
+
'Set this to the maximum time you expect a host to take '\
|
50
|
+
'until it is ready after a reboot.'),
|
51
|
+
default: '360',
|
52
|
+
full_name: N_('Post-provision timeout')
|
53
|
+
setting 'ansible_interval',
|
54
|
+
type: :integer,
|
55
|
+
description: N_('Timeout (in minutes) when hosts should have reported.'),
|
56
|
+
default: '30',
|
57
|
+
full_name: N_('Ansible report timeout')
|
58
|
+
setting 'ansible_out_of_sync_disabled',
|
59
|
+
type: :boolean,
|
60
|
+
description: format(N_('Disable host configuration status turning to out of'\
|
61
|
+
' sync for %{cfgmgmt} after report does not arrive within'\
|
62
|
+
' configured interval'), :cfgmgmt => 'Ansible'),
|
63
|
+
default: false,
|
64
|
+
full_name: format(N_('%{cfgmgmt} out of sync disabled'), :cfgmgmt => 'Ansible')
|
65
|
+
setting 'ansible_inventory_template',
|
66
|
+
type: :string,
|
67
|
+
description: N_('Foreman will use this template to schedule the report '\
|
68
|
+
'with Ansible inventory'),
|
69
|
+
default: 'Ansible - Ansible Inventory',
|
70
|
+
full_name: N_('Default Ansible inventory report template')
|
71
|
+
setting 'ansible_roles_to_ignore',
|
72
|
+
type: :array,
|
73
|
+
description: N_('Those roles will be excluded when importing roles from smart proxy, '\
|
74
|
+
'The expected input is comma separated values and you can use * wildcard metacharacters'\
|
75
|
+
'For example: foo*, *b*,*bar'),
|
76
|
+
default: [],
|
77
|
+
full_name: N_('Ansible roles to ignore')
|
78
|
+
setting 'foreman_ansible_proxy_batch_size',
|
79
|
+
type: :integer,
|
80
|
+
description: N_('Number of tasks which should be sent to the smart proxy in one request, '\
|
81
|
+
'if foreman_tasks_proxy_batch_trigger is enabled. '\
|
82
|
+
'If set, overrides foreman_tasks_proxy_batch_size setting for Ansible jobs.'),
|
83
|
+
default: nil,
|
84
|
+
full_name: N_('Proxy tasks batch size for Ansible')
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
security_block :foreman_ansible do
|
89
|
+
permission :play_roles_on_host,
|
90
|
+
{ :hosts => [:play_roles, :multiple_play_roles],
|
91
|
+
:'api/v2/hosts' => [:play_roles,
|
92
|
+
:multiple_play_roles] },
|
93
|
+
:resource_type => 'Host'
|
94
|
+
permission :play_roles_on_hostgroup,
|
95
|
+
{ :hostgroups => [:play_roles],
|
96
|
+
:'api/v2/hostgroups' => [:play_roles,
|
97
|
+
:multiple_play_roles] },
|
98
|
+
:resource_type => 'Hostgroup'
|
99
|
+
permission :view_ansible_roles,
|
100
|
+
{ :ansible_roles => [:index, :auto_complete_search],
|
101
|
+
:'api/v2/ansible_roles' => [:index, :show, :fetch],
|
102
|
+
:ui_ansible_roles => [:index] },
|
103
|
+
:resource_type => 'AnsibleRole'
|
104
|
+
permission :destroy_ansible_roles,
|
105
|
+
{ :ansible_roles => [:destroy],
|
106
|
+
:'api/v2/ansible_roles' => [:destroy, :obsolete] },
|
107
|
+
:resource_type => 'AnsibleRole'
|
108
|
+
permission :import_ansible_roles,
|
109
|
+
{ :ansible_roles => [:import, :confirm_import],
|
110
|
+
:'api/v2/ansible_roles' => [:import, :sync] },
|
111
|
+
:resource_type => 'AnsibleRole'
|
112
|
+
permission :view_ansible_variables,
|
113
|
+
{
|
114
|
+
:lookup_values => [:index],
|
115
|
+
:ansible_variables => [:index, :auto_complete_search],
|
116
|
+
:'api/v2/ansible_variables' => [:index, :show]
|
117
|
+
},
|
118
|
+
:resource_type => 'AnsibleVariable'
|
119
|
+
permission :edit_ansible_variables,
|
120
|
+
{ :lookup_values => [:update],
|
121
|
+
:ansible_variables => [:edit, :update],
|
122
|
+
:'api/v2/ansible_variables' => [:update],
|
123
|
+
:'api/v2/ansible_override_values' => [:create, :destroy] },
|
124
|
+
:resource_type => 'AnsibleVariable'
|
125
|
+
permission :destroy_ansible_variables,
|
126
|
+
{
|
127
|
+
:lookup_values => [:destroy],
|
128
|
+
:ansible_variables => [:destroy],
|
129
|
+
:'api/v2/ansible_variables' => [:destroy, :obsolete]
|
130
|
+
},
|
131
|
+
:resource_type => 'AnsibleVariable'
|
132
|
+
permission :create_ansible_variables,
|
133
|
+
{
|
134
|
+
:lookup_values => [:create],
|
135
|
+
:ansible_variables => [:new, :create],
|
136
|
+
:'api/v2/ansible_variables' => [:create]
|
137
|
+
},
|
138
|
+
:resource_type => 'AnsibleVariable'
|
139
|
+
permission :import_ansible_variables,
|
140
|
+
{
|
141
|
+
:ansible_variables => [:import, :confirm_import],
|
142
|
+
:'api/v2/ansible_variables' => [:import]
|
143
|
+
},
|
144
|
+
:resource_type => 'AnsibleVariable'
|
145
|
+
permission :view_hosts,
|
146
|
+
{ :'api/v2/hosts' => [:ansible_roles],
|
147
|
+
:'api/v2/ansible_inventories' => [:hosts] },
|
148
|
+
:resource_type => 'Host'
|
149
|
+
permission :view_hostgroups,
|
150
|
+
{ :'api/v2/hostgroups' => [:ansible_roles],
|
151
|
+
:'api/v2/ansible_inventories' => [:hostgroups] },
|
152
|
+
:resource_type => 'Hostgroup'
|
153
|
+
permission :edit_hosts,
|
154
|
+
{ :'api/v2/hosts' => [:assign_ansible_roles] },
|
155
|
+
:resource_type => 'Host'
|
156
|
+
permission :edit_hostgroups,
|
157
|
+
{ :'api/v2/hostgroups' => [:assign_ansible_roles] },
|
158
|
+
:resource_type => 'Hostgroup'
|
159
|
+
permission :generate_ansible_inventory,
|
160
|
+
{ :'api/v2/ansible_inventories' => [:schedule] }
|
161
|
+
permission :import_ansible_playbooks,
|
162
|
+
{ :'api/v2/ansible_playbooks' => [:sync, :fetch] }
|
163
|
+
end
|
164
|
+
|
165
|
+
role 'Ansible Roles Manager',
|
166
|
+
[:play_roles_on_host, :play_roles_on_hostgroup,
|
167
|
+
:create_job_invocations, :view_job_templates, # to allow the play_roles
|
168
|
+
:create_template_invocations, :view_smart_proxies, # ...
|
169
|
+
:view_ansible_roles, :destroy_ansible_roles,
|
170
|
+
:import_ansible_roles, :view_ansible_variables,
|
171
|
+
:create_ansible_variables, :import_ansible_variables,
|
172
|
+
:edit_ansible_variables, :destroy_ansible_variables, :import_ansible_playbooks]
|
173
|
+
|
174
|
+
role 'Ansible Tower Inventory Reader',
|
175
|
+
[:view_hosts, :view_hostgroups, :view_facts, :generate_report_templates, :generate_ansible_inventory,
|
176
|
+
:view_report_templates],
|
177
|
+
'Permissions required for the user which is used by Ansible Tower Dynamic Inventory Item'
|
178
|
+
|
179
|
+
add_all_permissions_to_default_roles
|
180
|
+
extend_template_helpers ForemanAnsible::RendererMethods
|
181
|
+
allowed_template_helpers :insights_remediation
|
182
|
+
|
183
|
+
base_role_assignment_params = { :ansible_role_ids => [],
|
184
|
+
:ansible_roles => [] }
|
185
|
+
parameter_filter Host::Managed, base_role_assignment_params.merge(:host_ansible_roles_attributes => {})
|
186
|
+
parameter_filter Hostgroup, base_role_assignment_params.merge(:hostgroup_ansible_roles_attributes => {})
|
187
|
+
|
188
|
+
register_global_js_file 'global'
|
189
|
+
|
190
|
+
extend_graphql_type :type => '::Types::Host' do
|
191
|
+
field :all_ansible_roles, ::Types::InheritedAnsibleRole.connection_type, :null => true, :method => :present_all_ansible_roles
|
192
|
+
field :own_ansible_roles, ::Types::AnsibleRole.connection_type, :null => true
|
193
|
+
field :available_ansible_roles, ::Types::AnsibleRole.connection_type, :null => true
|
194
|
+
field :ansible_variables_with_overrides, Types::OverridenAnsibleVariable.connection_type, :null => false
|
195
|
+
|
196
|
+
def present_all_ansible_roles
|
197
|
+
inherited_ansible_roles = object.inherited_ansible_roles.map { |role| ::Presenters::AnsibleRolePresenter.new(role, true) }
|
198
|
+
ansible_roles = object.ansible_roles.map { |role| ::Presenters::AnsibleRolePresenter.new(role, false) }
|
199
|
+
(inherited_ansible_roles + ansible_roles).uniq
|
200
|
+
end
|
201
|
+
|
202
|
+
def ansible_variables_with_overrides
|
203
|
+
resolver = ::ForemanAnsible::OverrideResolver.new(object)
|
204
|
+
AnsibleVariable.where(:ansible_role_id => object.all_ansible_roles.pluck(:id), :override => true).map { |variable| ::Presenters::OverridenAnsibleVariablePresenter.new variable, resolver }
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
register_graphql_query_field :ansible_roles, '::Types::AnsibleRole', :collection_field
|
209
|
+
register_graphql_mutation_field :assign_ansible_roles, '::Mutations::Hosts::AssignAnsibleRoles'
|
210
|
+
register_graphql_mutation_field :delete_ansible_variable_override, ::Mutations::AnsibleVariableOverrides::Delete
|
211
|
+
register_graphql_mutation_field :update_ansible_variable_override, ::Mutations::AnsibleVariableOverrides::Update
|
212
|
+
register_graphql_mutation_field :create_ansible_variable_override, ::Mutations::AnsibleVariableOverrides::Create
|
213
|
+
|
214
|
+
divider :top_menu, :caption => N_('Ansible'), :parent => :configure_menu
|
215
|
+
menu :top_menu, :ansible_roles,
|
216
|
+
:caption => N_('Roles'),
|
217
|
+
:url_hash => { :controller => :ansible_roles, :action => :index },
|
218
|
+
:parent => :configure_menu
|
219
|
+
menu :top_menu, :ansible_variables,
|
220
|
+
:caption => N_('Variables'),
|
221
|
+
:url_hash => { :controller => :ansible_variables, :action => :index },
|
222
|
+
:parent => :configure_menu
|
223
|
+
|
224
|
+
apipie_documented_controllers [
|
225
|
+
"#{ForemanAnsible::Engine.root}/app/controllers/api/v2/*.rb"
|
226
|
+
]
|
227
|
+
ApipieDSL.configuration.dsl_classes_matchers += [
|
228
|
+
"#{ForemanAnsible::Engine.root}/app/models/*.rb",
|
229
|
+
"#{ForemanAnsible::Engine.root}/app/services/foreman_ansible/*.rb"
|
230
|
+
]
|
231
|
+
|
232
|
+
register_info_provider ForemanAnsible::AnsibleInfo
|
233
|
+
|
234
|
+
# For backwards compatiblity with 1.17
|
235
|
+
if respond_to?(:register_report_scanner)
|
236
|
+
register_report_scanner ForemanAnsible::AnsibleReportScanner
|
237
|
+
register_report_origin 'Ansible', 'ConfigReport'
|
238
|
+
end
|
239
|
+
|
240
|
+
<<<<<<< HEAD
|
241
|
+
describe_host do
|
242
|
+
multiple_actions_provider :ansible_hosts_multiple_actions
|
243
|
+
=======
|
244
|
+
extend_page('smart_proxies/show') do |context|
|
245
|
+
context.add_pagelet :smart_proxy_title_actions,
|
246
|
+
:name => _('Update Smart Proxy'),
|
247
|
+
:partial => 'foreman/smart_proxies/update_smart_proxy',
|
248
|
+
:onlyif => ->(proxy, view) { view.can_update_proxy?(proxy) }
|
249
|
+
end
|
250
|
+
extend_page('smart_proxies/index') do |context|
|
251
|
+
context.add_pagelet :smart_proxy_title_actions,
|
252
|
+
:name => _('Update Smart Proxy'),
|
253
|
+
:partial => 'foreman/smart_proxies/update_smart_proxy',
|
254
|
+
:onlyif => ->(proxy, view) { view.can_update_proxy?(proxy) }
|
255
|
+
>>>>>>> a707dab (Fixes #35143 - Add a smart proxy update button)
|
256
|
+
end
|
257
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: foreman_ansible
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 9.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Lobato Garcia
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-08-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: acts_as_list
|
@@ -109,6 +109,7 @@ files:
|
|
109
109
|
- app/graphql/types/ansible_variable_override.rb
|
110
110
|
- app/graphql/types/inherited_ansible_role.rb
|
111
111
|
- app/graphql/types/overriden_ansible_variable.rb
|
112
|
+
- app/helpers/foreman_ansible/ansible_hostgroups_helper.rb
|
112
113
|
- app/helpers/foreman_ansible/ansible_plugin_helper.rb
|
113
114
|
- app/helpers/foreman_ansible/ansible_reports_helper.rb
|
114
115
|
- app/helpers/foreman_ansible/ansible_roles_data_preparations.rb
|
@@ -127,7 +128,6 @@ files:
|
|
127
128
|
- app/models/hostgroup_ansible_role.rb
|
128
129
|
- app/overrides/ansible_roles_tab.rb
|
129
130
|
- app/overrides/hostgroup_ansible_roles_tab.rb
|
130
|
-
- app/overrides/hostgroup_play_roles.rb
|
131
131
|
- app/overrides/report_output.rb
|
132
132
|
- app/services/foreman_ansible/ansible_info.rb
|
133
133
|
- app/services/foreman_ansible/ansible_report_importer.rb
|
@@ -171,7 +171,6 @@ files:
|
|
171
171
|
- app/views/api/v2/ansible_variables/show.json.rabl
|
172
172
|
- app/views/api/v2/hostgroups/ansible_roles.json.rabl
|
173
173
|
- app/views/api/v2/hosts/ansible_roles.json.rabl
|
174
|
-
- app/views/foreman_ansible/ansible_roles/_hostgroup_ansible_roles_button.erb
|
175
174
|
- app/views/foreman_ansible/ansible_roles/_select_tab_content.html.erb
|
176
175
|
- app/views/foreman_ansible/ansible_roles/_select_tab_title.html.erb
|
177
176
|
- app/views/foreman_ansible/api/v2/ansible_roles/import.json.rabl
|
@@ -223,6 +222,7 @@ files:
|
|
223
222
|
- lib/foreman_ansible.rb
|
224
223
|
- lib/foreman_ansible/engine.rb
|
225
224
|
- lib/foreman_ansible/register.rb
|
225
|
+
- lib/foreman_ansible/register.rb.orig
|
226
226
|
- lib/foreman_ansible/remote_execution.rb
|
227
227
|
- lib/foreman_ansible/version.rb
|
228
228
|
- locale/Makefile
|
@@ -1,9 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# Displays Ansible roles button in host group action buttons
|
4
|
-
Deface::Override.new(
|
5
|
-
:virtual_path => 'hostgroups/index',
|
6
|
-
:name => 'hostgroup_ansible_roles_button',
|
7
|
-
:replace => "erb[loud]:contains('action_buttons')",
|
8
|
-
:partial => 'foreman_ansible/ansible_roles/hostgroup_ansible_roles_button'
|
9
|
-
)
|
@@ -1,19 +0,0 @@
|
|
1
|
-
<%=
|
2
|
-
play_roles = if hostgroup.all_ansible_roles.empty?
|
3
|
-
link_to _('Run all Ansible roles'), 'javascript:void(0);', disabled: true, title: 'No Roles assigned'
|
4
|
-
else
|
5
|
-
display_link_if_authorized(_('Run all Ansible roles'), hash_for_play_roles_hostgroup_path(id: hostgroup), :'data-no-turbolink' => true, title: _('Run all Ansible roles on hosts belonging to this host group'))
|
6
|
-
end
|
7
|
-
|
8
|
-
assign_jobs = link_to(_("Configure Ansible Job"), "/ansible/hostgroups/#{hostgroup.id}", { class: 'la' })
|
9
|
-
|
10
|
-
actions = [
|
11
|
-
display_link_if_authorized(_('Nest'), hash_for_nest_hostgroup_path(:id => hostgroup)),
|
12
|
-
display_link_if_authorized(_('Clone'), hash_for_clone_hostgroup_path(:id => hostgroup))
|
13
|
-
]
|
14
|
-
actions.push play_roles if User.current.can?(:create_job_invocations)
|
15
|
-
actions.push assign_jobs if User.current.can?(:view_job_invocations) && User.current.can?(:view_recurring_logics)
|
16
|
-
actions.push display_delete_if_authorized(hash_for_hostgroup_path(:id => hostgroup).merge(:auth_object => hostgroup, :authorizer => authorizer), :data => { :confirm => warning_message(hostgroup) })
|
17
|
-
|
18
|
-
action_buttons(*actions)
|
19
|
-
%>
|