inspec 1.0.0 → 1.35.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (286) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +933 -101
  3. data/Gemfile +8 -17
  4. data/MAINTAINERS.md +2 -1
  5. data/MAINTAINERS.toml +9 -4
  6. data/README.md +49 -28
  7. data/Rakefile +54 -39
  8. data/bin/inspec +1 -1
  9. data/docs/dsl_inspec.md +17 -4
  10. data/docs/dsl_resource.md +1 -1
  11. data/docs/habitat.md +192 -0
  12. data/docs/inspec_and_friends.md +4 -2
  13. data/docs/matchers.md +11 -0
  14. data/docs/migration.md +293 -0
  15. data/docs/profiles.md +124 -76
  16. data/docs/resources/aide_conf.md.erb +81 -0
  17. data/docs/resources/apache_conf.md.erb +10 -10
  18. data/docs/resources/apt.md.erb +13 -13
  19. data/docs/resources/audit_policy.md.erb +10 -10
  20. data/docs/resources/auditd_conf.md.erb +10 -10
  21. data/docs/resources/auditd_rules.md.erb +11 -11
  22. data/docs/resources/bash.md.erb +12 -12
  23. data/docs/resources/bond.md.erb +15 -15
  24. data/docs/resources/bridge.md.erb +11 -11
  25. data/docs/resources/bsd_service.md.erb +11 -11
  26. data/docs/resources/command.md.erb +23 -23
  27. data/docs/resources/crontab.md.erb +84 -0
  28. data/docs/resources/csv.md.erb +10 -10
  29. data/docs/resources/dh_params.md +191 -0
  30. data/docs/resources/directory.md.erb +8 -8
  31. data/docs/resources/docker.md.erb +160 -0
  32. data/docs/resources/docker_container.md.erb +89 -0
  33. data/docs/resources/docker_image.md.erb +86 -0
  34. data/docs/resources/etc_group.md.erb +16 -16
  35. data/docs/resources/etc_hosts.md.erb +62 -0
  36. data/docs/resources/file.md.erb +80 -58
  37. data/docs/resources/gem.md.erb +32 -13
  38. data/docs/resources/group.md.erb +12 -12
  39. data/docs/resources/grub_conf.md.erb +11 -11
  40. data/docs/resources/host.md.erb +27 -18
  41. data/docs/resources/http.md.erb +104 -0
  42. data/docs/resources/iis_app.md.erb +126 -0
  43. data/docs/resources/iis_site.md.erb +17 -17
  44. data/docs/resources/inetd_conf.md.erb +10 -10
  45. data/docs/resources/ini.md.erb +9 -9
  46. data/docs/resources/interface.md.erb +13 -13
  47. data/docs/resources/iptables.md.erb +21 -14
  48. data/docs/resources/json.md.erb +11 -11
  49. data/docs/resources/kernel_module.md.erb +73 -12
  50. data/docs/resources/kernel_parameter.md.erb +12 -12
  51. data/docs/resources/key_rsa.md.erb +70 -0
  52. data/docs/resources/launchd_service.md.erb +11 -11
  53. data/docs/resources/limits_conf.md.erb +10 -10
  54. data/docs/resources/login_def.md.erb +12 -12
  55. data/docs/resources/mount.md.erb +14 -14
  56. data/docs/resources/mssql_session.md.erb +62 -0
  57. data/docs/resources/mysql_conf.md.erb +14 -14
  58. data/docs/resources/mysql_session.md.erb +22 -10
  59. data/docs/resources/npm.md.erb +13 -13
  60. data/docs/resources/ntp_conf.md.erb +9 -9
  61. data/docs/resources/oneget.md.erb +11 -11
  62. data/docs/resources/oracledb_session.md.erb +53 -0
  63. data/docs/resources/os.md.erb +17 -17
  64. data/docs/resources/os_env.md.erb +12 -12
  65. data/docs/resources/package.md.erb +29 -16
  66. data/docs/resources/parse_config.md.erb +18 -18
  67. data/docs/resources/parse_config_file.md.erb +29 -23
  68. data/docs/resources/{etc_passwd.md.erb → passwd.md.erb} +17 -17
  69. data/docs/resources/pip.md.erb +15 -15
  70. data/docs/resources/port.md.erb +23 -23
  71. data/docs/resources/postgres_conf.md.erb +15 -13
  72. data/docs/resources/postgres_hba_conf.md.erb +104 -0
  73. data/docs/resources/postgres_ident_conf.md.erb +87 -0
  74. data/docs/resources/postgres_session.md.erb +28 -21
  75. data/docs/resources/powershell.md.erb +14 -14
  76. data/docs/resources/processes.md.erb +123 -0
  77. data/docs/resources/rabbitmq_config.md.erb +55 -0
  78. data/docs/resources/registry_key.md.erb +44 -21
  79. data/docs/resources/runit_service.md.erb +11 -11
  80. data/docs/resources/security_policy.md.erb +10 -10
  81. data/docs/resources/service.md.erb +18 -18
  82. data/docs/resources/{etc_shadow.md.erb → shadow.md.erb} +19 -19
  83. data/docs/resources/ssh_config.md.erb +13 -13
  84. data/docs/resources/sshd_config.md.erb +15 -15
  85. data/docs/resources/ssl.md.erb +13 -13
  86. data/docs/resources/sys_info.md.erb +10 -10
  87. data/docs/resources/systemd_service.md.erb +11 -11
  88. data/docs/resources/sysv_service.md.erb +11 -11
  89. data/docs/resources/upstart_service.md.erb +11 -11
  90. data/docs/resources/user.md.erb +20 -20
  91. data/docs/resources/users.md.erb +19 -19
  92. data/docs/resources/vbscript.md.erb +13 -13
  93. data/docs/resources/virtualization.md.erb +71 -0
  94. data/docs/resources/windows_feature.md.erb +10 -10
  95. data/docs/resources/windows_task.md.erb +103 -0
  96. data/docs/resources/wmi.md.erb +10 -10
  97. data/docs/resources/x509_certificate.md.erb +146 -0
  98. data/docs/resources/xinetd_conf.md.erb +17 -17
  99. data/docs/resources/xml.md.erb +75 -0
  100. data/docs/resources/yaml.md.erb +25 -11
  101. data/docs/resources/yum.md.erb +24 -16
  102. data/docs/resources/zfs_dataset.md.erb +63 -0
  103. data/docs/resources/zfs_pool.md.erb +57 -0
  104. data/docs/ruby_usage.md +50 -0
  105. data/docs/shared/matcher_cmp.md.erb +4 -6
  106. data/examples/inheritance/README.md +49 -3
  107. data/examples/inheritance/controls/example.rb +4 -1
  108. data/examples/inheritance/inspec.yml +3 -1
  109. data/examples/meta-profile/README.md +29 -3
  110. data/examples/meta-profile/controls/example.rb +10 -5
  111. data/examples/meta-profile/inspec.yml +4 -8
  112. data/examples/profile/README.md +1 -1
  113. data/examples/profile/controls/example.rb +0 -1
  114. data/examples/profile/controls/gordon.rb +0 -1
  115. data/examples/profile/inspec.yml +1 -1
  116. data/examples/profile-attribute/inspec.yml +1 -1
  117. data/examples/profile-sensitive/README.md +29 -0
  118. data/examples/profile-sensitive/controls/sensitive-failures.rb +9 -0
  119. data/examples/profile-sensitive/controls/sensitive.rb +9 -0
  120. data/examples/profile-sensitive/inspec.yml +8 -0
  121. data/inspec.gemspec +10 -2
  122. data/lib/bundles/inspec-artifact/README.md +1 -0
  123. data/lib/bundles/inspec-artifact/cli.rb +284 -0
  124. data/lib/bundles/inspec-artifact.rb +7 -0
  125. data/lib/bundles/inspec-compliance/README.md +44 -15
  126. data/lib/bundles/inspec-compliance/api.rb +135 -29
  127. data/lib/bundles/inspec-compliance/cli.rb +128 -21
  128. data/lib/bundles/inspec-compliance/configuration.rb +8 -0
  129. data/lib/bundles/inspec-compliance/http.rb +26 -19
  130. data/lib/bundles/inspec-compliance/target.rb +50 -25
  131. data/lib/bundles/inspec-habitat/cli.rb +31 -0
  132. data/lib/bundles/inspec-habitat/log.rb +10 -0
  133. data/lib/bundles/inspec-habitat/profile.rb +372 -0
  134. data/lib/bundles/inspec-habitat.rb +12 -0
  135. data/lib/bundles/inspec-init/templates/profile/controls/example.rb +0 -1
  136. data/lib/bundles/inspec-init/templates/profile/inspec.yml +1 -1
  137. data/lib/bundles/inspec-supermarket/api.rb +7 -5
  138. data/lib/bundles/inspec-supermarket/cli.rb +2 -2
  139. data/lib/fetchers/git.rb +4 -2
  140. data/lib/fetchers/local.rb +4 -1
  141. data/lib/fetchers/url.rb +64 -10
  142. data/lib/inspec/archive/tar.rb +1 -1
  143. data/lib/inspec/backend.rb +26 -3
  144. data/lib/inspec/base_cli.rb +44 -7
  145. data/lib/inspec/cached_fetcher.rb +2 -2
  146. data/lib/inspec/cli.rb +34 -12
  147. data/lib/inspec/completions/fish.sh.erb +34 -0
  148. data/lib/inspec/control_eval_context.rb +0 -2
  149. data/lib/inspec/dependencies/cache.rb +0 -1
  150. data/lib/inspec/dependencies/dependency_set.rb +2 -2
  151. data/lib/inspec/dependencies/lockfile.rb +13 -6
  152. data/lib/inspec/dependencies/requirement.rb +6 -6
  153. data/lib/inspec/dependencies/resolver.rb +4 -4
  154. data/lib/inspec/dsl.rb +3 -5
  155. data/lib/inspec/env_printer.rb +9 -1
  156. data/lib/inspec/exceptions.rb +8 -0
  157. data/lib/inspec/fetcher.rb +1 -1
  158. data/lib/inspec/file_provider.rb +47 -11
  159. data/lib/inspec/library_eval_context.rb +1 -1
  160. data/lib/inspec/metadata.rb +62 -18
  161. data/lib/inspec/method_source.rb +24 -0
  162. data/lib/inspec/objects/attribute.rb +21 -0
  163. data/lib/inspec/objects/control.rb +21 -3
  164. data/lib/inspec/objects/each_loop.rb +2 -1
  165. data/lib/inspec/objects/list.rb +1 -1
  166. data/lib/inspec/objects/or_test.rb +17 -2
  167. data/lib/inspec/objects/tag.rb +27 -0
  168. data/lib/inspec/objects/test.rb +9 -8
  169. data/lib/inspec/objects.rb +1 -0
  170. data/lib/inspec/plugins/fetcher.rb +4 -5
  171. data/lib/inspec/plugins/resource.rb +1 -2
  172. data/lib/inspec/plugins/source_reader.rb +3 -3
  173. data/lib/inspec/plugins.rb +1 -1
  174. data/lib/inspec/polyfill.rb +0 -1
  175. data/lib/inspec/profile.rb +92 -23
  176. data/lib/inspec/profile_context.rb +1 -1
  177. data/lib/inspec/profile_vendor.rb +66 -0
  178. data/lib/inspec/resource.rb +29 -3
  179. data/lib/inspec/rspec_json_formatter.rb +672 -285
  180. data/lib/inspec/rule.rb +12 -16
  181. data/lib/inspec/runner.rb +26 -15
  182. data/lib/inspec/runner_rspec.rb +1 -0
  183. data/lib/inspec/runtime_profile.rb +26 -0
  184. data/lib/inspec/schema.rb +185 -0
  185. data/lib/inspec/secrets/yaml.rb +8 -1
  186. data/lib/inspec/secrets.rb +1 -1
  187. data/lib/inspec/shell.rb +92 -22
  188. data/lib/inspec/source_reader.rb +1 -1
  189. data/lib/inspec/version.rb +1 -1
  190. data/lib/inspec.rb +1 -1
  191. data/lib/matchers/matchers.rb +67 -17
  192. data/lib/resources/aide_conf.rb +162 -0
  193. data/lib/resources/apache.rb +0 -1
  194. data/lib/resources/apache_conf.rb +3 -3
  195. data/lib/resources/apt.rb +2 -1
  196. data/lib/resources/audit_policy.rb +0 -1
  197. data/lib/resources/auditd_conf.rb +1 -2
  198. data/lib/resources/auditd_rules.rb +5 -5
  199. data/lib/resources/bond.rb +1 -1
  200. data/lib/resources/bridge.rb +1 -1
  201. data/lib/resources/command.rb +5 -3
  202. data/lib/resources/crontab.rb +102 -0
  203. data/lib/resources/csv.rb +18 -1
  204. data/lib/resources/dh_params.rb +84 -0
  205. data/lib/resources/directory.rb +7 -3
  206. data/lib/resources/docker.rb +198 -0
  207. data/lib/resources/docker_container.rb +114 -0
  208. data/lib/resources/docker_image.rb +96 -0
  209. data/lib/resources/etc_group.rb +2 -3
  210. data/lib/resources/etc_hosts.rb +81 -0
  211. data/lib/resources/file.rb +88 -30
  212. data/lib/resources/gem.rb +26 -6
  213. data/lib/resources/groups.rb +4 -5
  214. data/lib/resources/grub_conf.rb +3 -4
  215. data/lib/resources/host.rb +175 -35
  216. data/lib/resources/http.rb +73 -0
  217. data/lib/resources/iis_app.rb +103 -0
  218. data/lib/resources/iis_site.rb +23 -0
  219. data/lib/resources/inetd_conf.rb +9 -4
  220. data/lib/resources/interface.rb +4 -3
  221. data/lib/resources/json.rb +37 -14
  222. data/lib/resources/kernel_module.rb +77 -10
  223. data/lib/resources/kernel_parameter.rb +0 -1
  224. data/lib/resources/key_rsa.rb +67 -0
  225. data/lib/resources/limits_conf.rb +3 -4
  226. data/lib/resources/login_def.rb +2 -3
  227. data/lib/resources/mount.rb +34 -4
  228. data/lib/resources/mssql_session.rb +81 -12
  229. data/lib/resources/mysql.rb +0 -1
  230. data/lib/resources/mysql_conf.rb +1 -2
  231. data/lib/resources/mysql_session.rb +18 -7
  232. data/lib/resources/nginx_conf.rb +95 -0
  233. data/lib/resources/ntp_conf.rb +2 -3
  234. data/lib/resources/oracledb_session.rb +138 -0
  235. data/lib/resources/os_env.rb +7 -5
  236. data/lib/resources/package.rb +70 -13
  237. data/lib/resources/packages.rb +111 -0
  238. data/lib/resources/parse_config.rb +3 -4
  239. data/lib/resources/passwd.rb +4 -5
  240. data/lib/resources/pip.rb +29 -21
  241. data/lib/resources/port.rb +133 -14
  242. data/lib/resources/postgres.rb +53 -43
  243. data/lib/resources/postgres_conf.rb +40 -13
  244. data/lib/resources/postgres_hba_conf.rb +101 -0
  245. data/lib/resources/postgres_ident_conf.rb +79 -0
  246. data/lib/resources/postgres_session.rb +28 -20
  247. data/lib/resources/powershell.rb +2 -2
  248. data/lib/resources/processes.rb +61 -26
  249. data/lib/resources/rabbitmq_conf.rb +53 -0
  250. data/lib/resources/registry_key.rb +34 -11
  251. data/lib/resources/security_policy.rb +2 -2
  252. data/lib/resources/service.rb +17 -7
  253. data/lib/resources/ssh_conf.rb +17 -6
  254. data/lib/resources/ssl.rb +3 -4
  255. data/lib/resources/sys_info.rb +1 -1
  256. data/lib/resources/toml.rb +26 -0
  257. data/lib/resources/users.rb +41 -41
  258. data/lib/resources/virtualization.rb +252 -0
  259. data/lib/resources/windows_task.rb +106 -0
  260. data/lib/resources/x509_certificate.rb +143 -0
  261. data/lib/resources/xinetd.rb +18 -2
  262. data/lib/resources/xml.rb +27 -0
  263. data/lib/resources/yaml.rb +10 -2
  264. data/lib/resources/yum.rb +25 -7
  265. data/lib/resources/zfs_dataset.rb +60 -0
  266. data/lib/resources/zfs_pool.rb +49 -0
  267. data/lib/source_readers/flat.rb +2 -1
  268. data/lib/source_readers/inspec.rb +30 -11
  269. data/lib/utils/command_wrapper.rb +3 -3
  270. data/lib/utils/database_helpers.rb +77 -0
  271. data/lib/utils/erlang_parser.rb +192 -0
  272. data/lib/utils/filter.rb +2 -1
  273. data/lib/utils/filter_array.rb +0 -1
  274. data/lib/utils/find_files.rb +1 -2
  275. data/lib/utils/latest_version.rb +21 -0
  276. data/lib/utils/nginx_parser.rb +76 -0
  277. data/lib/utils/object_traversal.rb +5 -4
  278. data/lib/utils/parser.rb +23 -4
  279. data/lib/utils/plugin_registry.rb +3 -3
  280. data/lib/utils/simpleconfig.rb +25 -8
  281. data/lib/utils/spdx.rb +13 -0
  282. data/lib/utils/spdx.txt +344 -0
  283. metadata +168 -22
  284. data/docs/cli.md +0 -342
  285. data/docs/resources/process.md.erb +0 -73
  286. /data/docs/{plugin_kitchen_inspec.html.md → plugin_kitchen_inspec.md} +0 -0
@@ -3,7 +3,6 @@
3
3
  # author: Christoph Hartmann
4
4
  require 'utils/plugin_registry'
5
5
  require 'inspec/file_provider'
6
- require 'digest'
7
6
 
8
7
  module Inspec
9
8
  module Plugins
@@ -36,7 +35,7 @@ module Inspec
36
35
  # profile.
37
36
  #
38
37
  def archive_path
39
- fail "Fetcher #{self} does not implement `archive_path()`. This is required."
38
+ raise "Fetcher #{self} does not implement `archive_path()`. This is required."
40
39
  end
41
40
 
42
41
  #
@@ -49,7 +48,7 @@ module Inspec
49
48
  # /foo/bar/baz.zip
50
49
  #
51
50
  def fetch(_path)
52
- fail "Fetcher #{self} does not implement `fetch()`. This is required."
51
+ raise "Fetcher #{self} does not implement `fetch()`. This is required."
53
52
  end
54
53
 
55
54
  #
@@ -59,14 +58,14 @@ module Inspec
59
58
  # tag will be resolved to an exact revision.
60
59
  #
61
60
  def resolved_source
62
- fail "Fetcher #{self} does not implement `resolved_source()`. This is required for terminal fetchers."
61
+ raise "Fetcher #{self} does not implement `resolved_source()`. This is required for terminal fetchers."
63
62
  end
64
63
 
65
64
  #
66
65
  # The unique key based on the content of the remote archive.
67
66
  #
68
67
  def cache_key
69
- fail "Fetcher #{self} does not implement `cache_key()`. This is required for terminal fetchers."
68
+ raise "Fetcher #{self} does not implement `cache_key()`. This is required for terminal fetchers."
70
69
  end
71
70
 
72
71
  #
@@ -38,7 +38,6 @@ module Inspec
38
38
  end
39
39
 
40
40
  def __register(name, obj)
41
- # rubocop:disable Lint/NestedMethodDefinition
42
41
  cl = Class.new(obj) do
43
42
  def initialize(backend, name, *args)
44
43
  # attach the backend to this instance
@@ -59,7 +58,7 @@ module Inspec
59
58
  end
60
59
 
61
60
  def resource_skipped
62
- @resource_skipped
61
+ @resource_skipped if defined?(@resource_skipped)
63
62
  end
64
63
 
65
64
  def skip_resource(message)
@@ -15,7 +15,7 @@ module Inspec
15
15
  #
16
16
  # @return [Inspec::Metadata] profile metadata
17
17
  def metadata
18
- fail "SourceReader #{self} does not implement `metadata()`. This method is required"
18
+ raise "SourceReader #{self} does not implement `metadata()`. This method is required"
19
19
  end
20
20
 
21
21
  # Retrieve this profile's tests
@@ -26,14 +26,14 @@ module Inspec
26
26
  #
27
27
  # @return [Hash] Collection with references pointing to test contents
28
28
  def tests
29
- fail "SourceReader #{self} does not implement `tests()`. This method is required"
29
+ raise "SourceReader #{self} does not implement `tests()`. This method is required"
30
30
  end
31
31
 
32
32
  # Retrieve this profile's libraries
33
33
  #
34
34
  # @return [Hash] Collection with references pointing to library contents
35
35
  def libraries
36
- fail "SourceReader #{self} does not implement `libraries()`. This method is required"
36
+ raise "SourceReader #{self} does not implement `libraries()`. This method is required"
37
37
  end
38
38
  end
39
39
  end
@@ -51,7 +51,7 @@ module Inspec
51
51
  def load(name)
52
52
  path = @registry[name]
53
53
  if path.nil?
54
- fail "Couldn't find plugin #{name}. Searching in #{@home}"
54
+ raise "Couldn't find plugin #{name}. Searching in #{@home}"
55
55
  end
56
56
  # puts "Loading plugin #{name} from #{path}"
57
57
  require path
@@ -2,7 +2,6 @@
2
2
  # copyright: 2016, Chef Software Inc.
3
3
  # author: Dominik Richter
4
4
  # author: Christoph Hartmann
5
- # license: All rights reserved
6
5
 
7
6
  class Struct
8
7
  unless instance_methods.include? :to_h
@@ -1,9 +1,10 @@
1
1
  # encoding: utf-8
2
- # Copyright 2015 Dominik Richter. All rights reserved.
2
+ # Copyright 2015 Dominik Richter
3
3
  # author: Dominik Richter
4
4
  # author: Christoph Hartmann
5
5
 
6
6
  require 'forwardable'
7
+ require 'openssl'
7
8
  require 'inspec/polyfill'
8
9
  require 'inspec/cached_fetcher'
9
10
  require 'inspec/file_provider'
@@ -13,6 +14,8 @@ require 'inspec/backend'
13
14
  require 'inspec/rule'
14
15
  require 'inspec/log'
15
16
  require 'inspec/profile_context'
17
+ require 'inspec/runtime_profile'
18
+ require 'inspec/method_source'
16
19
  require 'inspec/dependencies/cache'
17
20
  require 'inspec/dependencies/lockfile'
18
21
  require 'inspec/dependencies/dependency_set'
@@ -21,26 +24,56 @@ module Inspec
21
24
  class Profile # rubocop:disable Metrics/ClassLength
22
25
  extend Forwardable
23
26
 
24
- def self.resolve_target(target, cache = nil)
25
- Inspec::CachedFetcher.new(target, cache || Cache.new)
27
+ def self.resolve_target(target, cache)
28
+ Inspec::Log.debug "Resolve #{target} into cache #{cache.path}"
29
+ Inspec::CachedFetcher.new(target, cache)
30
+ end
31
+
32
+ # Check if the profile contains a vendored cache, move content into global cache
33
+ # TODO: use relative file provider
34
+ # TODO: use source reader for Cache as well
35
+ def self.copy_deps_into_cache(file_provider, opts)
36
+ # filter content
37
+ cache = file_provider.files.find_all do |entry|
38
+ entry.start_with?('vendor')
39
+ end
40
+ content = Hash[cache.map { |x| [x, file_provider.binread(x)] }]
41
+ keys = content.keys
42
+ keys.each do |key|
43
+ next if content[key].nil?
44
+ # remove prefix
45
+ rel = Pathname.new(key).relative_path_from(Pathname.new('vendor')).to_s
46
+ tar = Pathname.new(opts[:cache].path).join(rel)
47
+
48
+ FileUtils.mkdir_p tar.dirname.to_s
49
+ Inspec::Log.debug "Copy #{tar} to cache directory"
50
+ File.binwrite(tar.to_s, content[key])
51
+ end
26
52
  end
27
53
 
28
54
  def self.for_path(path, opts)
29
55
  file_provider = FileProvider.for_path(path)
30
- reader = Inspec::SourceReader.resolve(file_provider.relative_provider)
56
+ rp = file_provider.relative_provider
57
+
58
+ # copy embedded dependecies into global cache
59
+ copy_deps_into_cache(rp, opts) unless opts[:cache].nil?
60
+
61
+ reader = Inspec::SourceReader.resolve(rp)
31
62
  if reader.nil?
32
- fail("Don't understand inspec profile in #{path}, it " \
63
+ raise("Don't understand inspec profile in #{path}, it " \
33
64
  "doesn't look like a supported profile structure.")
34
65
  end
35
66
  new(reader, opts)
36
67
  end
37
68
 
38
69
  def self.for_fetcher(fetcher, opts)
70
+ opts[:cache] = opts[:cache] || Cache.new
39
71
  path, writable = fetcher.fetch
40
72
  for_path(path, opts.merge(target: fetcher.target, writable: writable))
41
73
  end
42
74
 
43
75
  def self.for_target(target, opts = {})
76
+ opts[:cache] = opts[:cache] || Cache.new
44
77
  fetcher = resolve_target(target, opts[:cache])
45
78
  for_fetcher(fetcher, opts)
46
79
  end
@@ -52,21 +85,26 @@ module Inspec
52
85
 
53
86
  # rubocop:disable Metrics/AbcSize
54
87
  def initialize(source_reader, options = {})
55
- @target = options.delete(:target)
88
+ @source_reader = source_reader
89
+ @target = options[:target]
56
90
  @logger = options[:logger] || Logger.new(nil)
57
91
  @locked_dependencies = options[:dependencies]
58
92
  @controls = options[:controls] || []
59
93
  @writable = options[:writable] || false
60
94
  @profile_id = options[:id]
61
95
  @cache = options[:cache] || Cache.new
62
- @backend = options[:backend] || Inspec::Backend.create(options)
63
- @source_reader = source_reader
96
+ @backend = options[:backend] || Inspec::Backend.create(options.select { |k, _| k != 'target' })
97
+ @attr_values = options[:attributes]
64
98
  @tests_collected = false
65
99
  @libraries_loaded = false
66
- Metadata.finalize(@source_reader.metadata, @profile_id)
67
- @runner_context = options[:profile_context] || Inspec::ProfileContext.for_profile(self,
68
- @backend,
69
- options[:attributes])
100
+ Metadata.finalize(@source_reader.metadata, @profile_id, options)
101
+
102
+ @runtime_profile = RuntimeProfile.new(self)
103
+ @backend.profile = @runtime_profile
104
+
105
+ @runner_context =
106
+ options[:profile_context] ||
107
+ Inspec::ProfileContext.for_profile(self, @backend, @attr_values)
70
108
  end
71
109
 
72
110
  def name
@@ -77,7 +115,7 @@ module Inspec
77
115
  metadata.params[:version]
78
116
  end
79
117
 
80
- def writable? # rubocop:disable Style/TrivialAccessors
118
+ def writable?
81
119
  @writable
82
120
  end
83
121
 
@@ -172,10 +210,11 @@ module Inspec
172
210
 
173
211
  # add information about the required attributes
174
212
  res[:attributes] = res[:attributes].map(&:to_hash) unless res[:attributes].nil? || res[:attributes].empty?
213
+ res[:sha256] = sha256
175
214
  res
176
215
  end
177
216
 
178
- # Check if the profile is internall well-structured. The logger will be
217
+ # Check if the profile is internally well-structured. The logger will be
179
218
  # used to print information on errors and warnings which are found.
180
219
  #
181
220
  # @return [Boolean] true if no errors were found, false otherwise
@@ -287,8 +326,6 @@ module Inspec
287
326
 
288
327
  # display all files that will be part of the archive
289
328
  @logger.debug 'Add the following files to archive:'
290
- root_path = @source_reader.target.prefix
291
- files = @source_reader.target.files
292
329
  files.each { |f| @logger.debug ' ' + f }
293
330
 
294
331
  if opts[:zip]
@@ -312,13 +349,21 @@ module Inspec
312
349
  end
313
350
 
314
351
  def lockfile_exists?
315
- File.exist?(lockfile_path)
352
+ @source_reader.target.files.include?('inspec.lock')
316
353
  end
317
354
 
318
355
  def lockfile_path
319
356
  File.join(cwd, 'inspec.lock')
320
357
  end
321
358
 
359
+ def root_path
360
+ @source_reader.target.prefix
361
+ end
362
+
363
+ def files
364
+ @source_reader.target.files
365
+ end
366
+
322
367
  #
323
368
  # TODO(ssd): Relative path handling really needs to be carefully
324
369
  # thought through, especially with respect to relative paths in
@@ -330,7 +375,7 @@ module Inspec
330
375
 
331
376
  def lockfile
332
377
  @lockfile ||= if lockfile_exists?
333
- Inspec::Lockfile.from_file(lockfile_path)
378
+ Inspec::Lockfile.from_content(@source_reader.target.read('inspec.lock'))
334
379
  else
335
380
  generate_lockfile
336
381
  end
@@ -350,7 +395,27 @@ module Inspec
350
395
  end
351
396
 
352
397
  def load_dependencies
353
- Inspec::DependencySet.from_lockfile(lockfile, cwd, @cache, @backend)
398
+ Inspec::DependencySet.from_lockfile(lockfile, cwd, @cache, @backend, { attributes: @attr_values })
399
+ end
400
+
401
+ # Calculate this profile's SHA256 checksum. Includes metadata, dependencies,
402
+ # libraries, data files, and controls.
403
+ #
404
+ # @return [Type] description of returned object
405
+ def sha256
406
+ # get all dependency checksums
407
+ deps = Hash[locked_dependencies.list.map { |k, v| [k, v.profile.sha256] }]
408
+
409
+ res = OpenSSL::Digest::SHA256.new
410
+ files = source_reader.tests.to_a + source_reader.libraries.to_a +
411
+ source_reader.data_files.to_a +
412
+ [['inspec.yml', source_reader.metadata.content]] +
413
+ [['inspec.lock.deps', YAML.dump(deps)]]
414
+
415
+ files.sort { |a, b| a[0] <=> b[0] }
416
+ .map { |f| res << f[0] << "\0" << f[1] << "\0" }
417
+
418
+ res.digest.unpack('H*')[0]
354
419
  end
355
420
 
356
421
  private
@@ -366,11 +431,14 @@ module Inspec
366
431
  end
367
432
 
368
433
  name = params[:name] ||
369
- fail('Cannot create an archive without a profile name! Please '\
434
+ raise('Cannot create an archive without a profile name! Please '\
370
435
  'specify the name in metadata or use --output to create the archive.')
436
+ version = params[:version] ||
437
+ raise('Cannot create an archive without a profile version! Please '\
438
+ 'specify the version in metadata or use --output to create the archive.')
371
439
  ext = opts[:zip] ? 'zip' : 'tar.gz'
372
440
  slug = name.downcase.strip.tr(' ', '-').gsub(/[^\w-]/, '_')
373
- Pathname.new(Dir.pwd).join("#{slug}.#{ext}")
441
+ Pathname.new(Dir.pwd).join("#{slug}-#{version}.#{ext}")
374
442
  end
375
443
 
376
444
  def load_params
@@ -404,6 +472,7 @@ module Inspec
404
472
 
405
473
  def load_rule(rule, file, controls, groups)
406
474
  id = Inspec::Rule.rule_id(rule)
475
+ location = rule.instance_variable_get(:@__source_location)
407
476
  controls[id] = {
408
477
  title: rule.title,
409
478
  desc: rule.desc,
@@ -411,8 +480,8 @@ module Inspec
411
480
  refs: rule.ref,
412
481
  tags: rule.tag,
413
482
  checks: Inspec::Rule.checks(rule),
414
- code: rule.instance_variable_get(:@__code),
415
- source_location: rule.instance_variable_get(:@__source_location),
483
+ code: Inspec::MethodSource.code_at(location, source_reader),
484
+ source_location: location,
416
485
  }
417
486
 
418
487
  groups[file] ||= {
@@ -21,7 +21,7 @@ module Inspec
21
21
  attr_accessor :rules
22
22
  def initialize(profile_id, backend, conf)
23
23
  if backend.nil?
24
- fail 'ProfileContext is initiated with a backend == nil. ' \
24
+ raise 'ProfileContext is initiated with a backend == nil. ' \
25
25
  'This is a backend error which must be fixed upstream.'
26
26
  end
27
27
  @profile_id = profile_id
@@ -0,0 +1,66 @@
1
+ # encoding: utf-8
2
+ # author: Adam Leff
3
+
4
+ require 'inspec/profile'
5
+
6
+ module Inspec
7
+ class ProfileVendor
8
+ attr_reader :profile_path
9
+
10
+ def initialize(path)
11
+ @profile_path = Pathname.new(path)
12
+ end
13
+
14
+ def vendor!
15
+ vendor_dependencies
16
+ end
17
+
18
+ # The URL fetcher uses a Tempfile to retrieve the vendored
19
+ # profile, which creates a file that is only readable by
20
+ # the current user. In most circumstances, this is likely OK.
21
+ # However, in environments like a Habitat package, these files
22
+ # need to be readable by all users or the Habitat Supervisor
23
+ # may not be able to start InSpec correctly.
24
+ #
25
+ # This method makes sure all vendored files are mode 644 for this
26
+ # use case. This method is not called by default - the caller
27
+ # vendoring the profile must make the decision as to whether this
28
+ # is necessary.
29
+ def make_readable
30
+ Dir.glob("#{cache_path}/**/*") do |e|
31
+ FileUtils.chmod(0644, e) if File.file?(e)
32
+ end
33
+ end
34
+
35
+ def cache_path
36
+ profile_path.join('vendor')
37
+ end
38
+
39
+ def lockfile
40
+ profile_path.join('inspec.lock')
41
+ end
42
+
43
+ private
44
+
45
+ def profile
46
+ @profile ||= Inspec::Profile.for_target(profile_path.to_s, profile_opts)
47
+ end
48
+
49
+ def profile_opts
50
+ {
51
+ cache: Inspec::Cache.new(cache_path.to_s),
52
+ backend: Inspec::Backend.create(target: 'mock://'),
53
+ }
54
+ end
55
+
56
+ def vendor_dependencies
57
+ delete_vendored_data
58
+ File.write(lockfile, profile.generate_lockfile.to_yaml)
59
+ end
60
+
61
+ def delete_vendored_data
62
+ FileUtils.rm_rf(cache_path) if cache_path.exist?
63
+ File.delete(lockfile) if lockfile.exist?
64
+ end
65
+ end
66
+ end
@@ -1,6 +1,5 @@
1
1
  # encoding: utf-8
2
2
  # copyright: 2015, Vulcano Security GmbH
3
- # license: All rights reserved
4
3
  # author: Dominik Richter
5
4
  # author: Christoph Hartmann
6
5
  require 'inspec/plugins'
@@ -39,7 +38,7 @@ module Inspec
39
38
  profile_context.subcontext_by_name(profile_name)
40
39
  end
41
40
 
42
- fail ProfileNotFound, "Cannot find profile named: #{profile_name}" if inner_context.nil?
41
+ raise ProfileNotFound, "Cannot find profile named: #{profile_name}" if inner_context.nil?
43
42
  inner_context.resource_registry[resource_name]
44
43
  end
45
44
 
@@ -48,6 +47,10 @@ module Inspec
48
47
  r.new(backend, id.to_s, *args)
49
48
  end
50
49
  end
50
+
51
+ define_method :inspec do
52
+ backend
53
+ end
51
54
  end
52
55
  end
53
56
  end
@@ -64,11 +67,12 @@ module Inspec
64
67
 
65
68
  def self.validate_resource_dsl_version!(version)
66
69
  if version != 1
67
- fail 'Only resource version 1 is supported!'
70
+ raise 'Only resource version 1 is supported!'
68
71
  end
69
72
  end
70
73
  end
71
74
 
75
+ require 'resources/aide_conf'
72
76
  require 'resources/apache'
73
77
  require 'resources/apache_conf'
74
78
  require 'resources/apt'
@@ -79,13 +83,21 @@ require 'resources/bash'
79
83
  require 'resources/bond'
80
84
  require 'resources/bridge'
81
85
  require 'resources/command'
86
+ require 'resources/crontab'
87
+ require 'resources/dh_params'
82
88
  require 'resources/directory'
89
+ require 'resources/docker'
90
+ require 'resources/docker_image'
91
+ require 'resources/docker_container'
83
92
  require 'resources/etc_group'
93
+ require 'resources/etc_hosts'
84
94
  require 'resources/file'
85
95
  require 'resources/gem'
86
96
  require 'resources/groups'
87
97
  require 'resources/grub_conf'
88
98
  require 'resources/host'
99
+ require 'resources/http'
100
+ require 'resources/iis_app'
89
101
  require 'resources/iis_site'
90
102
  require 'resources/inetd_conf'
91
103
  require 'resources/interface'
@@ -93,6 +105,7 @@ require 'resources/iptables'
93
105
  require 'resources/json'
94
106
  require 'resources/kernel_module'
95
107
  require 'resources/kernel_parameter'
108
+ require 'resources/key_rsa'
96
109
  require 'resources/limits_conf'
97
110
  require 'resources/login_def'
98
111
  require 'resources/mount'
@@ -100,14 +113,19 @@ require 'resources/mssql_session'
100
113
  require 'resources/mysql'
101
114
  require 'resources/mysql_conf'
102
115
  require 'resources/mysql_session'
116
+ require 'resources/nginx_conf'
103
117
  require 'resources/npm'
104
118
  require 'resources/ntp_conf'
105
119
  require 'resources/oneget'
120
+ require 'resources/oracledb_session'
106
121
  require 'resources/os'
107
122
  require 'resources/os_env'
108
123
  require 'resources/package'
124
+ require 'resources/packages'
109
125
  require 'resources/parse_config'
110
126
  require 'resources/passwd'
127
+ require 'resources/postgres_hba_conf'
128
+ require 'resources/postgres_ident_conf'
111
129
  require 'resources/pip'
112
130
  require 'resources/port'
113
131
  require 'resources/postgres'
@@ -115,6 +133,7 @@ require 'resources/postgres_conf'
115
133
  require 'resources/postgres_session'
116
134
  require 'resources/powershell'
117
135
  require 'resources/processes'
136
+ require 'resources/rabbitmq_conf'
118
137
  require 'resources/registry_key'
119
138
  require 'resources/security_policy'
120
139
  require 'resources/service'
@@ -122,15 +141,22 @@ require 'resources/shadow'
122
141
  require 'resources/ssl'
123
142
  require 'resources/ssh_conf'
124
143
  require 'resources/sys_info'
144
+ require 'resources/toml'
125
145
  require 'resources/users'
126
146
  require 'resources/vbscript'
147
+ require 'resources/virtualization'
127
148
  require 'resources/windows_feature'
149
+ require 'resources/windows_task'
128
150
  require 'resources/xinetd'
129
151
  require 'resources/wmi'
152
+ require 'resources/x509_certificate'
130
153
  require 'resources/yum'
154
+ require 'resources/zfs_dataset'
155
+ require 'resources/zfs_pool'
131
156
 
132
157
  # file formats, depend on json implementation
133
158
  require 'resources/json'
134
159
  require 'resources/yaml'
135
160
  require 'resources/csv'
136
161
  require 'resources/ini'
162
+ require 'resources/xml'