foreman_remote_execution 6.2.0 → 7.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby_ci.yml +2 -0
  3. data/app/controllers/api/v2/job_invocations_controller.rb +1 -0
  4. data/app/helpers/hosts_extensions_helper.rb +62 -0
  5. data/app/lib/actions/remote_execution/run_host_job.rb +4 -0
  6. data/app/lib/actions/remote_execution/run_hosts_job.rb +4 -0
  7. data/app/models/concerns/foreman_remote_execution/foreman_tasks_task_extensions.rb +6 -0
  8. data/app/models/host_status/execution_status.rb +2 -1
  9. data/app/models/job_invocation.rb +1 -1
  10. data/app/models/job_invocation_composer.rb +7 -3
  11. data/app/models/job_template.rb +6 -1
  12. data/app/models/remote_execution_provider.rb +4 -0
  13. data/app/models/ssh_execution_provider.rb +3 -3
  14. data/app/models/template_invocation.rb +2 -0
  15. data/app/services/remote_execution_proxy_selector.rb +1 -1
  16. data/app/views/api/v2/job_invocations/base.json.rabl +1 -1
  17. data/app/views/job_invocations/_card_target_hosts.html.erb +8 -0
  18. data/app/views/job_invocations/_form.html.erb +2 -0
  19. data/app/views/overrides/subnets/_rex_tab_pane.html.erb +1 -1
  20. data/db/migrate/20220331112719_add_ssh_user_to_job_invocation.rb +5 -0
  21. data/lib/foreman_remote_execution/engine.rb +6 -3
  22. data/lib/foreman_remote_execution/version.rb +1 -1
  23. data/locale/action_names.rb +3 -3
  24. data/locale/de/foreman_remote_execution.po +23 -23
  25. data/locale/en/foreman_remote_execution.po +23 -23
  26. data/locale/en_GB/foreman_remote_execution.po +23 -23
  27. data/locale/es/foreman_remote_execution.po +23 -23
  28. data/locale/foreman_remote_execution.pot +64 -66
  29. data/locale/fr/foreman_remote_execution.po +23 -23
  30. data/locale/ja/foreman_remote_execution.po +23 -23
  31. data/locale/ko/foreman_remote_execution.po +23 -23
  32. data/locale/pt_BR/foreman_remote_execution.po +23 -23
  33. data/locale/ru/foreman_remote_execution.po +23 -23
  34. data/locale/zh_CN/foreman_remote_execution.po +23 -23
  35. data/locale/zh_TW/foreman_remote_execution.po +23 -23
  36. data/test/unit/api_params_test.rb +33 -0
  37. data/test/unit/remote_execution_provider_test.rb +26 -0
  38. data/webpack/JobWizard/JobWizardConstants.js +2 -2
  39. data/webpack/JobWizard/__tests__/fixtures.js +8 -4
  40. data/webpack/JobWizard/steps/AdvancedFields/AdvancedFields.js +9 -0
  41. data/webpack/JobWizard/steps/AdvancedFields/Fields.js +21 -0
  42. data/webpack/JobWizard/steps/AdvancedFields/__tests__/AdvancedFields.test.js +7 -2
  43. data/webpack/JobWizard/steps/HostsAndInputs/SelectGQL.js +2 -1
  44. data/webpack/JobWizard/steps/HostsAndInputs/SelectedChips.js +1 -1
  45. data/webpack/JobWizard/steps/HostsAndInputs/buildHostQuery.js +1 -1
  46. data/webpack/JobWizard/steps/HostsAndInputs/hostgroups.gql +1 -0
  47. data/webpack/JobWizard/steps/HostsAndInputs/hosts.gql +1 -0
  48. data/webpack/JobWizard/steps/ReviewDetails/index.js +2 -1
  49. data/webpack/JobWizard/steps/Schedule/__tests__/Schedule.test.js +15 -15
  50. data/webpack/JobWizard/steps/form/SearchSelect.js +0 -1
  51. data/webpack/JobWizard/submit.js +2 -0
  52. data/webpack/__mocks__/foremanReact/common/globalIdHelpers.js +1 -0
  53. data/webpack/global_index.js +2 -8
  54. data/webpack/react_app/components/FeaturesDropdown/index.js +1 -1
  55. data/webpack/react_app/components/HostKebab/KebabItems.js +6 -1
  56. data/webpack/react_app/components/RecentJobsCard/RecentJobsCard.js +4 -4
  57. data/webpack/react_app/components/TargetingHosts/TargetingHostsConsts.js +1 -0
  58. data/webpack/react_app/components/TargetingHosts/TargetingHostsPage.js +8 -3
  59. data/webpack/react_app/components/TargetingHosts/__tests__/__snapshots__/TargetingHostsPage.test.js.snap +9 -1
  60. data/webpack/react_app/components/TargetingHosts/__tests__/fixtures.js +1 -4
  61. data/webpack/react_app/components/TargetingHosts/index.js +1 -0
  62. data/webpack/react_app/extend/Fills.js +48 -0
  63. metadata +9 -8
  64. data/app/helpers/concerns/foreman_remote_execution/hosts_helper_extensions.rb +0 -62
  65. data/webpack/react_app/extend/fillKebabItems.js +0 -11
  66. data/webpack/react_app/extend/fillRecentJobsCard.js +0 -11
  67. data/webpack/react_app/extend/fillRexFeaturesDropdown.js +0 -11
  68. data/webpack/react_app/extend/fillregistrationAdvanced.js +0 -11
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 71b09dd41d7ce39e709e4a45c2c78926d53151ed3625fcf2f4e0d739853cae8e
4
- data.tar.gz: d01463507ceb52b52f661fa9a55ce413e2f824d74dfe50958063359f5a6fa8e9
3
+ metadata.gz: 58d5205206634382e90cd1d8c9a75248fb6eb0268671a01cd03a3fc2f9ff1c25
4
+ data.tar.gz: a417fc114ad51630e41874b4dcb95e791d9ae26bcae087654ec13fcd984c4ba3
5
5
  SHA512:
6
- metadata.gz: 2840a0f11ef02ba63f3a981075eae66e50e5fa0f7738518c3bf3a74f0bf5b7cf6be3273c2ebb999d00174244fb73295b3d0f8c74b663ef9839a91a16ad9c9878
7
- data.tar.gz: 79a0dad8442b9135995a8bcbf62dfde4e112cd765950b61f45db0c490eac0d21e3cf843aea946c2450f69ab8f4d098fe26927b4eafe4cd0b7d6a1097ba04ceb9
6
+ metadata.gz: f438ba4b0c67b2c12b541fc76d0c17ef235df5f3573e45c3a5ebb70a8a05242da62e4de32989e59d5eb94c3473647f49447b602d4474bb83cb7aaa765c54d6f7
7
+ data.tar.gz: c43babb00b2d921701cbe300da9f3ec8fa59c4bec8b75a58d0f19d1fd1a3d1debcda02474e8701a35aa6d95293063b1d781d82564a7d1b76093504db221a29c2
@@ -18,6 +18,8 @@ jobs:
18
18
  with:
19
19
  ruby-version: 2.5
20
20
  bundler-cache: true
21
+ cache-version: 1
22
+ rubygems: 3.0.0
21
23
  - name: Run rubocop
22
24
  if: github.event_name != 'push'
23
25
  run: bundle exec rubocop --format github
@@ -45,6 +45,7 @@ module Api
45
45
  :required => false,
46
46
  :desc => N_('Set password for effective user (using sudo-like mechanisms)')
47
47
  end
48
+ param :ssh_user, String, :required => false, :desc => N_('Set SSH user')
48
49
  param :password, String, :required => false, :desc => N_('Set SSH password')
49
50
  param :key_passphrase, String, :required => false, :desc => N_('Set SSH key passphrase')
50
51
 
@@ -0,0 +1,62 @@
1
+ module HostsExtensionsHelper
2
+ def rex_hosts_multiple_actions
3
+ return [] unless can_schedule_jobs?
4
+
5
+ [{ action: [_('Schedule Remote Job'), new_job_invocation_path, false], priority: 1000 }]
6
+ end
7
+
8
+ def rex_host_overview_buttons(host)
9
+ [
10
+ { button: link_to_if_authorized(_("Jobs"), hash_for_job_invocations_path(search: "host=#{host.name}"), title: _("Job invocations"), class: 'btn btn-default'), priority: 200 },
11
+ ]
12
+ end
13
+
14
+ def host_title_actions(*args)
15
+ title_actions(button_group(schedule_job_multi_button(*args)),
16
+ button_group(web_console_button(*args)))
17
+ super(*args)
18
+ end
19
+
20
+ private
21
+
22
+ def schedule_job_multi_button(*args)
23
+ host_features = rex_host_features(*args)
24
+
25
+ if host_features.present?
26
+ action_buttons(schedule_job_button(*args), *host_features)
27
+ else
28
+ schedule_job_button(*args)
29
+ end
30
+ end
31
+
32
+ def rex_host_features(host, *_rest)
33
+ return [] unless can_execute_on_host?(host)
34
+ RemoteExecutionFeature.with_host_action_button.order(:label).map do |feature|
35
+ link_to(_('%s') % feature.name, job_invocations_path(:host_ids => [host.id], :feature => feature.label), :method => :post)
36
+ end
37
+ end
38
+
39
+ def schedule_job_button(host, *_rest)
40
+ return unless can_execute_on_host?(host)
41
+ link_to(_('Schedule Remote Job'), new_job_invocation_path(:host_ids => [host.id]), :id => :run_button, :class => 'btn btn-default')
42
+ end
43
+
44
+ def web_console_button(host, *_args)
45
+ return if !authorized_for(permission: 'cockpit_hosts', auth_object: host) || !can_execute_on_infrastructure_host?(host)
46
+
47
+ url = SSHExecutionProvider.cockpit_url_for_host(host.name)
48
+ url ? link_to(_('Web Console'), url, :class => 'btn btn-default', :id => :'web-console-button', :target => '_new') : nil
49
+ end
50
+
51
+ def can_schedule_jobs?
52
+ authorized_for(controller: :job_invocations, action: :create)
53
+ end
54
+
55
+ def can_execute_on_host?(host)
56
+ can_schedule_jobs? && can_execute_on_infrastructure_host?(host)
57
+ end
58
+
59
+ def can_execute_on_infrastructure_host?(host)
60
+ !host.infrastructure_host? || User.current.can?(:execute_jobs_on_infrastructure_hosts)
61
+ end
62
+ end
@@ -172,6 +172,10 @@ module Actions
172
172
  @host ||= ::Host.authorized.find(host_id)
173
173
  end
174
174
 
175
+ def self.cleanup_after
176
+ '90d'
177
+ end
178
+
175
179
  private
176
180
 
177
181
  def update_host_status
@@ -153,6 +153,10 @@ module Actions
153
153
  input[:proxy_batch_size]
154
154
  end
155
155
 
156
+ def self.cleanup_after
157
+ '90d'
158
+ end
159
+
156
160
  private
157
161
 
158
162
  def mail_notification_preference
@@ -4,6 +4,12 @@ module ForemanRemoteExecution
4
4
 
5
5
  included do
6
6
  has_many :job_invocations, :dependent => :destroy, :foreign_key => 'task_id'
7
+ has_one :template_invocation, :inverse_of => :run_host_job_task, :foreign_key => 'run_host_job_task_id', :dependent => :nullify
8
+ has_one :template, :through => :template_invocation
9
+ has_many :remote_execution_features, :through => :template
10
+
11
+ scoped_search :relation => :remote_execution_features, :on => :name, :rename => 'remote_execution_feature.name'
12
+ scoped_search :relation => :remote_execution_features, :on => :label, :rename => 'remote_execution_feature.label'
7
13
  end
8
14
  end
9
15
  end
@@ -50,7 +50,8 @@ class HostStatus::ExecutionStatus < HostStatus::Status
50
50
  end
51
51
 
52
52
  def status_link
53
- job_invocation = last_stopped_task.parent_task.job_invocations.first
53
+ job_invocation = last_stopped_task&.parent_task&.job_invocations&.first
54
+ return unless job_invocation
54
55
  return nil unless User.current.can?(:view_job_invocations, job_invocation)
55
56
 
56
57
  Rails.application.routes.url_helpers.job_invocation_path(job_invocation)
@@ -25,7 +25,7 @@ class JobInvocation < ApplicationRecord
25
25
  validates :job_category, :presence => true
26
26
  validates_associated :targeting, :all_template_invocations
27
27
 
28
- scoped_search :on => :id, :complete_value => true
28
+ scoped_search :on => :id, :complete_value => true, :validator => ScopedSearch::Validators::INTEGER
29
29
  scoped_search :on => :job_category, :complete_value => true
30
30
  scoped_search :on => :description, :complete_value => true
31
31
 
@@ -16,6 +16,7 @@ class JobInvocationComposer
16
16
  :host_ids => ui_params[:host_ids],
17
17
  :remote_execution_feature_id => job_invocation_base[:remote_execution_feature_id],
18
18
  :description_format => job_invocation_base[:description_format],
19
+ :ssh_user => blank_to_nil(job_invocation_base[:ssh_user]),
19
20
  :password => blank_to_nil(job_invocation_base[:password]),
20
21
  :key_passphrase => blank_to_nil(job_invocation_base[:key_passphrase]),
21
22
  :effective_user_password => blank_to_nil(job_invocation_base[:effective_user_password]),
@@ -121,6 +122,7 @@ class JobInvocationComposer
121
122
  :targeting => targeting_params,
122
123
  :triggering => triggering_params,
123
124
  :description_format => api_params[:description_format],
125
+ :ssh_user => api_params[:ssh_user],
124
126
  :password => api_params[:password],
125
127
  :remote_execution_feature_id => remote_execution_feature_id,
126
128
  :effective_user_password => api_params[:effective_user_password],
@@ -217,7 +219,7 @@ class JobInvocationComposer
217
219
  def format_datetime(datetime)
218
220
  return datetime if datetime.blank?
219
221
 
220
- Time.parse(datetime).in_time_zone.strftime('%Y-%m-%d %H:%M')
222
+ Time.zone.parse(datetime).strftime('%Y-%m-%d %H:%M')
221
223
  end
222
224
  end
223
225
 
@@ -237,6 +239,7 @@ class JobInvocationComposer
237
239
  { :job_category => job_invocation.job_category,
238
240
  :targeting => targeting_params,
239
241
  :triggering => triggering_params,
242
+ :ssh_user => job_invocation.ssh_user,
240
243
  :description_format => job_invocation.description_format,
241
244
  :concurrency_control => concurrency_control_params,
242
245
  :execution_timeout_interval => job_invocation.execution_timeout_interval,
@@ -399,7 +402,7 @@ class JobInvocationComposer
399
402
 
400
403
  def compose
401
404
  job_invocation.job_category = validate_job_category(params[:job_category])
402
- job_invocation.job_category ||= resolve_job_category(available_job_categories.first) { |tempate| template.job_category } if @set_defaults
405
+ job_invocation.job_category ||= resolve_job_category(available_job_categories.first) { |template| template.job_category } if @set_defaults
403
406
  job_invocation.remote_execution_feature_id = params[:remote_execution_feature_id]
404
407
  job_invocation.targeting = build_targeting
405
408
  job_invocation.triggering = build_triggering
@@ -411,6 +414,7 @@ class JobInvocationComposer
411
414
  job_invocation.password = params[:password]
412
415
  job_invocation.key_passphrase = params[:key_passphrase]
413
416
  job_invocation.effective_user_password = params[:effective_user_password]
417
+ job_invocation.ssh_user = params[:ssh_user]
414
418
 
415
419
  if @reruns && job_invocation.targeting.static?
416
420
  job_invocation.targeting.assign_host_ids(JobInvocation.find(@reruns).targeting.host_ids)
@@ -544,7 +548,7 @@ class JobInvocationComposer
544
548
 
545
549
  def input_value_for(input)
546
550
  invocations = pattern_template_invocations
547
- default = TemplateInvocationInputValue.new(:template_input_id => input.id)
551
+ default = TemplateInvocationInputValue.new(:template_input_id => input.id, :value => input.default)
548
552
  invocations.map(&:input_values).flatten.detect { |iv| iv.template_input_id == input.id } || default
549
553
  end
550
554
 
@@ -32,6 +32,8 @@ class JobTemplate < ::Template
32
32
  scoped_search :on => :snippet, :complete_value => {:true => true, :false => false}
33
33
  scoped_search :on => :provider_type, :complete_value => true
34
34
  scoped_search :on => :template
35
+ scoped_search :relation => :remote_execution_features, :on => :name, :rename => 'feature.name'
36
+ scoped_search :relation => :remote_execution_features, :on => :label, :rename => 'feature.label'
35
37
 
36
38
  # with proc support, default_scope can no longer be chained
37
39
  # include all default scoping here
@@ -196,7 +198,10 @@ class JobTemplate < ::Template
196
198
  def default_input_values(ignore_keys)
197
199
  result = self.template_inputs_with_foreign.select { |ti| !ti.required? && ti.input_type == 'user' }.map { |ti| ti.name.to_s }
198
200
  result -= ignore_keys.map(&:to_s)
199
- Hash[result.map { |k| [ k, nil ] }]
201
+ default_values = self.template_inputs_with_foreign.reduce({}) do |acc, input|
202
+ acc.merge(input.name.to_s => input.default)
203
+ end
204
+ Hash[result.map { |k| [ k, default_values[k]] }]
200
205
  end
201
206
 
202
207
  private
@@ -28,6 +28,10 @@ class RemoteExecutionProvider
28
28
  providers.keys.map(&:to_s)
29
29
  end
30
30
 
31
+ def provider_proxy_features
32
+ providers.values.map(&:proxy_feature).flatten.uniq.compact
33
+ end
34
+
31
35
  def proxy_command_options(template_invocation, host)
32
36
  {:proxy_operation_name => proxy_operation_name}.merge(proxy_command_provider_inputs(template_invocation))
33
37
  end
@@ -1,7 +1,7 @@
1
1
  class ScriptExecutionProvider < RemoteExecutionProvider
2
2
  class << self
3
3
  def proxy_command_options(template_invocation, host)
4
- super.merge(:ssh_user => ssh_user(host),
4
+ super.merge(:ssh_user => ssh_user(host, template_invocation.job_invocation),
5
5
  :effective_user => effective_user(template_invocation),
6
6
  :effective_user_method => effective_user_method(host),
7
7
  :cleanup_working_dirs => cleanup_working_dirs?(host),
@@ -58,8 +58,8 @@ class ScriptExecutionProvider < RemoteExecutionProvider
58
58
 
59
59
  private
60
60
 
61
- def ssh_user(host)
62
- host.host_param('remote_execution_ssh_user')
61
+ def ssh_user(host, job_invocation = nil)
62
+ job_invocation&.ssh_user || host.host_param('remote_execution_ssh_user')
63
63
  end
64
64
 
65
65
  def ssh_port(host)
@@ -16,6 +16,7 @@ class TemplateInvocation < ApplicationRecord
16
16
  belongs_to :host, :class_name => 'Host::Managed', :foreign_key => :host_id
17
17
  has_one :host_group, :through => :host, :source => :hostgroup
18
18
  belongs_to :run_host_job_task, :class_name => 'ForemanTasks::Task'
19
+ has_many :remote_execution_features, :through => :template
19
20
 
20
21
  validates_associated :input_values
21
22
  validate :provides_required_input_values
@@ -25,6 +26,7 @@ class TemplateInvocation < ApplicationRecord
25
26
  scoped_search :relation => :host_group, :on => :name, :rename => 'host_group.name', :complete_value => true
26
27
  scoped_search :relation => :template, :on => :job_category, :complete_value => true
27
28
  scoped_search :relation => :template, :on => :name, :complete_value => true
29
+ scoped_search :relation => :remote_execution_features, :on => :name, :rename => 'feature'
28
30
 
29
31
  class TaskResultMap
30
32
  MAP = {
@@ -7,7 +7,7 @@ class RemoteExecutionProxySelector < ::ForemanTasks::ProxySelector
7
7
  return proxies if capability.nil?
8
8
 
9
9
  proxies.reduce({}) do |acc, (strategy, possible_proxies)|
10
- acc.merge(strategy => possible_proxies.select { |proxy| proxy.has_capability?(capability) })
10
+ acc.merge(strategy => possible_proxies.select { |proxy| proxy.has_capability?(provider, capability) })
11
11
  end
12
12
  end
13
13
  end
@@ -1,6 +1,6 @@
1
1
  object @job_invocation
2
2
 
3
- attributes :id, :description, :job_category, :targeting_id, :status, :start_at, :status_label
3
+ attributes :id, :description, :job_category, :targeting_id, :status, :start_at, :status_label, :ssh_user
4
4
 
5
5
  node do |invocation|
6
6
  {
@@ -32,6 +32,14 @@
32
32
  <%= show_job_location(@job_location) %>
33
33
  </strong>
34
34
  </p>
35
+ <% if job_invocation[:ssh_user] %>
36
+ <p>
37
+ <%= _('SSH User') %>:
38
+ <strong>
39
+ <%= job_invocation[:ssh_user] %>
40
+ </strong>
41
+ </p>
42
+ <% end %>
35
43
  </div>
36
44
  <div class='card-pf-footer'>
37
45
  <p>
@@ -82,6 +82,8 @@
82
82
  <% end %>
83
83
  <% end %>
84
84
 
85
+ <%= text_f f, :ssh_user, :value => f.object.ssh_user, :label => _('SSH user'), :label_help => N_('A user to be used for SSH.') %>
86
+
85
87
  <% if job_template.effective_user.overridable? %>
86
88
  <%= text_f job_template_fields, :effective_user, :value => @composer.template_invocation(job_template).try(:effective_user), :label => _('Effective user'), :label_help => N_("A user to be used for executing the script. If it differs from the SSH user, su or sudo is used to switch the accounts.") %>
87
89
  <% end %>
@@ -1,5 +1,5 @@
1
1
  <div class="tab-pane" id="rex_proxies">
2
2
  <%= fields_for :subnet do |f| %>
3
- <%= multiple_selects f, :remote_execution_proxies, SmartProxy.authorized.with_features(*RemoteExecutionProvider.provider_names).distinct, @subnet.remote_execution_proxy_ids, {:label => _("Proxies"), :help_inline => _("Select as many remote execution proxies as applicable for this subnet. When multiple proxies with the same provider are added, actions will be load balanced among them.")} %>
3
+ <%= multiple_selects f, :remote_execution_proxies, SmartProxy.authorized.with_features(*RemoteExecutionProvider.provider_proxy_features).distinct, @subnet.remote_execution_proxy_ids, {:label => _("Proxies"), :help_inline => _("Select as many remote execution proxies as applicable for this subnet. When multiple proxies with the same provider are added, actions will be load balanced among them.")} %>
4
4
  <% end %>
5
5
  </div>
@@ -0,0 +1,5 @@
1
+ class AddSshUserToJobInvocation < ActiveRecord::Migration[6.0]
2
+ def change
3
+ add_column :job_invocations, :ssh_user, :string
4
+ end
5
+ end
@@ -47,7 +47,7 @@ module ForemanRemoteExecution
47
47
 
48
48
  initializer 'foreman_remote_execution.register_plugin', before: :finisher_hook do |_app|
49
49
  Foreman::Plugin.register :foreman_remote_execution do
50
- requires_foreman '>= 3.2'
50
+ requires_foreman '>= 3.3'
51
51
  register_global_js_file 'global'
52
52
 
53
53
  apipie_documented_controllers ["#{ForemanRemoteExecution::Engine.root}/app/controllers/api/v2/*.rb"]
@@ -267,7 +267,11 @@ module ForemanRemoteExecution
267
267
  extend_rabl_template 'api/v2/subnets/show', 'api/v2/subnets/remote_execution_proxies'
268
268
  extend_rabl_template 'api/v2/hosts/main', 'api/v2/host/main'
269
269
  parameter_filter ::Subnet, :remote_execution_proxy_ids
270
- describe_host { overview_buttons_provider :host_overview_buttons }
270
+
271
+ describe_host do
272
+ multiple_actions_provider :rex_hosts_multiple_actions
273
+ overview_buttons_provider :rex_host_overview_buttons
274
+ end
271
275
 
272
276
  # Extend Registration module
273
277
  extend_allowed_registration_vars :remote_execution_interface
@@ -316,7 +320,6 @@ module ForemanRemoteExecution
316
320
  end
317
321
 
318
322
  Bookmark.include ForemanRemoteExecution::BookmarkExtensions
319
- HostsHelper.prepend ForemanRemoteExecution::HostsHelperExtensions
320
323
  ProvisioningTemplatesHelper.prepend ForemanRemoteExecution::JobTemplatesExtensions
321
324
  TemplateInput.include ForemanRemoteExecution::TemplateInputExtensions
322
325
 
@@ -1,3 +1,3 @@
1
1
  module ForemanRemoteExecution
2
- VERSION = '6.2.0'.freeze
2
+ VERSION = '7.1.1'.freeze
3
3
  end
@@ -1,5 +1,5 @@
1
1
  # Autogenerated!
2
2
  _("Remote action:")
3
- _("»Import facts«")
4
- _("»Import Puppet classes«")
5
- _("»Action with sub plans«")
3
+ _("Import Puppet classes")
4
+ _("Import facts")
5
+ _("Action with sub plans")
@@ -24,6 +24,9 @@ msgstr "%s"
24
24
  msgid "%s ago"
25
25
  msgstr "vor %s"
26
26
 
27
+ msgid "%s job has been invoked"
28
+ msgstr ""
29
+
27
30
  msgid "%{description} on %{host}"
28
31
  msgstr "%{description} auf %{host}"
29
32
 
@@ -68,15 +71,15 @@ msgstr "Ein Benutzer, der für die Ausführung des Skripts verwendet werden soll
68
71
  msgid "Abort Job"
69
72
  msgstr ""
70
73
 
74
+ msgid "Action with sub plans"
75
+ msgstr ""
76
+
71
77
  msgid "Actions"
72
78
  msgstr "Aktionen"
73
79
 
74
80
  msgid "Add Foreign Input Set"
75
81
  msgstr "Fremdeingabe-Satz hinzufügen"
76
82
 
77
- msgid "Advanced Fields"
78
- msgstr ""
79
-
80
83
  msgid "Advanced fields"
81
84
  msgstr ""
82
85
 
@@ -467,9 +470,15 @@ msgstr ""
467
470
  msgid "Import"
468
471
  msgstr "Import"
469
472
 
473
+ msgid "Import Puppet classes"
474
+ msgstr ""
475
+
470
476
  msgid "Import a job template from ERB"
471
477
  msgstr "Job-Vorlage aus ERB importieren"
472
478
 
479
+ msgid "Import facts"
480
+ msgstr ""
481
+
473
482
  msgid "Include all inputs from the foreign template"
474
483
  msgstr "Alle Eingaben aus Fremdvorlage einschließen"
475
484
 
@@ -503,9 +512,6 @@ msgstr "Jobtyp, einer von %s"
503
512
  msgid "Job"
504
513
  msgstr "Job"
505
514
 
506
- msgid "Job Category"
507
- msgstr ""
508
-
509
515
  msgid "Job Details"
510
516
  msgstr ""
511
517
 
@@ -829,7 +835,7 @@ msgstr "Wird aufgelöst zu"
829
835
  msgid "Results"
830
836
  msgstr ""
831
837
 
832
- msgid "Review Details"
838
+ msgid "Review details"
833
839
  msgstr ""
834
840
 
835
841
  msgid "Run"
@@ -853,9 +859,6 @@ msgstr ""
853
859
  msgid "Running"
854
860
  msgstr ""
855
861
 
856
- msgid "SSH"
857
- msgstr "SSH"
858
-
859
862
  msgid "SSH Port"
860
863
  msgstr ""
861
864
 
@@ -871,6 +874,9 @@ msgstr "Plan"
871
874
  msgid "Schedule Remote Job"
872
875
  msgstr ""
873
876
 
877
+ msgid "Schedule a job"
878
+ msgstr ""
879
+
874
880
  msgid "Schedule for future execution"
875
881
  msgstr ""
876
882
 
@@ -892,6 +898,9 @@ msgstr ""
892
898
  msgid "Scheduled to start before"
893
899
  msgstr ""
894
900
 
901
+ msgid "Script"
902
+ msgstr ""
903
+
895
904
  msgid "Scroll to bottom"
896
905
  msgstr "Zum Ende scrollen"
897
906
 
@@ -1212,16 +1221,16 @@ msgstr "Benutzereingabe"
1212
1221
  msgid "Value"
1213
1222
  msgstr "Wert"
1214
1223
 
1215
- msgid "View All Jobs"
1224
+ msgid "View all jobs"
1216
1225
  msgstr ""
1217
1226
 
1218
- msgid "View Finished Jobs"
1227
+ msgid "View finished jobs"
1219
1228
  msgstr ""
1220
1229
 
1221
- msgid "View Running Jobs"
1230
+ msgid "View running jobs"
1222
1231
  msgstr ""
1223
1232
 
1224
- msgid "View Scheduled Jobs"
1233
+ msgid "View scheduled jobs"
1225
1234
  msgstr ""
1226
1235
 
1227
1236
  msgid "Web Console"
@@ -1367,12 +1376,3 @@ msgstr ""
1367
1376
 
1368
1377
  msgid "using Smart Proxy"
1369
1378
  msgstr ""
1370
-
1371
- msgid "»Action with sub plans«"
1372
- msgstr ""
1373
-
1374
- msgid "»Import Puppet classes«"
1375
- msgstr ""
1376
-
1377
- msgid "»Import facts«"
1378
- msgstr ""
@@ -23,6 +23,9 @@ msgstr ""
23
23
  msgid "%s ago"
24
24
  msgstr ""
25
25
 
26
+ msgid "%s job has been invoked"
27
+ msgstr ""
28
+
26
29
  msgid "%{description} on %{host}"
27
30
  msgstr ""
28
31
 
@@ -67,13 +70,13 @@ msgstr ""
67
70
  msgid "Abort Job"
68
71
  msgstr ""
69
72
 
70
- msgid "Actions"
73
+ msgid "Action with sub plans"
71
74
  msgstr ""
72
75
 
73
- msgid "Add Foreign Input Set"
76
+ msgid "Actions"
74
77
  msgstr ""
75
78
 
76
- msgid "Advanced Fields"
79
+ msgid "Add Foreign Input Set"
77
80
  msgstr ""
78
81
 
79
82
  msgid "Advanced fields"
@@ -466,9 +469,15 @@ msgstr ""
466
469
  msgid "Import"
467
470
  msgstr ""
468
471
 
472
+ msgid "Import Puppet classes"
473
+ msgstr ""
474
+
469
475
  msgid "Import a job template from ERB"
470
476
  msgstr ""
471
477
 
478
+ msgid "Import facts"
479
+ msgstr ""
480
+
472
481
  msgid "Include all inputs from the foreign template"
473
482
  msgstr ""
474
483
 
@@ -502,9 +511,6 @@ msgstr ""
502
511
  msgid "Job"
503
512
  msgstr ""
504
513
 
505
- msgid "Job Category"
506
- msgstr ""
507
-
508
514
  msgid "Job Details"
509
515
  msgstr ""
510
516
 
@@ -826,7 +832,7 @@ msgstr ""
826
832
  msgid "Results"
827
833
  msgstr ""
828
834
 
829
- msgid "Review Details"
835
+ msgid "Review details"
830
836
  msgstr ""
831
837
 
832
838
  msgid "Run"
@@ -850,9 +856,6 @@ msgstr ""
850
856
  msgid "Running"
851
857
  msgstr ""
852
858
 
853
- msgid "SSH"
854
- msgstr ""
855
-
856
859
  msgid "SSH Port"
857
860
  msgstr ""
858
861
 
@@ -868,6 +871,9 @@ msgstr ""
868
871
  msgid "Schedule Remote Job"
869
872
  msgstr ""
870
873
 
874
+ msgid "Schedule a job"
875
+ msgstr ""
876
+
871
877
  msgid "Schedule for future execution"
872
878
  msgstr ""
873
879
 
@@ -889,6 +895,9 @@ msgstr ""
889
895
  msgid "Scheduled to start before"
890
896
  msgstr ""
891
897
 
898
+ msgid "Script"
899
+ msgstr ""
900
+
892
901
  msgid "Scroll to bottom"
893
902
  msgstr ""
894
903
 
@@ -1209,16 +1218,16 @@ msgstr ""
1209
1218
  msgid "Value"
1210
1219
  msgstr ""
1211
1220
 
1212
- msgid "View All Jobs"
1221
+ msgid "View all jobs"
1213
1222
  msgstr ""
1214
1223
 
1215
- msgid "View Finished Jobs"
1224
+ msgid "View finished jobs"
1216
1225
  msgstr ""
1217
1226
 
1218
- msgid "View Running Jobs"
1227
+ msgid "View running jobs"
1219
1228
  msgstr ""
1220
1229
 
1221
- msgid "View Scheduled Jobs"
1230
+ msgid "View scheduled jobs"
1222
1231
  msgstr ""
1223
1232
 
1224
1233
  msgid "Web Console"
@@ -1364,12 +1373,3 @@ msgstr ""
1364
1373
 
1365
1374
  msgid "using Smart Proxy"
1366
1375
  msgstr ""
1367
-
1368
- msgid "»Action with sub plans«"
1369
- msgstr ""
1370
-
1371
- msgid "»Import Puppet classes«"
1372
- msgstr ""
1373
-
1374
- msgid "»Import facts«"
1375
- msgstr ""