foreman_remote_execution 6.2.0 → 7.1.1

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.
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 ""