foreman_remote_execution 4.3.1 → 4.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/api/v2/job_invocations_controller.rb +16 -0
- data/app/controllers/foreman_remote_execution/concerns/api/v2/registration_commands_controller_extensions.rb +19 -0
- data/app/helpers/remote_execution_helper.rb +27 -0
- data/app/lib/foreman_remote_execution/provider_input.rb +29 -0
- data/app/models/invocation_provider_input_value.rb +12 -0
- data/app/models/job_invocation.rb +4 -0
- data/app/models/job_invocation_composer.rb +13 -0
- data/app/models/remote_execution_provider.rb +17 -2
- data/app/models/setting/remote_execution.rb +10 -0
- data/app/models/template_invocation.rb +2 -0
- data/app/services/renderer_methods.rb +12 -0
- data/app/views/job_invocations/_form.html.erb +8 -0
- data/db/migrate/20210312074713_add_provider_inputs.rb +10 -0
- data/foreman_remote_execution.gemspec +1 -1
- data/lib/foreman_remote_execution/engine.rb +5 -6
- data/lib/foreman_remote_execution/version.rb +1 -1
- data/locale/action_names.rb +1 -0
- data/locale/de/foreman_remote_execution.po +77 -27
- data/locale/en/foreman_remote_execution.po +77 -27
- data/locale/en_GB/foreman_remote_execution.po +77 -27
- data/locale/es/foreman_remote_execution.po +77 -27
- data/locale/foreman_remote_execution.pot +241 -163
- data/locale/fr/foreman_remote_execution.po +77 -27
- data/locale/ja/foreman_remote_execution.po +77 -27
- data/locale/ko/foreman_remote_execution.po +77 -27
- data/locale/pt_BR/foreman_remote_execution.po +77 -27
- data/locale/ru/foreman_remote_execution.po +77 -27
- data/locale/zh_CN/foreman_remote_execution.po +77 -27
- data/locale/zh_TW/foreman_remote_execution.po +77 -27
- data/package.json +3 -2
- data/test/helpers/remote_execution_helper_test.rb +16 -0
- data/test/unit/job_invocation_composer_test.rb +41 -1
- data/test/unit/job_invocation_report_template_test.rb +57 -0
- data/webpack/JobWizard/JobWizard.js +30 -7
- data/webpack/JobWizard/JobWizard.scss +12 -0
- data/webpack/JobWizard/JobWizardConstants.js +5 -0
- data/webpack/JobWizard/JobWizardSelectors.js +21 -0
- data/webpack/JobWizard/__tests__/JobWizard.test.js +20 -0
- data/webpack/JobWizard/__tests__/__snapshots__/JobWizard.test.js.snap +83 -0
- data/webpack/JobWizard/steps/CategoryAndTemplate/CategoryAndTemplate.js +77 -0
- data/webpack/JobWizard/steps/CategoryAndTemplate/CategoryAndTemplate.test.js +45 -0
- data/webpack/JobWizard/steps/CategoryAndTemplate/__snapshots__/CategoryAndTemplate.test.js.snap +64 -0
- data/webpack/JobWizard/steps/CategoryAndTemplate/index.js +86 -0
- data/webpack/JobWizard/steps/form/GroupedSelectField.js +88 -0
- data/webpack/JobWizard/steps/form/SelectField.js +39 -0
- data/webpack/JobWizard/steps/form/__tests__/GroupedSelectField.test.js +38 -0
- data/webpack/JobWizard/steps/form/__tests__/SelectField.test.js +23 -0
- data/webpack/JobWizard/steps/form/__tests__/__snapshots__/GroupedSelectField.test.js.snap +36 -0
- data/webpack/JobWizard/steps/form/__tests__/__snapshots__/SelectField.test.js.snap +22 -0
- data/webpack/__mocks__/foremanReact/common/helpers.js +1 -0
- data/webpack/__mocks__/foremanReact/redux/API/index.js +5 -0
- data/webpack/__mocks__/foremanReact/routes/common/PageLayout/PageLayout.js +10 -0
- data/webpack/fills_index.js +11 -0
- data/webpack/global_index.js +4 -0
- data/webpack/index.js +0 -4
- data/webpack/react_app/components/RecentJobsCard/RecentJobsCard.js +87 -0
- data/webpack/react_app/components/RecentJobsCard/constants.js +1 -0
- data/webpack/react_app/components/RecentJobsCard/index.js +1 -0
- data/webpack/react_app/components/RecentJobsCard/styles.css +15 -0
- data/webpack/react_app/components/RegistrationExtension/RexInterface.js +50 -0
- data/webpack/react_app/components/RegistrationExtension/__tests__/RexInterface.test.js +9 -0
- data/webpack/react_app/components/RegistrationExtension/__tests__/__snapshots__/RexInterface.test.js.snap +35 -0
- data/webpack/react_app/extend/fills.js +10 -0
- data/webpack/react_app/extend/reducers.js +4 -0
- metadata +39 -5
- data/app/views/api/v2/registration/_form.html.erb +0 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 28b7b4b36385dfde5221cc7d9b9d07d95f4515dafb657507015b9436086474ca
|
4
|
+
data.tar.gz: 27d3907329bcda250a9518903f069de480fda0609a53134369c2a348a31fb29a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9bfc761d4d8343a7fce864c3155cea9d4a3c67ff42b60359901e8be0f890ddfc63f536e3288133877a448cbee367063a990619a1b85007ab8f0433f4acd917b6
|
7
|
+
data.tar.gz: 05b1af5c16a8c0d542b9876f86810e8ca2c44dbe4165ff10eccf08eb1172edacc94e68025e486324c52648be0b1cfaf2e85ceb552755428a5917163c28febfad
|
@@ -64,6 +64,16 @@ module Api
|
|
64
64
|
param :description_format, String, :required => false, :desc => N_('Override the description format from the template for this invocation only')
|
65
65
|
param :execution_timeout_interval, Integer, :required => false, :desc => N_('Override the timeout interval from the template for this invocation only')
|
66
66
|
param :feature, String, :required => false, :desc => N_('Remote execution feature label that should be triggered, job template assigned to this feature will be used')
|
67
|
+
|
68
|
+
RemoteExecutionProvider.providers.each_value do |provider|
|
69
|
+
next if !provider.respond_to?(:provider_inputs_doc) || provider.provider_inputs_doc.empty?
|
70
|
+
doc = provider.provider_inputs_doc
|
71
|
+
param doc[:namespace], Hash, doc[:opts] do
|
72
|
+
doc[:children].map do |input|
|
73
|
+
param input[:name], input[:type], input[:opts]
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
67
77
|
end
|
68
78
|
end
|
69
79
|
|
@@ -195,9 +205,15 @@ module Api
|
|
195
205
|
end
|
196
206
|
job_invocation_params[:inputs] ||= {}
|
197
207
|
job_invocation_params[:inputs].permit!
|
208
|
+
permit_provider_inputs job_invocation_params
|
198
209
|
@job_invocation_params = job_invocation_params
|
199
210
|
end
|
200
211
|
|
212
|
+
def permit_provider_inputs(invocation_params)
|
213
|
+
providers = RemoteExecutionProvider.providers.values.reject { |provider| !provider.respond_to?(:provider_input_namespace) || provider.provider_input_namespace.empty? }
|
214
|
+
providers.each { |provider| invocation_params[provider.provider_input_namespace]&.permit! }
|
215
|
+
end
|
216
|
+
|
201
217
|
def composer_for_feature
|
202
218
|
JobInvocationComposer.for_feature(
|
203
219
|
job_invocation_params[:feature],
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module ForemanRemoteExecution
|
2
|
+
module Concerns
|
3
|
+
module Api
|
4
|
+
module V2
|
5
|
+
module RegistrationCommandsControllerExtensions
|
6
|
+
module ApipieExtensions
|
7
|
+
extend Apipie::DSL::Concern
|
8
|
+
|
9
|
+
update_api(:create) do
|
10
|
+
param :registration_command, Hash do
|
11
|
+
param :remote_execution_interface, String, desc: N_("Identifier of the Host interface for Remote execution")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -60,6 +60,12 @@ module RemoteExecutionHelper
|
|
60
60
|
job_invocation = task.task_groups.find { |group| group.class == JobInvocationTaskGroup }.job_invocation
|
61
61
|
task_authorizer = Authorizer.new(User.current, :collection => [task])
|
62
62
|
buttons = []
|
63
|
+
if (template = job_report_template) && authorized_for(controller: :report_templates, action: :generate)
|
64
|
+
buttons << link_to(_('Create Report'), generate_report_template_path(template, job_report_template_parameters(job_invocation, template)),
|
65
|
+
class: 'btn btn-default',
|
66
|
+
title: _('Create report for this job'),
|
67
|
+
disabled: task.pending?)
|
68
|
+
end
|
63
69
|
if authorized_for(hash_for_new_job_invocation_path)
|
64
70
|
buttons << link_to(_('Rerun'), rerun_job_invocation_path(:id => job_invocation.id),
|
65
71
|
:class => 'btn btn-default',
|
@@ -230,6 +236,27 @@ module RemoteExecutionHelper
|
|
230
236
|
task.execution_plan.actions[1].try(:input).try(:[], 'script')
|
231
237
|
end
|
232
238
|
|
239
|
+
def job_report_template
|
240
|
+
template = ReportTemplate.where(name: Setting['remote_execution_job_invocation_report_template']).first
|
241
|
+
|
242
|
+
template if template.template_inputs.where(name: 'job_id').exists?
|
243
|
+
end
|
244
|
+
|
245
|
+
def job_report_template_parameters(job_invocation, template)
|
246
|
+
template_input = template.template_inputs.where(name: 'job_id').first
|
247
|
+
raise "#job_report_template_parameters need template that has 'job_id' input" unless template_input
|
248
|
+
|
249
|
+
{
|
250
|
+
report_template_report: {
|
251
|
+
input_values: {
|
252
|
+
"#{template_input.id}": {
|
253
|
+
value: job_invocation.id,
|
254
|
+
},
|
255
|
+
},
|
256
|
+
},
|
257
|
+
}
|
258
|
+
end
|
259
|
+
|
233
260
|
def targeting_hosts(job_invocation, hosts)
|
234
261
|
hosts.map do |host|
|
235
262
|
template_invocation = job_invocation.template_invocations.find { |template_inv| template_inv.host_id == host.id }
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module ForemanRemoteExecution
|
2
|
+
class ProviderInput
|
3
|
+
attr_reader :name, :label, :description, :options, :value_type, :required
|
4
|
+
attr_accessor :value
|
5
|
+
|
6
|
+
def initialize(name:, label:, value:, description: nil, options: nil, value_type: nil, required: false, hidden: false)
|
7
|
+
@name = name
|
8
|
+
@label = label
|
9
|
+
@value = value
|
10
|
+
@description = description
|
11
|
+
@options = options
|
12
|
+
@value_type = value_type
|
13
|
+
@required = required
|
14
|
+
@hidden = hidden
|
15
|
+
end
|
16
|
+
|
17
|
+
def template_input
|
18
|
+
self
|
19
|
+
end
|
20
|
+
|
21
|
+
def hidden_value?
|
22
|
+
@hidden
|
23
|
+
end
|
24
|
+
|
25
|
+
def options_array
|
26
|
+
options.blank? ? [] : options.split(/\r?\n/).map(&:strip)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class InvocationProviderInputValue < ApplicationRecord
|
2
|
+
belongs_to :template_invocation
|
3
|
+
|
4
|
+
validates :name, :presence => true
|
5
|
+
|
6
|
+
validates :value, :inclusion => { :in => proc { |v| v.provider_input.options_array } },
|
7
|
+
:if => proc { |v| v.provider_input.options_array.present? }
|
8
|
+
|
9
|
+
def provider_input
|
10
|
+
template_invocation.template.provider.provider_inputs.find { |item| item.name == name }
|
11
|
+
end
|
12
|
+
end
|
@@ -76,6 +76,10 @@ class JobInvocation < ApplicationRecord
|
|
76
76
|
|
77
77
|
encrypts :password, :key_passphrase, :effective_user_password
|
78
78
|
|
79
|
+
class Jail < Safemode::Jail
|
80
|
+
allow :sub_task_for_host, :template_invocations_hosts
|
81
|
+
end
|
82
|
+
|
79
83
|
def self.search_by_status(key, operator, value)
|
80
84
|
conditions = HostStatus::ExecutionStatus::ExecutionTaskStatusMapper.sql_conditions_for(value)
|
81
85
|
conditions[0] = "NOT (#{conditions[0]})" if operator == '<>'
|
@@ -64,6 +64,10 @@ class JobInvocationComposer
|
|
64
64
|
values.merge(:template_input_id => id)
|
65
65
|
end
|
66
66
|
|
67
|
+
provider_values_params = template_base.fetch(:provider_input_values, {})
|
68
|
+
template_base[:provider_input_values] = provider_values_params.map do |key, hash|
|
69
|
+
{ :name => key, :value => hash[:value] }
|
70
|
+
end
|
67
71
|
template_base
|
68
72
|
end
|
69
73
|
end
|
@@ -147,6 +151,7 @@ class JobInvocationComposer
|
|
147
151
|
|
148
152
|
def template_invocations_params
|
149
153
|
template_invocation_params = { :template_id => template.id, :effective_user => api_params[:effective_user] }
|
154
|
+
template_invocation_params[:provider_input_values] = filter_provider_inputs api_params
|
150
155
|
template_invocation_params[:input_values] = api_params.fetch(:inputs, {}).to_h.map do |name, value|
|
151
156
|
input = template.template_inputs_with_foreign.find { |i| i.name == name }
|
152
157
|
unless input
|
@@ -158,6 +163,13 @@ class JobInvocationComposer
|
|
158
163
|
[template_invocation_params]
|
159
164
|
end
|
160
165
|
|
166
|
+
def filter_provider_inputs(api_params)
|
167
|
+
return [] if template.provider.provider_input_namespace.empty?
|
168
|
+
inputs = api_params[template.provider.provider_input_namespace].to_h
|
169
|
+
provider_input_names = template.provider.provider_inputs.map(&:name)
|
170
|
+
inputs.select { |key, value| provider_input_names.include? key }.map { |key, value| { :name => key, :value => value } }
|
171
|
+
end
|
172
|
+
|
161
173
|
def template
|
162
174
|
@template ||= JobTemplate.authorized(:view_job_templates).find(api_params[:job_template_id])
|
163
175
|
end
|
@@ -503,6 +515,7 @@ class JobInvocationComposer
|
|
503
515
|
input = template_invocation.template.template_inputs_with_foreign.find { |i| i.id.to_s == attributes[:template_input_id].to_s }
|
504
516
|
input ? input.template_invocation_input_values.build(attributes) : nil
|
505
517
|
end.compact
|
518
|
+
template_invocation.provider_input_values.build job_template_base.fetch('provider_input_values', [])
|
506
519
|
end
|
507
520
|
|
508
521
|
def build_targeting
|
@@ -20,7 +20,7 @@ class RemoteExecutionProvider
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def proxy_command_options(template_invocation, host)
|
23
|
-
{:proxy_operation_name => proxy_operation_name}
|
23
|
+
{:proxy_operation_name => proxy_operation_name}.merge(proxy_command_provider_inputs(template_invocation))
|
24
24
|
end
|
25
25
|
|
26
26
|
def secrets(_host)
|
@@ -35,6 +35,9 @@ class RemoteExecutionProvider
|
|
35
35
|
self.name
|
36
36
|
end
|
37
37
|
|
38
|
+
def provider_input_namespace
|
39
|
+
end
|
40
|
+
|
38
41
|
def supports_effective_user?
|
39
42
|
false
|
40
43
|
end
|
@@ -95,8 +98,20 @@ class RemoteExecutionProvider
|
|
95
98
|
def ssh_key_passphrase(_host)
|
96
99
|
end
|
97
100
|
|
101
|
+
def provider_inputs
|
102
|
+
[]
|
103
|
+
end
|
104
|
+
|
105
|
+
def provider_inputs_doc
|
106
|
+
{}
|
107
|
+
end
|
108
|
+
|
109
|
+
def proxy_command_provider_inputs(template_invocation)
|
110
|
+
{}
|
111
|
+
end
|
112
|
+
|
98
113
|
def proxy_action_class
|
99
|
-
ForemanRemoteExecutionCore::Actions::RunScript
|
114
|
+
'ForemanRemoteExecutionCore::Actions::RunScript'
|
100
115
|
end
|
101
116
|
|
102
117
|
# Return a specific proxy selector to use for running a given template
|
@@ -73,6 +73,16 @@ class Setting::RemoteExecution < Setting
|
|
73
73
|
_('Form Job Template'),
|
74
74
|
nil,
|
75
75
|
{ :collection => proc { Hash[JobTemplate.unscoped.map { |template| [template.name, template.name] }] } }),
|
76
|
+
self.set('remote_execution_job_invocation_report_template',
|
77
|
+
N_('Select a report template used for generating a report for a particular remote execution job'),
|
78
|
+
'Jobs - Invocation report template',
|
79
|
+
_('Job Invocation Report Template'),
|
80
|
+
nil,
|
81
|
+
{ :collection => proc { self.job_invocation_report_templates_select } }),
|
76
82
|
]
|
77
83
|
end
|
84
|
+
|
85
|
+
def self.job_invocation_report_templates_select
|
86
|
+
Hash[ReportTemplate.unscoped.joins(:template_inputs).where(template_inputs: TemplateInput.where(name: 'job_id')).map { |template| [template.name, template.name] }]
|
87
|
+
end
|
78
88
|
end
|
@@ -11,6 +11,7 @@ class TemplateInvocation < ApplicationRecord
|
|
11
11
|
belongs_to :template, :class_name => 'JobTemplate', :foreign_key => 'template_id'
|
12
12
|
belongs_to :job_invocation, :inverse_of => :template_invocations
|
13
13
|
has_many :input_values, :class_name => 'TemplateInvocationInputValue', :dependent => :destroy
|
14
|
+
has_many :provider_input_values, :class_name => 'InvocationProviderInputValue', :dependent => :destroy
|
14
15
|
has_one :targeting, :through => :job_invocation
|
15
16
|
belongs_to :host, :class_name => 'Host::Managed', :foreign_key => :host_id
|
16
17
|
has_one :host_group, :through => :host, :source => :hostgroup
|
@@ -77,6 +78,7 @@ class TemplateInvocation < ApplicationRecord
|
|
77
78
|
def deep_clone
|
78
79
|
self.dup.tap do |invocation|
|
79
80
|
invocation.input_values = self.input_values.map(&:dup)
|
81
|
+
invocation.provider_input_values = self.provider_input_values.map(&:dup)
|
80
82
|
end
|
81
83
|
end
|
82
84
|
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# macros to fetch information about invoked jobs
|
4
|
+
module RendererMethods
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
def find_job_invocation_by_id(job_id, preload: nil)
|
8
|
+
JobInvocation.preload(preload).find_by(id: job_id)
|
9
|
+
rescue ActiveRecord::NotFound => _e
|
10
|
+
raise ::Foreman::Exception.new(N_("Can't find Job Invocation for an id %s"), job_id)
|
11
|
+
end
|
12
|
+
end
|
@@ -74,6 +74,14 @@
|
|
74
74
|
<% end %>
|
75
75
|
|
76
76
|
<div class="advanced hidden">
|
77
|
+
<%= job_template_fields.fields_for :provider_input_values do |provider_input_fields| %>
|
78
|
+
<% job_template.provider.provider_inputs.each do |input| %>
|
79
|
+
<%= provider_input_fields.fields_for input.name, input do |input_fields| %>
|
80
|
+
<%= template_input_f(input_fields) %>
|
81
|
+
<% end %>
|
82
|
+
<% end %>
|
83
|
+
<% end %>
|
84
|
+
|
77
85
|
<% if job_template.effective_user.overridable? %>
|
78
86
|
<%= 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.") %>
|
79
87
|
<% end %>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
class AddProviderInputs < ActiveRecord::Migration[6.0]
|
2
|
+
def change
|
3
|
+
create_table :invocation_provider_input_values do |t|
|
4
|
+
t.references :template_invocation, :null => false, :index => { :name => 'idx_inv_provider_input_values_on_templ_inv_id' }
|
5
|
+
t.string :value, :null => false, :limit => 255
|
6
|
+
t.string :name, :null => false, :limit => 255
|
7
|
+
t.timestamps
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -26,7 +26,7 @@ Gem::Specification.new do |s|
|
|
26
26
|
s.add_dependency 'deface'
|
27
27
|
s.add_dependency 'dynflow', '>= 1.0.2', '< 2.0.0'
|
28
28
|
s.add_dependency 'foreman_remote_execution_core'
|
29
|
-
s.add_dependency 'foreman-tasks', '>= 4.
|
29
|
+
s.add_dependency 'foreman-tasks', '>= 4.1.0'
|
30
30
|
|
31
31
|
s.add_development_dependency 'factory_bot_rails', '~> 4.8.0'
|
32
32
|
s.add_development_dependency 'rdoc'
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'foreman_remote_execution_core'
|
2
|
-
|
3
1
|
module ForemanRemoteExecution
|
4
2
|
DYNFLOW_QUEUE = :remote_execution
|
5
3
|
|
@@ -60,7 +58,7 @@ module ForemanRemoteExecution
|
|
60
58
|
ApipieDSL.configuration.dsl_classes_matchers += [
|
61
59
|
"#{ForemanRemoteExecution::Engine.root}/app/lib/foreman_remote_execution/renderer/**/*.rb",
|
62
60
|
]
|
63
|
-
|
61
|
+
register_global_js_file 'global'
|
64
62
|
automatic_assets(false)
|
65
63
|
precompile_assets(*assets_to_precompile)
|
66
64
|
|
@@ -155,6 +153,8 @@ module ForemanRemoteExecution
|
|
155
153
|
ctx.permit :execution
|
156
154
|
end
|
157
155
|
|
156
|
+
extend_template_helpers ForemanRemoteExecution::RendererMethods
|
157
|
+
|
158
158
|
extend_rabl_template 'api/v2/smart_proxies/main', 'api/v2/smart_proxies/pubkey'
|
159
159
|
extend_rabl_template 'api/v2/interfaces/main', 'api/v2/interfaces/execution_flag'
|
160
160
|
extend_rabl_template 'api/v2/subnets/show', 'api/v2/subnets/remote_execution_proxies'
|
@@ -163,9 +163,7 @@ module ForemanRemoteExecution
|
|
163
163
|
|
164
164
|
# Extend Registration module
|
165
165
|
extend_allowed_registration_vars :remote_execution_interface
|
166
|
-
|
167
|
-
cx.add_pagelet :global_registration, name: N_('Remote Execution'), partial: 'api/v2/registration/form', priority: 100, id: 'remote_execution_interface'
|
168
|
-
end
|
166
|
+
register_global_js_file 'fills'
|
169
167
|
ForemanTasks.dynflow.eager_load_actions!
|
170
168
|
extend_observable_events(::Dynflow::Action.descendants.select { |klass| klass <= ::Actions::ObservableAction }.map(&:namespaced_event_names))
|
171
169
|
end
|
@@ -226,6 +224,7 @@ module ForemanRemoteExecution
|
|
226
224
|
::Api::V2::SubnetsController.include ::ForemanRemoteExecution::Concerns::Api::V2::SubnetsControllerExtensions
|
227
225
|
::Api::V2::RegistrationController.prepend ::ForemanRemoteExecution::Concerns::Api::V2::RegistrationControllerExtensions
|
228
226
|
::Api::V2::RegistrationController.include ::ForemanRemoteExecution::Concerns::Api::V2::RegistrationControllerExtensions::ApipieExtensions
|
227
|
+
::Api::V2::RegistrationCommandsController.include ::ForemanRemoteExecution::Concerns::Api::V2::RegistrationCommandsControllerExtensions::ApipieExtensions
|
229
228
|
end
|
230
229
|
|
231
230
|
initializer 'foreman_remote_execution.register_gettext', after: :load_config_initializers do |_app|
|
data/locale/action_names.rb
CHANGED
@@ -27,6 +27,11 @@ msgstr "vor %s"
|
|
27
27
|
msgid "%{description} on %{host}"
|
28
28
|
msgstr "%{description} auf %{host}"
|
29
29
|
|
30
|
+
msgid "...and %{count} more"
|
31
|
+
msgid_plural "...and %{count} more"
|
32
|
+
msgstr[0] ""
|
33
|
+
msgstr[1] ""
|
34
|
+
|
30
35
|
msgid "A comma separated list of input names to be excluded from the foreign template."
|
31
36
|
msgstr "Kommagetrennte Liste von Eingabenamen, die aus der Fremdvorlage auszuschließen ist"
|
32
37
|
|
@@ -54,6 +59,12 @@ msgstr "Aktionen"
|
|
54
59
|
msgid "Add Foreign Input Set"
|
55
60
|
msgstr "Fremdeingabe-Satz hinzufügen"
|
56
61
|
|
62
|
+
msgid "Advanced fields"
|
63
|
+
msgstr ""
|
64
|
+
|
65
|
+
msgid "All fields are required."
|
66
|
+
msgstr ""
|
67
|
+
|
57
68
|
msgid "Alphabetical"
|
58
69
|
msgstr ""
|
59
70
|
|
@@ -96,6 +107,12 @@ msgstr "bookmark_id und search_query konnte nicht angegeben werden"
|
|
96
107
|
msgid "Cannot specify both recurrence and scheduling"
|
97
108
|
msgstr "Wiederholung und Planung konnten nicht angegeben werden"
|
98
109
|
|
110
|
+
msgid "Category And Template"
|
111
|
+
msgstr ""
|
112
|
+
|
113
|
+
msgid "Category and template"
|
114
|
+
msgstr ""
|
115
|
+
|
99
116
|
msgid "Choose a job template that is pre-selected in job invocation form"
|
100
117
|
msgstr ""
|
101
118
|
|
@@ -126,6 +143,9 @@ msgstr ""
|
|
126
143
|
msgid "Control concurrency level and distribution over time"
|
127
144
|
msgstr "Parallelitätsebene und zeitliche Verteilung steuern"
|
128
145
|
|
146
|
+
msgid "Could not display data for job invocation."
|
147
|
+
msgstr ""
|
148
|
+
|
129
149
|
msgid "Could not find any suitable interface for execution"
|
130
150
|
msgstr ""
|
131
151
|
|
@@ -228,6 +248,12 @@ msgstr " Effektive Benutzer-Methode \"%{current_value}\" ist keine %{valid_metho
|
|
228
248
|
msgid "Effective user options"
|
229
249
|
msgstr "Effektive Benutzeroptionen"
|
230
250
|
|
251
|
+
msgid "Effective user password"
|
252
|
+
msgstr ""
|
253
|
+
|
254
|
+
msgid "Effective user password is only applicable for SSH provider. Other providers ignore this field. <br> Password is stored encrypted in DB until the job finishes. For future or recurring executions, it is removed after the last execution."
|
255
|
+
msgstr ""
|
256
|
+
|
231
257
|
msgid "Enable Global Proxy"
|
232
258
|
msgstr ""
|
233
259
|
|
@@ -264,18 +290,12 @@ msgstr "Fehlgeschlagen"
|
|
264
290
|
msgid "Failed rendering template: %s"
|
265
291
|
msgstr "Rendern der Vorlage fehlgeschlagen: %s"
|
266
292
|
|
267
|
-
msgid "Fallback Without Proxy"
|
268
|
-
msgstr ""
|
269
|
-
|
270
293
|
msgid "Fallback to Any Proxy"
|
271
294
|
msgstr ""
|
272
295
|
|
273
296
|
msgid "Feature input %{input_name} not defined in template %{template_name}"
|
274
297
|
msgstr "Funktionseingabe %{input_name} nicht definiert in Vorlage %{template_name}"
|
275
298
|
|
276
|
-
msgid "Filter"
|
277
|
-
msgstr "Filter"
|
278
|
-
|
279
299
|
msgid "Foreign input set"
|
280
300
|
msgstr "Fremdeingabe-Satz"
|
281
301
|
|
@@ -288,6 +308,9 @@ msgstr ""
|
|
288
308
|
msgid "Get output for a host"
|
289
309
|
msgstr "Ausgabe für einen Host abfragen"
|
290
310
|
|
311
|
+
msgid "Get outputs of hosts in a job"
|
312
|
+
msgstr ""
|
313
|
+
|
291
314
|
msgid "Get raw output for a host"
|
292
315
|
msgstr ""
|
293
316
|
|
@@ -306,9 +329,15 @@ msgstr ""
|
|
306
329
|
msgid "Host with id '%{id}' was not found"
|
307
330
|
msgstr "Host mit ID '%{id}' nicht gefunden"
|
308
331
|
|
332
|
+
msgid "Hosts gone missing"
|
333
|
+
msgstr ""
|
334
|
+
|
309
335
|
msgid "How often the job should occur, in the cron format"
|
310
336
|
msgstr "Wie oft der Job auftreten soll, in Cron-Format"
|
311
337
|
|
338
|
+
msgid "Identifier of the Host interface for Remote execution"
|
339
|
+
msgstr ""
|
340
|
+
|
312
341
|
msgid "Import"
|
313
342
|
msgstr "Import"
|
314
343
|
|
@@ -336,6 +365,12 @@ msgstr "Beschreibung des Eingabe-Satzes"
|
|
336
365
|
msgid "Inputs to use"
|
337
366
|
msgstr "Zu verwendende Eingaben"
|
338
367
|
|
368
|
+
msgid "Interface with the '%s' identifier was specified as a remote execution interface, however the interface was not found on the host. If the interface exists, it needs to be created in Foreman during the registration."
|
369
|
+
msgstr ""
|
370
|
+
|
371
|
+
msgid "Internal proxy selector can only be used if Katello is enabled"
|
372
|
+
msgstr ""
|
373
|
+
|
339
374
|
msgid "Invocation type, one of %s"
|
340
375
|
msgstr "Jobtyp, einer von %s"
|
341
376
|
|
@@ -387,6 +422,9 @@ msgstr "Job-Vorlage erfolgreich importiert"
|
|
387
422
|
msgid "Job templates"
|
388
423
|
msgstr "Job-Vorlagen"
|
389
424
|
|
425
|
+
msgid "Job wizard"
|
426
|
+
msgstr ""
|
427
|
+
|
390
428
|
msgid "JobTemplate|Locked"
|
391
429
|
msgstr "Gesperrt"
|
392
430
|
|
@@ -432,6 +470,9 @@ msgstr "Job-Vorlagen pro Standort auflisten"
|
|
432
470
|
msgid "List job templates per organization"
|
433
471
|
msgstr "Job-Vorlagen pro Organisation auflisten"
|
434
472
|
|
473
|
+
msgid "List of proxy IDs to be used for remote execution"
|
474
|
+
msgstr ""
|
475
|
+
|
435
476
|
msgid "List remote execution features"
|
436
477
|
msgstr "Entfernte Ausführungsfunktionen auflisten"
|
437
478
|
|
@@ -459,6 +500,9 @@ msgstr "Neue Job-Vorlage"
|
|
459
500
|
msgid "No execution finished yet"
|
460
501
|
msgstr "Noch keine Ausführung abgeschlossen"
|
461
502
|
|
503
|
+
msgid "No hosts found."
|
504
|
+
msgstr ""
|
505
|
+
|
462
506
|
msgid "No template mapped to feature %{feature_name}"
|
463
507
|
msgstr "Der Funktion %{feature_name} wurde keine Vorlage zugewiesen"
|
464
508
|
|
@@ -503,6 +547,9 @@ msgstr ""
|
|
503
547
|
"Port für die Verwendung von SSH Kommunikation. Standardport 22. \n"
|
504
548
|
"Sie können diese Einstellung pro Host mit dem Parameter remote_execution_ssh_port überschreiben."
|
505
549
|
|
550
|
+
msgid "Preupgrade job"
|
551
|
+
msgstr ""
|
552
|
+
|
506
553
|
msgid "Preview"
|
507
554
|
msgstr "Vorschau"
|
508
555
|
|
@@ -542,6 +589,9 @@ msgstr "Entfernte Ausführung"
|
|
542
589
|
msgid "Remote Execution Features"
|
543
590
|
msgstr "Entfernte Ausführungsfunktionen "
|
544
591
|
|
592
|
+
msgid "Remote Execution Interface"
|
593
|
+
msgstr ""
|
594
|
+
|
545
595
|
msgid "Remote action:"
|
546
596
|
msgstr "Entfernte Aktion"
|
547
597
|
|
@@ -581,6 +631,9 @@ msgstr "Wird aufgelöst zu"
|
|
581
631
|
msgid "Results"
|
582
632
|
msgstr ""
|
583
633
|
|
634
|
+
msgid "Review details"
|
635
|
+
msgstr ""
|
636
|
+
|
584
637
|
msgid "Run"
|
585
638
|
msgstr "Ausführen"
|
586
639
|
|
@@ -596,6 +649,9 @@ msgstr "Höchstens n Aufgaben gleichzeitig ausführen"
|
|
596
649
|
msgid "Run at most N tasks at a time. If this is set and proxy batch triggering is enabled, then tasks are triggered on the smart proxy in batches of size 1."
|
597
650
|
msgstr ""
|
598
651
|
|
652
|
+
msgid "Run job"
|
653
|
+
msgstr ""
|
654
|
+
|
599
655
|
msgid "SSH"
|
600
656
|
msgstr "SSH"
|
601
657
|
|
@@ -632,9 +688,6 @@ msgstr "Zum Ende scrollen"
|
|
632
688
|
msgid "Scroll to top"
|
633
689
|
msgstr "Zum Anfang scrollen"
|
634
690
|
|
635
|
-
msgid "Search"
|
636
|
-
msgstr "Suchen"
|
637
|
-
|
638
691
|
msgid "Search Query"
|
639
692
|
msgstr ""
|
640
693
|
|
@@ -662,6 +715,12 @@ msgstr ""
|
|
662
715
|
msgid "Should the ip addresses on host interfaces be preferred over the fqdn? It is useful when DNS not resolving the fqdns properly. You may override this per host by setting a parameter called remote_execution_connect_by_ip. This setting only applies to IPv4. When the host has only an IPv6 address on the interface used for remote execution, hostname will be used even if this setting is set to true."
|
663
716
|
msgstr ""
|
664
717
|
|
718
|
+
msgid "Should this interface be used for remote execution?"
|
719
|
+
msgstr ""
|
720
|
+
|
721
|
+
msgid "Show Job status for the hosts"
|
722
|
+
msgstr ""
|
723
|
+
|
665
724
|
msgid "Show foreign input set details"
|
666
725
|
msgstr " Details zu Fremdeingabe-Satz anzeigen"
|
667
726
|
|
@@ -692,12 +751,6 @@ msgstr "Erfolgreich"
|
|
692
751
|
msgid "Success"
|
693
752
|
msgstr "Erfolg"
|
694
753
|
|
695
|
-
msgid "Sudo password"
|
696
|
-
msgstr ""
|
697
|
-
|
698
|
-
msgid "Sudo password is only applicable for SSH provider. Other providers ignore this field. <br> Password is stored encrypted in DB until the job finishes. For future or recurring executions, it is removed after the last execution."
|
699
|
-
msgstr ""
|
700
|
-
|
701
754
|
msgid "Sync Job Templates"
|
702
755
|
msgstr ""
|
703
756
|
|
@@ -763,6 +816,9 @@ msgstr "Der Benutzer kann auf die Vorlage %{template_name}, die der Funktion %{f
|
|
763
816
|
msgid "There was an error while updating the status, try refreshing the page."
|
764
817
|
msgstr "Beim Status-Update ist ein Fehler aufgetreten, versuchen Sie die Seite zu aktualisieren."
|
765
818
|
|
819
|
+
msgid "This can happen if the host is removed or moved to another organization or location after the job was started"
|
820
|
+
msgstr ""
|
821
|
+
|
766
822
|
msgid "This template is locked for editing."
|
767
823
|
msgstr "Diese Vorlage ist schreibgeschützt."
|
768
824
|
|
@@ -889,9 +945,6 @@ msgstr "Welcher Benutzer zur Ausführung des Skripts verwendet werden soll (mitt
|
|
889
945
|
msgid "What user should be used to run the script (using sudo-like mechanisms). Defaults to a template parameter or global setting."
|
890
946
|
msgstr "Welcher Benutzer zur Ausführung des Skripts (mittels sudo-ähnlichen Mechanismen) verwendet werden soll. Standardmäßig wird ein Vorlagenparameter oder eine allgemeine Einstellung verwendet."
|
891
947
|
|
892
|
-
msgid "When enabled, the remote execution will try to run the commands directly, when no proxy with remote execution feature is configured for the host."
|
893
|
-
msgstr ""
|
894
|
-
|
895
948
|
msgid "When enabled, working directories will be removed after task completion. You may override this per host by setting a parameter called remote_execution_cleanup_working_dirs."
|
896
949
|
msgstr ""
|
897
950
|
|
@@ -925,9 +978,15 @@ msgstr "Eingabe-Satz für diese Vorlage hinzufügen, um auf andere Vorlage-Einga
|
|
925
978
|
msgid "cancelled"
|
926
979
|
msgstr "abgebrochen"
|
927
980
|
|
981
|
+
msgid "default_capsule method missing from SmartProxy"
|
982
|
+
msgstr ""
|
983
|
+
|
928
984
|
msgid "effective user"
|
929
985
|
msgstr ""
|
930
986
|
|
987
|
+
msgid "error"
|
988
|
+
msgstr ""
|
989
|
+
|
931
990
|
msgid "error during rendering: %s"
|
932
991
|
msgstr "Fehler beim Rendern: %s"
|
933
992
|
|
@@ -952,9 +1011,6 @@ msgstr "enthaltene Vorlage '%s' nicht gefunden"
|
|
952
1011
|
msgid "input macro with name '%s' used, but no input with such name defined for this template"
|
953
1012
|
msgstr "Es wurde ein Eingabe-Macro namens '%s' verwendet, aber es wurde keine Eingabe mit diesem Namen für diese Vorlage definiert"
|
954
1013
|
|
955
|
-
msgid "planned"
|
956
|
-
msgstr "geplant"
|
957
|
-
|
958
1014
|
msgid "queued"
|
959
1015
|
msgstr "in der Warteschlange"
|
960
1016
|
|
@@ -964,9 +1020,6 @@ msgstr ""
|
|
964
1020
|
msgid "remove template input set"
|
965
1021
|
msgstr "Vorlageneingabe-Satz entfernen"
|
966
1022
|
|
967
|
-
msgid "running"
|
968
|
-
msgstr "wird ausgeführt"
|
969
|
-
|
970
1023
|
msgid "running %{percent}%%"
|
971
1024
|
msgstr "wird ausgeführt %{percent}%%"
|
972
1025
|
|
@@ -976,9 +1029,6 @@ msgstr "Sekunden"
|
|
976
1029
|
msgid "succeeded"
|
977
1030
|
msgstr "erfolgreich"
|
978
1031
|
|
979
|
-
msgid "success"
|
980
|
-
msgstr "erfolgreich"
|
981
|
-
|
982
1032
|
msgid "tasks at a time"
|
983
1033
|
msgstr ""
|
984
1034
|
|