inspec 0.20.1 → 0.21.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +45 -2
  3. data/docs/dsl_inspec.rst +2 -2
  4. data/docs/resources.rst +9 -9
  5. data/docs/ruby_usage.rst +145 -0
  6. data/inspec.gemspec +1 -0
  7. data/lib/bundles/inspec-compliance/cli.rb +15 -2
  8. data/lib/inspec/cli.rb +23 -10
  9. data/lib/inspec/dsl.rb +0 -52
  10. data/lib/inspec/objects/or_test.rb +1 -0
  11. data/lib/inspec/objects/test.rb +4 -4
  12. data/lib/inspec/profile.rb +76 -61
  13. data/lib/inspec/profile_context.rb +12 -11
  14. data/lib/inspec/rspec_json_formatter.rb +93 -40
  15. data/lib/inspec/rule.rb +7 -29
  16. data/lib/inspec/runner.rb +15 -4
  17. data/lib/inspec/runner_mock.rb +1 -1
  18. data/lib/inspec/runner_rspec.rb +26 -24
  19. data/lib/inspec/version.rb +1 -1
  20. data/lib/matchers/matchers.rb +3 -3
  21. data/lib/resources/auditd_rules.rb +2 -2
  22. data/lib/resources/host.rb +1 -1
  23. data/lib/resources/interface.rb +1 -1
  24. data/lib/resources/kernel_parameter.rb +1 -1
  25. data/lib/resources/mount.rb +2 -1
  26. data/lib/resources/mysql_session.rb +1 -1
  27. data/lib/resources/os_env.rb +2 -2
  28. data/lib/resources/passwd.rb +33 -93
  29. data/lib/resources/port.rb +47 -3
  30. data/lib/resources/processes.rb +3 -3
  31. data/lib/resources/service.rb +33 -1
  32. data/lib/resources/user.rb +15 -15
  33. data/lib/utils/base_cli.rb +1 -3
  34. data/lib/utils/filter.rb +30 -7
  35. data/test/cookbooks/os_prepare/recipes/_upstart_service_centos.rb +4 -0
  36. data/test/functional/helper.rb +1 -0
  37. data/test/functional/inheritance_test.rb +1 -1
  38. data/test/functional/inspec_compliance_test.rb +4 -3
  39. data/test/functional/inspec_exec_json_test.rb +122 -0
  40. data/test/functional/inspec_exec_test.rb +23 -117
  41. data/test/functional/{inspec_json_test.rb → inspec_json_profile_test.rb} +13 -15
  42. data/test/functional/inspec_test.rb +15 -2
  43. data/test/helper.rb +5 -1
  44. data/test/integration/default/auditd_rules_spec.rb +3 -3
  45. data/test/integration/default/kernel_parameter_spec.rb +6 -6
  46. data/test/integration/default/service_spec.rb +4 -0
  47. data/test/resource/command_test.rb +9 -9
  48. data/test/resource/dsl_test.rb +1 -1
  49. data/test/resource/file_test.rb +17 -17
  50. data/test/unit/control_test.rb +1 -1
  51. data/test/unit/mock/cmd/hpux-netstat-inet +10 -0
  52. data/test/unit/mock/cmd/hpux-netstat-inet6 +11 -0
  53. data/test/unit/mock/profiles/skippy-profile-os/controls/one.rb +1 -1
  54. data/test/unit/profile_context_test.rb +2 -2
  55. data/test/unit/profile_test.rb +11 -14
  56. data/test/unit/resources/passwd_test.rb +13 -14
  57. data/test/unit/resources/port_test.rb +14 -0
  58. data/test/unit/resources/processes_test.rb +3 -3
  59. data/test/unit/resources/service_test.rb +103 -39
  60. data/test/unit/utils/filter_table_test.rb +35 -3
  61. metadata +25 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9b3d26c30944b98d35c1e06487c1711b8a6bba52
4
- data.tar.gz: c14acfafa355f63e575c1f7537c8dd8abebb2053
3
+ metadata.gz: 609dd579538c5f1f9a4f86acf691fee0270ad878
4
+ data.tar.gz: c4d6ae9ca27a55efca499a37ee70d71c50e2ff42
5
5
  SHA512:
6
- metadata.gz: 63fc4286cc81c5894332deeff52d9294b533e7f7febfead32eb2ae2351bbfd320deb8db9167974fd153e656e1ce28de4c8fe91084476efd5dc8ba195c3ed8246
7
- data.tar.gz: 44f92719f4699885b9c63d34bb6487d6dd4f6e54443e0e2af65b3c22f6697c4c526336e884922d5bbb393c47e0da47e25e0c9b1b39e1aa2347525387024544c1
6
+ metadata.gz: 29a47097ef98d5ddafc0c145bfff580ac74762538e3de8ef9d5730e210f0a76a478d084acf344f3668b946bee98c03102f8248d4d0632bcc12b5d94cf574b3e9
7
+ data.tar.gz: 65fb88edad1729f9968024c37e9466824d467f290c14f233ca87e70e1792d96cac3a37d9cd36ec2177ac0a64e7f0038225d38911183525e74c4ad23374f68472
@@ -1,7 +1,46 @@
1
1
  # Change Log
2
2
 
3
- ## [0.20.1](https://github.com/chef/inspec/tree/0.20.1) (2016-04-30)
4
- [Full Changelog](https://github.com/chef/inspec/compare/v0.20.0...0.20.1)
3
+ ## [0.21.0](https://github.com/chef/inspec/tree/0.21.0) (2016-05-10)
4
+ [Full Changelog](https://github.com/chef/inspec/compare/v0.20.1...0.21.0)
5
+
6
+ **Implemented enhancements:**
7
+
8
+ - Support nested describe.one blocks [\#711](https://github.com/chef/inspec/issues/711)
9
+ - inspec exec format json backtrace [\#614](https://github.com/chef/inspec/issues/614)
10
+ - Improve error output for compliance plugin [\#544](https://github.com/chef/inspec/issues/544)
11
+ - Cryptic error output if authentication with Chef Compliance fails [\#489](https://github.com/chef/inspec/issues/489)
12
+ - How to access the impact of a test failure? [\#377](https://github.com/chef/inspec/issues/377)
13
+ - Optimize InSpec detect [\#300](https://github.com/chef/inspec/issues/300)
14
+ - document output and/or expected results [\#210](https://github.com/chef/inspec/issues/210)
15
+ - Remove redundant space when missing expectation [\#724](https://github.com/chef/inspec/pull/724) ([alexpop](https://github.com/alexpop))
16
+ - Provide service params [\#721](https://github.com/chef/inspec/pull/721) ([alexpop](https://github.com/alexpop))
17
+ - api: make processes return integers for pid/vsz/rss [\#717](https://github.com/chef/inspec/pull/717) ([arlimus](https://github.com/arlimus))
18
+ - Expose systemd service properties via .info [\#715](https://github.com/chef/inspec/pull/715) ([alexpop](https://github.com/alexpop))
19
+ - Use only strings in resource examples, docs and tests [\#708](https://github.com/chef/inspec/pull/708) ([alexpop](https://github.com/alexpop))
20
+ - use filtertable with passwd resource [\#699](https://github.com/chef/inspec/pull/699) ([arlimus](https://github.com/arlimus))
21
+ - show error if user is not logged in to compliance server [\#696](https://github.com/chef/inspec/pull/696) ([chris-rock](https://github.com/chris-rock))
22
+ - JSON formatter redesign [\#671](https://github.com/chef/inspec/pull/671) ([arlimus](https://github.com/arlimus))
23
+
24
+ **Fixed bugs:**
25
+
26
+ - bugfix: handle train errors in inspec execution [\#705](https://github.com/chef/inspec/pull/705) ([arlimus](https://github.com/arlimus))
27
+
28
+ **Closed issues:**
29
+
30
+ - How do I inherit a profile from another profile? [\#691](https://github.com/chef/inspec/issues/691)
31
+ - How do I download a profile from a compliance server? [\#690](https://github.com/chef/inspec/issues/690)
32
+ - inspec compliance login fails [\#689](https://github.com/chef/inspec/issues/689)
33
+
34
+ **Merged pull requests:**
35
+
36
+ - inspec detect learns human-readable output [\#720](https://github.com/chef/inspec/pull/720) ([chris-rock](https://github.com/chris-rock))
37
+ - Add documentation on how to use ruby [\#718](https://github.com/chef/inspec/pull/718) ([alexpop](https://github.com/alexpop))
38
+ - export \#tests\(\) from OrTest object [\#714](https://github.com/chef/inspec/pull/714) ([arlimus](https://github.com/arlimus))
39
+ - use strings instead of symbols [\#707](https://github.com/chef/inspec/pull/707) ([vjeffrey](https://github.com/vjeffrey))
40
+ - hpux support for basic port properties [\#706](https://github.com/chef/inspec/pull/706) ([Anirudh-Gupta](https://github.com/Anirudh-Gupta))
41
+
42
+ ## [v0.20.1](https://github.com/chef/inspec/tree/v0.20.1) (2016-04-30)
43
+ [Full Changelog](https://github.com/chef/inspec/compare/v0.20.0...v0.20.1)
5
44
 
6
45
  **Implemented enhancements:**
7
46
 
@@ -11,6 +50,10 @@
11
50
 
12
51
  - fix appveyor caching [\#700](https://github.com/chef/inspec/pull/700) ([arlimus](https://github.com/arlimus))
13
52
 
53
+ **Merged pull requests:**
54
+
55
+ - 0.20.1 [\#702](https://github.com/chef/inspec/pull/702) ([alexpop](https://github.com/alexpop))
56
+
14
57
  ## [v0.20.0](https://github.com/chef/inspec/tree/v0.20.0) (2016-04-29)
15
58
  [Full Changelog](https://github.com/chef/inspec/compare/v0.19.3...v0.20.0)
16
59
 
@@ -117,7 +117,7 @@ The following test shows how to audit machines running |mysql| to ensure that pa
117
117
  them to an attacker. Prevent this at all costs.
118
118
  '
119
119
  describe command('env') do
120
- its(:stdout) { should_not match(/^MYSQL_PWD=/) }
120
+ its('stdout') { should_not match(/^MYSQL_PWD=/) }
121
121
  end
122
122
  end
123
123
 
@@ -232,7 +232,7 @@ The following example illustrates various ways to add tags and references to `co
232
232
  .. |inspec resource| replace:: InSpec Resource
233
233
  .. |chef compliance| replace:: Chef Compliance
234
234
  .. |ruby| replace:: Ruby
235
- .. |ruby| replace:: SSH
235
+ .. |ssh| replace:: SSH
236
236
  .. |windows| replace:: Microsoft Windows
237
237
  .. |postgresql| replace:: PostgreSQL
238
238
  .. |apache| replace:: Apache
@@ -364,7 +364,7 @@ The following examples show how to use this InSpec audit resource.
364
364
 
365
365
  # syntax for auditd >= 2.3
366
366
  describe auditd_rules do
367
- its(:lines) { should contain_match(%r{-w /etc/ssh/sshd_config/}) }
367
+ its('lines') { should contain_match(%r{-w /etc/ssh/sshd_config/}) }
368
368
  end
369
369
 
370
370
  The syntax for recent auditd versions allows more precise tests, such as the following:
@@ -386,7 +386,7 @@ The syntax for recent auditd versions allows more precise tests, such as the fol
386
386
  end
387
387
 
388
388
  describe auditd_rules.key('sshd_config') do
389
- its(:permissions) { should contain_match(/x/) }
389
+ its('permissions') { should contain_match(/x/) }
390
390
  end
391
391
 
392
392
  Note that filters can be chained, for example:
@@ -2045,7 +2045,7 @@ The following examples show how to use this InSpec audit resource.
2045
2045
  .. code-block:: ruby
2046
2046
 
2047
2047
  describe kernel_parameter('net.ipv4.conf.all.forwarding') do
2048
- its(:value) { should eq 1 }
2048
+ its('value') { should eq 1 }
2049
2049
  end
2050
2050
 
2051
2051
  **Test if global forwarding is disabled for an IPv6 address**
@@ -2053,7 +2053,7 @@ The following examples show how to use this InSpec audit resource.
2053
2053
  .. code-block:: ruby
2054
2054
 
2055
2055
  describe kernel_parameter('net.ipv6.conf.all.forwarding') do
2056
- its(:value) { should eq 0 }
2056
+ its('value') { should eq 0 }
2057
2057
  end
2058
2058
 
2059
2059
  **Test if an IPv6 address accepts redirects**
@@ -2061,7 +2061,7 @@ The following examples show how to use this InSpec audit resource.
2061
2061
  .. code-block:: ruby
2062
2062
 
2063
2063
  describe kernel_parameter('net.ipv6.conf.interface.accept_redirects') do
2064
- its(:value) { should eq 'true' }
2064
+ its('value') { should eq 'true' }
2065
2065
  end
2066
2066
 
2067
2067
 
@@ -2417,7 +2417,7 @@ The following examples show how to use this InSpec audit resource.
2417
2417
 
2418
2418
  sql = mysql_session('my_user','password')
2419
2419
  describe sql.query('show databases like \'test\';') do
2420
- its(:stdout) { should_not match(/test/) }
2420
+ its('stdout') { should_not match(/test/) }
2421
2421
  end
2422
2422
 
2423
2423
 
@@ -3148,12 +3148,12 @@ A ``passwd`` |inspec resource| block declares one (or more) users and associated
3148
3148
  .. code-block:: ruby
3149
3149
 
3150
3150
  describe passwd do
3151
- its(:users) { should_not include 'forbidden_user' }
3151
+ its('users') { should_not include 'forbidden_user' }
3152
3152
  end
3153
3153
 
3154
3154
  describe passwd.uid(0) do
3155
- its(:users) { should cmp 'root' }
3156
- its(:count) { should eq 1 }
3155
+ its('users') { should cmp 'root' }
3156
+ its('count') { should eq 1 }
3157
3157
  end
3158
3158
 
3159
3159
  where
@@ -0,0 +1,145 @@
1
+ =====================================================
2
+ Using |ruby| in InSpec
3
+ =====================================================
4
+
5
+ The |inspec| DSL is a |ruby| based DSL for writing audit controls, which includes audit resources that you can invoke.
6
+ Core and custom resources are written as regular |ruby| classes which inherit from ``Inspec.resource``.
7
+
8
+ Assuming we have a |json| file like this on the node to be tested:
9
+
10
+ .. code-block:: json
11
+
12
+ {
13
+ "keys":[
14
+ {"username":"john", "key":"/opt/keys/johnd.key"},
15
+ {"username":"jane", "key":"/opt/keys/janed.key"},
16
+ {"username":"sunny ", "key":"/opt/keys/sunnym.key"}
17
+ ]
18
+ }
19
+
20
+ The following example shows how you can use pure |ruby| code(variables, loops, conditionals, regular expressions, etc) to run a few tests against the above |json| file:
21
+
22
+ .. code-block:: ruby
23
+
24
+ control 'check-interns' do
25
+ # use the json inspec resource to get the file
26
+ json_obj = json('/opt/keys/interns.json')
27
+ describe json_obj do
28
+ its('keys') { should_not eq nil }
29
+ end
30
+ if json_obj['keys']
31
+ # loop over the keys array
32
+ json_obj['keys'].each do |intern|
33
+ username = intern['username'].strip
34
+ # check for white spaces chars in usernames
35
+ describe username do
36
+ it { should_not match(/\s/) }
37
+ end
38
+ # check key file owners and permissions
39
+ describe file(intern['key']) do
40
+ it { should be_owned_by username }
41
+ its('mode') { should eq 0600 }
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ Execution
48
+ =====================================================
49
+
50
+ It's important to understand that |ruby| code used in custom resources and controls DSL is executed on the system that runs |inspec|. This allows |inspec| to work without |ruby| and rubygems being required on remote targets(servers or containers).
51
+
52
+ For example, using ```ls``` or ``system('ls')`` will result in the ``ls`` command being run locally and not on the target(remote) system.
53
+ In order to process the output of ``ls`` executed on the target system, use ``inspec.command('ls')`` or ``inspec.powershell('ls')``
54
+
55
+ Similarly, use ``inspec.file(PATH)`` to access files or directories from remote systems in your tests or custom resources.
56
+
57
+ Using rubygems
58
+ =====================================================
59
+
60
+ |ruby| gems are self-contained programs and libraries ...
61
+
62
+
63
+ Interactive Debugging with Pry
64
+ =====================================================
65
+
66
+ Here's a sample |inspec| control that users |ruby| variables to instantiate an |inspec| resource once and use the content in multipLe tests.
67
+
68
+ .. code-block:: ruby
69
+
70
+ control 'check-perl' do
71
+ impact 0.3
72
+ title 'Check perl compiled options and permissions'
73
+ perl_out = command('perl -V')
74
+ #require 'pry'; binding.pry;
75
+ describe perl_out do
76
+ its('exit_status') { should eq 0 }
77
+ its('stdout') { should match (/USE_64_BIT_ALL/) }
78
+ its('stdout') { should match (/useposix=true/) }
79
+ its('stdout') { should match (/-fstack-protector/) }
80
+ end
81
+
82
+ # extract an array of include directories
83
+ perl_inc = perl_out.stdout.partition('@INC:').last.strip.split("\n")
84
+ # ensure include directories are only writable by 'owner'
85
+ perl_inc.each do |path|
86
+ describe directory(path.strip) do
87
+ it { should_not be_writable.by('group') }
88
+ it { should_not be_writable.by('other') }
89
+ end
90
+ end
91
+ end
92
+
93
+ An **advanced** but very useful |ruby| tip. In the previous example, I commented out the ``require 'pry'; binding.pry;`` line. If you remove the ``#`` prefix and run the control, the execution will stop at that line and give you a ``pry`` shell. Use that to troubleshoot, print variables, see methods available, etc. For the above example:
94
+
95
+ .. code-block:: ruby
96
+
97
+ [1] pry> perl_out.exit_status
98
+ => 0
99
+ [2] pry> perl_out.stderr
100
+ => ""
101
+ [3] pry> ls perl_out
102
+ Inspec::Plugins::Resource#methods: inspect
103
+ Inspec::Resources::Cmd#methods: command exist? exit_status result stderr stdout to_s
104
+ Inspec::Plugins::ResourceCommon#methods: resource_skipped skip_resource
105
+ Inspec::Resource::Registry::Command#methods: inspec
106
+ instance variables: @__backend_runner__ @__resource_name__ @command @result
107
+ [4] pry> perl_out.stdout.partition('@INC:').last.strip.split("\n")
108
+ => ["/Library/Perl/5.18/darwin-thread-multi-2level",
109
+ " /Library/Perl/5.18",
110
+ ...REDACTED...
111
+ [5] pry> exit # or abort
112
+
113
+ You can use ``pry`` inside both the controls DSL and resources.
114
+ Similarly, for dev and test, you can use ``inspec shell`` which is based on ``pry``, for example:
115
+
116
+ .. code-block:: ruby
117
+
118
+ $ inspec shell
119
+ Welcome to the interactive InSpec Shell
120
+ To find out how to use it, type: help
121
+
122
+ inspec> command('ls /home/gordon/git/inspec/docs').stdout
123
+ => "ctl_inspec.rst\ndsl_inspec.rst\ndsl_resource.rst\n"
124
+ inspec> command('ls').stdout.split("\n")
125
+ => ["ctl_inspec.rst", "dsl_inspec.rst", "dsl_resource.rst"]
126
+
127
+ inspec> help command
128
+ Name: command
129
+
130
+ Description:
131
+ Use the command InSpec audit resource to test an arbitrary command that is run on the system.
132
+
133
+ Example:
134
+ describe command('ls -al /') do
135
+ it { should exist }
136
+ its('stdout') { should match /bin/ }
137
+ its('stderr') { should eq '' }
138
+ its('exit_status') { should eq 0 }
139
+ end
140
+
141
+ .. |inspec| replace:: InSpec
142
+ .. |chef compliance| replace:: Chef Compliance
143
+ .. |ruby| replace:: Ruby
144
+ .. |csv| replace:: CSV
145
+ .. |json| replace:: JSON
@@ -33,6 +33,7 @@ Gem::Specification.new do |spec|
33
33
  spec.add_dependency 'rspec', '~> 3'
34
34
  spec.add_dependency 'rspec-its', '~> 1.2'
35
35
  spec.add_dependency 'pry', '~> 0'
36
+ spec.add_dependency 'hashie', '~> 3.4'
36
37
 
37
38
  spec.add_development_dependency 'mocha', '~> 1.1'
38
39
  end
@@ -58,6 +58,8 @@ module Compliance
58
58
  desc 'profiles', 'list all available profiles in Chef Compliance'
59
59
  def profiles
60
60
  config = Compliance::Configuration.new
61
+ return if !loggedin(config)
62
+
61
63
  profiles = Compliance::API.profiles(config)
62
64
  if !profiles.empty?
63
65
  # iterate over profiles
@@ -73,6 +75,9 @@ module Compliance
73
75
  desc 'exec PROFILE', 'executes a Chef Compliance profile'
74
76
  exec_options
75
77
  def exec(*tests)
78
+ config = Compliance::Configuration.new
79
+ return if !loggedin(config)
80
+
76
81
  # iterate over tests and add compliance scheme
77
82
  tests = tests.map { |t| 'compliance://' + t }
78
83
 
@@ -84,7 +89,10 @@ module Compliance
84
89
  desc 'upload PATH', 'uploads a local profile to Chef Compliance'
85
90
  option :overwrite, type: :boolean, default: false,
86
91
  desc: 'Overwrite existing profile on Chef Compliance.'
87
- def upload(path) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, PerceivedComplexity
92
+ def upload(path) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, PerceivedComplexity, Metrics/CyclomaticComplexity
93
+ config = Compliance::Configuration.new
94
+ return if !loggedin(config)
95
+
88
96
  unless File.exist?(path)
89
97
  puts "Directory #{path} does not exist."
90
98
  exit 1
@@ -110,7 +118,6 @@ module Compliance
110
118
  end
111
119
 
112
120
  # determine user information
113
- config = Compliance::Configuration.new
114
121
  if config['token'].nil? || config['user'].nil?
115
122
  error.call('Please login via `inspec compliance login`')
116
123
  end
@@ -261,6 +268,12 @@ module Compliance
261
268
 
262
269
  [success, msg]
263
270
  end
271
+
272
+ def loggedin(config)
273
+ serverknown = !config['server'].nil?
274
+ puts 'You need to login first with `inspec compliance login`' if !serverknown
275
+ serverknown
276
+ end
264
277
  end
265
278
 
266
279
  # register the subcommand to Inspec CLI registry
@@ -15,8 +15,6 @@ class Inspec::InspecCLI < Inspec::BaseCLI # rubocop:disable Metrics/ClassLength
15
15
  desc: 'Show diagnostics (versions, configurations)'
16
16
 
17
17
  desc 'json PATH', 'read all tests in PATH and generate a JSON summary'
18
- option :id, type: :string,
19
- desc: 'Attach a profile ID to all test results'
20
18
  option :output, aliases: :o, type: :string,
21
19
  desc: 'Save the created profile to a path'
22
20
  option :controls, type: :array,
@@ -115,9 +113,19 @@ class Inspec::InspecCLI < Inspec::BaseCLI # rubocop:disable Metrics/ClassLength
115
113
 
116
114
  desc 'detect', 'detect the target OS'
117
115
  target_options
116
+ option :format, type: :string
118
117
  def detect
119
- options_json[:command] = 'os.params'
120
- shell_func
118
+ o = opts.dup
119
+ o[:command] = 'os.params'
120
+ res = run_command(o)
121
+ if opts['format'] == 'json'
122
+ puts res.to_json
123
+ else
124
+ headline('Operating System Details')
125
+ %w{name family release arch}.each { |item|
126
+ puts "#{mark_text(item.to_s.capitalize + ':')} #{res[item.to_sym]}"
127
+ }
128
+ end
121
129
  end
122
130
 
123
131
  desc 'shell', 'open an interactive debugging shell'
@@ -129,25 +137,30 @@ class Inspec::InspecCLI < Inspec::BaseCLI # rubocop:disable Metrics/ClassLength
129
137
  o = opts.dup
130
138
  o[:logger] = Logger.new(STDOUT)
131
139
  o[:logger].level = get_log_level(o.log_level)
132
-
133
140
  if o[:command].nil?
134
141
  runner = Inspec::Runner.new(o)
135
142
  return Inspec::Shell.new(runner).start
136
143
  else
137
- opts[:test_collector] = 'mock'
138
- runner = Inspec::Runner.new(opts)
139
- res = runner.create_context.load(o[:command])
144
+ res = run_command(o)
140
145
  jres = res.respond_to?(:to_json) ? res.to_json : JSON.dump(res)
141
146
  puts jres
142
147
  end
143
- rescue RuntimeError => e
144
- puts e.message
148
+ rescue RuntimeError, Train::UserError => e
149
+ $stderr.puts e.message
145
150
  end
146
151
 
147
152
  desc 'version', 'prints the version of this tool'
148
153
  def version
149
154
  puts Inspec::VERSION
150
155
  end
156
+
157
+ private
158
+
159
+ def run_command(opts)
160
+ opts[:test_collector] = 'mock'
161
+ runner = Inspec::Runner.new(opts)
162
+ runner.create_context.load(opts[:command])
163
+ end
151
164
  end
152
165
 
153
166
  # Load all plugins on startup
@@ -31,37 +31,6 @@ module Inspec::DSL
31
31
  end
32
32
  end
33
33
 
34
- # Register a given rule with RSpec and
35
- # let it run. This happens after everything
36
- # else is merged in.
37
- def self.execute_rule(r, profile_id)
38
- checks = ::Inspec::Rule.prepare_checks(r)
39
- fid = InspecBaseRule.full_id(r, profile_id)
40
- checks.each do |m, a, b|
41
- # check if the resource is skippable and skipped
42
- cres = rule_from_check(m, a, b)
43
- set_rspec_ids(cres, fid) if m == 'describe'
44
- end
45
- end
46
-
47
- # merge two rules completely; all defined
48
- # fields from src will be overwritten in dst
49
- def self.merge_rules(dst, src)
50
- InspecBaseRule.merge dst, src
51
- end
52
-
53
- # Attach an ID attribute to the
54
- # metadata of all examples
55
- # TODO: remove this once IDs are in rspec-core
56
- def self.set_rspec_ids(obj, id)
57
- obj.examples.each {|ex|
58
- ex.metadata[:id] = id
59
- }
60
- obj.children.each {|c|
61
- set_rspec_ids(c, id)
62
- }
63
- end
64
-
65
34
  def self.load_spec_files_for_profile(bind_context, opts, &block)
66
35
  # get all spec files
67
36
  target = get_reference_profile(opts[:profile_id], opts[:conf])
@@ -121,24 +90,3 @@ module Inspec::DSL
121
90
  ctx
122
91
  end
123
92
  end
124
-
125
- module Inspec::GlobalDSL
126
- def __register_rule(r)
127
- # make sure the profile id is attached to the rule
128
- ::Inspec::DSL.execute_rule(r, __profile_id)
129
- end
130
-
131
- def __unregister_rule(_id)
132
- end
133
- end
134
-
135
- module Inspec::DSLHelper
136
- def self.bind_dsl(scope)
137
- (class << scope; self; end).class_exec do
138
- include Inspec::DSL
139
- include Inspec::GlobalDSL
140
- end
141
- end
142
- end
143
-
144
- ::Inspec::DSLHelper.bind_dsl(self)