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