inspec 1.51.0 → 1.51.6

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 (111) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +29 -15
  3. data/README.md +1 -1
  4. data/docs/glossary.md +99 -0
  5. data/docs/resources/aide_conf.md.erb +16 -9
  6. data/docs/resources/apache.md.erb +66 -0
  7. data/docs/resources/apache_conf.md.erb +11 -5
  8. data/docs/resources/apt.md.erb +1 -1
  9. data/docs/resources/audit_policy.md.erb +1 -1
  10. data/docs/resources/auditd_conf.md.erb +12 -9
  11. data/docs/resources/bash.md.erb +24 -12
  12. data/docs/resources/bond.md.erb +26 -24
  13. data/docs/resources/bridge.md.erb +18 -11
  14. data/docs/resources/bsd_service.md.erb +11 -2
  15. data/docs/resources/command.md.erb +30 -29
  16. data/docs/resources/cpan.md.erb +33 -17
  17. data/docs/resources/cran.md.erb +26 -17
  18. data/docs/resources/crontab.md.erb +18 -1
  19. data/docs/resources/csv.md.erb +13 -7
  20. data/docs/resources/{dh_params.md → dh_params.md.erb} +30 -6
  21. data/docs/resources/directory.md.erb +9 -4
  22. data/docs/resources/docker.md.erb +1 -1
  23. data/docs/resources/docker_container.md.erb +32 -26
  24. data/docs/resources/docker_image.md.erb +29 -26
  25. data/docs/resources/docker_service.md.erb +37 -31
  26. data/docs/resources/elasticsearch.md.erb +18 -32
  27. data/docs/resources/etc_fstab.md.erb +19 -15
  28. data/docs/resources/etc_group.md.erb +13 -39
  29. data/docs/resources/etc_hosts.md.erb +12 -5
  30. data/docs/resources/etc_hosts_allow.md.erb +9 -4
  31. data/docs/resources/etc_hosts_deny.md.erb +12 -7
  32. data/docs/resources/file.md.erb +139 -134
  33. data/docs/resources/filesystem.md.erb +5 -4
  34. data/docs/resources/firewalld.md.erb +1 -1
  35. data/docs/resources/gem.md.erb +2 -2
  36. data/docs/resources/group.md.erb +1 -1
  37. data/docs/resources/host.md.erb +1 -1
  38. data/docs/resources/iis_app.md.erb +1 -1
  39. data/docs/resources/iis_site.md.erb +1 -1
  40. data/docs/resources/interface.md.erb +1 -1
  41. data/docs/resources/iptables.md.erb +1 -1
  42. data/docs/resources/json.md.erb +1 -1
  43. data/docs/resources/kernel_module.md.erb +1 -1
  44. data/docs/resources/kernel_parameter.md.erb +1 -1
  45. data/docs/resources/launchd_service.md.erb +1 -1
  46. data/docs/resources/limits_conf.md.erb +1 -1
  47. data/docs/resources/login_def.md.erb +1 -1
  48. data/docs/resources/mount.md.erb +1 -1
  49. data/docs/resources/mysql_conf.md.erb +1 -1
  50. data/docs/resources/nginx_conf.md.erb +1 -1
  51. data/docs/resources/npm.md.erb +1 -1
  52. data/docs/resources/oneget.md.erb +1 -1
  53. data/docs/resources/os.md.erb +1 -1
  54. data/docs/resources/os_env.md.erb +2 -2
  55. data/docs/resources/package.md.erb +1 -1
  56. data/docs/resources/packages.md.erb +66 -0
  57. data/docs/resources/parse_config.md.erb +1 -1
  58. data/docs/resources/parse_config_file.md.erb +1 -1
  59. data/docs/resources/passwd.md.erb +1 -1
  60. data/docs/resources/pip.md.erb +1 -1
  61. data/docs/resources/port.md.erb +1 -1
  62. data/docs/resources/postgres_conf.md.erb +1 -1
  63. data/docs/resources/postgres_session.md.erb +1 -1
  64. data/docs/resources/powershell.md.erb +2 -2
  65. data/docs/resources/processes.md.erb +1 -1
  66. data/docs/resources/registry_key.md.erb +1 -1
  67. data/docs/resources/runit_service.md.erb +1 -1
  68. data/docs/resources/security_policy.md.erb +1 -1
  69. data/docs/resources/service.md.erb +1 -1
  70. data/docs/resources/shadow.md.erb +1 -1
  71. data/docs/resources/ssh_config.md.erb +1 -1
  72. data/docs/resources/sshd_config.md.erb +1 -1
  73. data/docs/resources/ssl.md.erb +1 -1
  74. data/docs/resources/sys_info.md.erb +1 -1
  75. data/docs/resources/systemd_service.md.erb +1 -1
  76. data/docs/resources/sysv_service.md.erb +1 -1
  77. data/docs/resources/upstart_service.md.erb +1 -1
  78. data/docs/resources/user.md.erb +1 -1
  79. data/docs/resources/users.md.erb +1 -1
  80. data/docs/resources/windows_feature.md.erb +1 -1
  81. data/docs/resources/windows_hotfix.md.erb +1 -1
  82. data/docs/resources/xinetd_conf.md.erb +1 -1
  83. data/docs/resources/xml.md.erb +1 -1
  84. data/docs/resources/yaml.md.erb +1 -1
  85. data/docs/resources/yum.md.erb +1 -1
  86. data/lib/inspec.rb +2 -1
  87. data/lib/inspec/base_cli.rb +98 -18
  88. data/lib/inspec/cli.rb +33 -21
  89. data/lib/inspec/formatters.rb +3 -0
  90. data/lib/inspec/formatters/base.rb +208 -0
  91. data/lib/inspec/formatters/json_rspec.rb +20 -0
  92. data/lib/inspec/formatters/show_progress.rb +12 -0
  93. data/lib/inspec/objects.rb +1 -0
  94. data/lib/inspec/objects/describe.rb +92 -0
  95. data/lib/inspec/reporters.rb +33 -0
  96. data/lib/inspec/reporters/base.rb +23 -0
  97. data/lib/inspec/reporters/cli.rb +395 -0
  98. data/lib/inspec/reporters/json.rb +132 -0
  99. data/lib/inspec/reporters/json_min.rb +44 -0
  100. data/lib/inspec/reporters/junit.rb +77 -0
  101. data/lib/inspec/runner.rb +14 -1
  102. data/lib/inspec/runner_rspec.rb +34 -14
  103. data/lib/inspec/schema.rb +1 -0
  104. data/lib/inspec/shell.rb +0 -1
  105. data/lib/inspec/version.rb +1 -1
  106. data/lib/resources/apache.rb +20 -0
  107. data/lib/resources/apache_conf.rb +33 -8
  108. data/lib/resources/audit_policy.rb +1 -1
  109. data/lib/resources/packages.rb +4 -3
  110. metadata +17 -4
  111. data/lib/inspec/rspec_json_formatter.rb +0 -940
@@ -99,7 +99,7 @@ This is also possible with `systemd_service`, `runit_service`, `sysv_service`, `
99
99
 
100
100
  ## Matchers
101
101
 
102
- This InSpec audit resource has the following matchers. For a full list of available matchers please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
102
+ For a full list of available matchers please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
103
103
 
104
104
  ### be_enabled
105
105
 
@@ -78,7 +78,7 @@ The following examples show how to use this InSpec audit resource.
78
78
 
79
79
  ## Matchers
80
80
 
81
- This InSpec audit resource has the following matchers. For a full list of available matchers please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
81
+ For a full list of available matchers please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
82
82
 
83
83
  ### count
84
84
 
@@ -66,7 +66,7 @@ The following examples show how to use this InSpec audit resource.
66
66
 
67
67
  ## Matchers
68
68
 
69
- This InSpec audit resource has the following matchers. For a full list of available matchers please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
69
+ For a full list of available matchers please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
70
70
 
71
71
  ### name
72
72
 
@@ -69,7 +69,7 @@ The following examples show how to use this InSpec audit resource.
69
69
 
70
70
  ## Matchers
71
71
 
72
- This InSpec audit resource has the following matchers. For a full list of available matchers please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
72
+ For a full list of available matchers please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
73
73
 
74
74
  ### name
75
75
 
@@ -85,7 +85,7 @@ Or execute the profile directly via URL:
85
85
 
86
86
  ## Matchers
87
87
 
88
- This InSpec audit resource has the following matchers. For a full list of available matchers please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
88
+ For a full list of available matchers please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
89
89
 
90
90
  ### be_enabled
91
91
 
@@ -32,7 +32,7 @@ The following examples show how to use this InSpec audit resource.
32
32
 
33
33
  ## Matchers
34
34
 
35
- This InSpec audit resource has the following matchers. For a full list of available matchers please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
35
+ For a full list of available matchers please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
36
36
 
37
37
  ### hostname
38
38
 
@@ -35,7 +35,7 @@ The path to the service manager's control may be specified for situations where
35
35
 
36
36
  ## Matchers
37
37
 
38
- This InSpec audit resource has the following matchers. For a full list of available matchers please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
38
+ For a full list of available matchers please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
39
39
 
40
40
  ### be_enabled
41
41
 
@@ -35,7 +35,7 @@ The path to the service manager's control may be specified for situations where
35
35
 
36
36
  ## Matchers
37
37
 
38
- This InSpec audit resource has the following matchers. For a full list of available matchers please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
38
+ For a full list of available matchers please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
39
39
 
40
40
  ### be_enabled
41
41
 
@@ -35,7 +35,7 @@ The path to the service manager's control may be specified for situations where
35
35
 
36
36
  ## Matchers
37
37
 
38
- This InSpec audit resource has the following matchers. For a full list of available matchers please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
38
+ For a full list of available matchers please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
39
39
 
40
40
  ### be_enabled
41
41
 
@@ -64,7 +64,7 @@ The `nginx` user is typically `www-data`, but on CentOS it's `nginx`. The follow
64
64
 
65
65
  ## Matchers
66
66
 
67
- This InSpec audit resource has the following matchers. For a full list of available matchers please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
67
+ For a full list of available matchers please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
68
68
 
69
69
  ### exist
70
70
 
@@ -51,7 +51,7 @@ The following examples show how to use this InSpec audit resource.
51
51
 
52
52
  ## Matchers
53
53
 
54
- This InSpec audit resource has the following matchers. For a full list of available matchers please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
54
+ For a full list of available matchers please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
55
55
 
56
56
  ### exist
57
57
 
@@ -37,7 +37,7 @@ The following examples show how to use this InSpec audit resource.
37
37
 
38
38
  ## Matchers
39
39
 
40
- This InSpec audit resource has the following matchers. For a full list of available matchers please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
40
+ For a full list of available matchers please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
41
41
 
42
42
  ### be_installed
43
43
 
@@ -43,7 +43,7 @@ The following examples show how to use this InSpec audit resource.
43
43
 
44
44
  ## Matchers
45
45
 
46
- This InSpec audit resource has the following matchers. For a full list of available matchers please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
46
+ For a full list of available matchers please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
47
47
 
48
48
  ### be_installed
49
49
 
@@ -90,7 +90,7 @@ All three settings can be tested in the same block as well:
90
90
 
91
91
  ## Matchers
92
92
 
93
- This InSpec audit resource has the following matchers. For a full list of available matchers please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
93
+ For a full list of available matchers please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
94
94
 
95
95
  ### be_enabed
96
96
 
@@ -75,7 +75,7 @@ The following examples show how to use this InSpec audit resource.
75
75
 
76
76
  ## Matchers
77
77
 
78
- This InSpec audit resource has the following matchers. For a full list of available matchers please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
78
+ For a full list of available matchers please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
79
79
 
80
80
  ### name
81
81
 
@@ -59,7 +59,7 @@ The following examples show how to use this InSpec audit resource.
59
59
 
60
60
  ## Matchers
61
61
 
62
- This InSpec audit resource has the following matchers. For a full list of available matchers please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
62
+ For a full list of available matchers please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
63
63
 
64
64
  ### name
65
65
 
@@ -60,7 +60,7 @@ The following examples show how to use this InSpec audit resource.
60
60
 
61
61
  ## Matchers
62
62
 
63
- This InSpec audit resource has the following matchers. For a full list of available matchers please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
63
+ For a full list of available matchers please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
64
64
 
65
65
  ### be_enabled
66
66
 
@@ -9,11 +9,12 @@ $LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
9
9
  require 'inspec/version'
10
10
  require 'inspec/exceptions'
11
11
  require 'inspec/profile'
12
- require 'inspec/rspec_json_formatter'
13
12
  require 'inspec/rule'
14
13
  require 'matchers/matchers'
15
14
  require 'inspec/runner'
16
15
  require 'inspec/shell'
16
+ require 'inspec/formatters'
17
+ require 'inspec/reporters'
17
18
 
18
19
  # all utils that may be required by plugins
19
20
  require 'inspec/base_cli'
@@ -58,7 +58,10 @@ module Inspec
58
58
  option :controls, type: :array,
59
59
  desc: 'A list of controls to run. Ignore all other tests.'
60
60
  option :format, type: :string,
61
- desc: 'Which formatter to use: cli, progress, documentation, json, json-min, junit'
61
+ desc: '[DEPRECATED] Please use --reporter - this will be removed in InSpec 3.0'
62
+ option :reporter, type: :array,
63
+ banner: 'one two:/output/file/path',
64
+ desc: 'Enable one or more output reporters: cli, documentation, html, progress, json, json-min, json-rspec, junit'
62
65
  option :color, type: :boolean,
63
66
  desc: 'Use colors in output.'
64
67
  option :attrs, type: :array,
@@ -71,36 +74,105 @@ module Inspec
71
74
  desc: 'Write out a lockfile based on this execution (unless one already exists)'
72
75
  option :backend_cache, type: :boolean,
73
76
  desc: 'Allow caching for backend command output.'
77
+ option :show_progress, type: :boolean,
78
+ desc: 'Show progress while executing tests.'
74
79
  end
75
80
 
76
81
  def self.default_options
77
82
  {
78
83
  exec: {
84
+ 'reporter' => ['cli'],
85
+ 'show_progress' => false,
79
86
  'color' => true,
80
87
  'create_lockfile' => true,
81
88
  'backend_cache' => false,
82
89
  },
90
+ shell: {
91
+ 'reporter' => ['cli'],
92
+ },
83
93
  }
84
94
  end
85
95
 
86
- private
96
+ def self.parse_reporters(opts)
97
+ # merge in any legacy formats as reporter
98
+ # this method will only be used for ad-hoc runners
99
+ if !opts['format'].nil? && opts['reporter'].nil?
100
+ warn '[DEPRECATED] The option --format is being is being deprecated and will be removed in inspec 3.0. Please use --reporter'
101
+ opts['reporter'] = Array(opts['format'])
102
+ opts.delete('format')
103
+ end
87
104
 
88
- # helper method to run tests
89
- def run_tests(targets, opts)
90
- o = opts.dup
91
- log_device = opts['format'] == 'json' ? nil : STDOUT
92
- o[:logger] = Logger.new(log_device)
93
- o[:logger].level = get_log_level(o.log_level)
105
+ # parse out cli to proper report format
106
+ if opts['reporter'].is_a?(Array)
107
+ reports = {}
108
+ opts['reporter'].each do |report|
109
+ reporter_name, target = report.split(':')
110
+ if target.nil? || target.strip == '-'
111
+ reports[reporter_name] = { 'stdout' => true }
112
+ else
113
+ reports[reporter_name] = {
114
+ 'file' => target,
115
+ 'stdout' => false,
116
+ }
117
+ end
118
+ end
119
+ opts['reporter'] = reports
120
+ end
94
121
 
95
- runner = Inspec::Runner.new(o)
96
- targets.each { |target| runner.add_target(target) }
97
- exit runner.run
98
- rescue ArgumentError, RuntimeError, Train::UserError => e
99
- $stderr.puts e.message
100
- exit 1
122
+ # add in stdout if not specified
123
+ if opts['reporter'].is_a?(Hash)
124
+ opts['reporter'].each do |reporter_name, config|
125
+ opts['reporter'][reporter_name] = {} if config.nil?
126
+ opts['reporter'][reporter_name]['stdout'] = true if opts['reporter'][reporter_name].empty?
127
+ end
128
+ end
129
+
130
+ validate_reporters(opts['reporter'])
131
+ opts
132
+ end
133
+
134
+ def self.validate_reporters(reporters)
135
+ return if reporters.nil?
136
+
137
+ valid_types = [
138
+ 'json',
139
+ 'json-min',
140
+ 'json-rspec',
141
+ 'cli',
142
+ 'junit',
143
+ 'html',
144
+ 'documentation',
145
+ 'progress',
146
+ ]
147
+
148
+ reporters.each do |k, _v|
149
+ raise NotImplementedError, "'#{k}' is not a valid reporter type." unless valid_types.include?(k)
150
+ end
151
+
152
+ # check to make sure we are only reporting one type to stdout
153
+ stdout = 0
154
+ reporters.each_value do |v|
155
+ stdout += 1 if v['stdout'] == true
156
+ end
157
+
158
+ raise ArgumentError, 'The option --reporter can only have a single report outputting to stdout.' if stdout > 1
101
159
  end
102
160
 
103
- def diagnose
161
+ private
162
+
163
+ def suppress_log_output?(opts)
164
+ return false if opts['reporter'].nil?
165
+ match = %w{json json-min json-rspec junit html} & opts['reporter'].keys
166
+ unless match.empty?
167
+ match.each do |m|
168
+ # check to see if we are outputting to stdout
169
+ return true if opts['reporter'][m]['stdout'] == true
170
+ end
171
+ end
172
+ false
173
+ end
174
+
175
+ def diagnose(opts)
104
176
  return unless opts['diagnose']
105
177
  puts "InSpec version: #{Inspec::VERSION}"
106
178
  puts "Train version: #{Train::VERSION}"
@@ -132,15 +204,23 @@ module Inspec
132
204
 
133
205
  def merged_opts(type = nil)
134
206
  opts = {}
207
+ opts[:type] = type unless type.nil?
135
208
 
136
209
  # start with default options if we have any
137
- opts = BaseCLI.default_options[type] unless type.nil?
210
+ opts = BaseCLI.default_options[type] unless type.nil? || BaseCLI.default_options[type].nil?
138
211
 
139
212
  # merge in any options from json-config
140
213
  opts.merge!(options_json)
141
214
 
215
+ # remove the default reporter if we are setting a legacy format on the cli
216
+ opts.delete('reporter') if options['format']
217
+
142
218
  # merge in any options defined via thor
143
219
  opts.merge!(options)
220
+
221
+ # parse reporter options
222
+ opts = BaseCLI.parse_reporters(opts) if %i(exec shell).include?(type)
223
+
144
224
  Thor::CoreExt::HashWithIndifferentAccess.new(opts)
145
225
  end
146
226
 
@@ -210,7 +290,7 @@ module Inspec
210
290
  #
211
291
  loc = if o.log_location
212
292
  o.log_location
213
- elsif %w{json json-min}.include?(o['format'])
293
+ elsif suppress_log_output?(o)
214
294
  STDERR
215
295
  else
216
296
  STDOUT
@@ -221,7 +301,7 @@ module Inspec
221
301
 
222
302
  o[:logger] = Logger.new(STDOUT)
223
303
  # output json if we have activated the json formatter
224
- if opts['log-format'] == 'json'
304
+ if o['log-format'] == 'json'
225
305
  o[:logger].formatter = Logger::JSONFormatter.new
226
306
  end
227
307
  o[:logger].level = get_log_level(o.log_level)
@@ -32,16 +32,22 @@ class Inspec::InspecCLI < Inspec::BaseCLI
32
32
  desc: 'A list of controls to include. Ignore all other tests.'
33
33
  profile_options
34
34
  def json(target)
35
- diagnose
36
35
  o = opts.dup
36
+ diagnose(o)
37
37
  o[:ignore_supports] = true
38
38
  o[:backend] = Inspec::Backend.create(target: 'mock://')
39
39
  o[:check_mode] = true
40
40
 
41
41
  profile = Inspec::Profile.for_target(target, o)
42
+ info = profile.info
43
+ # add in inspec version
44
+ info[:generator] = {
45
+ name: 'inspec',
46
+ version: Inspec::VERSION,
47
+ }
42
48
  dst = o[:output].to_s
43
49
  if dst.empty?
44
- puts JSON.dump(profile.info)
50
+ puts JSON.dump(info)
45
51
  else
46
52
  if File.exist? dst
47
53
  puts "----> updating #{dst}"
@@ -49,7 +55,7 @@ class Inspec::InspecCLI < Inspec::BaseCLI
49
55
  puts "----> creating #{dst}"
50
56
  end
51
57
  fdst = File.expand_path(dst)
52
- File.write(fdst, JSON.dump(profile.info))
58
+ File.write(fdst, JSON.dump(info))
53
59
  end
54
60
  rescue StandardError => e
55
61
  pretty_handle_exception(e)
@@ -59,8 +65,8 @@ class Inspec::InspecCLI < Inspec::BaseCLI
59
65
  option :format, type: :string
60
66
  profile_options
61
67
  def check(path) # rubocop:disable Metrics/AbcSize
62
- diagnose
63
68
  o = opts.dup
69
+ diagnose(o)
64
70
  o[:ignore_supports] = true # we check for integrity only
65
71
  o[:backend] = Inspec::Backend.create(target: 'mock://')
66
72
  o[:check_mode] = true
@@ -69,7 +75,7 @@ class Inspec::InspecCLI < Inspec::BaseCLI
69
75
  profile = Inspec::Profile.for_target(path, o)
70
76
  result = profile.check
71
77
 
72
- if opts['format'] == 'json'
78
+ if o['format'] == 'json'
73
79
  puts JSON.generate(result)
74
80
  else
75
81
  %w{location profile controls timestamp valid}.each do |item|
@@ -128,9 +134,9 @@ class Inspec::InspecCLI < Inspec::BaseCLI
128
134
  option :ignore_errors, type: :boolean, default: false,
129
135
  desc: 'Ignore profile warnings.'
130
136
  def archive(path)
131
- diagnose
132
-
133
137
  o = opts.dup
138
+ diagnose(o)
139
+
134
140
  o[:logger] = Logger.new(STDOUT)
135
141
  o[:logger].level = get_log_level(o.log_level)
136
142
  o[:backend] = Inspec::Backend.create(target: 'mock://')
@@ -138,13 +144,13 @@ class Inspec::InspecCLI < Inspec::BaseCLI
138
144
  profile = Inspec::Profile.for_target(path, o)
139
145
  result = profile.check
140
146
 
141
- if result && !opts[:ignore_errors] == false
147
+ if result && !o[:ignore_errors] == false
142
148
  o[:logger].info 'Profile check failed. Please fix the profile before generating an archive.'
143
149
  return exit 1
144
150
  end
145
151
 
146
152
  # generate archive
147
- exit 1 unless profile.archive(opts)
153
+ exit 1 unless profile.archive(o)
148
154
  rescue StandardError => e
149
155
  pretty_handle_exception(e)
150
156
  end
@@ -152,19 +158,23 @@ class Inspec::InspecCLI < Inspec::BaseCLI
152
158
  desc 'exec PATHS', 'run all test files at the specified PATH.'
153
159
  exec_options
154
160
  def exec(*targets)
155
- diagnose
156
161
  o = opts(:exec).dup
162
+ diagnose(o)
157
163
  configure_logger(o)
158
164
 
159
- # check for deprecated --cache
160
165
  # TODO: REMOVE for inspec 2.0
161
166
  if o.key?('cache')
162
167
  o[:vendor_cache] = o[:cache]
163
168
  o[:logger].warn '[DEPRECATED] The use of `--cache` is being deprecated in InSpec 2.0. Please use `--vendor-cache` instead.'
164
169
  end
165
170
 
166
- # run tests
167
- run_tests(targets, o)
171
+ runner = Inspec::Runner.new(o)
172
+ targets.each { |target| runner.add_target(target) }
173
+
174
+ exit runner.run
175
+ rescue ArgumentError, RuntimeError, Train::UserError => e
176
+ $stderr.puts e.message
177
+ exit 1
168
178
  rescue StandardError => e
169
179
  pretty_handle_exception(e)
170
180
  end
@@ -173,10 +183,10 @@ class Inspec::InspecCLI < Inspec::BaseCLI
173
183
  target_options
174
184
  option :format, type: :string
175
185
  def detect
176
- o = opts.dup
186
+ o = opts(:detect).dup
177
187
  o[:command] = 'os.params'
178
188
  (_, res) = run_command(o)
179
- if opts['format'] == 'json'
189
+ if o['format'] == 'json'
180
190
  puts res.to_json
181
191
  else
182
192
  headline('Operating System Details')
@@ -194,16 +204,18 @@ class Inspec::InspecCLI < Inspec::BaseCLI
194
204
  option :command, aliases: :c,
195
205
  desc: 'A single command string to run instead of launching the shell'
196
206
  option :format, type: :string, default: nil, hide: true,
197
- desc: 'Which formatter to use: cli, documentation, html, json, json-min, junit, progress'
207
+ desc: '[DEPRECATED] Please use --reporter - this will be removed in InSpec 3.0'
208
+ option :reporter, type: :array,
209
+ banner: 'one two:/output/file/path',
210
+ desc: 'Enable one or more output reporters: cli, documentation, html, progress, json, json-min, json-rspec, junit'
198
211
  option :depends, type: :array, default: [],
199
212
  desc: 'A space-delimited list of local folders containing profiles whose libraries and resources will be loaded into the new shell'
200
213
  def shell_func
201
- diagnose
202
- o = opts.dup
214
+ o = opts(:shell).dup
215
+ diagnose(o)
203
216
  o[:debug_shell] = true
204
217
 
205
- json_output = ['json', 'json-min'].include?(opts['format'])
206
- log_device = json_output ? nil : STDOUT
218
+ log_device = suppress_log_output?(o) ? nil : STDOUT
207
219
  o[:logger] = Logger.new(log_device)
208
220
  o[:logger].level = get_log_level(o.log_level)
209
221
 
@@ -216,7 +228,7 @@ class Inspec::InspecCLI < Inspec::BaseCLI
216
228
  exit res unless run_type == :ruby_eval
217
229
 
218
230
  # No InSpec tests - just print evaluation output.
219
- res = (res.respond_to?(:to_json) ? res.to_json : JSON.dump(res)) if json_output
231
+ res = (res.respond_to?(:to_json) ? res.to_json : JSON.dump(res)) if o['reporter']&.keys&.include?('json')
220
232
  puts res
221
233
  exit 0
222
234
  rescue RuntimeError, Train::UserError => e