foreman_openscap 0.11.5 → 0.12.0
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/app/controllers/api/v2/compliance/arf_reports_controller.rb +3 -6
- data/app/controllers/api/v2/compliance/policies_controller.rb +3 -1
- data/app/controllers/concerns/foreman/controller/parameters/policy_api.rb +1 -1
- data/app/controllers/policies_controller.rb +2 -1
- data/app/helpers/foreman_openscap_helper.rb +14 -0
- data/app/helpers/policies_helper.rb +36 -0
- data/app/models/concerns/foreman_openscap/host_extensions.rb +5 -1
- data/app/models/concerns/foreman_openscap/openscap_proxy_core_extensions.rb +15 -19
- data/app/models/foreman_openscap/policy.rb +14 -80
- data/app/services/foreman_openscap/client_config/ansible.rb +38 -0
- data/app/services/foreman_openscap/client_config/base.rb +41 -0
- data/app/services/foreman_openscap/client_config/manual.rb +27 -0
- data/app/services/foreman_openscap/client_config/puppet.rb +38 -0
- data/app/services/foreman_openscap/config_name_service.rb +29 -0
- data/app/services/foreman_openscap/hostgroup_overrider.rb +71 -0
- data/app/services/foreman_openscap/lookup_key_overrider.rb +94 -0
- data/app/views/policies/_form.html.erb +6 -2
- data/app/views/policies/steps/_deployment_options_form.html.erb +11 -0
- data/app/views/policies/steps/{_create_policy_form.html.erb → _policy_attributes_form.html.erb} +0 -0
- data/db/migrate/20190103093409_add_deployment_option_to_policy.foreman_openscap.rb +15 -0
- data/lib/foreman_openscap/engine.rb +3 -3
- data/lib/foreman_openscap/version.rb +1 -1
- data/locale/de/foreman_openscap.edit.po +302 -106
- data/locale/en_GB/foreman_openscap.edit.po +302 -106
- data/locale/es/foreman_openscap.edit.po +302 -106
- data/locale/fr/foreman_openscap.edit.po +302 -106
- data/locale/gl/foreman_openscap.edit.po +302 -106
- data/locale/it/foreman_openscap.edit.po +302 -106
- data/locale/ja/foreman_openscap.edit.po +302 -106
- data/locale/ko/foreman_openscap.edit.po +302 -106
- data/locale/pt_BR/foreman_openscap.edit.po +302 -106
- data/locale/ru/foreman_openscap.edit.po +302 -106
- data/locale/sv_SE/foreman_openscap.edit.po +302 -106
- data/locale/zh_CN/foreman_openscap.edit.po +302 -106
- data/locale/zh_TW/foreman_openscap.edit.po +302 -106
- data/test/factories/policy_factory.rb +1 -0
- data/test/functional/api/v2/compliance/arf_reports_controller_test.rb +2 -3
- data/test/functional/api/v2/compliance/policies_controller_test.rb +2 -2
- data/test/test_plugin_helper.rb +26 -7
- data/test/unit/openscap_host_test.rb +0 -2
- data/test/unit/policy_test.rb +32 -23
- data/test/unit/services/config_name_service_test.rb +39 -0
- data/test/unit/services/hostgroup_overrider_test.rb +78 -0
- data/test/unit/services/lookup_key_overrider_test.rb +52 -0
- metadata +19 -5
- data/test/unit/puppet_overrides_test.rb +0 -38
@@ -0,0 +1,38 @@
|
|
1
|
+
module ForemanOpenscap
|
2
|
+
module ClientConfig
|
3
|
+
class Puppet < Base
|
4
|
+
delegate :puppetclass_name, :to => :constants
|
5
|
+
|
6
|
+
alias config_item_name puppetclass_name
|
7
|
+
|
8
|
+
def type
|
9
|
+
:puppet
|
10
|
+
end
|
11
|
+
|
12
|
+
def available?
|
13
|
+
defined?(Puppetclass)
|
14
|
+
end
|
15
|
+
|
16
|
+
def inline_help
|
17
|
+
{
|
18
|
+
:text => "Requires #{puppetclass_name} Puppet class. This will assign the class to the hosts or selected hostgroups.<br>Every puppet run ensures the foreman_scap_client is configured according to the policy.",
|
19
|
+
:replace_text => 'Puppet class',
|
20
|
+
:route_helper_method => :hash_for_puppetclasses_path
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
def constants
|
25
|
+
OpenStruct.new(
|
26
|
+
:server_param => 'server',
|
27
|
+
:port_param => 'port',
|
28
|
+
:policies_param => 'policies',
|
29
|
+
:puppetclass_name => 'foreman_scap_client',
|
30
|
+
:config_item_class_name => 'Puppetclass',
|
31
|
+
:override_method_name => 'class_params',
|
32
|
+
:msg_name => _('Puppet class'),
|
33
|
+
:lookup_key_plural_name => _('Smart Class Parameters')
|
34
|
+
)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module ForemanOpenscap
|
2
|
+
class ConfigNameService
|
3
|
+
attr_reader :configs
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@configs = [
|
7
|
+
ForemanOpenscap::ClientConfig::Ansible.new,
|
8
|
+
ForemanOpenscap::ClientConfig::Puppet.new,
|
9
|
+
ForemanOpenscap::ClientConfig::Manual.new
|
10
|
+
]
|
11
|
+
end
|
12
|
+
|
13
|
+
def config_for(type)
|
14
|
+
@configs.find { |config| config.type == type }
|
15
|
+
end
|
16
|
+
|
17
|
+
def all_except(type)
|
18
|
+
@configs.reject { |config| config.type == type }
|
19
|
+
end
|
20
|
+
|
21
|
+
def all_available_except(type)
|
22
|
+
all_except(type).select(&:available?)
|
23
|
+
end
|
24
|
+
|
25
|
+
def all_available_with_overrides_except(type)
|
26
|
+
all_available_except(type).select(&:managed_overrides?)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module ForemanOpenscap
|
2
|
+
class HostgroupOverrider
|
3
|
+
def initialize(policy)
|
4
|
+
@policy = policy
|
5
|
+
@name_sevice = ConfigNameService.new
|
6
|
+
end
|
7
|
+
|
8
|
+
def populate
|
9
|
+
return unless @policy.deploy_by && Policy.deploy_by_variants.include?(@policy.deploy_by)
|
10
|
+
config = @name_sevice.config_for @policy.deploy_by.to_sym
|
11
|
+
return unless config.available?
|
12
|
+
return unless config.managed_overrides?
|
13
|
+
@policy.hostgroups.each do |hostgroup|
|
14
|
+
populate_overrides hostgroup, config
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def add_config_tool(hostgroup, klass, name, collection_method)
|
21
|
+
item = klass.find_by(:name => name)
|
22
|
+
hostgroup.public_send(collection_method) << item unless hostgroup.public_send(collection_method).include? item
|
23
|
+
item
|
24
|
+
end
|
25
|
+
|
26
|
+
def remove_config_tool(hostgroup, klass, name, collection_method)
|
27
|
+
item = klass.find_by(:name => name)
|
28
|
+
hostgroup.public_send(collection_method).delete(item) if hostgroup.public_send(collection_method).include? item
|
29
|
+
item
|
30
|
+
end
|
31
|
+
|
32
|
+
def populate_overrides(hostgroup, config)
|
33
|
+
item = add_config_tool hostgroup, config.config_item_class_name.constantize, config.config_item_name, config.collection_method
|
34
|
+
return unless item
|
35
|
+
add_overrides item.public_send(config.override_method_name), hostgroup, config
|
36
|
+
depopulate_overrides hostgroup, config.type
|
37
|
+
end
|
38
|
+
|
39
|
+
def depopulate_overrides(hostgroup, type)
|
40
|
+
@name_sevice.all_available_with_overrides_except(type).map do |remove_config|
|
41
|
+
item = remove_config_tool hostgroup, remove_config.config_item_class_name.constantize, remove_config.config_item_name, remove_config.collection_method
|
42
|
+
next unless item
|
43
|
+
remove_overrides item.public_send(remove_config.override_method_name), hostgroup, remove_config
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def add_overrides(collection, hostgroup, config)
|
48
|
+
collection.where(:override => true).find_each do |override|
|
49
|
+
return unless hostgroup.openscap_proxy && (url = hostgroup.openscap_proxy.url).present?
|
50
|
+
|
51
|
+
openscap_proxy_uri = URI.parse(url)
|
52
|
+
case override.key
|
53
|
+
when config.server_param
|
54
|
+
lookup_value = LookupValue.where(:match => "hostgroup=#{hostgroup.to_label}", :lookup_key_id => override.id).first_or_initialize
|
55
|
+
lookup_value.update_attribute(:value, openscap_proxy_uri.host)
|
56
|
+
when config.port_param
|
57
|
+
lookup_value = LookupValue.where(:match => "hostgroup=#{hostgroup.to_label}", :lookup_key_id => override.id).first_or_initialize
|
58
|
+
lookup_value.update_attribute(:value, openscap_proxy_uri.port)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def remove_overrides(collection, hostgroup, config)
|
64
|
+
collection.where(:override => true).find_each do |override|
|
65
|
+
if override.key == config.server_param || override.key == config.port_param
|
66
|
+
LookupValue.find_by(:match => "hostgroup=#{hostgroup.to_label}", :lookup_key_id => override.id)&.destroy
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
module ForemanOpenscap
|
2
|
+
class LookupKeyOverrider
|
3
|
+
def initialize(policy)
|
4
|
+
@policy = policy
|
5
|
+
@name_service = ConfigNameService.new
|
6
|
+
end
|
7
|
+
|
8
|
+
def override
|
9
|
+
return unless @policy.deploy_by && Policy.deploy_by_variants.include?(@policy.deploy_by)
|
10
|
+
config = @name_service.config_for @policy.deploy_by.to_sym
|
11
|
+
unless config.available?
|
12
|
+
@policy.errors[:deploy_by] <<
|
13
|
+
_("%{type} was selected to deploy policy to clients, but %{type} is not available. Are you missing a plugin?") %
|
14
|
+
{ :type => config.type.to_s.camelize }
|
15
|
+
return
|
16
|
+
end
|
17
|
+
return unless config.managed_overrides?
|
18
|
+
override_required_params config
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def override_required_params(config)
|
24
|
+
item = config.find_config_item
|
25
|
+
|
26
|
+
unless item
|
27
|
+
err = _("Required %{msg_name} %{class} was not found, please ensure it is imported first.") %
|
28
|
+
{ :class => config.config_item_name, :msg_name => config.msg_name }
|
29
|
+
@policy.errors[:base] << err
|
30
|
+
return
|
31
|
+
end
|
32
|
+
|
33
|
+
override_params item.public_send(config.override_method_name), config
|
34
|
+
end
|
35
|
+
|
36
|
+
def override_params(lookup_keys, config)
|
37
|
+
policies_param = lookup_keys.find_by :key => config.policies_param
|
38
|
+
port_param = lookup_keys.find_by :key => config.port_param
|
39
|
+
server_param = lookup_keys.find_by :key => config.server_param
|
40
|
+
|
41
|
+
return unless all_lookup_keys_present?(config, config.policies_param => policies_param,
|
42
|
+
config.port_param => port_param,
|
43
|
+
config.server_param => server_param)
|
44
|
+
|
45
|
+
override_policies_param(policies_param, config)
|
46
|
+
override_port_param(port_param, config)
|
47
|
+
override_server_param(server_param, config)
|
48
|
+
end
|
49
|
+
|
50
|
+
def all_lookup_keys_present?(config, hash)
|
51
|
+
unless hash.values.all?
|
52
|
+
names = hash.reduce([]) do |memo, (key, value)|
|
53
|
+
memo << key if value.blank?
|
54
|
+
memo
|
55
|
+
end
|
56
|
+
|
57
|
+
err = _("The following %{key_name} were missing for %{item_name}: %{key_names}. Make sure they are imported before proceeding.") %
|
58
|
+
{ :key_name => config.lookup_key_plural_name, :key_names => names.compact.join(', '), :item_name => config.config_item_name }
|
59
|
+
|
60
|
+
@policy.errors[:base] << err
|
61
|
+
return false
|
62
|
+
end
|
63
|
+
true
|
64
|
+
end
|
65
|
+
|
66
|
+
def override_policies_param(parameter, config)
|
67
|
+
override_param(config.policies_param, parameter, config) do |param|
|
68
|
+
param.key_type = 'array'
|
69
|
+
param.default_value = '<%= @host.policies_enc %>'
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def override_port_param(param, config)
|
74
|
+
override_param config.port_param, param, config
|
75
|
+
end
|
76
|
+
|
77
|
+
def override_server_param(param, config)
|
78
|
+
override_param config.server_param, param, config
|
79
|
+
end
|
80
|
+
|
81
|
+
def override_param(param_name, param, config)
|
82
|
+
param.override = true
|
83
|
+
param.hidden_value = false
|
84
|
+
|
85
|
+
yield param if block_given?
|
86
|
+
|
87
|
+
if param.changed? && !param.save
|
88
|
+
@policy.errors[:base] <<
|
89
|
+
_('Failed to save when overriding parameters for %{config_tool}, cause: %{errors}') %
|
90
|
+
{ :config_tool => config.type, :errors => param.errors.full_messages.join(', ') }
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -5,7 +5,8 @@
|
|
5
5
|
<%= base_errors_for @policy %>
|
6
6
|
|
7
7
|
<ul class="nav nav-tabs" data-tabs="tabs">
|
8
|
-
<li class="active"><a href="#
|
8
|
+
<li class="active"><a href="#deployment" data-toggle="tab"><%= _("Deployment Options") %></a></li>
|
9
|
+
<li><a href="#primary" data-toggle="tab"><%= _("General") %></a></li>
|
9
10
|
<li><a href="#scap_content" data-toggle="tab"><%= _("SCAP Content") %></a></li>
|
10
11
|
<li><a href="#scap_schedule" data-toggle="tab"><%= _("Schedule") %></a></li>
|
11
12
|
<% if show_location_tab? %>
|
@@ -17,7 +18,10 @@
|
|
17
18
|
<li><a href='#hostgroups' data-toggle='tab'><%= _('Host Groups') %></a></li>
|
18
19
|
</ul>
|
19
20
|
<div class="tab-content">
|
20
|
-
<div class="tab-pane active" id="
|
21
|
+
<div class="tab-pane active" id="deployment">
|
22
|
+
<%= deploy_by_radios f, @policy %>
|
23
|
+
</div>
|
24
|
+
<div class="tab-pane" id="primary">
|
21
25
|
<%= text_f(f, :name) %>
|
22
26
|
<%= textarea_f(f, :description, :rows => :auto ) %>
|
23
27
|
</div>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<div class="tab-pane <%= show_partial_wizard(step) %>" id="deploy_by">
|
2
|
+
<%= wizard_header @policy.step_index, *translate_steps(@policy) %>
|
3
|
+
|
4
|
+
<div class="alert alert-info" id="scap-deployment-options-info-banner">
|
5
|
+
<span class="pficon pficon-info"></span>
|
6
|
+
<strong>There are significant differences in deployment options.</strong>
|
7
|
+
Please make sure you understand them by reading our <%= scap_doc_link('#2.3Policydeploymentoptions') %>.
|
8
|
+
</div>
|
9
|
+
|
10
|
+
<%= deploy_by_radios f, @policy %>
|
11
|
+
</div>
|
data/app/views/policies/steps/{_create_policy_form.html.erb → _policy_attributes_form.html.erb}
RENAMED
File without changes
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class AddDeploymentOptionToPolicy < ActiveRecord::Migration[5.2]
|
2
|
+
def up
|
3
|
+
add_column :foreman_openscap_policies, :deploy_by, :string
|
4
|
+
ForemanOpenscap::Policy.unscoped.in_batches do |batch|
|
5
|
+
batch.map do |policy|
|
6
|
+
policy.update_attribute(:deploy_by, 'puppet')
|
7
|
+
end
|
8
|
+
end
|
9
|
+
change_column :foreman_openscap_policies, :deploy_by, :string, :null => false
|
10
|
+
end
|
11
|
+
|
12
|
+
def down
|
13
|
+
remove_column :foreman_openscap_policies, :deploy_by
|
14
|
+
end
|
15
|
+
end
|
@@ -50,7 +50,7 @@ module ForemanOpenscap
|
|
50
50
|
|
51
51
|
initializer 'foreman_openscap.register_plugin', :before => :finisher_hook do |app|
|
52
52
|
Foreman::Plugin.register :foreman_openscap do
|
53
|
-
requires_foreman '>= 1.
|
53
|
+
requires_foreman '>= 1.21'
|
54
54
|
|
55
55
|
apipie_documented_controllers ["#{ForemanOpenscap::Engine.root}/app/controllers/api/v2/compliance/*.rb"]
|
56
56
|
|
@@ -192,11 +192,11 @@ module ForemanOpenscap
|
|
192
192
|
RemoteExecutionFeature.register(:foreman_openscap_run_scans, N_("Run OpenSCAP scan"), options)
|
193
193
|
end
|
194
194
|
|
195
|
-
add_controller_action_scope(
|
195
|
+
add_controller_action_scope('Api::V2::HostsController', :index) do |base_scope|
|
196
196
|
base_scope.preload(:policies)
|
197
197
|
end
|
198
198
|
|
199
|
-
add_controller_action_scope(
|
199
|
+
add_controller_action_scope('HostsController', :index) do |base_scope|
|
200
200
|
base_scope.preload(:policies)
|
201
201
|
end
|
202
202
|
end
|
@@ -41,19 +41,11 @@ msgstr ""
|
|
41
41
|
msgid "Download ARF report in HTML"
|
42
42
|
msgstr ""
|
43
43
|
|
44
|
-
#: ../app/controllers/api/v2/compliance/arf_reports_controller.rb:
|
45
|
-
msgid "Policy with id %s not found."
|
46
|
-
msgstr ""
|
47
|
-
|
48
|
-
#: ../app/controllers/api/v2/compliance/arf_reports_controller.rb:100
|
49
|
-
msgid "Could not find host identified by: %s"
|
50
|
-
msgstr ""
|
51
|
-
|
52
|
-
#: ../app/controllers/api/v2/compliance/arf_reports_controller.rb:105
|
44
|
+
#: ../app/controllers/api/v2/compliance/arf_reports_controller.rb:87
|
53
45
|
msgid "Failed to upload Arf Report, OpenSCAP proxy name or url not found in params when uploading for %s and host is missing openscap_proxy"
|
54
46
|
msgstr ""
|
55
47
|
|
56
|
-
#: ../app/controllers/api/v2/compliance/arf_reports_controller.rb:
|
48
|
+
#: ../app/controllers/api/v2/compliance/arf_reports_controller.rb:99
|
57
49
|
msgid "No proxy found for %{name} or %{url}"
|
58
50
|
msgstr ""
|
59
51
|
|
@@ -113,31 +105,27 @@ msgstr ""
|
|
113
105
|
msgid "Tailoring file profile ID"
|
114
106
|
msgstr ""
|
115
107
|
|
116
|
-
#: ../app/controllers/api/v2/compliance/policies_controller.rb:
|
117
|
-
msgid "How the policy should be deployed"
|
118
|
-
msgstr ""
|
119
|
-
|
120
|
-
#: ../app/controllers/api/v2/compliance/policies_controller.rb:57
|
108
|
+
#: ../app/controllers/api/v2/compliance/policies_controller.rb:56
|
121
109
|
msgid "Create a Policy"
|
122
110
|
msgstr ""
|
123
111
|
|
124
|
-
#: ../app/controllers/api/v2/compliance/policies_controller.rb:
|
112
|
+
#: ../app/controllers/api/v2/compliance/policies_controller.rb:64
|
125
113
|
msgid "Update a Policy"
|
126
114
|
msgstr ""
|
127
115
|
|
128
|
-
#: ../app/controllers/api/v2/compliance/policies_controller.rb:
|
116
|
+
#: ../app/controllers/api/v2/compliance/policies_controller.rb:72
|
129
117
|
msgid "Delete a Policy"
|
130
118
|
msgstr ""
|
131
119
|
|
132
|
-
#: ../app/controllers/api/v2/compliance/policies_controller.rb:
|
120
|
+
#: ../app/controllers/api/v2/compliance/policies_controller.rb:79
|
133
121
|
msgid "Show a policy's SCAP content"
|
134
122
|
msgstr ""
|
135
123
|
|
136
|
-
#: ../app/controllers/api/v2/compliance/policies_controller.rb:
|
124
|
+
#: ../app/controllers/api/v2/compliance/policies_controller.rb:89
|
137
125
|
msgid "Show a policy's Tailoring file"
|
138
126
|
msgstr ""
|
139
127
|
|
140
|
-
#: ../app/controllers/api/v2/compliance/policies_controller.rb:
|
128
|
+
#: ../app/controllers/api/v2/compliance/policies_controller.rb:99
|
141
129
|
msgid "No Tailoring file assigned for policy with id %s"
|
142
130
|
msgstr ""
|
143
131
|
|
@@ -253,31 +241,31 @@ msgstr ""
|
|
253
241
|
msgid "No OpenSCAP Proxy selected."
|
254
242
|
msgstr ""
|
255
243
|
|
256
|
-
#: ../app/controllers/policies_controller.rb:
|
244
|
+
#: ../app/controllers/policies_controller.rb:83
|
257
245
|
msgid "Updated hosts: Assigned with compliance policy: %s"
|
258
246
|
msgstr ""
|
259
247
|
|
260
|
-
#: ../app/controllers/policies_controller.rb:
|
248
|
+
#: ../app/controllers/policies_controller.rb:87
|
261
249
|
msgid "No compliance policy selected."
|
262
250
|
msgstr ""
|
263
251
|
|
264
|
-
#: ../app/controllers/policies_controller.rb:
|
252
|
+
#: ../app/controllers/policies_controller.rb:99
|
265
253
|
msgid "Updated hosts: Unassigned from compliance policy '%s'"
|
266
254
|
msgstr ""
|
267
255
|
|
268
|
-
#: ../app/controllers/policies_controller.rb:
|
256
|
+
#: ../app/controllers/policies_controller.rb:101
|
269
257
|
msgid "No valid policy ID provided"
|
270
258
|
msgstr ""
|
271
259
|
|
272
|
-
#: ../app/controllers/policies_controller.rb:
|
260
|
+
#: ../app/controllers/policies_controller.rb:121
|
273
261
|
msgid "No hosts were found."
|
274
262
|
msgstr ""
|
275
263
|
|
276
|
-
#: ../app/controllers/policies_controller.rb:
|
264
|
+
#: ../app/controllers/policies_controller.rb:125
|
277
265
|
msgid "No hosts selected"
|
278
266
|
msgstr ""
|
279
267
|
|
280
|
-
#: ../app/controllers/policies_controller.rb:
|
268
|
+
#: ../app/controllers/policies_controller.rb:130
|
281
269
|
msgid "Something went wrong while selecting hosts - %s"
|
282
270
|
msgstr ""
|
283
271
|
|
@@ -392,51 +380,47 @@ msgstr ""
|
|
392
380
|
msgid "Host is deleted"
|
393
381
|
msgstr ""
|
394
382
|
|
395
|
-
#: ../app/helpers/
|
396
|
-
msgid "documentation"
|
397
|
-
msgstr ""
|
398
|
-
|
399
|
-
#: ../app/helpers/policies_helper.rb:56
|
383
|
+
#: ../app/helpers/policies_helper.rb:20
|
400
384
|
msgid "Choose existing SCAP Content"
|
401
385
|
msgstr ""
|
402
386
|
|
403
|
-
#: ../app/helpers/policies_helper.rb:
|
387
|
+
#: ../app/helpers/policies_helper.rb:21 ../app/helpers/policies_helper.rb:26 ../app/models/foreman_openscap/policy.rb:100 ../app/views/policies/_form.html.erb:9 ../app/views/scap_contents/welcome.html.erb:1 ../app/views/scap_contents/welcome.html.erb:6
|
404
388
|
msgid "SCAP Content"
|
405
389
|
msgstr ""
|
406
390
|
|
407
|
-
#: ../app/helpers/policies_helper.rb:
|
391
|
+
#: ../app/helpers/policies_helper.rb:36 ../app/helpers/policies_helper.rb:43
|
408
392
|
msgid "XCCDF Profile"
|
409
393
|
msgstr ""
|
410
394
|
|
411
|
-
#: ../app/helpers/policies_helper.rb:
|
395
|
+
#: ../app/helpers/policies_helper.rb:42
|
412
396
|
msgid "Default XCCDF profile"
|
413
397
|
msgstr ""
|
414
398
|
|
415
|
-
#: ../app/helpers/policies_helper.rb:
|
399
|
+
#: ../app/helpers/policies_helper.rb:51
|
416
400
|
msgid "Choose Tailoring File"
|
417
401
|
msgstr ""
|
418
402
|
|
419
|
-
#: ../app/helpers/policies_helper.rb:
|
403
|
+
#: ../app/helpers/policies_helper.rb:52 ../app/views/policies/_list.html.erb:6
|
420
404
|
msgid "Tailoring File"
|
421
405
|
msgstr ""
|
422
406
|
|
423
|
-
#: ../app/helpers/policies_helper.rb:
|
407
|
+
#: ../app/helpers/policies_helper.rb:61
|
424
408
|
msgid "XCCDF Profile in Tailoring File"
|
425
409
|
msgstr ""
|
426
410
|
|
427
|
-
#: ../app/helpers/policies_helper.rb:
|
411
|
+
#: ../app/helpers/policies_helper.rb:62
|
428
412
|
msgid "This profile will be used to override the one from scap content"
|
429
413
|
msgstr ""
|
430
414
|
|
431
|
-
#: ../app/helpers/policies_helper.rb:
|
415
|
+
#: ../app/helpers/policies_helper.rb:73 ../app/views/arf_reports/_list.html.erb:53
|
432
416
|
msgid "Submit"
|
433
417
|
msgstr ""
|
434
418
|
|
435
|
-
#: ../app/helpers/policies_helper.rb:
|
419
|
+
#: ../app/helpers/policies_helper.rb:78 ../app/views/arf_reports/_list.html.erb:52
|
436
420
|
msgid "Cancel"
|
437
421
|
msgstr ""
|
438
422
|
|
439
|
-
#: ../app/helpers/policies_helper.rb:
|
423
|
+
#: ../app/helpers/policies_helper.rb:109 ../lib/foreman_openscap/engine.rb:138
|
440
424
|
msgid "Policies"
|
441
425
|
msgstr ""
|
442
426
|
|
@@ -488,10 +472,14 @@ msgstr ""
|
|
488
472
|
msgid "is not included in SCAP_RESULT"
|
489
473
|
msgstr ""
|
490
474
|
|
491
|
-
#: ../app/models/concerns/foreman_openscap/openscap_proxy_core_extensions.rb:
|
475
|
+
#: ../app/models/concerns/foreman_openscap/openscap_proxy_core_extensions.rb:66
|
492
476
|
msgid "must have Openscap feature"
|
493
477
|
msgstr ""
|
494
478
|
|
479
|
+
#: ../app/models/concerns/foreman_openscap/openscap_proxy_core_extensions.rb:71
|
480
|
+
msgid "Puppet class 'foreman_scap_client' not found, make sure it is imported from Puppet master"
|
481
|
+
msgstr ""
|
482
|
+
|
495
483
|
#: ../app/models/concerns/foreman_openscap/openscap_proxy_extensions.rb:8
|
496
484
|
msgid "No OpenSCAP proxy found for %{class} with id %{id}"
|
497
485
|
msgstr ""
|
@@ -512,7 +500,7 @@ msgstr ""
|
|
512
500
|
msgid "Unknown Compliance status"
|
513
501
|
msgstr ""
|
514
502
|
|
515
|
-
#: ../app/models/foreman_openscap/policy.rb:
|
503
|
+
#: ../app/models/foreman_openscap/policy.rb:29 ../app/models/foreman_openscap/policy.rb:304
|
516
504
|
msgid "is not a valid value"
|
517
505
|
msgstr ""
|
518
506
|
|
@@ -524,23 +512,19 @@ msgstr ""
|
|
524
512
|
msgid "Cannot generate HTML guide, no valid OpenSCAP proxy server found."
|
525
513
|
msgstr ""
|
526
514
|
|
527
|
-
#: ../app/models/foreman_openscap/policy.rb:100 ../app/views/policies/_form.html.erb:8
|
528
|
-
msgid "Deployment Options"
|
529
|
-
msgstr ""
|
530
|
-
|
531
515
|
#: ../app/models/foreman_openscap/policy.rb:100
|
532
|
-
msgid "
|
516
|
+
msgid "Create policy"
|
533
517
|
msgstr ""
|
534
518
|
|
535
|
-
#: ../app/models/foreman_openscap/policy.rb:100 ../app/views/policies/_form.html.erb:
|
519
|
+
#: ../app/models/foreman_openscap/policy.rb:100 ../app/views/policies/_form.html.erb:10
|
536
520
|
msgid "Schedule"
|
537
521
|
msgstr ""
|
538
522
|
|
539
|
-
#: ../app/models/foreman_openscap/policy.rb:101 ../app/views/policies/_form.html.erb:
|
523
|
+
#: ../app/models/foreman_openscap/policy.rb:101 ../app/views/policies/_form.html.erb:12 ../app/views/scap_contents/_form.html.erb:11 ../app/views/tailoring_files/_form.html.erb:11
|
540
524
|
msgid "Locations"
|
541
525
|
msgstr ""
|
542
526
|
|
543
|
-
#: ../app/models/foreman_openscap/policy.rb:102 ../app/views/policies/_form.html.erb:
|
527
|
+
#: ../app/models/foreman_openscap/policy.rb:102 ../app/views/policies/_form.html.erb:15 ../app/views/scap_contents/_form.html.erb:14 ../app/views/tailoring_files/_form.html.erb:14
|
544
528
|
msgid "Organizations"
|
545
529
|
msgstr ""
|
546
530
|
|
@@ -548,27 +532,39 @@ msgstr ""
|
|
548
532
|
msgid "Hostgroups"
|
549
533
|
msgstr ""
|
550
534
|
|
551
|
-
#: ../app/models/foreman_openscap/policy.rb:
|
535
|
+
#: ../app/models/foreman_openscap/policy.rb:251
|
536
|
+
msgid "Required Puppet class %{class} is not found, please ensure it imported first."
|
537
|
+
msgstr ""
|
538
|
+
|
539
|
+
#: ../app/models/foreman_openscap/policy.rb:277
|
540
|
+
msgid "Puppet class %{class} does not have %{parameter} class parameter."
|
541
|
+
msgstr ""
|
542
|
+
|
543
|
+
#: ../app/models/foreman_openscap/policy.rb:286
|
544
|
+
msgid "%{parameter} class parameter for class %{class} could not be configured."
|
545
|
+
msgstr ""
|
546
|
+
|
547
|
+
#: ../app/models/foreman_openscap/policy.rb:298
|
552
548
|
msgid "does not consist of 5 parts separated by space"
|
553
549
|
msgstr ""
|
554
550
|
|
555
|
-
#: ../app/models/foreman_openscap/policy.rb:
|
551
|
+
#: ../app/models/foreman_openscap/policy.rb:310
|
556
552
|
msgid "must be between 1 and 31"
|
557
553
|
msgstr ""
|
558
554
|
|
559
|
-
#: ../app/models/foreman_openscap/policy.rb:
|
555
|
+
#: ../app/models/foreman_openscap/policy.rb:315
|
560
556
|
msgid "must be present when tailoring file profile present"
|
561
557
|
msgstr ""
|
562
558
|
|
563
|
-
#: ../app/models/foreman_openscap/policy.rb:
|
559
|
+
#: ../app/models/foreman_openscap/policy.rb:316
|
564
560
|
msgid "must be present when tailoring file present"
|
565
561
|
msgstr ""
|
566
562
|
|
567
|
-
#: ../app/models/foreman_openscap/policy.rb:
|
563
|
+
#: ../app/models/foreman_openscap/policy.rb:321
|
568
564
|
msgid "does not come from selected tailoring file"
|
569
565
|
msgstr ""
|
570
566
|
|
571
|
-
#: ../app/models/foreman_openscap/policy.rb:
|
567
|
+
#: ../app/models/foreman_openscap/policy.rb:327
|
572
568
|
msgid "does not have the selected SCAP content profile"
|
573
569
|
msgstr ""
|
574
570
|
|
@@ -576,38 +572,6 @@ msgstr ""
|
|
576
572
|
msgid "invalid type %s"
|
577
573
|
msgstr ""
|
578
574
|
|
579
|
-
#: ../app/services/foreman_openscap/client_config/ansible.rb:32
|
580
|
-
msgid "Ansible role"
|
581
|
-
msgstr ""
|
582
|
-
|
583
|
-
#: ../app/services/foreman_openscap/client_config/ansible.rb:33
|
584
|
-
msgid "Ansible variables"
|
585
|
-
msgstr ""
|
586
|
-
|
587
|
-
#: ../app/services/foreman_openscap/client_config/puppet.rb:32
|
588
|
-
msgid "Puppet class"
|
589
|
-
msgstr ""
|
590
|
-
|
591
|
-
#: ../app/services/foreman_openscap/client_config/puppet.rb:33
|
592
|
-
msgid "Smart Class Parameters"
|
593
|
-
msgstr ""
|
594
|
-
|
595
|
-
#: ../app/services/foreman_openscap/lookup_key_overrider.rb:13
|
596
|
-
msgid "%{type} was selected to deploy policy to clients, but %{type} is not available. Are you missing a plugin?"
|
597
|
-
msgstr ""
|
598
|
-
|
599
|
-
#: ../app/services/foreman_openscap/lookup_key_overrider.rb:27
|
600
|
-
msgid "Required %{msg_name} %{class} was not found, please ensure it is imported first."
|
601
|
-
msgstr ""
|
602
|
-
|
603
|
-
#: ../app/services/foreman_openscap/lookup_key_overrider.rb:57
|
604
|
-
msgid "The following %{key_name} were missing for %{item_name}: %{key_names}. Make sure they are imported before proceeding."
|
605
|
-
msgstr ""
|
606
|
-
|
607
|
-
#: ../app/services/foreman_openscap/lookup_key_overrider.rb:89
|
608
|
-
msgid "Failed to save when overriding parameters for %{config_tool}, cause: %{errors}"
|
609
|
-
msgstr ""
|
610
|
-
|
611
575
|
#: ../app/services/foreman_openscap/openscap_proxy_version_check.rb:39
|
612
576
|
msgid "This feature is temporarily disabled. "
|
613
577
|
msgstr ""
|
@@ -732,7 +696,7 @@ msgstr ""
|
|
732
696
|
msgid "Host"
|
733
697
|
msgstr ""
|
734
698
|
|
735
|
-
#: ../app/views/arf_reports/delete_multiple.html.erb:27
|
699
|
+
#: ../app/views/arf_reports/delete_multiple.html.erb:27 action_names.rb:18
|
736
700
|
msgid "Delete"
|
737
701
|
msgstr ""
|
738
702
|
|
@@ -884,27 +848,27 @@ msgstr ""
|
|
884
848
|
msgid "Select OpenSCAP Proxy"
|
885
849
|
msgstr ""
|
886
850
|
|
887
|
-
#: ../app/views/policies/_form.html.erb:
|
851
|
+
#: ../app/views/policies/_form.html.erb:8
|
888
852
|
msgid "General"
|
889
853
|
msgstr ""
|
890
854
|
|
891
|
-
#: ../app/views/policies/_form.html.erb:
|
855
|
+
#: ../app/views/policies/_form.html.erb:17
|
892
856
|
msgid "Host Groups"
|
893
857
|
msgstr ""
|
894
858
|
|
895
|
-
#: ../app/views/policies/_form.html.erb:
|
859
|
+
#: ../app/views/policies/_form.html.erb:41 ../app/views/policies/steps/_schedule_form.html.erb:6
|
896
860
|
msgid "Choose period"
|
897
861
|
msgstr ""
|
898
862
|
|
899
|
-
#: ../app/views/policies/_form.html.erb:
|
863
|
+
#: ../app/views/policies/_form.html.erb:43 ../app/views/policies/steps/_schedule_form.html.erb:8
|
900
864
|
msgid "Choose weekday"
|
901
865
|
msgstr ""
|
902
866
|
|
903
|
-
#: ../app/views/policies/_form.html.erb:
|
867
|
+
#: ../app/views/policies/_form.html.erb:44 ../app/views/policies/steps/_schedule_form.html.erb:9
|
904
868
|
msgid "Number of a day in month, note that not all months have same count of days"
|
905
869
|
msgstr ""
|
906
870
|
|
907
|
-
#: ../app/views/policies/_form.html.erb:
|
871
|
+
#: ../app/views/policies/_form.html.erb:45 ../app/views/policies/steps/_schedule_form.html.erb:10
|
908
872
|
msgid "You can specify custom cron line, e.g. \"0 3 * * *\", separate each of 5 values by space"
|
909
873
|
msgstr ""
|
910
874
|
|
@@ -1187,37 +1151,269 @@ msgid "Run OpenSCAP scan"
|
|
1187
1151
|
msgstr ""
|
1188
1152
|
|
1189
1153
|
#: action_names.rb:2
|
1190
|
-
msgid "
|
1154
|
+
msgid "Action with sub plans"
|
1191
1155
|
msgstr ""
|
1192
1156
|
|
1193
1157
|
#: action_names.rb:3
|
1194
|
-
msgid "
|
1158
|
+
msgid "Import facts"
|
1195
1159
|
msgstr ""
|
1196
1160
|
|
1197
1161
|
#: action_names.rb:4
|
1198
|
-
msgid "
|
1162
|
+
msgid "Import Puppet classes"
|
1199
1163
|
msgstr ""
|
1200
1164
|
|
1201
1165
|
#: action_names.rb:5
|
1202
|
-
msgid "
|
1166
|
+
msgid "Remote action:"
|
1203
1167
|
msgstr ""
|
1204
1168
|
|
1205
1169
|
#: action_names.rb:6
|
1206
|
-
msgid "
|
1170
|
+
msgid "Create client"
|
1207
1171
|
msgstr ""
|
1208
1172
|
|
1209
1173
|
#: action_names.rb:7
|
1210
|
-
msgid "
|
1174
|
+
msgid "Delete client"
|
1211
1175
|
msgstr ""
|
1212
1176
|
|
1213
1177
|
#: action_names.rb:8
|
1214
|
-
msgid "
|
1178
|
+
msgid "Delete host"
|
1215
1179
|
msgstr ""
|
1216
1180
|
|
1217
1181
|
#: action_names.rb:9
|
1218
|
-
msgid "
|
1182
|
+
msgid "Update host"
|
1219
1183
|
msgstr ""
|
1220
1184
|
|
1221
1185
|
#: action_names.rb:10
|
1222
|
-
msgid "
|
1186
|
+
msgid "Update node"
|
1187
|
+
msgstr ""
|
1188
|
+
|
1189
|
+
#: action_names.rb:11
|
1190
|
+
msgid "Abstract async task"
|
1191
|
+
msgstr ""
|
1192
|
+
|
1193
|
+
#: action_names.rb:12
|
1194
|
+
msgid "Create"
|
1195
|
+
msgstr ""
|
1196
|
+
|
1197
|
+
#: action_names.rb:13
|
1198
|
+
msgid "Delete Activation Key"
|
1199
|
+
msgstr ""
|
1200
|
+
|
1201
|
+
#: action_names.rb:14
|
1202
|
+
msgid "Update"
|
1203
|
+
msgstr ""
|
1204
|
+
|
1205
|
+
#: action_names.rb:15
|
1206
|
+
msgid "Configure capsule"
|
1207
|
+
msgstr ""
|
1208
|
+
|
1209
|
+
#: action_names.rb:16
|
1210
|
+
msgid "Create repos"
|
1211
|
+
msgstr ""
|
1212
|
+
|
1213
|
+
#: action_names.rb:17
|
1214
|
+
msgid "Synchronize smart proxy"
|
1215
|
+
msgstr ""
|
1216
|
+
|
1217
|
+
#: action_names.rb:19
|
1218
|
+
msgid "Errata mail"
|
1219
|
+
msgstr ""
|
1220
|
+
|
1221
|
+
#: action_names.rb:20
|
1222
|
+
msgid "Incremental Update of Content View Version(s) "
|
1223
|
+
msgstr ""
|
1224
|
+
|
1225
|
+
#: action_names.rb:21
|
1226
|
+
msgid "Promote"
|
1227
|
+
msgstr ""
|
1228
|
+
|
1229
|
+
#: action_names.rb:22
|
1230
|
+
msgid "Promotion to Environment"
|
1231
|
+
msgstr ""
|
1232
|
+
|
1233
|
+
#: action_names.rb:23
|
1234
|
+
msgid "Publish"
|
1235
|
+
msgstr ""
|
1236
|
+
|
1237
|
+
#: action_names.rb:24
|
1238
|
+
msgid "Remove Versions and Associations"
|
1239
|
+
msgstr ""
|
1240
|
+
|
1241
|
+
#: action_names.rb:25
|
1242
|
+
msgid "Remove from Environment"
|
1243
|
+
msgstr ""
|
1244
|
+
|
1245
|
+
#: action_names.rb:26
|
1246
|
+
msgid "Remove Version"
|
1247
|
+
msgstr ""
|
1248
|
+
|
1249
|
+
#: action_names.rb:27
|
1250
|
+
msgid "Export"
|
1251
|
+
msgstr ""
|
1252
|
+
|
1253
|
+
#: action_names.rb:28
|
1254
|
+
msgid "Fetch pxe files"
|
1255
|
+
msgstr ""
|
1256
|
+
|
1257
|
+
#: action_names.rb:29
|
1258
|
+
msgid "Filtered index content"
|
1259
|
+
msgstr ""
|
1260
|
+
|
1261
|
+
#: action_names.rb:30
|
1262
|
+
msgid "Upload into"
|
1263
|
+
msgstr ""
|
1264
|
+
|
1265
|
+
#: action_names.rb:31
|
1266
|
+
msgid "Index content"
|
1267
|
+
msgstr ""
|
1268
|
+
|
1269
|
+
#: action_names.rb:32
|
1270
|
+
msgid "Index errata"
|
1271
|
+
msgstr ""
|
1272
|
+
|
1273
|
+
#: action_names.rb:33
|
1274
|
+
msgid "Index module streams"
|
1275
|
+
msgstr ""
|
1276
|
+
|
1277
|
+
#: action_names.rb:34
|
1278
|
+
msgid "Index package groups"
|
1279
|
+
msgstr ""
|
1280
|
+
|
1281
|
+
#: action_names.rb:35
|
1282
|
+
msgid "Remove Content"
|
1283
|
+
msgstr ""
|
1284
|
+
|
1285
|
+
#: action_names.rb:36
|
1286
|
+
msgid "Synchronize"
|
1287
|
+
msgstr ""
|
1288
|
+
|
1289
|
+
#: action_names.rb:37
|
1290
|
+
msgid "Upload errata into"
|
1291
|
+
msgstr ""
|
1292
|
+
|
1293
|
+
#: action_names.rb:38
|
1294
|
+
msgid "Create Package Group"
|
1295
|
+
msgstr ""
|
1296
|
+
|
1297
|
+
#: action_names.rb:39
|
1298
|
+
msgid "Disable"
|
1299
|
+
msgstr ""
|
1300
|
+
|
1301
|
+
#: action_names.rb:40
|
1302
|
+
msgid "Enable"
|
1303
|
+
msgstr ""
|
1304
|
+
|
1305
|
+
#: action_names.rb:41
|
1306
|
+
msgid "Run Sync Plan"
|
1307
|
+
msgstr ""
|
1308
|
+
|
1309
|
+
#: action_names.rb:42
|
1310
|
+
msgid "Incremental Update"
|
1311
|
+
msgstr ""
|
1312
|
+
|
1313
|
+
#: action_names.rb:43
|
1314
|
+
msgid "Republish Version Repositories"
|
1315
|
+
msgstr ""
|
1316
|
+
|
1317
|
+
#: action_names.rb:44
|
1318
|
+
msgid "Delete Lifecycle Environment"
|
1319
|
+
msgstr ""
|
1320
|
+
|
1321
|
+
#: action_names.rb:45
|
1322
|
+
msgid "Publish Lifecycle Environment Repositories"
|
1323
|
+
msgstr ""
|
1324
|
+
|
1325
|
+
#: action_names.rb:46
|
1326
|
+
msgid "Attach subscriptions"
|
1327
|
+
msgstr ""
|
1328
|
+
|
1329
|
+
#: action_names.rb:47
|
1330
|
+
msgid "Auto attach subscriptions"
|
1331
|
+
msgstr ""
|
1332
|
+
|
1333
|
+
#: action_names.rb:48
|
1334
|
+
msgid "Destroy Content Host"
|
1335
|
+
msgstr ""
|
1336
|
+
|
1337
|
+
#: action_names.rb:49
|
1338
|
+
msgid "Install Applicable Errata"
|
1339
|
+
msgstr ""
|
1340
|
+
|
1341
|
+
#: action_names.rb:50
|
1342
|
+
msgid "Install erratum"
|
1343
|
+
msgstr ""
|
1344
|
+
|
1345
|
+
#: action_names.rb:51
|
1346
|
+
msgid "Hypervisors"
|
1347
|
+
msgstr ""
|
1348
|
+
|
1349
|
+
#: action_names.rb:52
|
1350
|
+
msgid "Hypervisors update"
|
1351
|
+
msgstr ""
|
1352
|
+
|
1353
|
+
#: action_names.rb:53
|
1354
|
+
msgid "Install package"
|
1355
|
+
msgstr ""
|
1356
|
+
|
1357
|
+
#: action_names.rb:54
|
1358
|
+
msgid "Install package group"
|
1359
|
+
msgstr ""
|
1360
|
+
|
1361
|
+
#: action_names.rb:55
|
1362
|
+
msgid "Remove package"
|
1363
|
+
msgstr ""
|
1364
|
+
|
1365
|
+
#: action_names.rb:56
|
1366
|
+
msgid "Update package"
|
1367
|
+
msgstr ""
|
1368
|
+
|
1369
|
+
#: action_names.rb:57
|
1370
|
+
msgid "Remove package group"
|
1371
|
+
msgstr ""
|
1372
|
+
|
1373
|
+
#: action_names.rb:58
|
1374
|
+
msgid "Remove subscriptions"
|
1375
|
+
msgstr ""
|
1376
|
+
|
1377
|
+
#: action_names.rb:59
|
1378
|
+
msgid "Update for host"
|
1379
|
+
msgstr ""
|
1380
|
+
|
1381
|
+
#: action_names.rb:60
|
1382
|
+
msgid "Update Content Overrides"
|
1383
|
+
msgstr ""
|
1384
|
+
|
1385
|
+
#: action_names.rb:61
|
1386
|
+
msgid "Update release version for host"
|
1387
|
+
msgstr ""
|
1388
|
+
|
1389
|
+
#: action_names.rb:62
|
1390
|
+
msgid "Package Profile Update"
|
1391
|
+
msgstr ""
|
1392
|
+
|
1393
|
+
#: action_names.rb:63
|
1394
|
+
msgid "Auto-attach subscriptions"
|
1395
|
+
msgstr ""
|
1396
|
+
|
1397
|
+
#: action_names.rb:64
|
1398
|
+
msgid "Destroy"
|
1399
|
+
msgstr ""
|
1400
|
+
|
1401
|
+
#: action_names.rb:65
|
1402
|
+
msgid "Product Create"
|
1403
|
+
msgstr ""
|
1404
|
+
|
1405
|
+
#: action_names.rb:66
|
1406
|
+
msgid "Delete Product"
|
1407
|
+
msgstr ""
|
1408
|
+
|
1409
|
+
#: action_names.rb:67
|
1410
|
+
msgid "Reindex subscriptions"
|
1411
|
+
msgstr ""
|
1412
|
+
|
1413
|
+
#: action_names.rb:68
|
1414
|
+
msgid "Delete Package Group"
|
1415
|
+
msgstr ""
|
1416
|
+
|
1417
|
+
#: action_names.rb:69
|
1418
|
+
msgid "Report"
|
1223
1419
|
msgstr ""
|