foreman_salt 13.2.1 → 14.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -0
  3. data/app/controllers/foreman_salt/api/v2/salt_autosign_controller.rb +31 -1
  4. data/app/controllers/foreman_salt/api/v2/salt_variables_controller.rb +1 -2
  5. data/app/lib/proxy_api/salt.rb +16 -2
  6. data/app/models/foreman_salt/concerns/host_managed_extensions.rb +64 -15
  7. data/app/models/foreman_salt/salt_status.rb +12 -0
  8. data/app/services/foreman_salt/report_importer.rb +1 -1
  9. data/config/routes.rb +1 -0
  10. data/db/migrate/20210312150333_add_salt_autosign_to_host.rb +6 -0
  11. data/db/seeds.d/76-job_templates.rb +1 -1
  12. data/lib/foreman_salt/engine.rb +2 -4
  13. data/lib/foreman_salt/extensions.rb +0 -3
  14. data/lib/foreman_salt/version.rb +1 -1
  15. data/locale/ca/LC_MESSAGES/foreman_salt.mo +0 -0
  16. data/locale/ca/foreman_salt.po +541 -0
  17. data/locale/cs_CZ/LC_MESSAGES/foreman_salt.mo +0 -0
  18. data/locale/cs_CZ/foreman_salt.po +541 -0
  19. data/locale/de/LC_MESSAGES/foreman_salt.mo +0 -0
  20. data/locale/de/foreman_salt.po +0 -18
  21. data/locale/en/LC_MESSAGES/foreman_salt.mo +0 -0
  22. data/locale/en/foreman_salt.po +0 -18
  23. data/locale/en_GB/LC_MESSAGES/foreman_salt.mo +0 -0
  24. data/locale/en_GB/foreman_salt.po +541 -0
  25. data/locale/es/LC_MESSAGES/foreman_salt.mo +0 -0
  26. data/locale/es/foreman_salt.po +541 -0
  27. data/locale/foreman_salt.pot +22 -46
  28. data/locale/fr/LC_MESSAGES/foreman_salt.mo +0 -0
  29. data/locale/fr/foreman_salt.po +541 -0
  30. data/locale/gl/LC_MESSAGES/foreman_salt.mo +0 -0
  31. data/locale/gl/foreman_salt.po +541 -0
  32. data/locale/it/LC_MESSAGES/foreman_salt.mo +0 -0
  33. data/locale/it/foreman_salt.po +541 -0
  34. data/locale/ja/LC_MESSAGES/foreman_salt.mo +0 -0
  35. data/locale/ja/foreman_salt.po +541 -0
  36. data/locale/ko/LC_MESSAGES/foreman_salt.mo +0 -0
  37. data/locale/ko/foreman_salt.po +541 -0
  38. data/locale/nl_NL/LC_MESSAGES/foreman_salt.mo +0 -0
  39. data/locale/nl_NL/foreman_salt.po +541 -0
  40. data/locale/pl/LC_MESSAGES/foreman_salt.mo +0 -0
  41. data/locale/pl/foreman_salt.po +542 -0
  42. data/locale/pt_BR/LC_MESSAGES/foreman_salt.mo +0 -0
  43. data/locale/pt_BR/foreman_salt.po +541 -0
  44. data/locale/ru/LC_MESSAGES/foreman_salt.mo +0 -0
  45. data/locale/ru/foreman_salt.po +542 -0
  46. data/locale/sv_SE/LC_MESSAGES/foreman_salt.mo +0 -0
  47. data/locale/sv_SE/foreman_salt.po +541 -0
  48. data/locale/zh_CN/LC_MESSAGES/foreman_salt.mo +0 -0
  49. data/locale/zh_CN/foreman_salt.po +541 -0
  50. data/locale/zh_TW/LC_MESSAGES/foreman_salt.mo +0 -0
  51. data/locale/zh_TW/foreman_salt.po +541 -0
  52. data/test/functional/api/v2/salt_autosign_controller_test.rb +2 -0
  53. data/test/integration/salt_autosign_test.rb +2 -2
  54. data/test/integration/salt_keys_test.rb +2 -3
  55. data/test/unit/host_extensions_test.rb +55 -11
  56. metadata +40 -15
  57. data/app/models/foreman_salt/fact_name.rb +0 -14
  58. data/app/services/foreman_salt/fact_importer.rb +0 -15
  59. data/app/services/foreman_salt/fact_parser.rb +0 -114
  60. data/test/unit/grains_centos.json +0 -113
  61. data/test/unit/salt_fact_importer_test.rb +0 -24
  62. data/test/unit/salt_fact_parser_test.rb +0 -44
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 73d74127a44ff9d72274c35327e39136f900957306b6be6f61ed4d203a57048e
4
- data.tar.gz: edcf695b45ef11353f43715d7414c69c81cac19fcb59701c6ec609d2cba321fb
3
+ metadata.gz: 287507e11ca2f63bc8341eae5bc832e7d95ad5b848922b9eba44b85486fd9dc3
4
+ data.tar.gz: e1a70ace048abbcf30d57e0631f8b1ad1627bbad3c5261b2196d0a92663ef833
5
5
  SHA512:
6
- metadata.gz: caedc4692655b265bf46f63e4f589ab308c62e12557ad6da9a5d002a8f1814faa0adcf00791a4e945153ea94ae53d260a7a168961cf3ac3d8cbe2246d3f9f508
7
- data.tar.gz: 81f7202d404bf4da3757e867a6dee76cc307e1692da0f4c9a2f80501b4db90f36dd6c44fcd4697e4016d28069d29e5866afe26f0ba19652608570ee21b3cfd47
6
+ metadata.gz: '08395ab98cb79f8dfc725268cfcb9dc8b11c015562625ea56f90315edaa9bcf1c76601d123481d57eed865212cc7212cfa36be6ea1506d8e59d1ac15afaa5f2b'
7
+ data.tar.gz: f7a59b6f52e80340520a8ed4523e39727659612a737fb848c33731013684f09dcbe83e27c02c928a22614f18842120ce3d53908bc2ec4176a153bb69c2124527
data/README.md CHANGED
@@ -17,6 +17,7 @@ This plug-in adds support for Salt to Foreman.
17
17
  | >= 1.22 | 10.3.1 |
18
18
  | >= 1.23 | 11.0.1 |
19
19
  | >= 1.24 | 13.2.0 |
20
+ | >= 2.5 | 14.0.0 |
20
21
 
21
22
  ## Documentation
22
23
 
@@ -4,7 +4,15 @@ module ForemanSalt
4
4
  module Api
5
5
  module V2
6
6
  class SaltAutosignController < ::ForemanSalt::Api::V2::BaseController
7
- before_action :find_proxy, :setup_proxy
7
+ include ::Foreman::Controller::SmartProxyAuth
8
+ include ::Foreman::Controller::Parameters::Host
9
+
10
+ # The add_smart_proxy_filters must be executed first! Otherwise, resource_finder won't work properly
11
+ add_smart_proxy_filters :auth
12
+
13
+ before_action :find_proxy, except: [:auth]
14
+ before_action :find_host, :find_proxy_via_host, only: [:auth]
15
+ before_action :setup_proxy
8
16
 
9
17
  api :GET, '/salt_autosign/:smart_proxy_id', N_('List all autosign records')
10
18
  param :smart_proxy_id, :identifier_dottable, :required => true
@@ -28,6 +36,18 @@ module ForemanSalt
28
36
  render :json => { root_node_name => _('Record deleted.') }
29
37
  end
30
38
 
39
+ api :PUT, '/salt_autosign_auth', N_("Set the salt_status as \'successful authentication\' and remove the corresponding autosign key from the Smart Proxy")
40
+ param :name, String, :required => true
41
+ def auth
42
+ Rails.logger.info("Removing Salt autosign key and update status for host #{@host}")
43
+ @api.autosign_remove_key(@host.salt_autosign_key) unless @host.salt_autosign_key.nil?
44
+ @host.update(:salt_status => ForemanSalt::SaltStatus.minion_auth_success)
45
+ render :json => { :message => "Removed autosign key and updated status succesfully" }, :status => 204
46
+ rescue ::Foreman::Exception => e
47
+ Rails.logger.warn("Cannot delete autosign key of host (id => #{params[:name]}) state: #{e}")
48
+ render :json => { :message => e.to_s }, :status => :unprocessable_entity
49
+ end
50
+
31
51
  def metadata_total
32
52
  @total ||= all_autosign.count
33
53
  end
@@ -50,11 +70,21 @@ module ForemanSalt
50
70
  @_autosigns ||= @api.autosign_list.map { |record| OpenStruct.new(:record => record) }
51
71
  end
52
72
 
73
+ def find_host
74
+ @host = resource_finder(Host.authorized(:view_hosts), params[:name])
75
+ not_found unless @host
76
+ end
77
+
53
78
  def find_proxy
54
79
  @proxy = ::SmartProxy.friendly.find(params[:smart_proxy_id])
55
80
  not_found unless @proxy
56
81
  end
57
82
 
83
+ def find_proxy_via_host
84
+ @proxy = ::SmartProxy.friendly.find(@host.salt_proxy.id)
85
+ not_found unless @proxy
86
+ end
87
+
58
88
  def setup_proxy
59
89
  @api = ProxyAPI::Salt.new(:url => @proxy.url)
60
90
  end
@@ -6,7 +6,6 @@ module ForemanSalt
6
6
  # API controller for Salt Variables
7
7
  class SaltVariablesController < ::ForemanSalt::Api::V2::BaseController
8
8
  include ::ForemanSalt::Concerns::SaltVariableParameters
9
- include Foreman::Controller::Parameters::VariableLookupKey
10
9
 
11
10
  wrap_parameters :salt_variable, :include => salt_variable_params_filter.accessible_attributes(parameter_filter_context) + ['salt_state_id']
12
11
  before_action :find_resource, :only => [:show, :destroy, :update]
@@ -58,7 +57,7 @@ module ForemanSalt
58
57
  param_group :salt_variable, :as => :update
59
58
 
60
59
  def update
61
- @salt_variable.update!(variable_lookup_key_params)
60
+ @salt_variable.update!(salt_variable_params)
62
61
  render 'foreman_salt/api/v2/salt_variables/show'
63
62
  end
64
63
 
@@ -14,7 +14,7 @@ module ::ProxyAPI
14
14
  def autosign_create(name)
15
15
  parse(post('', "autosign/#{URI.escape(name)}"))
16
16
  rescue => e
17
- raise ProxyException.new(url, e, N_('Unable to set Salt autosign for %s'), name)
17
+ raise ProxyException.new(url, e, N_('Unable to set Salt autosign hostname for %s'), name)
18
18
  end
19
19
 
20
20
  def autosign_remove(name)
@@ -22,7 +22,21 @@ module ::ProxyAPI
22
22
  rescue RestClient::ResourceNotFound
23
23
  true # entry doesn't exists anyway
24
24
  rescue => e
25
- raise ProxyException.new(url, e, N_('Unable to delete Salt autosign for %s'), name)
25
+ raise ProxyException.new(url, e, N_('Unable to delete Salt autosign hostname for %s'), name)
26
+ end
27
+
28
+ def autosign_create_key(key)
29
+ parse(post('', "autosign_key/#{URI.escape(key)}"))
30
+ rescue => e
31
+ raise ProxyException.new(url, e, N_('Unable to create Salt autosign key %s'), key)
32
+ end
33
+
34
+ def autosign_remove_key(key)
35
+ parse(delete("autosign_key/#{URI.escape(key)}"))
36
+ rescue RestClient::ResourceNotFound
37
+ true # entry doesn't exists anyway
38
+ rescue => e
39
+ raise ProxyException.new(url, e, N_('Unable to delete Salt autosign key %s'), key)
26
40
  end
27
41
 
28
42
  def environments_list
@@ -42,9 +42,8 @@ module ForemanSalt
42
42
 
43
43
  validate :salt_modules_in_host_environment
44
44
 
45
- after_build :delete_salt_key, :if => ->(host) { host.salt_proxy }
46
- before_provision :accept_salt_key, :if => ->(host) { host.salt_proxy }
47
- before_destroy :delete_salt_key, :if => ->(host) { host.salt_proxy }
45
+ after_build :ensure_salt_autosign, :if => ->(host) { host.salt_proxy }
46
+ before_destroy :remove_salt_minion, :if => ->(host) { host.salt_proxy }
48
47
  end
49
48
 
50
49
  def salt_params
@@ -58,6 +57,14 @@ module ForemanSalt
58
57
  end
59
58
  end
60
59
 
60
+ def host_params_grains_name
61
+ "salt_grains"
62
+ end
63
+
64
+ def autosign_grain_name
65
+ "autosign_key"
66
+ end
67
+
61
68
  def salt_modules_for_enc
62
69
  all_salt_modules.collect(&:name).uniq
63
70
  end
@@ -95,24 +102,66 @@ module ForemanSalt
95
102
  end
96
103
  end
97
104
 
98
- private
99
-
100
- def accept_salt_key
105
+ def derive_salt_grains(use_autosign: False)
106
+ grains = {}
101
107
  begin
102
- Rails.logger.info("Host #{fqdn} is built, accepting Salt key")
103
- key = ForemanSalt::SmartProxies::SaltKeys.find(salt_proxy, fqdn)
104
- key&.accept
108
+ Rails.logger.info("Derive Salt Grains from host_params and autosign_key")
109
+ grains[autosign_grain_name] = salt_autosign_key if use_autosign && !salt_autosign_key.nil?
110
+ unless host_params[host_params_grains_name].nil? ||
111
+ host_params[host_params_grains_name].class != Hash
112
+ grains.merge!(host_params[host_params_grains_name])
113
+ end
105
114
  rescue Foreman::Exception => e
106
- Rails.logger.warn("Unable to accept key for #{fqdn}: #{e}")
115
+ Rails.logger.warn("Unable to derive Salt Grains: #{e}")
107
116
  end
117
+ grains
118
+ end
119
+
120
+ private
121
+
122
+ def ensure_salt_autosign
123
+ remove_salt_autosign
124
+ create_salt_autosign
125
+ end
126
+
127
+ def remove_salt_minion
128
+ remove_salt_autosign
129
+ remove_salt_key
130
+ end
131
+
132
+ def remove_salt_key
133
+ Rails.logger.info("Remove salt key for host #{fqdn}")
134
+ api = ProxyAPI::Salt.new(:url => salt_proxy.url)
135
+ api.key_delete(name)
136
+ end
137
+
138
+ def remove_salt_autosign
139
+ key = self.salt_autosign_key
140
+ unless key.nil?
141
+ Rails.logger.info("Remove salt autosign key for host #{fqdn}")
142
+ begin
143
+ api = ProxyAPI::Salt.new(:url => salt_proxy.url)
144
+ api.autosign_remove_key(key)
145
+ rescue Foreman::Exception => e
146
+ Rails.logger.warn("Unable to remove salt autosign for #{fqdn}: #{e}")
147
+ end
148
+ end
149
+ end
150
+
151
+ def generate_provisioning_key
152
+ SecureRandom.hex(10)
108
153
  end
109
154
 
110
- def delete_salt_key
155
+ def create_salt_autosign
111
156
  begin
112
- key = ForemanSalt::SmartProxies::SaltKeys.find(salt_proxy, fqdn)
113
- key&.delete
157
+ Rails.logger.info("Create salt autosign key for host #{fqdn}")
158
+ api = ProxyAPI::Salt.new(:url => salt_proxy.url)
159
+ key = generate_provisioning_key
160
+ api.autosign_create_key(key)
161
+ update(:salt_autosign_key => key)
162
+ update(:salt_status => ForemanSalt::SaltStatus.minion_auth_waiting)
114
163
  rescue Foreman::Exception => e
115
- Rails.logger.warn("Unable to delete key for #{fqdn}: #{e}")
164
+ Rails.logger.warn("Unable to create salt autosign for #{fqdn}: #{e}")
116
165
  end
117
166
  end
118
167
  end
@@ -120,5 +169,5 @@ module ForemanSalt
120
169
  end
121
170
 
122
171
  class ::Host::Managed::Jail < Safemode::Jail
123
- allow :salt_environment
172
+ allow :salt_environment, :salt_master, :derive_salt_grains
124
173
  end
@@ -0,0 +1,12 @@
1
+ module ForemanSalt
2
+ # Define the class that holds different states a Salt host become
3
+ class SaltStatus
4
+ def self.minion_auth_waiting
5
+ 'Waiting for Salt Minion to authenticate'
6
+ end
7
+
8
+ def self.minion_auth_success
9
+ 'Salt Minion was authenticated successfully to Salt Master'
10
+ end
11
+ end
12
+ end
@@ -43,7 +43,7 @@ module ForemanSalt
43
43
 
44
44
  @host.save(:validate => false)
45
45
  @host.reload
46
- @host.refresh_statuses
46
+ @host.refresh_statuses([HostStatus.find_status_by_humanized_name("configuration")])
47
47
 
48
48
  logger.info("Imported report for #{@host} in #{(Time.zone.now - start_time).round(2)} seconds")
49
49
  end
data/config/routes.rb CHANGED
@@ -38,6 +38,7 @@ Rails.application.routes.draw do
38
38
  scope '(:apiv)', :defaults => { :apiv => 'v2' },
39
39
  :apiv => /v1|v2/, :constraints => ApiConstraints.new(:version => 2) do
40
40
  match '/jobs/upload' => 'foreman_salt/api/v2/jobs#upload', :via => :post
41
+ match '/salt_autosign_auth' => 'foreman_salt/api/v2/salt_autosign#auth', :via => :put
41
42
 
42
43
  constraints(:smart_proxy_id => /[\w\.-]+/, :name => /[\w\.-]+/, :record => /[^\/]+/) do
43
44
  match '/salt_keys/:smart_proxy_id' => 'foreman_salt/api/v2/salt_keys#index', :via => :get
@@ -0,0 +1,6 @@
1
+ class AddSaltAutosignToHost < ActiveRecord::Migration[4.2]
2
+ def change
3
+ add_column :hosts, :salt_autosign_key, :string, limit: 255, null: true
4
+ add_column :hosts, :salt_status, :string, limit: 255, null: true
5
+ end
6
+ end
@@ -20,7 +20,7 @@ if ForemanSalt.with_remote_execution?
20
20
  sync = !Rails.env.test? && Setting[:remote_execution_sync_templates]
21
21
  template = JobTemplate.import_raw!(File.read(template),
22
22
  :default => true,
23
- :locked => true,
23
+ :lock => true,
24
24
  :update => sync)
25
25
  template.organizations = organizations if template.present?
26
26
  template.locations = locations if template.present?
@@ -38,16 +38,14 @@ module ForemanSalt
38
38
 
39
39
  initializer 'foreman_salt.assets.precompile' do |app|
40
40
  app.config.assets.precompile += %w(foreman_salt/states.js)
41
- end
42
-
43
- initializer 'foreman_salt.assets.precompile' do |app|
44
41
  app.config.assets.precompile += %w[foreman_salt/Salt.png]
45
42
  end
46
43
 
47
44
  initializer 'foreman_salt.configure_assets', :group => :assets do
48
45
  SETTINGS[:foreman_salt] = {
49
46
  :assets => {
50
- :precompile => ['foreman_salt/states.js']
47
+ :precompile => ['foreman_salt/Salt.png',
48
+ 'foreman_salt/states.js']
51
49
  }
52
50
  }
53
51
  end
@@ -1,7 +1,4 @@
1
1
  begin
2
- ::FactImporter.register_fact_importer(:foreman_salt, ForemanSalt::FactImporter)
3
- ::FactParser.register_fact_parser(:foreman_salt, ForemanSalt::FactParser)
4
-
5
2
  # Helper Extensions
6
3
  ::HostsHelper.send :include, ForemanSalt::HostsHelperExtensions
7
4
  ::SmartProxiesHelper.send :include, ForemanSalt::SmartProxiesHelperExtensions
@@ -1,3 +1,3 @@
1
1
  module ForemanSalt
2
- VERSION = '13.2.1'
2
+ VERSION = '14.0.0'
3
3
  end
@@ -0,0 +1,541 @@
1
+ # Catalan translations for foreman_salt package.
2
+ # Copyright (C) 2020 THE PACKAGE'S COPYRIGHT HOLDER
3
+ # This file is distributed under the same license as the foreman_salt package.
4
+ # FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
5
+ #
6
+ msgid ""
7
+ msgstr ""
8
+ "Project-Id-Version: foreman_salt 1.0.0\n"
9
+ "Report-Msgid-Bugs-To: \n"
10
+ "PO-Revision-Date: 2020-05-11 18:53+0530\n"
11
+ "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12
+ "Language-Team: Catalan\n"
13
+ "Language: ca\n"
14
+ "MIME-Version: 1.0\n"
15
+ "Content-Type: text/plain; charset=UTF-8\n"
16
+ "Content-Transfer-Encoding: 8bit\n"
17
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
18
+ "\n"
19
+
20
+ msgid "*Clear environment*"
21
+ msgstr ""
22
+
23
+ msgid "Accept"
24
+ msgstr ""
25
+
26
+ msgid "Accepted"
27
+ msgstr ""
28
+
29
+ msgid "Action with sub plans"
30
+ msgstr ""
31
+
32
+ msgid "Actions"
33
+ msgstr ""
34
+
35
+ msgid "Added"
36
+ msgstr ""
37
+
38
+ msgid "Array of State ids"
39
+ msgstr ""
40
+
41
+ msgid "Autosign"
42
+ msgstr ""
43
+
44
+ msgid "Autosign entries for %s"
45
+ msgstr ""
46
+
47
+ msgid "Autosign record"
48
+ msgstr ""
49
+
50
+ msgid "Avoid duplicate values when merging them (only array type)?"
51
+ msgstr ""
52
+
53
+ msgid "Before including these variables as Salt pillar, Foreman will validate that your variables comply with the validation."
54
+ msgstr ""
55
+
56
+ msgid "Cancel"
57
+ msgstr ""
58
+
59
+ msgid "Change Salt Environment"
60
+ msgstr ""
61
+
62
+ msgid "Change Salt Master"
63
+ msgstr ""
64
+
65
+ msgid "Check/Uncheck Added"
66
+ msgstr ""
67
+
68
+ msgid "Check/Uncheck All"
69
+ msgstr ""
70
+
71
+ msgid "Check/Uncheck Removed"
72
+ msgstr ""
73
+
74
+ msgid "Continue to look for matches after first find (only array/hash type)? Note: merging overrides ignores all matchers that are omitted."
75
+ msgstr ""
76
+
77
+ msgid "Could not find salt environment with id %s"
78
+ msgstr ""
79
+
80
+ msgid "Create Salt Variable"
81
+ msgstr ""
82
+
83
+ msgid "Create Salt variable"
84
+ msgstr ""
85
+
86
+ msgid "Create a Salt environment"
87
+ msgstr ""
88
+
89
+ msgid "Create a state"
90
+ msgstr ""
91
+
92
+ msgid "Create an autosign record"
93
+ msgstr ""
94
+
95
+ msgid "Default Behavior"
96
+ msgstr ""
97
+
98
+ msgid "Default value of variable"
99
+ msgstr ""
100
+
101
+ msgid "Delete %s?"
102
+ msgstr ""
103
+
104
+ msgid "Delete a Salt Key"
105
+ msgstr ""
106
+
107
+ msgid "Delete an autosign record"
108
+ msgstr ""
109
+
110
+ msgid "Deletes Salt variable"
111
+ msgstr ""
112
+
113
+ msgid "Description of variable"
114
+ msgstr ""
115
+
116
+ msgid "Destroy a Salt environment"
117
+ msgstr ""
118
+
119
+ msgid "Destroy a state"
120
+ msgstr ""
121
+
122
+ msgid "Dryrun only"
123
+ msgstr ""
124
+
125
+ msgid "Edit"
126
+ msgstr ""
127
+
128
+ msgid "Edit %s"
129
+ msgstr ""
130
+
131
+ msgid "Edit Salt Environment %s"
132
+ msgstr ""
133
+
134
+ msgid "Edit Salt State %s"
135
+ msgstr ""
136
+
137
+ msgid "Edit Salt Variable"
138
+ msgstr ""
139
+
140
+ msgid "Environment"
141
+ msgstr ""
142
+
143
+ msgid "Environments"
144
+ msgstr ""
145
+
146
+ msgid "FQDN of host that key belongs to"
147
+ msgstr ""
148
+
149
+ msgid "Failed to execute state.highstate: %s"
150
+ msgstr ""
151
+
152
+ msgid "Filter %s"
153
+ msgstr ""
154
+
155
+ msgid "Fingerprint"
156
+ msgstr ""
157
+
158
+ msgid "Function"
159
+ msgstr ""
160
+
161
+ msgid "Hidden Value"
162
+ msgstr ""
163
+
164
+ msgid "Hide all values for this parameter."
165
+ msgstr ""
166
+
167
+ msgid "Hide the Run Salt state.highstate button on the host details page"
168
+ msgstr ""
169
+
170
+ msgid "Host groups"
171
+ msgstr ""
172
+
173
+ msgid "Host must have an environment in order to set salt states"
174
+ msgstr ""
175
+
176
+ msgid "Hosts"
177
+ msgstr ""
178
+
179
+ msgid "ID of Salt Proxy"
180
+ msgstr ""
181
+
182
+ msgid "If checked, will raise an error if there is no default value and no matcher provide a value."
183
+ msgstr ""
184
+
185
+ msgid "Import"
186
+ msgstr ""
187
+
188
+ msgid "Import Puppet classes"
189
+ msgstr ""
190
+
191
+ msgid "Import facts"
192
+ msgstr ""
193
+
194
+ msgid "Import from %s"
195
+ msgstr ""
196
+
197
+ msgid "Import states from a salt master"
198
+ msgstr ""
199
+
200
+ msgid "Include default value when merging all matching values"
201
+ msgstr ""
202
+
203
+ msgid "Include default value when merging all matching values."
204
+ msgstr ""
205
+
206
+ msgid "Invalid report"
207
+ msgstr ""
208
+
209
+ msgid "JID"
210
+ msgstr ""
211
+
212
+ msgid "Key Name"
213
+ msgstr ""
214
+
215
+ msgid "Keys"
216
+ msgstr ""
217
+
218
+ msgid "Limit to a specific environment"
219
+ msgstr ""
220
+
221
+ msgid "Limit to a specific environments"
222
+ msgstr ""
223
+
224
+ msgid "Limit to specific actions: i.e. add, remove"
225
+ msgstr ""
226
+
227
+ msgid "List Salt variables"
228
+ msgstr ""
229
+
230
+ msgid "List all Salt Minions"
231
+ msgstr ""
232
+
233
+ msgid "List all Salt environments"
234
+ msgstr ""
235
+
236
+ msgid "List all Salt keys"
237
+ msgstr ""
238
+
239
+ msgid "List all Salt states"
240
+ msgstr ""
241
+
242
+ msgid "List all autosign records"
243
+ msgstr ""
244
+
245
+ msgid "Mark the variable to be managed by Foreman. When the Salt State of this variable is assigned to a host, the default value will be added as a Salt pillar for this host. Specify matchers to set a different value for such variable."
246
+ msgstr ""
247
+
248
+ msgid "Merge all matching values (only array/hash type)"
249
+ msgstr ""
250
+
251
+ msgid "Must specify a Smart Proxy to use"
252
+ msgstr ""
253
+
254
+ msgid "Name"
255
+ msgstr ""
256
+
257
+ msgid "Name of the Salt state"
258
+ msgstr ""
259
+
260
+ msgid "Name of variable"
261
+ msgstr ""
262
+
263
+ msgid "Namespace Foreman pillars under 'foreman' key"
264
+ msgstr ""
265
+
266
+ msgid "New"
267
+ msgstr ""
268
+
269
+ msgid "New Autosign Entry"
270
+ msgstr ""
271
+
272
+ msgid "New Salt Environment"
273
+ msgstr ""
274
+
275
+ msgid "New Salt State"
276
+ msgstr ""
277
+
278
+ msgid "New Salt Variable"
279
+ msgstr ""
280
+
281
+ msgid "No Salt master defined - can't continue"
282
+ msgstr ""
283
+
284
+ msgid "No changes found"
285
+ msgstr ""
286
+
287
+ msgid "No salt environment selected!"
288
+ msgstr ""
289
+
290
+ msgid "Operation"
291
+ msgstr ""
292
+
293
+ msgid "Optional Input Validator"
294
+ msgstr ""
295
+
296
+ msgid "Order"
297
+ msgstr ""
298
+
299
+ msgid "Override the default value of the Salt variable."
300
+ msgstr ""
301
+
302
+ msgid "Overriden"
303
+ msgstr ""
304
+
305
+ msgid "Please select a Salt environment first"
306
+ msgstr ""
307
+
308
+ msgid "Prioritize Attribute Order"
309
+ msgstr ""
310
+
311
+ msgid "Record deleted."
312
+ msgstr ""
313
+
314
+ msgid "Reject"
315
+ msgstr ""
316
+
317
+ msgid "Rejected"
318
+ msgstr ""
319
+
320
+ msgid "Remote action:"
321
+ msgstr ""
322
+
323
+ msgid "Remove duplicate values (only array type)"
324
+ msgstr ""
325
+
326
+ msgid "Removed"
327
+ msgstr ""
328
+
329
+ msgid "Result"
330
+ msgstr ""
331
+
332
+ msgid "Run Salt"
333
+ msgstr ""
334
+
335
+ msgid "Run Salt state.highstate"
336
+ msgstr ""
337
+
338
+ msgid "Salt Autosign"
339
+ msgstr ""
340
+
341
+ msgid "Salt ENC"
342
+ msgstr ""
343
+
344
+ msgid "Salt Environment"
345
+ msgstr ""
346
+
347
+ msgid "Salt Environments"
348
+ msgstr ""
349
+
350
+ msgid "Salt Keys"
351
+ msgstr ""
352
+
353
+ msgid "Salt Keys on %s"
354
+ msgstr ""
355
+
356
+ msgid "Salt Master"
357
+ msgstr ""
358
+
359
+ msgid "Salt Smart Proxy ID"
360
+ msgstr ""
361
+
362
+ msgid "Salt State"
363
+ msgstr ""
364
+
365
+ msgid "Salt States"
366
+ msgstr ""
367
+
368
+ msgid "Salt Variable Details"
369
+ msgstr ""
370
+
371
+ msgid "Salt Variables"
372
+ msgstr ""
373
+
374
+ msgid "Salt environment"
375
+ msgstr ""
376
+
377
+ msgid "Salt environment ID"
378
+ msgstr ""
379
+
380
+ msgid "Salt external nodes YAML dump"
381
+ msgstr ""
382
+
383
+ msgid "Salt state"
384
+ msgstr ""
385
+
386
+ msgid "Salt states must be in the environment of the host"
387
+ msgstr ""
388
+
389
+ msgid "SaltEnvironment|Name"
390
+ msgstr ""
391
+
392
+ msgid "SaltModule|Name"
393
+ msgstr ""
394
+
395
+ msgid "Save"
396
+ msgstr ""
397
+
398
+ msgid "Select salt environment"
399
+ msgstr ""
400
+
401
+ msgid "Select the changes you want to realize in Foreman"
402
+ msgstr ""
403
+
404
+ msgid "Set the order in which values are resolved."
405
+ msgstr ""
406
+
407
+ msgid "Show a Salt environment"
408
+ msgstr ""
409
+
410
+ msgid "Show a minion"
411
+ msgstr ""
412
+
413
+ msgid "Show a state"
414
+ msgstr ""
415
+
416
+ msgid "Show variable"
417
+ msgstr ""
418
+
419
+ msgid "Specify Matchers"
420
+ msgstr ""
421
+
422
+ msgid "State"
423
+ msgstr ""
424
+
425
+ msgid "State ID"
426
+ msgstr ""
427
+
428
+ msgid "State can be \"accepted\" or \"rejected\""
429
+ msgstr ""
430
+
431
+ msgid "States"
432
+ msgstr ""
433
+
434
+ msgid "Successfully executed, check log files for more details"
435
+ msgstr ""
436
+
437
+ msgid "Successfully imported"
438
+ msgstr ""
439
+
440
+ msgid "Successfully updated %s."
441
+ msgstr ""
442
+
443
+ msgid "The order in which matchers keys are processed, first match wins.<br> You may use multiple attributes as a matcher key, for example, an order of <code>host group, environment</code> would expect a matcher such as <code>hostgroup = \"web servers\", environment = production</code>"
444
+ msgstr ""
445
+
446
+ msgid "The order in which values are resolved"
447
+ msgstr ""
448
+
449
+ msgid "Toggle"
450
+ msgstr ""
451
+
452
+ msgid "Trigger a state.highstate run on a node"
453
+ msgstr ""
454
+
455
+ msgid "Type"
456
+ msgstr ""
457
+
458
+ msgid "Types of validation values"
459
+ msgstr ""
460
+
461
+ msgid "Types of variable values"
462
+ msgstr ""
463
+
464
+ msgid "Unable to accept Salt key for %s"
465
+ msgstr ""
466
+
467
+ msgid "Unable to delete Salt autosign for %s"
468
+ msgstr ""
469
+
470
+ msgid "Unable to delete Salt key for %s"
471
+ msgstr ""
472
+
473
+ msgid "Unable to fetch Salt environments list"
474
+ msgstr ""
475
+
476
+ msgid "Unable to fetch Salt key list"
477
+ msgstr ""
478
+
479
+ msgid "Unable to fetch Salt states list"
480
+ msgstr ""
481
+
482
+ msgid "Unable to fetch autosign list"
483
+ msgstr ""
484
+
485
+ msgid ""
486
+ "Unable to generate output, Check log files\n"
487
+ msgstr ""
488
+
489
+ msgid "Unable to reject Salt key for %s"
490
+ msgstr ""
491
+
492
+ msgid "Unable to run Salt state.highstate for %s"
493
+ msgstr ""
494
+
495
+ msgid "Unable to set Salt autosign for %s"
496
+ msgstr ""
497
+
498
+ msgid "Unaccepted"
499
+ msgstr ""
500
+
501
+ msgid "Update"
502
+ msgstr ""
503
+
504
+ msgid "Update a Salt Key"
505
+ msgstr ""
506
+
507
+ msgid "Update a minion"
508
+ msgstr ""
509
+
510
+ msgid "Updated hosts: changed salt environment"
511
+ msgstr ""
512
+
513
+ msgid "Updates Salt variable"
514
+ msgstr ""
515
+
516
+ msgid "Upload a Job"
517
+ msgstr ""
518
+
519
+ msgid "Used to enforce certain values for the parameter values"
520
+ msgstr ""
521
+
522
+ msgid "Value to use when there is no match."
523
+ msgstr ""
524
+
525
+ msgid "Variables"
526
+ msgstr ""
527
+
528
+ msgid "Variable|Name"
529
+ msgstr ""
530
+
531
+ msgid "Variable|State"
532
+ msgstr ""
533
+
534
+ msgid "When enabled the parameter is hidden in the UI"
535
+ msgstr ""
536
+
537
+ msgid "is alphanumeric and cannot contain spaces"
538
+ msgstr ""
539
+
540
+ msgid "must be alphanumeric, can contain periods, dashes, underscores and must not contain spaces"
541
+ msgstr ""