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.
- checksums.yaml +4 -4
- data/.github/workflows/ruby_ci.yml +2 -0
- data/app/controllers/api/v2/job_invocations_controller.rb +1 -0
- data/app/helpers/hosts_extensions_helper.rb +62 -0
- data/app/lib/actions/remote_execution/run_host_job.rb +4 -0
- data/app/lib/actions/remote_execution/run_hosts_job.rb +4 -0
- data/app/models/concerns/foreman_remote_execution/foreman_tasks_task_extensions.rb +6 -0
- data/app/models/host_status/execution_status.rb +2 -1
- data/app/models/job_invocation.rb +1 -1
- data/app/models/job_invocation_composer.rb +7 -3
- data/app/models/job_template.rb +6 -1
- data/app/models/remote_execution_provider.rb +4 -0
- data/app/models/ssh_execution_provider.rb +3 -3
- data/app/models/template_invocation.rb +2 -0
- data/app/services/remote_execution_proxy_selector.rb +1 -1
- data/app/views/api/v2/job_invocations/base.json.rabl +1 -1
- data/app/views/job_invocations/_card_target_hosts.html.erb +8 -0
- data/app/views/job_invocations/_form.html.erb +2 -0
- data/app/views/overrides/subnets/_rex_tab_pane.html.erb +1 -1
- data/db/migrate/20220331112719_add_ssh_user_to_job_invocation.rb +5 -0
- data/lib/foreman_remote_execution/engine.rb +6 -3
- data/lib/foreman_remote_execution/version.rb +1 -1
- data/locale/action_names.rb +3 -3
- data/locale/de/foreman_remote_execution.po +23 -23
- data/locale/en/foreman_remote_execution.po +23 -23
- data/locale/en_GB/foreman_remote_execution.po +23 -23
- data/locale/es/foreman_remote_execution.po +23 -23
- data/locale/foreman_remote_execution.pot +64 -66
- data/locale/fr/foreman_remote_execution.po +23 -23
- data/locale/ja/foreman_remote_execution.po +23 -23
- data/locale/ko/foreman_remote_execution.po +23 -23
- data/locale/pt_BR/foreman_remote_execution.po +23 -23
- data/locale/ru/foreman_remote_execution.po +23 -23
- data/locale/zh_CN/foreman_remote_execution.po +23 -23
- data/locale/zh_TW/foreman_remote_execution.po +23 -23
- data/test/unit/api_params_test.rb +33 -0
- data/test/unit/remote_execution_provider_test.rb +26 -0
- data/webpack/JobWizard/JobWizardConstants.js +2 -2
- data/webpack/JobWizard/__tests__/fixtures.js +8 -4
- data/webpack/JobWizard/steps/AdvancedFields/AdvancedFields.js +9 -0
- data/webpack/JobWizard/steps/AdvancedFields/Fields.js +21 -0
- data/webpack/JobWizard/steps/AdvancedFields/__tests__/AdvancedFields.test.js +7 -2
- data/webpack/JobWizard/steps/HostsAndInputs/SelectGQL.js +2 -1
- data/webpack/JobWizard/steps/HostsAndInputs/SelectedChips.js +1 -1
- data/webpack/JobWizard/steps/HostsAndInputs/buildHostQuery.js +1 -1
- data/webpack/JobWizard/steps/HostsAndInputs/hostgroups.gql +1 -0
- data/webpack/JobWizard/steps/HostsAndInputs/hosts.gql +1 -0
- data/webpack/JobWizard/steps/ReviewDetails/index.js +2 -1
- data/webpack/JobWizard/steps/Schedule/__tests__/Schedule.test.js +15 -15
- data/webpack/JobWizard/steps/form/SearchSelect.js +0 -1
- data/webpack/JobWizard/submit.js +2 -0
- data/webpack/__mocks__/foremanReact/common/globalIdHelpers.js +1 -0
- data/webpack/global_index.js +2 -8
- data/webpack/react_app/components/FeaturesDropdown/index.js +1 -1
- data/webpack/react_app/components/HostKebab/KebabItems.js +6 -1
- data/webpack/react_app/components/RecentJobsCard/RecentJobsCard.js +4 -4
- data/webpack/react_app/components/TargetingHosts/TargetingHostsConsts.js +1 -0
- data/webpack/react_app/components/TargetingHosts/TargetingHostsPage.js +8 -3
- data/webpack/react_app/components/TargetingHosts/__tests__/__snapshots__/TargetingHostsPage.test.js.snap +9 -1
- data/webpack/react_app/components/TargetingHosts/__tests__/fixtures.js +1 -4
- data/webpack/react_app/components/TargetingHosts/index.js +1 -0
- data/webpack/react_app/extend/Fills.js +48 -0
- metadata +9 -8
- data/app/helpers/concerns/foreman_remote_execution/hosts_helper_extensions.rb +0 -62
- data/webpack/react_app/extend/fillKebabItems.js +0 -11
- data/webpack/react_app/extend/fillRecentJobsCard.js +0 -11
- data/webpack/react_app/extend/fillRexFeaturesDropdown.js +0 -11
- data/webpack/react_app/extend/fillregistrationAdvanced.js +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 58d5205206634382e90cd1d8c9a75248fb6eb0268671a01cd03a3fc2f9ff1c25
|
4
|
+
data.tar.gz: a417fc114ad51630e41874b4dcb95e791d9ae26bcae087654ec13fcd984c4ba3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f438ba4b0c67b2c12b541fc76d0c17ef235df5f3573e45c3a5ebb70a8a05242da62e4de32989e59d5eb94c3473647f49447b602d4474bb83cb7aaa765c54d6f7
|
7
|
+
data.tar.gz: c43babb00b2d921701cbe300da9f3ec8fa59c4bec8b75a58d0f19d1fd1a3d1debcda02474e8701a35aa6d95293063b1d781d82564a7d1b76093504db221a29c2
|
@@ -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
|
@@ -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
|
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).
|
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) { |
|
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
|
|
data/app/models/job_template.rb
CHANGED
@@ -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
|
-
|
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
|
@@ -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.
|
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>
|
@@ -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.
|
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
|
-
|
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
|
|
data/locale/action_names.rb
CHANGED
@@ -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
|
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
|
1224
|
+
msgid "View all jobs"
|
1216
1225
|
msgstr ""
|
1217
1226
|
|
1218
|
-
msgid "View
|
1227
|
+
msgid "View finished jobs"
|
1219
1228
|
msgstr ""
|
1220
1229
|
|
1221
|
-
msgid "View
|
1230
|
+
msgid "View running jobs"
|
1222
1231
|
msgstr ""
|
1223
1232
|
|
1224
|
-
msgid "View
|
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 "
|
73
|
+
msgid "Action with sub plans"
|
71
74
|
msgstr ""
|
72
75
|
|
73
|
-
msgid "
|
76
|
+
msgid "Actions"
|
74
77
|
msgstr ""
|
75
78
|
|
76
|
-
msgid "
|
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
|
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
|
1221
|
+
msgid "View all jobs"
|
1213
1222
|
msgstr ""
|
1214
1223
|
|
1215
|
-
msgid "View
|
1224
|
+
msgid "View finished jobs"
|
1216
1225
|
msgstr ""
|
1217
1226
|
|
1218
|
-
msgid "View
|
1227
|
+
msgid "View running jobs"
|
1219
1228
|
msgstr ""
|
1220
1229
|
|
1221
|
-
msgid "View
|
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 ""
|