foreman_openscap 4.1.2 → 4.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (193) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/stylesheets/foreman_openscap/policy.css +5 -0
  3. data/app/controllers/api/v2/compliance/oval_contents_controller.rb +72 -0
  4. data/app/controllers/api/v2/compliance/oval_policies_controller.rb +111 -0
  5. data/app/controllers/api/v2/compliance/oval_reports_controller.rb +47 -0
  6. data/app/controllers/concerns/foreman/controller/parameters/oval_content.rb +22 -0
  7. data/app/controllers/concerns/foreman/controller/parameters/oval_policy.rb +22 -0
  8. data/app/controllers/concerns/foreman_openscap/hosts_controller_extensions.rb +1 -1
  9. data/app/graphql/types/cve.rb +17 -0
  10. data/app/graphql/types/oval_content.rb +17 -0
  11. data/app/graphql/types/oval_policy.rb +21 -0
  12. data/app/helpers/arf_reports_helper.rb +7 -24
  13. data/app/helpers/policies_helper.rb +4 -17
  14. data/app/mailers/foreman_openscap/policy_mailer.rb +2 -2
  15. data/app/models/concerns/foreman_openscap/compliance_status_scoped_search.rb +1 -1
  16. data/app/models/concerns/foreman_openscap/data_stream_content.rb +0 -17
  17. data/app/models/concerns/foreman_openscap/host_extensions.rb +11 -11
  18. data/app/models/concerns/foreman_openscap/hostgroup_extensions.rb +3 -5
  19. data/app/models/concerns/foreman_openscap/inherited_policies.rb +11 -0
  20. data/app/models/concerns/foreman_openscap/oval_facet_host_extensions.rb +38 -0
  21. data/app/models/concerns/foreman_openscap/oval_facet_hostgroup_extensions.rb +15 -0
  22. data/app/models/concerns/foreman_openscap/policy_common.rb +75 -0
  23. data/app/models/concerns/foreman_openscap/scap_file_content.rb +24 -0
  24. data/app/models/foreman_openscap/arf_report.rb +2 -2
  25. data/app/models/foreman_openscap/cve.rb +23 -0
  26. data/app/models/foreman_openscap/host/oval_facet.rb +14 -0
  27. data/app/models/foreman_openscap/host_cve.rb +7 -0
  28. data/app/models/foreman_openscap/hostgroup/oval_facet.rb +14 -0
  29. data/app/models/foreman_openscap/hostgroup_oval_facet_oval_policy.rb +6 -0
  30. data/app/models/foreman_openscap/oval_content.rb +26 -0
  31. data/app/models/foreman_openscap/oval_facet_oval_policy.rb +6 -0
  32. data/app/models/foreman_openscap/oval_policy.rb +54 -0
  33. data/app/models/foreman_openscap/oval_status.rb +45 -0
  34. data/app/models/foreman_openscap/policy.rb +10 -73
  35. data/app/models/foreman_openscap/scap_content.rb +1 -0
  36. data/app/models/foreman_openscap/tailoring_file.rb +1 -0
  37. data/app/services/foreman_openscap/client_config/ansible.rb +39 -6
  38. data/app/services/foreman_openscap/client_config/base.rb +5 -1
  39. data/app/services/foreman_openscap/client_config/puppet.rb +2 -1
  40. data/app/services/foreman_openscap/config_name_service.rb +1 -1
  41. data/app/services/foreman_openscap/hostgroup_overrider.rb +2 -24
  42. data/app/services/foreman_openscap/hostgroup_overrider_common.rb +28 -0
  43. data/app/services/foreman_openscap/lookup_key_overrider.rb +30 -62
  44. data/app/services/foreman_openscap/lookup_key_overrides_common.rb +63 -0
  45. data/app/services/foreman_openscap/oval/check_collection.rb +45 -0
  46. data/app/services/foreman_openscap/oval/configure.rb +80 -0
  47. data/app/services/foreman_openscap/oval/cves.rb +41 -0
  48. data/app/services/foreman_openscap/oval/setup.rb +93 -0
  49. data/app/services/foreman_openscap/oval/setup_check.rb +55 -0
  50. data/app/services/foreman_openscap/oval/sync_oval_contents.rb +42 -0
  51. data/app/views/api/v2/compliance/oval_contents/base.json.rabl +6 -0
  52. data/app/views/api/v2/compliance/oval_contents/create.json.rabl +3 -0
  53. data/app/views/api/v2/compliance/oval_contents/index.json.rabl +3 -0
  54. data/app/views/api/v2/compliance/oval_contents/show.json.rabl +3 -0
  55. data/app/views/api/v2/compliance/oval_contents/sync.json.rabl +3 -0
  56. data/app/views/api/v2/compliance/oval_contents/sync_result.json.rabl +11 -0
  57. data/app/views/api/v2/compliance/oval_contents/update.json.rabl +3 -0
  58. data/app/views/api/v2/compliance/oval_policies/create.json.rabl +3 -0
  59. data/app/views/api/v2/compliance/oval_policies/index.json.rabl +3 -0
  60. data/app/views/api/v2/compliance/oval_policies/main.json.rabl +15 -0
  61. data/app/views/api/v2/compliance/oval_policies/show.json.rabl +3 -0
  62. data/app/views/api/v2/compliance/policies/base.json.rabl +2 -2
  63. data/app/views/api/v2/compliance/policies_common/_attrs.json.rabl +2 -0
  64. data/app/views/arf_reports/_output.html.erb +9 -1
  65. data/app/views/arf_reports/show.html.erb +1 -1
  66. data/app/views/arf_reports/show_html.html.erb +1 -0
  67. data/app/views/compliance_hosts/show.html.erb +1 -8
  68. data/app/views/job_templates/run_oval_scans.erb +24 -0
  69. data/app/views/policies/edit.html.erb +3 -2
  70. data/app/views/policies/show.html.erb +3 -1
  71. data/app/views/policies/steps/_deployment_options_form.html.erb +2 -2
  72. data/app/views/scap_contents/edit.html.erb +2 -12
  73. data/app/views/tailoring_files/edit.html.erb +2 -10
  74. data/config/initializers/inflections.rb +12 -0
  75. data/config/routes.rb +19 -0
  76. data/db/migrate/20201019074925_create_oval_policy.rb +13 -0
  77. data/db/migrate/20201020113801_create_oval_facet.rb +14 -0
  78. data/db/migrate/20201021084109_create_hostgroup_oval_facet.rb +14 -0
  79. data/db/migrate/20201106080924_create_oval_content.rb +12 -0
  80. data/db/migrate/20201116110256_add_oval_content_to_oval_policy.rb +5 -0
  81. data/db/migrate/20201120080329_create_cves.rb +13 -0
  82. data/db/migrate/20201202110213_update_puppet_port_param_type.rb +2 -6
  83. data/db/migrate/20201217130800_add_has_errata_to_cve.rb +8 -0
  84. data/db/migrate/20201217161511_add_url_to_oval_content.rb +5 -0
  85. data/db/migrate/20210409095625_add_oval_policy_reference_to_cve.rb +7 -0
  86. data/db/seeds.d/75-job_templates.rb +3 -2
  87. data/lib/foreman_openscap/bulk_upload.rb +2 -2
  88. data/lib/foreman_openscap/engine.rb +67 -9
  89. data/lib/foreman_openscap/version.rb +1 -1
  90. data/lib/tasks/foreman_openscap_tasks.rake +14 -9
  91. data/locale/de/LC_MESSAGES/foreman_openscap.mo +0 -0
  92. data/locale/de/foreman_openscap.edit.po +0 -0
  93. data/locale/de/foreman_openscap.po +215 -17
  94. data/locale/en_GB/LC_MESSAGES/foreman_openscap.mo +0 -0
  95. data/locale/en_GB/foreman_openscap.edit.po +0 -0
  96. data/locale/en_GB/foreman_openscap.po +213 -15
  97. data/locale/es/LC_MESSAGES/foreman_openscap.mo +0 -0
  98. data/locale/es/foreman_openscap.edit.po +0 -0
  99. data/locale/es/foreman_openscap.po +239 -41
  100. data/locale/foreman_openscap.pot +395 -112
  101. data/locale/fr/LC_MESSAGES/foreman_openscap.mo +0 -0
  102. data/locale/fr/foreman_openscap.edit.po +0 -0
  103. data/locale/fr/foreman_openscap.po +243 -45
  104. data/locale/gl/LC_MESSAGES/foreman_openscap.mo +0 -0
  105. data/locale/gl/foreman_openscap.edit.po +0 -0
  106. data/locale/gl/foreman_openscap.po +213 -15
  107. data/locale/it/LC_MESSAGES/foreman_openscap.mo +0 -0
  108. data/locale/it/foreman_openscap.edit.po +0 -0
  109. data/locale/it/foreman_openscap.po +213 -15
  110. data/locale/ja/LC_MESSAGES/foreman_openscap.mo +0 -0
  111. data/locale/ja/foreman_openscap.edit.po +0 -0
  112. data/locale/ja/foreman_openscap.po +262 -66
  113. data/locale/ko/LC_MESSAGES/foreman_openscap.mo +0 -0
  114. data/locale/ko/foreman_openscap.edit.po +0 -0
  115. data/locale/ko/foreman_openscap.po +214 -16
  116. data/locale/pt_BR/LC_MESSAGES/foreman_openscap.mo +0 -0
  117. data/locale/pt_BR/foreman_openscap.edit.po +0 -0
  118. data/locale/pt_BR/foreman_openscap.po +252 -54
  119. data/locale/ru/LC_MESSAGES/foreman_openscap.mo +0 -0
  120. data/locale/ru/foreman_openscap.edit.po +0 -0
  121. data/locale/ru/foreman_openscap.po +214 -16
  122. data/locale/sv_SE/LC_MESSAGES/foreman_openscap.mo +0 -0
  123. data/locale/sv_SE/foreman_openscap.edit.po +0 -0
  124. data/locale/sv_SE/foreman_openscap.po +213 -15
  125. data/locale/zh_CN/LC_MESSAGES/foreman_openscap.mo +0 -0
  126. data/locale/zh_CN/foreman_openscap.edit.po +0 -0
  127. data/locale/zh_CN/foreman_openscap.po +369 -169
  128. data/locale/zh_TW/LC_MESSAGES/foreman_openscap.mo +0 -0
  129. data/locale/zh_TW/foreman_openscap.edit.po +0 -0
  130. data/locale/zh_TW/foreman_openscap.po +214 -16
  131. data/package.json +48 -0
  132. data/test/factories/compliance_host_factory.rb +12 -0
  133. data/test/factories/oval_content_factory.rb +7 -0
  134. data/test/factories/oval_policy_factory.rb +9 -0
  135. data/test/files/oval_contents/ansible-2.9.oval.xml.bz2 +0 -0
  136. data/test/fixtures/cve_fixtures.rb +104 -0
  137. data/test/functional/api/v2/compliance/oval_contents_controller_test.rb +39 -0
  138. data/test/functional/api/v2/compliance/oval_policies_controller_test.rb +141 -0
  139. data/test/functional/api/v2/compliance/oval_reports_controller_test.rb +32 -0
  140. data/test/graphql/queries/oval_contents_query_test.rb +35 -0
  141. data/test/graphql/queries/oval_policies_query_test.rb +35 -0
  142. data/test/test_plugin_helper.rb +4 -0
  143. data/test/unit/oval_host_test.rb +45 -0
  144. data/test/unit/oval_policy_test.rb +133 -0
  145. data/test/unit/oval_status_test.rb +47 -0
  146. data/test/unit/services/oval/cves_test.rb +81 -0
  147. data/test/unit/services/oval/setup_test.rb +87 -0
  148. data/webpack/components/EmptyState.js +67 -0
  149. data/webpack/components/IndexLayout.js +35 -0
  150. data/webpack/components/IndexLayout.scss +3 -0
  151. data/webpack/components/IndexTable/IndexTableHelper.js +9 -0
  152. data/webpack/components/IndexTable/index.js +65 -0
  153. data/webpack/components/RuleSeverity/RuleSeverity.scss +3 -0
  154. data/webpack/components/RuleSeverity/RuleSeverity.test.js +13 -0
  155. data/webpack/components/RuleSeverity/__snapshots__/RuleSeverity.test.js.snap +41 -0
  156. data/webpack/components/RuleSeverity/i_severity-critical.svg +61 -0
  157. data/webpack/components/RuleSeverity/i_severity-high.svg +61 -0
  158. data/webpack/components/RuleSeverity/i_severity-low.svg +62 -0
  159. data/webpack/components/RuleSeverity/i_severity-med.svg +62 -0
  160. data/webpack/components/RuleSeverity/i_unknown.svg +33 -0
  161. data/webpack/components/RuleSeverity/index.js +33 -0
  162. data/webpack/components/withLoading.js +68 -0
  163. data/webpack/global_index.js +5 -0
  164. data/webpack/graphql/queries/cves.gql +18 -0
  165. data/webpack/graphql/queries/ovalContents.gql +11 -0
  166. data/webpack/graphql/queries/ovalPolicies.gql +12 -0
  167. data/webpack/graphql/queries/ovalPolicy.gql +21 -0
  168. data/webpack/helpers/commonHelper.js +1 -0
  169. data/webpack/helpers/globalIdHelper.js +13 -0
  170. data/webpack/helpers/pageParamsHelper.js +31 -0
  171. data/webpack/helpers/pathsHelper.js +22 -0
  172. data/webpack/helpers/tableHelper.js +9 -0
  173. data/webpack/index.js +8 -0
  174. data/webpack/routes/OvalContents/OvalContentsIndex/OvalContentsIndex.js +45 -0
  175. data/webpack/routes/OvalContents/OvalContentsIndex/OvalContentsTable.js +38 -0
  176. data/webpack/routes/OvalContents/OvalContentsIndex/__tests__/OvalContentsIndex.fixtures.js +106 -0
  177. data/webpack/routes/OvalContents/OvalContentsIndex/__tests__/OvalContentsIndex.test.js +75 -0
  178. data/webpack/routes/OvalContents/OvalContentsIndex/index.js +7 -0
  179. data/webpack/routes/OvalPolicies/OvalPoliciesIndex/OvalPoliciesIndex.js +46 -0
  180. data/webpack/routes/OvalPolicies/OvalPoliciesIndex/OvalPoliciesTable.js +44 -0
  181. data/webpack/routes/OvalPolicies/OvalPoliciesIndex/__tests__/OvalPoliciesIndex.fixtures.js +61 -0
  182. data/webpack/routes/OvalPolicies/OvalPoliciesIndex/__tests__/OvalPoliciesIndex.test.js +78 -0
  183. data/webpack/routes/OvalPolicies/OvalPoliciesIndex/index.js +7 -0
  184. data/webpack/routes/OvalPolicies/OvalPoliciesShow/CvesTab.js +48 -0
  185. data/webpack/routes/OvalPolicies/OvalPoliciesShow/CvesTable.js +63 -0
  186. data/webpack/routes/OvalPolicies/OvalPoliciesShow/OvalPoliciesShow.js +78 -0
  187. data/webpack/routes/OvalPolicies/OvalPoliciesShow/OvalPoliciesShowHelper.js +39 -0
  188. data/webpack/routes/OvalPolicies/OvalPoliciesShow/__tests__/OvalPoliciesShow.fixtures.js +78 -0
  189. data/webpack/routes/OvalPolicies/OvalPoliciesShow/__tests__/OvalPoliciesShow.test.js +112 -0
  190. data/webpack/routes/OvalPolicies/OvalPoliciesShow/index.js +35 -0
  191. data/webpack/routes/routes.js +28 -0
  192. data/webpack/testHelper.js +64 -0
  193. metadata +143 -3
@@ -0,0 +1,3 @@
1
+ object @oval_content
2
+
3
+ extends "api/v2/compliance/oval_contents/base"
@@ -0,0 +1,3 @@
1
+ collection @oval_contents
2
+
3
+ extends "api/v2/compliance/oval_contents/sync_result"
@@ -0,0 +1,11 @@
1
+ object @oval_content
2
+
3
+ attributes :id, :name
4
+
5
+ node(:errors) do |content|
6
+ content.errors.to_hash
7
+ end
8
+
9
+ node(:full_messages) do |content|
10
+ content.errors.full_messages
11
+ end
@@ -0,0 +1,3 @@
1
+ object @oval_content
2
+
3
+ extends "api/v2/compliance/oval_contents/base"
@@ -0,0 +1,3 @@
1
+ object @oval_policy
2
+
3
+ extends "api/v2/compliance/oval_policies/main"
@@ -0,0 +1,3 @@
1
+ collection @oval_policies
2
+
3
+ extends "api/v2/compliance/oval_policies/main"
@@ -0,0 +1,15 @@
1
+ object @oval_policy
2
+
3
+ extends "api/v2/compliance/common/org"
4
+ extends "api/v2/compliance/common/loc"
5
+ extends "api/v2/compliance/policies_common/attrs"
6
+
7
+ attributes :created_at, :updated_at, :oval_content_id
8
+
9
+ child :hosts => :hosts do |host|
10
+ attributes :id, :name
11
+ end
12
+
13
+ child :hostgroups => :hostgroups do |hg|
14
+ attributes :id, :name
15
+ end
@@ -0,0 +1,3 @@
1
+ object @oval_policy
2
+
3
+ extends "api/v2/compliance/oval_policies/main"
@@ -2,6 +2,6 @@ object @policy
2
2
 
3
3
  extends "api/v2/compliance/common/org"
4
4
  extends "api/v2/compliance/common/loc"
5
+ extends "api/v2/compliance/policies_common/attrs"
5
6
 
6
- attributes :id, :name, :period, :weekday, :description, :scap_content_id, :scap_content_profile_id, :day_of_month, :cron_line,
7
- :tailoring_file_id, :tailoring_file_profile_id, :deploy_by
7
+ attributes :scap_content_id, :scap_content_profile_id, :tailoring_file_id, :tailoring_file_profile_id, :deploy_by
@@ -0,0 +1,2 @@
1
+ attributes :id, :name, :period, :weekday, :description, :day_of_month, :cron_line
2
+
@@ -1,3 +1,11 @@
1
+ <% content_for(:javascripts) do %>
2
+ <%= webpacked_plugins_js_for :foreman_openscap %>
3
+ <% end %>
4
+ <% content_for(:stylesheets) do %>
5
+ <%= webpacked_plugins_css_for :foreman_openscap %>
6
+ <% end %>
7
+
8
+
1
9
  <table id='report_log' class="<%= table_css_classes %>">
2
10
  <thead>
3
11
  <tr>
@@ -16,7 +24,7 @@
16
24
  <%= render :partial => 'detailed_message', :locals => { :message => log.message } %>
17
25
  </td>
18
26
  <td><%= log.source %></td>
19
- <td><span <%= severity_tag log.message.severity %>><%= h log.message.severity %></span></td>
27
+ <td><%= react_component 'RuleSeverity', { :severity => log.message.severity.downcase } %></td>
20
28
  <td><%= host_search_by_rule_result_buttons(log.source) %></td>
21
29
  </tr>
22
30
  <% end %>
@@ -2,7 +2,7 @@
2
2
  <% javascript 'foreman_openscap/reports' %>
3
3
  <% stylesheet 'foreman_openscap/reports' %>
4
4
 
5
- <% title "#{@arf_report.host}" %>
5
+ <% title @arf_report.host.to_s %>
6
6
  <%= arf_report_breadcrumbs %>
7
7
 
8
8
  <p class='ra'><%= reported_info @arf_report %></p>
@@ -1,5 +1,6 @@
1
1
  <%= javascript 'foreman_openscap/load_report'%>
2
2
 
3
+ <% title @arf_report.host.to_s %>
3
4
  <%= arf_report_breadcrumbs %>
4
5
 
5
6
  <div class="row">
@@ -3,14 +3,7 @@
3
3
 
4
4
  <%= breadcrumbs(:resource_url => api_hosts_path,
5
5
  :resource_filter => "is_compliance_host = true",
6
- :name_field => 'name',
7
- :switchable => true,
8
- :items => [
9
- { :caption => _('Compliance Hosts'),
10
- :url => url_for(hosts_path(:search => "is_compliance_host = true")) },
11
- { :caption => ((N_("%s compliance reports by policy") % @host.to_label)),
12
- :url => (host_path(@host) if authorized_for(hash_for_host_path(@host))) }
13
- ])
6
+ :name_field => 'name')
14
7
  %>
15
8
  <% title n_("%s compliance report by policy", "%s compliance reports by policy" , @host.combined_policies.length) % @host.to_label %>
16
9
  <% @host.combined_policies.each do |policy| %>
@@ -0,0 +1,24 @@
1
+ <%#
2
+ name: Run OVAL scans
3
+ job_category: OpenSCAP
4
+ description_format: Run scan for specified OVAL Policies
5
+ feature: foreman_openscap_run_oval_scans
6
+ provider_type: SSH
7
+ snippet: false
8
+ provider_type: SSH
9
+ kind: job_template
10
+ template_inputs:
11
+ - name: oval_policies
12
+ description: Comma separated OVAL Policy Ids to run
13
+ input_type: user
14
+ advanced: true
15
+ -%>
16
+ <% unless input('oval_policies').blank? -%>
17
+ <% input('oval_policies').split(',').map do |id| -%>
18
+ /usr/bin/foreman_scap_client oval <%= id %>
19
+ <% end -%>
20
+ <% else -%>
21
+ <% @host.oval_policies_enc_raw.map do |policy| -%>
22
+ /usr/bin/foreman_scap_client oval <%= policy['id'] %>
23
+ <% end -%>
24
+ <% end -%>
@@ -1,4 +1,5 @@
1
- <% title _("Edit Compliance Policy") %>
2
- <%= policy_breadcrumbs %>
1
+ <% title _("Edit %s") % @policy.name %>
2
+ <%= breadcrumbs(:resource_url => api_compliance_policies_path,
3
+ :name_field => 'name') %>
3
4
 
4
5
  <%= render :partial => "form" %>
@@ -1,4 +1,6 @@
1
- <%= policy_breadcrumbs %>
1
+ <% title _("Details for Compliance Policy %s") % @policy.name %>
2
+ <%= breadcrumbs(:resource_url => api_compliance_policies_path,
3
+ :name_field => 'name') %>
2
4
 
3
5
  <div class="row">
4
6
  <iframe style="min-height: 800px" height="100%" width="100%" frameborder="0" src="<%= parse_policy_path(@policy) %>"></iframe>
@@ -3,8 +3,8 @@
3
3
 
4
4
  <div class="alert alert-info" id="scap-deployment-options-info-banner">
5
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') %>.
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
8
  </div>
9
9
 
10
10
  <%= deploy_by_radios f, @policy %>
@@ -1,15 +1,5 @@
1
- <% title _("Edit SCAP Content") %>
1
+ <% title _("Edit %s") % @scap_content.title %>
2
2
  <%= breadcrumbs(:resource_url => api_compliance_scap_contents_path,
3
- :name_field => 'title',
4
- :items => [
5
- { :caption => _('Scap Contents'),
6
- :url => url_for(scap_contents_path)
7
- },
8
- { :caption => @scap_content.title,
9
- :url => (edit_scap_content_path(@scap_content) if authorized_for(hash_for_edit_scap_content_path(@scap_content)))
10
- }
11
- ]
12
- ) if @scap_content %>
13
-
3
+ :name_field => 'title') %>
14
4
 
15
5
  <%= render :partial => 'form' %>
@@ -1,13 +1,5 @@
1
- <% title _("Edit Tailoring File") %>
1
+ <% title _("Edit %s") % @tailoring_file.name %>
2
2
  <%= breadcrumbs(:resource_url => api_compliance_tailoring_files_path,
3
- :items => [
4
- { :caption => _('Tailoring Files'),
5
- :url => url_for(tailoring_files_path)
6
- },
7
- { :caption => @tailoring_file.name,
8
- :url => (edit_tailoring_file_path(@tailoring_file) if authorized_for(hash_for_edit_tailoring_file_path(@tailoring_file)))
9
- }
10
- ]
11
- ) if @tailoring_file %>
3
+ :name_field => 'name') %>
12
4
 
13
5
  <%= render :partial => 'form' %>
@@ -0,0 +1,12 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Add new inflection rules using the following format
4
+ # (all these examples are active by default):
5
+ ActiveSupport::Inflector.inflections do |inflect|
6
+ # inflect.plural /^(ox)$/i, '\1en'
7
+ # inflect.singular /^(ox)en/i, '\1'
8
+ # inflect.irregular 'person', 'people'
9
+ # inflect.uncountable %w(fish sheep)
10
+
11
+ inflect.singular 'cves', 'cve'
12
+ end
data/config/routes.rb CHANGED
@@ -1,4 +1,7 @@
1
1
  Rails.application.routes.draw do
2
+ match '/experimental/compliance' => 'react#index', :via => [:get]
3
+ match '/experimental/compliance/*page' => 'react#index', :via => [:get]
4
+
2
5
  scope '/compliance' do
3
6
  resources :arf_reports, :only => %i[index show destroy] do
4
7
  member do
@@ -87,8 +90,24 @@ Rails.application.routes.draw do
87
90
  get 'download_html'
88
91
  end
89
92
  end
93
+
90
94
  post 'arf_reports/:cname/:policy_id/:date', \
91
95
  :constraints => { :cname => /[^\/]+/ }, :to => 'arf_reports#create'
96
+
97
+ resources :oval_contents, :except => %i[new edit] do
98
+ collection do
99
+ post 'sync'
100
+ end
101
+ end
102
+
103
+ resources :oval_policies, :except => %i[new edit] do
104
+ member do
105
+ post 'assign_hostgroups'
106
+ post 'assign_hosts'
107
+ get 'oval_content'
108
+ end
109
+ end
110
+ post 'oval_reports/:cname/:oval_policy_id/:date', :constraints => { :cname => /[^\/]+/ }, :to => 'oval_reports#create'
92
111
  end
93
112
  end
94
113
  end
@@ -0,0 +1,13 @@
1
+ class CreateOvalPolicy < ActiveRecord::Migration[6.0]
2
+ def change
3
+ create_table :foreman_openscap_oval_policies do |t|
4
+ t.string :name, unique: true
5
+ t.string :description
6
+ t.string :period
7
+ t.string :weekday
8
+ t.integer :day_of_month
9
+ t.string :cron_line
10
+ t.timestamps
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ class CreateOvalFacet < ActiveRecord::Migration[6.0]
2
+ def change
3
+ create_table :foreman_openscap_oval_facets do |t|
4
+ t.references 'host', :null => false
5
+ end
6
+
7
+ add_index :foreman_openscap_oval_facets, [:host_id], :unique => true, :name => :foreman_openscap_oval_facets_host_id
8
+
9
+ create_table :foreman_openscap_oval_facet_oval_policies do |t|
10
+ t.references 'oval_policy', :null => false, :index => { :name => 'index_oval_facet_oval_policies_on_oval_policy_id'}
11
+ t.references 'oval_facet', :null => false, :index => { :name => 'index_oval_facet_oval_policies_on_oval_facet_id'}
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ class CreateHostgroupOvalFacet < ActiveRecord::Migration[6.0]
2
+ def change
3
+ create_table :foreman_openscap_hostgroup_oval_facets do |t|
4
+ t.references 'hostgroup', :null => false
5
+ end
6
+
7
+ add_index :foreman_openscap_hostgroup_oval_facets, [:hostgroup_id], :unique => true, :name => :foreman_openscap_hostgroup_oval_facets_hostgroup_id
8
+
9
+ create_table :foreman_openscap_hostgroup_oval_facet_oval_policies do |t|
10
+ t.references 'oval_policy', :null => false, :index => { :name => 'index_hg_oval_facet_oval_policies_on_oval_policy_id'}
11
+ t.references 'oval_facet', :null => false, :index => { :name => 'index_hg_oval_facet_oval_policies_on_hg_oval_facet_id'}
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,12 @@
1
+ class CreateOvalContent < ActiveRecord::Migration[6.0]
2
+ def change
3
+ create_table :foreman_openscap_oval_contents do |t|
4
+ t.string :name, null: false
5
+ t.string :digest
6
+ t.string :original_filename
7
+ t.binary :scap_file
8
+ end
9
+
10
+ add_index :foreman_openscap_oval_contents, :name, :unique => true
11
+ end
12
+ end
@@ -0,0 +1,5 @@
1
+ class AddOvalContentToOvalPolicy < ActiveRecord::Migration[6.0]
2
+ def change
3
+ add_column :foreman_openscap_oval_policies, :oval_content_id, :integer, :references => :oval_content
4
+ end
5
+ end
@@ -0,0 +1,13 @@
1
+ class CreateCves < ActiveRecord::Migration[6.0]
2
+ def change
3
+ create_table :foreman_openscap_cves do |t|
4
+ t.string :ref_id, :null => false, :unique => true
5
+ t.string :ref_url, :null => false, :unique => true
6
+ end
7
+
8
+ create_table :foreman_openscap_host_cves do |t|
9
+ t.references :host, :null => false
10
+ t.references :cve, :null => false
11
+ end
12
+ end
13
+ end
@@ -14,15 +14,11 @@ class UpdatePuppetPortParamType < ActiveRecord::Migration[6.0]
14
14
  return unless puppet_class
15
15
  port_key = puppet_class.class_params.find_by :key => 'port'
16
16
  return unless port_key
17
- def_value = port_key.default_value
18
17
 
19
18
  if method == :to_i
20
- port_key.key_type = "integer"
21
- port_key.default_value = def_value.to_i
19
+ port_key.update_columns(:key_type => "integer", :default_value => port_key.default_value.to_i)
22
20
  else
23
- port_key.key_type == "string"
24
- port_key.default_value = port_key.default_value.to_s
21
+ port_key.update_columns(:key_type => "string", :default_value => port_key.default_value.to_s)
25
22
  end
26
- port_key.save!
27
23
  end
28
24
  end
@@ -0,0 +1,8 @@
1
+ class AddHasErrataToCve < ActiveRecord::Migration[6.0]
2
+ def change
3
+ add_column :foreman_openscap_cves, :has_errata, :boolean
4
+ add_column :foreman_openscap_cves, :definition_id, :string, :null => false
5
+ change_column :foreman_openscap_cves, :ref_id, :string, :null => false
6
+ change_column :foreman_openscap_cves, :ref_url, :string, :null => false
7
+ end
8
+ end
@@ -0,0 +1,5 @@
1
+ class AddUrlToOvalContent < ActiveRecord::Migration[6.0]
2
+ def change
3
+ add_column :foreman_openscap_oval_contents, :url, :string
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ class AddOvalPolicyReferenceToCve < ActiveRecord::Migration[6.0]
2
+ def change
3
+ add_column :foreman_openscap_host_cves, :oval_policy_id, :integer, :references => :oval_policy
4
+
5
+ add_index :foreman_openscap_host_cves, [:host_id, :oval_policy_id, :cve_id], :unique => true, :name => :index_oval_policy_host_cve_id_on_host_cve
6
+ end
7
+ end
@@ -11,8 +11,9 @@ if ForemanOpenscap.with_remote_execution?
11
11
  else
12
12
  template = JobTemplate.import!(File.read(template), :default => true, :lock => true, :update => sync)
13
13
  end
14
- template.organizations = organizations if SETTINGS[:organizations_enabled] && template.present?
15
- template.locations = locations if SETTINGS[:locations_enabled] && template.present?
14
+ next unless template.present?
15
+ template.organizations = organizations
16
+ template.locations = locations
16
17
  end
17
18
  end
18
19
  end
@@ -49,8 +49,8 @@ module ForemanOpenscap
49
49
  next if scap_content.persisted?
50
50
  scap_content.scap_file = file
51
51
  scap_content.original_filename = filename
52
- scap_content.location_ids = Location.all.map(&:id)
53
- scap_content.organization_ids = Organization.all.map(&:id)
52
+ scap_content.location_ids = Location.all.pluck(:id)
53
+ scap_content.organization_ids = Organization.all.pluck(:id)
54
54
 
55
55
  if scap_content.save
56
56
  @result.results.push(scap_content)
@@ -9,6 +9,7 @@ module ForemanOpenscap
9
9
  config.autoload_paths += Dir["#{config.root}/app/helpers/concerns"]
10
10
  config.autoload_paths += Dir["#{config.root}/app/models/concerns"]
11
11
  config.autoload_paths += Dir["#{config.root}/app/models"]
12
+ config.autoload_paths += Dir["#{config.root}/app/graphql"]
12
13
  config.autoload_paths += Dir["#{config.root}/app/lib"]
13
14
  config.autoload_paths += Dir["#{config.root}/app/services"]
14
15
  config.autoload_paths += Dir["#{config.root}/lib"]
@@ -41,8 +42,8 @@ module ForemanOpenscap
41
42
  Apipie.configuration.checksum_path += ['/compliance/']
42
43
  end
43
44
 
44
- initializer 'foreman_openscap.filter_report_body' do |app|
45
- app.config.filter_parameters << :logs if app.config.filter_parameters
45
+ initializer 'foreman_openscap.filter_large_params' do |app|
46
+ app.config.filter_parameters += %i[logs scap_file oval_results] if app.config.filter_parameters
46
47
  end
47
48
 
48
49
  initializer 'foreman_openscap.register_plugin', :before => :finisher_hook do |app|
@@ -52,6 +53,7 @@ module ForemanOpenscap
52
53
  apipie_documented_controllers ["#{ForemanOpenscap::Engine.root}/app/controllers/api/v2/compliance/*.rb"]
53
54
 
54
55
  register_custom_status ForemanOpenscap::ComplianceStatus
56
+ register_custom_status ForemanOpenscap::OvalStatus
55
57
 
56
58
  # Add permissions
57
59
  security_block :foreman_openscap do
@@ -120,6 +122,24 @@ module ForemanOpenscap
120
122
  :resource_type => 'ForemanOpenscap::TailoringFile'
121
123
  permission :view_openscap_proxies, { :openscap_proxies => [:openscap_spool] },
122
124
  :resource_type => 'SmartProxy'
125
+ permission :view_oval_contents, { 'api/v2/compliance/oval_contents' => %i[index show] },
126
+ :resource_type => 'ForemanOpenscap::OvalContent'
127
+ permission :edit_oval_contents, { 'api/v2/compliance/oval_contents' => %i[update sync] },
128
+ :resource_type => 'ForemanOpenscap::OvalContent'
129
+ permission :create_oval_contents, { 'api/v2/compliance/oval_contents' => %i[create] },
130
+ :resource_type => 'ForemanOpenscap::OvalContent'
131
+ permission :destroy_oval_contents, { 'api/v2/compliance/oval_contents' => %i[destroy] },
132
+ :resource_type => 'ForemanOpenscap::OvalContent'
133
+ permission :view_oval_policies, { 'api/v2/compliance/oval_policies' => %i[index show oval_content] },
134
+ :resource_type => 'ForemanOpenscap::OvalPolicy'
135
+ permission :edit_oval_policies, { 'api/v2/compliance/oval_policies' => %i[update assign_hosts assign_hostgroups] },
136
+ :resource_type => 'ForemanOpenscap::OvalPolicy'
137
+ permission :create_oval_policies, { 'api/v2/compliance/oval_policies' => %i[create] },
138
+ :resource_type => 'ForemanOpenscap::OvalPolicy'
139
+ permission :destroy_oval_policies, { 'api/v2/compliance/oval_policies' => %i[destroy] },
140
+ :resource_type => 'ForemanOpenscap::OvalPolicy'
141
+ permission :create_oval_policies, { 'api/v2/compliance/oval_reports' => %i[create] },
142
+ :resource_type => 'ForemanOpenscap::Cve'
123
143
  end
124
144
 
125
145
  role "Compliance viewer", %i[view_arf_reports view_policies view_scap_contents view_tailoring_files view_openscap_proxies],
@@ -148,7 +168,15 @@ module ForemanOpenscap
148
168
  menu :top_menu, :compliance_files, :caption => N_('Tailoring Files'),
149
169
  :url_hash => { :controller => :tailoring_files, :action => :index },
150
170
  :parent => :hosts_menu
171
+ menu :labs_menu, :oval_contents, :caption => N_('OVAL Contents'),
172
+ :url_hash => { :controller => 'react', :action => 'index' },
173
+ :url => '/experimental/compliance/oval_contents',
174
+ :parent => :lab_features_menu
151
175
 
176
+ menu :labs_menu, :oval_policies, :caption => N_('OVAL Policies'),
177
+ :url_hash => { :controller => 'react', :action => 'index' },
178
+ :url => '/experimental/compliance/oval_policies',
179
+ :parent => :lab_features_menu
152
180
  # add dashboard widget
153
181
  widget 'compliance_host_reports_widget',
154
182
  :name => N_('Latest Compliance Reports'), :sizex => 6, :sizey => 1
@@ -169,7 +197,7 @@ module ForemanOpenscap
169
197
 
170
198
  proxy_description = N_('OpenSCAP Proxy to use for fetching SCAP content and uploading ARF reports. Leave blank and override appropriate parameters when using proxy load balancer.')
171
199
 
172
- smart_proxy_for Hostgroup, :openscap_proxy,
200
+ smart_proxy_for ::Hostgroup, :openscap_proxy,
173
201
  :feature => 'Openscap',
174
202
  :label => N_('OpenSCAP Proxy'),
175
203
  :description => proxy_description,
@@ -188,6 +216,30 @@ module ForemanOpenscap
188
216
  base_scope.preload(:policies)
189
217
  end
190
218
 
219
+ register_global_js_file 'global'
220
+
221
+ register_graphql_query_field :oval_contents, '::Types::OvalContent', :collection_field
222
+ register_graphql_query_field :oval_policies, '::Types::OvalPolicy', :collection_field
223
+ register_graphql_query_field :oval_policy, '::Types::OvalPolicy', :record_field
224
+ register_graphql_query_field :cves, '::Types::Cve', :collection_field
225
+
226
+ # move to core
227
+ extend_graphql_type type: ::Types::Hostgroup do
228
+ field :descendants, Types::Hostgroup.connection_type, null: true, resolve: (proc do |object|
229
+ RecordLoader.for(model_class).load_many(object.descendant_ids)
230
+ end)
231
+ end
232
+
233
+ register_facet ForemanOpenscap::Host::OvalFacet, :oval_facet do
234
+ configure_host do
235
+ extend_model ForemanOpenscap::OvalFacetHostExtensions
236
+ end
237
+
238
+ configure_hostgroup(ForemanOpenscap::Hostgroup::OvalFacet) do
239
+ extend_model ForemanOpenscap::OvalFacetHostgroupExtensions
240
+ end
241
+ end
242
+
191
243
  describe_host do
192
244
  multiple_actions_provider :compliance_host_multiple_actions
193
245
  overview_buttons_provider :compliance_host_overview_button
@@ -204,13 +256,13 @@ module ForemanOpenscap
204
256
  # Include concerns in this config.to_prepare block
205
257
  config.to_prepare do
206
258
  ::Api::V2::HostsController.send(:include, ForemanOpenscap::Api::V2::HostsControllerExtensions)
207
- Host::Managed.send(:include, ForemanOpenscap::OpenscapProxyExtensions)
208
- Host::Managed.send(:include, ForemanOpenscap::OpenscapProxyCoreExtensions)
209
- Host::Managed.send(:prepend, ForemanOpenscap::HostExtensions)
259
+ ::Host::Managed.send(:include, ForemanOpenscap::OpenscapProxyExtensions)
260
+ ::Host::Managed.send(:include, ForemanOpenscap::OpenscapProxyCoreExtensions)
261
+ ::Host::Managed.send(:prepend, ForemanOpenscap::HostExtensions)
210
262
  HostsHelper.send(:prepend, ForemanOpenscap::HostsHelperExtensions)
211
- Hostgroup.send(:include, ForemanOpenscap::OpenscapProxyExtensions)
212
- Hostgroup.send(:include, ForemanOpenscap::OpenscapProxyCoreExtensions)
213
- Hostgroup.send(:include, ForemanOpenscap::HostgroupExtensions)
263
+ ::Hostgroup.send(:include, ForemanOpenscap::OpenscapProxyExtensions)
264
+ ::Hostgroup.send(:include, ForemanOpenscap::OpenscapProxyCoreExtensions)
265
+ ::Hostgroup.send(:include, ForemanOpenscap::HostgroupExtensions)
214
266
  SmartProxy.send(:include, ForemanOpenscap::SmartProxyExtensions)
215
267
  HostsController.send(:prepend, ForemanOpenscap::HostsControllerExtensions)
216
268
  HostsController.send(:include, ForemanOpenscap::HostsAndHostgroupsControllerExtensions)
@@ -225,11 +277,17 @@ module ForemanOpenscap
225
277
  :provided_inputs => "policies"
226
278
  }
227
279
 
280
+ oval_options = {
281
+ :description => N_("Run OVAL scan")
282
+ }
283
+
228
284
  if Gem::Version.new(ForemanRemoteExecution::VERSION) >= Gem::Version.new('1.2.3')
229
285
  options[:host_action_button] = true
286
+ oval_options[:host_action_button] = Setting[:lab_features]
230
287
  end
231
288
 
232
289
  RemoteExecutionFeature.register(:foreman_openscap_run_scans, N_("Run OpenSCAP scan"), options)
290
+ RemoteExecutionFeature.register(:foreman_openscap_run_oval_scans, N_("Run OVAL scan"), oval_options)
233
291
  end
234
292
  end
235
293