diff --git a/.delivery/build-cookbook/.kitchen.yml b/.delivery/build-cookbook/.kitchen.yml deleted file mode 100644 index 7275c3910..000000000 --- a/.delivery/build-cookbook/.kitchen.yml +++ /dev/null @@ -1,25 +0,0 @@ ---- -driver: - name: vagrant - synced_folders: - - [<%= File.join(ENV['PWD'], '..', '..')%>, '/tmp/repo-data'] - -provisioner: - name: chef_zero - encrypted_data_bag_secret_key_path: 'secrets/fakey-mcfakerton' - data_bags_path: './data_bags' - -platforms: - - name: ubuntu-14.04 - - name: centos-7.1 - -suites: - - name: default - run_list: - - recipe[delivery_build::default] - - recipe[test] - attributes: - delivery_build: - delivery-cli: - artifact: 'https://delivery-packages.s3.amazonaws.com/cli/delivery-cli-20150706022129-1.x86_64.rpm' - checksum: '96ac99ed01466b8deb8d1c7366f4468dabf2282ad6b2ce7da8bd7edbc6ad673f' diff --git a/.delivery/build-cookbook/Berksfile b/.delivery/build-cookbook/Berksfile deleted file mode 100644 index 17ea2b56a..000000000 --- a/.delivery/build-cookbook/Berksfile +++ /dev/null @@ -1,16 +0,0 @@ -# encoding: utf-8 -source 'https://supermarket.chef.io' - -metadata - -cookbook 'delivery-truck', - git: 'https://github.com/chef-cookbooks/delivery-truck.git', - branch: 'master' - -cookbook 'delivery-sugar', - git: 'https://github.com/chef-cookbooks/delivery-sugar.git', - branch: 'master' - -cookbook 'delivery-sugar-extras', - git: 'https://github.com/chef-cookbooks/delivery-sugar-extras.git', - branch: 'master' diff --git a/.delivery/build-cookbook/LICENSE b/.delivery/build-cookbook/LICENSE deleted file mode 100644 index 0e2d85926..000000000 --- a/.delivery/build-cookbook/LICENSE +++ /dev/null @@ -1,3 +0,0 @@ -Copyright 2015 The Authors - -All rights reserved, do not redistribute. diff --git a/.delivery/build-cookbook/README.md b/.delivery/build-cookbook/README.md deleted file mode 100644 index 28eb569c5..000000000 --- a/.delivery/build-cookbook/README.md +++ /dev/null @@ -1,146 +0,0 @@ -# build-cookbook - -A build cookbook for running the parent project through Chef Delivery - -This build cookbook should be customized to suit the needs of the parent project. Using this cookbook can be done outside of Chef Delivery, too. If the parent project is a Chef cookbook, we've detected that and "wrapped" [delivery-truck](https://github.com/chef-cookbooks/delivery-truck). That means it is a dependency, and each of its pipeline phase recipes is included in the appropriate phase recipes in this cookbook. If the parent project is not a cookbook, it's left as an exercise to the reader to customize the recipes as needed for each phase in the pipeline. - -## .delivery/config.json - -In the parent directory to this build-cookbook, the `config.json` can be modified as necessary. For example, phases can be skipped, publishing information can be added, and so on. Refer to customer support or the Chef Delivery documentation for assistance on what options are available for this configuration. - -## Test Kitchen - Local Verify Testing - -This cookbook also has a `.kitchen.yml` which can be used to create local build nodes with Test Kitchen to perform the verification phases, `unit`, `syntax`, and `lint`. When running `kitchen converge`, the instances will be set up like Chef Delivery "build nodes" with the [delivery_build cookbook](https://github.com/chef-cookbooks/delivery_build). The reason for this is to make sure that the same exact kind of nodes are used by this build cookbook are run on the local workstation as would run Delivery. It will run `delivery job verify PHASE` for the parent project. - -Modify the `.kitchen.yml` if necessary to change the platforms or other configuration to run the verify phases. After making changes in the parent project, `cd` into this directory (`.delivery/build-cookbook`), and run: - -``` -kitchen test -``` - -## Recipes - -Each of the recipes in this build-cookbook are run in the named phase during the Chef Delivery pipeline. The `unit`, `syntax`, and `lint` recipes are additionally run when using Test Kitchen for local testing as noted in the above section. - -## Making Changes - Cookbook Example - -When making changes in the parent project (that which lives in `../..` from this directory), or in the recipes in this build cookbook, there is a bespoke workflow for Chef Delivery. As an example, we'll discuss a Chef Cookbook as the parent. - -First, create a new branch for the changes. - -``` -git checkout -b testing-build-cookbook -``` - -Next, increment the version in the metadata.rb. This should be in the *parent*, not in this, the build-cookbook. If this is not done, the verify phase will fail. - -``` -% git diff - --version '0.1.0' -+version '0.1.1' -``` - -The change we'll use for an example is to install the `zsh` package. Write a failing ChefSpec in the cookbook project's `spec/unit/recipes/default_spec.rb`. - -```ruby -require 'spec_helper' - -describe 'godzilla::default' do - context 'When all attributes are default, on an unspecified platform' do - let(:chef_run) do - runner = ChefSpec::ServerRunner.new - runner.converge(described_recipe) - end - - it 'installs zsh' do - expect(chef_run).to install_package('zsh') - end - end -end -``` - -Commit the local changes as work in progress. The `delivery job` expects to use a clean git repository. - -``` -git add ../.. -git commit -m 'WIP: Testing changes' -``` - -From *this* directory (`.delivery/build-cookbook`, relative to the parent cookbook project), run - -``` -cd .delivery/build-cookbook -kitchen converge -``` - -This will take some time at first, because the VMs need to be created, Chef installed, the Delivery CLI installed, etc. Later runs will be faster until they are destroyed. It will also fail on the first VM, as expected, because we wrote the test first. Now edit the parent cookbook project's default recipe to install `zsh`. - -``` -cd ../../ -$EDITOR/recipes/default.rb -``` - -It should look like this: - -``` -package 'zsh' -``` - -Create another commit. - -``` -git add . -git commit -m 'WIP: Install zsh in default recipe' -``` - -Now rerun kitchen from the build-cookbook. - -``` -cd .delivery/build-cookbook -kitchen converge -``` - -This will take awhile because it will now pass on the first VM, and then create the second VM. We should have warned you this was a good time for a coffee break. - -``` -Recipe: test::default - -- execute HOME=/home/vagrant delivery job verify unit --server localhost --ent test --org kitchen - * execute[HOME=/home/vagrant delivery job verify lint --server localhost --ent test --org kitchen] action run - - execute HOME=/home/vagrant delivery job verify lint --server localhost --ent test --org kitchen - - - execute HOME=/home/vagrant delivery job verify syntax --server localhost --ent test --org kitchen - -Running handlers: -Running handlers complete -Chef Client finished, 3/32 resources updated in 54.665445968 seconds -Finished converging (1m26.83s). -``` - -Victory is ours! Our verify phase passed on the build nodes. - -We are ready to run this through our Delivery pipeline. Simply run `delivery review` on the local system from the parent project, and it will open a browser window up to the change we just added. - -``` -cd ../.. -delivery review -``` - -## FAQ - -### Why don't I just run rspec, foodcritic/rubocop, knife cookbook test on my local system? - -An objection to the Test Kitchen approach is that it is much faster to run the unit, lint, and syntax commands for the project on the local system. That is totally true, and also totally valid. Do that for the really fast feedback loop. However, the dance we do with Test Kitchen brings a much higher degree of confidence in the changes we're making, that everything will run on the build nodes in Chef Delivery. We strongly encourage this approach before actually pushing the changes to Delivery. - -### Why do I have to make a commit every time? - -When running `delivery job`, it expects to merge the commit for the changeset against the clean master branch. If we don't save our progress by making a commit, our local changes aren't run through `delivery job` in the Test Kitchen build instances. We can always perform an interactive rebase, and modify the original changeset message in Delivery with `delivery review --edit`. The latter won't modify the git commits, only the changeset in Delivery. - -### What do I do next? - -Make changes in the cookbook project as required for organizational goals and needs. Modify the `build-cookbook` as necessary for the pipeline phases that the cookbook should go through. - -### What if I get stuck? - -Contact Chef Support, or your Chef Customer Success team and they will help you get unstuck. diff --git a/.delivery/build-cookbook/chefignore b/.delivery/build-cookbook/chefignore deleted file mode 100644 index 4ace6023a..000000000 --- a/.delivery/build-cookbook/chefignore +++ /dev/null @@ -1,97 +0,0 @@ -# Put files/directories that should be ignored in this file when uploading -# or sharing to the community site. -# Lines that start with '# ' are comments. - -# OS generated files # -###################### -.DS_Store -Icon? -nohup.out -ehthumbs.db -Thumbs.db - -# SASS # -######## -.sass-cache - -# EDITORS # -########### -\#* -.#* -*~ -*.sw[a-z] -*.bak -REVISION -TAGS* -tmtags -*_flymake.* -*_flymake -*.tmproj -.project -.settings -mkmf.log - -## COMPILED ## -############## -a.out -*.o -*.pyc -*.so -*.com -*.class -*.dll -*.exe -*/rdoc/ - -# Testing # -########### -.watchr -.rspec -spec/* -spec/fixtures/* -test/* -features/* -Guardfile -Procfile -.kitchen/ -.kitchen.local.yml - -# SCM # -####### -.git -*/.git -.gitignore -.gitmodules -.gitconfig -.gitattributes -.svn -*/.bzr/* -*/.hg/* -*/.svn/* - -# Berkshelf # -############# -Berksfile -Berksfile.lock -cookbooks/* -tmp - -# Cookbooks # -############# -CONTRIBUTING - -# Strainer # -############ -Colanderfile -Strainerfile -.colander -.strainer - -# Vagrant # -########### -.vagrant -Vagrantfile - -# Travis # -########## -.travis.yml diff --git a/.delivery/build-cookbook/data_bags/keys/delivery_builder_keys.json b/.delivery/build-cookbook/data_bags/keys/delivery_builder_keys.json deleted file mode 100644 index af375ea86..000000000 --- a/.delivery/build-cookbook/data_bags/keys/delivery_builder_keys.json +++ /dev/null @@ -1 +0,0 @@ -{"id": "delivery_builder_keys"} \ No newline at end of file diff --git a/.delivery/build-cookbook/metadata.rb b/.delivery/build-cookbook/metadata.rb deleted file mode 100644 index b286958ce..000000000 --- a/.delivery/build-cookbook/metadata.rb +++ /dev/null @@ -1,12 +0,0 @@ -name 'build-cookbook' -maintainer 'Dominik Richter' -maintainer_email 'drichter@chef.io' -license 'all_rights' -version '0.1.0' - -depends 'docker', '~> 1.0' -depends 'fancy_execute' -depends 'chef-sugar' -depends 'delivery-truck' -depends 'delivery-sugar' -depends 'delivery-sugar-extras' diff --git a/.delivery/build-cookbook/recipes/default.rb b/.delivery/build-cookbook/recipes/default.rb deleted file mode 100644 index 59b1ba806..000000000 --- a/.delivery/build-cookbook/recipes/default.rb +++ /dev/null @@ -1,37 +0,0 @@ -# encoding: utf-8 -# Cookbook Name:: build-cookbook -# Recipe:: default -# -# Copyright (c) 2015 Chef Software Inc., All Rights Reserved. - -include_recipe 'delivery-truck::default' - -# create a persistant gem cache per builder for the entire project -gem_cache = File.join(node['delivery']['workspace']['root'], "../../../project_gem_cache") -directory gem_cache do - # set the owner to the dbuild so that the other recipes can write to here - owner node['delivery_builder']['build_user'] - mode "0755" - recursive true - action :create -end - -# ensure we always have a docker group with the build user as a member -group 'docker' do - members [node['delivery_builder']['build_user']] -end - -package 'build-essential' - -# get docker -docker_service 'dockerd' do - action [:create, :start] - host 'unix:///var/run/docker.sock' - group 'docker' - provider Chef::Provider::DockerService::Execute -end - -log 'system info' do - message `uname -a; docker --version; ls -lha /var/run/docker.sock` - level :warn -end diff --git a/.delivery/build-cookbook/recipes/deploy.rb b/.delivery/build-cookbook/recipes/deploy.rb deleted file mode 100644 index 0a10ef2ba..000000000 --- a/.delivery/build-cookbook/recipes/deploy.rb +++ /dev/null @@ -1,5 +0,0 @@ -# -# Cookbook Name:: build-cookbook -# Recipe:: default -# -# Copyright (c) 2015 The Authors, All Rights Reserved. diff --git a/.delivery/build-cookbook/recipes/functional.rb b/.delivery/build-cookbook/recipes/functional.rb deleted file mode 100644 index 0a10ef2ba..000000000 --- a/.delivery/build-cookbook/recipes/functional.rb +++ /dev/null @@ -1,5 +0,0 @@ -# -# Cookbook Name:: build-cookbook -# Recipe:: default -# -# Copyright (c) 2015 The Authors, All Rights Reserved. diff --git a/.delivery/build-cookbook/recipes/lint.rb b/.delivery/build-cookbook/recipes/lint.rb deleted file mode 100644 index 248c10574..000000000 --- a/.delivery/build-cookbook/recipes/lint.rb +++ /dev/null @@ -1,14 +0,0 @@ -# -# Cookbook Name:: build-cookbook -# Recipe:: lint -# -# Copyright (c) 2015 Chef Software Inc., All Rights Reserved. -# Author:: Dominik Richter - -include_recipe 'build-cookbook::prepare' - -execute 'rubocop' do - command 'bundle exec rake lint' - cwd node['delivery_builder']['repo'] - user node['delivery_builder']['build_user'] -end diff --git a/.delivery/build-cookbook/recipes/prepare.rb b/.delivery/build-cookbook/recipes/prepare.rb deleted file mode 100644 index 090bd3690..000000000 --- a/.delivery/build-cookbook/recipes/prepare.rb +++ /dev/null @@ -1,20 +0,0 @@ -# -# Cookbook Name:: build-cookbook -# Recipe:: prepare -# -# Copyright (c) 2015 Chef Software Inc., All Rights Reserved. -# Author:: Dominik Richter - -repo_dir = node['delivery_builder']['repo'] -cache_dir = File.join(repo_dir, '.cache') - -directory cache_dir do - owner node['delivery_builder']['build_user'] - mode '0755' -end - -execute 'bundle install' do - command "bundle install --path #{cache_dir} --without integration tools maintenance" - cwd repo_dir - user node['delivery_builder']['build_user'] -end diff --git a/.delivery/build-cookbook/recipes/provision.rb b/.delivery/build-cookbook/recipes/provision.rb deleted file mode 100644 index 0a10ef2ba..000000000 --- a/.delivery/build-cookbook/recipes/provision.rb +++ /dev/null @@ -1,5 +0,0 @@ -# -# Cookbook Name:: build-cookbook -# Recipe:: default -# -# Copyright (c) 2015 The Authors, All Rights Reserved. diff --git a/.delivery/build-cookbook/recipes/publish.rb b/.delivery/build-cookbook/recipes/publish.rb deleted file mode 100644 index 0a10ef2ba..000000000 --- a/.delivery/build-cookbook/recipes/publish.rb +++ /dev/null @@ -1,5 +0,0 @@ -# -# Cookbook Name:: build-cookbook -# Recipe:: default -# -# Copyright (c) 2015 The Authors, All Rights Reserved. diff --git a/.delivery/build-cookbook/recipes/quality.rb b/.delivery/build-cookbook/recipes/quality.rb deleted file mode 100644 index 0a10ef2ba..000000000 --- a/.delivery/build-cookbook/recipes/quality.rb +++ /dev/null @@ -1,5 +0,0 @@ -# -# Cookbook Name:: build-cookbook -# Recipe:: default -# -# Copyright (c) 2015 The Authors, All Rights Reserved. diff --git a/.delivery/build-cookbook/recipes/security.rb b/.delivery/build-cookbook/recipes/security.rb deleted file mode 100644 index 0a10ef2ba..000000000 --- a/.delivery/build-cookbook/recipes/security.rb +++ /dev/null @@ -1,5 +0,0 @@ -# -# Cookbook Name:: build-cookbook -# Recipe:: default -# -# Copyright (c) 2015 The Authors, All Rights Reserved. diff --git a/.delivery/build-cookbook/recipes/smoke.rb b/.delivery/build-cookbook/recipes/smoke.rb deleted file mode 100644 index 0a10ef2ba..000000000 --- a/.delivery/build-cookbook/recipes/smoke.rb +++ /dev/null @@ -1,5 +0,0 @@ -# -# Cookbook Name:: build-cookbook -# Recipe:: default -# -# Copyright (c) 2015 The Authors, All Rights Reserved. diff --git a/.delivery/build-cookbook/recipes/syntax.rb b/.delivery/build-cookbook/recipes/syntax.rb deleted file mode 100644 index 0a10ef2ba..000000000 --- a/.delivery/build-cookbook/recipes/syntax.rb +++ /dev/null @@ -1,5 +0,0 @@ -# -# Cookbook Name:: build-cookbook -# Recipe:: default -# -# Copyright (c) 2015 The Authors, All Rights Reserved. diff --git a/.delivery/build-cookbook/recipes/unit.rb b/.delivery/build-cookbook/recipes/unit.rb deleted file mode 100644 index bd1fe8809..000000000 --- a/.delivery/build-cookbook/recipes/unit.rb +++ /dev/null @@ -1,22 +0,0 @@ -# -# Cookbook Name:: build-cookbook -# Recipe:: unit -# -# Copyright (c) 2015 Chef Software Inc., All Rights Reserved. -# Author:: Dominik Richter - -include_recipe 'build-cookbook::prepare' - -home = node['delivery_builder']['repo'] - -{ - 'mock test resources' => 'rake test', - 'test resources, main docker images' => 'rake test:resources config=test/test.yaml', - 'test resources, extra docker images' => 'rake test:resources config=test/test-extra.yaml', -}.each do |title, test| - execute title do - command 'bundle exec '+test - cwd home - user node['delivery_builder']['build_user'] - end -end diff --git a/.delivery/build-cookbook/test/fixtures/cookbooks/test/metadata.rb b/.delivery/build-cookbook/test/fixtures/cookbooks/test/metadata.rb deleted file mode 100644 index 17250391e..000000000 --- a/.delivery/build-cookbook/test/fixtures/cookbooks/test/metadata.rb +++ /dev/null @@ -1,2 +0,0 @@ -name 'test' -version '0.1.0' \ No newline at end of file diff --git a/.delivery/build-cookbook/test/fixtures/cookbooks/test/recipes/default.rb b/.delivery/build-cookbook/test/fixtures/cookbooks/test/recipes/default.rb deleted file mode 100644 index c26a70a87..000000000 --- a/.delivery/build-cookbook/test/fixtures/cookbooks/test/recipes/default.rb +++ /dev/null @@ -1,7 +0,0 @@ -%w(unit lint syntax).each do |phase| - # TODO: This works on Linux/Unix. Not Windows. - execute "HOME=/home/vagrant delivery job verify #{phase} --server localhost --ent test --org kitchen" do - cwd '/tmp/repo-data' - user 'vagrant' - end -end diff --git a/.delivery/config.json b/.delivery/config.json deleted file mode 100644 index 32fda0536..000000000 --- a/.delivery/config.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "version": "2", - "build_cookbook": { - "name": "build-cookbook", - "path": ".delivery/build-cookbook" - }, - "delivery-truck": { - "publish": { - "github": "chef/vulcanosec" - } - }, - "skip_phases": [ - "syntax", - "security", - "quality", - "smoke", - "deploy" - ], - "build_nodes": { - "unit": ["name:builder-*-7.delivery.chef.co"] - } -} diff --git a/.gitignore b/.gitignore index 13456b256..4cab865a6 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,9 @@ Puppetfile.lock profile.tar.gz omnibus/.cache omnibus/pkg +test/**/*.lock +examples/**/*.lock +habitat/VERSION +habitat/results +/.ruby-gemset +/.ruby-version diff --git a/.kitchen.chef.yml b/.kitchen.chef.yml index d5724743c..619fab5a9 100644 --- a/.kitchen.chef.yml +++ b/.kitchen.chef.yml @@ -61,7 +61,14 @@ platforms: box: chef/solaris-<%= solaris_version %> <% end %> +<% [ '11-sp2-x86_64' ].each do |sles_version| %> +- name: sles-<%= sles_version %> + driver: + box: chef/sles-<%= sles_version %> +<% end %> + suites: - name: default run_list: + - recipe[ssh-hardening] - recipe[os_prepare] diff --git a/.travis.yml b/.travis.yml index 64bf8234d..9069e6233 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,7 @@ cache: bundler dist: trusty services: - docker -bundler_args: "--without integration tools maintenance" +bundler_args: "--without integration tools maintenance deploy" before_install: - gem install bundler - gem update --system 2.4.5 @@ -15,44 +15,48 @@ before_install: matrix: include: - rvm: 1.9.3 - - rvm: 2.0 - - rvm: 2.2 + - rvm: 2.1.8 + - rvm: 2.2.5 + - rvm: 2.3.1 script: bundle exec rake $SUITE - env: SUITE="lint test test:resources config=test/test.yaml" N=2 - - rvm: 2.2 + env: SUITE="lint test test:functional" + - rvm: 2.3.1 script: bundle exec rake $SUITE - env: SUITE="test:functional test:resources config=test/test-extra.yaml" N=2 - - rvm: 2.2 + env: SUITE="test:resources config=test/test.yaml" N=2 + - rvm: 2.3.1 + script: bundle exec rake $SUITE + env: SUITE="test:resources config=test/test-extra.yaml" N=2 + - rvm: 2.3.1 bundler_args: "--without guard tools" script: bundle exec rake $SUITE env: SUITE=test:integration OS=default-ubuntu-1204 DOCKER=true - - rvm: 2.2 + - rvm: 2.3.1 bundler_args: "--without guard tools" script: bundle exec rake $SUITE env: SUITE=test:integration OS='default-ubuntu-1604' DOCKER=true - - rvm: 2.2 + - rvm: 2.3.1 bundler_args: "--without guard tools" script: bundle exec rake $SUITE env: SUITE=test:integration OS='default-centos-68' DOCKER=true - - rvm: 2.2 + - rvm: 2.3.1 bundler_args: "--without guard tools" script: bundle exec rake $SUITE env: SUITE=test:integration OS='default-centos-7' DOCKER=true - - rvm: 2.2 + - rvm: 2.3.1 bundler_args: "--without guard tools" script: bundle exec rake $SUITE env: SUITE=test:integration OS='default-debian-8' DOCKER=true - - rvm: 2.2 + - rvm: 2.3.1 bundler_args: "--without guard tools" script: bundle exec rake $SUITE env: SUITE=test:integration OS='default-oracle-72' DOCKER=true - - rvm: 2.2 + - rvm: 2.3.1 bundler_args: "--without guard tools" script: bundle exec rake $SUITE env: SUITE=test:integration OS='default-fedora-24' DOCKER=true allow_failures: - - env: SUITE="lint test test:resources config=test/test.yaml" N=2 - - env: SUITE="test:functional test:resources config=test/test-extra.yaml" N=2 + - env: SUITE="test:resources config=test/test.yaml" N=2 + - env: SUITE="test:resources config=test/test-extra.yaml" N=2 deploy: provider: rubygems diff --git a/CHANGELOG.md b/CHANGELOG.md index 825566270..9d62922c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,541 @@ # Change Log -## [0.30.0](https://github.com/chef/inspec/tree/0.30.0) (2016-08-12) -[Full Changelog](https://github.com/chef/inspec/compare/v0.29.0...0.30.0) +## [1.3.0](https://github.com/chef/inspec/tree/1.3.0) (2016-10-28) +[Full Changelog](https://github.com/chef/inspec/compare/v1.2.1...1.3.0) + +**Implemented enhancements:** + +- extend the attributes object with helper methods [\#1220](https://github.com/chef/inspec/pull/1220) ([chris-rock](https://github.com/chris-rock)) + +**Fixed bugs:** + +- inetd\_conf resource error [\#1253](https://github.com/chef/inspec/issues/1253) +- Process user should eq \["longusername"\]: usernames get truncated with a '+' at the end [\#995](https://github.com/chef/inspec/issues/995) +- Remove wildcard from windows package detection [\#1259](https://github.com/chef/inspec/pull/1259) ([chris-rock](https://github.com/chris-rock)) +- Fix nil timeout and retries [\#1256](https://github.com/chef/inspec/pull/1256) ([alexpop](https://github.com/alexpop)) +- Supermarket tools get and filter by tool\_type [\#1254](https://github.com/chef/inspec/pull/1254) ([alexpop](https://github.com/alexpop)) +- Fix processes resource user and command truncation [\#1225](https://github.com/chef/inspec/pull/1225) ([alexpop](https://github.com/alexpop)) + +**Closed issues:** + +- inetd and xinetd resources inconsistencies [\#1252](https://github.com/chef/inspec/issues/1252) +- TestKitchen - Duplicate testing when verifier specified in suite definition [\#1240](https://github.com/chef/inspec/issues/1240) +- Document new DCO process in contributing.md [\#1223](https://github.com/chef/inspec/issues/1223) +- Move InSpec Community to https://community-slack.chef.io/ [\#1222](https://github.com/chef/inspec/issues/1222) +- Export Docker package for InSpec from Habitat [\#1212](https://github.com/chef/inspec/issues/1212) +- Test verify action on Windows 2012 fails - \[no implicit conversion of nil into Array\] on default-windows-2012r2 [\#1193](https://github.com/chef/inspec/issues/1193) +- Add InSpec habitat plan [\#843](https://github.com/chef/inspec/issues/843) + +**Merged pull requests:** + +- Use Slack Badge instead of Gitter badge [\#1262](https://github.com/chef/inspec/pull/1262) ([chris-rock](https://github.com/chris-rock)) +- remove accidentally added file [\#1260](https://github.com/chef/inspec/pull/1260) ([chris-rock](https://github.com/chris-rock)) +- overwrite exec for inetd because respec its is executing `exec` [\#1257](https://github.com/chef/inspec/pull/1257) ([chris-rock](https://github.com/chris-rock)) +- Use include instead of match in the error message [\#1248](https://github.com/chef/inspec/pull/1248) ([artem-sidorenko](https://github.com/artem-sidorenko)) +- Code-block directive is not needed here [\#1247](https://github.com/chef/inspec/pull/1247) ([artem-sidorenko](https://github.com/artem-sidorenko)) +- Set the global message to display again [\#1246](https://github.com/chef/inspec/pull/1246) ([ryankeairns](https://github.com/ryankeairns)) +- Ignore RVM files [\#1245](https://github.com/chef/inspec/pull/1245) ([artem-sidorenko](https://github.com/artem-sidorenko)) +- Change global message regarding 10/25 webinar [\#1244](https://github.com/chef/inspec/pull/1244) ([ryankeairns](https://github.com/ryankeairns)) +- Fix issue with registry\_key example [\#1243](https://github.com/chef/inspec/pull/1243) ([seththoenen](https://github.com/seththoenen)) +- Accessing nested mappings in a yam file [\#1242](https://github.com/chef/inspec/pull/1242) ([chriswessells](https://github.com/chriswessells)) +- Fix broken link in README.md [\#1233](https://github.com/chef/inspec/pull/1233) ([swalberg](https://github.com/swalberg)) +- DOCS: fix commit amend dash [\#1232](https://github.com/chef/inspec/pull/1232) ([alexpop](https://github.com/alexpop)) +- Headers and list elements that include more than one `\_` character we… [\#1231](https://github.com/chef/inspec/pull/1231) ([nathenharvey](https://github.com/nathenharvey)) +- Implements profile signing and verification \[Experimental\] [\#1228](https://github.com/chef/inspec/pull/1228) ([metadave](https://github.com/metadave)) +- Document new DCO process [\#1224](https://github.com/chef/inspec/pull/1224) ([chris-rock](https://github.com/chris-rock)) +- adding by\_user permissions support for windows [\#1215](https://github.com/chef/inspec/pull/1215) ([jeremymv2](https://github.com/jeremymv2)) + +## [v1.2.1](https://github.com/chef/inspec/tree/v1.2.1) (2016-10-15) +[Full Changelog](https://github.com/chef/inspec/compare/v1.2.0...v1.2.1) + +**Implemented enhancements:** + +- Show actual value for cmp octal comparisons in string to match expected [\#1211](https://github.com/chef/inspec/pull/1211) ([alexpop](https://github.com/alexpop)) + +**Fixed bugs:** + +- Using "cmp" Against File Mode Fails [\#1188](https://github.com/chef/inspec/issues/1188) +- Unexpected failures with kitchen-inspec and inspec 1.0.0 [\#1187](https://github.com/chef/inspec/issues/1187) +- Rspec deprecation warnings added to test summary creating invalid json file [\#952](https://github.com/chef/inspec/issues/952) +- update train to fix empty target URIs [\#1221](https://github.com/chef/inspec/pull/1221) ([arlimus](https://github.com/arlimus)) + +**Closed issues:** + +- www: typo on inspec.io [\#1197](https://github.com/chef/inspec/issues/1197) + +**Merged pull requests:** + +- move Inspec Habitat package to chef/inspec. [\#1216](https://github.com/chef/inspec/pull/1216) ([metadave](https://github.com/metadave)) +- fix kitchen-inspec integration-1187 [\#1213](https://github.com/chef/inspec/pull/1213) ([vjeffrey](https://github.com/vjeffrey)) +- Website: Fix typo in homepage code image [\#1210](https://github.com/chef/inspec/pull/1210) ([magwalk](https://github.com/magwalk)) + +## [v1.2.0](https://github.com/chef/inspec/tree/v1.2.0) (2016-10-10) +[Full Changelog](https://github.com/chef/inspec/compare/v1.1.0...v1.2.0) + +**Implemented enhancements:** + +- Support of linux mint or OS detection via distro families [\#280](https://github.com/chef/inspec/issues/280) +- Support of Linux Mint [\#1209](https://github.com/chef/inspec/pull/1209) ([artem-sidorenko](https://github.com/artem-sidorenko)) + +**Fixed bugs:** + +- Online tutorial: weird behavior with backspace, invalid commands [\#1184](https://github.com/chef/inspec/issues/1184) +- parse\_config and parse\_config\_file does not show fully info when test fails \(or even if it succedes\) [\#1147](https://github.com/chef/inspec/issues/1147) +- www: Online tutorial: safari inspec online demo bug! [\#1086](https://github.com/chef/inspec/issues/1086) +- cmp code\_desc missing operation and expected valid [\#1204](https://github.com/chef/inspec/pull/1204) ([alexpop](https://github.com/alexpop)) + +**Closed issues:** + +- Resources on `http://inspec.io/docs/reference/resources/` are not in alphabetical order [\#1195](https://github.com/chef/inspec/issues/1195) +- www: Online tutorial: update inspec tutorial to 1.0.0 version [\#1169](https://github.com/chef/inspec/issues/1169) + +**Merged pull requests:** + +- fix backspace bug [\#1206](https://github.com/chef/inspec/pull/1206) ([vjeffrey](https://github.com/vjeffrey)) +- es5. that is a thing. [\#1191](https://github.com/chef/inspec/pull/1191) ([vjeffrey](https://github.com/vjeffrey)) +- tutorial response filename length [\#1159](https://github.com/chef/inspec/pull/1159) ([chris-rock](https://github.com/chris-rock)) + +## [v1.1.0](https://github.com/chef/inspec/tree/v1.1.0) (2016-10-05) +[Full Changelog](https://github.com/chef/inspec/compare/v1.0.0...v1.1.0) + +**Fixed bugs:** + +- InSpec in Visibility [\#1117](https://github.com/chef/inspec/issues/1117) +- inspec exec on tar.gz with local library requirements doesn't work [\#779](https://github.com/chef/inspec/issues/779) +- parse\_config\_file fails when it encounters a '\[' [\#687](https://github.com/chef/inspec/issues/687) +- use mock backend for inspec vendor/check/json [\#1202](https://github.com/chef/inspec/pull/1202) ([arlimus](https://github.com/arlimus)) +- bugfix: support nil entries in filter table [\#1201](https://github.com/chef/inspec/pull/1201) ([arlimus](https://github.com/arlimus)) +- bugfix: always use the mock backend for inspec archive [\#1200](https://github.com/chef/inspec/pull/1200) ([arlimus](https://github.com/arlimus)) +- Missing registry keys should not exist [\#1199](https://github.com/chef/inspec/pull/1199) ([alexpop](https://github.com/alexpop)) +- bugfix: use correct logger in cli [\#1198](https://github.com/chef/inspec/pull/1198) ([arlimus](https://github.com/arlimus)) + +**Closed issues:** + +- registry\_key ignores failed Get-Item, always "exists" [\#1196](https://github.com/chef/inspec/issues/1196) +- www: Online tutorial doesn't load \(not building\) [\#1182](https://github.com/chef/inspec/issues/1182) +- Issue locally running an inspec check on a service resource [\#1176](https://github.com/chef/inspec/issues/1176) +- Demo at `http://inspec.io/` stuck on `Loading` [\#1165](https://github.com/chef/inspec/issues/1165) +- Confusing reporter output with inherited profiles [\#1071](https://github.com/chef/inspec/issues/1071) +- Provide clear error message if dependency is not available [\#1069](https://github.com/chef/inspec/issues/1069) +- Dependencies: Design UX for scoping of attributes and resources [\#1057](https://github.com/chef/inspec/issues/1057) +- RFC Dependencies [\#888](https://github.com/chef/inspec/issues/888) + +**Merged pull requests:** + +- Remove pre-1.0 warning from meta-profile [\#1194](https://github.com/chef/inspec/pull/1194) ([chris-rock](https://github.com/chris-rock)) +- Add shell options [\#1192](https://github.com/chef/inspec/pull/1192) ([jonathanmorley](https://github.com/jonathanmorley)) +- Website: Fix buggy behavior in nav and add global message [\#1190](https://github.com/chef/inspec/pull/1190) ([magwalk](https://github.com/magwalk)) +- add example for yumconf-like structured files [\#1185](https://github.com/chef/inspec/pull/1185) ([vjeffrey](https://github.com/vjeffrey)) +- add sanity checks and fail build process if requirements aren't met [\#1183](https://github.com/chef/inspec/pull/1183) ([arlimus](https://github.com/arlimus)) +- tp/learn links [\#1181](https://github.com/chef/inspec/pull/1181) ([tpetchel](https://github.com/tpetchel)) +- include control section in instructions [\#1180](https://github.com/chef/inspec/pull/1180) ([vjeffrey](https://github.com/vjeffrey)) +- Changing headings to align with SEO best practices [\#1179](https://github.com/chef/inspec/pull/1179) ([davidwrede](https://github.com/davidwrede)) +- move inquirer to deploy [\#1178](https://github.com/chef/inspec/pull/1178) ([vjeffrey](https://github.com/vjeffrey)) +- Ignore lockfiles in example profiles [\#1177](https://github.com/chef/inspec/pull/1177) ([stevendanna](https://github.com/stevendanna)) +- Remove default parameter in `updateInstructions\(\)` [\#1175](https://github.com/chef/inspec/pull/1175) ([jerryaldrichiii](https://github.com/jerryaldrichiii)) +- Website: Fix docs nav functionality and optimize for mobile [\#1174](https://github.com/chef/inspec/pull/1174) ([magwalk](https://github.com/magwalk)) +- Adds segment [\#1172](https://github.com/chef/inspec/pull/1172) ([cwebberOps](https://github.com/cwebberOps)) +- print profile info before test results \(inherited profiles\) [\#1170](https://github.com/chef/inspec/pull/1170) ([vjeffrey](https://github.com/vjeffrey)) +- www: fix wording [\#1168](https://github.com/chef/inspec/pull/1168) ([arlimus](https://github.com/arlimus)) +- Update dependency documentation and mention the lockfile [\#1167](https://github.com/chef/inspec/pull/1167) ([alexpop](https://github.com/alexpop)) + +## [v1.0.0](https://github.com/chef/inspec/tree/v1.0.0) (2016-09-26) +[Full Changelog](https://github.com/chef/inspec/compare/v1.0.0.beta3...v1.0.0) + +**Implemented enhancements:** + +- InSpec OS package [\#646](https://github.com/chef/inspec/issues/646) +- replace wmi win32\_useraccount with adsi users [\#1149](https://github.com/chef/inspec/pull/1149) ([chris-rock](https://github.com/chris-rock)) + +**Fixed bugs:** + +- README.md has broken link to non-existent file [\#1136](https://github.com/chef/inspec/issues/1136) + +**Merged pull requests:** + +- update omnibus images [\#1164](https://github.com/chef/inspec/pull/1164) ([chris-rock](https://github.com/chris-rock)) +- website / tutorial interaction [\#1163](https://github.com/chef/inspec/pull/1163) ([chris-rock](https://github.com/chris-rock)) +- fix buttons on community page [\#1162](https://github.com/chef/inspec/pull/1162) ([arlimus](https://github.com/arlimus)) +- fix alignment of community buttons [\#1161](https://github.com/chef/inspec/pull/1161) ([arlimus](https://github.com/arlimus)) +- Fix require\_controls DSL method [\#1160](https://github.com/chef/inspec/pull/1160) ([stevendanna](https://github.com/stevendanna)) +- Document the require\_resource function [\#1158](https://github.com/chef/inspec/pull/1158) ([stevendanna](https://github.com/stevendanna)) +- fix css in docs search [\#1157](https://github.com/chef/inspec/pull/1157) ([arlimus](https://github.com/arlimus)) +- update www readme for releasing the site [\#1156](https://github.com/chef/inspec/pull/1156) ([arlimus](https://github.com/arlimus)) +- Fix minor typo in sys\_info documentation [\#1155](https://github.com/chef/inspec/pull/1155) ([stevendanna](https://github.com/stevendanna)) +- fix outdated link in readme [\#1154](https://github.com/chef/inspec/pull/1154) ([arlimus](https://github.com/arlimus)) +- fix minor website bugs [\#1153](https://github.com/chef/inspec/pull/1153) ([arlimus](https://github.com/arlimus)) +- clean www before releasing [\#1152](https://github.com/chef/inspec/pull/1152) ([arlimus](https://github.com/arlimus)) +- add docs to the website [\#1151](https://github.com/chef/inspec/pull/1151) ([arlimus](https://github.com/arlimus)) +- return empty array for known privileges [\#1150](https://github.com/chef/inspec/pull/1150) ([chris-rock](https://github.com/chris-rock)) +- Extend example for parse\_config.rb [\#1148](https://github.com/chef/inspec/pull/1148) ([nvtkaszpir](https://github.com/nvtkaszpir)) +- Bump lockfile version to 1.0 [\#1141](https://github.com/chef/inspec/pull/1141) ([stevendanna](https://github.com/stevendanna)) +- Improve error messages from compliance fetcher [\#1126](https://github.com/chef/inspec/pull/1126) ([stevendanna](https://github.com/stevendanna)) + +## [v1.0.0.beta3](https://github.com/chef/inspec/tree/v1.0.0.beta3) (2016-09-25) +[Full Changelog](https://github.com/chef/inspec/compare/v1.0.0.beta2...v1.0.0.beta3) + +**Implemented enhancements:** + +- Improve lockfile handling [\#1070](https://github.com/chef/inspec/issues/1070) +- Show skip\_message and correct title [\#1109](https://github.com/chef/inspec/pull/1109) ([alexpop](https://github.com/alexpop)) + +**Fixed bugs:** + +- InSpec CLI output not showing skip message when control title is defined [\#1097](https://github.com/chef/inspec/issues/1097) +- bugfix: there is one more button to start the online demo [\#1140](https://github.com/chef/inspec/pull/1140) ([arlimus](https://github.com/arlimus)) + +**Closed issues:** + +- add docs to inspec.io [\#1119](https://github.com/chef/inspec/issues/1119) +- Cache key for dependencies needs to be based on content hash for urls [\#1066](https://github.com/chef/inspec/issues/1066) + +**Merged pull requests:** + +- Enable builds on both Windows and \*nix [\#1145](https://github.com/chef/inspec/pull/1145) ([scotthain](https://github.com/scotthain)) +- Website: Minor edits in preparation for launch [\#1144](https://github.com/chef/inspec/pull/1144) ([magwalk](https://github.com/magwalk)) +- Truncate long filename. Temporary fix [\#1143](https://github.com/chef/inspec/pull/1143) ([stevendanna](https://github.com/stevendanna)) +- add variables to each loops [\#1142](https://github.com/chef/inspec/pull/1142) ([chris-rock](https://github.com/chris-rock)) +- embed tutorial in website [\#1139](https://github.com/chef/inspec/pull/1139) ([arlimus](https://github.com/arlimus)) +- scope all tutorial assets [\#1138](https://github.com/chef/inspec/pull/1138) ([arlimus](https://github.com/arlimus)) +- add build task for online tutorial with all assets [\#1137](https://github.com/chef/inspec/pull/1137) ([arlimus](https://github.com/arlimus)) +- implement filter table for group/groups resource [\#1135](https://github.com/chef/inspec/pull/1135) ([chris-rock](https://github.com/chris-rock)) +- fix minor typos in user resource [\#1134](https://github.com/chef/inspec/pull/1134) ([chris-rock](https://github.com/chris-rock)) +- Website Copy Edits [\#1133](https://github.com/chef/inspec/pull/1133) ([magwalk](https://github.com/magwalk)) +- add build tasks for www [\#1132](https://github.com/chef/inspec/pull/1132) ([arlimus](https://github.com/arlimus)) +- add resources.md doc generation [\#1130](https://github.com/chef/inspec/pull/1130) ([arlimus](https://github.com/arlimus)) +- add all resources to docs [\#1129](https://github.com/chef/inspec/pull/1129) ([arlimus](https://github.com/arlimus)) +- reorder and fix sidebar contents for docs [\#1128](https://github.com/chef/inspec/pull/1128) ([arlimus](https://github.com/arlimus)) +- add ruby usage in inspec as markdown [\#1127](https://github.com/chef/inspec/pull/1127) ([arlimus](https://github.com/arlimus)) +- Add markdown docs [\#1125](https://github.com/chef/inspec/pull/1125) ([arlimus](https://github.com/arlimus)) +- Avoid spurious downloads during dependency management [\#1124](https://github.com/chef/inspec/pull/1124) ([stevendanna](https://github.com/stevendanna)) +- Website Design Fixes [\#1123](https://github.com/chef/inspec/pull/1123) ([magwalk](https://github.com/magwalk)) + +## [v1.0.0.beta2](https://github.com/chef/inspec/tree/v1.0.0.beta2) (2016-09-22) +[Full Changelog](https://github.com/chef/inspec/compare/v1.0.0.pre.beta1...v1.0.0.beta2) + +**Implemented enhancements:** + +- kernel\_parameter does not show fully info when test fails [\#1093](https://github.com/chef/inspec/issues/1093) +- InSpec html demo [\#851](https://github.com/chef/inspec/issues/851) +- Counting and status of controls without tests [\#849](https://github.com/chef/inspec/issues/849) +- supports does not mark resources as skipped [\#354](https://github.com/chef/inspec/issues/354) +- `include Inspec::DSL` anywhere [\#271](https://github.com/chef/inspec/issues/271) +- Suse Support [\#113](https://github.com/chef/inspec/issues/113) +- Update the username and password login method [\#1095](https://github.com/chef/inspec/pull/1095) ([alexpop](https://github.com/alexpop)) + +**Fixed bugs:** + +- InSpec in Workflow [\#1115](https://github.com/chef/inspec/issues/1115) +- uninstalled package shows as installed [\#1092](https://github.com/chef/inspec/issues/1092) +- undefined method `send\_request' for Compliance::API:Class [\#1088](https://github.com/chef/inspec/issues/1088) +- \[package\] Regression on Windows 2008R2 [\#998](https://github.com/chef/inspec/issues/998) +- \[script\] Is there a limit on the number of char's within a script block [\#539](https://github.com/chef/inspec/issues/539) +- Use parenthesis when passing regular expressions [\#1106](https://github.com/chef/inspec/pull/1106) ([alexpop](https://github.com/alexpop)) +- Include code description in the output of failed controls [\#1096](https://github.com/chef/inspec/pull/1096) ([alexpop](https://github.com/alexpop)) +- Update the username and password login method [\#1095](https://github.com/chef/inspec/pull/1095) ([alexpop](https://github.com/alexpop)) + +**Closed issues:** + +- Package Resource isn't searching 64-bit Registry Hives [\#1100](https://github.com/chef/inspec/issues/1100) +- demo improvements [\#1089](https://github.com/chef/inspec/issues/1089) +- Dependencies: All resources are scoped [\#1058](https://github.com/chef/inspec/issues/1058) +- Improve InSpec tutorial [\#1045](https://github.com/chef/inspec/issues/1045) +- 1.10.2 has an extra space in pip package output [\#1043](https://github.com/chef/inspec/issues/1043) +- Follow up to 1013: find\_files\(\) errors still occurring for apache\_conf resource after 0.33.0 upgrade [\#1030](https://github.com/chef/inspec/issues/1030) +- MVP in-browser inspec demo [\#957](https://github.com/chef/inspec/issues/957) +- Failing tests in inherited tests are not displayed [\#899](https://github.com/chef/inspec/issues/899) + +**Merged pull requests:** + +- Use the gem version for the omnibus package version [\#1122](https://github.com/chef/inspec/pull/1122) ([yzl](https://github.com/yzl)) +- Add legal pages [\#1121](https://github.com/chef/inspec/pull/1121) ([magwalk](https://github.com/magwalk)) +- update docs to markdown [\#1120](https://github.com/chef/inspec/pull/1120) ([arlimus](https://github.com/arlimus)) +- add readme to www-build [\#1118](https://github.com/chef/inspec/pull/1118) ([arlimus](https://github.com/arlimus)) +- Always write lockfiles for local top-level profiles [\#1116](https://github.com/chef/inspec/pull/1116) ([stevendanna](https://github.com/stevendanna)) +- Add `--cache` option to `inspec exec` [\#1113](https://github.com/chef/inspec/pull/1113) ([stevendanna](https://github.com/stevendanna)) +- fix double-space in pip to\_s resource [\#1112](https://github.com/chef/inspec/pull/1112) ([chris-rock](https://github.com/chris-rock)) +- fixes debian package manager and some of the code examples [\#1111](https://github.com/chef/inspec/pull/1111) ([Anirudh-Gupta](https://github.com/Anirudh-Gupta)) +- Add main site footer [\#1110](https://github.com/chef/inspec/pull/1110) ([magwalk](https://github.com/magwalk)) +- Add community and tutorials pages [\#1108](https://github.com/chef/inspec/pull/1108) ([magwalk](https://github.com/magwalk)) +- Add homepage content and styles [\#1107](https://github.com/chef/inspec/pull/1107) ([magwalk](https://github.com/magwalk)) +- Styling setup and main navigation [\#1105](https://github.com/chef/inspec/pull/1105) ([magwalk](https://github.com/magwalk)) +- docs task and rst/md formatter separation [\#1104](https://github.com/chef/inspec/pull/1104) ([arlimus](https://github.com/arlimus)) +- Fail if a remote source content doesn't match lockfile [\#1103](https://github.com/chef/inspec/pull/1103) ([stevendanna](https://github.com/stevendanna)) +- Optimize tutorial [\#1101](https://github.com/chef/inspec/pull/1101) ([chris-rock](https://github.com/chris-rock)) +- Build with master of omnibus [\#1099](https://github.com/chef/inspec/pull/1099) ([yzl](https://github.com/yzl)) +- use Gem::Version instead of a regular expression for a test version bump [\#1098](https://github.com/chef/inspec/pull/1098) ([chris-rock](https://github.com/chris-rock)) +- fix demo instructions [\#1094](https://github.com/chef/inspec/pull/1094) ([vjeffrey](https://github.com/vjeffrey)) +- Allow users to reference resources from dependencies [\#1080](https://github.com/chef/inspec/pull/1080) ([stevendanna](https://github.com/stevendanna)) +- In ApacheConf\#include\_files, check for abs paths [\#1042](https://github.com/chef/inspec/pull/1042) ([davidcpell](https://github.com/davidcpell)) + +## [v1.0.0.pre.beta1](https://github.com/chef/inspec/tree/v1.0.0.pre.beta1) (2016-09-19) +[Full Changelog](https://github.com/chef/inspec/compare/v0.35.0...v1.0.0.pre.beta1) + +**Implemented enhancements:** + +- InSpec output for summary needs to count controls [\#852](https://github.com/chef/inspec/issues/852) +- ssl resource to use inspec.backend.hostname and require train 0.19.1 [\#1084](https://github.com/chef/inspec/pull/1084) ([alexpop](https://github.com/alexpop)) +- optimize command simulator auto-generation [\#1078](https://github.com/chef/inspec/pull/1078) ([chris-rock](https://github.com/chris-rock)) + +**Closed issues:** + +- proper scrolling of terminal [\#1053](https://github.com/chef/inspec/issues/1053) + +**Merged pull requests:** + +- fix inspec shell handling [\#1090](https://github.com/chef/inspec/pull/1090) ([vjeffrey](https://github.com/vjeffrey)) +- update responses [\#1087](https://github.com/chef/inspec/pull/1087) ([vjeffrey](https://github.com/vjeffrey)) +- print profile summary and test summary [\#1083](https://github.com/chef/inspec/pull/1083) ([vjeffrey](https://github.com/vjeffrey)) +- Fix minor typo in documentation [\#1082](https://github.com/chef/inspec/pull/1082) ([Dispader](https://github.com/Dispader)) +- uglify wepack content, kudos @chris-rock [\#1081](https://github.com/chef/inspec/pull/1081) ([arlimus](https://github.com/arlimus)) +- Static keys in all json [\#811](https://github.com/chef/inspec/pull/811) ([arlimus](https://github.com/arlimus)) + +## [v0.35.0](https://github.com/chef/inspec/tree/v0.35.0) (2016-09-16) +[Full Changelog](https://github.com/chef/inspec/compare/v0.34.1...v0.35.0) + +**Fixed bugs:** + +- resource dsl not loded properly inside describe blocks [\#1074](https://github.com/chef/inspec/issues/1074) + +**Closed issues:** + +- online demo: check style of tutorial text [\#1054](https://github.com/chef/inspec/issues/1054) +- online demo: clear \(linux\) and cls \(windows\) command to clear the terminal [\#1052](https://github.com/chef/inspec/issues/1052) +- respect inspec.yml supports with include\_controls [\#1049](https://github.com/chef/inspec/issues/1049) +- Simplify dependency in inspec.yml [\#1048](https://github.com/chef/inspec/issues/1048) + +**Merged pull requests:** + +- Process transitive dependencies from lock file [\#1079](https://github.com/chef/inspec/pull/1079) ([stevendanna](https://github.com/stevendanna)) +- Don't gpg-sign commits during tests [\#1077](https://github.com/chef/inspec/pull/1077) ([stevendanna](https://github.com/stevendanna)) +- Ensure resources are visible inside its blocks [\#1076](https://github.com/chef/inspec/pull/1076) ([stevendanna](https://github.com/stevendanna)) +- add gulp build pipeline to online demo [\#1075](https://github.com/chef/inspec/pull/1075) ([arlimus](https://github.com/arlimus)) +- inspec simulator [\#1073](https://github.com/chef/inspec/pull/1073) ([chris-rock](https://github.com/chris-rock)) +- Skip controls from profiles that don't support the current platform [\#1072](https://github.com/chef/inspec/pull/1072) ([stevendanna](https://github.com/stevendanna)) +- add tutorials \(references\) to the site skeleton [\#1068](https://github.com/chef/inspec/pull/1068) ([arlimus](https://github.com/arlimus)) +- Vj/improve demo [\#1065](https://github.com/chef/inspec/pull/1065) ([vjeffrey](https://github.com/vjeffrey)) +- Provide inspec.yml shortcut syntax [\#1064](https://github.com/chef/inspec/pull/1064) ([stevendanna](https://github.com/stevendanna)) + +## [v0.34.1](https://github.com/chef/inspec/tree/v0.34.1) (2016-09-13) +[Full Changelog](https://github.com/chef/inspec/compare/v0.34.0...v0.34.1) + +**Fixed bugs:** + +- Force encoding in bin only [\#1062](https://github.com/chef/inspec/pull/1062) ([chris-rock](https://github.com/chris-rock)) + +**Merged pull requests:** + +- Fixup rubocop violation in www/ [\#1067](https://github.com/chef/inspec/pull/1067) ([stevendanna](https://github.com/stevendanna)) +- add homepage skeleton [\#1063](https://github.com/chef/inspec/pull/1063) ([arlimus](https://github.com/arlimus)) + +## [v0.34.0](https://github.com/chef/inspec/tree/v0.34.0) (2016-09-12) +[Full Changelog](https://github.com/chef/inspec/compare/v0.33.2...v0.34.0) + +**Implemented enhancements:** + +- Vendor Github and Supermarket dependencies [\#959](https://github.com/chef/inspec/issues/959) +- use simple config for security policy resource [\#1044](https://github.com/chef/inspec/pull/1044) ([chris-rock](https://github.com/chris-rock)) +- identify enabled/disabled accounts for windows [\#1039](https://github.com/chef/inspec/pull/1039) ([chris-rock](https://github.com/chris-rock)) + +**Closed issues:** + +- Compliance should allow the ability to upload the unconverted SCAP profiles from the agencies. [\#1055](https://github.com/chef/inspec/issues/1055) +- Multiple matchers in a describe block display only a single line [\#1025](https://github.com/chef/inspec/issues/1025) +- Create all content for inspec homepage demo [\#1021](https://github.com/chef/inspec/issues/1021) +- User resource should use Filtertable [\#948](https://github.com/chef/inspec/issues/948) + +**Merged pull requests:** + +- rename example to meta-profile [\#1051](https://github.com/chef/inspec/pull/1051) ([chris-rock](https://github.com/chris-rock)) +- fix webpack start script for tutorial [\#1050](https://github.com/chef/inspec/pull/1050) ([vjeffrey](https://github.com/vjeffrey)) +- Add Inspec::Fetcher\#relative\_target for compatibility [\#1046](https://github.com/chef/inspec/pull/1046) ([stevendanna](https://github.com/stevendanna)) +- Typo supermarket -\> compliance [\#1041](https://github.com/chef/inspec/pull/1041) ([stevendanna](https://github.com/stevendanna)) +- Improve duplicate and cycle detection in resolver [\#1038](https://github.com/chef/inspec/pull/1038) ([stevendanna](https://github.com/stevendanna)) +- Add example of corporate profile [\#1037](https://github.com/chef/inspec/pull/1037) ([stevendanna](https://github.com/stevendanna)) +- Ensure simplecov starts before everything else [\#1036](https://github.com/chef/inspec/pull/1036) ([stevendanna](https://github.com/stevendanna)) +- add sys\_info resource to get information about the hostname [\#1035](https://github.com/chef/inspec/pull/1035) ([chris-rock](https://github.com/chris-rock)) +- Add GitFetcher and rework Fetchers+SourceReaders [\#1034](https://github.com/chef/inspec/pull/1034) ([stevendanna](https://github.com/stevendanna)) +- add demo content [\#1033](https://github.com/chef/inspec/pull/1033) ([vjeffrey](https://github.com/vjeffrey)) +- add health graphs [\#1032](https://github.com/chef/inspec/pull/1032) ([arlimus](https://github.com/arlimus)) +- fix table formatting in readme [\#1031](https://github.com/chef/inspec/pull/1031) ([arlimus](https://github.com/arlimus)) +- remove old delivery tests [\#1029](https://github.com/chef/inspec/pull/1029) ([arlimus](https://github.com/arlimus)) +- make demo better [\#1015](https://github.com/chef/inspec/pull/1015) ([vjeffrey](https://github.com/vjeffrey)) +- user resource should support filtertable [\#990](https://github.com/chef/inspec/pull/990) ([ksubrama](https://github.com/ksubrama)) + +## [v0.33.2](https://github.com/chef/inspec/tree/v0.33.2) (2016-09-07) +[Full Changelog](https://github.com/chef/inspec/compare/v0.33.1...v0.33.2) + +**Implemented enhancements:** + +- ssl resource fix and speed improvement [\#1027](https://github.com/chef/inspec/pull/1027) ([alexpop](https://github.com/alexpop)) +- allow direct access to iis configuration parameters [\#1020](https://github.com/chef/inspec/pull/1020) ([chris-rock](https://github.com/chris-rock)) + +**Fixed bugs:** + +- ssl resource fix and speed improvement [\#1027](https://github.com/chef/inspec/pull/1027) ([alexpop](https://github.com/alexpop)) + +## [v0.33.1](https://github.com/chef/inspec/tree/v0.33.1) (2016-09-07) +[Full Changelog](https://github.com/chef/inspec/compare/v0.33.0...v0.33.1) + +**Closed issues:** + +- Research: determine mechanism for recording + playing back inspec [\#955](https://github.com/chef/inspec/issues/955) +- Create content for interactive inspec online demo [\#954](https://github.com/chef/inspec/issues/954) + +**Merged pull requests:** + +- Pass attributes from command line into profile context [\#1026](https://github.com/chef/inspec/pull/1026) ([stevendanna](https://github.com/stevendanna)) +- Remove SourceReader::Inspec\#prepare\_load\_path [\#1023](https://github.com/chef/inspec/pull/1023) ([stevendanna](https://github.com/stevendanna)) +- add demo yml contents [\#1022](https://github.com/chef/inspec/pull/1022) ([arlimus](https://github.com/arlimus)) + +## [v0.33.0](https://github.com/chef/inspec/tree/v0.33.0) (2016-09-05) +[Full Changelog](https://github.com/chef/inspec/compare/v0.32.0...v0.33.0) + +**Implemented enhancements:** + +- Introduce scoping to the ProfileContext which has a view of all of its dependencies [\#958](https://github.com/chef/inspec/issues/958) +- Create Help for Subcommands [\#305](https://github.com/chef/inspec/issues/305) +- Allow service resource to accept Windows service name with spaces [\#1003](https://github.com/chef/inspec/pull/1003) ([martinheg](https://github.com/martinheg)) + +**Fixed bugs:** + +- Error output not informative [\#1016](https://github.com/chef/inspec/issues/1016) +- Suse Linux Enterprise Server 11 SPX is failing for describe service resource. [\#997](https://github.com/chef/inspec/issues/997) +- Inspec Docker directory test fails [\#996](https://github.com/chef/inspec/issues/996) +- package\(\) 'version' {should match\(pattern\)} does not return failed control, but shows as failed test [\#898](https://github.com/chef/inspec/issues/898) +- Raise error when an invalid URI is received [\#1019](https://github.com/chef/inspec/pull/1019) ([alexpop](https://github.com/alexpop)) +- Fix os exception in mysql resource [\#1012](https://github.com/chef/inspec/pull/1012) ([alexpop](https://github.com/alexpop)) +- cmp not treating 0 as integer only as string [\#991](https://github.com/chef/inspec/pull/991) ([jeremymv2](https://github.com/jeremymv2)) + +**Closed issues:** + +- apache\_conf resource seems to be using incorrect paths to amalgamate apache config \(only Centos/RHEL?\) [\#1013](https://github.com/chef/inspec/issues/1013) +- More options link in Readme.md doesn't work \(404\) - need updating? [\#1001](https://github.com/chef/inspec/issues/1001) +- Chef compliance breaks after updating inspec gem 0.32 [\#992](https://github.com/chef/inspec/issues/992) +- Improve CLI report [\#984](https://github.com/chef/inspec/issues/984) +- record inspec + in-browser playback for online demo [\#956](https://github.com/chef/inspec/issues/956) +- UX & UI design for the interactive HTML demo [\#953](https://github.com/chef/inspec/issues/953) + +**Merged pull requests:** + +- use winrm v2 [\#1018](https://github.com/chef/inspec/pull/1018) ([chris-rock](https://github.com/chris-rock)) +- always display error message [\#1017](https://github.com/chef/inspec/pull/1017) ([chris-rock](https://github.com/chris-rock)) +- Fix apache conf [\#1014](https://github.com/chef/inspec/pull/1014) ([jeremymv2](https://github.com/jeremymv2)) +- fix cli inherited profiles [\#1008](https://github.com/chef/inspec/pull/1008) ([vjeffrey](https://github.com/vjeffrey)) +- improve suse 11 support for service resource [\#1007](https://github.com/chef/inspec/pull/1007) ([chris-rock](https://github.com/chris-rock)) +- Extend Inspec DSL docs [\#1006](https://github.com/chef/inspec/pull/1006) ([nvtkaszpir](https://github.com/nvtkaszpir)) +- vj/fix cli report [\#1004](https://github.com/chef/inspec/pull/1004) ([vjeffrey](https://github.com/vjeffrey)) +- fix cli link to docs [\#1002](https://github.com/chef/inspec/pull/1002) ([chris-rock](https://github.com/chris-rock)) +- Promote cmp usage as it provides results with octal mode [\#999](https://github.com/chef/inspec/pull/999) ([alexpop](https://github.com/alexpop)) +- Initial attempt at isolating resources between dependencies [\#994](https://github.com/chef/inspec/pull/994) ([stevendanna](https://github.com/stevendanna)) +- inspec demo [\#989](https://github.com/chef/inspec/pull/989) ([vjeffrey](https://github.com/vjeffrey)) +- Allow functional tests to pass on OSX [\#988](https://github.com/chef/inspec/pull/988) ([stevendanna](https://github.com/stevendanna)) +- Minor refactor and explanatory comments [\#987](https://github.com/chef/inspec/pull/987) ([stevendanna](https://github.com/stevendanna)) + +## [v0.32.0](https://github.com/chef/inspec/tree/v0.32.0) (2016-08-26) +[Full Changelog](https://github.com/chef/inspec/compare/v0.31.0...v0.32.0) + +**Implemented enhancements:** + +- Provide SSL InSpec with full demo [\#903](https://github.com/chef/inspec/issues/903) +- improve package resource on windows [\#86](https://github.com/chef/inspec/issues/86) +- can check windows service startup mode now [\#968](https://github.com/chef/inspec/pull/968) ([Anirudh-Gupta](https://github.com/Anirudh-Gupta)) +- Resolved an issue checking ports on windows [\#962](https://github.com/chef/inspec/pull/962) ([chris-rock](https://github.com/chris-rock)) + +**Fixed bugs:** + +- Grouping multiple `it` blocks in one `describe` blocks ruins console output during test runs [\#918](https://github.com/chef/inspec/issues/918) +- Windows default path format causes errors with inspec check [\#672](https://github.com/chef/inspec/issues/672) +- bugfix windows forward slashes handling [\#963](https://github.com/chef/inspec/pull/963) ([chris-rock](https://github.com/chris-rock)) +- Fix command evaluation for inspec shell -c [\#943](https://github.com/chef/inspec/pull/943) ([ksubrama](https://github.com/ksubrama)) + +**Closed issues:** + +- Support sid for user resource [\#960](https://github.com/chef/inspec/issues/960) +- Create and load Lockfiles for dependencies [\#950](https://github.com/chef/inspec/issues/950) +- Implement test cases for inspec shell [\#942](https://github.com/chef/inspec/issues/942) +- Transitive dependency loading [\#915](https://github.com/chef/inspec/issues/915) +- Document InSpec OR features [\#853](https://github.com/chef/inspec/issues/853) +- Document ini resource [\#848](https://github.com/chef/inspec/issues/848) +- Document special service resources [\#495](https://github.com/chef/inspec/issues/495) + +**Merged pull requests:** + +- Reformat service resource docs for discoverability [\#986](https://github.com/chef/inspec/pull/986) ([stevendanna](https://github.com/stevendanna)) +- Generate documentation for the `vendor` command [\#985](https://github.com/chef/inspec/pull/985) ([stevendanna](https://github.com/stevendanna)) +- suport for ruby 2.2.2 [\#983](https://github.com/chef/inspec/pull/983) ([chris-rock](https://github.com/chris-rock)) +- Add windows user SID as 'UID' in user resource. Fix \#960 [\#982](https://github.com/chef/inspec/pull/982) ([ksubrama](https://github.com/ksubrama)) +- document ini resource [\#981](https://github.com/chef/inspec/pull/981) ([vjeffrey](https://github.com/vjeffrey)) +- Upgrade FFI to Ruby 2.3 issues on windows [\#980](https://github.com/chef/inspec/pull/980) ([ksubrama](https://github.com/ksubrama)) +- move train connection out of loop for command\_simulator [\#979](https://github.com/chef/inspec/pull/979) ([vjeffrey](https://github.com/vjeffrey)) +- Update port.rb Documentation [\#978](https://github.com/chef/inspec/pull/978) ([nvtkaszpir](https://github.com/nvtkaszpir)) +- first pass at collecting command output for demo [\#977](https://github.com/chef/inspec/pull/977) ([vjeffrey](https://github.com/vjeffrey)) +- Fix `rake` to work again [\#976](https://github.com/chef/inspec/pull/976) ([jkeiser](https://github.com/jkeiser)) +- Fix `bundle install` on Ruby 2.1.9 [\#975](https://github.com/chef/inspec/pull/975) ([jkeiser](https://github.com/jkeiser)) +- Initial control isolation support [\#973](https://github.com/chef/inspec/pull/973) ([stevendanna](https://github.com/stevendanna)) +- Allow JSON 2.x [\#972](https://github.com/chef/inspec/pull/972) ([chris-rock](https://github.com/chris-rock)) +- Add Ruby 2.3 to the test matrix, make it the primary test for most suites [\#971](https://github.com/chef/inspec/pull/971) ([jkeiser](https://github.com/jkeiser)) +- Speed up windows package lookup [\#970](https://github.com/chef/inspec/pull/970) ([ksubrama](https://github.com/ksubrama)) +- Expand relative paths based on profile location [\#965](https://github.com/chef/inspec/pull/965) ([stevendanna](https://github.com/stevendanna)) +- restructure test suites in travis [\#964](https://github.com/chef/inspec/pull/964) ([chris-rock](https://github.com/chris-rock)) +- Replace Molinillo-based resolver [\#961](https://github.com/chef/inspec/pull/961) ([stevendanna](https://github.com/stevendanna)) +- Add prototype of inspec.lock [\#949](https://github.com/chef/inspec/pull/949) ([stevendanna](https://github.com/stevendanna)) +- document OR feature [\#947](https://github.com/chef/inspec/pull/947) ([vjeffrey](https://github.com/vjeffrey)) +- print controls, then tests; print header of describe, then individual test results [\#946](https://github.com/chef/inspec/pull/946) ([vjeffrey](https://github.com/vjeffrey)) +- Add darwin helper [\#945](https://github.com/chef/inspec/pull/945) ([tas50](https://github.com/tas50)) +- Update platforms in the docs to match the code [\#944](https://github.com/chef/inspec/pull/944) ([tas50](https://github.com/tas50)) +- Add integration tests for file owner on windows [\#923](https://github.com/chef/inspec/pull/923) ([chris-rock](https://github.com/chris-rock)) + +## [v0.31.0](https://github.com/chef/inspec/tree/v0.31.0) (2016-08-19) +[Full Changelog](https://github.com/chef/inspec/compare/v0.30.0...v0.31.0) + +**Implemented enhancements:** + +- Support writing full tests in inspec shell [\#240](https://github.com/chef/inspec/issues/240) +- inspec shell documentation - Fix \#805 [\#925](https://github.com/chef/inspec/pull/925) ([ksubrama](https://github.com/ksubrama)) +- Windows ports with pid and process name [\#912](https://github.com/chef/inspec/pull/912) ([alexpop](https://github.com/alexpop)) +- Improve inspec shell by having it evaluate describe/control blocks. [\#909](https://github.com/chef/inspec/pull/909) ([ksubrama](https://github.com/ksubrama)) + +**Fixed bugs:** + +- `inspec login help` help text inconsistent with `inspec` CLI usage [\#905](https://github.com/chef/inspec/issues/905) +- Subcommand help outputs incorrect usage line [\#895](https://github.com/chef/inspec/issues/895) +- `inspec compliance version` fails with stacktrace if no compliance URL is configured [\#894](https://github.com/chef/inspec/issues/894) +- `inspec` binary occasionally exits zero on SSH failures [\#840](https://github.com/chef/inspec/issues/840) +- inspec login fails [\#793](https://github.com/chef/inspec/issues/793) +- ssh\_config and sshd\_config matchers should be case-insensitive [\#759](https://github.com/chef/inspec/issues/759) +- Login succeeds but later commands fail [\#731](https://github.com/chef/inspec/issues/731) +- passwd resource does not ignore comments [\#725](https://github.com/chef/inspec/issues/725) +- remove tests and dev dependencies from released gem [\#924](https://github.com/chef/inspec/pull/924) ([arlimus](https://github.com/arlimus)) +- update dependencies and loosen molinillo [\#917](https://github.com/chef/inspec/pull/917) ([arlimus](https://github.com/arlimus)) +- Handle xinetd config with only one entry [\#846](https://github.com/chef/inspec/pull/846) ([chris-rock](https://github.com/chris-rock)) + +**Closed issues:** + +- Document InSpec Shell [\#805](https://github.com/chef/inspec/issues/805) + +**Merged pull requests:** + +- fix functional test for compliance plugin [\#941](https://github.com/chef/inspec/pull/941) ([chris-rock](https://github.com/chris-rock)) +- give accurate information for inspec compliance login --help [\#938](https://github.com/chef/inspec/pull/938) ([vjeffrey](https://github.com/vjeffrey)) +- Document awesome where syntax for port [\#937](https://github.com/chef/inspec/pull/937) ([pburkholder](https://github.com/pburkholder)) +- Fetch deps based on urls [\#935](https://github.com/chef/inspec/pull/935) ([stevendanna](https://github.com/stevendanna)) +- Ease testing of compliance integration tests [\#934](https://github.com/chef/inspec/pull/934) ([chris-rock](https://github.com/chris-rock)) +- restructure unit tests [\#933](https://github.com/chef/inspec/pull/933) ([chris-rock](https://github.com/chris-rock)) +- return token stored message on login [\#932](https://github.com/chef/inspec/pull/932) ([vjeffrey](https://github.com/vjeffrey)) +- fail gracefully on inspec compliance profiles when bad token is provided [\#930](https://github.com/chef/inspec/pull/930) ([vjeffrey](https://github.com/vjeffrey)) +- Fix recursive deps for path-based deps [\#929](https://github.com/chef/inspec/pull/929) ([stevendanna](https://github.com/stevendanna)) +- fix integration tests for Chef Compliance [\#928](https://github.com/chef/inspec/pull/928) ([chris-rock](https://github.com/chris-rock)) +- Remove false username/passwd msg from inspec compliance login [\#927](https://github.com/chef/inspec/pull/927) ([vjeffrey](https://github.com/vjeffrey)) +- inspec compliance version fails gracefully when no server config [\#926](https://github.com/chef/inspec/pull/926) ([vjeffrey](https://github.com/vjeffrey)) +- add kitchen.yml for non-public kitchen boxes [\#922](https://github.com/chef/inspec/pull/922) ([chris-rock](https://github.com/chris-rock)) +- Ignore comment lines in /etc/passwd [\#920](https://github.com/chef/inspec/pull/920) ([stevendanna](https://github.com/stevendanna)) +- ssh\_config parse should be case insensitive [\#919](https://github.com/chef/inspec/pull/919) ([vjeffrey](https://github.com/vjeffrey)) +- add ssl resource \(early access\) [\#914](https://github.com/chef/inspec/pull/914) ([arlimus](https://github.com/arlimus)) +- Add iis\_site resource [\#907](https://github.com/chef/inspec/pull/907) ([chrisevett](https://github.com/chrisevett)) + +## [v0.30.0](https://github.com/chef/inspec/tree/v0.30.0) (2016-08-12) +[Full Changelog](https://github.com/chef/inspec/compare/v0.29.0...v0.30.0) **Implemented enhancements:** @@ -73,10 +607,6 @@ ## [v0.28.1](https://github.com/chef/inspec/tree/v0.28.1) (2016-08-03) [Full Changelog](https://github.com/chef/inspec/compare/v0.28.0...v0.28.1) -**Implemented enhancements:** - -- InSpec output for summary needs to count controls [\#852](https://github.com/chef/inspec/issues/852) - **Fixed bugs:** - Read Chef attributes within the tests ? [\#813](https://github.com/chef/inspec/issues/813) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 66a4d8ac0..b92422962 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,74 +1,155 @@ # Contributing to InSpec -We are glad you want to contribute to InSpec! +We are glad you want to contribute to InSpec! This document will help answer common questions you may have during your first contribution. + +## Submitting Issues We utilize **Github Issues** for issue tracking and contributions. You can contribute in two ways: 1. Reporting an issue or making a feature request [here](#issues). 2. Adding features or fixing bugs yourself and contributing your code to InSpec. +We ask you not to submit security concerns via Github. For details on submitting potential security issues please see + ## Contribution Process -We have a 3 step process that utilizes **Github Issues**: +We have a 3 step process for contributions: -1. Sign or be added to an existing [Contributor License Agreement (CLA)](https://supermarket.chef.io/become-a-contributor). -2. Create a Github Pull Request. -3. Do [Code Review](#cr) with the **InSpec Team** on the pull request. +1. Commit changes to a git branch, making sure to sign-off those changes for the [Developer Certificate of Origin](#developer-certification-of-origin-dco). +2. Create a Github Pull Request for your change, following the instructions in the pull request template. +3. Perform a [Code Review](#code-review-process) with the project maintainers on the pull request. -### Chef Pull Requests +### Pull Request Requirements -We strive to ensure high quality throughout the InSpec experience. In order to ensure - this, we require a couple of things for all pull requests to InSpec: +Chef Projects are built to last. We strive to ensure high quality throughout the experience. In order to ensure this, we require that all pull requests to Chef projects meet these specifications: -1. **Tests:** To ensure high quality code and protect against future regressions, we require all the - code in InSpec to have at least unit test coverage. See the [test/unit](https://github.com/chef/inspec/tree/master/test/unit) - directory for the existing tests and use ```bundle exec rake test``` to run them. -2. **Green Travis Run:** We use [Travis CI](https://travis-ci.org/) in order to run our tests - continuously on all the pull requests. We require the Travis runs to succeed on every pull - request before being merged. +1. **Tests:** To ensure high quality code and protect against future regressions, we require all the code in Chef Projects to have at least unit test coverage. See the [test/unit](https://github.com/chef/inspec/tree/master/test/unit) +directory for the existing tests and use ```bundle exec rake test``` to run them. +2. **Green CI Tests:** We use [Travis CI](https://travis-ci.org/) and/or [AppVeyor](https://www.appveyor.com/) CI systems to test all pull requests. We require these test runs to succeed on every pull request before being merged. 3. **Up-to-date Documentation:** Every code change should be reflected in an update for our [documentation](https://github.com/chef/inspec/tree/master/docs). We expect PRs to update the documentation with the code change. In addition to this it would be nice to include the description of the problem you are solving - with your change. You can use [Chef Issue Template](#issuetemplate) in the description section + with your change. You can use [Issue Template](#issuetemplate) in the description section of the pull request. -### Chef Code Review Process +### Code Review Process -The Chef Code Review process happens on Github pull requests. See - [this article](https://help.github.com/articles/using-pull-requests) if you're not - familiar with Github Pull Requests. +Code review takes place in Github pull requests. See [this article](https://help.github.com/articles/about-pull-requests/) if you're not familiar with Github Pull Requests. -Once you a pull request, the **InSpec Team** will review your code - and respond to you with any feedback they might have. The process at this point is as follows: +Once you open a pull request, project maintainers will review your code and respond to your pull request with any feedback they might have. The process at this point is as follows: -1. thumbs-ups are required from the **InSpec Team** for all merges. +1. Two thumbs-up (:+1:) are required from project maintainers. See the master maintainers document for InSpec projects at . 2. When ready, your pull request will be merged into `master`, we may require you to rebase your PR to the latest `master`. 3. Once the PR is merged, you will be included in `CHANGELOG.md`. +If you would like to learn about when your code will be available in a release of Chef, read more about [Chef Release Cycles](#release-cycles). -### Contributor License Agreement (CLA) -Licensing is very important to open source projects. It helps ensure the - software continues to be available under the terms that the author desired. -Chef uses [the Apache 2.0 license](https://github.com/chef/chef/blob/master/LICENSE) - to strike a balance between open contribution and allowing you to use the - software however you would like to. +### Developer Certification of Origin (DCO) -The license tells you what rights you have that are provided by the copyright holder. - It is important that the contributor fully understands what rights they are - licensing and agrees to them. Sometimes the copyright holder isn't the contributor, - such as when the contributor is doing work for a company. +Licensing is very important to open source projects. It helps ensure the software continues to be available under the terms that the author desired. -To make a good faith effort to ensure these criteria are met, Chef requires an Individual CLA - or a Corporate CLA for contributions. This agreement helps ensure you are aware of the - terms of the license you are contributing your copyrighted works under, which helps to - prevent the inclusion of works in the projects that the contributor does not hold the rights - to share. +Chef uses [the Apache 2.0 license](https://github.com/chef/chef/blob/master/LICENSE) to strike a balance between open contribution and allowing you to use the software however you would like to. -It only takes a few minutes to complete a CLA, and you retain the copyright to your contribution. +The license tells you what rights you have that are provided by the copyright holder. It is important that the contributor fully understands what rights they are licensing and agrees to them. Sometimes the copyright holder isn't the contributor, such as when the contributor is doing work on behalf of a company. -You can complete our - [Individual CLA](https://supermarket.chef.io/icla-signatures/new) online. - If you're contributing on behalf of your employer and they retain the copyright for your works, - have your employer fill out our - [Corporate CLA](https://supermarket.chef.io/ccla-signatures/new) instead. +To make a good faith effort to ensure these criteria are met, Chef requires the Developer Certificate of Origin (DCO) process to be followed. + +The DCO is an attestation attached to every contribution made by every developer. In the commit message of the contribution, the developer simply adds a Signed-off-by statement and thereby agrees to the DCO, which you can find below or at . + +``` +Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +(a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +(b) The contribution is based upon previous work that, to the + best of my knowledge, is covered under an appropriate open + source license and I have the right under that license to + submit that work with modifications, whether created in whole + or in part by me, under the same open source license (unless + I am permitted to submit under a different license), as + Indicated in the file; or + +(c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +(d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including + all personal information I submit with it, including my + sign-off) is maintained indefinitely and may be redistributed + consistent with this project or the open source license(s) + involved. +``` + +For more information on the change see the Chef Blog post [Introducing Developer Certificate of Origin](https://blog.chef.io/2016/09/19/introducing-developer-certificate-of-origin/) + +#### DCO Sign-Off Methods + +The DCO requires a sign-off message in the following format appear on each commit in the pull request: + +``` +Signed-off-by: Julia Child +``` + +The DCO text can either be manually added to your commit body, or you can add either **-s** or **--signoff** to your usual git commit commands. If you forget to add the sign-off you can also amend a previous commit with the sign-off by running **git commit --amend -s**. If you've pushed your changes to Github already you'll need to force push your branch after this with **git push -f**. + +### Obvious Fix Policy + +Small contributions, such as fixing spelling errors, where the content is small enough to not be considered intellectual property, can be submitted without signing the contribution for the DCO. + +As a rule of thumb, changes are obvious fixes if they do not introduce any new functionality or creative thinking. Assuming the change does not affect functionality, some common obvious fix examples include the following: + +- Spelling / grammar fixes +- Typo correction, white space and formatting changes +- Comment clean up +- Bug fixes that change default return values or error codes stored in constants +- Adding logging messages or debugging output +- Changes to 'metadata' files like Gemfile, .gitignore, build scripts, etc. +- Moving source files from one directory or package to another + +**Whenever you invoke the "obvious fix" rule, please say so in your commit message:** + +``` +------------------------------------------------------------------------ +commit 370adb3f82d55d912b0cf9c1d1e99b132a8ed3b5 +Author: Julia Child +Date: Wed Sep 18 11:44:40 2015 -0700 + + Fix typo in the README. + + Obvious fix. + +------------------------------------------------------------------------ +``` + +## Release Cycles + +Our primary shipping vehicle is operating system specific packages that includes all the requirements of InSpec. We call these [Omnibus packages](https://github.com/chef/omnibus) + +We also release our software as gems to [Rubygems](https://rubygems.org/) but we strongly recommend using InSpec or ChefDK packages. + +Our version numbering roughly follows [Semantic Versioning](http://semver.org/) standard. Our standard version numbers look like X.Y.Z which mean: + +- X is a major release, which may not be fully compatible with prior major releases +- Y is a minor release, which adds both new features and bug fixes +- Z is a patch release, which adds just bug fixes + +After shipping a release of InSpec we bump at least the `Minor` version by one to start development of the next minor release. We do a release approximately every week. Announcements of releases are made to the [InSpec mailing list](https://discourse.chef.io/c/chef-release) when they are available. + +## InSpec Community + +InSpec is made possible by a strong community of developers, system administrators, auditor and security experts. If you have any questions or if you would like to get involved in the InSpec community you can check out: + +- [InSpec Mailing List](https://discourse.chef.io/c/inspec) +- [Chef Community Slack](https://community-slack.chef.io/) + +Also here are some additional pointers to some awesome Chef content: + +- [InSpec Docs](http://inspec.io/docs/) +- [Learn Chef](https://learn.chef.io/) +- [Chef Website](https://www.chef.io/) diff --git a/Gemfile b/Gemfile index 611a39a33..46516d3d2 100644 --- a/Gemfile +++ b/Gemfile @@ -6,10 +6,15 @@ gemspec # detecting that net-ssh 3 does not work with 1.9.3 if Gem::Version.new(RUBY_VERSION) <= Gem::Version.new('1.9.3') gem 'net-ssh', '~> 2.9' + gem 'tins', '~> 1.6.0' end -# TODO: ffi 1.9.11 is currently erroneous on windows tests -gem 'ffi', '= 1.9.10' +if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.2.2') + gem 'json', '~> 1.8' + gem 'rack', '< 2.0' +end + +gem 'ffi', '>= 1.9.14' group :test do gem 'bundler', '~> 1.5' @@ -19,17 +24,26 @@ group :test do gem 'simplecov', '~> 0.10' gem 'concurrent-ruby', '~> 0.9' gem 'mocha', '~> 1.1' + gem 'ruby-progressbar', '~> 1.8' + gem 'nokogiri', '~> 1.6' end group :integration do gem 'berkshelf', '~> 4.3' gem 'test-kitchen', '~> 1.6' gem 'kitchen-vagrant' - gem 'kitchen-inspec', '0.12.5' + # we need winrm v2 support >= 0.15.1 + gem 'kitchen-inspec', '>= 0.15.1' gem 'kitchen-ec2' gem 'kitchen-dokken' end +group :simulator do + gem 'github-markup' + gem 'redcarpet' + gem 'docker-api' +end + group :tools do gem 'pry', '~> 0.10' gem 'rb-readline' @@ -45,3 +59,7 @@ group :maintenance do gem 'octokit' gem 'netrc' end + +group :deploy do + gem 'inquirer' +end diff --git a/MAINTAINERS.md b/MAINTAINERS.md index 10c7c15c0..9079977ac 100644 --- a/MAINTAINERS.md +++ b/MAINTAINERS.md @@ -8,7 +8,7 @@ This file lists how the InSpec project is maintained. When making changes to the system, this file tells you who needs to review your patch - you need at least two maintainers to provide a :+1: on your pull request. Additionally, you need to not receive a veto from a Lieutenant or the Project Lead. -Check out [How Chef is Maintained](https://github.com/opscode/chef-rfc/blob/master/rfc030-maintenance-policy.md#how-the-project-is-maintained) +Check out [How Chef is Maintained](https://github.com/chef/chef-rfc/blob/master/rfc030-maintenance-policy.md#how-the-project-is-maintained) for details on the process, how to become a maintainer, lieutenant, or the project lead. @@ -18,6 +18,8 @@ project lead. Handles the [InSpec](https://github.com/chef/inspec) toolset. +To mention the team, use @chef/inspec-maintainers + ### Lieutenant * [Dominik Richter](https://github.com/arlimus) diff --git a/MAINTAINERS.toml b/MAINTAINERS.toml index 056540cba..020f862b8 100644 --- a/MAINTAINERS.toml +++ b/MAINTAINERS.toml @@ -5,7 +5,7 @@ This file lists how the InSpec project is maintained. When making changes to the system, this file tells you who needs to review your patch - you need at least two maintainers to provide a :+1: on your pull request. Additionally, you need to not receive a veto from a Lieutenant or the Project Lead. -Check out [How Chef is Maintained](https://github.com/opscode/chef-rfc/blob/master/rfc030-maintenance-policy.md#how-the-project-is-maintained) +Check out [How Chef is Maintained](https://github.com/chef/chef-rfc/blob/master/rfc030-maintenance-policy.md#how-the-project-is-maintained) for details on the process, how to become a maintainer, lieutenant, or the project lead. """ diff --git a/README.md b/README.md index c9d5590f8..44707f90e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # InSpec: Inspect Your Infrastructure -[![Join the chat at https://gitter.im/chef/inspec](https://badges.gitter.im/chef/inspec.svg)](https://gitter.im/chef/inspec?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +[![Slack](https://community-slack.chef.io/badge.svg)](https://community-slack.chef.io/) [![Build Status Master](https://travis-ci.org/chef/inspec.svg?branch=master)](https://travis-ci.org/chef/inspec) [![Build Status Master](https://ci.appveyor.com/api/projects/status/github/chef/inspec?branch=master&svg=true&passingText=master%20-%20Ok&pendingText=master%20-%20Pending&failingText=master%20-%20Failing)](https://ci.appveyor.com/project/Chef/inspec/branch/master) @@ -18,7 +18,7 @@ describe inetd_conf do end ``` -InSpec makes it easy to run your tests wherever you need. More options listed here: https://github.com/chef/inspec/blob/master/docs/ctl_inspec.rst +InSpec makes it easy to run your tests wherever you need. More options are found in our [CLI docs](http://inspec.io/docs/reference/cli/). ```bash # run test locally @@ -45,6 +45,10 @@ inspec exec test.rb -t docker://container_id InSpec requires Ruby ( >1.9 ). +### Install as package + +The InSpec package is available for MacOS, RedHat, Ubuntu and Windows. Download the latest package at [InSpec Downloads](https://downloads.chef.io/inspec). + ### Install it via rubygems.org When installing from source, gem dependencies may require ruby build tools to be installed. @@ -110,6 +114,19 @@ gem install inspec-*.gem On Windows, you need to install [Ruby](http://rubyinstaller.org/downloads/) with [Ruby Development Kit](https://github.com/oneclick/rubyinstaller/wiki/Development-Kit) to build dependencies with its native extensions. +### Install via Habitat + +Currently, this method of installation only supports Linux. See the [Habitat site](https://www.habitat.sh/) for more information. + +Download the `hab` binary from the [Habitat](https://www.habitat.sh/docs/get-habitat/) site. + +```bash +hab pkg install chef/inspec +export PATH="$(hab pkg path core/ruby)/bin:$(hab pkg path chef/inspec)/bin:$PATH" + +inspec +``` + ### Run InSpec You should now be able to run: @@ -156,11 +173,12 @@ describe sshd_config do end ``` -* Test your `kitchen.yml` file to verify that only Vagrant is configured as the driver. +* Test your `kitchen.yml` file to verify that only Vagrant is configured as the driver. The %w() formatting will +pass rubocop lintng and allow you to access nested mappings. ```ruby describe yaml('.kitchen.yml') do - its('driver.name') { should eq('vagrant') } + its(%w(driver name)) { should eq('vagrant') } end ``` @@ -170,6 +188,25 @@ Also have a look at our examples for: - [Using InSpec with Test Kitchen & Ansible](https://github.com/chef/inspec/tree/master/examples/kitchen-ansible) - [Implementing an InSpec profile](https://github.com/chef/inspec/tree/master/examples/profile) +## Or tests: Testing for a OR b + +* Using describe.one, you can test for a or b. The control will be marked as passing if EITHER condition is met. + +```ruby +control 'or-test' do + impact 1.0 + title 'This is a OR test' + describe.one do + describe ssh_config do + its('Protocol') { should eq('3') } + end + describe ssh_config do + its('Protocol') { should eq('2') } + end + end +end +``` + ## Command Line Usage ### exec @@ -191,6 +228,9 @@ inspec exec test.rb -t docker://container_id # run with sudo inspec exec test.rb --sudo [--sudo-password ...] [--sudo-options ...] [--sudo_command ...] + +# run in a subshell +inspec exec test.rb --shell [--shell-options ...] [--shell-command ...] ``` ### detect @@ -231,7 +271,7 @@ OpenSUSE | 13.1/13.2/42.1 | x86_64 OmniOS | | x86_64 Gentoo Linux | | x86_64 Arch Linux | | x86_64 -HP-UX | 11.31 | ia64 +HP-UX | 11.31 | ia64 * For Windows 2008 and 2008 R2 an updated Powershell (Windows Management Framework 5.0) is required. @@ -249,30 +289,13 @@ Windows | 2012+ Documentation + * http://inspec.io/docs/ + * http://inspec.io/docs/reference/resources/ * https://github.com/chef/inspec/tree/master/docs -Blogs: +Tutorials/Blogs/Podcasts: - * [The Road to InSpec](https://www.chef.io/blog/2015/11/04/the-road-to-inspec/) - * [Introduction to InSpec](http://tfitch.com/automation-tools-bootcamp/inspec.html) - * [InSpec Tutorial: Day 1 - Hello World](http://www.anniehedgie.com/inspec-basics-1) - * [InSpec Tutorial: Day 2 - Command Resource Blog Logo](http://www.anniehedgie.com/inspec-basics-2) - * [InSpec Tutorial: Day 3 - File Resource](http://www.anniehedgie.com/inspec-basics-3) - * [InSpec Tutorial: Day 4 - Custom Matchers](http://www.anniehedgie.com/inspec-basics-4) - * [InSpec Tutorial: Day 5 - Creating a Profile](http://www.anniehedgie.com/inspec-basics-5) - * [InSpec Tutorial: Day 6 - Ways to Run It and Places to Store It](http://www.anniehedgie.com/inspec-basics-6) - * [InSpec Tutorial: Day 7 - How to Inherit a Profile from Chef Compliance Server](http://www.anniehedgie.com/inspec-basics-7) - * [InSpec Tutorial: Day 8 - Regular Expressions](http://www.anniehedgie.com/inspec-basics-8) - * [InSpec Tutorial: Day 9 - Attributes](http://www.anniehedgie.com/inspec-basics-9) - * [Windows infrastructure testing using InSpec – Part I](http://datatomix.com/?p=236) - * [Windows infrastructure testing using InSpec and Profiles – Part II](http://datatomix.com/?p=238) - * [Testing Ansible with Inspec](http://scienceofficersblog.blogspot.de/2016/02/testing-ansible-with-inspec.html) - * [Operating Chef/InSpec in an air gapped environment](https://github.com/jeremymv2/chef-intranet-scaffolding/blob/master/README.md) - -Podcasts: - - * [InSpec Foodfight](http://foodfightshow.org/2016/02/inspec.html) - * [Test Driven Infrastructure With Arthur Maltson And Michael Goetz](https://www.arresteddevops.com/tdi/) + * http://inspec.io/tutorials/ ## Share your Profiles @@ -294,6 +317,11 @@ InSpec is inspired by the wonderful [Serverspec](http://serverspec.org) project. 1. Create new Pull Request +The InSpec community and maintainers are very active and helpful. This project benefits greatly from this activity. + +[![InSpec health](https://graphs.waffle.io/chef/inspec/throughput.svg)](https://waffle.io/chef/inspec/metrics/throughput) + + ## Testing InSpec We perform `unit`, `resource` and `integration` tests. @@ -363,21 +391,15 @@ transport: ``` -### Chef Delivery Tests - -It may be informative to look at what [tests Chef Delivery](https://github.com/chef/inspec/blob/master/.delivery/build-cookbook/recipes/unit.rb) is running for CI. - ## License -| **Author:** | Dominik Richter () - -| **Author:** | Christoph Hartmann () - -| **Copyright:** | Copyright (c) 2015 Chef Software Inc. - -| **Copyright:** | Copyright (c) 2015 Vulcano Security GmbH. - -| **License:** | Apache License, Version 2.0 +| | | +| ------ | --- | +| **Author:** | Dominik Richter () | +| **Author:** | Christoph Hartmann () | +| **Copyright:** | Copyright (c) 2015 Chef Software Inc. | +| **Copyright:** | Copyright (c) 2015 Vulcano Security GmbH. | +| **License:** | Apache License, Version 2.0 | Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/Rakefile b/Rakefile index 9bdeaa5e3..633aac9c0 100644 --- a/Rakefile +++ b/Rakefile @@ -5,7 +5,9 @@ require 'bundler' require 'bundler/gem_tasks' require 'rake/testtask' require 'rubocop/rake_task' +require_relative 'tasks/docs' require_relative 'tasks/maintainers' +require_relative 'tasks/www' # Rubocop desc 'Run Rubocop lint checks' @@ -17,6 +19,13 @@ end desc 'Run robocop linter' task lint: [:rubocop] +# update command output for demo +desc 'Run inspec commands and save results to www/app/responses' +task :update_demo do + ruby 'www/tutorial/scripts/build_simulator_runtime.rb' + ruby 'www/tutorial/scripts/run_simulator_recording.rb' +end + # run tests task default: [:test, :lint] @@ -145,6 +154,7 @@ task :bump_version, [:version] do |_, args| check_update_requirements inspec_version(v) Rake::Task['changelog'].invoke + Rake::Task['docs:cli'].invoke end desc 'Release a new docker image' @@ -158,55 +168,19 @@ task :release_docker do sh('sh', '-c', cmd) end -namespace :docs do - desc 'Create cli docs' - task :cli do - res = "=====================================================\n"\ - "InSpec CLI\n"\ - "=====================================================\n\n"\ - "Use the InSpec CLI to run tests and audits against targets "\ - "using local, SSH, WinRM, or Docker connections.\n\n" - - require 'inspec/cli' - cmds = Inspec::InspecCLI.all_commands - cmds.keys.sort.each do |key| - cmd = cmds[key] - - res << "#{cmd.usage.split.first}\n"\ - "=====================================================\n\n" - - res << cmd.description.capitalize - res << "\n\n" - - res << "Syntax\n"\ - "-----------------------------------------------------\n\n" - - res << "This subcommand has the following syntax:\n\n"\ - ".. code-block:: bash\n\n"\ - " $ inspec #{cmd.usage}\n\n" - - opts = cmd.options.select { |_, o| !o.hide } - unless opts.empty? - res << "Options\n"\ - "-----------------------------------------------------\n\n"\ - "This subcommand has additional options:\n\n" - - opts.keys.sort.each do |option| - opt = cmd.options[option] - # TODO: remove when UX of help is reworked 1.0 - usage = opt.usage.split(', ') - .map { |x| x.tr('[]', '') } - .map { |x| x.start_with?('-') ? x : '-'+x } - .map { |x| '``' + x + '``' } - res << "#{usage.join(', ')}\n #{opt.description}\n\n" - end - - end - res << "\n\n" +desc 'Release a new Habitat package' +task :release_habitat do + version = Inspec::VERSION + ENV['HAB_ORIGIN'] = "chef" + if Dir.exist?("./results") then + raise "Please remove the ./results directory" end - - dst = 'docs/cli.rst' - File.write(dst, res) - puts "Documentation generated in #{dst.inspect}" - end + if ! ENV.has_key?("HAB_AUTH_TOKEN") then + raise "Please set the HAB_AUTH_TOKEN environment variable" + end + cmd = "echo #{version} > ./habitat/VERSION && "\ + "hab studio build ./habitat && " \ + "hab pkg upload ./results/*.hart" + puts "--> #{cmd}" + sh('sh', '-c', cmd) end diff --git a/appveyor.yml b/appveyor.yml index 0e5e7f57c..7af8cacf6 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -8,6 +8,7 @@ environment: matrix: - ruby_version: "193" - ruby_version: "22" + - ruby_version: "23" clone_folder: c:\projects\inspec clone_depth: 1 @@ -32,7 +33,7 @@ install: - ruby -r rubygems -e "p Gem.path" build_script: - - bundle install --path=vendor/bundle --without integration tools maintenance + - bundle install --path=vendor/bundle --without integration tools maintenance deploy test_script: - SET SPEC_OPTS=--format progress diff --git a/bin/inspec b/bin/inspec index 979171b46..06f670135 100755 --- a/bin/inspec +++ b/bin/inspec @@ -4,6 +4,9 @@ # author: Dominik Richter # author: Christoph Hartmann +Encoding.default_external = Encoding::UTF_8 +Encoding.default_internal = Encoding::UTF_8 + require_relative '../lib/inspec' require_relative '../lib/inspec/cli' Inspec::InspecCLI.start(ARGV) diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 000000000..66027e687 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,2 @@ +resources.md +cli.md diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 000000000..fd9bea58e --- /dev/null +++ b/docs/README.md @@ -0,0 +1,40 @@ +# InSpec documentation + +This is the home of the InSpec documentation. This documentation provides an introduction to this mechanism and shows how to write custom tests. + +The goal of this folder is for any community member to clone these docs, make the changes, check if they are valid, and contribute to the project. + +## How to build docs + +We build docs by: + +1. Auto-generating docs from code +2. Transforming markdown+snippets in this folder into pure markdown in `www/source/docs` +3. Rendering them to the website via instructions in `www/` + +For development, you **only need step 1**! + +**1 Generate docs** + +To generate all docs run: + +``` +bundle exec rake docs +``` + +You can run tasks individually. For a list of tasks run: + +``` +bundle exec rake --tasks docs +``` + +## Stability Index + +Every available InSpec resource will indicate its stability. As InSpec matures, certain parts are more reliable than others. Brand new features are likely to be redesigned and marked as such. + +The stability indices are as follows: + +* `Stability: Deprecated` - This features will be removed in future versions, because its known for being problematic. Do not rely on it. +* `Stability: Experimental` - New features may change or are removed in future versions +* `Stability: Stable` - API is well established and proofed. Maintaining compatibility is a high priority +* `Stability: Locked` - Only security and performance fixes are allowed diff --git a/docs/cli.rst b/docs/cli.rst deleted file mode 100644 index 99c5f0f25..000000000 --- a/docs/cli.rst +++ /dev/null @@ -1,442 +0,0 @@ -===================================================== -InSpec CLI -===================================================== - -Use the InSpec CLI to run tests and audits against targets using local, SSH, WinRM, or Docker connections. - -archive -===================================================== - -Archive a profile to tar.gz (default) or zip - -Syntax ------------------------------------------------------ - -This subcommand has the following syntax: - -.. code-block:: bash - - $ inspec archive PATH - -Options ------------------------------------------------------ - -This subcommand has additional options: - -``--ignore-errors``, ``--no-ignore-errors`` - Ignore profile warnings. - -``-o``, ``--output=OUTPUT`` - Save the archive to a path - -``--overwrite``, ``--no-overwrite`` - Overwrite existing archive. - -``--profiles-path=PROFILES_PATH`` - Folder which contains referenced profiles. - -``--tar``, ``--no-tar`` - Generates a tar.gz archive. - -``--zip``, ``--no-zip`` - Generates a zip archive. - - - -check -===================================================== - -Verify all tests at the specified path - -Syntax ------------------------------------------------------ - -This subcommand has the following syntax: - -.. code-block:: bash - - $ inspec check PATH - -Options ------------------------------------------------------ - -This subcommand has additional options: - -``--format=FORMAT`` - - -``--profiles-path=PROFILES_PATH`` - Folder which contains referenced profiles. - - - -compliance -===================================================== - -Chef compliance commands - -Syntax ------------------------------------------------------ - -This subcommand has the following syntax: - -.. code-block:: bash - - $ inspec compliance SUBCOMMAND ... - - - -detect -===================================================== - -Detect the target os - -Syntax ------------------------------------------------------ - -This subcommand has the following syntax: - -.. code-block:: bash - - $ inspec detect - -Options ------------------------------------------------------ - -This subcommand has additional options: - -``-b``, ``--backend=BACKEND`` - Choose a backend: local, ssh, winrm, docker. - -``--format=FORMAT`` - - -``--host=HOST`` - Specify a remote host which is tested. - -``--json-config=JSON_CONFIG`` - Read configuration from JSON file (`-` reads from stdin). - -``-i``, ``--key-files=one two three`` - Login key or certificate file for a remote scan. - -``-l``, ``--log-level=LOG_LEVEL`` - Set the log level: info (default), debug, warn, error - -``--password=PASSWORD`` - Login password for a remote scan, if required. - -``--path=PATH`` - Login path to use when connecting to the target (WinRM). - -``-p``, ``--port=N`` - Specify the login port for a remote scan. - -``--self-signed``, ``--no-self-signed`` - Allow remote scans with self-signed certificates (WinRM). - -``--ssl``, ``--no-ssl`` - Use SSL for transport layer encryption (WinRM). - -``--sudo``, ``--no-sudo`` - Run scans with sudo. Only activates on Unix and non-root user. - -``--sudo-command=SUDO_COMMAND`` - Alternate command for sudo. - -``--sudo-options=SUDO_OPTIONS`` - Additional sudo options for a remote scan. - -``--sudo-password=SUDO_PASSWORD`` - Specify a sudo password, if it is required. - -``-t``, ``--target=TARGET`` - Simple targeting option using URIs, e.g. ssh://user:pass@host:port - -``--user=USER`` - The login user for a remote scan. - - - -env -===================================================== - -Output shell-appropriate completion configuration - -Syntax ------------------------------------------------------ - -This subcommand has the following syntax: - -.. code-block:: bash - - $ inspec env - - - -exec -===================================================== - -Run all test files at the specified path. - -Syntax ------------------------------------------------------ - -This subcommand has the following syntax: - -.. code-block:: bash - - $ inspec exec PATHS - -Options ------------------------------------------------------ - -This subcommand has additional options: - -``--attrs=one two three`` - Load attributes file (experimental) - -``-b``, ``--backend=BACKEND`` - Choose a backend: local, ssh, winrm, docker. - -``--color``, ``--no-color`` - Use colors in output. - -``--controls=one two three`` - A list of controls to run. Ignore all other tests. - -``--format=FORMAT`` - Which formatter to use: cli, progress, documentation, json, json-min - -``--host=HOST`` - Specify a remote host which is tested. - -``--json-config=JSON_CONFIG`` - Read configuration from JSON file (`-` reads from stdin). - -``-i``, ``--key-files=one two three`` - Login key or certificate file for a remote scan. - -``-l``, ``--log-level=LOG_LEVEL`` - Set the log level: info (default), debug, warn, error - -``--password=PASSWORD`` - Login password for a remote scan, if required. - -``--path=PATH`` - Login path to use when connecting to the target (WinRM). - -``-p``, ``--port=N`` - Specify the login port for a remote scan. - -``--profiles-path=PROFILES_PATH`` - Folder which contains referenced profiles. - -``--self-signed``, ``--no-self-signed`` - Allow remote scans with self-signed certificates (WinRM). - -``--ssl``, ``--no-ssl`` - Use SSL for transport layer encryption (WinRM). - -``--sudo``, ``--no-sudo`` - Run scans with sudo. Only activates on Unix and non-root user. - -``--sudo-command=SUDO_COMMAND`` - Alternate command for sudo. - -``--sudo-options=SUDO_OPTIONS`` - Additional sudo options for a remote scan. - -``--sudo-password=SUDO_PASSWORD`` - Specify a sudo password, if it is required. - -``-t``, ``--target=TARGET`` - Simple targeting option using URIs, e.g. ssh://user:pass@host:port - -``--user=USER`` - The login user for a remote scan. - - - -help -===================================================== - -Describe available commands or one specific command - -Syntax ------------------------------------------------------ - -This subcommand has the following syntax: - -.. code-block:: bash - - $ inspec help [COMMAND] - - - -init -===================================================== - -Scaffolds a new project - -Syntax ------------------------------------------------------ - -This subcommand has the following syntax: - -.. code-block:: bash - - $ inspec init TEMPLATE ... - - - -json -===================================================== - -Read all tests in path and generate a json summary - -Syntax ------------------------------------------------------ - -This subcommand has the following syntax: - -.. code-block:: bash - - $ inspec json PATH - -Options ------------------------------------------------------ - -This subcommand has additional options: - -``--controls=one two three`` - A list of controls to include. Ignore all other tests. - -``-o``, ``--output=OUTPUT`` - Save the created profile to a path - -``--profiles-path=PROFILES_PATH`` - Folder which contains referenced profiles. - - - -scap -===================================================== - -Scap commands - -Syntax ------------------------------------------------------ - -This subcommand has the following syntax: - -.. code-block:: bash - - $ inspec scap SUBCOMMAND ... - - - -shell -===================================================== - -Open an interactive debugging shell - -Syntax ------------------------------------------------------ - -This subcommand has the following syntax: - -.. code-block:: bash - - $ inspec shell - -Options ------------------------------------------------------ - -This subcommand has additional options: - -``-b``, ``--backend=BACKEND`` - Choose a backend: local, ssh, winrm, docker. - -``-c``, ``--command=COMMAND`` - - -``--host=HOST`` - Specify a remote host which is tested. - -``--json-config=JSON_CONFIG`` - Read configuration from JSON file (`-` reads from stdin). - -``-i``, ``--key-files=one two three`` - Login key or certificate file for a remote scan. - -``-l``, ``--log-level=LOG_LEVEL`` - Set the log level: info (default), debug, warn, error - -``--password=PASSWORD`` - Login password for a remote scan, if required. - -``--path=PATH`` - Login path to use when connecting to the target (WinRM). - -``-p``, ``--port=N`` - Specify the login port for a remote scan. - -``--self-signed``, ``--no-self-signed`` - Allow remote scans with self-signed certificates (WinRM). - -``--ssl``, ``--no-ssl`` - Use SSL for transport layer encryption (WinRM). - -``--sudo``, ``--no-sudo`` - Run scans with sudo. Only activates on Unix and non-root user. - -``--sudo-command=SUDO_COMMAND`` - Alternate command for sudo. - -``--sudo-options=SUDO_OPTIONS`` - Additional sudo options for a remote scan. - -``--sudo-password=SUDO_PASSWORD`` - Specify a sudo password, if it is required. - -``-t``, ``--target=TARGET`` - Simple targeting option using URIs, e.g. ssh://user:pass@host:port - -``--user=USER`` - The login user for a remote scan. - - - -supermarket -===================================================== - -Supermarket commands - -Syntax ------------------------------------------------------ - -This subcommand has the following syntax: - -.. code-block:: bash - - $ inspec supermarket SUBCOMMAND ... - - - -version -===================================================== - -Prints the version of this tool - -Syntax ------------------------------------------------------ - -This subcommand has the following syntax: - -.. code-block:: bash - - $ inspec version - - - diff --git a/docs/dsl_inspec.md b/docs/dsl_inspec.md new file mode 100644 index 000000000..7b39a2d28 --- /dev/null +++ b/docs/dsl_inspec.md @@ -0,0 +1,245 @@ +--- +title: InSpec DSL +--- + +# InSpec DSL + +InSpec is a run-time framework and rule language used to specify compliance, security, and policy requirements. It includes a collection of resources that help you write auditing controls quickly and easily. The syntax used by both open source and |chef compliance| auditing is the same. The open source |inspec resource| framework is compatible with |chef compliance|. + +The InSpec DSL is a Ruby DSL for writing audit controls, which includes audit resources that you can invoke. + +The following sections describe the syntax and show some simple examples of using the InSpec resources. + +## Syntax + +The following resource tests |ssh| server configuration. For example, a simple control may described as: + +```ruby +describe sshd_config do + its('Port') { should eq('22') } +end +``` + +In various use cases like implementing IT compliance across different departments, it becomes handy to extend the control with metadata. Each control may define an additional ``impact``, ``title`` or ``desc``. An example looks like: + +```ruby +control 'sshd-8' do + impact 0.6 + title 'Server: Configure the service port' + desc ' + Always specify which port the SSH server should listen to. + Prevent unexpected settings. + ' + tag 'ssh','sshd','openssh-server' + tag cce: 'CCE-27072-8' + ref 'NSA-RH6-STIG - Section 3.5.2.1', url: 'https://www.nsa.gov/ia/_files/os/redhat/rhel5-guide-i731.pdf' + + describe sshd_config do + its('Port') { should eq('22') } + end +end +``` + +where + +* `'sshd-8'` is the name of the control +* `impact`, `title`, and `desc` define metadata that fully describes the importance of the control, its purpose, with a succinct and complete description +* `impact` is an float that measures the importance of the compliance results and must be a value between `0.0` and `1.0`. +* `tag` is optional meta-information with with key or key-value pairs +* `ref` is a reference to an external document +* `describe` is a block that contains at least one test. A `control` block must contain at least one `describe` block, but may contain as many as required +* `sshd_config` is an InSpec resource. For the full list of InSpec resources, see InSpec resource documentation +* `its('Port')` is the matcher; `{ should eq('22') }` is the test. A `describe` block must contain at least one matcher, but may contain as many as required + + +## Advanced concepts + +With inspec it is possible to check if at least one of a collection of checks is true. For example: If a setting is configured in two different locations, you may want to test if either configuration A or configuration B have been set. This is accomplished via `describe.one`. It defines a block of tests with at least one valid check. + +```ruby +describe.one do + describe ConfigurationA do + its('setting_1') { should eq true } + end + + describe ConfigurationB do + its('setting_2') { should eq true } + end +end +``` + +## Examples + +The following examples show simple compliance tests using a single `control` block. + +## Test System Event Log + +The following test shows how to audit machines running Windows 2012 R2 that password complexity is enabled: + +```ruby +control 'windows-account-102' do + impact 1.0 + title 'Windows Password Complexity is Enabled' + desc 'Password must meet complexity requirement' + describe security_policy do + its('PasswordComplexity') { should eq 1 } + end +end +``` + +## Are PosgtreSQL passwords empty? + +The following test shows how to audit machines running PostgreSQL to ensure that passwords are not empty. + +```ruby +control 'postgres-7' do + impact 1.0 + title 'Don't allow empty passwords' + describe postgres_session('user', 'pass').query("SELECT * FROM pg_shadow WHERE passwd IS NULL;") do + its('output') { should eq('') } + end +end +``` + +## Are MySQL passwords in ENV? + +The following test shows how to audit machines running MySQL to ensure that passwords are not stored in `ENV`: + +```ruby +control 'mysql-3' do + impact 1.0 + title 'Do not store your MySQL password in your ENV' + desc ' + Storing credentials in your ENV may easily expose + them to an attacker. Prevent this at all costs. + ' + describe command('env') do + its('stdout') { should_not match(/^MYSQL_PWD=/) } + end +end +``` + +## Is `/etc/ssh` a Directory? + +The following test shows how to audit machines to ensure that `/etc/ssh` is a directory: + +```ruby +control 'basic-1' do + impact 1.0 + title '/etc/ssh should be a directory' + desc ' + In order for OpenSSH to function correctly, its + configuration path must be a folder. + ' + describe file('/etc/ssh') do + it { should be_directory } + end +end +``` + +## Is Apache running? + +The following test shows how to audit machines to ensure that Apache is enabled and running: + +```ruby +control 'apache-1' do + impact 0.3 + title 'Apache2 should be configured and running' + describe service(apache.service) do + it { should be_enabled } + it { should be_running } + end +end +``` + +## Are insecure packages installed ? + +The following test shows how to audit machines for insecure packages: + +```ruby +control 'cis-os-services-5.1.3' do + impact 0.7 + title '5.1.3 Ensure rsh client is not installed' + + describe package('rsh') do + it { should_not be_installed } + end + + describe package('rsh-redone-client') do + it { should_not be_installed } + end +end +``` + +## Test Windows Registry Keys + +The following test shows how to audit machines to ensure Safe DLL Search Mode is enabled: + +```ruby +control 'windows-base-101' do + impact 1.0 + title 'Safe DLL Search Mode is Enabled' + desc ' + @link: https://msdn.microsoft.com/en-us/library/ms682586(v=vs.85).aspx + ' + describe registry_key('HKLM\\System\\CurrentControlSet\\Control\\Session Manager') do + it { should exist } + it { should_not have_property_value('SafeDllSearchMode', :type_dword, '0') } + end +end +``` + +## Exclude specific test + +This shows how to allow skipping certain tests if conditions are not met, by using `only_if`. +In this example the test will not be performed if `redis-cli` command does not exist, because for example package on remote host was not installed. + +```ruby +control 'nutcracker-connect-redis-001' do + impact 1.0 + title 'Check if nutcracker can pass commands to redis' + desc 'execute redis-cli set key command, to check connectivity of the service' + + only_if do + command('redis-cli').exist? + end + + describe command('redis-cli SET test_inspec "HELLO"') do + its(:stdout) { should match(/OK/) } + end +end +``` + +Mixing this with other conditionals (like checking existence of the files etc.) can help to test different test paths using inspec. This way you can skip certain tests which would 100% fail due to the way servers are prepared, but you know that the same test suites are reused later in different circumstances by different teams. + +## Additional metadata for controls + + +The following example illustrates various ways to add tags and references to `control` + +```ruby +control 'ssh-1' do + impact 1.0 + + title 'Allow only SSH Protocol 2' + desc 'Only SSH protocol version 2 connections should be permitted. + The default setting in /etc/ssh/sshd_config is correct, and can be + verified by ensuring that the following line appears: Protocol 2' + + tag 'production','development' + tag 'ssh','sshd','openssh-server' + + tag cce: 'CCE-27072-8' + tag disa: 'RHEL-06-000227' + + tag remediation: 'stig_rhel6/recipes/sshd-config.rb' + tag remediation: 'https://supermarket.chef.io/cookbooks/ssh-hardening' + + ref 'NSA-RH6-STIG - Section 3.5.2.1', url: 'https://www.nsa.gov/ia/_files/os/redhat/rhel5-guide-i731.pdf' + ref 'http://people.redhat.com/swells/scap-security-guide/RHEL/6/output/ssg-centos6-guide-C2S.html' + + describe ssh_config do + its ('Protocol') { should eq '2'} + end +end +``` diff --git a/docs/dsl_inspec.rst b/docs/dsl_inspec.rst deleted file mode 100644 index 6a6819824..000000000 --- a/docs/dsl_inspec.rst +++ /dev/null @@ -1,238 +0,0 @@ -===================================================== -InSpec DSL -===================================================== - -|inspec| is a run-time framework and rule language used to specify compliance, security, and policy requirements. It includes a collection of resources that help you write auditing controls quickly and easily. The syntax used by both open source and |chef compliance| auditing is the same. The open source |inspec resource| framework is compatible with |chef compliance|. - -The InSpec DSL is a Ruby DSL for writing audit controls, which includes audit resources that you can invoke. - -The following sections describe the syntax and show some simple examples of using the |inspec resources| to define - -Syntax -===================================================== - -The following resource tests |ssh| server configuration. For example, a simple control may described as: - -.. code-block:: ruby - - describe sshd_config do - its('Port') { should eq('22') } - end - -In various use cases like implementing IT compliance across different departments, it becomes handy to extend the control with metadata. Each control may define an additional ``impact``, ``title`` or ``desc``. An example looks like: - -.. code-block:: ruby - - control 'sshd-8' do - impact 0.6 - title 'Server: Configure the service port' - desc ' - Always specify which port the SSH server should listen to. - Prevent unexpected settings. - ' - tag 'ssh','sshd','openssh-server' - tag cce: 'CCE-27072-8' - ref 'NSA-RH6-STIG - Section 3.5.2.1', url: 'https://www.nsa.gov/ia/_files/os/redhat/rhel5-guide-i731.pdf' - - describe sshd_config do - its('Port') { should eq('22') } - end - end - - -where - -* ``'sshd-8'`` is the name of the control -* ``impact``, ``title``, and ``desc`` define metadata that fully describes the importance of the control, its purpose, with a succinct and complete description -* ``impact`` is an float that measures the importance of the compliance results and must be a value between ``0.0`` and ``1.0``. -* ``tag`` is optional meta-information with with key or key-value pairs -* ``ref`` is a reference to an external document -* ``describe`` is a block that contains at least one test. A ``control`` block must contain at least one ``describe`` block, but may contain as many as required -* ``sshd_config`` is an |inspec| resource. For the full list of InSpec resources, see |inspec| resource documentation -* ``its('Port')`` is the matcher; ``{ should eq('22') }`` is the test. A ``describe`` block must contain at least one matcher, but may contain as many as required - - -Advanced concepts -===================================================== - -With inspec it is possible to check if at least one of a collection of checks is true. For example: If a setting is configured in two different locations, you may want to test if either configuration A or configuration B have been set. This is accomplished via ``describe.one``. It defines a block of tests with at least one valid check. - -.. code-block:: ruby - - describe.one do - describe ConfigurationA do - its('setting_1') { should eq true } - end - - describe ConfigurationB do - its('setting_2') { should eq true } - end - end - -Examples -===================================================== -The following examples show simple compliance tests using a single ``control`` block. - -Test System Event Log ------------------------------------------------------ -The following test shows how to audit machines running |windows| 2012 R2 that pwassword complexity is enabled: - -.. code-block:: ruby - - control 'windows-account-102' do - impact 1.0 - title 'Windows Password Complexity is Enabled' - desc 'Password must meet complexity requirement' - describe security_policy do - its('PasswordComplexity') { should eq 1 } - end - end - -Are PosgtreSQL passwords empty? ------------------------------------------------------ -The following test shows how to audit machines running |postgresql| to ensure that passwords are not empty. - -.. code-block:: ruby - - control 'postgres-7' do - impact 1.0 - title 'Don't allow empty passwords' - describe postgres_session('user', 'pass').query("SELECT * FROM pg_shadow WHERE passwd IS NULL;") do - its('output') { should eq('') } - end - end - - -Are MySQL passwords in ENV? ------------------------------------------------------ -The following test shows how to audit machines running |mysql| to ensure that passwords are not stored in ``ENV``: - -.. code-block:: ruby - - control 'mysql-3' do - impact 1.0 - title 'Do not store your MySQL password in your ENV' - desc ' - Storing credentials in your ENV may easily expose - them to an attacker. Prevent this at all costs. - ' - describe command('env') do - its('stdout') { should_not match(/^MYSQL_PWD=/) } - end - end - -Is /etc/ssh a Directory? ------------------------------------------------------ -The following test shows how to audit machines to ensure that ``/etc/ssh`` is a directory: - -.. code-block:: ruby - - control 'basic-1' do - impact 1.0 - title '/etc/ssh should be a directory' - desc ' - In order for OpenSSH to function correctly, its - configuration path must be a folder. - ' - describe file('/etc/ssh') do - it { should be_directory } - end - end - -Is Apache running? ------------------------------------------------------ -The following test shows how to audit machines to ensure that |apache| is enabled and running: - -.. code-block:: ruby - - control 'apache-1' do - impact 0.3 - title 'Apache2 should be configured and running' - describe service(apache.service) do - it { should be_enabled } - it { should be_running } - end - end - -Are insecure packages installed ? ------------------------------------------------------ -The following test shows how to audit machines for insecure packages: - -.. code-block:: ruby - - control 'cis-os-services-5.1.3' do - impact 0.7 - title '5.1.3 Ensure rsh client is not installed' - - describe package('rsh') do - it { should_not be_installed } - end - - describe package('rsh-redone-client') do - it { should_not be_installed } - end - end - - -Test Windows Registry Keys ------------------------------------------------------ -The following test shows how to audit machines to ensure Safe DLL Seach Mode is enabled: - -.. code-block:: ruby - - control 'windows-base-101' do - impact 1.0 - title 'Safe DLL Search Mode is Enabled' - desc ' - @link: https://msdn.microsoft.com/en-us/library/ms682586(v=vs.85).aspx - ' - describe registry_key('HKLM\\System\\CurrentControlSet\\Control\\Session Manager') do - it { should exist } - it { should_not have_property_value('SafeDllSearchMode', :type_dword, '0') } - end - end - - - -Additional metadata for controls ------------------------------------------------------ - -The following example illustrates various ways to add tags and references to `control` - -.. code-block:: ruby - - control 'ssh-1' do - impact 1.0 - - title 'Allow only SSH Protocol 2' - desc 'Only SSH protocol version 2 connections should be permitted. - The default setting in /etc/ssh/sshd_config is correct, and can be - verified by ensuring that the following line appears: Protocol 2' - - tag 'production','development' - tag 'ssh','sshd','openssh-server' - - tag cce: 'CCE-27072-8' - tag disa: 'RHEL-06-000227' - - tag remediation: 'stig_rhel6/recipes/sshd-config.rb' - tag remediation: 'https://supermarket.chef.io/cookbooks/ssh-hardening' - - ref 'NSA-RH6-STIG - Section 3.5.2.1', url: 'https://www.nsa.gov/ia/_files/os/redhat/rhel5-guide-i731.pdf' - ref 'http://people.redhat.com/swells/scap-security-guide/RHEL/6/output/ssg-centos6-guide-C2S.html' - - describe ssh_config do - its ('Protocol') { should eq '2'} - end - end` - - - -.. |inspec| replace:: InSpec -.. |inspec resource| replace:: InSpec Resource -.. |chef compliance| replace:: Chef Compliance -.. |ruby| replace:: Ruby -.. |ssh| replace:: SSH -.. |windows| replace:: Microsoft Windows -.. |postgresql| replace:: PostgreSQL -.. |apache| replace:: Apache diff --git a/docs/dsl_resource.md b/docs/dsl_resource.md new file mode 100644 index 000000000..fb08a3ea9 --- /dev/null +++ b/docs/dsl_resource.md @@ -0,0 +1,93 @@ +--- +title: Resource DSL +--- + +# Resource DSL + +InSpec provides a mechanism for defining custom resources. These become +available with their respective names and provide easy functionality to +profiles. + +## Resource location + +Resources may be added to profiles in the libraries folder: + +```bash +$ tree examples/profile +examples/profile +... +├── libraries +│   └── gordon_config.rb +``` + +## Resource structure + +The smallest possible resource takes this form: + +```ruby +class Tiny < Inspec.resource(1) + name 'tiny' +end +``` + +Resources are written as a regular Ruby class which inherits from +Inspec.resource. The number (1) specifies the version this resource +plugin targets. As InSpec evolves, this interface may change and may +require a higher version. + +The following attributes can be configured: + +* name - Identifier of the resource (required) +* desc - Description of the resource (optional) +* example - Example usage of the resource (optional) + +The following methods are available to the resource: + +* inspec - Contains a registry of all other resources to interact with the operating system or target in general. +* skip\_resource - A resource may call this method to indicate, that requirements aren't met. All tests that use this resource will be marked as skipped. + +The following example shows a full resource using attributes and methods +to provide simple access to a configuration file: + +```ruby +class GordonConfig < Inspec.resource(1) + name 'gordon_config' + + desc ' + Resource description ... + ' + + example ' + describe gordon_config do + its("signal") { should eq "on" } + end + ' + + # Load the configuration file on initialization + def initialize(path = nil) + @path = path || '/etc/gordon.conf' + @params = SimpleConfig.new( read_content ) + end + + # Expose all parameters of the configuration file. + def method_missing(name) + @params[name] + end + + private + + def read_content + f = inspec.file(@path) + # Test if the path exist and that it's a file + if f.file? + # Retrieve the file's contents + f.content + else + # If the file doesn't exist, skip all tests that use gordon_config + skip_resource "Can't read config from #{@path}." + end + end +end +``` + +For a full example, see our [example resource](../examples/profile/libraries/gordon_config.rb). diff --git a/docs/dsl_resource.rst b/docs/dsl_resource.rst deleted file mode 100644 index 2de67218a..000000000 --- a/docs/dsl_resource.rst +++ /dev/null @@ -1,90 +0,0 @@ -===================================================== -Resource DSL -===================================================== - -InSpec provides a mechanism for defining custom resources. These become available with their respective names and provide easy functionality to profiles. - -Resource location ------------------------------------------------------ - -Resources may be added to profiles in the `libraries` folder: - -.. code-block:: bash - - $ tree examples/profile - examples/profile - ... - ├── libraries - │   └── gordon_config.rb - - -Resource structure ------------------------------------------------------ - -The smallest possible resource takes this form: - -.. code-block:: ruby - - class Tiny < Inspec.resource(1) - name 'tiny' - end - -Resources are written as a regular Ruby `class` which inherits from `Inspec.resource`. The number (`1`) specifies the version this resource plugin targets. As InSpec evolves, this interface may change and may require a higher version. - -The following attributes can be configured: - -* `name` - Identifier of the resource (required) -* `desc` - Description of the resource (optional) -* `example` - Example usage of the resource (optional) - -The following methods are available to the resource: - -* `inspec` - Contains a registry of all other resources to interact with the operating system or target in general. -* `skip_resource` - A resource may call this method to indicate, that requirements aren't met. All tests that use this resource will be marked as `skipped`. - -The following example shows a full resource using attributes and methods to provide simple access to a configuration file: - -.. code-block:: ruby - - class GordonConfig < Inspec.resource(1) - name 'gordon_config' - - desc ' - Resource description ... - ' - - example ' - describe gordon_config do - its("signal") { should eq "on" } - end - ' - - # Load the configuration file on initialization - def initialize(path = nil) - @path = path || '/etc/gordon.conf' - @params = SimpleConfig.new( read_content ) - end - - # Expose all parameters of the configuration file. - def method_missing(name) - @params[name] - end - - private - - def read_content - f = inspec.file(@path) - # Test if the path exist and that it's a file - if f.file? - # Retrieve the file's contents - f.content - else - # If the file doesn't exist, skip all tests that use gordon_config - skip_resource "Can't read config from #{@path}." - end - end - end - -For a full example, see our `example resource`_. - -.. _example resource: ../examples/profile/libraries/gordon_config.rb diff --git a/docs/inspec_and_friends.md b/docs/inspec_and_friends.md new file mode 100644 index 000000000..8982eebc4 --- /dev/null +++ b/docs/inspec_and_friends.md @@ -0,0 +1,105 @@ +--- +title: InSpec and friends +--- + +# InSpec and friends + +This page looks at projects that are similar to InSpec to explain how they +relate to each other. + +## RSpec + +RSpec is an awesome framework that is widely used to test Ruby code. It +enables test-driven development (TDD) and helps developers to write +better code every day. + +InSpec is built on top of RSpec and uses it as the underlying foundation +to execute tests. It uses the key strengths of RSpec, easily execute +tests and a DSL to write tests, but extends the functionality for use as +compliance audits. InSpec ships with custom audit resources that make it +easy to write audit checks and with the ability to run those checks on +remote servers. These audit resources provided know the differences +between operating systems and help you abstract from the local operating +system, similar to other resources you might use in your Chef recipes. + +A complete InSpec rule looks like: + +```ruby +control "sshd-11" do + impact 1.0 + title "Server: Set protocol version to SSHv2" + desc "Set the SSH protocol version to 2. Don't use legacy + insecure SSHv1 connections anymore." + tag security: "level-1" + tag "openssh-server" + ref "Server Security Guide v.1.0", url: "http://..." + + describe sshd_config do + its('Protocol') { should eq('2') } + end +end +``` + +## Serverspec + +Serverspec can be credited as the first extension of RSpec that enabled +users to run RSpec tests on servers to verify deployed artifacts. It was +created in March 2013 by Gosuke Miyashita and has been widely adopted. +It is also one of the core test frameworks within test-kitchen and has +been widely used within the Chef ecosystem. InSpec takes lessons learned +implementing and using Serverspec and builds on them to make auditing +and compliance easier. + +Lessons learned from Serverspec include: + +* IT, compliance, and security professional require metadata beyond what Serverspec offers, such as criticality, to fully describe controls. +* Setting up and running the same tests across multiple machines must be easy. +* It must be easy to locate, debug, and extend operating system-dependent code. +* It must be easy to extend the language and create custom resources. +* It must run multiple tests simultaneously. +* Support for Windows is a first-class requirement. +* A command line interface (CLI) is required for faster iteration of test code. + +### How is InSpec different than Serverspec + +One of the key differences is that InSpec targets more user groups. It +is optimized for DevOps, Security, and Compliance professionals. +Additional metadata, such as impact, title, and description, make it +easier to fully describe the controls which makes it easier to share the +controls with other departments. This enables Security departments to +prioritize rules. DevOps teams use this information to focus on the most +critical issues to remediate. + +```ruby +control "sshd-11" do + impact 1.0 + title "Server: Set protocol version to SSHv2" + desc "Set the SSH protocol version to 2. Don't use legacy + insecure SSHv1 connections anymore." + tag security: "level-1" + tag "openssh-server" + ref "Server Security Guide v.1.0" url: "http://..." + + describe sshd_config do + its('Protocol') { should cmp 2 } + end +end +``` + +**Why not fork Serverspec?** + +InSpec started as an extension of Serverspec. As the extension grew, it +became clear that a new library was required. Creating and maintaining a +fork was not practical so a new project was born. + +**Will InSpec only work on machines managed by Chef?** + +No, InSpec can be used on any machine. It doesn’t matter if that machine +was configured by Chef or configured lovingly by the hands of your local +System Administrator. + +**Is InSpec a replacement of Serverspec?** + +InSpec is intended to be a drop-in replacement of Serverspec. Popular +Serverspec resources have been ported to InSpec. It changed some +behaviour as documented in our migration guide. diff --git a/docs/inspec_and_friends.rst b/docs/inspec_and_friends.rst deleted file mode 100644 index a17530699..000000000 --- a/docs/inspec_and_friends.rst +++ /dev/null @@ -1,85 +0,0 @@ -===================================================== -InSpec and friends -===================================================== - -RSpec -===================================================== - -RSpec is an awesome framework that is widely used to test Ruby code. It enables test-driven development (TDD) and helps developers to write better code every day. - -InSpec is built on top of RSpec and uses it as the underlying foundation to execute tests. It uses the key strengths of RSpec, easily execute tests and a DSL to write tests, but extends the functionality for use as compliance audits. InSpec ships with custom audit resources that make it easy to write audit checks and with the ability to run those checks on remote servers. These audit resources provided know the differences between operating systems and help you abstract from the local operating system, similar to other resources you might use in your Chef recipes. - -A complete InSpec rule looks like: - -.. code-block:: ruby - - control "sshd-11" do - impact 1.0 - title "Server: Set protocol version to SSHv2" - desc "Set the SSH protocol version to 2. Don't use legacy - insecure SSHv1 connections anymore." - tag security: "level-1" - tag "openssh-server" - ref "Server Security Guide v.1.0", url: "http://..." - - describe sshd_config do - its('Protocol') { should eq('2') } - end - end - - - -Serverspec -===================================================== - -Serverspec can be credited as the first extension of RSpec that enabled users to run RSpec tests on servers to verify deployed artifacts. It was created in March 2013 by Gosuke Miyashita and has been widely adopted. It is also one of the core test frameworks within test-kitchen and has been widely used within the Chef ecosystem. InSpec takes lessons learned implementing and using Serverspec and builds on them to make auditing and compliance easier. - -Lessons learned from Serverspec include: - -* IT, compliance, and security professional require metadata beyond what Serverspec offers, such as criticality, to fully describe controls. - -* Setting up and running the same tests across multiple machines must be easy. - -* It must be easy to locate, debug, and extend operating system-dependent code. - -* It must be easy to extend the language and create custom resources. - -* It must run multiple tests simultaneously. - -* Support for Windows is a first-class requirement. - -* A command line interface (CLI) is required for faster iteration of test code. - - -How is InSpec different than Serverspec ------------------------------------------------------ - -One of the key differences is that InSpec targets more user groups. It is optimized for DevOps, Security, and Compliance professionals. Additional metadata, such as impact, title, and description, make it easier to fully describe the controls which makes it easier to share the controls with other departments. This enables Security departments to prioritize rules. DevOps teams use this information to focus on the most critical issues to remediate. - -.. code-block:: ruby - - control "sshd-11" do - impact 1.0 - title "Server: Set protocol version to SSHv2" - desc "Set the SSH protocol version to 2. Don't use legacy - insecure SSHv1 connections anymore." - tag security: "level-1" - tag "openssh-server" - ref "Server Security Guide v.1.0" url: "http://..." - - describe sshd_config do - its('Protocol') { should cmp 2 } - end - end - -**Why not fork Serverspec?** - -InSpec started as an extension of Serverspec. As the extension grew, it became clear that a new library was required. Creating and maintaining a fork was not practical so a new project was born. - -**Will InSpec only work on machines managed by Chef?** - -No, InSpec can be used on any machine. It doesn’t matter if that machine was configured by Chef or configured lovingly by the hands of your local System Administrator. - -**Is InSpec a replacement of Serverspec?** - -InSpec is intended to be a drop-in replacement of Serverspec. Popular Serverspec resources have been ported to InSpec. It changed some behaviour as documented in our migration guide. diff --git a/docs/matchers.md b/docs/matchers.md new file mode 100644 index 000000000..ab1eb02af --- /dev/null +++ b/docs/matchers.md @@ -0,0 +1,136 @@ +--- +title: InSpec Matchers Reference +--- + +# InSpec Matchers Reference + +Inspec uses matchers to help compare resource values to expectations. +The following matchers are available: + +* `be` +* `cmp` +* `eq` +* `include` +* `match` + +## be + +This matcher can be followed by many different comparison operators. +Always make sure to use numbers, not strings, for these comparisons. + +```ruby +describe file('/proc/cpuinfo') do + its('size') { should be >= 10 } + its('size') { should be < 1000 } +end +``` + +## cmp + +Unlike `eq`, cmp is a matcher for less-restrictive comparisons. It will +try to fit the actual value to the type you are comparing it to. This is +meant to relieve the user from having to write type-casts and +resolutions. + +```ruby +describe sshd_config do + its('Protocol') { should cmp 2 } +end + +describe passwd.uid(0) do + its('users') { should cmp 'root' } +end +``` + +`cmp` behaves in the following way: + +* Compare strings to numbers + + ```ruby + describe sshd_config do + its('Protocol') { should eq '2' } + + its('Protocol') { should cmp '2' } + its('Protocol') { should cmp 2 } + end + ``` + +* String comparisons are not case-sensitive + + ```ruby + describe auditd_conf do + its('log_format') { should cmp 'raw' } + its('log_format') { should cmp 'RAW' } + end + ``` + +* Compare arrays with only one entry to a value + + ```ruby + describe passwd.uids(0) do + its('users') { should cmp 'root' } + its('users') { should cmp ['root'] } + end + ``` + +* Single-value arrays of strings may also be compared to a regex + + ```ruby + describe auditd_conf do + its('log_format') { should cmp /raw/i } + end + ``` + +* Improved printing of octal comparisons + + ```ruby + describe file('/proc/cpuinfo') do + its('mode') { should cmp '0345' } + end + + expected: 0345 + got: 0444 + ``` + +## eq + +Test for exact equality of two values. + +```ruby +describe sshd_config do + its('RSAAuthentication') { should_not eq 'no' } + its('Protocol') { should eq '2' } +end +``` + +It fails if types don't match. Please keep this in mind, when comparing +configuration entries that are numbers: + +```ruby +its('Port') { should eq '22' } # ok + +its('Port') { should eq 22 } +# fails: '2' != 2 (string vs int) +``` + +For less restrictive comparisons, please use `cmp`. + +## include + +Verifies if a value is included in a list. + +```ruby +describe passwd do + its('users') { should include 'my_user' } +end +``` + +## match + +Check if a string matches a regular expression. + +```ruby +describe sshd_config do + its('Ciphers') { should_not match /cbc/ } +end +``` diff --git a/docs/matchers.rst b/docs/matchers.rst deleted file mode 100644 index 5be8ffdd9..000000000 --- a/docs/matchers.rst +++ /dev/null @@ -1,137 +0,0 @@ -===================================================== -InSpec Matchers Reference -===================================================== - - -Inspec uses matchers to help compare resource values to expectations. The following matchers are available: - -* `be` -* `cmp` -* `eq` -* `include` -* `match` - - -be -===================================================== - -This matcher can be followed by many different comparison operators. Always make sure to use numbers, not strings, for these comparisons. - -.. code-block:: ruby - - describe file('/proc/cpuinfo') do - its('size') { should be >= 10 } - its('size') { should be < 1000 } - end - -cmp -===================================================== - -Unlike ``eq``, cmp is a matcher for less-restrictive comparisons. It will try to fit the actual value to the type you are comparing it to. This is meant to relieve the user from having to write type-casts and resolutions. - -.. code-block:: ruby - - describe sshd_config do - its('Protocol') { should cmp 2 } - end - - describe passwd.uid(0) do - its('users') { should cmp 'root' } - end - -``cmp`` behaves in the following way: - -* Compare strings to numbers - - .. code-block:: ruby - - describe sshd_config do - its('Protocol') { should eq '2' } - - its('Protocol') { should cmp '2' } - its('Protocol') { should cmp 2 } - end - -* String comparisons are not case-sensitive - - .. code-block:: ruby - - describe auditd_conf do - its('log_format') { should cmp 'raw' } - its('log_format') { should cmp 'RAW' } - end - -* Compare arrays with only one entry to a value - - .. code-block:: ruby - - describe passwd.uids(0) do - its('users') { should cmp 'root' } - its('users') { should cmp ['root'] } - end - -* Single-value arrays of strings may also be compared to a regex - - .. code-block:: ruby - - describe auditd_conf do - its('log_format') { should cmp /raw/i } - end - -* Improved printing of octal comparisons - - .. code-block:: ruby - - describe file('/proc/cpuinfo') do - its('mode') { should cmp '0345' } - end - - expected: 0345 - got: 0444 - -eq -===================================================== - -Test for exact equality of two values. - -.. code-block:: ruby - - describe sshd_config do - its('RSAAuthentication') { should_not eq 'no' } - its('Protocol') { should eq '2' } - end - -It fails if types don't match. Please keep this in mind, when comparing configuration -entries that are numbers: - -.. code-block:: ruby - - its('Port') { should eq '22' } # ok - - its('Port') { should eq 22 } - # fails: '2' != 2 (string vs int) - -For less restrictive comparisons, please use ``cmp``. - -include -===================================================== - -Verifies if a value is included in a list. - -.. code-block:: ruby - - describe passwd do - its('users') { should include 'my_user' } - end - - -match -===================================================== - -Check if a string matches a regular expression. - -.. code-block:: ruby - - describe sshd_config do - its('Ciphers') { should_not match /cbc/ } - end diff --git a/docs/plugin_kitchen_inspec.html.md b/docs/plugin_kitchen_inspec.html.md new file mode 100644 index 000000000..18a5a1a8b --- /dev/null +++ b/docs/plugin_kitchen_inspec.html.md @@ -0,0 +1,55 @@ +--- +title: About kitchen-inspec +--- + +# kitchen-inspec + +The `kitchen-inspec` driver enables InSpec to be used as a verifier within Kitchen. + +To use InSpec as a verifier, add it to the kitchen.yml file: + + verifier: + name: inspec + +To define a suite that pulls its run-list from the Chef Compliance server: + + suites: + - name: compliance + run_list: + - recipe[ssh-hardening] + verifier: + inspec_tests: + - compliance://base/ssh + +and then run the following command: + + $ inspec compliance login https://compliance.test --user admin --insecure --token '' + +where `--insecure` is required when using self-signed certificates. + +To define a suite that pulls its run-list from the Chef Supermarket: + + suites: + - name: supermarket + run_list: + - recipe[ssh-hardening] + verifier: + inspec_tests: + - supermarket://hardening/ssh-hardening + +The `kitchen-inspec` driver expects tests to be located in the `test/integration` directory in a cookbook. For example:: + + . + ├── Berksfile + ├── Gemfile + ├── README.md + ├── metadata.rb + ├── recipes + │ ├── default.rb + │ └── nginx.rb + └── test + └── integration + └── default + ├── controls + ├── inspec.yml + └── libraries diff --git a/docs/profiles.md b/docs/profiles.md new file mode 100644 index 000000000..8e670ef7c --- /dev/null +++ b/docs/profiles.md @@ -0,0 +1,302 @@ +--- +title: About InSpec Profiles +--- + +# InSpec Profiles + +InSpec supports the creation of complex test and compliance profiles, which organize controls to support dependency management and code reuse. Each profile is a standalone structure with its own distribution and execution flow. + +# Profile Structure + +A profile should have the following structure:: + + examples/profile + ├── README.md + ├── controls + │ ├── example.rb + │ └── control_etc.rb + ├── libraries + │ └── extension.rb + └── inspec.yml + +where: + +* `inspec.yml` includes the profile description (required) +* `controls` is the directory in which all tests are located (required) +* `libraries` is the directory in which all InSpec resource extensions are located (optional) +* `README.md` should be used to explain the profile, its scope, and usage + +See a complete example profile in the InSpec open source repository: https://github.com/chef/inspec/tree/master/examples/profile + +## inspec.yml + +Each profile must have an `inspec.yml` file that defines the following information: + + * Use `name` to specify a unique name for the profile. Required. + * Use `title` to specify a human-readable name for the profile. + * Use `maintainer` to specify the profile maintainer. + * Use `copyright` to specify the copyright holder. + * Use `copyright_email` to specify support contact information for the profile, typically an email address. + * Use `license` to specify the license for the profile. + * Use `summary` to specify a one line summary for the profile. + * Use `description` to specify a multiple line description of the profile. + * Use `version` to specify the profile version. + * Use `supports` to specify a list of supported platform targets. + * Use `depends` to define a list of profiles on which this profile depends. + +`name` is required; all other profile settings are optional. For example: + + name: ssh + title: Basic SSH + maintainer: Chef Software, Inc. + copyright: Chef Software, Inc. + copyright_email: support@chef.io + license: Proprietary, All rights reserved + summary: Verify that SSH Server and SSH Client are configured securely + version: 1.0.0 + supports: + - os-family: linux + depends: + - name: profile + path: ../path/to/profile + +## Verify Profiles + +Use the `inspec check` command to verify the implementation of a profile: + + $ inspec check examples/profile + +# Platform Support + +Use the `supports` setting in the `inspec.yml` file to specify one (or more) platforms for which a profile is targeting. The list of supported platforms may contain simple names, names and versions, or detailed flags, and may be combined arbitrarily. For example, to target anything running Debian Linux: + + name: ssh + supports: + - os-name: debian + +and to target only Ubuntu version 14.04 + + name: ssh + supports: + - os-name: ubuntu + release: 14.04 + +and to target the entire RedHat platform (including CentOS and Oracle Linux): + + name: ssh + supports: + - os-family: redhat + +and to target anything running on Amazon AWS: + + name: ssh + supports: + - platform: aws + +and to target all of these examples in a single `inspec.yml` file: + + name: ssh + supports: + - os-name: debian + supports: + - os-name: ubuntu + release: 14.04 + supports: + - os-family: redhat + supports: + - platform: aws + + +# Profile Dependencies + +A profile dependency is needed when: + + * using `include_controls` or `require_controls` in order to load controls defined in another profile + * using a custom InSpec resource defined in another profile + +Use the `depends` setting in the `inspec.yml` file to specify one (or more) profiles on which this profile depends. A profile dependency may be sourced from a path, URL, a git repo, a cookbook located on Chef Supermarket or on GitHub, or a profile located on the Chef Compliance server. + +## Path + +The `path` setting defines a profile that is located on disk. This setting is typically used during development of profiles and when debugging profiles. This setting does not support version constraints. If the location of the profile does not exist, an error is returned. + +For example: + + depends: + - name: my-profile + path: /absolute/path + - name: another + path: ../relative/path + +## URL + +The `url` setting specifies a profile that is located at an HTTP- or HTTPS-based URL. The profile must be accessible via a HTTP GET operation and must be a valid profile archive (zip, tar, tar.gz format). If the download fails, the profile is inaccessible, or not in the correct format, an error is returned. + +For example: + + depends: + - name: my-profile + url: https://my.domain/path/to/profile.tgz + +## git + +A `git` setting specifies a profile that is located in a git repository, with optional settings for branch, tag, commit, and version. The source location is translated into a URL upon resolution. This type of dependency supports version indexing via semantic versioning as git tags. + +For example: + + depends: + - name: git-profile + git: http://url/to/repo + branch: desired_branch + tag: desired_version + commit: pinned_commit + version: semver_via_tags + +## Chef Supermarket + +A `supermarket` setting specifies a profile that is located in a cookbook hosted on Chef Supermarket, with optional settings for branch, tag, commit, and version. The source location is translated into a URL upon resolution. This type of dependency supports version indexing via semantic versioning as git tags. + +For example: + + depends: + - name: supermarket-profile + git: username/profile + branch: desired_branch + tag: desired_version + commit: pinned_commit + version: semver_via_tags + +## GitHub + +A `github` setting specifies a profile that is located in a repository hosted on GitHub, with optional settings for branch, tag, commit, and version. The source location is translated into a URL upon resolution. This type of dependency supports version indexing via semantic versioning as git tags. + +For example: + + depends: + - name: gh-profile + git: username/project + branch: desired_branch + tag: desired_version + commit: pinned_commit + version: semver_via_tags + +## Chef Compliance + +A `compliance` setting specifies a profile that is located on the Chef Compliance server. + +For example: + + depends: + - name: linux + compliance: base/linux + + +## Define in inspec.yml + +Use the `depends` setting in the `inspec.yml` file to define any combination of profile dependencies. For example: + + depends: + - name: ssh-hardening + supermarket: hardening/ssh-hardening + version: '= 2.0.0' + - name: os-hardening + url: https://github.com/dev-sec/tests-os-hardening/archive/master.zip + - name: ssl-benchmark + git: https://github.com/dev-sec/ssl-benchmark.git + version: '< 2.0' + - name: windows-patch-benchmark + git: https://github.com/chris-rock/windows-patch-benchmark.git + version: '~> 0.6' + - name: linux + compliance: base/linux + +## Vendoring Dependencies + +When you execute a local profile, the `inspec.yml` file will be read in order to source any profile dependencies. It will then cache the dependencies locally and generate an `inspec.lock` file. If you add or update dependencies in `inspec.yml`, please refresh the lock file by either: + + * running `inspec vendor` inside the profile directory; or + * deleting `inspec.lock` before running `inspec exec` + +# Profile Inheritance + +When a profile is run, it may include controls that are defined in other profiles. Controls may also be required. + +This requires an `inspec.yml` dependency to the profile you inherit from. + +## include_controls + +The `include_controls` keyword may be used in a profile to import all rules from the named profile. + +For example, to include controls from the `cis-level-1` profile when running the `cis-fs-2.7` profile: + + include_controls 'cis-level-1' do + + control "cis-fs-2.7" do + impact 1.0 + ... + + end + +To include controls from the `cis-level-1` profile, but skipping two controls within that profile: + + include_controls 'cis-level-1' do + + skip_control "cis-fs-2.1" + skip_control "cis-fs-2.2" + + end + +## require_controls + +The `require_controls` keyword may be used to load only specific controls from the named profile. + +For example, to require that controls `cis-fs-2.1` and `cis-fs-2.2` be loaded from the `cis-level-1` profile: + + require_controls 'cis-level-1' do + + control "cis-fs-2.1" + control "cis-fs-2.2" + + end + + +## require_resource + +By default, all of the resources from a listed dependency are available +for use in your profile. If two of your dependencies provide a resource with +the same name, you can use the `require_resource` DSL function to +disambiguate the two: + + require_resource(profile: 'my_dep', resource: 'my_res', + as: 'my_res2') + +This will allow you to reference the resource `my_res` from the +profile `my_dep` using the name `my_res2`. + +# Profile Attributes + +Attributes may be used in profiles to define secrets, such as user names and passwords, that should not otherwise be stored in plain-text in a cookbook. First specify a variable in the control for each secret, then add the secret to a Yaml file located on the local machine, and then run `inspec exec` and specify the path to that Yaml file using the `--attrs` attribute. + +For example, a control: + + val_user = attribute('user', default: 'alice', description: 'An identification for the user') + val_password = attribute('password', description: 'A value for the password') + + describe val_user do + it { should eq 'bob' } + end + + describe val_password do + it { should eq 'secret' } + end + +And a Yaml file named `profile-attribute.yml`: + + user: bob + password: secret + +The following command runs the tests and applies the secrets specified in `profile-attribute.yml`: + + $ inspec exec examples/profile-attribute --attrs examples/profile-attribute.yml + +See the full example in the InSpec open source repository: https://github.com/chef/inspec/tree/master/examples/profile-attribute diff --git a/docs/profiles.rst b/docs/profiles.rst deleted file mode 100644 index d8855c6bd..000000000 --- a/docs/profiles.rst +++ /dev/null @@ -1,169 +0,0 @@ -===================================================== -InSpec Profiles -===================================================== - -InSpec supports the creation of complex test and compliance profiles, which organize controls to support dependency management and code re-use. These profiles are standalone structures with their own distribution and execution flow. - -InSpec profile structure ------------------------------------------------------ - -To create a new profile just place the files according to the following structure: - -.. code-block:: bash - - $ tree examples/profile - examples/profile - ├── README.md - ├── controls - │   ├── example.rb - │   └── gordon.rb - ├── libraries - │   └── gordon_config.rb - └── inspec.yml - - - * `inspec.yml` - includes the profile description (required) - * `controls` - a folder which contains all tests (required) - * `libraries` - a folder which contains InSpec resource extensions (optional) - * `README.md` - a best-practice readme to each explain the profile and its scope - -For a full example, see our `example profile`_. - -.. _example profile: ../examples/profile - -InSpec profile manifest ------------------------------------------------------ - -Each profile has a manifest file `inspec.yml`. It looks as follows - -.. code-block:: yaml - - name: ssh - title: Basic SSH - maintainer: Chef Software, Inc. - copyright: Chef Software, Inc. - copyright_email: support@chef.io - license: Proprietary, All rights reserved - summary: Verify that SSH Server and SSH Client are configured securely - version: 1.0.0 - supports: - - os-family: linux - - -A manifest description may contain the following values: - - * `name` - Identifier of the profile (required) - * `title` - Human-readable name of the profile (optional) - * `maintainer` - Name of the profile maintainer (optional) - * `copyright` - Copyright holder (optional) - * `copyright_email` - Support contact for profile (optional) - * `license` - License of the profile (optional) - * `summary` - One-line summary of the profile (optional) - * `description` - Description of the profile (optional) - * `version` - Version of the profile (optional) - * `supports` - A list of supported targets (optional) - -Supported targets ------------------------------------------------------ - -The manifest contains the `supports` flag, which specifies operating systems or even cloud systems that the profile is targeting. - -This list can contain simple names, names and versions, or detailed flags for the targeted system. These can freely be combined: - -.. code-block:: yaml - - name: ssh - supports: - // Runs on any version of Debian Linux - - os-name: debian - - // Only runs on Ubuntu 14.04 - - os-name: ubuntu - release: 14.04 - - // Targets RedHat, CentOS, Oracle Linux ... - - os-family: redhat - - // Or even broader - - platform: aws - - -InSpec profile verification ------------------------------------------------------ - -InSpec ships with a verification command that verifies the implementation of a profile: - -.. code-block:: bash - - $ inspec check examples/profile - - -InSpec profile archive ------------------------------------------------------ - -Profiles are composed of multiple files. This hinders easy distribution of a profile. InSpec solves the problem by offering to collect all files in one archive. - -The InSpec profile archive format aims for flexibility and reuse of standard and common technologies: - - * tar and gzip (default) - * zip - * HTTP - -This should enable third-parties to easily build InSpec profile archives: - - * InSpec archives MUST be named with the stanard suffix - * InSpec archives MUST be a tar.gz or zip formatted file - * InSpec archives MUST have no duplicate entries - * InSpec archives MAY be compressed with gzip, bzip2, or xz. - -InSpec is able to create profile archive for you. By default it generates a tar-file on Unix and zip on Windows or Mac. - -.. code-block:: bash - - # will generate a example-profile.tar.gz - $ inspec archive examples/profile - - # will generate a example-profile.zip - $ inspec archive examples/profile --zip - - -Profile inheritance ------------------------------------------------------ - -**Include controls of existing profile** - -The `include_controls` keyword allows you to import all rules from an existing profile. This can be easily extended with additional rules. - -.. code-block:: bash - - include_controls 'cis-level-1' do - - control "cis-fs-2.7" do - impact 1.0 - ... - - end - -**Inherit from a profile, but skip some rules** - -Sometimes, not all requirements can be fulfilled for a legacy application. To manage the derivation, you can skip certain controls with `skip_control`. - -.. code-block:: bash - - include_controls 'cis-level-1' do - - skip_control "cis-fs-2.1" - skip_control "cis-fs-2.2" - - end - -**Load specific controls from another profile** - -.. code-block:: bash - - require_controls 'cis-level-1' do - - control "cis-fs-2.1" - control "cis-fs-2.2" - - end diff --git a/docs/readme.rst b/docs/readme.rst deleted file mode 100644 index 8448860a8..000000000 --- a/docs/readme.rst +++ /dev/null @@ -1,105 +0,0 @@ -===================================================== -InSpec Documentation -===================================================== - -InSpec a collection of resources and matchers to test the compliance of your nodes. This documentation provides an introduction to this mechanism and shows how to write custom tests. - -Introduction ------------------------------------------------------ - -At first, we add our tests to the ``test`` folder. Each test file must end with ``_spec.rb``: - -.. code-block:: bash - - mkdir test - touch test/example_spec.rb - -We add a control to this file, to check the ``/tmp`` path in our system: - -.. code-block:: ruby - - # encoding: utf-8 - - control "cis-fs-2.1" do # A unique ID for this control - impact 0.7 # The criticality, if this control fails. - title "Create separate /tmp partition" # A human-readable title - desc "An optional description..." - tag mygroup: "tag" # A tag can be a simple value or - tag "tag" # can have a more complex key/value pair. - ref "name", url: "http://..." # A reference to a document, uri: is optional - describe file('/tmp') do # The actual test - it { should be_mounted } - end - end - - -Let's add another spec for checking the SSH server configuration: - -.. code-block:: bash - - touch test/sshd_spec.rb - -It will contain: - -.. code-block:: ruby - - # encoding: utf-8 - - # Skip all controls, if SSH doesn't exist on the system - only_if do - command('sshd').exist? - end - - control "sshd-11" do - impact 1.0 - title "Server: Set protocol version to SSHv2" - desc "Set the SSH protocol version to 2. Don't use legacy - insecure SSHv1 connections anymore." - tag security: "openssh-server" - ref "Document A-12" - - describe sshd_config do - its('Protocol') { should eq('2') } - end - end - - control "sshd-7" do - impact 1.0 - title "Server: Do not permit root-based login with password." - desc "To reduce the potential to gain full privileges - of a system in the course of an attack (by either misconfiguration - or vulnerabilities), do not allow login as root with password" - tag security: "openssh-server" - ref "Document A-12" - - describe sshd_config do - its('PermitRootLogin') { should match(/no|without-password/) } - end - end - - -Now, we are ready to run the tests locally: - -bundle exec bin/inspec exec demo/test/example_spec.rb - -.. code-block:: bash - - # run tests individually - $ inspec exec test/example_spec.rb - $ inspec exec test/sshd_spec.rb - - # if you want to run all test located within the directory - $ inspec exec ./test - - -Stability Index ------------------------------------------------------ - -Every available InSpec resource will indicate its stability. As InSpec matures, certain parts are more reliable than others. Brand new features are likely to be redesigned and marked as such. - -The stability indices are as follows: - -* ``Stability: Deprecated`` - This features will be removed in future versions, because its known for being problematic. Do not rely on it. -* ``Stability: Experimental`` - New features may change or are removed in future versions -* ``Stability: Stable`` - API is well established and proofed. Maintaining compatibility is a high priority -* ``Stability: Locked`` - Only security and performance fixes are allowed diff --git a/docs/resources.rst b/docs/resources.rst deleted file mode 100644 index 93d1d8d2f..000000000 --- a/docs/resources.rst +++ /dev/null @@ -1,4784 +0,0 @@ -===================================================== -InSpec Resources Reference -===================================================== - -The following InSpec audit resources are available: - -* `apache_conf`_ -* `apt`_ -* `audit_policy`_ -* `auditd_conf`_ -* `auditd_rules`_ -* `bash`_ -* `bond`_ -* `bridge`_ -* `csv`_ -* `command`_ -* `directory`_ -* `etc_group`_ -* `file`_ -* `gem`_ -* `group `_ -* `grub_conf`_ -* `host`_ -* `iis_site`_ -* `inetd_conf`_ -* `interface`_ -* `iptables`_ -* `kernel_module`_ -* `kernel_parameter`_ -* `limits_conf`_ -* `login_defs`_ -* `mount`_ -* `mysql_conf`_ -* `mysql_session`_ -* `npm`_ -* `ntp_conf`_ -* `oneget`_ -* `os`_ -* `os_env`_ -* `package`_ -* `parse_config`_ -* `parse_config_file`_ -* `passwd`_ -* `pip`_ -* `port`_ -* `postgres_conf`_ -* `postgres_session`_ -* `powershell`_ -* `processes`_ -* `registry_key`_ -* `security_policy`_ -* `service`_ -* `ssh_config`_ -* `sshd_config`_ -* `user`_ -* `windows_feature`_ -* `yaml`_ -* `yum`_ - -See below for more information about each InSpec audit resource, its related matchers, and examples of how to use it in a recipe. - - -apache_conf -===================================================== -Use the ``apache_conf`` |inspec resource| to test the configuration settings for |apache|. This file is typically located under ``/etc/apache2`` on the |debian| and |ubuntu| platforms and under ``/etc/httpd`` on the |fedora|, |centos|, |redhat enterprise linux|, and |archlinux| platforms. The configuration settings may vary significantly from platform to platform. - -**Stability: Experimental** - -Syntax ------------------------------------------------------ -An ``apache_conf`` |inspec resource| block declares configuration settings that should be tested: - -.. code-block:: ruby - - describe apache_conf('path') do - its('setting_name') { should eq 'value' } - end - -where - -* ``'setting_name'`` is a configuration setting defined in the |apache| configuration file -* ``('path')`` is the non-default path to the |apache| configuration file -* ``{ should eq 'value' }`` is the value that is expected - -Matchers ------------------------------------------------------ -This |inspec resource| matches any service that is listed in the |apache| configuration file: - -.. code-block:: ruby - - its('PidFile') { should_not eq '/var/run/httpd.pid' } - -or: - -.. code-block:: ruby - - its('Timeout') { should eq 300 } - -For example: - -.. code-block:: ruby - - describe apache_conf do - its('MaxClients') { should eq 100 } - its('Listen') { should eq '443'} - end - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource in a test. - -**Test for blocking .htaccess files on CentOS** - -.. code-block:: ruby - - describe apache_conf do - its('AllowOverride') { should eq 'None' } - end - -**Test ports for SSL** - -.. code-block:: ruby - - describe apache_conf do - its('Listen') { should eq '443'} - end - - -apt -===================================================== -Use the ``apt`` |inspec resource| to verify |apt| repositories on the |debian| and |ubuntu| platforms, and also |ppa| repositories on the |ubuntu| platform. - -**Stability: Stable** - -Syntax ------------------------------------------------------ -An ``apt`` |inspec resource| block tests the contents of |apt| and |ppa| repositories: - -.. code-block:: ruby - - describe apt('path') do - it { should exist } - it { should be_enabled } - end - -where - -* ``apt('path')`` must specify an |apt| or |ppa| repository -* ``('path')`` may be an ``http://`` address, a ``ppa:`` address, or a short ``repo-name/ppa`` address -* ``exist`` and ``be_enabled`` are a valid matchers for this |inspec resource| - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -be_enabled -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``be_enabled`` matcher tests if a package exists in the repository: - -.. code-block:: ruby - - it { should be_enabled } - -exist -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``exist`` matcher tests if a package exists on the system: - -.. code-block:: ruby - - it { should exist } - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource in a test. - -**Test if apt repository exists and is enabled** - -.. code-block:: ruby - - describe apt('http://ppa.launchpad.net/juju/stable/ubuntu') do - it { should exist } - it { should be_enabled } - end - -**Verify that a PPA repository exists and is enabled** - -.. code-block:: ruby - - describe apt('ppa:nginx/stable') do - it { should exist } - it { should be_enabled } - end - -**Verify that a repository is not present** - -.. code-block:: ruby - - describe apt('ubuntu-wine/ppa') do - it { should_not exist } - it { should_not be_enabled } - end - - - -audit_policy -===================================================== -Use the ``audit_policy`` |inspec resource| to test auditing policies on the |windows| platform. An auditing policy is a category of security-related events to be audited. Auditing is disabled by default and may be enabled for categories like account management, logon events, policy changes, process tracking, privilege use, system events, or object access. For each auditing category property that is enabled, the auditing level may be set to ``No Auditing``, ``Not Specified``, ``Success``, ``Success and Failure``, or ``Failure``. - -**Stability: Experimental** - -Syntax ------------------------------------------------------ -An ``audit_policy`` |inspec resource| block declares a parameter that belongs to an audit policy category or subcategory: - -.. code-block:: ruby - - describe audit_policy do - its('parameter') { should eq 'value' } - end - -where - -* ``'parameter'`` must specify a parameter -* ``'value'`` must be one of ``No Auditing``, ``Not Specified``, ``Success``, ``Success and Failure``, or ``Failure`` - -Matchers ------------------------------------------------------ -This InSpec audit resource does not have any matchers. - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test that a parameter is not set to "No Auditing"** - -.. code-block:: ruby - - describe audit_policy do - its('Other Account Logon Events') { should_not eq 'No Auditing' } - end - -**Test that a parameter is set to "Success"** - -.. code-block:: ruby - - describe audit_policy do - its('User Account Management') { should eq 'Success' } - end - - - -auditd_conf -===================================================== -Use the ``auditd_conf`` |inspec resource| to test the configuration settings for the audit daemon. This file is typically located under ``/etc/audit/auditd.conf'`` on |unix| and |linux| platforms. - -**Stability: Experimental** - -Syntax ------------------------------------------------------ -A ``auditd_conf`` |inspec resource| block declares configuration settings that should be tested: - -.. code-block:: ruby - - describe auditd_conf('path') do - its('keyword') { should cmp 'value' } - end - -where - -* ``'keyword'`` is a configuration setting defined in the ``auditd.conf`` configuration file -* ``('path')`` is the non-default path to the ``auditd.conf`` configuration file -* ``{ should eq 'value' }`` is the value that is expected - -Matchers ------------------------------------------------------ -This |inspec resource| matches any keyword that is listed in the ``auditd.conf`` configuration file. Since all option names and values are case insensitive for ``auditd_conf``, we recommend to compare values with `cmp` instead of the `eq`: - -.. code-block:: ruby - - its('log_format') { should cmp 'raw' } - its('max_log_file') { should cmp 6 } - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test the auditd.conf file** - -.. code-block:: ruby - - describe auditd_conf do - its('log_file') { should cmp '/full/path/to/file' } - its('log_format') { should cmp 'raw' } - its('flush') { should cmp 'none' } - its('freq') { should cmp 1 } - its('num_logs') { should cmp 0 } - its('max_log_file') { should cmp 6 } - its('max_log_file_action') { should cmp 'email' } - its('space_left') { should cmp 2 } - its('action_mail_acct') { should cmp 'root' } - its('space_left_action') { should cmp 'email' } - its('admin_space_left') { should cmp 1 } - its('admin_space_left_action') { should cmp 'halt' } - its('disk_full_action') { should cmp 'halt' } - its('disk_error_action') { should cmp 'halt' } - end - - - -auditd_rules -===================================================== -Use the ``auditd_rules`` |inspec resource| to test the rules for logging that exist on the system. The ``audit.rules`` file is typically located under ``/etc/audit/`` and contains the list of rules that define what is captured in log files. This resource uses `auditctl` to query the _run-time_ auditd rules setup (which may divert from `audit.rules`). - -**Stability: Experimental** - -Syntax ------------------------------------------------------ -A change in the output format (with an `audit` package version 2.3 or newer) is reflected in two interfaces included in `auditd_rules`: - -A ``auditd_rules`` |inspec resource| block declares one (or more) rules to be tested, and then what that rule should do: - -.. code-block:: ruby - - describe auditd_rules do - its('LIST_RULES') { should eq [ - 'exit,always syscall=rmdir,unlink', - 'exit,always auid=1001 (0x3e9) syscall=open', - 'exit,always watch=/etc/group perm=wa', - 'exit,always watch=/etc/passwd perm=wa', - 'exit,always watch=/etc/shadow perm=wa', - 'exit,always watch=/etc/sudoers perm=wa', - 'exit,always watch=/etc/secret_directory perm=r', - ] } - end - -or test that individual rules are defined: - -.. code-block:: ruby - - describe auditd_rules do - its('LIST_RULES') {should contain_match(/^exit,always watch=\/etc\/group perm=wa key=identity/) } - its('LIST_RULES') {should contain_match(/^exit,always watch=\/etc\/passwd perm=wa key=identity/) } - its('LIST_RULES') {should contain_match(/^exit,always watch=\/etc\/gshadow perm=wa key=identity/)} - its('LIST_RULES') {should contain_match(/^exit,always watch=\/etc\/shadow perm=wa key=identity/)} - its('LIST_RULES') {should contain_match(/^exit,always watch=\/etc\/security\/opasswd perm=wa key=identity/)} - end - -where each test - -* must declare one (or more) rules to be tested - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test if a rule contains a matching element that is identified by a regular expression.** - -.. code-block:: ruby - - # syntax for audit < 2.3 - describe audit_daemon_rules do - its("LIST_RULES") { - should contain_match(/^exit,always arch=.* key=time-change syscall=adjtimex,settimeofday/) - } - end - - # syntax for auditd >= 2.3 - describe auditd_rules do - its('lines') { should contain_match(%r{-w /etc/ssh/sshd_config/}) } - end - -The syntax for recent auditd versions allows more precise tests, such as the following: - -**Query the audit daemon status.** - -.. code-block:: ruby - - describe auditd_rules.status('backlog') do - it { should cmp 0 } - end - -**Query properties of rules targeting specific syscalls or files.** - -.. code-block:: ruby - - describe auditd_rules.syscall('open').action do - it { should eq(['always']) } - end - - describe auditd_rules.key('sshd_config') do - its('permissions') { should contain_match(/x/) } - end - -Note that filters can be chained, for example: - -.. code-block:: ruby - - describe auditd_rules.syscall('open').action('always').list do - it { should eq(['exit']) } - end - - - - -bash -===================================================== -Use the ``bash`` |inspec resource| to test an arbitrary command in BASH on the system. - -**Stability: Stable** - -Syntax ------------------------------------------------------ -A ``bash`` |inspec resource| block declares a command to be run, one (or more) expected outputs, and the location to which that output is sent: - -.. code-block:: ruby - - describe bash('command') do - it { should exist } - its('matcher') { should eq 'output' } - end - -where - -* ``'command'`` must specify a command to be run -* ``'matcher'`` is one of ``exit_status``, ``stderr``, or ``stdout`` -* ``'output'`` tests the output of the command run on the system versus the output value stated in the test - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -exist -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``exist`` matcher tests if a command may be run on the system: - -.. code-block:: ruby - - it { should exist } - -exit_status -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``exit_status`` matcher tests the exit status for the command: - -.. code-block:: ruby - - its('exit_status') { should eq 123 } - -stderr -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``stderr`` matcher tests results of the command as returned in standard error (stderr): - -.. code-block:: ruby - - its('stderr') { should eq 'error' } - -stdout -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``stdout`` matcher tests results of the command as returned in standard output (stdout): - -.. code-block:: ruby - - its('stdout') { should match /^1$/ } - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**List content of a directorye** - -.. code-block:: ruby - - describe bash('ls -al /') do - its('stdout') { should match /bin/ } - its('stderr') { should eq '' } - its('exit_status') { should eq 0 } - end - -**Test standard output (stdout)** - -.. code-block:: ruby - - describe bash('echo hello') do - its('stdout') { should eq 'hello\n' } - its('stderr') { should eq '' } - its('exit_status') { should eq 0 } - end - -**Test standard error (stderr)** - -.. code-block:: ruby - - describe bash('>&2 echo error') do - its('stdout') { should eq '' } - its('stderr') { should eq 'error\n' } - its('exit_status') { should eq 0 } - end - -**Test an exit status code** - -.. code-block:: ruby - - describe bash('exit 123') do - its('stdout') { should eq '' } - its('stderr') { should eq '' } - its('exit_status') { should eq 123 } - end - -**Specify the path of the bash executable** - -.. code-block:: ruby - - describe bash('echo hello', path: '/bin/bash') do - its('stdout') { should eq 'hello\n' } - end - -**Specify bash arguments (defaults to -c)** - -.. code-block:: ruby - - describe bash('echo hello', args: '-x -c') do - its('stdout') { should eq 'hello\n' } - end - - - - -bond -===================================================== -Use the ``bond`` |inspec resource| to test a logical, bonded network interface (i.e. "two or more network interfaces aggregated into a single, logical network interface"). On |linux| platforms, any value in the ``/proc/net/bonding`` directory may be tested. - -**Stability: Stable** - -Syntax ------------------------------------------------------ -A ``bond`` |inspec resource| block declares a bonded network interface, and then specifies the properties of that bonded network interface to be tested: - -.. code-block:: ruby - - describe bond('name') do - it { should exist } - end - -where - -* ``'name'`` is the name of the bonded network interface -* ``{ should exist }`` is a valid matcher for this |inspec resource| - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -content -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``content`` matcher tests if contents in the file that defines the bonded network interface match the value specified in the test. The values of the ``content`` matcher are arbitrary: - -.. code-block:: ruby - - its('content') { should match('value') } - -exist -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``exist`` matcher tests if the bonded network interface is available: - -.. code-block:: ruby - - it { should exist } - -have_interface -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``have_interface`` matcher tests if the bonded network interface has one (or more) secondary interfaces: - -.. code-block:: ruby - - it { should have_interface } - -interfaces -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``interfaces`` matcher tests if the named secondary interfaces are available: - -.. code-block:: ruby - - its('interfaces') { should eq ['eth0', 'eth1', ...] } - -params -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``params`` matcher tests arbitrary parameters for the bonded network interface: - -.. code-block:: ruby - - its('params') { should eq 'value' } - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test if eth0 is a secondary interface for bond0** - -.. code-block:: ruby - - describe bond('bond0') do - it { should exist } - it { should have_interface 'eth0' } - end - -**Test parameters for bond0** - -.. code-block:: ruby - - describe bond('bond0') do - its('Bonding Mode') { should eq 'IEEE 802.3ad Dynamic link aggregation' } - its('Transmit Hash Policy') { should eq 'layer3+4 (1)' } - its('MII Status') { should eq 'up' } - its('MII Polling Interval (ms)') { should eq '100' } - its('Up Delay (ms)') { should eq '0' } - its('Down Delay (ms)') { should eq '0' } - end - - - - - -bridge -===================================================== -Use the ``bridge`` |inspec resource| to test basic network bridge properties, such as name, if an interface is defined, and the associations for any defined interface. - -* On |linux| platforms, any value in the ``/sys/class/net/{interface}/bridge`` directory may be tested -* On the |windows| platform, the ``Get-NetAdapter`` cmdlet is associated with the ``Get-NetAdapterBinding`` cmdlet and returns the ``ComponentID ms_bridge`` value as a |json| object - -.. not sure the previous two bullet items are actually true, but keeping there for reference for now, just in case - -**Stability: Stable** - -Syntax ------------------------------------------------------ -A ``bridge`` |inspec resource| block declares the bridge to be tested and what interface it should be associated with: - -.. code-block:: ruby - - describe bridge('br0') do - it { should exist } - it { should have_interface 'eth0' } - end - -.. -.. where -.. -.. * ``xxxxx`` must specify xxxxx -.. * xxxxx -.. * ``xxxxx`` is a valid matcher for this InSpec audit resource -.. - - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -exist -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``exist`` matcher tests if the network bridge is available: - -.. code-block:: ruby - - it { should exist } - -have_interface -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``have_interface`` matcher tests if the named interface is defined for the network bridge: - -.. code-block:: ruby - - it { should have_interface 'eth0' } - -interfaces -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``interfaces`` matcher tests if the named interface is present: - -.. code-block:: ruby - - its('interfaces') { should eq 'foo' } - its('interfaces') { should eq 'bar' } - its('interfaces') { should include('foo') } - -.. -.. Examples -.. ----------------------------------------------------- -.. The following examples show how to use this InSpec audit resource. -.. -.. **xxxxx** -.. -.. xxxxx -.. -.. **xxxxx** -.. -.. xxxxx -.. - - - - -command -===================================================== -Use the ``command`` |inspec resource| to test an arbitrary command that is run on the system. - -**Stability: Stable** - -Syntax ------------------------------------------------------ -A ``command`` |inspec resource| block declares a command to be run, one (or more) expected outputs, and the location to which that output is sent: - -.. code-block:: ruby - - describe command('command') do - it { should exist } - its('matcher') { should eq 'output' } - end - -where - -* ``'command'`` must specify a command to be run -* ``'matcher'`` is one of ``exit_status``, ``stderr``, or ``stdout`` -* ``'output'`` tests the output of the command run on the system versus the output value stated in the test - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -exist -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``exist`` matcher tests if a command may be run on the system: - -.. code-block:: ruby - - it { should exist } - -exit_status -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``exit_status`` matcher tests the exit status for the command: - -.. code-block:: ruby - - its('exit_status') { should eq 123 } - -stderr -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``stderr`` matcher tests results of the command as returned in standard error (stderr): - -.. code-block:: ruby - - its('stderr') { should eq 'error' } - -stdout -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``stdout`` matcher tests results of the command as returned in standard output (stdout): - -.. code-block:: ruby - - its('stdout') { should match /^1$/ } - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test for PostgreSQL database running a RC, but no development, or beta release** - -.. code-block:: ruby - - describe command('psql -V') do - its('stdout') { should match /RC/ } - its('stdout') { should_not match /DEVEL/ } - its('stdout') { should_not match /BETA/ } - end - -**Test standard output (stdout)** - -.. code-block:: ruby - - describe command('echo hello') do - its('stdout') { should eq 'hello\n' } - its('stderr') { should eq '' } - its('exit_status') { should eq 0 } - end - -**Test standard error (stderr)** - -.. code-block:: ruby - - describe command('>&2 echo error') do - its('stdout') { should eq '' } - its('stderr') { should eq 'error\n' } - its('exit_status') { should eq 0 } - end - -**Test an exit status code** - -.. code-block:: ruby - - describe command('exit 123') do - its('stdout') { should eq '' } - its('stderr') { should eq '' } - its('exit_status') { should eq 123 } - end - -**Test if the command shell exists** - -.. code-block:: ruby - - describe command('/bin/sh').exist? do - it { should eq true } - end - -**Test for a command that should not exist** - -.. code-block:: ruby - - describe command('this is not existing').exist? do - it { should eq false } - end - - - - -csv -===================================================== -Use the ``csv`` |inspec resource| to test configuration data in a |csv| file. - -**Stability: Experimental** - -Syntax ------------------------------------------------------ -A ``csv`` |inspec resource| block declares the configuration data to be tested: - -.. code-block:: ruby - - describe csv('file') do - its('name') { should eq 'foo' } - end - -where - -* ``'file'`` is the path to a |csv| file -* ``name`` is a configuration setting in a |csv| file -* ``should eq 'foo'`` tests a value of ``name`` as read from a |csv| file versus the value declared in the test - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -name -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``name`` matcher tests the value of ``name`` as read from a |csv| file versus the value declared in the test: - -.. code-block:: ruby - - its('name') { should eq 'foo' } - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test a CSV file** - -.. code-block:: ruby - - describe csv('some_file.csv') do - its('setting') { should eq 1 } - end - - - -directory -===================================================== -Use the ``directory`` |inspec resource| to test if the file type is a directory. This is equivalent to using the ``file`` |inspec resource| and the ``be_directory`` matcher, but provides a simpler and more direct way to test directories. All of the matchers available to ``file`` may be used with ``directory``. - -**Stability: Experimental** - -Syntax ------------------------------------------------------ -A ``directory`` |inspec resource| block declares the location of the directory to be tested, and then one (or more) matchers: - -.. code-block:: ruby - - describe directory('path') do - it { should MATCHER 'value' } - end - -Matchers ------------------------------------------------------ -This |inspec resource| may use any of the matchers available to the ``file`` resource that are useful for testing a directory. - -.. -.. Examples -.. ----------------------------------------------------- -.. The following examples show how to use this InSpec audit resource. -.. -.. **xxxxx** -.. -.. xxxxx -.. -.. **xxxxx** -.. -.. xxxxx -.. - - -etc_group -===================================================== -Use the ``etc_group`` |inspec resource| to test groups that are defined on |linux| and |unix| platforms. The ``/etc/group`` file stores details about each group---group name, password, group identifier, along with a comma-separate list of users that belong to the group. - -**Stability: Experimental** - -Syntax ------------------------------------------------------ -A ``etc_group`` |inspec resource| block declares a collection of properties to be tested: - -.. code-block:: ruby - - describe etc_group('path') do - its('matcher') { should eq 'some_value' } - end - -or: - -.. code-block:: ruby - - describe etc_group.where(item: 'value', item: 'value') do - its('gids') { should_not contain_duplicates } - its('groups') { should include 'user_name' } - its('users') { should include 'user_name' } - end - -where - -* ``('path')`` is the non-default path to the ``inetd.conf`` file -* ``.where()`` may specify a specific item and value, to which the matchers are compared -* ``'gids'``, ``'groups'``, and ``'users'`` are valid matchers for this |inspec resource| - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -gids -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``gids`` matcher tests if the named group identifier is present or if it contains duplicates: - -.. code-block:: ruby - - its('gids') { should_not contain_duplicates } - -groups -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``groups`` matcher tests all groups for the named user: - -.. code-block:: ruby - - its('groups') { should include 'my_group' } - -users -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``users`` matcher tests all groups for the named user: - -.. code-block:: ruby - - its('users') { should include 'my_user' } - -where -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``where`` matcher allows the test to be focused to one (or more) specific items: - -.. code-block:: ruby - - etc_group.where(item: 'value', item: 'value') - -where ``item`` may be one (or more) of: - -* ``name: 'name'`` -* ``group_name: 'group_name'`` -* ``password: 'password'`` -* ``gid: 'gid'`` -* ``group_id: 'gid'`` -* ``users: 'user_name'`` -* ``members: 'member_name'`` - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test group identifiers (GIDs) for duplicates** - -.. code-block:: ruby - - describe etc_group do - its('gids') { should_not contain_duplicates } - end - -**Test all groups to see if a specific user belongs to one (or more) groups** - -.. code-block:: ruby - - describe etc_group do - its('groups') { should include 'my_group' } - end - - -**Test all groups for a specific user name** - -.. code-block:: ruby - - describe etc_group do - its('users') { should include 'my_user' } - end - -**Filter a list of groups for a specific user** - -.. code-block:: ruby - - describe etc_group.where(name: 'my_group') do - its('users') { should include 'my_user' } - end - - - -file -===================================================== -Use the ``file`` |inspec resource| to test all system file types, including files, directories, symbolic links, named pipes, sockets, character devices, block devices, and doors. - -**Stability: Stable** - -Syntax ------------------------------------------------------ -A ``file`` |inspec resource| block declares the location of the file type to be tested, what type that file should be (if required), and then one (or more) matchers: - -.. code-block:: ruby - - describe file('path') do - it { should MATCHER 'value' } - end - -where - -* ``('path')`` is the name of the file and/or the path to the file -* ``MATCHER`` is a valid matcher for this |inspec resource| -* ``'value'`` is the value to be tested - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -be_block_device -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``be_block_device`` matcher tests if the file exists as a block device, such as ``/dev/disk0`` or ``/dev/disk0s9``: - -.. code-block:: ruby - - it { should be_block_device } - -be_character_device -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``be_character_device`` matcher tests if the file exists as a character device (that corresponds to a block device), such as ``/dev/rdisk0`` or ``/dev/rdisk0s9``: - -.. code-block:: ruby - - it { should be_character_device } - -be_directory -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``be_directory`` matcher tests if the file exists as a directory, such as ``/etc/passwd``, ``/etc/shadow``, or ``/var/log/httpd``: - -.. code-block:: ruby - - it { should be_directory } - -be_executable -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``be_executable`` matcher tests if the file exists as an executable: - -.. code-block:: ruby - - it { should be_executable } - -The ``be_executable`` matcher may also test if the file is executable by a specific owner, group, or user. For example, a group: - -.. code-block:: ruby - - it { should be_executable.by('group') } - -an owner: - -.. code-block:: ruby - - it { should be_executable.by('owner') } - -a user: - -.. code-block:: ruby - - it { should be_executable.by_user('user') } - -be_file -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``be_file`` matcher tests if the file exists as a file. This can be useful with configuration files like ``/etc/passwd`` where there typically is not an associated file extension---``passwd.txt``: - -.. code-block:: ruby - - it { should be_file } - -be_grouped_into -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``be_grouped_into`` matcher tests if the file exists as part of the named group: - -.. code-block:: ruby - - it { should be_grouped_into 'group' } - -be_immutable -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``be_immutable`` matcher tests if the file is immutable, i.e. "cannot be changed": - -.. code-block:: ruby - - it { should be_immutable } - -be_linked_to -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``be_linked_to`` matcher tests if the file is linked to the named target: - -.. code-block:: ruby - - it { should be_linked_to '/etc/target-file' } - -be_mounted -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``be_mounted`` matcher tests if the file is accessible from the file system: - -.. code-block:: ruby - - it { should be_mounted } - -be_owned_by -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``be_owned_by`` matcher tests if the file is owned by the named user, such as ``root``: - -.. code-block:: ruby - - it { should be_owned_by 'root' } - -be_pipe -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``be_pipe`` matcher tests if the file exists as first-in, first-out special file (``.fifo``) that is typically used to define a named pipe, such as ``/var/log/nginx/access.log.fifo``: - -.. code-block:: ruby - - it { should be_pipe } - -be_readable -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``be_readable`` matcher tests if the file is readable: - -.. code-block:: ruby - - it { should be_readable } - -The ``be_readable`` matcher may also test if the file is readable by a specific owner, group, or user. For example, a group: - -.. code-block:: ruby - - it { should be_readable.by('group') } - -an owner: - -.. code-block:: ruby - - it { should be_readable.by('owner') } - -a user: - -.. code-block:: ruby - - it { should be_readable.by_user('user') } - -be_socket -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``be_socket`` matcher tests if the file exists as socket (``.sock``), such as ``/var/run/php-fpm.sock``: - -.. code-block:: ruby - - it { should be_socket } - -be_symlink -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``be_symlink`` matcher tests if the file exists as a symbolic, or soft link that contains an absolute or relative path reference to another file: - -.. code-block:: ruby - - it { should be_symlink } - -be_version -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``be_version`` matcher tests the version of the file: - -.. code-block:: ruby - - it { should be_version '1.2.3' } - -be_writable -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``be_writable`` matcher tests if the file is writable: - -.. code-block:: ruby - - it { should be_writable } - -The ``be_writable`` matcher may also test if the file is writable by a specific owner, group, or user. For example, a group: - -.. code-block:: ruby - - it { should be_writable.by('group') } - -an owner: - -.. code-block:: ruby - - it { should be_writable.by('owner') } - -a user: - -.. code-block:: ruby - - it { should be_writable.by_user('user') } - -content -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``content`` matcher tests if contents in the file match the value specified in the test. The values of the ``content`` matcher are arbitrary and depend on the file type being tested and also the type of information that is expected to be in that file: - -.. code-block:: ruby - - its('content') { should match REGEX } - -The following complete example tests the ``pg_hba.conf`` file in |postgresql| for |md5| requirements. The tests look at all ``host`` and ``local`` settings in that file, and then compare the |md5| checksums against the values in the test: - -.. code-block:: bash - - describe file(hba_config_file) do - its('content') { should match(%r{local\s.*?all\s.*?all\s.*?md5}) } - its('content') { should match(%r{host\s.*?all\s.*?all\s.*?127.0.0.1\/32\s.*?md5}) } - its('content') { should match(%r{host\s.*?all\s.*?all\s.*?::1\/128\s.*?md5}) } - end - -exist -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``exist`` matcher tests if the named file exists: - -.. code-block:: ruby - - it { should exist } - -file_version -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``file_version`` matcher tests if the file's version matches the specified value. The difference between a file's "file version" and "product version" is that the file version is the version number of the file itself, whereas the product version is the version number associated with the application from which that file originates: - -.. code-block:: ruby - - its('file_version') { should eq '1.2.3' } - -group -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``group`` matcher tests if the group to which a file belongs matches the specified value: - -.. code-block:: ruby - - its('group') { should eq 'admins' } - -have_mode -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``have_mode`` matcher tests if a file has a mode assigned to it: - -.. code-block:: ruby - - it { should have_mode } - -link_path -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``link_path`` matcher tests if the file exists at the specified path: - -.. code-block:: ruby - - its('link_path') { should eq '/some/path/to/file' } - -link_target -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``link_target`` matcher tests if a file that is linked to this file exists at the specified path: - -.. code-block:: ruby - - its('link_target') { should eq '/some/path/to/file' } - -md5sum -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``md5sum`` matcher tests if the |md5| checksum for a file matches the specified value: - -.. code-block:: ruby - - its('md5sum') { should eq '3329x3hf9130gjs9jlasf2305mx91s4j' } - -mode -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``mode`` matcher tests if the mode assigned to the file matches the specified value: - -.. code-block:: ruby - - its('mode') { should eq 0644 } - -mtime -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``mtime`` matcher tests if the file modification time for the file matches the specified value: - -.. code-block:: ruby - - its('mtime') { should eq 'October 31 2015 12:10:45' } - -or: - -.. code-block:: bash - - describe file('/').mtime.to_i do - it { should <= Time.now.to_i } - it { should >= Time.now.to_i - 1000} - end - -owner -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``owner`` matcher tests if the owner of the file matches the specified value: - -.. code-block:: ruby - - its('owner') { should eq 'root' } - -product_version -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``product_version`` matcher tests if the file's product version matches the specified value. The difference between a file's "file version" and "product version" is that the file version is the version number of the file itself, whereas the product version is the version number associated with the application from which that file originates: - -.. code-block:: ruby - - its('product_version') { should eq 2.3.4 } - -selinux_label -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``selinux_label`` matcher tests if the |selinux| label for a file matches the specified value: - -.. code-block:: ruby - - its('selinux_label') { should eq 'system_u:system_r:httpd_t:s0' } - -sha256sum -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``sha256sum`` matcher tests if the |sha256| checksum for a file matches the specified value: - -.. code-block:: ruby - - its('sha256sum') { should eq 'b837ch38lh19bb8eaopl8jvxwd2e4g58jn9lkho1w3ed9jbkeicalplaad9k0pjn' } - -size -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``size`` matcher tests if a file's size matches, is greater than, or is less than the specified value. For example, equal: - -.. code-block:: ruby - - its('size') { should eq 32375 } - -Greater than: - -.. code-block:: ruby - - its('size') { should > 64 } - -Less than: - -.. code-block:: ruby - - its('size') { should < 10240 } - -type -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``type`` matcher tests if the first letter of the file's mode string contains one of the following characters: - -* ``-`` or ``f`` (the file is a file); use ``'file`` to test for this file type -* ``d`` (the file is a directory); use ``'directory`` to test for this file type -* ``l`` (the file is a symbolic link); use ``'link`` to test for this file type -* ``p`` (the file is a named pipe); use ``'pipe`` to test for this file type -* ``s`` (the file is a socket); use ``'socket`` to test for this file type -* ``c`` (the file is a character device); use ``'character`` to test for this file type -* ``b`` (the file is a block device); use ``'block`` to test for this file type -* ``D`` (the file is a door); use ``'door`` to test for this file type - -For example: - -.. code-block:: ruby - - its('type') { should eq 'file' } - -or: - -.. code-block:: ruby - - its('type') { should eq 'socket' } - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test the contents of a file for MD5 requirements** - -.. code-block:: bash - - describe file(hba_config_file) do - its('content') { should match /local\s.*?all\s.*?all\s.*?md5/ } - its('content') { should match %r{/host\s.*?all\s.*?all\s.*?127.0.0.1\/32\s.*?md5/} } - its('content') { should match %r{/host\s.*?all\s.*?all\s.*?::1\/128\s.*?md5/} } - end - -**Test if a file exists** - -.. code-block:: bash - - describe file('/tmp') do - it { should exist } - end - -**Test that a file does not exist** - -.. code-block:: bash - - describe file('/tmpest') do - it { should_not exist } - end - -**Test if a path is a directory** - -.. code-block:: bash - - describe file('/tmp') do - its('type') { should eq :directory } - it { should be_directory } - end - -**Test if a path is a file and not a directory** - -.. code-block:: bash - - describe file('/proc/version') do - its('type') { should eq 'file' } - it { should be_file } - it { should_not be_directory } - end - -**Test if a file is a symbolic link** - -.. code-block:: bash - - describe file('/dev/stdout') do - its('type') { should eq 'symlink' } - it { should be_symlink } - it { should_not be_file } - it { should_not be_directory } - end - -**Test if a file is a character device** - -.. code-block:: bash - - describe file('/dev/zero') do - its('type') { should eq 'character' } - it { should be_character_device } - it { should_not be_file } - it { should_not be_directory } - end - -**Test if a file is a block device** - -.. code-block:: bash - - describe file('/dev/zero') do - its('type') { should eq 'block' } - it { should be_character_device } - it { should_not be_file } - it { should_not be_directory } - end - -**Test the mode for a file** - -.. code-block:: bash - - describe file('/dev') do - its('mode') { should eq 00755 } - end - -**Test the owner of a file** - -.. code-block:: bash - - describe file('/root') do - its('owner') { should eq 'root' } - end - -**Test if a file is owned by the root user** - -.. code-block:: bash - - describe file('/dev') do - it { should be_owned_by 'root' } - end - -**Test the mtime for a file** - -.. code-block:: bash - - describe file('/').mtime.to_i do - it { should <= Time.now.to_i } - it { should >= Time.now.to_i - 1000} - end - -**Test that a file's size is between 64 and 10240** - -.. code-block:: bash - - describe file('/') do - its('size') { should be > 64 } - its('size') { should be < 10240 } - end - -**Test that a file's size is zero** - -.. code-block:: bash - - describe file('/proc/cpuinfo') do - its('size') { should be 0 } - end - -**Test that a file is not mounted** - -.. code-block:: bash - - describe file('/proc/cpuinfo') do - it { should_not be_mounted } - end - -**Test an MD5 checksum** - -.. code-block:: bash - - require 'digest' - cpuinfo = file('/proc/cpuinfo').content - md5sum = Digest::MD5.hexdigest(cpuinfo) - - describe file('/proc/cpuinfo') do - its('md5sum') { should eq md5sum } - end - -**Test an SHA-256 checksum** - -.. code-block:: bash - - require 'digest' - cpuinfo = file('/proc/cpuinfo').content - sha256sum = Digest::SHA256.hexdigest(cpuinfo) - - describe file('/proc/cpuinfo') do - its('sha256sum') { should eq sha256sum } - end - - -gem -===================================================== -Use the ``gem`` |inspec resource| to test if a global |gem| package is installed. - -**Stability: Experimental** - -Syntax ------------------------------------------------------ -A ``gem`` |inspec resource| block declares a package and (optionally) a package version: - -.. code-block:: ruby - - describe gem('gem_package_name') do - it { should be_installed } - end - -where - -* ``('gem_package_name')`` must specify a |gem| package, such as ``'rubocop'`` -* ``be_installed`` is a valid matcher for this |inspec resource| - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -be_installed -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``be_installed`` matcher tests if the named |gem| package is installed: - -.. code-block:: ruby - - it { should be_installed } - -version -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``version`` matcher tests if the named package version is on the system: - -.. code-block:: ruby - - its('version') { should eq '0.33.0' } - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Verify that a gem package is installed, with a specific version** - -.. code-block:: ruby - - describe gem('rubocop') do - it { should be_installed } - its('version') { should eq '0.33.0' } - end - -**Verify that a gem package is not installed** - -.. code-block:: ruby - - describe gem('rubocop') do - it { should_not be_installed } - end - - -group -===================================================== -Use the ``group`` |inspec resource| to test groups on the system. - -Syntax ------------------------------------------------------ -A ``group`` |inspec resource| block declares a group, and then the details to be tested, such as if the group is a local group, the group identifier, or if the group exists: - -.. code-block:: ruby - - describe group('group_name') do - it { should exist } - its('gid') { should eq 0 } - end - -where - -* ``'group_name'`` must specify the name of a group on the system -* ``exist`` and ``'gid'`` are valid matchers for this |inspec resource| - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -be_local -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``be_local`` matcher tests if the group is a local group: - -.. code-block:: ruby - - it { should be_local } - -exist -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``exist`` matcher tests if the named user exists: - -.. code-block:: ruby - - it { should exist } - -gid -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``gid`` matcher tests the named group identifier: - -.. code-block:: ruby - - its('gid') { should eq 1234 } - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test the group identifier for the root group** - -.. code-block:: ruby - - describe group('root') do - it { should exist } - its('gid') { should eq 0 } - end - - - - -grub_conf -===================================================== - -Test both Grub 1 and Grub 2 configurations. - -**Stability: Experimental** - -Syntax ------------------------------------------------------ -A ``grub_conf`` resource is used to specify a configuration file and boot configuration. - -.. code-block:: ruby - - describe grub_conf('/etc/grub.conf', 'default') do - its('kernel') { should include '/vmlinuz-2.6.32-573.7.1.el6.x86_64' } - its('initrd') { should include '/initramfs-2.6.32-573.el6.x86_64.img=1' } - its('default') { should_not eq '1' } - its('timeout') { should eq '5' } - end - -You can also check specific kernels: - -.. code-block:: ruby - - grub_conf('/etc/grub.conf', 'CentOS (2.6.32-573.12.1.el6.x86_64)') do - its('kernel') { should include 'audit=1' } - end - - - - -host -===================================================== -Use the ``host`` |inspec resource| to test the name used to refer to a specific host and its availability, including the Internet protocols and ports over which that host name should be available. - -**Stability: Stable** - -Syntax ------------------------------------------------------ -A ``host`` |inspec resource| block declares a host name, and then (depending on what is to be tested) a port and/or a protocol: - -.. code-block:: ruby - - describe host('example.com', port: 80, proto: 'tcp') do - it { should be_reachable } - end - -where - -* ``host()`` must specify a host name and may specify a port number and/or a protocol -* ``'example.com'`` is the host name -* ``port:`` is the port number -* ``proto: 'name'`` is the Internet protocol: |tcp| (``proto: 'tcp'``), |udp| (``proto: 'udp'`` or |icmp| (``proto: 'icmp'``)) -* ``be_reachable`` is a valid matcher for this |inspec resource| - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -be_reachable -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``be_reachable`` matcher tests if the host name is available: - -.. code-block:: ruby - - it { should be_reachable } - -be_resolvable -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``be_resolvable`` matcher tests for host name resolution, i.e. "resolvable to an IP address": - -.. code-block:: ruby - - it { should be_resolvable } - -ipaddress ------------------------------------------------------ -The ``ipaddress`` matcher tests if a host name is resolvable to a specific IP address: - -.. code-block:: ruby - - its('ipaddress') { should include '93.184.216.34' } - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Verify host name s reachable over a specific protocol and port number** - -.. code-block:: ruby - - describe host('example.com', port: 53, proto: 'udp') do - it { should be_reachable } - end - -**Verify that a specific IP address can be resolved** - -.. code-block:: ruby - - describe host('example.com', port: 80, proto: 'tcp') do - it { should be_resolvable } - its('ipaddress') { should include '192.168.1.1' } - end - - -iis_site -===================================================== -Tests the status, path, bindings, and application pool of an IIS website. Supported in windows 2012 and higher. - -**Stability: Experimental** - -Syntax ------------------------------------------------------ -An ``iis_site`` |inspec resource| block declares the IIS web site properties to be tested: - -.. code-block:: ruby -describe iis_site('website') do - it { should exist } - it { should be_running } - it { should have_app_pool('app_pool') } - it { should have_binding('https :443:www.contoso.com sslFlags=0') } - it { should have_path('C:\\inetpub\\wwwroot') } -end - -where - -* ``iis_site()`` must specify a web site name -* ``'website'`` is the web site name -* ``have_app_pool('my_app_pool')`` tests that our site belongs to the 'my_app_pool' application pool -* ``have_binding('my_binding')`` tests that our site has the specified binding. my_binding should be in the format of the default output from the Get-Website powershell cmdlet - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -exist -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``exist`` matcher tests if the website exists in IIS: - -.. code-block:: ruby - - it { should exist } - -be_running -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``be_running`` matcher tests if the IIS site is running - -.. code-block:: ruby - - it { should be_running } - -have_app_pool -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``have_app_pool`` matcher tests if the IIS site belongs in the specified application pool - -.. code-block:: ruby - - it { should have_app_pool('Default App Pool') } - -have_binding -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``have_binding`` matcher tests if the IIS site has the specified binding - -.. code-block:: ruby - - it { should have_binding('http :80:*' ) } - -have_path -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``have_path`` matcher tests if the IIS site is located in the specified path - -.. code-block:: ruby - - it { should have_path('c:\\inetpub\\wwwroot\\my_site') } - - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test if a web site 'My Site' is running and is located on disk at c:\\mysite** - -.. code-block:: ruby - - describe iis_site('My Site') do - it { should be_running } - it { should have_path('c:\\mysite') } - end - -**Test to see if 'Default Web Site' has been removed** - -.. code-block:: ruby - - describe iis_site('Default Web Site') do - it { should_not exist } - end - -**Test 'New Website' is running in Default App Pool and listening on port 80 via http** - -.. code-block:: ruby - - describe iis_site('New Website') do - it { should have_app_pool('app_pool') } - it { should have_binding('http :80:*') } - end - - - -inetd_conf -===================================================== -Use the ``inetd_conf`` |inspec resource| to test if a service is enabled in the ``inetd.conf`` file on |linux| and |unix| platforms. |inetd|---the Internet service daemon---listens on dedicated ports, and then loads the appropriate program based on a request. The ``inetd.conf`` file is typically located at ``/etc/inetd.conf`` and contains a list of Internet services associated to the ports on which that service will listen. Only enabled services may handle a request; only services that are required by the system should be enabled. - -**Stability: Experimental** - -Syntax ------------------------------------------------------ -An ``inetd_conf`` |inspec resource| block declares the list of services that are enabled in the ``inetd.conf`` file: - -.. code-block:: ruby - - describe inetd_conf('path') do - its('service_name') { should eq 'value' } - end - -where - -* ``'service_name'`` is a service listed in the ``inetd.conf`` file -* ``('path')`` is the non-default path to the ``inetd.conf`` file -* ``should eq 'value'`` is the value that is expected - -Matchers ------------------------------------------------------ -This |inspec resource| matches any service that is listed in the ``inetd.conf`` file. You may want to ensure that specific services do not listen via ``inetd.conf``: - -.. code-block:: ruby - - its('shell') { should eq nil } - -or: - -.. code-block:: ruby - - its('netstat') { should eq nil } - -or: - -.. code-block:: ruby - - its('systat') { should eq nil } - -For example: - -.. code-block:: ruby - - describe inetd_conf do - its('shell') { should eq nil } - its('login') { should eq nil } - its('exec') { should eq nil } - end - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Verify that FTP is disabled** - -The contents if the ``inetd.conf`` file contain the following: - -.. code-block:: text - - #ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -a - #telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd - -and the following test is defined: - -.. code-block:: ruby - - describe inetd_conf do - its('ftp') { should eq nil } - its('telnet') { should eq nil } - end - -Because both the ``ftp`` and ``telnet`` Internet services are commented out (``#``), both services are disabled. Consequently, both tests will return ``true``. However, if the ``inetd.conf`` file is set as follows: - -.. code-block:: text - - ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -a - #telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd - -then the same test will return ``false`` for ``ftp`` and the entire test will fail. - -**Test if telnet is installed** - -.. code-block:: ruby - - describe package('telnetd') do - it { should_not be_installed } - end - - describe inetd_conf do - its('telnet') { should eq nil } - end - - - -interface -===================================================== -Use the ``interface`` |inspec resource| to test basic network adapter properties, such as name, status, state, address, and link speed (in MB/sec). - -* On |linux| platforms, ``/sys/class/net/#{iface}`` is used as source -* On the |windows| platform, the ``Get-NetAdapter`` cmdlet is used as source - -**Stability: Stable** - -Syntax ------------------------------------------------------ -An ``interface`` |inspec resource| block declares network interface properties to be tested: - -.. code-block:: ruby - - describe interface do - it { should be_up } - its('speed') { should eq 1000 } - its('name') { should eq eth0 } - end - - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -be_up -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``be_up`` matcher tests if the network interface is available: - -.. code-block:: ruby - - it { should be_up } - -name -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``name`` matcher tests if the named network interface exists: - -.. code-block:: ruby - - its('name') { should eq eth0 } - -speed -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``speed`` matcher tests the speed of the network interface, in MB/sec: - -.. code-block:: ruby - - its('speed') { should eq 1000 } - -.. -.. Examples -.. ----------------------------------------------------- -.. The following examples show how to use this InSpec audit resource. -.. -.. **xxxxx** -.. -.. xxxxx -.. -.. **xxxxx** -.. -.. xxxxx -.. - - - -iptables -===================================================== -Use the ``iptables`` |inspec resource| to test rules that are defined in ``iptables``, which maintains tables of IP packet filtering rules. There may be more than one table. Each table contains one (or more) chains (both built-in and custom). A chain is a list of rules that match packets. When the rule matches, the rule defines what target to assign to the packet. - -**Stability: Experimental** - -Syntax ------------------------------------------------------ -A ``iptables`` |inspec resource| block declares tests for rules in IP tables: - -.. code-block:: ruby - - describe iptables(rule:'name', table:'name', chain: 'name') do - it { should have_rule('RULE') } - end - -where - -* ``iptables()`` may specify any combination of ``rule``, ``table``, or ``chain`` -* ``rule:'name'`` is the name of a rule that matches a set of packets -* ``table:'name'`` is the packet matching table against which the test is run -* ``chain: 'name'`` is the name of a user-defined chain or one of ``ACCEPT``, ``DROP``, ``QUEUE``, or ``RETURN`` -* ``have_rule('RULE')`` tests that rule in the iptables file - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -have_rule -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``have_rule`` matcher tests the named rule against the information in the ``iptables`` file: - -.. code-block:: ruby - - it { should have_rule('RULE') } - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test if the IP table allows a packet through** - -.. code-block:: ruby - - describe iptables do - it { should have_rule('-P INPUT ACCEPT') } - end - -**Test if the IP table allows a packet through, for a specific table and chain** - -.. code-block:: ruby - - describe iptables(table:'mangle', chain: 'input') do - it { should have_rule('-P INPUT ACCEPT') } - end - - - -json -===================================================== -Use the ``json`` |inspec resource| to test data in a |json| file. - -**Stability: Experimental** - -Syntax ------------------------------------------------------ -A ``json`` |inspec resource| block declares the data to be tested. Assume the following json file: - -.. code-block:: json - - { - "name" : "hello", - "meta" : { - "creator" : "John Doe" - }, - "array": [ - "zero", - "one" - ] - } - - -This file can be queried via: - -.. code-block:: ruby - - describe json('/paht/to/name.json') do - its('name') { should eq 'hello' } - its(['meta','creator']) { should eq 'John Doe' } - its(['array', 1]) { should eq 'one' } - end - -where - -* ``name`` is a configuration setting in a |json| file -* ``should eq 'foo'`` tests a value of ``name`` as read from a |json| file versus the value declared in the test - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -name -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``name`` matcher tests the value of ``name`` as read from a |json| file versus the value declared in the test: - -.. code-block:: ruby - - its('name') { should eq 'foo' } - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test a cookbook version in a policyfile.lock.json file** - -.. code-block:: ruby - - describe json('policyfile.lock.json') do - its('cookbook_locks.omnibus.version') { should eq('2.2.0') } - end - - - -kernel_module -===================================================== -Use the ``kernel_module`` |inspec resource| to test kernel modules on |linux| platforms. These parameters are located under ``/lib/modules``. Any submodule may be tested using this resource. - -**Stability: Stable** - -Syntax ------------------------------------------------------ -A ``kernel_module`` |inspec resource| block declares a module name, and then tests if that module is a loadable kernel module: - -.. code-block:: ruby - - describe kernel_module('module_name') do - it { should be_loaded } - end - -where - -* ``'module_name'`` must specify a kernel module, such as ``'bridge'`` -* ``{ should be_loaded }`` tests if the module is a loadable kernel module - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -be_loaded -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``be_loaded`` matcher tests if the module is a loadable kernel module: - -.. code-block:: ruby - - it { should be_loaded } - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test if a module is loaded** - -.. code-block:: ruby - - describe kernel_module('bridge') do - it { should be_loaded } - end - - -kernel_parameter -===================================================== -Use the ``kernel_parameter`` |inspec resource| to test kernel parameters on |linux| platforms. - -**Stability: Stable** - -Syntax ------------------------------------------------------ -A ``kernel_parameter`` |inspec resource| block declares a parameter and then a value to be tested: - -.. code-block:: ruby - - describe kernel_parameter('path.to.parameter') do - its('value') { should eq 0 } - end - -where - -* ``'kernel.parameter'`` must specify a kernel parameter, such as ``'net.ipv4.conf.all.forwarding'`` -* ``{ should eq 0 }`` states the value to be tested - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -value -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``value`` matcher tests the value assigned to the named IP address versus the value declared in the test: - -.. code-block:: ruby - - its('value') { should eq 0 } - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test if global forwarding is enabled for an IPv4 address** - -.. code-block:: ruby - - describe kernel_parameter('net.ipv4.conf.all.forwarding') do - its('value') { should eq 1 } - end - -**Test if global forwarding is disabled for an IPv6 address** - -.. code-block:: ruby - - describe kernel_parameter('net.ipv6.conf.all.forwarding') do - its('value') { should eq 0 } - end - -**Test if an IPv6 address accepts redirects** - -.. code-block:: ruby - - describe kernel_parameter('net.ipv6.conf.interface.accept_redirects') do - its('value') { should eq 'true' } - end - - -limits_conf -===================================================== -Use the ``limits_conf`` |inspec resource| to test configuration settings in the ``/etc/security/limits.conf`` file. The ``limits.conf`` defines limits for processes (by user and/or group names) and helps ensure that the system on which those processes are running remains stable. Each process may be assigned a hard or soft limit. - -* Soft limits are maintained by the shell and defines the number of file handles (or open files) available to the user or group after login -* Hard limits are maintained by the kernel and defines the maximum number of allowed file handles - -Entries in the ``limits.conf`` file are similar to: - -.. code-block:: bash - - grantmc soft nofile 4096 - grantmc hard nofile 63536 - - ^^^^^^^^^ ^^^^ ^^^^^^ ^^^^^ - domain type item value - -**Stability: Experimental** - -Syntax ------------------------------------------------------ -A ``limits_conf`` |inspec resource| block declares a domain to be tested, along with associated type, item, and value: - -.. code-block:: ruby - - describe limits_conf('path') do - its('domain') { should include ['type', 'item', 'value'] } - its('domain') { should eq ['type', 'item', 'value'] } - end - -where - -* ``('path')`` is the non-default path to the ``inetd.conf`` file -* ``'domain'`` is a user or group name, such as ``grantmc`` -* ``'type'`` is either ``hard`` or ``soft`` -* ``'item'`` is the item for which limits are defined, such as ``core``, ``nofile``, ``stack``, ``nproc``, ``priority``, or ``maxlogins`` -* ``'value'`` is the value associated with the ``item`` - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -domain -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``domain`` matcher tests the domain in the ``limits.conf`` file, along with associated type, item, and value: - -.. code-block:: ruby - - its('domain') { should include ['type', 'item', 'value'] } - -For example: - -.. code-block:: ruby - - its('grantmc') { should include ['hard', 'nofile', '63536'] } - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test * and ftp limits** - -.. code-block:: ruby - - describe limits_conf('path') do - its('*') { should include ['soft', 'core', '0'] } - its('*') { should include ['hard', 'rss', '10000'] } - its('ftp') { should eq ['hard', 'nproc', '0'] } - end - -login_defs -===================================================== -Use the ``login_defs`` |inspec resource| to test configuration settings in the ``/etc/login.defs`` file. The ``logins.defs`` file defines site-specific configuration for the shadow password suite on |linux| and |unix| platforms, such as password expiration ranges, minimum/maximum values for automatic selection of user and group identifiers, or the method with which passwords are encrypted. - -**Stability: Experimental** - -Syntax ------------------------------------------------------ -A ``login_defs`` |inspec resource| block declares the ``login.defs`` configuration data to be tested: - -.. code-block:: ruby - - describe login_defs do - its('name') { should include('foo') } - end - -where - -* ``name`` is a configuration setting in ``login.defs`` -* ``{ should include('foo') }`` tests the value of ``name`` as read from ``login.defs`` versus the value declared in the test - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -name -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``name`` matcher tests the value of ``name`` as read from ``login.defs`` versus the value declared in the test: - -.. code-block:: ruby - - its('name') { should eq 'foo' } - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test password expiration settings** - -.. code-block:: ruby - - describe login_defs do - its('PASS_MAX_DAYS') { should eq '180' } - its('PASS_MIN_DAYS') { should eq '1' } - its('PASS_MIN_LEN') { should eq '15' } - its('PASS_WARN_AGE') { should eq '30' } - end - -**Test the encryption method** - -.. code-block:: ruby - - describe login_defs do - its('ENCRYPT_METHOD') { should eq 'SHA512' } - end - -**Test umask and password expiration** - -.. code-block:: ruby - - describe login_def do - its('UMASK') { should eq '077' } - its('PASS_MAX_DAYS') { should eq '90' } - end - - -mount -===================================================== -Use the ``mount`` |inspec resource| to test the mountpoints on |linux| systems. - -**Stability: Experimental** - -Syntax ------------------------------------------------------ -An ``mount`` |inspec resource| block declares the synchronization settings that should be tested: - -.. code-block:: ruby - - describe mount('path') do - it { should MATCHER 'value' } - end - -where - -* ``('path')`` is the path to the mounted directory -* ``MATCHER`` is a valid matcher for this |inspec resource| -* ``'value'`` is the value to be tested - -Matchers ------------------------------------------------------ -This |inspec resource| has the following matchers: - -be_mounted -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``be_mounted`` matcher tests if the file is accessible from the file system: - -.. code-block:: ruby - - it { should be_mounted } - -device -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``device`` matcher tests the device from the fstab table: - -.. code-block:: ruby - - its('device') { should eq '/dev/mapper/VolGroup-lv_root' } - -type -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``type`` matcher tests the filesystem type: - -.. code-block:: ruby - - its('type') { should eq 'ext4' } - - -options -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``options`` matcher tests the mount options for the filesystem from the fstab table: - -.. code-block:: ruby - - its('options') { should eq ['rw', 'mode=620'] } - - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test a the mount point on '/'** - -.. code-block:: ruby - - describe mount('/') do - it { should be_mounted } - its('device') { should eq '/dev/mapper/VolGroup-lv_root' } - its('type') { should eq 'ext4' } - its('options') { should eq ['rw', 'mode=620'] } - end - - - -mysql_conf -===================================================== -Use the ``mysql_conf`` |inspec resource| to test the contents of the configuration file for |mysql|, typically located at ``/etc/mysql/my.cnf`` or ``/etc/my.cnf``. - -Syntax ------------------------------------------------------ -A ``mysql_conf`` |inspec resource| block declares one (or more) settings in the ``my.cnf`` file, and then compares the setting in the configuration file to the value stated in the test: - -.. code-block:: ruby - - describe mysql_conf('path') do - its('setting') { should eq 'value' } - end - -where - -* ``'setting'`` specifies a setting in the ``my.cnf`` file, such as ``max_connections`` -* ``('path')`` is the non-default path to the ``my.cnf`` file -* ``should eq 'value'`` is the value that is expected - -**Stability: Experimental** - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -setting -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``setting`` matcher tests specific, named settings in the ``my.cnf`` file: - -.. code-block:: ruby - - its('setting') { should eq 'value' } - -Use a ``setting`` matcher for each setting to be tested. - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test the maximum number of allowed connections** - -.. code-block:: ruby - - describe mysql_conf do - its('max_connections') { should eq '505' } - its('max_user_connections') { should eq '500' } - end - -**Test slow query logging** - -.. code-block:: ruby - - describe mysql_conf do - its('slow_query_log_file') { should eq 'hostname_slow.log' } - its('slow_query_log') { should eq '0' } - its('log_queries_not_using_indexes') { should eq '1' } - its('long_query_time') { should eq '0.5' } - its('min_examined_row_limit') { should eq '100' } - end - -**Test the port and socket on which MySQL listens** - -.. code-block:: ruby - - describe mysql_conf do - its('port') { should eq '3306' } - its('socket') { should eq '/var/run/mysqld/mysql.sock' } - end - -**Test connection and thread variables** - -.. code-block:: ruby - - describe mysql_conf do - its('port') { should eq '3306' } - its('socket') { should eq '/var/run/mysqld/mysql.sock' } - its('max_allowed_packet') { should eq '12M' } - its('default_storage_engine') { should eq 'InnoDB' } - its('character_set_server') { should eq 'utf8' } - its('collation_server') { should eq 'utf8_general_ci' } - its('max_connections') { should eq '505' } - its('max_user_connections') { should eq '500' } - its('thread_cache_size') { should eq '505' } - end - -**Test the safe-user-create parameter** - -.. code-block:: ruby - - describe mysql_conf.params('mysqld') do - its('safe-user-create') { should eq('1') } - end - - -mysql_session -===================================================== -Use the ``mysql_session`` |inspec resource| to test SQL commands run against a |mysql| database. - -**Stability: Experimental** - -Syntax ------------------------------------------------------ -A ``mysql_session`` |inspec resource| block declares the username and password to use for the session, and then the command to be run: - -.. code-block:: ruby - - describe mysql_session('username', 'password').query('QUERY') do - its('output') { should eq('') } - end - -where - -* ``mysql_session`` declares a username and password with permission to run the query -* ``query('QUERY')`` contains the query to be run -* ``its('output') { should eq('') }`` compares the results of the query against the expected result in the test - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -output -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``output`` matcher tests the results of the query: - -.. code-block:: ruby - - its('output') { should eq(/^0/) } - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test for matching databases** - -.. code-block:: ruby - - sql = mysql_session('my_user','password') - describe sql.query('show databases like \'test\';') do - its('stdout') { should_not match(/test/) } - end - - - - -npm -===================================================== -Use the ``npm`` |inspec resource| to test if a global |npm| package is installed. |npm| is the `the package manager for Nodejs packages `__, such as |bower| and |statsd|. - -**Stability: Experimental** - -Syntax ------------------------------------------------------ -A ``npm`` |inspec resource| block declares a package and (optionally) a package version: - -.. code-block:: ruby - - describe gem('npm_package_name') do - it { should be_installed } - end - -where - -* ``('npm_package_name')`` must specify a |npm| package, such as ``'bower'`` or ``'statsd'`` -* ``be_installed`` is a valid matcher for this |inspec resource| - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -be_installed -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``be_installed`` matcher tests if the named |gem| package and package version (if specified) is installed: - -.. code-block:: ruby - - it { should be_installed } - -version -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``version`` matcher tests if the named package version is on the system: - -.. code-block:: ruby - - its('version') { should eq '1.2.3' } - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Verify that bower is installed, with a specific version** - -.. code-block:: ruby - - describe npm('bower') do - it { should be_installed } - its('version') { should eq '1.4.1' } - end - -**Verify that statsd is not installed** - -.. code-block:: ruby - - describe npm('statsd') do - it { should_not be_installed } - end - - -ntp_conf -===================================================== -Use the ``ntp_conf`` |inspec resource| to test the synchronization settings defined in the ``ntp.conf`` file. This file is typically located at ``/etc/ntp.conf``. - -**Stability: Experimental** - -Syntax ------------------------------------------------------ -An ``ntp_conf`` |inspec resource| block declares the synchronization settings that should be tested: - -.. code-block:: ruby - - describe ntp_conf('path') do - its('setting_name') { should eq 'value' } - end - -where - -* ``'setting_name'`` is a synchronization setting defined in the ``ntp.conf`` file -* ``('path')`` is the non-default path to the ``ntp.conf`` file -* ``{ should eq 'value' }`` is the value that is expected - -Matchers ------------------------------------------------------ -This |inspec resource| matches any service that is listed in the ``ntp.conf`` file: - -.. code-block:: ruby - - its('server') { should_not eq nil } - -or: - -.. code-block:: ruby - - its('restrict') { should include '-4 default kod notrap nomodify nopeer noquery'} - -For example: - -.. code-block:: ruby - - describe ntp_conf do - its('server') { should_not eq nil } - its('restrict') { should include '-4 default kod notrap nomodify nopeer noquery'} - end - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test for clock drift against named servers** - -.. code-block:: ruby - - describe ntp_conf do - its('driftfile') { should eq '/var/lib/ntp/ntp.drift' } - its('server') { should eq [ - 0.ubuntu.pool.ntp.org, - 1.ubuntu.pool.ntp.org, - 2.ubuntu.pool.ntp.org - ] } - end - - - -oneget -===================================================== -Use the ``oneget`` |inspec resource| to test if the named package and/or package version is installed on the system. This resource uses |oneget|, which is `part of the Windows Management Framework 5.0 and Windows 10 `__. This resource uses the ``Get-Package`` cmdlet to return all of the package names in the |oneget| repository. - -**Stability: Experimental** - -Syntax ------------------------------------------------------ -A ``oneget`` |inspec resource| block declares a package and (optionally) a package version: - -.. code-block:: ruby - - describe oneget('name') do - it { should be_installed } - end - -where - -* ``('name')`` must specify the name of a package, such as ``'VLC'`` -* ``be_installed`` is a valid matcher for this |inspec resource| - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -be_installed -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``be_installed`` matcher tests if the named package is installed on the system: - -.. code-block:: ruby - - it { should be_installed } - -version -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``version`` matcher tests if the named package version is on the system: - -.. code-block:: ruby - - its('version') { should eq '1.2.3' } - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test if VLC is installed** - -.. code-block:: ruby - - describe oneget('VLC') do - it { should be_installed } - end - - -os -===================================================== -Use the ``os`` |inspec resource| to test the platform on which the system is running. - -**Stability: Stable** - -Syntax ------------------------------------------------------ -A ``os`` |inspec resource| block declares the platform to be tested: - -.. code-block:: ruby - - describe os[:family] do - it { should eq 'platform' } - end - -where - -* ``'platform'`` is one of ``bsd``, ``debian``, ``linux``, ``redhat``, ``solaris``, ``suse``, ``unix``, or ``windows`` - - -Matchers ------------------------------------------------------ -This InSpec audit resource does not have any matchers. - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test for RedHat** - -.. code-block:: ruby - - describe os[:family] do - it { should eq 'redhat' } - end - -**Test for Ubuntu** - -.. code-block:: ruby - - describe os[:family] do - it { should eq 'debian' } - end - -**Test for Microsoft Windows** - -.. code-block:: ruby - - describe os[:family] do - it { should eq 'windows' } - end - - -os_env -===================================================== -Use the ``os_env`` |inspec resource| to test the environment variables for the platform on which the system is running. - -**Stability: Experimental** - -Syntax ------------------------------------------------------ -A ``os_env`` |inspec resource| block declares an environment variable, and then declares its value: - -.. code-block:: ruby - - describe os_env('VARIABLE') do - its('matcher') { should eq 1 } - end - -where - -* ``('VARIABLE')`` must specify an environment variable, such as ``PATH`` -* ``matcher`` is a valid matcher for this InSpec resource - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -content -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``content`` matcher return the value of the environment variable: - -.. code-block:: ruby - - its('content') { should eq '/usr/local/bin:/usr/local/sbin:/usr/sbin:/usr/bin:/sbin' } - -split -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``split`` splits the content with the ``:``` deliminator: - -.. code-block:: ruby - - its('split') { should include ('') } - -or: - -.. code-block:: ruby - - its('split') { should_not include ('.') } - -Use ``-1`` to test for cases where there is a trailing colon (``:``), such as ``dir1::dir2:``: - -.. code-block:: ruby - - its('split') { should include ('-1') } - - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test the PATH environment variable** - -.. code-block:: ruby - - describe os_env('PATH') do - its('split') { should_not include('') } - its('split') { should_not include('.') } - end - - -package -===================================================== -Use the ``package`` |inspec resource| to test if the named package and/or package version is installed on the system. - -**Stability: Stable** - -Syntax ------------------------------------------------------ -A ``package`` |inspec resource| block declares a package and (optionally) a package version: - -.. code-block:: ruby - - describe package('name') do - it { should be_installed } - end - -where - -* ``('name')`` must specify the name of a package, such as ``'nginx'`` -* ``be_installed`` is a valid matcher for this |inspec resource| - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -be_installed -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``be_installed`` matcher tests if the named package is installed on the system: - -.. code-block:: ruby - - it { should be_installed } - -version -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``version`` matcher tests if the named package version is on the system: - -.. code-block:: ruby - - its('version') { should eq '1.2.3' } - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test if nginx version 1.9.5 is installed** - -.. code-block:: ruby - - describe package('nginx') do - it { should be_installed } - its('version') { should eq 1.9.5 } - end - -**Test that a package is not installed** - -.. code-block:: ruby - - describe package('some_package') do - it { should_not be_installed } - end - -**Test if telnet is installed** - -.. code-block:: ruby - - describe package('telnetd') do - it { should_not be_installed } - end - - describe inetd_conf do - its('telnet') { should eq nil } - end - -**Test if ClamAV (an antivirus engine) is installed and running** - -.. code-block:: ruby - - describe package('clamav') do - it { should be_installed } - its('version') { should eq '0.98.7' } - end - - describe service('clamd') do - it { should_not be_enabled } - it { should_not be_installed } - it { should_not be_running } - end - - -parse_config -===================================================== -Use the ``parse_config`` |inspec resource| to test arbitrary configuration files. - -**Stability: Experimental** - -Syntax ------------------------------------------------------ -A ``parse_config`` |inspec resource| block declares the location of the configuration setting to be tested, and then what value is to be tested. Because this |inspec resource| relies on arbitrary configuration files, the test itself is often arbitrary and relies on custom |ruby| code: - -.. code-block:: ruby - - output = command('some-command').stdout - - describe parse_config(output, { data_config_option: value } ) do - its('setting') { should eq 1 } - end - -or: - -.. code-block:: ruby - - audit = command('/sbin/auditctl -l').stdout - options = { - assignment_re: /^\s*([^:]*?)\s*:\s*(.*?)\s*$/, - multiple_values: true - } - - describe parse_config(audit, options) do - its('setting') { should eq 1 } - end - -where each test - -* Must declare the location of the configuration file to be tested -* Must declare one (or more) settings to be tested -* May run a command to ``stdout``, and then run the test against that output -* May use options to define how configuration data is to be parsed - -Options ------------------------------------------------------ -This |inspec resource| supports the following options for parsing configuration data. Use them in an ``options`` block stated outside of (and immediately before) the actual test: - -.. code-block:: ruby - - options = { - assignment_re: /^\s*([^:]*?)\s*:\s*(.*?)\s*$/, - multiple_values: true - } - describe parse_config(options) do - its('setting') { should eq 1 } - end - -assignment_re -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -Use ``assignment_re`` to test a key value using a regular expression: - -.. code-block:: ruby - - 'key = value' - -may be tested using the following regular expression, which determines assignment from key to value: - -.. code-block:: ruby - - assignment_re: /^\s*([^=]*?)\s*=\s*(.*?)\s*$/ - -comment_char -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -Use ``comment_char`` to test for comments in a configuration file: - -.. code-block:: ruby - - comment_char: '#' - -key_vals -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -Use ``key_vals`` to test how many values a key contains: - -.. code-block:: ruby - - key = a b c - -contains three values. To test that value to ensure it only contains one, use: - -.. code-block:: ruby - - key_vals: 1 - -multiple_values -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -Use ``multiple_values`` if the source file uses the same key multiple times. All values will be aggregated in an array: - -.. code-block:: ruby - - # # file structure: - # key = a - # key = b - # key2 = c - params['key'] = ['a', 'b'] - params['key2'] = ['c'] - -To use plain key value mapping, use ``multiple_values: false``: - -.. code-block:: ruby - - # # file structure: - # key = a - # key = b - # key2 = c - params['key'] = 'b' - params['key2'] = 'c' - - -standalone_comments -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -Use ``standalone_comments`` to parse comments as a line , otherwise inline comments are allowed: - -.. code-block:: ruby - - 'key = value # comment' - params['key'] = 'value # comment' - - -Use ``standalone_comments: false``, to parse the following: - -.. code-block:: ruby - - 'key = value # comment' - params['key'] = 'value' - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test the expiration time for new account passwords** - -.. code-block:: ruby - - output = command('useradd -D').stdout - - describe parse_config(output) do - its('INACTIVE') { should eq '35' } - end - -**Test that bob is a user** - -.. code-block:: ruby - - describe parse_config(data, { multiple_values: true }) do - its('users') { should include 'bob'} - end - - -parse_config_file -===================================================== -Use the ``parse_config_file`` InSpec audit resource to test arbitrary configuration files. It works identiacal to ``parse_config``. Instead of using a command output, this resource works with files. - -**Stability: Experimental** - -Syntax ------------------------------------------------------ -A ``parse_config_file`` InSpec audit resource block declares the location of the configuration file to be tested, and then which settings in that file are to be tested. - -.. code-block:: ruby - - describe parse_config_file('/path/to/file', { data_config_option: value } ) do - its('setting') { should eq 1 } - end - -or: - -.. code-block:: ruby - - options = { - assignment_re: /^\s*([^:]*?)\s*:\s*(.*?)\s*$/, - multiple_values: true - } - - describe parse_config_file('path/to/file', options) do - its('setting') { should eq 1 } - end - -where each test - -* Must declare the location of the configuration file to be tested -* Must declare one (or more) settings to be tested -* May run a command to ``stdout``, and then run the test against that output -* May use options to define how configuration data is to be parsed - -Options ------------------------------------------------------ -This |inspec resource| supports the following options for parsing configuration data. Use them in an ``options`` block stated outside of (and immediately before) the actual test: - -.. code-block:: ruby - - options = { - assignment_re: /^\s*([^:]*?)\s*:\s*(.*?)\s*$/, - multiple_values: true - } - describe parse_config_file('path/to/file', options) do - its('setting') { should eq 1 } - end - -assignment_re -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -Use ``assignment_re`` to parse a key value using a regular expression: - -.. code-block:: ruby - - 'key = value' - -may be parsed using the following regular expression, which determines assignment from key to value: - -.. code-block:: ruby - - assignment_re: /^\s*([^=]*?)\s*=\s*(.*?)\s*$/ - -comment_char -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -Use ``comment_char`` to parse for comments in a configuration file: - -.. code-block:: ruby - - comment_char: '#' - -key_vals -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -Use ``key_vals`` to parse how many values a key contains: - -.. code-block:: ruby - - key = a b c - -contains three values. To test that value to ensure it only contains one, use: - -.. code-block:: ruby - - key_vals: 1 - - -multiple_values -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -Use ``multiple_values`` if the source file uses the same key multiple times. All values will be aggregated in an array: - -.. code-block:: ruby - - # # file structure: - # key = a - # key = b - # key2 = c - params['key'] = ['a', 'b'] - params['key2'] = ['c'] - -To use plain key value mapping, use ``multiple_values: false``: - -.. code-block:: ruby - - # # file structure: - # key = a - # key = b - # key2 = c - params['key'] = 'b' - params['key2'] = 'c' - - -standalone_comments -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -Use ``standalone_comments`` to parse comments as a line , otherwise inline comments are allowed: - -.. code-block:: ruby - - 'key = value # comment' - params['key'] = 'value # comment' - - -Use ``standalone_comments: false``, to parse the following: - -.. code-block:: ruby - - 'key = value # comment' - params['key'] = 'value' - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test a configuration setting** - -.. code-block:: ruby - - describe parse_config_file('/path/to/file.conf') do - its('PARAM_X') { should eq 'Y' } - end - -**Use options, and then test a configuration setting** - -.. code-block:: ruby - - describe parse_config_file('/path/to/file.conf', { multiple_values: true }) do - its('PARAM_X') { should include 'Y' } - end - - - -passwd -===================================================== -Use the ``passwd`` |inspec resource| to test the contents of ``/etc/passwd``, which contains the following information for users that may log into the system and/or as users that own running processes. The format for ``/etc/passwd`` includes: - -* A username -* The password for that user (on newer systems passwords should be stored in ``/etc/shadow`` ) -* The user identifier (UID) assigned to that user -* The group identifier (GID) assigned to that user -* Additional information about that user -* That user's home directory -* That user's default command shell - -defined as a colon-delimited row in the file, one row per user: - -.. code-block:: bash - - root:x:1234:5678:additional_info:/home/dir/:/bin/bash - -**Stability: Experimental** - -Syntax ------------------------------------------------------ -A ``passwd`` |inspec resource| block declares one (or more) users and associated user information to be tested: - -.. code-block:: ruby - - describe passwd do - its('users') { should_not include 'forbidden_user' } - end - - describe passwd.uid(0) do - its('users') { should cmp 'root' } - its('count') { should eq 1 } - end - -where - -* ``users``, ``uids``, ``gids``, ``passwords``, ``homes``, and ``shells`` are valid accessors for ``passwd`` -* All of these matchers can be given an argument to filter by, for example: ``passwd.users(/name/)`` -* There is an explicit method to filter by (``filter``) which can take multiple arguments at once -* ``count`` retrieves the number of entries -* ``lines`` provides raw passwd lines -* ``params`` returns an array of maps for all entries - - -Matchers for ``passwd`` ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -gids -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``gids`` matcher tests if the group indentifiers in the test match group identifiers in ``/etc/passwd``: - -.. code-block:: ruby - - its('gids') { should include 1234 } - its('gids') { should cmp 0 } - -passwords -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``passwords`` matcher tests if passwords are - -* Encrypted -* Have direct logins disabled, as indicated by an asterisk (``*``) -* In the ``/etc/shadow`` file, as indicated by the letter x (``x``) - -For example: - -.. code-block:: ruby - - its('passwords') { should eq ['x'] } - its('passwords') { should cmp '*' } - -uids -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``uids`` matcher tests if the user indentifiers in the test match user identifiers in ``/etc/passwd``: - -.. code-block:: ruby - - its('uids') { should eq ['1234', '1235'] } - -users -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``users`` matcher tests if the usernames in the test match usernames in ``/etc/passwd``: - -.. code-block:: ruby - - its('users') { should_not include 'www-data' } - - -count -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``count`` matcher tests the number of entries in ``/etc/passwd``. It becomes especially useful in conjunction combination with filters: - -.. code-block:: ruby - - describe passwd.users('highlander') do - its('count') { should eq 1 } - end - - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test usernames and UIDs** - -.. code-block:: ruby - - describe passwd do - its('users') { should eq ['root', 'www-data'] } - its('uids') { should eq [0, 33] } - end - -**Select one user and test for multiple occurances in passwd** - -.. code-block:: ruby - - describe passwd.uids(0) do - its('users') { should cmp 'root' } - its('count') { should eq 1 } - end - - describe passwd.filter(user: 'www-data') do - its('uids') { should cmp 33 } - its('count') { should eq 1 } - end - - -pip -===================================================== -Use the ``pip`` |inspec resource| to test packages that are installed using the |pip| installer. - -**Stability: Experimental** - -Syntax ------------------------------------------------------ -A ``pip`` |inspec resource| block declares a package and (optionally) a package version: - -.. code-block:: ruby - - describe pip('Jinja2') do - it { should be_installed } - end - -where - -* ``'Jinja2'`` is the name of the package -* ``be_installed`` tests to see if the ``Jinja2`` package is installed - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -be_installed -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``be_installed`` matcher tests if the named package is installed on the system: - -.. code-block:: ruby - - it { should be_installed } - -version -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``version`` matcher tests if the named package version is on the system: - -.. code-block:: ruby - - its('version') { should eq '1.2.3' } - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test if Jinja2 is installed on the system** - -.. code-block:: ruby - - describe pip('Jinja2') do - it { should be_installed } - end - -**Test if Jinja2 2.8 is installed on the system** - -.. code-block:: ruby - - describe pip('Jinja2') do - it { should be_installed } - its('version') { should eq '2.8' } - end - - -port -===================================================== -Use the ``port`` |inspec resource| to test basic port properties, such as port, process, if it's listening. - -**Stability: Stable** - -Syntax ------------------------------------------------------ -A ``port`` |inspec resource| block declares a port, and then depending on what needs to be tested, a process, protocol, process identifier, and its state (is it listening?): - -.. code-block:: ruby - - describe port(514) do - it { should be_listening } - its('processes') {should include 'syslog'} - end - -where the ``processes`` returns the processes listening on port 514. - -or: - -.. code-block:: ruby - - describe port.where { protocol =~ /tcp/ && port > 22 && port < 80 } do - it { should_not be_listening } - end - -where - -* ``.where{}`` may specify a block to filter on attributes: port, address, protocol, process, pid, listening? - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -be_listening -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``be_listening`` matcher tests if the port is listening for traffic: - -.. code-block:: ruby - - it { should be_listening } - -pid -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``pids`` matcher tests the process identifier (PID): - -.. code-block:: ruby - - its('pids') { should eq ['27808'] } - -process -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``processes`` matcher tests if the named process is running on the system: - -.. code-block:: ruby - - its('processes') { should eq ['syslog'] } - -protocol -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``protocols`` matcher tests the Internet protocol: |icmp| (``'icmp'``), |tcp| (``'tcp'`` or ``'tcp6'``), or |udp| (``'udp'`` or ``'udp6'``): - -.. code-block:: ruby - - its('protocols') { should eq ['tcp'] } - -or for the |ipv6| protocol: - -.. code-block:: ruby - - its('protocols') { should eq ['tcp6'] } - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test port 80, listening with the TCP protocol** - -.. code-block:: ruby - - describe port(80) do - it { should be_listening } - its('protocols') {should eq ['tcp']} - end - -**Test port 80, listening with TCP version IPv6 protocol** - -.. code-block:: ruby - - describe port(80) do - it { should be_listening } - its('protocols') {should eq ['tcp6']} - end - -**Test ports for HTTPs** - -.. code-block:: ruby - - describe port(80) do - it { should_not be_listening } - end - - describe port(443) do - it { should be_listening } - its('protocols') {should eq ['tcp']} - end - -**Test port 80 on a specific address** - -This check can be implemented in two equivalent ways: - -.. code-block:: ruby - - describe port(80) do - it { should be_listening } - its('addresses') {should include '0.0.0.0'} - end - - describe port('0.0.0.0', 80) do - it { should be_listening } - end - -**Test that no ports above 80 are listening** - -.. code-block:: ruby - - describe port.where { protocol =~ /tcp/ && port > 80 } do - it { should_not be_listening } - end - -**Tests that only httpd and sshd are listening** - - describe port.where { listening? } do - its('processes') { should contain_exactly('sshd','httpd') } - end - -postgres_conf -===================================================== -Use the ``postgres_conf`` |inspec resource| to test the contents of the configuration file for |postgresql|, typically located at ``/etc/postgresql//main/postgresql.conf`` or ``/var/lib/postgres/data/postgresql.conf``, depending on the platform. - -**Stability: Experimental** - -Syntax ------------------------------------------------------ -A ``postgres_conf`` |inspec resource| block declares one (or more) settings in the ``postgresql.conf`` file, and then compares the setting in the configuration file to the value stated in the test: - -.. code-block:: ruby - - describe postgres_conf('path') do - its('setting') { should eq 'value' } - end - -where - -* ``'setting'`` specifies a setting in the ``postgresql.conf`` file -* ``('path')`` is the non-default path to the ``postgresql.conf`` file (optional) -* ``should eq 'value'`` is the value that is expected - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -setting -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``setting`` matcher tests specific, named settings in the ``postgresql.conf`` file: - -.. code-block:: ruby - - its('setting') { should eq 'value' } - -Use a ``setting`` matcher for each setting to be tested. - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test the maximum number of allowed client connections** - -.. code-block:: ruby - - describe postgres_conf do - its('max_connections') { should eq '5' } - end - -**Test system logging** - -.. code-block:: ruby - - describe postgres_conf do - its('logging_collector') { should eq 'on' } - its('log_connections') { should eq 'on' } - its('log_disconnections') { should eq 'on' } - its('log_duration') { should eq 'on' } - its('log_hostname') { should eq 'on' } - its('log_line_prefix') { should eq '%t %u %d %h' } - end - -**Test the port on which PostgreSQL listens** - -.. code-block:: ruby - - describe postgres_conf do - its('port') { should eq '5432' } - end - -**Test the Unix socket settings** - -.. code-block:: ruby - - describe postgres_conf do - its('unix_socket_directories') { should eq '.s.PGSQL.5432' } - its('unix_socket_group') { should eq nil } - its('unix_socket_permissions') { should eq '0770' } - end - -where ``unix_socket_group`` is set to the |postgresql| default setting (the group to which the server user belongs). - - - -postgres_session -===================================================== -Use the ``postgres_session`` |inspec resource| to test SQL commands run against a |postgresql| database. - -**Stability: Experimental** - -Syntax ------------------------------------------------------ -A ``postgres_session`` |inspec resource| block declares the username and password to use for the session, and then the command to be run: - -.. code-block:: ruby - - sql = postgres_session('username', 'password') - - describe sql.query('SELECT * FROM pg_shadow WHERE passwd IS NULL;') do - its('output') { should eq('') } - end - -where - -* ``sql = postgres_session`` declares a username and password with permission to run the query -* ``sql.query('')`` contains the query to be run -* ``its('output') { should eq('') }`` compares the results of the query against the expected result in the test - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -output -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``output`` matcher tests the results of the query: - -.. code-block:: ruby - - its('output') { should eq(/^0/) } - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test the PostgreSQL shadow password** - -.. code-block:: ruby - - sql = postgres_session('my_user', 'password') - - describe sql.query('SELECT * FROM pg_shadow WHERE passwd IS NULL;') do - its('output') { should eq('') } - end - -**Test for risky database entries** - -.. code-block:: ruby - - describe postgres_session('my_user', 'password').query('SELECT count (*) - FROM pg_language - WHERE lanpltrusted = \'f\' - AND lanname!=\'internal\' - AND lanname!=\'c\';') do - its('output') { should eq '0' } - end - - - -powershell -===================================================== -Use the ``powershell`` |inspec resource| to test a |powershell| script on the |windows| platform. - -**Stability: Experimental** - -Syntax ------------------------------------------------------ -A ``powershell`` |inspec resource| block declares a script to be tested, and then a command that should be part of that script: - -.. code-block:: ruby - - script = <<-EOH - # you powershell script - EOH - - describe powershell(script) do - its('matcher') { should eq 'output' } - end - - -where - -* ``'script'`` must specify a Powershell script to be run -* ``'matcher'`` is one of ``exit_status``, ``stderr``, or ``stdout`` -* ``'output'`` tests the output of the command run on the system versus the output value stated in the test - - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -exit_status -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``exit_status`` matcher tests the exit status for the command: - -.. code-block:: ruby - - its('exit_status') { should eq 123 } - -stderr -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``stderr`` matcher tests results of the command as returned in standard error (stderr): - -.. code-block:: ruby - - its('stderr') { should eq 'error' } - -stdout -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``stdout`` matcher tests results of the command as returned in standard output (stdout): - -.. code-block:: ruby - - its('stdout') { should eq '/^1$/' } - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Get all groups of Administrator user** - -.. code-block:: ruby - - myscript = <<-EOH - # find user - $user = Get-WmiObject Win32_UserAccount -filter "Name = 'Administrator'" - # get related groups - $groups = $user.GetRelated('Win32_Group') | Select-Object -Property Caption, Domain, Name, LocalAccount, SID, SIDType, Status - $groups | ConvertTo-Json - EOH - - describe script(myscript) do - its('stdout') { should_not eq '' } - end - - - -processes -===================================================== -Use the ``processes`` |inspec resource| to test properties for programs that are running on the system. - -**Stability: Experimental** - -Syntax ------------------------------------------------------ -A ``processes`` |inspec resource| block declares the name of the process to be tested, and then declares one (or more) property/value pairs: - -.. code-block:: ruby - - describe processes('process_name') do - its('property_name') { should eq 'property_value' } - end - -where - -* ``processes('process_name')`` must specify the name of a process that is running on the system -* The ``user`` and ``state`` properties may be tested; they are exposed via ``users`` and ``states``, respectively. - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -property_name -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``property_name`` matcher tests the named property for the specified value: - -.. code-block:: ruby - - its('property_name') { should eq 'property_value' } - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -.. The title for the example below needs to be clarified, then it can be uncommented -.. -.. **Test for multiple instances of Nginx** -.. -.. .. code-block:: ruby -.. -.. describe processes('postgres') do -.. its('list.length') { should be(1) } -.. end -.. - -**Test for multiple instances of mysqld** - -.. code-block:: ruby - - describe processes('mysqld') do - its('list.length') { should eq 1 } - end - -**Test if the init process is owned by the root user** - -.. code-block:: ruby - - describe processes('init') do - its('users') { should eq ['root'] } - end - -**Test if a high-priority process is running** - -.. code-block:: ruby - - describe processes('some_process') do - its('states') { should eq ['R<'] } - end - - -registry_key -===================================================== -Use the ``registry_key`` |inspec resource| to test key values in the |windows| registry. - -**Stability: Stable** - -Syntax ------------------------------------------------------ -A ``registry_key`` |inspec resource| block declares the item in the |windows| registry, the path to a setting under that item, and then one (or more) name/value pairs to be tested: - -.. code-block:: ruby - - describe registry_key('registry_item', 'path\to\key') do - its('name') { should eq 'value' } - end - - describe registry_key('path\to\key') do - its('name') { should eq 'value' } - end - -where - -* ``'registry_item'`` is a key in the |windows| registry (optional) -* ``'path\to\key'`` is the path in the |windows| registry -* ``('name')`` and ``'value'`` represent the name of the key and the value assigned to that key - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -name -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``name`` matcher tests the value for the specified registry setting: - -.. code-block:: ruby - - its('name') { should eq 'value' } - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test the start time for the Schedule service** - -.. code-block:: ruby - - describe registry_key('Task Scheduler','HKEY_LOCAL_MACHINE\...\Schedule') do - its('Start') { should eq 2 } - end - -where ``'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Schedule'`` is the full path to the setting. - - -security_policy -===================================================== -Use the ``security_policy`` |inspec resource| to test security policies on the |windows| platform. - -**Stability: Experimental** - -Syntax ------------------------------------------------------ -A ``security_policy`` |inspec resource| block declares the name of a security policy and the value to be tested: - -.. code-block:: ruby - - describe security_policy do - its('policy_name') { should eq 'value' } - end - -where - -* ``'policy_name'`` must specify a security policy -* ``{ should eq 'value' }`` tests the value of ``policy_name`` against the value declared in the test - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -policy_name -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``policy_name`` matcher must be the name of a security policy: - -.. code-block:: ruby - - its('SeNetworkLogonRight') { should eq '*S-1-5-11' } - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Verify that only the Administrators group has remote access** - -.. code-block:: ruby - - describe security_policy do - its('SeRemoteInteractiveLogonRight') { should eq '*S-1-5-32-544' } - end - - -service -===================================================== -Use the ``service`` |inspec resource| to test if the named service is installed, running and/or enabled. - -**Stability: Stable** - -Syntax ------------------------------------------------------ -A ``service`` |inspec resource| block declares the name of a service and then one (or more) matchers to test the state of the service: - -.. code-block:: ruby - - describe service('service_name') do - it { should be_installed } - it { should be_enabled } - it { should be_running } - end - -where - -* ``('service_name')`` must specify a service name -* ``be_installed``, ``be_enabled``, and ``be_running`` are valid matchers for this |inspec resource| - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -be_enabled -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``be_enabled`` matcher tests if the named service is enabled: - -.. code-block:: ruby - - it { should be_enabled } - -be_installed -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``be_installed`` matcher tests if the named service is installed: - -.. code-block:: ruby - - it { should be_installed } - -be_running -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``be_running`` matcher tests if the named service is running: - -.. code-block:: ruby - - it { should be_running } - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test if the postgresql service is both running and enabled** - -.. code-block:: ruby - - describe service('postgresql') do - it { should be_enabled } - it { should be_running } - end - -**Test if the mysql service is both running and enabled** - -.. code-block:: ruby - - describe service('mysqld') do - it { should be_enabled } - it { should be_running } - end - -**Test if ClamAV (an antivirus engine) is installed and running** - -.. code-block:: ruby - - describe package('clamav') do - it { should be_installed } - its('version') { should eq '0.98.7' } - end - - describe service('clamd') do - it { should_not be_enabled } - it { should_not be_installed } - it { should_not be_running } - end - - -**Test the runlevels for Sys-V services** - -On targets using Sys-V services, the existing runlevels can also be checked: - -.. code-block:: ruby - - describe service('sshd').runlevels do - its('keys') { should include(2) } - end - - describe service('sshd').runlevels(2,4) do - it { should be_enabled } - end - -**Override the service manager** - -Under some circumstances, it may be required to override the logic in place to select the right service manager. For example, if you want to check a service managed by Upstart, you can explicitly do so: - -.. code-block:: ruby - - describe upstart_service('service') do - it { should_not be_enabled } - it { should be_installed } - it { should be_running } - end - -This is also possible with `systemd_service`, `runit_service`, `sysv_service`, `bsd_service`, and `launchd_service`. -You can also provide the control command, for when it is not to be found at the default location. -For example, if your `sv` command for services managed by Runit is not in PATH: - -.. code-block:: ruby - - describe runit_service('service', '/opt/chef/embedded/sbin/sv') do - it { should be_enabled } - it { should be_installed } - it { should be_running } - end - - -ssh_config -===================================================== -Use the ``ssh_config`` |inspec resource| to test |openssh| |ssh| client configuration data located at ``/etc/ssh/ssh_config`` on |linux| and |unix| platforms. - -**Stability: Experimental** - -Syntax ------------------------------------------------------ -A ``ssh_config`` |inspec resource| block declares the client |openssh| configuration data to be tested: - -.. code-block:: ruby - - describe ssh_config('path') do - its('name') { should include('foo') } - end - -where - -* ``name`` is a configuration setting in ``ssh_config`` -* ``('path')`` is the non-default ``/path/to/ssh_config`` -* ``{ should include('foo') }`` tests the value of ``name`` as read from ``ssh_config`` versus the value declared in the test - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -name -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``name`` matcher tests the value of ``name`` as read from ``ssh_config`` versus the value declared in the test: - -.. code-block:: ruby - - its('name') { should eq 'foo' } - -or: - -.. code-block:: ruby - - its('name') { should include('bar') } - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test SSH configuration settings** - -.. code-block:: ruby - - describe ssh_config do - its('cipher') { should contain '3des' } - its('port') { should eq '22' } - its('hostname') { should include('example.com') } - end - -**Test which variables from the local environment are sent to the server** - -.. code-block:: ruby - - only_if do - command('sshd').exist? or command('ssh').exists? - end - - describe ssh_config do - its('SendEnv') { should include('GORDON_CLIENT') } - end - -**Test owner and group permissions** - -.. code-block:: ruby - - describe ssh_config do - its('owner') { should eq 'root' } - its('mode') { should eq 644 } - end - -**Test SSH configuration** - -.. code-block:: ruby - - describe ssh_config do - its('Host') { should eq '*' } - its('Tunnel') { should eq nil } - its('SendEnv') { should eq 'LANG LC_*' } - its('HashKnownHosts') { should eq 'yes' } - end - - -sshd_config -===================================================== -Use the ``sshd_config`` |inspec resource| to test configuration data for the |openssh| daemon located at ``/etc/ssh/sshd_config`` on |linux| and |unix| platforms. sshd---the |openssh| daemon---listens on dedicated ports, starts a daemon for each incoming connection, and then handles encryption, authentication, key exchanges, command executation, and data exchanges. - -**Stability: Experimental** - -Syntax ------------------------------------------------------ -A ``sshd_config`` |inspec resource| block declares the client |openssh| configuration data to be tested: - -.. code-block:: ruby - - describe sshd_config('path') do - its('name') { should include('foo') } - end - -where - -* ``name`` is a configuration setting in ``sshd_config`` -* ``('path')`` is the non-default ``/path/to/sshd_config`` -* ``{ should include('foo') }`` tests the value of ``name`` as read from ``sshd_config`` versus the value declared in the test - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -name -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``name`` matcher tests the value of ``name`` as read from ``sshd_config`` versus the value declared in the test: - -.. code-block:: ruby - - its('name') { should eq 'foo' } - -or: - -.. code-block:: ruby - - its('name') {should include('bar') } - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test which variables may be sent to the server** - -.. code-block:: ruby - - describe sshd_config do - its('AcceptEnv') { should include('GORDON_SERVER') } - end - -**Test for IPv6-only addresses** - -.. code-block:: ruby - - describe sshd_config do - its('AddressFamily') { should eq 'inet6' } - end - -**Test protocols** - -.. code-block:: ruby - - describe sshd_config do - its('Protocol') { should cmp 2 } - end - -**Test ciphers** - -.. code-block:: ruby - - describe sshd_config do - its('Ciphers') { should eq('chacha20-poly1305@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr') } - end - -**Test SSH protocols** - -.. code-block:: ruby - - describe sshd_config do - its('Port') { should cmp 22 } - its('UsePAM') { should eq 'yes' } - its('ListenAddress') { should eq nil } - its('HostKey') { should eq [ - '/etc/ssh/ssh_host_rsa_key', - '/etc/ssh/ssh_host_dsa_key', - '/etc/ssh/ssh_host_ecdsa_key', - ] } - end - - -user -===================================================== -Use the ``user`` |inspec resource| to test user profiles, including the groups to which they belong, the frequency of required password changes, the directory paths to home and shell. - -**Stability: Stable** - -Syntax ------------------------------------------------------ -A ``user`` |inspec resource| block declares a user name, and then one (or more) matchers: - -.. code-block:: ruby - - describe user('root') do - it { should exist } - its('uid') { should eq 1234 } - its('gid') { should eq 1234 } - its('group') { should eq 'root' } - its('groups') { should eq ['root', 'other']} - its('home') { should eq '/root' } - its('shell') { should eq '/bin/bash' } - its('mindays') { should eq 0 } - its('maxdays') { should eq 90 } - its('warndays') { should eq 8 } - end - -where - -* ``('root')`` is the user to be tested -* ``it { should exist }`` tests if the user exists -* ``gid``, ``group``, ``groups``, ``home``, ``maxdays``, ``mindays``, ``shell``, ``uid``, and ``warndays`` are valid matchers for this |inspec resource| - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -exist -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``exist`` matcher tests if the named user exists: - -.. code-block:: ruby - - it { should exist } - -gid -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``gid`` matcher tests the group identifier: - -.. code-block:: ruby - - its('gid') { should eq 1234 } } - -where ``1234`` represents the user identifier. - -group -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``group`` matcher tests the group to which the user belongs: - -.. code-block:: ruby - - its('group') { should eq 'root' } - -where ``root`` represents the group. - -groups -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``groups`` matcher tests two (or more) groups to which the user belongs: - -.. code-block:: ruby - - its('groups') { should eq ['root', 'other']} - -home -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``home`` matcher tests the home directory path for the user: - -.. code-block:: ruby - - its('home') { should eq '/root' } - -maxdays -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``maxdays`` matcher tests the maximum number of days between password changes: - -.. code-block:: ruby - - its('maxdays') { should eq 99 } - -where ``99`` represents the maximum number of days. - -mindays -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``mindays`` matcher tests the minimum number of days between password changes: - -.. code-block:: ruby - - its('mindays') { should eq 0 } - -where ``0`` represents the maximum number of days. - -shell -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``shell`` matcher tests the path to the default shell for the user: - -.. code-block:: ruby - - its('shell') { should eq '/bin/bash' } - -uid -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``uid`` matcher tests the user identifier: - -.. code-block:: ruby - - its('uid') { should eq 1234 } } - -where ``1234`` represents the user identifier. - -warndays -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``warndays`` matcher tests the number of days a user is warned before a password must be changed: - -.. code-block:: ruby - - its('warndays') { should eq 5 } - -where ``5`` represents the number of days a user is warned. - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Verify available users for the MySQL server** - -.. code-block:: ruby - - describe user('root') do - it { should exist } - it { should belong_to_group 'root' } - its('uid') { should eq 0 } - its('groups') { should eq ['root'] } - end - - describe user('mysql') do - it { should_not exist } - end - -**Test users on multiple platforms** - -The |nginx| user is typically ``www-data``, but on |centos| it's ``nginx``. The following example shows how to test for the |nginx| user with a single test, but accounting for all platforms: - -.. code-block:: ruby - - web_user = 'www-data' - web_user = 'nginx' if os[:family] == 'centos' - - describe user(web_user) do - it { should exist } - end - - -windows_feature -===================================================== -Use the ``windows_feature`` |inspec resource| to test features on |windows|. It uses the ``Get-WindowsFeature`` cmdlet under the hood. - -**Stability: Experimental** - -Syntax ------------------------------------------------------ -A ``windows_feature`` |inspec resource| block declares the name of the |windows| feature, tests if that feature is installed, and then returns information about that feature: - -.. code-block:: ruby - - describe windows_feature('feature_name') do - it { should be_installed } - end - -where - -* ``('feature_name')`` must specify a |windows| feature name, such as ``DHCP Server`` or ``IIS-Webserver`` -* ``be_installed`` is a valid matcher for this |inspec resource| - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -be_installed -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``be_installed`` matcher tests if the named |windows| feature is installed: - -.. code-block:: ruby - - it { should be_installed } - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test the DHCP Server feature** - -.. code-block:: ruby - - describe windows_feature('DHCP Server') do - it{ should be_installed } - end - - -yaml -===================================================== -Use the ``yaml`` |inspec resource| to test configuration data in a |yaml| file. - -**Stability: Experimental** - -Syntax ------------------------------------------------------ -A ``yaml`` |inspec resource| block declares the configuration data to be tested: - -.. code-block:: yaml - - name: foo - array: - - zero - - one - - -This file can be queried via: - -.. code-block:: ruby - - describe yaml do - its('name') { should eq 'foo' } - its(['array', 1]) { should eq 'one' } - end - -where - -* ``name`` is a configuration setting in a |yaml| file -* ``should eq 'foo'`` tests a value of ``name`` as read from a |yaml| file versus the value declared in the test - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -name -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``name`` matcher tests the value of ``name`` as read from a |yaml| file versus the value declared in the test: - -.. code-block:: ruby - - its('name') { should eq 'foo' } - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test a kitchen.yml file driver** - -.. code-block:: ruby - - describe yaml('.kitchen.yaml') do - its('driver.name') { should eq('vagrant') } - end - - -yum -===================================================== -Use the ``yum`` |inspec resource| to test packages in the |yum| repository. - -**Stability: Experimental** - -Syntax ------------------------------------------------------ -A ``yum`` |inspec resource| block declares a package repo, tests if the package repository is present, and if it that package repository is a valid package source (i.e. "is enabled"): - -.. code-block:: ruby - - describe yum.repo('name') do - it { should exist } - it { should be_enabled } - end - -where - -* ``repo('name')`` is the (optional) name of a package repo, using either a full identifier (``'updates/7/x86_64'``) or a short identifier (``'updates'``) - -Matchers ------------------------------------------------------ -This InSpec audit resource has the following matchers. - -be_enabled -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``be_enabled`` matcher tests if the package repository is a valid package source: - -.. code-block:: ruby - - it { should be_enabled } - -exist -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``exist`` matcher tests if the package repository exists: - -.. code-block:: ruby - - it { should exist } - -repo('name') -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``repo('name')`` matcher names a specific package repository: - -.. code-block:: ruby - - describe yum.repo('epel') do - ... - end - -repos -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``repos`` matcher tests if a named repo, using either a full identifier (``'updates/7/x86_64'``) or a short identifier (``'updates'``), is included in the |yum| repo: - -.. code-block:: ruby - - its('repos') { should include 'some_repo' } - -Examples ------------------------------------------------------ -The following examples show how to use this InSpec audit resource. - -**Test if the yum repo exists** - -.. code-block:: ruby - - describe yum do - its('repos') { should exist } - end - -**Test if the 'base/7/x86_64' repo exists and is enabled** - -.. code-block:: ruby - - describe yum do - its('repos') { should include 'base/7/x86_64' } - its('epel') { should exist } - its('epel') { should be_enabled } - end - -**Test if a specific yum repo exists** - -.. code-block:: ruby - - describe yum.repo('epel') do - it { should exist } - it { should be_enabled } - end - - - - -.. |inspec resource| replace:: InSpec audit resource -.. |apt| replace:: Apt -.. |apache| replace:: Apache -.. |archlinux| replace:: Arch Linux -.. |debian| replace:: Debian -.. |fedora| replace:: Fedora -.. |redhat enterprise linux| replace:: Red Hat Enterprise Linux -.. |centos| replace:: CentOS -.. |redhat| replace:: Red Hat -.. |ubuntu| replace:: Ubuntu -.. |windows| replace:: Microsoft Windows -.. |unix| replace:: UNIX -.. |linux| replace:: Linux -.. |ppa| replace:: PPA -.. |json| replace:: JSON -.. |csv| replace:: CSV -.. |postgresql| replace:: PostgreSQL -.. |md5| replace:: MD5 -.. |sha256| replace:: SHA-256 -.. |selinux| replace:: SELinux -.. |gem| replace:: gem -.. |icmp| replace:: ICMP -.. |tcp| replace:: TCP -.. |udp| replace:: UDP -.. |inetd| replace:: inetd -.. |mysql| replace:: MySQL -.. |npm| replace:: npm -.. |bower| replace:: bower -.. |statsd| replace:: StatsD -.. |oneget| replace:: OneGet -.. |ruby| replace:: Ruby -.. |pip| replace:: pip -.. |ipv4| replace:: Internet Protocol version 4 (IPv4) -.. |ipv6| replace:: Internet Protocol version 6 (IPv6) -.. |powershell| replace:: Windows PowerShell -.. |openssh| replace:: Open SSH -.. |ssh| replace:: SSH -.. |nginx| replace:: Nginx -.. |yaml| replace:: YAML -.. |yum| replace:: Yum diff --git a/docs/resources/apache_conf.md.erb b/docs/resources/apache_conf.md.erb new file mode 100644 index 000000000..4067076fe --- /dev/null +++ b/docs/resources/apache_conf.md.erb @@ -0,0 +1,75 @@ +--- +title: About the apache_conf Resource +--- + +# apache_conf + +Use the `apache_conf` InSpec audit resource to test the configuration settings for Apache. This file is typically located under `/etc/apache2` on the Debian and Ubuntu platforms and under `/etc/httpd` on the Fedora, CentOS, RedHat Enterprise Linux, and ArchLinux platforms. The configuration settings may vary significantly from platform to platform. + +## Syntax + +An `apache_conf` InSpec audit resource block declares configuration settings that should be tested: + + describe apache_conf('path') do + its('setting_name') { should eq 'value' } + end + +where + +* `'setting_name'` is a configuration setting defined in the Apache configuration file +* `('path')` is the non-default path to the Apache configuration file +* `{ should eq 'value' }` is the value that is expected + +## Matchers + +This InSpec audit resource matches any service that is listed in the Apache configuration file: + + its('PidFile') { should_not eq '/var/run/httpd.pid' } + +or: + + its('Timeout') { should eq 300 } + +For example: + + describe apache_conf do + its('MaxClients') { should eq 100 } + its('Listen') { should eq '443'} + end + + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test for blocking .htaccess files on CentOS + + describe apache_conf do + its('AllowOverride') { should eq 'None' } + end + +### Test ports for SSL + + describe apache_conf do + its('Listen') { should eq '443'} + end diff --git a/docs/resources/apt.md.erb b/docs/resources/apt.md.erb new file mode 100644 index 000000000..a86d7ee3b --- /dev/null +++ b/docs/resources/apt.md.erb @@ -0,0 +1,84 @@ +--- +title: About the apt Resource +--- + +# apt + +Use the `apt` InSpec audit resource to verify Apt repositories on the Debian and Ubuntu platforms, and also PPA repositories on the Ubuntu platform. + +## Syntax + +An `apt` resource block tests the contents of Apt and PPA repositories: + + describe apt('path') do + it { should exist } + it { should be_enabled } + end + +where + +* `apt('path')` must specify an Apt or PPA repository +* `('path')` may be an `http://` address, a `ppa:` address, or a short `repo-name/ppa` address +* `exist` and `be_enabled` are a valid matchers for this resource + + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### be_enabled + +The `be_enabled` matcher tests if a package exists in the repository: + + it { should be_enabled } + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### exist + +The `exist` matcher tests if a package exists on the system: + + it { should exist } + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test if apt repository exists and is enabled + + describe apt('http://ppa.launchpad.net/juju/stable/ubuntu') do + it { should exist } + it { should be_enabled } + end + +### Verify that a PPA repository exists and is enabled + + describe apt('ppa:nginx/stable') do + it { should exist } + it { should be_enabled } + end + +### Verify that a repository is not present + + describe apt('ubuntu-wine/ppa') do + it { should_not exist } + it { should_not be_enabled } + end diff --git a/docs/resources/audit_policy.md.erb b/docs/resources/audit_policy.md.erb new file mode 100644 index 000000000..487c49b70 --- /dev/null +++ b/docs/resources/audit_policy.md.erb @@ -0,0 +1,61 @@ +--- +title: About the audit_policy Resource +--- + +# audit_policy + +Use the `audit_policy` Inspec audit resource to test auditing policies on the Windows platform. An auditing policy is a category of security-related events to be audited. Auditing is disabled by default and may be enabled for categories like account management, logon events, policy changes, process tracking, privilege use, system events, or object access. For each auditing category property that is enabled, the auditing level may be set to `No Auditing`, `Not Specified`, `Success`, `Success and Failure`, or `Failure`. + +## Syntax + +An `audit_policy` resource block declares a parameter that belongs to an audit policy category or subcategory: + + describe audit_policy do + its('parameter') { should eq 'value' } + end + +where + +* `'parameter'` must specify a parameter +* `'value'` must be one of `No Auditing`, `Not Specified`, `Success`, `Success and Failure`, or `Failure` + + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test that a parameter is not set to "No Auditing" + + describe audit_policy do + its('Other Account Logon Events') { should_not eq 'No Auditing' } + end + +### Test that a parameter is set to "Success" + + describe audit_policy do + its('User Account Management') { should eq 'Success' } + end diff --git a/docs/resources/auditd_conf.md.erb b/docs/resources/auditd_conf.md.erb new file mode 100644 index 000000000..4acc07733 --- /dev/null +++ b/docs/resources/auditd_conf.md.erb @@ -0,0 +1,79 @@ +--- +title: About the auditd_conf Resource +--- + +# auditd_conf + +Use the `auditd_conf` InSpec audit resource to test the configuration settings for the audit daemon. This file is typically located under `/etc/audit/auditd.conf'` on Unix and Linux platforms. + +## Syntax + +A `auditd_conf` resource block declares configuration settings that should be tested: + + describe auditd_conf('path') do + its('keyword') { should cmp 'value' } + end + +where + +* `'keyword'` is a configuration setting defined in the `auditd.conf` configuration file +* `('path')` is the non-default path to the `auditd.conf` configuration file +* `{ should cmp 'value' }` is the value that is expected + + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### keyword + +This matcher will matche any keyword that is listed in the `auditd.conf` configuration file. Option names and values are case-insensitive: + + its('log_format') { should cmp 'raw' } + +or: + + its('max_log_file') { should cmp 6 } + +### match + +<%= partial "/shared/matcher_match" %> + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test the auditd.conf file + + describe auditd_conf do + its('log_file') { should cmp '/full/path/to/file' } + its('log_format') { should cmp 'raw' } + its('flush') { should cmp 'none' } + its('freq') { should cmp 1 } + its('num_logs') { should cmp 0 } + its('max_log_file') { should cmp 6 } + its('max_log_file_action') { should cmp 'email' } + its('space_left') { should cmp 2 } + its('action_mail_acct') { should cmp 'root' } + its('space_left_action') { should cmp 'email' } + its('admin_space_left') { should cmp 1 } + its('admin_space_left_action') { should cmp 'halt' } + its('disk_full_action') { should cmp 'halt' } + its('disk_error_action') { should cmp 'halt' } + end diff --git a/docs/resources/auditd_rules.md.erb b/docs/resources/auditd_rules.md.erb new file mode 100644 index 000000000..b96d1a06f --- /dev/null +++ b/docs/resources/auditd_rules.md.erb @@ -0,0 +1,132 @@ +--- +title: About the auditd_rules Resource +--- + +# auditd_rules + +Use the `auditd_rules` InSpec audit resource to test the rules for logging that exist on the system. The `audit.rules` file is typically located under `/etc/audit/` and contains the list of rules that define what is captured in log files. This resource uses `auditctl` to query the run-time `auditd` rules setup, which may be different from `audit.rules`. + + +## Syntax + +An `auditd_rules` resource block declares one (or more) rules to be tested, and then what that rule should do. The syntax depends on the version of `audit`: + +For `audit` >= 2.3: + + describe auditd_rules do + its('lines') { should contain_match(rule) } + end + +For `audit` < 2.3: + + describe audit_daemon_rules do + its("LIST_RULES") { + rule + } + end + +For example: + + describe auditd_rules do + its('LIST_RULES') { should eq [ + 'exit,always syscall=rmdir,unlink', + 'exit,always auid=1001 (0x3e9) syscall=open', + 'exit,always watch=/etc/group perm=wa', + 'exit,always watch=/etc/passwd perm=wa', + 'exit,always watch=/etc/shadow perm=wa', + 'exit,always watch=/etc/sudoers perm=wa', + 'exit,always watch=/etc/secret_directory perm=r', + ] } + end + +or test that individual rules are defined: + + describe auditd_rules do + its('LIST_RULES') { + should contain_match(/^exit,always watch=\/etc\/group perm=wa key=identity/) + } + its('LIST_RULES') { + should contain_match(/^exit,always watch=\/etc\/passwd perm=wa key=identity/) + } + its('LIST_RULES') { + should contain_match(/^exit,always watch=\/etc\/gshadow perm=wa key=identity/) + } + its('LIST_RULES') { + should contain_match(/^exit,always watch=\/etc\/shadow perm=wa key=identity/) + } + its('LIST_RULES') { + should contain_match(/^exit,always watch=\/etc\/security\/opasswd perm=wa key=identity/) + } + end + +where each test must declare one (or more) rules to be tested. + + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test if a rule contains a matching element that is identified by a regular expression + +For `audit` >= 2.3: + + describe auditd_rules do + its('lines') { should contain_match(%r{-w /etc/ssh/sshd_config/}) } + end + +For `audit` < 2.3: + + describe audit_daemon_rules do + its("LIST_RULES") { + should contain_match(/^exit,always arch=.*\ + key=time-change\ + syscall=adjtimex,settimeofday/) + } + end + + +### Query the audit daemon status + + describe auditd_rules.status('backlog') do + it { should cmp 0 } + end + +### Query properties of rules targeting specific syscalls or files + + describe auditd_rules.syscall('open').action do + it { should eq(['always']) } + end + + describe auditd_rules.key('sshd_config') do + its('permissions') { should contain_match(/x/) } + end + +Filters may be chained. For example: + + describe auditd_rules.syscall('open').action('always').list do + it { should eq(['exit']) } + end diff --git a/docs/resources/bash.md.erb b/docs/resources/bash.md.erb new file mode 100644 index 000000000..e8cba07e3 --- /dev/null +++ b/docs/resources/bash.md.erb @@ -0,0 +1,84 @@ +--- +title: About the bash Resource +--- + +# bash + +Use the `bash` InSpec audit resource to test an arbitrary command that is run on the system using a Bash script. + +## Syntax + +A `command` resource block declares a command to be run, one (or more) expected outputs, and the location to which that output is sent: + + describe bash('command') do + it { should exist } + its('matcher') { should eq 'output' } + end + +where + +* `'command'` must specify a command to be run +* `'matcher'` is one of `exit_status`, `stderr`, or `stdout` +* `'output'` tests the output of the command run on the system versus the output value stated in the test + +For example: + + describe bash('ls -al /') do + its('stdout') { should match /bin/ } + its('stderr') { should eq '' } + its('exit_status') { should eq 0 } + end + + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### exist + +The `exist` matcher tests if a command may be run on the system: + + it { should exist } + +### exit_status + +The `exit_status` matcher tests the exit status for the command: + + its('exit_status') { should eq 0 } + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +### stderr + +The `stderr` matcher tests results of the command as returned in standard error (stderr): + + its('stderr') { should eq '' } + +### stdout + +The `stdout` matcher tests results of the command as returned in standard output (stdout). + + its('stdout') { should match /bin/ } + + +## Examples + +None. diff --git a/docs/resources/bond.md.erb b/docs/resources/bond.md.erb new file mode 100644 index 000000000..1588fc78c --- /dev/null +++ b/docs/resources/bond.md.erb @@ -0,0 +1,97 @@ +--- +title: About the bond Resource +--- + +# bond + +Use the `bond` InSpec audit resource to test a logical, bonded network interface (i.e. "two or more network interfaces aggregated into a single, logical network interface"). On Linux platforms, any value in the `/proc/net/bonding` directory may be tested. + +## Syntax + +A `bond` resource block declares a bonded network interface, and then specifies the properties of that bonded network interface to be tested: + + describe bond('name') do + it { should exist } + end + +where + +* `'name'` is the name of the bonded network interface +* `{ should exist }` is a valid matcher for this resource + + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### content + +The `content` matcher tests if contents in the file that defines the bonded network interface match the value specified in the test. The values of the `content` matcher are arbitrary: + + its('content') { should match('value') } + +### eq + +<%= partial "/shared/matcher_eq" %> + +### exist + +The `exist` matcher tests if the bonded network interface is available: + + it { should exist } + +### have_interface + +The `have_interface` matcher tests if the bonded network interface has one (or more) secondary interfaces: + + it { should have_interface } + +### include + +<%= partial "/shared/matcher_include" %> + +### interfaces + +The `interfaces` matcher tests if the named secondary interfaces are available: + + its('interfaces') { should eq ['eth0', 'eth1', ...] } + +### match + +<%= partial "/shared/matcher_match" %> + +### params + +The `params` matcher tests arbitrary parameters for the bonded network interface: + + its('params') { should eq 'value' } + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test if eth0 is a secondary interface for bond0 + + describe bond('bond0') do + it { should exist } + it { should have_interface 'eth0' } + end + +### Test parameters for bond0 + + describe bond('bond0') do + its('Bonding Mode') { should eq 'IEEE 802.3ad Dynamic link aggregation' } + its('Transmit Hash Policy') { should eq 'layer3+4 (1)' } + its('MII Status') { should eq 'up' } + its('MII Polling Interval (ms)') { should eq '100' } + its('Up Delay (ms)') { should eq '0' } + its('Down Delay (ms)') { should eq '0' } + end diff --git a/docs/resources/bridge.md.erb b/docs/resources/bridge.md.erb new file mode 100644 index 000000000..11643b200 --- /dev/null +++ b/docs/resources/bridge.md.erb @@ -0,0 +1,67 @@ +--- +title: About the bridge Resource +--- + +# bridge + +Use the `bridge` InSpec audit resource to test basic network bridge properties, such as name, if an interface is defined, and the associations for any defined interface. + +* On Linux platforms, any value in the `/sys/class/net/{interface}/bridge` directory may be tested +* On the Windows platform, the `Get-NetAdapter` cmdlet is associated with the `Get-NetAdapterBinding` cmdlet and returns the `ComponentID ms_bridge` value as a JSON object + +## Syntax + +A `bridge` resource block declares the bridge to be tested and what interface it should be associated with: + + describe bridge('br0') do + it { should exist } + it { should have_interface 'eth0' } + end + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### exist + +The `exist` matcher tests if the network bridge is available: + + it { should exist } + +### have_interface + +The `have_interface` matcher tests if the named interface is defined for the network bridge: + + it { should have_interface 'eth0' } + +### include + +<%= partial "/shared/matcher_include" %> + +### interfaces + +The `interfaces` matcher tests if the named interface is present: + + its('interfaces') { should eq 'foo' } + its('interfaces') { should eq 'bar' } + its('interfaces') { should include('foo') } + +### match + +<%= partial "/shared/matcher_match" %> + +## Examples + +None. \ No newline at end of file diff --git a/docs/resources/bsd_service.md.erb b/docs/resources/bsd_service.md.erb new file mode 100644 index 000000000..9d9643021 --- /dev/null +++ b/docs/resources/bsd_service.md.erb @@ -0,0 +1,76 @@ +--- +title: About the bsd_service Resource +--- + +# bsd_service + +Use the `bsd_service` InSpec audit resource to test a service using a Berkeley OS-style `init` on the FreeBSD platform. + +## Syntax + +A `bsd_service` resource block declares the name of a service and then one (or more) matchers to test the state of the service: + + describe bsd_service('service_name') do + it { should be_installed } + it { should be_enabled } + it { should be_running } + end + +where + +* `('service_name')` must specify a service name +* `be_installed`, `be_enabled`, and `be_running` are valid matchers for this resource; all matchers available to the `service` resource may be used + +The path to the service manager's control may be specified for situations where the path isn't available in the current `PATH`. For example: + + describe bsd_service('service_name', '/path/to/control') do + it { should be_enabled } + it { should be_installed } + it { should be_running } + end + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### be_enabled + +The `be_enabled` matcher tests if the named service is enabled: + + it { should be_enabled } + +### be_installed + +The `be_installed` matcher tests if the named service is installed: + + it { should be_installed } + +### be_running + +The `be_running` matcher tests if the named service is running: + + it { should be_running } + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +## Examples + +None. diff --git a/docs/resources/command.md.erb b/docs/resources/command.md.erb new file mode 100644 index 000000000..bd3ad02d9 --- /dev/null +++ b/docs/resources/command.md.erb @@ -0,0 +1,151 @@ +--- +title: About the command Resource +--- + +# command + +Use the `command` InSpec audit resource to test an arbitrary command that is run on the system. + +## Syntax + +A `command` resource block declares a command to be run, one (or more) expected outputs, and the location to which that output is sent: + + describe command('command') do + it { should exist } + its('matcher') { should eq 'output' } + end + +where + +* `'command'` must specify a command to be run +* `'matcher'` is one of `exit_status`, `stderr`, or `stdout` +* `'output'` tests the output of the command run on the system versus the output value stated in the test + + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### exist + +The `exist` matcher tests if a command may be run on the system: + + it { should exist } + +### exit_status + +The `exit_status` matcher tests the exit status for the command: + + its('exit_status') { should eq 123 } + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +### stderr + +The `stderr` matcher tests results of the command as returned in standard error (stderr): + + its('stderr') { should eq 'error' } + +### stdout + +The `stdout` matcher tests results of the command as returned in standard output (stdout). The following example shows matching output using a regular expression: + + describe command('echo 1') do + its('stdout') { should match (/[0-9]/) } + end + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test for PostgreSQL database running a RC, development, or beta release + + describe command('psql -V') do + its('stdout') { should eq '/RC/' } + its('stdout') { should_not eq '/DEVEL/' } + its('stdout') { should_not eq '/BETA/' } + end + +### Test standard output (stdout) + + describe command('echo hello') do + its('stdout') { should eq 'hello\n' } + its('stderr') { should eq '' } + its('exit_status') { should eq 0 } + end + +### Test standard error (stderr) + + describe command('>&2 echo error') do + its('stdout') { should eq '' } + its('stderr') { should eq 'error\n' } + its('exit_status') { should eq 0 } + end + +### Test an exit status code + + describe command('exit 123') do + its('stdout') { should eq '' } + its('stderr') { should eq '' } + its('exit_status') { should eq 123 } + end + +### Test if the command shell exists + + describe command('/bin/sh').exist? do + it { should eq true } + end + +### Test for a command that should not exist + + describe command('this is not existing').exist? do + it { should eq false } + end + +### Verify NTP + +The following example shows how to use the `file` audit resource to verify if the `ntp.conf` and `leap-seconds` files are present, and then the `command` resource to verify if NTP is installed and running: + + describe file('/etc/ntp.conf') do + it { should be_file } + end + + describe file('/etc/ntp.leapseconds') do + it { should be_file } + end + + describe command('pgrep ntp') do + its('exit_status') { should eq 0 } + end + +### Verify WiX + +Wix includes serveral tools -- such as `candle` (preprocesses and compiles source files into object files), `light` (links and binds object files to an installer database), and `heat` (harvests files from various input formats). The following example uses a whitespace array and the `file` audit resource to verify if these three tools are present: + + %w( + candle.exe + heat.exe + light.exe + ).each do |utility| + describe file("C:/wix/##{utility}") do + it { should be_file } + end + end diff --git a/docs/resources/csv.md.erb b/docs/resources/csv.md.erb new file mode 100644 index 000000000..c8a3e8dc8 --- /dev/null +++ b/docs/resources/csv.md.erb @@ -0,0 +1,62 @@ +--- +title: About the csv Resource +--- + +# csv + +Use the `csv` InSpec audit resource to test configuration data in a CSV file. + +## Syntax + +A `csv` resource block declares the configuration data to be tested: + + describe csv('file') do + its('name') { should eq 'foo' } + end + +where + +* `'file'` is the path to a CSV file +* `name` is a configuration setting in a CSV file +* `should eq 'foo'` tests a value of `name` as read from a CSV file versus the value declared in the test + + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +### name + +The `name` matcher tests the value of `name` as read from a CSV file versus the value declared in the test: + + its('name') { should eq 'foo' } + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test a CSV file + + describe csv('some_file.csv') do + its('setting') { should eq 1 } + end diff --git a/docs/resources/directory.md.erb b/docs/resources/directory.md.erb new file mode 100644 index 000000000..79a3915ae --- /dev/null +++ b/docs/resources/directory.md.erb @@ -0,0 +1,43 @@ +--- +title: About the directory Resource +--- + +# directory + +Use the `directory` InSpec audit resource to test if the file type is a directory. This is equivalent to using the `file` resource and the `be_directory` matcher, but provides a simpler and more direct way to test directories. All of the matchers available to `file` may be used with `directory`. + +## Syntax + +A `directory` resource block declares the location of the directory to be tested, and then one (or more) matchers: + + describe directory('path') do + it { should MATCHER 'value' } + end + +## Matchers + +This resource may use any of the matchers available to the `file` resource that may be useful when testing a directory. + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +## Examples + +None. \ No newline at end of file diff --git a/docs/resources/etc_group.md.erb b/docs/resources/etc_group.md.erb new file mode 100644 index 000000000..10e9db00e --- /dev/null +++ b/docs/resources/etc_group.md.erb @@ -0,0 +1,116 @@ +--- +title: About the etc_group Resource +--- + +# etc_group + +Use the `etc_group` InSpec audit resource to test groups that are defined on Linux and Unix platforms. The `/etc/group` file stores details about each group---group name, password, group identifier, along with a comma-separate list of users that belong to the group. + +## Syntax + +A `etc_group` resource block declares a collection of properties to be tested: + + describe etc_group('path') do + its('matcher') { should eq 'some_value' } + end + +or: + + describe etc_group.where(item: 'value', item: 'value') do + its('gids') { should_not contain_duplicates } + its('groups') { should include 'user_name' } + its('users') { should include 'user_name' } + end + +where + +* `('path')` is the non-default path to the `inetd.conf` file +* `.where()` may specify a specific item and value, to which the matchers are compared +* `'gids'`, `'groups'`, and `'users'` are valid matchers for this resource + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### gids + +The `gids` matcher tests if the named group identifier is present or if it contains duplicates: + + its('gids') { should_not contain_duplicates } + +### groups + +The `groups` matcher tests all groups for the named user: + + its('groups') { should include 'my_group' } + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +### users + +The `users` matcher tests all groups for the named user: + + its('users') { should include 'my_user' } + +### where + +The `where` matcher allows the test to be focused to one (or more) specific items: + + etc_group.where(item: 'value', item: 'value') + +where `item` may be one (or more) of: + +* `name: 'name'` +* `group_name: 'group_name'` +* `password: 'password'` +* `gid: 'gid'` +* `group_id: 'gid'` +* `users: 'user_name'` +* `members: 'member_name'` + + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test group identifiers (GIDs) for duplicates + + describe etc_group do + its('gids') { should_not contain_duplicates } + end + +### Test all groups to see if a specific user belongs to one (or more) groups + + describe etc_group do + its('groups') { should include 'my_group' } + end + +### Test all groups for a specific user name + + describe etc_group do + its('users') { should include 'my_user' } + end + +### Filter a list of groups for a specific user + + describe etc_group.where(name: 'my_group') do + its('users') { should include 'my_user' } + end diff --git a/docs/resources/etc_passwd.md.erb b/docs/resources/etc_passwd.md.erb new file mode 100644 index 000000000..62ad3b4e2 --- /dev/null +++ b/docs/resources/etc_passwd.md.erb @@ -0,0 +1,155 @@ +--- +title: About the passwd Resource +--- + +# passwd + +Use the `passwd` InSpec audit resource to test the contents of `/etc/passwd`, which contains the following information for users that may log into the system and/or as users that own running processes. The format for `/etc/passwd` includes: + +* A username +* The password for that user (on newer systems passwords should be stored in `/etc/shadow` ) +* The user identifier (UID) assigned to that user +* The group identifier (GID) assigned to that user +* Additional information about that user +* That user's home directory +* That user's default command shell + +These entries are defined as a colon-delimited row in the file, one row per user: + + root:x:1234:5678:additional_info:/home/dir/:/bin/bash + +## Syntax + +A `passwd` resource block declares one (or more) users and associated user information to be tested: + + describe passwd do + its('users') { should_not include 'forbidden_user' } + end + + describe passwd.uid(filter) do + its('users') { should cmp 'root' } + its('count') { should eq 1 } + end + +where + +* `homes`, `gids`, `passwords`, `shells`, `uids`, and `users` are valid accessors for `passwd` +* `filter` one (or more) arguments, for example: `passwd.users(/name/)` used to define filtering +* `filter` may take any of the following arguments: `count` (retrieves the number of entries), `lines` (provides raw `passwd` lines), and `params` (returns an array of maps for all entries) + + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### gids + +The `gids` matcher tests if the group indentifiers in the test match group identifiers in `/etc/passwd`: + + its('gids') { should include 1234 } + its('gids') { should cmp 0 } + +### homes + +The `homes` matcher tests the absolute path to a user's home directory: + + its('home') { should eq '/' } + +### include + +<%= partial "/shared/matcher_include" %> + +### length + +The `length` matcher tests the length of a password that appears in `/etc/passwd`: + + its('length') { should be <= 32 } + +This matcher is best used in conjunction with filters. For example: + + describe passwd.users('highlander') do + its('length') { should_not be < 16 } + end + +### match + +<%= partial "/shared/matcher_match" %> + +### passwords + +The `passwords` matcher tests if passwords are + +* Encrypted +* Have direct logins disabled, as indicated by an asterisk (`*`) +* In the `/etc/shadow` file, as indicated by the letter x (`x`) + +For example: + + its('passwords') { should eq ['x'] } + its('passwords') { should cmp '*' } + +### shells + +The `shells` matcher tests the absolute path of a shell (or command) to which a user has access: + + its('shells') { should_not include 'user' } + +or to find all users with the nologin shell: + + describe passwd.shells(/nologin/) do + its('users') { should_not include 'my_login_user' } + end + +### uids + +The `uids` matcher tests if the user indentifiers in the test match user identifiers in `/etc/passwd`: + + its('uids') { should eq ['1234', '1235'] } + +or: + + describe passwd.uids(0) do + its('users') { should cmp 'root' } + its('count') { should eq 1 } + end + +### users + +The `users` matcher tests if the user names in the test match user names in `/etc/passwd`: + + its('users') { should eq ['root', 'www-data'] } + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test usernames and UIDs + + describe passwd do + its('users') { should eq ['root', 'www-data'] } + its('uids') { should eq [0, 33] } + end + +### Select one user and test for multiple occurrences + + describe passwd.uids(0) do + its('users') { should cmp 'root' } + its('count') { should eq 1 } + end + + describe passwd.filter(user: 'www-data') do + its('uids') { should cmp 33 } + its('count') { should eq 1 } + end diff --git a/docs/resources/etc_shadow.md.erb b/docs/resources/etc_shadow.md.erb new file mode 100644 index 000000000..3565fd2c6 --- /dev/null +++ b/docs/resources/etc_shadow.md.erb @@ -0,0 +1,149 @@ +--- +title: About the shadow Resource +--- + +# shadow + +Use the `shadow` InSpec audit resource to test the contents of `/etc/shadow`, which contains password details that are only readable by the `root` user. The format for `/etc/shadow` includes: + +* A username +* The password for that user (on newer systems passwords should be stored in `/etc/shadow` ) +* The last time a password was changed +* The minimum number of days a password must exist, before it may be changed +* The maximum number of days after which a password must be changed +* The number of days a user is warned about an expiring password +* The number of days a user must be inactive before the user account is disabled +* The number of days a user account has been disabled + +These entries are defined as a colon-delimited row in the file, one row per user: + + dannos:Gb7crrO5CDF.:10063:0:99999:7::: + +## Syntax + +A `shadow` resource block declares one (or more) users and associated user information to be tested: + + describe shadow do + its('users') { should_not include 'forbidden_user' } + end + +or with a filter: + + describe shadow.uid(filter) do + its('users') { should cmp 'root' } + its('count') { should eq 1 } + end + +where + +* `homes`, `gids`, `passwords`, `shells`, `uids`, and `users` are valid accessors for `passwd` +* `filter` one (or more) arguments, for example: `passwd.users(/name/)` used to define filtering; `filter` may take any of the following arguments: `count` (retrieves the number of entries), `lines` (provides raw `passwd` lines), and `params` (returns an array of maps for all entries) + + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### count + +The `count` matcher tests the number of times the named user appears in `/etc/shadow`: + + its('count') { should eq 1 } + +TThis matcher is best used in conjunction with filters. For example: + + describe shadow.users('dannos') do + its('count') { should eq 1 } + end + +### eq + +<%= partial "/shared/matcher_eq" %> + +### expiry_dates + +The `expiry_dates` matcher tests the number of days a user account has been disabled: + + its('expiry_dates') { should eq '' } + +### inactive_days + +The `inactive_days` matcher tests the number of days a user must be inactive before the user account is disabled: + + its('inactive_days') { should eq '' } + +### include + +<%= partial "/shared/matcher_include" %> + +### last_changes + +The `last_changes` matcher tests the last time a password was changed: + + its('last_changes') { should eq '' } + +### match + +<%= partial "/shared/matcher_match" %> + +### max_days + +The `max_days` matcher tests the maximum number of days after which a password must be changed: + + its('max_days') { should eq 90 } + +### min_days + +The `min_days` matcher tests the minimum number of days a password must exist, before it may be changed: + + its('min_days') { should eq 0 } + +### passwords + +The `passwords` matcher tests if passwords are + +* Encrypted +* Have direct logins disabled, as indicated by an asterisk (`*`) +* In the `/etc/shadow` file, as indicated by the letter x (`x`) + +For example: + + its('passwords') { should eq ['x'] } + its('passwords') { should cmp '*' } + +### users + +The `users` matcher tests if the user name exists `/etc/shadow`: + + its('users') { should eq 'root' } + +### warn_days + +The `warn_days` matcher tests the number of days a user is warned about an expiring password: + + its('warn_days') { should eq 7 } + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test for a forbidden user + + describe shadow do + its('users') { should_not include 'forbidden_user' } + end + +### Test that a user appears one time + + describe shadow.users('bin') do + its('passwords') { should cmp 'x' } + its('count') { should eq 1 } + end diff --git a/docs/resources/file.md.erb b/docs/resources/file.md.erb new file mode 100644 index 000000000..a2f7836ed --- /dev/null +++ b/docs/resources/file.md.erb @@ -0,0 +1,460 @@ +--- +title: About the file Resource +--- + +# file + +Use the `file` InSpec audit resource to test all system file types, including files, directories, symbolic links, named pipes, sockets, character devices, block devices, and doors. + +## Syntax + +A `file` resource block declares the location of the file type to be tested, what type that file should be (if required), and then one (or more) matchers: + + describe file('path') do + it { should MATCHER 'value' } + end + +where + +* `('path')` is the name of the file and/or the path to the file +* `MATCHER` is a valid matcher for this resource +* `'value'` is the value to be tested + + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### be\_block\_device + +The `be_block_device` matcher tests if the file exists as a block device, such as `/dev/disk0` or `/dev/disk0s9`: + + it { should be_block_device } + +### be\_character\_device + +The `be_character_device` matcher tests if the file exists as a character device (that corresponds to a block device), such as `/dev/rdisk0` or `/dev/rdisk0s9`: + + it { should be_character_device } + +### be_directory + +The `be_directory` matcher tests if the file exists as a directory, such as `/etc/passwd`, `/etc/shadow`, or `/var/log/httpd`: + + it { should be_directory } + +### be_executable + +The `be_executable` matcher tests if the file exists as an executable: + + it { should be_executable } + +The `be_executable` matcher may also test if the file is executable by a specific owner, group, or user. For example, a group: + + it { should be_executable.by('group') } + +an owner: + + it { should be_executable.by('owner') } + +a user: + + it { should be_executable.by_user('user') } + +### be_file + +The `be_file` matcher tests if the file exists as a file. This can be useful with configuration files like `/etc/passwd` where there typically is not an associated file extension---`passwd.txt`: + + it { should be_file } + +### be\_grouped\_into + +The `be_grouped_into` matcher tests if the file exists as part of the named group: + + it { should be_grouped_into 'group' } + +### be_immutable + +The `be_immutable` matcher tests if the file is immutable, i.e. "cannot be changed": + + it { should be_immutable } + +### be\_linked\_to + +The `be_linked_to` matcher tests if the file is linked to the named target: + + it { should be_linked_to '/etc/target-file' } + +### be_mounted + +The `be_mounted` matcher tests if the file is accessible from the file system: + + it { should be_mounted } + +### be\_owned\_by + +The `be_owned_by` matcher tests if the file is owned by the named user, such as `root`: + + it { should be_owned_by 'root' } + +### be_pipe + +The `be_pipe` matcher tests if the file exists as first-in, first-out special file (`.fifo`) that is typically used to define a named pipe, such as `/var/log/nginx/access.log.fifo`: + + it { should be_pipe } + +### be_readable + +The `be_readable` matcher tests if the file is readable: + + it { should be_readable } + +The `be_readable` matcher may also test if the file is readable by a specific owner, group, or user. For example, a group: + + it { should be_readable.by('group') } + +an owner: + + it { should be_readable.by('owner') } + +a user: + + it { should be_readable.by_user('user') } + +### be_socket + +The `be_socket` matcher tests if the file exists as socket (`.sock`), such as `/var/run/php-fpm.sock`: + + it { should be_socket } + +### be_symlink + +The `be_symlink` matcher tests if the file exists as a symbolic, or soft link that contains an absolute or relative path reference to another file: + + it { should be_symlink } + +### be_version + +The `be_version` matcher tests the version of the file: + + it { should be_version '1.2.3' } + +### be_writable + +The `be_writable` matcher tests if the file is writable: + + it { should be_writable } + +The `be_writable` matcher may also test if the file is writable by a specific owner, group, or user. For example, a group: + + it { should be_writable.by('group') } + +an owner: + + it { should be_writable.by('owner') } + +a user: + + it { should be_writable.by_user('user') } + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### content + +The `content` matcher tests if contents in the file match the value specified in a regular expression. The values of the `content` matcher are arbitrary and depend on the file type being tested and also the type of information that is expected to be in that file: + + its('content') { should match REGEX } + +The following complete example tests the `pg_hba.conf` file in PostgreSQL for MD5 requirements. The tests look at all `host` and `local` settings in that file, and then compare the MD5 checksums against the values in the test: + + describe file(hba_config_file) do + its('content') { should match(%r{local\s.*?all\s.*?all\s.*?md5}) } + its('content') { should match(%r{host\s.*?all\s.*?all\s.*?127.0.0.1\/32\s.*?md5}) } + its('content') { should match(%r{host\s.*?all\s.*?all\s.*?::1\/128\s.*?md5}) + end + +### eq + +<%= partial "/shared/matcher_eq" %> + +### exist + +The `exist` matcher tests if the named file exists: + + it { should exist } + +### file_version + +The `file_version` matcher tests if the file's version matches the specified value. The difference between a file's "file version" and "product version" is that the file version is the version number of the file itself, whereas the product version is the version number associated with the application from which that file originates: + + its('file_version') { should eq '1.2.3' } + +### group + +The `group` matcher tests if the group to which a file belongs matches the specified value: + + its('group') { should eq 'admins' } + +### have_mode + +The `have_mode` matcher tests if a file has a mode assigned to it: + + it { should have_mode } + +### include + +<%= partial "/shared/matcher_include" %> + +### link_path + +The `link_path` matcher tests if the file exists at the specified path: + + its('link_path') { should eq '/some/path/to/file' } + +### link_target + +The `link_target` matcher tests if a file that is linked to this file exists at the specified path: + + its('link_target') { should eq '/some/path/to/file' } + +### match + +<%= partial "/shared/matcher_match" %> + +### md5sum + +The `md5sum` matcher tests if the MD5 checksum for a file matches the specified value: + + its('md5sum') { should eq '3329x3hf9130gjs9jlasf2305mx91s4j' } + +### mode + +The `mode` matcher tests if the mode assigned to the file matches the specified value: + + its('mode') { should cmp '0644' } + +### mtime + +The `mtime` matcher tests if the file modification time for the file matches the specified value: + + its('mtime') { should eq 'October 31 2015 12:10:45' } + +or: + + describe file('/').mtime.to_i do + it { should <= Time.now.to_i } + it { should >= Time.now.to_i - 1000} + end + +### owner + +The `owner` matcher tests if the owner of the file matches the specified value: + + its('owner') { should eq 'root' } + +### product_version + +The `product_version` matcher tests if the file's product version matches the specified value. The difference between a file's "file version" and "product version" is that the file version is the version number of the file itself, whereas the product version is the version number associated with the application from which that file originates: + + its('product_version') { should eq 2.3.4 } + +### selinux_label + +The `selinux_label` matcher tests if the SELinux label for a file matches the specified value: + + its('selinux_label') { should eq 'system_u:system_r:httpd_t:s0' } + +### sha256sum + +The `sha256sum` matcher tests if the SHA-256 checksum for a file matches the specified value: + + its('sha256sum') { should eq 'b837ch38lh19bb8eaopl8jvxwd2e4g58jn9lkho1w3ed9jbkeicalplaad9k0pjn' } + +### size + +The `size` matcher tests if a file's size matches, is greater than, or is less than the specified value. For example, equal: + + its('size') { should eq 32375 } + +Greater than: + + its('size') { should > 64 } + +Less than: + + its('size') { should < 10240 } + +### type + +The `type` matcher tests if the first letter of the file's mode string contains one of the following characters: + +* `-` or `f` (the file is a file); use `'file` to test for this file type +* `d` (the file is a directory); use `'directory` to test for this file type +* `l` (the file is a symbolic link); use `'link` to test for this file type +* `p` (the file is a named pipe); use `'pipe` to test for this file type +* `s` (the file is a socket); use `'socket` to test for this file type +* `c` (the file is a character device); use `'character` to test for this file type +* `b` (the file is a block device); use `'block` to test for this file type +* `D` (the file is a door); use `'door` to test for this file type + +For example: + + its('type') { should eq 'file' } + +or: + + its('type') { should eq 'socket' } + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test the contents of a file for MD5 requirements + + describe file(hba_config_file) do + its('content') { should match /local\s.*?all\s.*?all\s.*?md5/ } + its('content') { should match %r{/host\s.*?all\s.*?all\s.*?127.0.0.1\/32\s.*?md5/} } + its('content') { should match %r{/host\s.*?all\s.*?all\s.*?::1\/128\s.*?md5/} } + end + +### Test if a file exists + + describe file('/tmp') do + it { should exist } + end + +### Test that a file does not exist + + describe file('/tmpest') do + it { should_not exist } + end + +### Test if a path is a directory + + describe file('/tmp') do + its('type') { should eq :directory } + it { should be_directory } + end + +### Test if a path is a file and not a directory + + describe file('/proc/version') do + its('type') { should eq 'file' } + it { should be_file } + it { should_not be_directory } + end + +### Test if a file is a symbolic link + + describe file('/dev/stdout') do + its('type') { should eq 'symlink' } + it { should be_symlink } + it { should_not be_file } + it { should_not be_directory } + end + +### Test if a file is a character device + + describe file('/dev/zero') do + its('type') { should eq 'character' } + it { should be_character_device } + it { should_not be_file } + it { should_not be_directory } + end + +### Test if a file is a block device + + describe file('/dev/zero') do + its('type') { should eq 'block' } + it { should be_character_device } + it { should_not be_file } + it { should_not be_directory } + end + +### Test the mode for a file + + describe file('/dev') do + its('mode') { should cmp '00755' } + end + +### Test the owner of a file + + describe file('/root') do + its('owner') { should eq 'root' } + end + +### Test if a file is owned by the root user + + describe file('/dev') do + it { should be_owned_by 'root' } + end + +### Test the mtime for a file + + describe file('/').mtime.to_i do + it { should <= Time.now.to_i } + it { should >= Time.now.to_i - 1000} + end + +### Test that a file's size is between 64 and 10240 + + describe file('/') do + its('size') { should be > 64 } + its('size') { should be < 10240 } + end + +### Test that a file's size is zero + + describe file('/proc/cpuinfo') do + its('size') { should be 0 } + end + +### Test that a file is not mounted + + describe file('/proc/cpuinfo') do + it { should_not be_mounted } + end + +### Test an MD5 checksum + + require 'digest' + cpuinfo = file('/proc/cpuinfo').content + + md5sum = Digest::MD5.hexdigest(cpuinfo) + + describe file('/proc/cpuinfo') do + its('md5sum') { should eq md5sum } + end + +### Test an SHA-256 checksum + + require 'digest' + cpuinfo = file('/proc/cpuinfo').content + + sha256sum = Digest::SHA256.hexdigest(cpuinfo) + + describe file('/proc/cpuinfo') do + its('sha256sum') { should eq sha256sum } + end + +### Verify NTP + +The following example shows how to use the `file` audit resource to verify if the `ntp.conf` and `leap-seconds` files are present, and then the `command` resource to verify if NTP is installed and running: + + describe file('/etc/ntp.conf') do + it { should be_file } + end + + describe file('/etc/ntp.leapseconds') do + it { should be_file } + end + + describe command('pgrep ntp') do + its('exit_status') { should eq 0 } + end diff --git a/docs/resources/gem.md.erb b/docs/resources/gem.md.erb new file mode 100644 index 000000000..22ab51fed --- /dev/null +++ b/docs/resources/gem.md.erb @@ -0,0 +1,73 @@ +--- +title: About the gem Resource +--- + +# gem + +Use the `gem` InSpec audit resource to test if a global Gem package is installed. + +## Syntax + +A `gem` resource block declares a package and (optionally) a package version: + + describe gem('gem_package_name') do + it { should be_installed } + end + +where + +* `('gem_package_name')` must specify a Gem package, such as `'rubocop'` +* `be_installed` is a valid matcher for this resource + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### be_installed + +The `be_installed` matcher tests if the named Gem package is installed: + + it { should be_installed } + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +### version + +The `version` matcher tests if the named package version is on the system: + + its('version') { should eq '0.33.0' } + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Verify that a gem package is installed, with a specific version + + describe gem('rubocop') do + it { should be_installed } + its('version') { should eq '0.33.0' } + end + +### Verify that a gem package is not installed + + describe gem('rubocop') do + it { should_not be_installed } + end diff --git a/docs/resources/group.md.erb b/docs/resources/group.md.erb new file mode 100644 index 000000000..bdddc091f --- /dev/null +++ b/docs/resources/group.md.erb @@ -0,0 +1,74 @@ +--- +title: About the group Resource +--- + +# group + +Use the `group` InSpec audit resource to test groups on the system. + +## Syntax + +A `group` resource block declares a group, and then the details to be tested, such as if the group is a local group, the group identifier, or if the group exists: + + describe group('group_name') do + it { should exist } + its('gid') { should eq 0 } + end + +where + +* `'group_name'` must specify the name of a group on the system +* `exist` and `'gid'` are valid matchers for this resource + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### be_local + +The `be_local` matcher tests if the group is a local group: + + it { should be_local } + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### exist + +The `exist` matcher tests if the named user exists: + + it { should exist } + +### gid + +The `gid` matcher tests the named group identifier: + + its('gid') { should eq 1234 } + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test the group identifier for the root group + + describe group('root') do + it { should exist } + its('gid') { should eq 0 } + end diff --git a/docs/resources/grub_conf.md.erb b/docs/resources/grub_conf.md.erb new file mode 100644 index 000000000..120de0bfe --- /dev/null +++ b/docs/resources/grub_conf.md.erb @@ -0,0 +1,115 @@ +--- +title: About the grub_conf Resource +--- + +# grub_conf + +Grub is a boot loader on the Linux platform used to load and then transfer control to an operating system kernel, after which that kernel initializes the rest of the operating system. Use the `grub_conf` InSpec audit resource to test boot loader configuration settings that are defined in the `grub.conf` configuration file. + +## Syntax + +A `grub_conf` resource block declares a list of settings in a `grub.conf` file: + + describe grub_conf('path', 'kernel') do + its('setting') { should eq 'value' } + end + +or: + + describe grub_conf('path') do + its('default') { should eq '0' } # + its('setting') { should eq 'value' } + end + +where + +* `'service_name'` is a service listed in the `grub.conf` file +* `'path'` is the path to the `grub.conf` file +* `'kernel'` specifies the default kernel (by using `'default'`) or a specific kernel; `'default'` defines the position in the list of kernels at which the default kernel is defined, i.e. `should eq '0'` for the first kernel listed or `'path', 'default'` to use the default kernel as specified in the `grub.conf` file +* `'value'` is the value that is expected + + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test a grub.conf file + +A Grub configuration file located at `/etc/grub.conf` is similar to the following: + + # grub.conf generated by anaconda + # + # Note that you do not have to rerun grub after making changes to this file + # NOTICE: You have a /boot partition. This means that + # all kernel and initrd paths are relative to /boot/, eg. + # root (hd0,0) + # kernel /vmlinuz-version ro root=/dev/hda6 + # initrd /initrd-version.img + #boot=/dev/hda + default=0 + timeout=10 + splashimage=(hd0,0)/grub/splash.xpm.gz + title Red Hat Enterprise Linux ES (2.6.32-573.7.1.el6.x86_64) + root (hd0,0) + kernel /vmlinuz-2.6.32-573.7.1.el6.x86_64 ro root=/dev/hda6 + initrd /initrd-2.6.32-573.7.1.el6.x86_64.img + title Red Hat Enterprise Linux ES (2.6.32-358.14.1.el6.x86_64) + root (hd0,0) + kernel /vmlinuz-2.6.32-358.14.1.el6.x86_64 ro root=/dev/hda6 ramdisk_size=400000 + initrd /initrd-2.6.32-358.14.1.el6.x86_64.img + +This file defines two versions of RedHat Enterprise Linux, with version `2.6.32-573.7.1.el6.x86_64` specified as the default. + +The following test verifies the kernel, ensures that kernel is the default kernel, its initial RAM disk (`initrd`), and the timeout: + + describe grub_conf('/etc/grub.conf', 'default') do + its('kernel') { should include '/vmlinuz-2.6.32-573.7.1.el6.x86_64' } + its('initrd') { should include '/initrd-2.6.32-573.7.1.el6.x86_64.img' } + its('default') { should_not eq '1' } + its('timeout') { should eq '10' } + end + +The following test verifies the `ramdisk_size` for the non-deault kernel: + + describe grub_conf('/etc/grub.conf', 'Red Hat Enterprise Linux ES (2.6.32-358.14.1.el6.x86_64)') do + its('kernel') { should include 'ramdisk_size=400000' } + end + +### Test a configuration file and boot configuration + + describe grub_conf('/etc/grub.conf', 'default') do + its('kernel') { should include '/vmlinuz-2.6.32-573.7.1.el6.x86_64' } + its('initrd') { should include '/initramfs-2.6.32-573.el6.x86_64.img=1' } + its('default') { should_not eq '1' } + its('timeout') { should eq '5' } + end + +### Test a specific kernel + + grub_conf('/etc/grub.conf', 'CentOS (2.6.32-573.12.1.el6.x86_64)') do + its('kernel') { should include 'audit=1' } + end diff --git a/docs/resources/host.md.erb b/docs/resources/host.md.erb new file mode 100644 index 000000000..c47e1cedd --- /dev/null +++ b/docs/resources/host.md.erb @@ -0,0 +1,85 @@ +--- +title: About the host Resource +--- + +# host + +Use the `host` InSpec audit resource to test the name used to refer to a specific host and its availability, including the Internet protocols and ports over which that host name should be available. + +## Syntax + +A `host` resource block declares a host name, and then (depending on what is to be tested) a port and/or a protocol: + +.. code-block:: ruby + + describe host('example.com', port: 80, proto: 'tcp') do + it { should be_reachable } + end + +where + +* `host()` must specify a host name and may specify a port number and/or a protocol +* `'example.com'` is the host name +* `port:` is the port number +* `proto: 'name'` is the Internet protocol: TCP (`proto: 'tcp'`), UDP (`proto: 'udp'` or ICMP (`proto: 'icmp'`)) +* `be_reachable` is a valid matcher for this resource + + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### be_reachable + +The `be_reachable` matcher tests if the host name is available: + + it { should be_reachable } + +### be_resolvable + +The `be_resolvable` matcher tests for host name resolution, i.e. "resolvable to an IP address": + + it { should be_resolvable } + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### ipaddress + +The `ipaddress` matcher tests if a host name is resolvable to a specific IP address: + + its('ipaddress') { should include '93.184.216.34' } + +### match + +<%= partial "/shared/matcher_match" %> + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Verify host name is reachable over a specific protocol and port number + + describe host('example.com', port: 53, proto: 'udp') do + it { should be_reachable } + end + +### Verify that a specific IP address can be resolved + + describe host('example.com', port: 80, proto: 'tcp') do + it { should be_resolvable } + its('ipaddress') { should include '192.168.1.1' } + end diff --git a/docs/resources/iis_site.md.erb b/docs/resources/iis_site.md.erb new file mode 100644 index 000000000..5f28ed6ab --- /dev/null +++ b/docs/resources/iis_site.md.erb @@ -0,0 +1,142 @@ +--- +title: About the iis_site Resource +--- + +# iis_site + +Use the `iis_site` InSpec audit resource to test the state of IIS on Windows Server 2012 (and later). + +## Syntax + +An `iis_site` resource block declares details about the named site: + + describe iis_site('site_name') do + it { should exist } + it { should be_running } + it { should have_app_pool('app_pool_name') } + it { should have_binding('binding_details') } + it { should have_path('path_to_site') } + end + +where + +* `'site_name'` is the name of the site, such as `'Default Web Site'` +* `('app_pool_name')` is the name of the application pool in which the site's root application is run, such as `'DefaultAppPool'` +* `('binding_details')` is a binding for the site, such as `'net.pipe *'`. A site may have multiple bindings; therefore, use a `have_binding` matcher for each site binding to be tested +* `('path_to_site')` is the path to the site, such as `'C:\\inetpub\\wwwroot'` + +For example: + + describe iis_site('Default Web Site') do + it { should exist } + it { should be_running } + it { should have_app_pool('DefaultAppPool') } + it { should have_binding('https :443:www.contoso.com sslFlags=0') } + it { should have_binding('net.pipe *') } + it { should have_path('C:\\inetpub\\wwwroot') } + end + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### be_running + +The `be_running` matcher tests if the site is running: + + it { should be_running } + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### exist + +The `exist` matcher tests if the site exists: + + it { should exist } + +### have\_app\_pool + +The `have_app_pool` matcher tests if the named application pool exists for the site: + + it { should have_app_pool('DefaultAppPool') } + +For example, testing if a site's application pool inherits the settings of the parent application pool: + + it { should have_app_pool('/') } + +### have_binding + +The `have_binding` matcher tests if the specified binding exists for the site: + + it { should have_binding('http :80:*') } + +or: + + it { should have_binding('net.pipe *') } + +A site may have multiple bindings; use a `have_binding` matcher for each unique site binding to be tested. + +##### Binding Attributes + +The `have_binding` matcher can also test attributes that are defined for a site binding. For example, the `sslFlags` attribute defines if SSL is enabled, and (when enabled) what level of SSL is applied to the site. + +Testing a site with SSL disabled: + + it { should have_binding('https :443:www.contoso.com sslFlags=0') } + +Testing a site with SSL enabled: + + it { should have_binding('https :443:www.contoso.com sslFlags=Ssl') } + +Testing a site with certificate mapping authentication enabled: + + it { should have_binding('https :443:www.contoso.com sslFlags=SslMapCert') } + +Testing a site with 128-bit SSL enabled: + + it { should have_binding('https :443:www.contoso.com sslFlags=Ssl128') } + +### have_path + +The `have_path` matcher tests if the named path is defined for the site: + + it { should have_path('C:\\inetpub\\wwwroot') } + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test a default IIS site + + describe iis_site('Default Web Site') do + it { should exist } + it { should be_running } + it { should have_app_pool('DefaultAppPool') } + it { should have_binding('http *:80:') } + it { should have_path('%SystemDrive%\\inetpub\\wwwroot\\') } + end + +### Test if IIS service is running + + describe service('W3SVC') do + it { should be_installed } + it { should be_running } + end diff --git a/docs/resources/inetd_conf.md.erb b/docs/resources/inetd_conf.md.erb new file mode 100644 index 000000000..da8662741 --- /dev/null +++ b/docs/resources/inetd_conf.md.erb @@ -0,0 +1,99 @@ +--- +title: About the inetd_conf Resource +--- + +# inetd_conf + +Use the `inetd_conf` InSpec audit resource to test if a service is listed in the `inetd.conf` file on Linux and Unix platforms. inetd---the Internet service daemon---listens on dedicated ports, and then loads the appropriate program based on a request. The `inetd.conf` file is typically located at `/etc/inetd.conf` and contains a list of Internet services associated to the ports on which that service will listen. Only enabled services may handle a request; only services that are required by the system should be enabled.` + +## Syntax + +An `inetd_conf` resource block declares the list of services that are enabled in the `inetd.conf` file: + + describe inetd_conf('path') do + its('service_name') { should eq 'value' } + end + +where + +* `'service_name'` is a service listed in the `inetd.conf` file +* `('path')` is the non-default path to the `inetd.conf` file +* `should eq 'value'` is the value that is expected + + +## Matchers + +This resource matches any service that is listed in the `inetd.conf` file. You may want to ensure that specific services do not listen via `inetd.conf`: + + its('shell') { should eq nil } + +or: + + its('netstat') { should eq nil } + +or: + + its('systat') { should eq nil } + +For example: + + describe inetd_conf do + its('shell') { should eq nil } + its('login') { should eq nil } + its('exec') { should eq nil } + end + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Verify that FTP is disabled + +The contents if the `inetd.conf` file contain the following: + + #ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -a + #telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd + +and the following test is defined: + + describe inetd_conf do + its('ftp') { should eq nil } + its('telnet') { should eq nil } + end + +Because both the `ftp` and `telnet` Internet services are commented out (`#`), both services are disabled. Consequently, both tests will return `true`. However, if the `inetd.conf` file is set as follows: + + ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -a + #telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd + +then the same test will return `false` for `ftp` and the entire test will fail. + +### Test if telnet is installed + + describe package('telnetd') do + it { should_not be_installed } + end + + describe inetd_conf do + its('telnet') { should eq nil } + end diff --git a/docs/resources/ini.md.erb b/docs/resources/ini.md.erb new file mode 100644 index 000000000..64f086f85 --- /dev/null +++ b/docs/resources/ini.md.erb @@ -0,0 +1,69 @@ +--- +title: About the ini Resource +--- + +# ini + +Use the `ini` InSpec audit resource to test settings in an INI file. + +## Syntax + +An `ini` resource block declares the configuration settings to be tested: + + describe ini('path') do + its('setting_name') { should eq 'value' } + end + +where + +* `'setting_name'` is a synchronization setting defined in the INI file +* `('path')` is the path to the INI file +* `{ should eq 'value' }` is the value that is expected + +For example: + + describe ini('path/to/ini_file.ini') do + its('port') { should eq '143' } + its('server') { should eq '192.0.2.62' } + end + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test SMTP settings in a PHP INI file + +For example, a PHP INI file located at contains the following settings: + + ; SMTP = smtp.gmail.com + ; smtp_port = 465 + +and can be tested like this: + + describe ini(/etc/php5/apache2/php.ini) do + its('smtp_port') { should eq('465') } + end diff --git a/docs/resources/interface.md.erb b/docs/resources/interface.md.erb new file mode 100644 index 000000000..bbf346b49 --- /dev/null +++ b/docs/resources/interface.md.erb @@ -0,0 +1,66 @@ +--- +title: About the interface Resource +--- + +# interface + +Use the `interface` InSpec audit resource to test basic network adapter properties, such as name, status, state, address, and link speed (in MB/sec). + +* On Linux platforms, `/sys/class/net/#{iface}` is used as source +* On the Windows platform, the `Get-NetAdapter` cmdlet is used as source + +## Syntax + +An `interface` resource block declares network interface properties to be tested: + + describe interface do + it { should be_up } + its('speed') { should eq 1000 } + its('name') { should eq eth0 } + end + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### be_up + +The `be_up` matcher tests if the network interface is available: + + it { should be_up } + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +### name + +The `name` matcher tests if the named network interface exists: + + its('name') { should eq eth0 } + +### speed + +The `speed` matcher tests the speed of the network interface, in MB/sec: + + its('speed') { should eq 1000 } + +## Examples + +None. \ No newline at end of file diff --git a/docs/resources/iptables.md.erb b/docs/resources/iptables.md.erb new file mode 100644 index 000000000..fcbeeb498 --- /dev/null +++ b/docs/resources/iptables.md.erb @@ -0,0 +1,70 @@ +--- +title: About the iptables Resource +--- + +# iptables + +Use the `iptables` InSpec audit resource to test rules that are defined in `iptables`, which maintains tables of IP packet filtering rules. There may be more than one table. Each table contains one (or more) chains (both built-in and custom). A chain is a list of rules that match packets. When the rule matches, the rule defines what target to assign to the packet. + +## Syntax + +A `iptables` resource block declares tests for rules in IP tables: + + describe iptables(rule:'name', table:'name', chain: 'name') do + it { should have_rule('RULE') } + end + +where + +* `iptables()` may specify any combination of `rule`, `table`, or `chain` +* `rule:'name'` is the name of a rule that matches a set of packets +* `table:'name'` is the packet matching table against which the test is run +* `chain: 'name'` is the name of a user-defined chain or one of `ACCEPT`, `DROP`, `QUEUE`, or `RETURN` +* `have_rule('RULE')` tests that rule in the iptables file + + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### have_rule + +The `have_rule` matcher tests the named rule against the information in the `iptables` file: + + it { should have_rule('RULE') } + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test if the IP table allows a packet through + + describe iptables do + it { should have_rule('-P INPUT ACCEPT') } + end + +### Test if the IP table allows a packet through, for a specific table and chain + + describe iptables(table:'mangle', chain: 'input') do + it { should have_rule('-P INPUT ACCEPT') } + end diff --git a/docs/resources/json.md.erb b/docs/resources/json.md.erb new file mode 100644 index 000000000..38a0325cd --- /dev/null +++ b/docs/resources/json.md.erb @@ -0,0 +1,76 @@ +--- +title: About the json Resource +--- + +# json + +Use the `json` InSpec audit resource to test data in a JSON file. + +## Syntax + +A `json` resource block declares the data to be tested. Assume the following JSON file: + + { + "name" : "hello", + "meta" : { + "creator" : "John Doe" + }, + "array": [ + "zero", + "one" + ] + } + +This file can be queried using: + + describe json('/paht/to/name.json') do + its('name') { should eq 'hello' } + its(['meta','creator']) { should eq 'John Doe' } + its(['array', 1]) { should eq 'one' } + end + +where + +* `name` is a configuration setting in a JSON file +* `should eq 'foo'` tests a value of `name` as read from a JSON file versus the value declared in the test + + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +### name + +The `name` matcher tests the value of `name` as read from a JSON file versus the value declared in the test: + + its('name') { should eq 'foo' } + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test a cookbook version in a policyfile.lock.json file + + describe json('policyfile.lock.json') do + its(['cookbook_locks', 'omnibus', 'version']) { should eq('2.2.0') } + end diff --git a/docs/resources/kernel_module.md.erb b/docs/resources/kernel_module.md.erb new file mode 100644 index 000000000..5756ca72d --- /dev/null +++ b/docs/resources/kernel_module.md.erb @@ -0,0 +1,60 @@ +--- +title: About the kernel_module Resource +--- + +# kernel_module + +Use the `kernel_module` InSpec audit resource to test kernel modules on Linux platforms. These parameters are located under `/lib/modules`. Any submodule may be tested using this resource. + +## Syntax + +A `kernel_module` resource block declares a module name, and then tests if that module is a loadable kernel module: + + describe kernel_module('module_name') do + it { should be_loaded } + end + +where + +* `'module_name'` must specify a kernel module, such as `'bridge'` +* `{ should be_loaded }` tests if the module is a loadable kernel module + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### be_loaded + +The `be_loaded` matcher tests if the module is a loadable kernel module: + + it { should be_loaded } + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test if a module is loaded + + describe kernel_module('bridge') do + it { should be_loaded } + end diff --git a/docs/resources/kernel_parameter.md.erb b/docs/resources/kernel_parameter.md.erb new file mode 100644 index 000000000..86f6d8b24 --- /dev/null +++ b/docs/resources/kernel_parameter.md.erb @@ -0,0 +1,72 @@ +--- +title: About the kernel_parameter Resource +--- + +# kernel_parameter + +Use the `kernel_parameter` InSpec audit resource to test kernel parameters on Linux platforms. + +## Syntax + +A `kernel_parameter` resource block declares a parameter and then a value to be tested: + + describe kernel_parameter('path.to.parameter') do + its('value') { should eq 0 } + end + +where + +* `'kernel.parameter'` must specify a kernel parameter, such as `'net.ipv4.conf.all.forwarding'` +* `{ should eq 0 }` states the value to be tested + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +### value + +The `value` matcher tests the value assigned to the named IP address versus the value declared in the test: + + its('value') { should eq 0 } + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test if global forwarding is enabled for an IPv4 address + + describe kernel_parameter('net.ipv4.conf.all.forwarding') do + its('value') { should eq 1 } + end + +### Test if global forwarding is disabled for an IPv6 address + + describe kernel_parameter('net.ipv6.conf.all.forwarding') do + its('value') { should eq 0 } + end + +### Test if an IPv6 address accepts redirects + + describe kernel_parameter('net.ipv6.conf.interface.accept_redirects') do + its('value') { should eq 'true' } + end diff --git a/docs/resources/launchd_service.md.erb b/docs/resources/launchd_service.md.erb new file mode 100644 index 000000000..7db21b263 --- /dev/null +++ b/docs/resources/launchd_service.md.erb @@ -0,0 +1,76 @@ +--- +title: About the launchd_service Resource +--- + +# launchd_service + +Use the ``launchd_service`` InSpec audit resource to test a service using Launchd. + +## Syntax + +A ``launchd_service`` resource block declares the name of a service and then one (or more) matchers to test the state of the service: + + describe launchd_service('service_name') do + it { should be_installed } + it { should be_enabled } + it { should be_running } + end + +where + +* ``('service_name')`` must specify a service name +* `be_installed`, `be_enabled`, and `be_running` are valid matchers for this resource; all matchers available to the `service` resource may be used + +The path to the service manager's control may be specified for situations where the path isn't available in the current ``PATH``. For example: + + describe launchd_service('service_name', '/path/to/control') do + it { should be_enabled } + it { should be_installed } + it { should be_running } + end + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### be_enabled + +The `be_enabled` matcher tests if the named service is enabled: + + it { should be_enabled } + +### be_installed + +The `be_installed` matcher tests if the named service is installed: + + it { should be_installed } + +### be_running + +The `be_running` matcher tests if the named service is running: + + it { should be_running } + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +## Examples + +None. diff --git a/docs/resources/limits_conf.md.erb b/docs/resources/limits_conf.md.erb new file mode 100644 index 000000000..f7b4e8e7c --- /dev/null +++ b/docs/resources/limits_conf.md.erb @@ -0,0 +1,80 @@ +--- +title: About the limits_conf Resource +--- + +# limits_conf + +Use the `limits_conf` InSpec audit resource to test configuration settings in the `/etc/security/limits.conf` file. The `limits.conf` defines limits for processes (by user and/or group names) and helps ensure that the system on which those processes are running remains stable. Each process may be assigned a hard or soft limit. + +* Soft limits are maintained by the shell and defines the number of file handles (or open files) available to the user or group after login +* Hard limits are maintained by the kernel and defines the maximum number of allowed file handles + +Entries in the `limits.conf` file are similar to: + + grantmc soft nofile 4096 + grantmc hard nofile 63536 + + ^^^^^^^^^ ^^^^ ^^^^^^ ^^^^^ + domain type item value + +## Syntax + +A `limits_conf` resource block declares a domain to be tested, along with associated type, item, and value: + + describe limits_conf('path') do + its('domain') { should include ['type', 'item', 'value'] } + its('domain') { should eq ['type', 'item', 'value'] } + end + +where + +* `('path')` is the non-default path to the `inetd.conf` file +* `'domain'` is a user or group name, such as `grantmc` +* `'type'` is either `hard` or `soft` +* `'item'` is the item for which limits are defined, such as `core`, `nofile`, `stack`, `nproc`, `priority`, or `maxlogins` +* `'value'` is the value associated with the `item` + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### domain + +The `domain` matcher tests the domain in the `limits.conf` file, along with associated type, item, and value: + + its('domain') { should include ['type', 'item', 'value'] } +` +For example: + + its('grantmc') { should include ['hard', 'nofile', '63536'] } + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test limits + + describe limits_conf('path') do + its('*') { should include ['soft', 'core', '0'], ['hard', 'rss', '10000'] } + its('ftp') { should eq ['hard', 'nproc', '0'] } + end diff --git a/docs/resources/login_def.md.erb b/docs/resources/login_def.md.erb new file mode 100644 index 000000000..f744baa5b --- /dev/null +++ b/docs/resources/login_def.md.erb @@ -0,0 +1,77 @@ +--- +title: About the login_defs Resource +--- + +# login_defs + +Use the `login_defs` InSpec audit resource to test configuration settings in the `/etc/login.defs` file. The `logins.defs` file defines site-specific configuration for the shadow password suite on Linux and Unix platforms, such as password expiration ranges, minimum/maximum values for automatic selection of user and group identifiers, or the method with which passwords are encrypted. + +## Syntax + +A `login_defs` resource block declares the `login.defs` configuration data to be tested: + + describe login_defs do + its('name') { should include('foo') } + end + +where + +* `name` is a configuration setting in `login.defs` +* `{ should include('foo') }` tests the value of `name` as read from `login.defs` versus the value declared in the test + + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +### name + +The `name` matcher tests the value of `name` as read from `login.defs` versus the value declared in the test: + + its('name') { should eq 'foo' } + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test password expiration settings + + describe login_defs do + its('PASS_MAX_DAYS') { should eq '180' } + its('PASS_MIN_DAYS') { should eq '1' } + its('PASS_MIN_LEN') { should eq '15' } + its('PASS_WARN_AGE') { should eq '30' } + end + +### Test the encryption method + + describe login_defs do + its('ENCRYPT_METHOD') { should eq 'SHA512' } + end + +### Test umask setting + + describe login_def do + its('UMASK') { should eq '077' } + its('PASS_MAX_DAYS') { should eq '90' } + end diff --git a/docs/resources/mount.md.erb b/docs/resources/mount.md.erb new file mode 100644 index 000000000..7f8874d41 --- /dev/null +++ b/docs/resources/mount.md.erb @@ -0,0 +1,83 @@ +--- +title: About the mount Resource +--- + +# mount + +Use the `mount` InSpec audit resource to test the mount points on Linux systems. + +## Syntax + +An `mount` resource block declares the synchronization settings that should be tested: + + describe mount('path') do + it { should MATCHER 'value' } + end + +where + +* `('path')` is the path to the mounted directory +* `MATCHER` is a valid matcher for this resource +* `'value'` is the value to be tested + + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### be_mounted + +The `be_mounted` matcher tests if the file is accessible from the file system: + + it { should be_mounted } + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### device + +The `device` matcher tests the device from the `fstab` table: + + its('device') { should eq '/dev/mapper/VolGroup-lv_root' } + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +### options + +The `options` matcher tests the mount options for the file system from the `fstab` table: + + its('options') { should eq ['rw', 'mode=620'] } + +### type + +The `type` matcher tests the file system type: + + its('type') { should eq 'ext4' } + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test a the mount point on '/' + + describe mount('/') do + it { should be_mounted } + its('device') { should eq '/dev/mapper/VolGroup-lv_root' } + its('type') { should eq 'ext4' } + its('options') { should eq ['rw', 'mode=620'] } + end diff --git a/docs/resources/mysql_conf.md.erb b/docs/resources/mysql_conf.md.erb new file mode 100644 index 000000000..4c80a4562 --- /dev/null +++ b/docs/resources/mysql_conf.md.erb @@ -0,0 +1,102 @@ +--- +title: About the mysql_conf Resource +--- + +# mysql_conf + +Use the `mysql_conf` InSpec audit resource to test the contents of the configuration file for MySQL, typically located at `/etc/mysql/my.cnf` or `/etc/my.cnf`. + +## Syntax + +A `mysql_conf` resource block declares one (or more) settings in the `my.cnf` file, and then compares the setting in the configuration file to the value stated in the test: + + describe mysql_conf('path') do + its('setting') { should eq 'value' } + end + +where + +* `'setting'` specifies a setting in the `my.cnf` file, such as `max_connections` +* `('path')` is the non-default path to the `my.cnf` file +* `should eq 'value'` is the value that is expected + + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +### setting + +The `setting` matcher tests specific, named settings in the `my.cnf` file: + + its('setting') { should eq 'value' } + +Use a `setting` matcher for each setting to be tested. + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test the maximum number of allowed connections + + describe mysql_conf do + its('max_connections') { should eq '505' } + its('max_user_connections') { should eq '500' } + end + +### Test slow query logging** + + describe mysql_conf do + its('slow_query_log_file') { should eq 'hostname_slow.log' } + its('slow_query_log') { should eq '0' } + its('log_queries_not_using_indexes') { should eq '1' } + its('long_query_time') { should eq '0.5' } + its('min_examined_row_limit') { should eq '100' } + end + +### Test the port and socket on which MySQL listens + + describe mysql_conf do + its('port') { should eq '3306' } + its('socket') { should eq '/var/run/mysqld/mysql.sock' } + end + +### Test connection and thread variables + + describe mysql_conf do + its('port') { should eq '3306' } + its('socket') { should eq '/var/run/mysqld/mysql.sock' } + its('max_allowed_packet') { should eq '12M' } + its('default_storage_engine') { should eq 'InnoDB' } + its('character_set_server') { should eq 'utf8' } + its('collation_server') { should eq 'utf8_general_ci' } + its('max_connections') { should eq '505' } + its('max_user_connections') { should eq '500' } + its('thread_cache_size') { should eq '505' } + end + +### Test the safe-user-create parameter + + describe mysql_conf.params('mysqld') do + its('safe-user-create') { should eq('1') } + end diff --git a/docs/resources/mysql_session.md.erb b/docs/resources/mysql_session.md.erb new file mode 100644 index 000000000..5c00932b2 --- /dev/null +++ b/docs/resources/mysql_session.md.erb @@ -0,0 +1,63 @@ +--- +title: About the mysql_session Resource +--- + +# mysql_session + +Use the `mysql_session` InSpec audit resource to test SQL commands run against a MySQL database. + +## Syntax + +A `mysql_session` resource block declares the username and password to use for the session, and then the command to be run: + + describe mysql_session('username', 'password').query('QUERY') do + its('output') { should eq('') } + end + +where + +* `mysql_session` declares a username and password with permission to run the query +* `query('QUERY')` contains the query to be run +* `its('output') { should eq('') }` compares the results of the query against the expected result in the test + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +### output + +The `output` matcher tests the results of the query: + + its('output') { should eq(/^0/) } + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test for matching databases + + sql = mysql_session('my_user','password') + + describe sql.query('show databases like \'test\';') do + its('stdout') { should_not match(/test/) } + end diff --git a/docs/resources/npm.md.erb b/docs/resources/npm.md.erb new file mode 100644 index 000000000..43adb921c --- /dev/null +++ b/docs/resources/npm.md.erb @@ -0,0 +1,75 @@ +--- +title: About the npm Resource +--- + +# npm + +Use the `npm` InSpec audit resource to test if a global NPM package is installed. NPM is the the package manager for Node.js packages (https://docs.npmjs.com), such as Bower and StatsD. + + +## Syntax + +A `npm` resource block declares a package and (optionally) a package version: + + describe gem('npm_package_name') do + it { should be_installed } + end + +where + +* `('npm_package_name')` must specify an NPM package, such as `'bower'` or `'statsd'` +* `be_installed` is a valid matcher for this resource + + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### be_installed + +The `be_installed` matcher tests if the named Gem package and package version (if specified) is installed: + + it { should be_installed } + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +### version + +The `version` matcher tests if the named package version is on the system: + + its('version') { should eq '1.2.3' } + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Verify that bower is installed, with a specific version + + describe npm('bower') do + it { should be_installed } + its('version') { should eq '1.4.1' } + end + +### Verify that statsd is not installed + + describe npm('statsd') do + it { should_not be_installed } + end diff --git a/docs/resources/ntp_conf.md.erb b/docs/resources/ntp_conf.md.erb new file mode 100644 index 000000000..922b3f6e6 --- /dev/null +++ b/docs/resources/ntp_conf.md.erb @@ -0,0 +1,76 @@ +--- +title: About the ntp_conf Resource +--- + +# ntp_conf + +Use the `ntp_conf` InSpec audit resource to test the synchronization settings defined in the `ntp.conf` file. This file is typically located at `/etc/ntp.conf`. + + +## Syntax + +An `ntp_conf` resource block declares the synchronization settings that should be tested: + + describe ntp_conf('path') do + its('setting_name') { should eq 'value' } + end + +where + +* `'setting_name'` is a synchronization setting defined in the `ntp.conf` file +* `('path')` is the non-default path to the `ntp.conf` file +* `{ should eq 'value' }` is the value that is expected + + +## Matchers + +This resource matches any service that is listed in the `ntp.conf` file: + + its('server') { should_not eq nil } + +or: + + its('restrict') { should include '-4 default kod notrap nomodify nopeer noquery'} + +For example: + + describe ntp_conf do + its('server') { should_not eq nil } + its('restrict') { should include '-4 default kod notrap nomodify nopeer noquery'} + end + + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test for clock drift against named servers + + describe ntp_conf do + its('driftfile') { should eq '/var/lib/ntp/ntp.drift' } + its('server') { should eq [ + 0.ubuntu.pool.ntp.org, + 1.ubuntu.pool.ntp.org, + 2.ubuntu.pool.ntp.org + ] } + end diff --git a/docs/resources/oneget.md.erb b/docs/resources/oneget.md.erb new file mode 100644 index 000000000..fbf9253d4 --- /dev/null +++ b/docs/resources/oneget.md.erb @@ -0,0 +1,67 @@ +--- +title: About the oneget Resource +--- + +# oneget + +Use the `oneget` InSpec audit resource to test if the named package and/or package version is installed on the system. This resource uses Oneget, which is `part of the Windows Management Framework 5.0 and Windows 10 `__. This resource uses the `Get-Package` cmdlet to return all of the package names in the Oneget repository. + +## Syntax + +A `oneget` resource block declares a package and (optionally) a package version: + + describe oneget('name') do + it { should be_installed } + end + +where + +* `('name')` must specify the name of a package, such as `'VLC'` +* `be_installed` is a valid matcher for this resource + + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### be_installed + +The `be_installed` matcher tests if the named package is installed on the system: + + it { should be_installed } + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +### version + +The `version` matcher tests if the named package version is on the system: + + its('version') { should eq '1.2.3' } + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test if VLC is installed + + describe oneget('VLC') do + it { should be_installed } + end diff --git a/docs/resources/os.md.erb b/docs/resources/os.md.erb new file mode 100644 index 000000000..7bfa6dc59 --- /dev/null +++ b/docs/resources/os.md.erb @@ -0,0 +1,154 @@ +--- +title: About the os Resource +--- + +# os + +Use the `os` InSpec audit resource to test the platform on which the system is running. + +## Syntax + +An `os` resource block declares the platform to be tested. The platform may specified via matcher or control block name. For example, using a matcher: + + describe os[:family] do + it { should eq 'platform_name' } + end + +or using the block name: + + describe os[:family_name] do + ... + end + +* `'platform_name'` (a string) or `:family_name` (a symbol) is one of `aix`, `bsd`, `darwin`, `debian`, `hpux`, `linux`, `redhat`, `solaris`, `suse`, `unix`, or `windows` + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +## os.family? Helpers + +The `os` audit resource includes a collection of helpers that enable more granular testing of platforms, platform names, architectures, and releases. Use any of the following platform-specific helpers to test for specific platforms: + +* `aix?` +* `bsd?` (including Darwin, FreeBSD, NetBSD, and OpenBSD) +* `darwin?` +* `debian?` +* `hpux?` +* `linux?` (including Alpine Linux, Amazon Linux, ArchLinux, CoreOS, Exherbo, Fedora, Gentoo, and Slackware) +* `redhat?` +* `solaris?` (including Nexenta Core, OmniOS, Open Indiana, Solaris Open, and SmartOS) +* `suse?` +* `unix?` +* `windows?` + +For example, to test for Darwin use: + + describe os.bsd? do + it { should eq true } + end + +To test for Windows use: + + describe os.windows? do + it { should eq true } + end + +and to test for Redhat use: + + describe os.redhat? do + it { should eq true } + end + +Use the following helpers to test for operating system names, releases, and architectures: + + describe os.name do + it { should eq 'foo' } + end + + describe os.release do + it { should eq 'foo' } + end + + describe os.arch do + it { should eq 'foo' } + end + +## os[:family] Symbols + +Use `os[:family]` to enable more granular testing of platforms, platform names, architectures, and releases. Use any of the following platform-specific symbols to test for specific platforms: + +* `:aix` +* `:bsd` For platforms that are part of the Berkeley OS family: `:darwin`, `:freebsd`, `:netbsd`, and `:openbsd`. +* `:debian` +* `:hpux` +* `:linux`. For platforms that are part of the Linux family: `:alpine`, `:amazon`, `:arch`, `:coreos`, `:exherbo`, `:fedora`, `:gentoo`, and `:slackware`. +* `:redhat` +* `:solaris`. For platforms that are part of the Solaris family: `:nexentacore`, `:omnios`, `:openindiana`, `:opensolaris`, and `:smartos`. +* `:suse` +* `:unix` +* `:windows` + +For example, both of the following tests should have the same result: + + if os[:family] == 'debian' + describe port(69) do + its('processes') { should include 'in.tftpd' } + end + elsif os[:family] == 'rhel' + describe port(69) do + its('processes') { should include 'xinetd' } + end + end + + if os[:debian] + describe port(69) do + its('processes') { should include 'in.tftpd' } + end + elsif os[:rhel] + describe port(69) do + its('processes') { should include 'xinetd' } + end + end + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test for RedHat + + describe os[:family] do + it { should eq 'redhat' } + end + +### Test for Ubuntu + + describe os[:family] do + it { should eq 'debian' } + end + +### Test for Microsoft Windows + + describe os[:family] do + it { should eq 'windows' } + end diff --git a/docs/resources/os_env.md.erb b/docs/resources/os_env.md.erb new file mode 100644 index 000000000..bf1e6b89b --- /dev/null +++ b/docs/resources/os_env.md.erb @@ -0,0 +1,98 @@ +--- +title: About the os_env Resource +--- + +# os_env + +Use the `os_env` InSpec audit resource to test the environment variables for the platform on which the system is running. + +## Syntax + +A `os_env` resource block declares an environment variable, and then declares its value: + + describe os_env('VARIABLE') do + its('matcher') { should eq 1 } + end + +where + +* `('VARIABLE')` must specify an environment variable, such as `PATH` +* `matcher` is a valid matcher for this resource + + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### content + +The `content` matcher return the value of the environment variable: + + its('content') { should eq '/usr/local/bin:/usr/local/sbin:/usr/sbin:/usr/bin:/sbin' } + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +### split + +The `split` splits the content with the `:` deliminator: + + its('split') { should include (':') } + +or: + + its('split') { should_not include ('.') } + +Use `-1` to test for cases where there is a trailing colon (`:`), such as `dir1::dir2:`: + + its('split') { should include ('-1') } + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test the PATH environment variable + + describe os_env('PATH') do + its('split') { should_not include('') } + its('split') { should_not include('.') } + end + +### Test Habitat environment variables + +Habitat uses the `os_env` resource to test environment variables. The environment variables are first defined in a whitespace array, after which each environment variable is tested: + + hab_env_vars = %w(HAB_AUTH_TOKEN + HAB_CACHE_KEY_PATH + HAB_DEPOT_URL + HAB_ORG + HAB_ORIGIN + HAB_ORIGIN_KEYS + HAB_RING + HAB_RING_KEY + HAB_STUDIOS_HOME + HAB_STUDIO_ROOT + HAB_USER) + + hab_env_vars.each do |e| + describe os_env(e) do + its('content') { should eq nil } + end + end diff --git a/docs/resources/package.md.erb b/docs/resources/package.md.erb new file mode 100644 index 000000000..349bc34a1 --- /dev/null +++ b/docs/resources/package.md.erb @@ -0,0 +1,115 @@ +--- +title: About the package Resource +--- + +# package + +Use the `package` InSpec audit resource to test if the named package and/or package version is installed on the system. + + +## Syntax + +A `package` resource block declares a package and (optionally) a package version: + + describe package('name') do + it { should be_installed } + end + +where + +* `('name')` must specify the name of a package, such as `'nginx'` +* `be_installed` is a valid matcher for this resource + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### be_installed + +The `be_installed` matcher tests if the named package is installed on the system: + + it { should be_installed } + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +### version + +The `version` matcher tests if the named package version is on the system: + + its('version') { should eq '1.2.3' } + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test if nginx version 1.9.5 is installed + + describe package('nginx') do + it { should be_installed } + its('version') { should eq 1.9.5 } + end + +### Test that a package is not installed + + describe package('some_package') do + it { should_not be_installed } + end + +### Test if telnet is installed + + describe package('telnetd') do + it { should_not be_installed } + end + + describe inetd_conf do + its('telnet') { should eq nil } + end + +### Test if ClamAV (an antivirus engine) is installed and running + + describe package('clamav') do + it { should be_installed } + its('version') { should eq '0.98.7' } + end + + describe service('clamd') do + it { should_not be_enabled } + it { should_not be_installed } + it { should_not be_running } + end + +### Verify if Memcached is installed, enabled, and running + +Memcached is an in-memory key-value store that helps improve the performance of database-driven websites and can be installed, maintained, and tested using the `memcached` cookbook (maintained by Chef). The following example is from the `memcached` cookbook and shows how to use a combination of the `package`, `service`, and `port` InSpec audit resources to test if Memcached is installed, enabled, and running: + + describe package('memcached') do + it { should be_installed } + end + + describe service('memcached') do + it { should be_installed } + it { should be_enabled } + it { should be_running } + end + + describe port(11_211) do + it { should be_listening } + end diff --git a/docs/resources/parse_config.md.erb b/docs/resources/parse_config.md.erb new file mode 100644 index 000000000..d5082c777 --- /dev/null +++ b/docs/resources/parse_config.md.erb @@ -0,0 +1,122 @@ +--- +title: About the parse_config Resource +--- + +# parse_config + +Use the `parse_config` InSpec audit resource to test arbitrary configuration files. + +## Syntax + +A `parse_config` resource block declares the location of the configuration setting to be tested, and then what value is to be tested. Because this resource relies on arbitrary configuration files, the test itself is often arbitrary and relies on custom Ruby code: + + output = command('some-command').stdout + + describe parse_config(output, { data_config_option: value } ) do + its('setting') { should eq 1 } + end + +or: + + audit = command('/sbin/auditctl -l').stdout + options = { + assignment_re: /^\s*([^:]*?)\s*:\s*(.*?)\s*$/, + multiple_values: true + } + + describe parse_config(audit, options) do + its('setting') { should eq 1 } + end + +where each test + +* Must declare the location of the configuration file to be tested +* Must declare one (or more) settings to be tested +* May run a command to `stdout`, and then run the test against that output +* May use options to define how configuration data is to be parsed + +## Matchers + +This InSpec audit resource has the following matchers: + +### assignment_re + +Use `assignment_re` to test a key value using a regular expression: + + 'key = value' + +may be tested using the following regular expression, which determines assignment from key to value: + + assignment_re: /^\s*([^=]*?)\s*=\s*(.*?)\s*$/ + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### comment_char + +Use `comment_char` to test for comments in a configuration file: + + comment_char: '#' + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### key_vals + +Use `key_vals` to test how many values a key contains: + + key = a b c + +contains three values. To test that value to ensure it only contains one, use: + + key_vals: 1 + +### match + +<%= partial "/shared/matcher_match" %> + +### multiple_values + +Use `multiple_values` if the source file uses the same key multiple times. All values will be aggregated in an array: + + # # file structure: + # key = a + # key = b + # key2 = c + params['key'] = ['a', 'b'] + params['key2'] = ['c'] + +To use plain key value mapping, use `multiple_values: false`: + + # # file structure: + # key = a + # key = b + # key2 = c + params['key'] = 'b' + params['key2'] = 'c' + +### standalone_comments + +Use `standalone_comments` to parse comments as a line, otherwise inline comments are allowed: + + 'key = value # comment' + params['key'] = 'value # comment' + +Use `standalone_comments: false`, to parse the following: + + 'key = value # comment' + params['key'] = 'value' + +## Examples + +None. \ No newline at end of file diff --git a/docs/resources/parse_config_file.md.erb b/docs/resources/parse_config_file.md.erb new file mode 100644 index 000000000..0dc58dc45 --- /dev/null +++ b/docs/resources/parse_config_file.md.erb @@ -0,0 +1,149 @@ +--- +title: About the parse_config_file Resource +--- + +# parse\_config\_file + +Use the `parse_config_file` InSpec audit resource to test arbitrary configuration files. It works in the same way as `parse_config`. Instead of using a command output, this resource works with files. + +## Syntax + +A `parse_config_file` InSpec audit resource block declares the location of the configuration file to be tested, and then which settings in that file are to be tested. + + describe parse_config_file('/path/to/file', { data_config_option: value } ) do + its('setting') { should eq 1 } + end + +or: + + options = { + assignment_re: /^\s*([^:]*?)\s*:\s*(.*?)\s*$/, + multiple_values: true + } + + describe parse_config_file('path/to/file', options) do + its('setting') { should eq 1 } + end + +where each test + +* Must declare the location of the configuration file to be tested +* Must declare one (or more) settings to be tested +* May run a command to `stdout`, and then run the test against that output +* May use options to define how configuration data is to be parsed + +## Options + +This resource supports the following options for parsing configuration data. Use them in an `options` block stated outside of (and immediately before) the actual test: + + options = { + assignment_re: /^\s*([^:]*?)\s*:\s*(.*?)\s*$/, + multiple_values: true + } + describe parse_config_file('path/to/file', options) do + its('setting') { should eq 1 } + end + +## Matchers + +This InSpec audit resource has the following matchers: + +### assignment_re + +Use `assignment_re` to test a key value using a regular expression: + + 'key = value' + +may be tested using the following regular expression, which determines assignment from key to value: + + assignment_re: /^\s*([^=]*?)\s*=\s*(.*?)\s*$/ + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### comment_char + +Use `comment_char` to test for comments in a configuration file: + + comment_char: '#' + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### key_vals + +Use `key_vals` to test how many values a key contains: + + key = a b c + +contains three values. To test that value to ensure it only contains one, use: + + key_vals: 1 + +### match + +<%= partial "/shared/matcher_match" %> + +### multiple_values + +Use `multiple_values` if the source file uses the same key multiple times. All values will be aggregated in an array: + + # # file structure: + # key = a + # key = b + # key2 = c + params['key'] = ['a', 'b'] + params['key2'] = ['c'] + +To use plain key value mapping, use `multiple_values: false`: + + # # file structure: + # key = a + # key = b + # key2 = c + params['key'] = 'b' + params['key2'] = 'c' + +### standalone_comments + +Use `standalone_comments` to parse comments as a line, otherwise inline comments are allowed: + + 'key = value # comment' + params['key'] = 'value # comment' + +Use `standalone_comments: false`, to parse the following: + + 'key = value # comment' + params['key'] = 'value' + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test a configuration setting + + describe parse_config_file('/path/to/file.conf') do + its('PARAM_X') { should eq 'Y' } + end + +### Use options, and then test a configuration setting + + describe parse_config_file('/path/to/file.conf', { multiple_values: true }) do + its('PARAM_X') { should include 'Y' } + end + +## Test a file with an ini-like structure (such as a yum.conf) + + describe parse_config_file('/path/to/yum.conf') do + its('main') { should include('gpgcheck' => '1') } + end diff --git a/docs/resources/pip.md.erb b/docs/resources/pip.md.erb new file mode 100644 index 000000000..4dc691c3a --- /dev/null +++ b/docs/resources/pip.md.erb @@ -0,0 +1,74 @@ +--- +title: About the pip Resource +--- + +# pip + +Use the `pip` InSpec audit resource to test packages that are installed using the Python PIP installer. + +## Syntax + +A `pip` resource block declares a package and (optionally) a package version: + + describe pip('Jinja2') do + it { should be_installed } + end + +where + +* `'Jinja2'` is the name of the package +* `be_installed` tests to see if the `Jinja2` package is installed + + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### be_installed + +The `be_installed` matcher tests if the named package is installed on the system: + + it { should be_installed } + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +### version + +The `version` matcher tests if the named package version is on the system: + + its('version') { should eq '1.2.3' } + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test if Jinja2 is installed on the system + + describe pip('Jinja2') do + it { should be_installed } + end + +### Test if Jinja2 2.8 is installed on the system + + describe pip('Jinja2') do + it { should be_installed } + its('version') { should eq '2.8' } + end diff --git a/docs/resources/port.md.erb b/docs/resources/port.md.erb new file mode 100644 index 000000000..7c03b0beb --- /dev/null +++ b/docs/resources/port.md.erb @@ -0,0 +1,150 @@ +--- +title: About the port Resource +--- + +# port + +Use the `port` InSpec audit resource to test basic port properties, such as port, process, if it's listening. + +## Syntax + +A `port` resource block declares a port, and then depending on what needs to be tested, a process, protocol, process identifier, and its state (is it listening?): + + describe port(514) do + it { should be_listening } + its('processes') {should include 'syslog'} + end + +where the `processes` returns the processes listening on port 514. + +A filter may specify an attribute: + + describe port.where { protocol =~ /tcp/ && port > 22 && port < 80 } do + it { should_not be_listening } + end + +where + +* `.where{}` specifies a block in which one (or more) attributes---`port`, `address`, `protocol`, `process`, `pid`, or `listening?`----scope the test to ports that match those attributes + +For example, to test if the SSH daemon is available on a Linux machine via the default port (22): + + describe port(22) do + its('processes') { should include 'sshd' } + its('protocols') { should include 'tcp' } + its('addresses') { should include '0.0.0.0' } + end + +## Matchers + +This InSpec audit resource has the following matchers: + +### address + +The `addresses` matcher tests if the specified address is associated with a port: + + its('addresses') { should include '0.0.0.0' } + +### be + +<%= partial "/shared/matcher_be" %> + +### be_listening + +The `be_listening` matcher tests if the port is listening for traffic: + + it { should be_listening } + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +### pids + +The `pids` matcher tests the process identifiers (PIDs): + + its('pids') { should eq ['27808'] } + +### processes + +The `processes` matcher tests if the named process is running on the system: + + its('processes') { should eq ['syslog'] } + +### protocols + +The `protocols` matcher tests the Internet protocol: ICMP (`'icmp'`), TCP (`'tcp'` or `'tcp6'`), or UDP (`'udp'` or `'udp6'`): + + its('protocols') { should include 'tcp' } + +or for the IPv6 protocol: + + its('protocols') { should include 'tcp6' } + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test port 80, listening with the TCP protocol + + describe port(80) do + it { should be_listening } + its('protocols') {should eq ['tcp']} + end + +### Test port 80, on a specific address + +A specific port address may be checked using either of the following examples: + + describe port(80) do + it { should be_listening } + its('addresses') {should include '0.0.0.0'} + end + +or: + + describe port('0.0.0.0', 80) do + it { should be_listening } + end + +### Test port 80, listening with TCP version IPv6 protocol + + describe port(80) do + it { should be_listening } + its('protocols') {should eq ['tcp6']} + end + +### Test that only secure ports accept requests + + describe port(80) do + it { should_not be_listening } + end + + describe port(443) do + it { should be_listening } + its('protocols') {should eq ['tcp']} + end + +### Verify port 65432 is not listening + + describe port(22) do + it { should be_listening } + its('protocols') { should include('tcp') } + its('protocols') { should_not include('udp') } + end + + describe port(65432) do + it { should_not be_listening } + end diff --git a/docs/resources/postgres_conf.md.erb b/docs/resources/postgres_conf.md.erb new file mode 100644 index 000000000..a30581052 --- /dev/null +++ b/docs/resources/postgres_conf.md.erb @@ -0,0 +1,90 @@ +--- +title: About the postgres_conf Resource +--- + +# postgres_conf + +Use the `postgres_conf` InSpec audit resource to test the contents of the configuration file for PostgreSQL, typically located at `/etc/postgresql//main/postgresql.conf` or `/var/lib/postgres/data/postgresql.conf`, depending on the platform. + +## Syntax + +A `postgres_conf` resource block declares one (or more) settings in the `postgresql.conf` file, and then compares the setting in the configuration file to the value stated in the test: + + describe postgres_conf('path') do + its('setting') { should eq 'value' } + end + +where + +* `'setting'` specifies a setting in the `postgresql.conf` file +* `('path')` is the non-default path to the `postgresql.conf` file (optional) +* `should eq 'value'` is the value that is expected + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +### setting + +The `setting` matcher tests specific, named settings in the `postgresql.conf` file: + + its('setting') { should eq 'value' } + +Use a `setting` matcher for each setting to be tested. + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test the maximum number of allowed client connections + + describe postgres_conf do + its('max_connections') { should eq '5' } + end + +### Test system logging + + describe postgres_conf do + its('logging_collector') { should eq 'on' } + its('log_connections') { should eq 'on' } + its('log_disconnections') { should eq 'on' } + its('log_duration') { should eq 'on' } + its('log_hostname') { should eq 'on' } + its('log_line_prefix') { should eq '%t %u %d %h' } + end + +### Test the port on which PostgreSQL listens + + describe postgres_conf do + its('port') { should eq '5432' } + end + +### Test the Unix socket settings + + describe postgres_conf do + its('unix_socket_directories') { should eq '.s.PGSQL.5432' } + its('unix_socket_group') { should eq nil } + its('unix_socket_permissions') { should eq '0770' } + end + +where `unix_socket_group` is set to the PostgreSQL default setting (the group to which the server user belongs). diff --git a/docs/resources/postgres_session.md.erb b/docs/resources/postgres_session.md.erb new file mode 100644 index 000000000..a24afca86 --- /dev/null +++ b/docs/resources/postgres_session.md.erb @@ -0,0 +1,75 @@ +--- +title: About the postgres_session Resource +--- + +# postgres_session + +Use the `postgres_session` InSpec audit resource to test SQL commands run against a PostgreSQL database. + +## Syntax + +A `postgres_session` resource block declares the username and password to use for the session, and then the command to be run: + + sql = postgres_session('username', 'password') + + describe sql.query('SELECT * FROM pg_shadow WHERE passwd IS NULL;') do + its('output') { should eq('') } + end + +where + +* `sql = postgres_session` declares a username and password with permission to run the query +* `sql.query('')` contains the query to be run +* `its('output') { should eq('') }` compares the results of the query against the expected result in the test + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +### output + +The `output` matcher tests the results of the query: + + its('output') { should eq(/^0/) } + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test the PostgreSQL shadow password + + sql = postgres_session('my_user', 'password') + + describe sql.query('SELECT * FROM pg_shadow WHERE passwd IS NULL;') do + its('output') { should eq('') } + end + +### Test for risky database entries + + describe postgres_session('my_user', 'password').query('SELECT count (*) + FROM pg_language + WHERE lanpltrusted = \'f\' + AND lanname!=\'internal\' + AND lanname!=\'c\';') do + its('output') { should eq '0' } + end diff --git a/docs/resources/powershell.md.erb b/docs/resources/powershell.md.erb new file mode 100644 index 000000000..14472dc85 --- /dev/null +++ b/docs/resources/powershell.md.erb @@ -0,0 +1,116 @@ +--- +title: About the powershell Resource +--- + +# powershell + +Use the `powershell` InSpec audit resource to test a Powershell script on the Windows platform. + +## Syntax + +A `powershell` resource block declares a Powershell script to be tested, and then compares the output of that command to the matcher in the test: + + script = <<-EOH + # a PowerShell script + EOH + + describe script(script) do + its('matcher') { should eq 'output' } + end + +where + +* `'script'` must specify a Powershell script to be run +* `'matcher'` is one of `exit_status`, `stderr`, or `stdout` +* `'output'` tests the output of the command run on the system versus the output value stated in the test + + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### exit_status + +The `exit_status` matcher tests the exit status for the command: + + its('exit_status') { should eq 123 } + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +### stderr + +The `stderr` matcher tests results of the command as returned in standard error (stderr): + + its('stderr') { should eq 'error' } + +### stdout + +The `stdout` matcher tests results of the command as returned in standard output (stdout): + + its('stdout') { should eq '/^1$/' } + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Get all groups of Administrator user + + script = <<-EOH + # find user + $user = Get-WmiObject Win32_UserAccount -filter "Name = 'Administrator'" + # get related groups + $groups = $user.GetRelated('Win32_Group') | Select-Object -Property Caption, Domain, Name, LocalAccount, SID, SIDType, Status + $groups | ConvertTo-Json + EOH + + describe powershell(script) do + its('stdout') { should_not eq '' } + end + +### Write-Output 'hello' + +The following Powershell script: + + script = <<-EOH + Write-Output 'hello' + EOH + +can be tested in the following ways. + +For a newline: + + describe powershell(script) do + its('stdout') { should eq "hello\r\n" } + its('stderr') { should eq '' } + end + +Removing whitespace `\r\n` from `stdout`: + + describe powershell(script) do + its('strip') { should eq "hello" } + end + +No newline: + + describe powershell("'hello' | Write-Host -NoNewLine") do + its('stdout') { should eq 'hello' } + its('stderr') { should eq '' } + end diff --git a/docs/resources/process.md.erb b/docs/resources/process.md.erb new file mode 100644 index 000000000..7efdea10d --- /dev/null +++ b/docs/resources/process.md.erb @@ -0,0 +1,73 @@ +--- +title: About the processes Resource +--- + +# processes + +Use the `processes` InSpec audit resource to test properties for programs that are running on the system. + +## Syntax + +A `processes` resource block declares the name of the process to be tested, and then declares one (or more) property/value pairs: + + describe processes('process_name') do + its('property_name') { should eq ['property_value'] } + end + +where + +* `processes('process_name')` must specify the name of a process that is running on the system +* `property_name` may be used to test user (`its('users')`) and state properties (`its('states')`) + + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +### property_name + +The `property_name` matcher tests the named property for the specified value: + + its('property_name') { should eq ['property_value'] } + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test if the list length for the mysqld process is 1 + + describe processes('mysqld') do + its('list.length') { should eq 1 } + end + +### Test if the init process is owned by the root user + + describe processes('init') do + its('users') { should eq ['root'] } + end + +### Test if a high-priority process is running + + describe processes('some_process') do + its('states') { should eq ['R<'] } + end diff --git a/docs/resources/registry_key.md.erb b/docs/resources/registry_key.md.erb new file mode 100644 index 000000000..7da4dfc82 --- /dev/null +++ b/docs/resources/registry_key.md.erb @@ -0,0 +1,148 @@ +--- +title: About the registry_key Resource +--- + +# registry_key + +Use the `registry_key` InSpec audit resource to test key values in the Windows registry. + +## Syntax + +A `registry_key` resource block declares the item in the Windows registry, the path to a setting under that item, and then one (or more) name/value pairs to be tested. + +Use a registry key name and path: + + describe registry_key('Task Scheduler','HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Schedule') do + its('Start') { should eq 2 } + end + +Use only a registry key path: + + describe registry_key('Task Scheduler','HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Schedule') do + its('Start') { should eq 2 } + end + +Or use a Ruby Hash: + + describe registry_key({ + name: 'Task Scheduler', + hive: 'HKEY_LOCAL_MACHINE', + key: ''\SYSTEM\CurrentControlSet\services\Schedule' + }) do + its('Start') { should eq 2 } + end + + +### Registry Key Path Separators + +A Windows registry key can be used as a string in Ruby code, such as when a registry key is used as the name of a recipe. In Ruby, when a registry key is enclosed in a double-quoted string (`" "`), the same backslash character (`\`) that is used to define the registry key path separator is also used in Ruby to define an escape character. Therefore, the registry key path separators must be escaped when they are enclosed in a double-quoted string. For example, the following registry key: + + HKCU\SOFTWARE\Policies\Microsoft\Windows\CurrentVersion\Themes + +may be encloused in a single-quoted string with a single backslash: + + 'HKCU\SOFTWARE\path\to\key\Themes' + +or may be enclosed in a double-quoted string with an extra backslash as an escape character: + + "HKCU\\SOFTWARE\\path\\to\\key\\Themes" + + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### children + +The `children` matcher return all of the child items of a registry key. A regular expression may be used to filter child items: + + describe registry_key('Key Name', '\path\to\key').children(regex) + ... + end + +For example, to get all child items for a registry key: + + describe registry_key('Task Scheduler','HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet').children do + it { should_not eq [] } + end + +The following example shows how find a property that may exist against multiple registry keys, and then test that property for every registry key in which that property is located: + + describe registry_key({ + hive: 'HKEY_USERS' + }).children(/^S-1-5-21-[0-9]+-[0-9]+-[0-9]+-[0-9]{3,}\\Software\\Policies\\Microsoft\\Windows\\Installer/).each { |key| + describe registry_key(key) do + its('AlwaysInstallElevated') { should eq 'value' } + end + } + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### exist + +The `exist` matcher tests if the registry key is present: + + it { should exist } + +### have_property + +The `have_property` matcher tests if a property exists for a registry key: + + it { should have_property 'value' } + +### have\_property\_value + +The `have_property_value` matcher tests if a property value exists for a registry key: + + it { should have_property_value 'value' } + +### have_value + +The `have_value` matcher tests if a value exists for a registry key: + + it { should have_value 'value' } + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +### name + +The `name` matcher tests the value for the specified registry setting: + + its('name') { should eq 'value' } + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test the start time for the Schedule service + + describe registry_key('Task Scheduler','HKEY_LOCAL_MACHINE\...\Schedule') do + its('Start') { should eq 2 } + end + +where `'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Schedule'` is the full path to the setting. + +### Use a regular expression in responses + + describe registry_key({ + hive: 'HKEY_LOCAL_MACHINE', + key: 'SOFTWARE\Microsoft\Windows NT\CurrentVersion' + }) do + its('ProductName') { should match /^[a-zA-Z0-9\(\)\s]*2012\s[rR]2[a-zA-Z0-9\(\)\s]*$/ } + end diff --git a/docs/resources/runit_service.md.erb b/docs/resources/runit_service.md.erb new file mode 100644 index 000000000..e16bfc2d7 --- /dev/null +++ b/docs/resources/runit_service.md.erb @@ -0,0 +1,76 @@ +--- +title: About the runit_service Resource +--- + +# runit_service + +Use the `runit_service` InSpec audit resource to test a service using runit. + +## Syntax + +A `runit_service` resource block declares the name of a service and then one (or more) matchers to test the state of the service: + + describe runit_service('service_name') do + it { should be_installed } + it { should be_enabled } + it { should be_running } + end + +where + +* `('service_name')` must specify a service name +* `be_installed`, `be_enabled`, and `be_running` are valid matchers for this resource; all matchers available to the `service` resource may be used + +The path to the service manager's control may be specified for situations where the path isn't available in the current `PATH`. For example: + + describe runit_service('service_name', '/path/to/control') do + it { should be_enabled } + it { should be_installed } + it { should be_running } + end + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### be_enabled + +The `be_enabled` matcher tests if the named service is enabled: + + it { should be_enabled } + +### be_installed + +The `be_installed` matcher tests if the named service is installed: + + it { should be_installed } + +### be_running + +The `be_running` matcher tests if the named service is running: + + it { should be_running } + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +## Examples + +None. diff --git a/docs/resources/security_policy.md.erb b/docs/resources/security_policy.md.erb new file mode 100644 index 000000000..94155ce43 --- /dev/null +++ b/docs/resources/security_policy.md.erb @@ -0,0 +1,61 @@ +--- +title: About the security_policy Resource +--- + +# security_policy + +Use the `security_policy` InSpec audit resource to test security policies on the Windows platform. + +## Syntax + +A `security_policy` resource block declares the name of a security policy and the value to be tested: + + describe security_policy do + its('policy_name') { should eq 'value' } + end + +where + +* `'policy_name'` must specify a security policy +* `{ should eq 'value' }` tests the value of `policy_name` against the value declared in the test + + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +### policy_name + +The `policy_name` matcher must be the name of a security policy: + + its('SeNetworkLogonRight') { should eq '*S-1-5-11' } + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Verify that only the Administrators group has remote access + + describe security_policy do + its('SeRemoteInteractiveLogonRight') { should eq '*S-1-5-32-544' } + end diff --git a/docs/resources/service.md.erb b/docs/resources/service.md.erb new file mode 100644 index 000000000..af949e4ba --- /dev/null +++ b/docs/resources/service.md.erb @@ -0,0 +1,135 @@ +--- +title: About the service Resource +--- + +# service + +Use the `service` InSpec audit resource to test if the named service is installed, running and/or enabled. + +Under some circumstances, it may be necessary to specify the service manager by using one of the following service manager-specific resources: `bsd_service`, `launchd_service`, `runit_service`, `systemd_service`, `sysv_service`, oe `upstart_service`. These resources are based on the `service` resource. + +## Syntax + +A `service` resource block declares the name of a service and then one (or more) matchers to test the state of the service: + + describe service('service_name') do + it { should be_installed } + it { should be_enabled } + it { should be_running } + end + +where + +* `('service_name')` must specify a service name +* `be_installed`, `be_enabled`, and `be_running` are valid matchers for this resource + + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### be_enabled + +The `be_enabled` matcher tests if the named service is enabled: + + it { should be_enabled } + +### be_installed + +The `be_installed` matcher tests if the named service is installed: + + it { should be_installed } + +### be_running + +The `be_running` matcher tests if the named service is running: + + it { should be_running } + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test if the postgresql service is both running and enabled + + describe service('postgresql') do + it { should be_enabled } + it { should be_running } + end + +### Test if the mysql service is both running and enabled + + describe service('mysqld') do + it { should be_enabled } + it { should be_running } + end + +### Test if ClamAV (an antivirus engine) is installed and running + + describe package('clamav') do + it { should be_installed } + its('version') { should eq '0.98.7' } + end + + describe service('clamd') do + it { should_not be_enabled } + it { should_not be_installed } + it { should_not be_running } + end + +### Test Unix System V run levels + +On targets that are using SystemV services, the existing run levels can also be checked: + + describe service('sshd').runlevels do + its('keys') { should include(2) } + end + + describe service('sshd').runlevels(2,4) do + it { should be_enabled } + end + +### Override the service manager + +Under some circumstances, it may be required to override the logic in place to select the right service manager. For example, to check a service managed by Upstart: + + describe upstart_service('service') do + it { should_not be_enabled } + it { should be_installed } + it { should be_running } + end + +This is also possible with `systemd_service`, `runit_service`, `sysv_service`, `bsd_service`, and `launchd_service`. Provide the control command when it is not to be found at the default location. For example, if the `sv` command for services managed by runit is not in the `PATH`: + + describe runit_service('service', '/opt/chef/embedded/sbin/sv') do + it { should be_enabled } + it { should be_installed } + it { should be_running } + end + +### Verify that IIS is running + + describe service('W3SVC') do + it { should be_installed } + it { should be_running } + end diff --git a/docs/resources/ssh_config.md.erb b/docs/resources/ssh_config.md.erb new file mode 100644 index 000000000..21f8e0581 --- /dev/null +++ b/docs/resources/ssh_config.md.erb @@ -0,0 +1,94 @@ +--- +title: About the ssh_config Resource +--- + +# ssh_config + +Use the `ssh_config` InSpec audit resource to test OpenSSH client configuration data located at `/etc/ssh/ssh_config` on Linux and Unix platforms. + +## Syntax + +An `ssh_config` resource block declares the client OpenSSH configuration data to be tested: + + describe ssh_config('path') do + its('name') { should include('foo') } + end + +where + +* `name` is a configuration setting in `ssh_config` +* `('path')` is the non-default `/path/to/ssh_config` +* `{ should include('foo') }` tests the value of `name` as read from `ssh_config` versus the value declared in the test + + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +### name + +The `name` matcher tests the value of `name` as read from `ssh_config` versus the value declared in the test: + + its('name') { should eq 'foo' } + +or: + + its('name') { should include('bar') } + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test SSH configuration settings + + describe ssh_config do + its('cipher') { should contain '3des' } + its('port') { should eq '22' } + its('hostname') { should include('example.com') } + end + +### Test which variables from the local environment are sent to the server + + only_if do + command('sshd').exist? or command('ssh').exists? + end + + describe ssh_config do + its('SendEnv') { should include('GORDON_CLIENT') } + end + +### Test owner and group permissions + + describe ssh_config do + its('owner') { should eq 'root' } + its('mode') { should cmp '0644' } + end + +### Test SSH configuration + + describe ssh_config do + its('Host') { should eq '*' } + its('Tunnel') { should eq nil } + its('SendEnv') { should eq 'LANG LC_*' } + its('HashKnownHosts') { should eq 'yes' } + end diff --git a/docs/resources/sshd_config.md.erb b/docs/resources/sshd_config.md.erb new file mode 100644 index 000000000..e44ea31eb --- /dev/null +++ b/docs/resources/sshd_config.md.erb @@ -0,0 +1,97 @@ +--- +title: About the sshd_config Resource +--- + +# sshd_config + +Use the `sshd_config` InSpec audit resource to test configuration data for the OpenSSH daemon located at `/etc/ssh/sshd_config` on Linux and Unix platforms. sshd---the OpenSSH daemon---listens on dedicated ports, starts a daemon for each incoming connection, and then handles encryption, authentication, key exchanges, command executation, and data exchanges. + +## Syntax + +An `sshd_config` resource block declares the client OpenSSH configuration data to be tested: + + describe sshd_config('path') do + its('name') { should include('foo') } + end + +where + +* `name` is a configuration setting in `sshd_config` +* `('path')` is the non-default `/path/to/sshd_config` +* `{ should include('foo') }` tests the value of `name` as read from `sshd_config` versus the value declared in the test + + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +### name + +The `name` matcher tests the value of `name` as read from `sshd_config` versus the value declared in the test: + + its('name') { should cmp 'foo' } + +or: + + its('name') {should include('bar') } + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test which variables may be sent to the server + + describe sshd_config do + its('AcceptEnv') { should include('GORDON_SERVER') } + end + +### Test for IPv6-only addresses + + describe sshd_config do + its('AddressFamily') { should cmp 'inet6' } + end + +### Test the Protocol setting + + describe sshd_config do + its('Protocol') { should cmp 2 } + end + +### Test for approved, strong ciphers + + describe sshd_config do + its('Ciphers') { should cmp('chacha20-poly1305@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr') } + end + +### Test SSH protocols + + describe sshd_config do + its('Port') { should cmp 22 } + its('UsePAM') { should eq 'yes' } + its('ListenAddress') { should eq nil } + its('HostKey') { should eq [ + '/etc/ssh/ssh_host_rsa_key', + '/etc/ssh/ssh_host_dsa_key', + '/etc/ssh/ssh_host_ecdsa_key', + ] } + end diff --git a/docs/resources/ssl.md.erb b/docs/resources/ssl.md.erb new file mode 100644 index 000000000..b6f938cba --- /dev/null +++ b/docs/resources/ssl.md.erb @@ -0,0 +1,133 @@ +--- +title: About the ssl Resource +--- + +# ssl + +Use the `ssl` InSpec audit resource to test SSL settings for the named port. + +## Syntax + +An `ssl` resource block declares an SSL port, and then other properties of the test like cipher and/or protocol: + + describe ssl(port: #) do + it { should be_enabled } + end + +or: + + describe ssl(port: #).filter('value') do + it { should be_enabled } + end + +where + +* `ssl(port: #)` is the port number, such as `ssl(port: 443)` +* `filter` may take any of the following arguments: `ciphers`, `protocols`, and `handshake` + + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### be_enabled + +The `be_enabled` matcher tests if SSL is enabled: + + it { should be_enabled } + +### ciphers + +The `ciphers` matcher tests the named cipher: + + its('ciphers') { should_not eq '/rc4/i' } + +or: + + describe ssl(port: 443).ciphers(/rc4/i) do + it { should_not be_enabled } + end + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +### protocols + +The `protocols` matcher tests the number of times the named user appears in `/etc/shadow`: + + its('protocols') { should eq 'ssl2' } + +or: + + describe ssl(port: 443).protocols('ssl2') do + it { should_not be_enabled } + end + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Run the ssl-benchmark example profile + +The following shows how to use the `ssl` InSpec audit resource to find all TCP ports on the system, including IPv4 and IPv6. (This is a partial example based on the `ssl_text.rb` file in the `ssl-benchmark` profile on GitHub.) + + ... + + control 'tls1.2' do + title 'Run TLS 1.2 whenever SSL is active on a port' + impact 0.5 + + sslports.each do |socket| + proc_desc = "on node == #{command('hostname').stdout.strip} running #{socket.process.inspect} (#{socket.pid})" + describe ssl(port: socket.port).protocols('tls1.2') do + it(proc_desc) { should be_enabled } + it { should be_enabled } + end + end + end + + ... + + control 'rc4' do + title 'Disable RC4 ciphers from all exposed SSL/TLS ports and versions.' + impact 0.5 + + sslports.each do |socket| + proc_desc = "on node == #{command('hostname').stdout.strip} running #{socket.process.inspect} (#{socket.pid})" + describe ssl(port: socket.port).ciphers(/rc4/i) do + it(proc_desc) { should_not be_enabled } + it { should_not be_enabled } + end + end + end + +There are two ways to run the `ssl-benchmark` example profile to test SSL via the `ssl` resource. + +Clone the profile: + + $ git clone https://github.com/dev-sec/ssl-benchmark + +and then run: + + $ inspec exec ssl-benchmark + +Or execute the profile directly via URL: + + $ inspec exec https://github.com/dev-sec/ssl-benchmark diff --git a/docs/resources/sys_info.md.erb b/docs/resources/sys_info.md.erb new file mode 100644 index 000000000..728efa7e0 --- /dev/null +++ b/docs/resources/sys_info.md.erb @@ -0,0 +1,55 @@ +--- +title: About the sys_info Resource +--- + +# sys_info + +Use the `sys_info` InSpec audit resource to test for operating system properties for the named host, and then returns that info as standard output. + +## Syntax + +An `sys_info` resource block declares the hostname to be tested: + + describe sys_info do + its('hostname') { should eq 'value' } + end + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### hostname + +The `hostname` matcher tests the host for which standard output is returned: + + its('hostname') { should eq 'value' } + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Get system information for example.com + + describe sys_info do + its('hostname') { should eq 'example.com' } + end diff --git a/docs/resources/systemd_service.md.erb b/docs/resources/systemd_service.md.erb new file mode 100644 index 000000000..2d260ce85 --- /dev/null +++ b/docs/resources/systemd_service.md.erb @@ -0,0 +1,76 @@ +--- +title: About the systemd_service Resource +--- + +# systemd_service + +Use the `systemd_service` InSpec audit resource to test a service using SystemD. + +## Syntax + +A `systemd_service` resource block declares the name of a service and then one (or more) matchers to test the state of the service: + + describe systemd_service('service_name') do + it { should be_installed } + it { should be_enabled } + it { should be_running } + end + +where + +* `('service_name')` must specify a service name +* `be_installed`, `be_enabled`, and `be_running` are valid matchers for this resource; all matchers available to the `service` resource may be used + +The path to the service manager's control may be specified for situations where the path isn't available in the current `PATH`. For example: + + describe systemd_service('service_name', '/path/to/control') do + it { should be_enabled } + it { should be_installed } + it { should be_running } + end + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### be_enabled + +The `be_enabled` matcher tests if the named service is enabled: + + it { should be_enabled } + +### be_installed + +The `be_installed` matcher tests if the named service is installed: + + it { should be_installed } + +### be_running + +The `be_running` matcher tests if the named service is running: + + it { should be_running } + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +## Examples + +None. diff --git a/docs/resources/sysv_service.md.erb b/docs/resources/sysv_service.md.erb new file mode 100644 index 000000000..0812e7183 --- /dev/null +++ b/docs/resources/sysv_service.md.erb @@ -0,0 +1,76 @@ +--- +title: About the sysv_service Resource +--- + +# sysv_service + +Use the `sysv_service` InSpec audit resource to test a service using SystemV. + +## Syntax + +A `sysv_service` resource block declares the name of a service and then one (or more) matchers to test the state of the service: + + describe sysv_service('service_name') do + it { should be_installed } + it { should be_enabled } + it { should be_running } + end + +where + +* `('service_name')` must specify a service name +* `be_installed`, `be_enabled`, and `be_running` are valid matchers for this resource; all matchers available to the `service` resource may be used + +The path to the service manager's control may be specified for situations where the path isn't available in the current `PATH`. For example: + + describe sysv_service('service_name', '/path/to/control') do + it { should be_enabled } + it { should be_installed } + it { should be_running } + end + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### be_enabled + +The `be_enabled` matcher tests if the named service is enabled: + + it { should be_enabled } + +### be_installed + +The `be_installed` matcher tests if the named service is installed: + + it { should be_installed } + +### be_running + +The `be_running` matcher tests if the named service is running: + + it { should be_running } + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +## Examples + +None. diff --git a/docs/resources/upstart_service.md.erb b/docs/resources/upstart_service.md.erb new file mode 100644 index 000000000..8b2142c25 --- /dev/null +++ b/docs/resources/upstart_service.md.erb @@ -0,0 +1,76 @@ +--- +title: About the upstart_service Resource +--- + +# upstart_service + +Use the `upstart_service` InSpec audit resource to test a service using Upstart. + +## Syntax + +An `upstart_service` resource block declares the name of a service and then one (or more) matchers to test the state of the service: + + describe upstart_service('service_name') do + it { should be_installed } + it { should be_enabled } + it { should be_running } + end + +where + +* `('service_name')` must specify a service name +* `be_installed`, `be_enabled`, and `be_running` are valid matchers for this resource; all matchers available to the `service` resource may be used + +The path to the service manager's control may be specified for situations where the path isn't available in the current `PATH`. For example: + + describe upstart_service('service_name', '/path/to/control') do + it { should be_enabled } + it { should be_installed } + it { should be_running } + end + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### be_enabled + +The `be_enabled` matcher tests if the named service is enabled: + + it { should be_enabled } + +### be_installed + +The `be_installed` matcher tests if the named service is installed: + + it { should be_installed } + +### be_running + +The `be_running` matcher tests if the named service is running: + + it { should be_running } + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +## Examples + +None. diff --git a/docs/resources/user.md.erb b/docs/resources/user.md.erb new file mode 100644 index 000000000..20865b666 --- /dev/null +++ b/docs/resources/user.md.erb @@ -0,0 +1,154 @@ +--- +title: About the user Resource +--- + +# user + +Use the `user` InSpec audit resource to test user profiles for a single, known/expected local user, including the groups to which that user belongs, the frequency of required password changes, and the directory paths to home and shell. + +## Syntax + +A `user` resource block declares a user name, and then one (or more) matchers: + + describe user('root') do + it { should exist } + its('uid') { should eq 1234 } + its('gid') { should eq 1234 } + its('group') { should eq 'root' } + its('groups') { should eq ['root', 'other']} + its('home') { should eq '/root' } + its('shell') { should eq '/bin/bash' } + its('mindays') { should eq 0 } + its('maxdays') { should eq 90 } + its('warndays') { should eq 8 } + end + +where + +* `('root')` is the user to be tested +* `it { should exist }` tests if the user exists +* `gid`, `group`, `groups`, `home`, `maxdays`, `mindays`, `shell`, `uid`, and `warndays` are valid matchers for this resource + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### exist + +The `exist` matcher tests if the named user exists: + + it { should exist } + +### gid + +The `gid` matcher tests the group identifier: + + its('gid') { should eq 1234 } } + +where `1234` represents the user identifier. + +### group + +The `group` matcher tests the group to which the user belongs: + + its('group') { should eq 'root' } + +where `root` represents the group. + +### groups + +The `groups` matcher tests two (or more) groups to which the user belongs: + + its('groups') { should eq ['root', 'other']} + +### home + +The `home` matcher tests the home directory path for the user: + + its('home') { should eq '/root' } + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +### maxdays + +The `maxdays` matcher tests the maximum number of days between password changes: + + its('maxdays') { should eq 99 } + +where `99` represents the maximum number of days. + +### mindays + +The `mindays` matcher tests the minimum number of days between password changes: + + its('mindays') { should eq 0 } + +where `0` represents the maximum number of days. + +### shell + +The `shell` matcher tests the path to the default shell for the user: + + its('shell') { should eq '/bin/bash' } + +### uid + +The `uid` matcher tests the user identifier: + + its('uid') { should eq 1234 } } + +where `1234` represents the user identifier. + +### warndays + +The `warndays` matcher tests the number of days a user is warned before a password must be changed: + + its('warndays') { should eq 5 } + +where `5` represents the number of days a user is warned. + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Verify available users for the MySQL server + + describe user('root') do + it { should exist } + it { should belong_to_group 'root' } + its('uid') { should eq 0 } + its('groups') { should eq ['root'] } + end + + describe user('mysql') do + it { should_not exist } + end + +### Test users on multiple platforms + +The `nginx` user is typically `www-data`, but on CentOS it's `nginx`. The following example shows how to test for the `nginx` user with a single test, but accounting for all platforms: + + web_user = 'www-data' + web_user = 'nginx' if os[:family] == 'centos' + + describe user(web_user) do + it { should exist } + end diff --git a/docs/resources/users.md.erb b/docs/resources/users.md.erb new file mode 100644 index 000000000..2f9c4ffa3 --- /dev/null +++ b/docs/resources/users.md.erb @@ -0,0 +1,140 @@ +--- +title: About the users Resource +--- + +# users + +Use the `users` InSpec audit resource to look up all local users available on the system, and then test specific properties of those users. This resource does not return information about users that may be located on other systems, such as LDAP or Active Directory. + +## Syntax + +A `users` resource block declares a user name, and then one (or more) matchers: + + describe users.where(uid: 0).entries do + it { should eq ['root'] } + its('uids') { should eq [1234] } + its('gids') { should eq [1234] } + end + +where + +* `gid`, `group`, `groups`, `home`, `maxdays`, `mindays`, `shell`, `uid`, and `warndays` are valid matchers for this resource +* `where(uid: 0).entries` represents a filter that runs the test only against matching users + +For example: + + describe users.where { username =~ /.*/ } do + it { should exist } + end + +or: + + describe users.where { uid =~ /^S-1-5-[0-9-]+-501$/ } do + it { should exist } + end + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### exist + +The `exist` matcher tests if the named user exists: + + it { should exist } + +### gid + +The `gid` matcher tests the group identifier: + + its('gid') { should eq 1234 } } + +where `1234` represents the user identifier. + +### group + +The `group` matcher tests the group to which the user belongs: + + its('group') { should eq 'root' } + +where `root` represents the group. + +### groups + +The `groups` matcher tests two (or more) groups to which the user belongs: + + its('groups') { should eq ['root', 'other']} + +### home + +The `home` matcher tests the home directory path for the user: + + its('home') { should eq '/root' } + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +### maxdays + +The `maxdays` matcher tests the maximum number of days between password changes: + + its('maxdays') { should eq 99 } + +where `99` represents the maximum number of days. + +### mindays + +The `mindays` matcher tests the minimum number of days between password changes: + + its('mindays') { should eq 0 } + +where `0` represents the maximum number of days. + +### shell + +The `shell` matcher tests the path to the default shell for the user: + + its('shell') { should eq '/bin/bash' } + +### uid + +The `uid` matcher tests the user identifier: + + its('uid') { should eq 1234 } } + +where `1234` represents the user identifier. + +### warndays + +The `warndays` matcher tests the number of days a user is warned before a password must be changed: + + its('warndays') { should eq 5 } + +where `5` represents the number of days a user is warned. + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Use a regular expression to find users + + describe users.where { uid =~ /S\-1\-5\-21\-\d+\-\d+\-\d+\-500/ } do + it { should exist } + end diff --git a/docs/resources/vbscript.md.erb b/docs/resources/vbscript.md.erb new file mode 100644 index 000000000..9c39af054 --- /dev/null +++ b/docs/resources/vbscript.md.erb @@ -0,0 +1,69 @@ +--- +title: About the vbscript Resource +--- + +# vbscript + +Use the `vbscript` InSpec audit resource to test a VBScript on the Windows platform. + +## Syntax + +A `vbscript` resource block tests the output of a VBScript on the Windows platform: + + describe vbscript('script_name') do + its('stdout') { should eq 'output' } + end + +where + +* `'script_name'` is the name of the VBScript to test +* `('output')` is the expected output of the VBScript + + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test a VBScript + +A VBScript file similar to: + + vbscript = <<-EOH + WScript.Echo "hello" + EOH + +may be tested for multiple lines: + + describe vbscript(vbscript) do + its('stdout') { should eq "hello\r\n" } + end + +and tested for whitespace removal from standard output: + + describe vbscript(vbscript) do + its('strip') { should eq "hello" } + end diff --git a/docs/resources/windows_feature.md.erb b/docs/resources/windows_feature.md.erb new file mode 100644 index 000000000..523d451dc --- /dev/null +++ b/docs/resources/windows_feature.md.erb @@ -0,0 +1,61 @@ +--- +title: About the windows_feature Resource +--- + +# windows_feature + +Use the `windows_feature` InSpec audit resource to test features on Windows via the `Get-WindowsFeature` cmdlet. + +## Syntax + +A `windows_feature` resource block declares the name of the Windows feature, tests if that feature is installed, and then returns information about that feature: + + describe windows_feature('feature_name') do + it { should be_installed } + end + +where + +* `('feature_name')` must specify a Windows feature name, such as `DHCP Server` or `IIS-Webserver` +* `be_installed` is a valid matcher for this resource + + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### be_installed + +The `be_installed` matcher tests if the named Windows feature is installed: + + it { should be_installed } + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test the DHCP Server feature + + describe windows_feature('DHCP Server') do + it{ should be_installed } + end diff --git a/docs/resources/wmi.md.erb b/docs/resources/wmi.md.erb new file mode 100644 index 000000000..1bd265486 --- /dev/null +++ b/docs/resources/wmi.md.erb @@ -0,0 +1,95 @@ +--- +title: About the wmi Resource +--- + +# wmi + +Use the `wmi` InSpec audit resource to test WMI settings on the Windows platform. + +## Syntax + +A `wmi` resource block tests WMI settings on the Windows platform: + + describe wmi({ + class: 'class_name' + namespace: 'path\\to\\setting' + filter: 'filter' + query: 'query' + }) do + its('setting_name') { should eq '' } + end + +where + +* `class`, `namespace`, `filter`, and `query` comprise a Ruby Hash of the WMI object +* `('class')` is the WMI class to which the setting belongs, such as `win32_service` +* `('namespace')` is path to that object, such as `root\\cimv2` +* Use `('filter')` fine-tune the information defined by the WMI class, such as to find a specific service (`filter: "name like '%winrm%'")`, to find a specific setting (`filter: 'KeyName = \'MinimumPasswordAge\' And precedence=1'`), and so on +* Use `('query')` to run a query that returns data to be tested, such as `"SELECT Setting FROM RSOP_SecuritySettingBoolean WHERE KeyName='LSAAnonymousNameLookup' AND Precedence=1"` +* `('setting_name')` is a setting in the WMI object to be tested, and then `should eq ''` is the expected value for that setting + +For example, both of the following tests will verify if WinRM is present on the target node. The first tests if WinRM belongs to the list of services running under the `win32_service` class: + + describe wmi({class: 'win32_service'}) do + its('DisplayName') { should include 'Windows Remote Management (WS-Management)'} + end + +and the second uses a filter in the Ruby Hash to first identify WinRM, and then perform additional tests: + + describe wmi({ + class: 'win32_service', + filter: "name like '%winrm%'" + }) do + its('Status') { should cmp 'ok' } + its('State') { should cmp 'Running' } + its('ExitCode') { should cmp 0 } + its('DisplayName') { should eq 'Windows Remote Management (WS-Management)'} + end + + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test a password expiration policy + + describe wmi({ + class: 'RSOP_SecuritySettingNumeric', + namespace: 'root\\rsop\\computer', + filter: 'KeyName = \'MinimumPasswordAge\' And precedence=1' + }) do + its('Setting') { should eq 1 } + end + +### Test if an anonymous user can query the Local Security Authority (LSA) + + describe wmi({ + namespace: 'root\rsop\computer', + query: "SELECT Setting FROM RSOP_SecuritySettingBoolean WHERE KeyName='LSAAnonymousNameLookup' AND Precedence=1" + }) do + its('Setting') { should eq false } + end diff --git a/docs/resources/xinetd_conf.md.erb b/docs/resources/xinetd_conf.md.erb new file mode 100644 index 000000000..8eaa96ef8 --- /dev/null +++ b/docs/resources/xinetd_conf.md.erb @@ -0,0 +1,170 @@ +--- +title: About the xinetd_conf Resource +--- + +# xinetd_conf + +Use the `xinetd_conf` InSpec audit resource to test services under `/etc/xinet.d` on Linux and Unix platforms. xinetd---the extended Internet service daemon---listens on all ports, and then loads the appropriate program based on a request. The `xinetd.conf` file is typically located at `/etc/xinetd.conf` and contains a list of Internet services associated to the ports on which that service will listen. Only enabled services may handle a request; only services that are required by the system should be enabled. + +## Syntax + +An `xinetd_conf` resource block declares settings found in a `xinetd.conf` file for the named service: + + describe xinetd_conf('service_name') do + it { should be_enabled } # or be_disabled + its('setting') { should eq 'value' } + end + +where + +* `'service_name'` is a service located under `/etc/xinet.d` +* `('setting')` is a setting in the `xinetd.conf` file +* `should eq 'value'` is the value that is expected + + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### be_enabed + +The `be_enabled` matcher tests if a service listed under `/etc/xinet.d` is enabled: + + it { should be_enabled } + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### ids + +The `ids` matcher tests if the named service is located under `/etc/xinet.d`: + + its('ids') { should include 'service_name' } + +For example: + + its('ids') { should include 'chargen-stream chargen-dgram'} + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +### services + +The `services` matcher tests if the named service is listed under `/etc/xinet.d`: + + its('services') { should include 'service_name' } + +### socket_types + +The `socket_types` matcher tests if a service listed under `/etc/xinet.d` is configured to use the named socket type: + + its('socket_types') { should eq 'socket' } + +where `socket` is one of `dgram`, `raw`, or `stream`. For a UDP-based service: + + its('socket_types') { should eq 'dgram' } + +For a raw socket (such as a service using a non-standard protocol or a service that requires direct access to IP): + + its('socket_types') { should eq 'raw' } + +For a TCP-based service: + + its('socket_types') { should eq 'stream' } + +### types + +The `types` matcher tests the service type: + + its('type') { should eq 'TYPE' } + +where `'TYPE'` is `INTERNAL` (for a service provided by xinetd), `RPC` (for a service based on remote procedure call), or `UNLISTED` (for services not under `/etc/services` or `/etc/rpc`). + +### wait + +The `wait` matcher tests how a service handles incoming connections. + +For UDP (`dgram`) socket types the `wait` matcher should test for `yes`: + + its('socket_types') { should eq 'dgram' } + its('wait') { should eq 'yes' } + +For TCP (`stream`) socket types the `wait` matcher should test for `no`: + + its('socket_types') { should eq 'stream' } + its('wait') { should eq 'no' } + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test a socket_type + +The network socket type: `dgram` (a datagram-based service), `raw` (a service that requires direct access to an IP address), `stream` (a stream-based service), or `seqpacket` (a service that requires a sequenced packet). + + describe xinetd_conf.services('service_name') do + its('socket_types') { should include 'dgram' } + end + +### Test a service type + +The type of service: `INTERNAL` (a service provided by xinetd), `RPC` (an RPC-based service), `TCPMUX` (a service that is started on a well-known TPCMUX port), or `UNLISTED` (a service that is not listed in a standard system file location). + + describe xinetd_conf.services('service_name') do + its('type') { should include 'RPC' } + end + +### Test the telnet service + +For example, a `telnet` file under `/etc/xinet.d` contains the following settings: + + service telnet + { + disable = yes + flags = REUSE + socket_type = stream + wait = no + user = root + server = /usr/sbin/in.telnetd + log_on_failure += USERID + } + +Some examples of tests that can be run against that file include: + + describe xinetd_conf.services('telnet') do + it { should be_disabled } + end + +and + + describe xinetd_conf.services('telnet') do + its('socket_type') { should include 'stream' } + end + +and + + describe xinetd_conf.services('telnet') do + its('wait') { should eq 'no' } + end + +All three settings can be tested in the same block as well: + + describe xinetd_conf.services('telnet') do + it { should be_disabled } + its('socket_type') { should include 'stream' } + its('wait') { should eq 'no' } + end diff --git a/docs/resources/yaml.md.erb b/docs/resources/yaml.md.erb new file mode 100644 index 000000000..2bc79c84c --- /dev/null +++ b/docs/resources/yaml.md.erb @@ -0,0 +1,69 @@ +--- +title: About the yaml Resource +--- + +# yaml + +Use the `yaml` InSpec audit resource to test configuration data in a Yaml file. + +## Syntax + +A `yaml` resource block declares the configuration data to be tested. Assume the following Yaml file: + + name: foo + array: + - zero + - one + +This file can be queried using: + + describe yaml do + its('name') { should eq 'foo' } + its(['array', 1]) { should eq 'one' } + end + +where + +* `name` is a configuration setting in a Yaml file +* `should eq 'foo'` tests a value of `name` as read from a Yaml file versus the value declared in the test + + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +### name + +The `name` matcher tests the value of `name` as read from a Yaml file versus the value declared in the test: + + its('name') { should eq 'foo' } + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test a kitchen.yml file driver + + describe yaml('.kitchen.yaml') do + its('driver.name') { should eq('vagrant') } + end diff --git a/docs/resources/yum.md.erb b/docs/resources/yum.md.erb new file mode 100644 index 000000000..2f7fc4ccf --- /dev/null +++ b/docs/resources/yum.md.erb @@ -0,0 +1,103 @@ +--- +title: About the yum Resource +--- + +# yum + +Use the `yum` InSpec audit resource to test packages in the Yum repository. + +## Syntax + +A `yum` resource block declares a package repo, tests if the package repository is present, and if it that package repository is a valid package source (i.e. "is enabled"): + + describe yum.repo('name') do + it { should exist } + it { should be_enabled } + end + +where + +* `repo('name')` is the (optional) name of a package repo, using either a full identifier (`'updates/7/x86_64'`) or a short identifier (`'updates'`) + +## Matchers + +This InSpec audit resource has the following matchers: + +### be + +<%= partial "/shared/matcher_be" %> + +### be_enabled + +The `be_enabled` matcher tests if the package repository is a valid package source: + + it { should be_enabled } + +### cmp + +<%= partial "/shared/matcher_cmp" %> + +### eq + +<%= partial "/shared/matcher_eq" %> + +### exist + +The `exist` matcher tests if the package repository exists: + + it { should exist } + +### include + +<%= partial "/shared/matcher_include" %> + +### match + +<%= partial "/shared/matcher_match" %> + +### repo('name') + +The `repo('name')` matcher names a specific package repository: + + describe yum.repo('epel') do + ... + end + +### repos + +The `repos` matcher tests if a named repo, using either a full identifier (`'updates/7/x86_64'`) or a short identifier (`'updates'`), is included in the Yum repo: + + its('repos') { should include 'some_repo' } + +### shortname + +The `shortname` matcher names a specific package repository's group identifier. For example, if a repository's group name is "Directory Server", the corresponding group idenfier is typically "directory-server": + + describe yum.repo('Directory Server') do + its('shortname') { should eq 'directory-server' } + end + +## Examples + +The following examples show how to use this InSpec audit resource. + +### Test if the yum repo exists + + describe yum do + its('repos') { should exist } + end + +### Test if the 'base/7/x86_64' repo exists and is enabled + + describe yum do + its('repos') { should include 'base/7/x86_64' } + its('epel') { should exist } + its('epel') { should be_enabled } + end + +### Test if a specific yum repo exists + + describe yum.repo('epel') do + it { should exist } + it { should be_enabled } + end diff --git a/docs/ruby_usage.md b/docs/ruby_usage.md new file mode 100644 index 000000000..828ac0a3f --- /dev/null +++ b/docs/ruby_usage.md @@ -0,0 +1,154 @@ +# Using Ruby in InSpec + +The InSpec DSL is a Ruby based DSL for writing audit controls, which +includes audit resources that you can invoke. Core and custom resources +are written as regular Ruby classes which inherit from +`Inspec.resource`. + +Assuming we have a JSON file like this on the node to be tested: + +```json +{ + "keys":[ + {"username":"john", "key":"/opt/keys/johnd.key"}, + {"username":"jane", "key":"/opt/keys/janed.key"}, + {"username":"sunny ", "key":"/opt/keys/sunnym.key"} + ] +} +``` + +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: + +```ruby +control 'check-interns' do + # use the json inspec resource to get the file + json_obj = json('/opt/keys/interns.json') + describe json_obj do + its('keys') { should_not eq nil } + end + if json_obj['keys'] + # loop over the keys array + json_obj['keys'].each do |intern| + username = intern['username'].strip + # check for white spaces chars in usernames + describe username do + it { should_not match(/\s/) } + end + # check key file owners and permissions + describe file(intern['key']) do + it { should be_owned_by username } + its('mode') { should cmp '0600' } + end + end + end +end +``` + +## Execution + +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). + +For example, using `` `ls ``\` or `system('ls')` will result in the `ls` +command being run locally and not on the target(remote) system. In order +to process the output of `ls` executed on the target system, use +`inspec.command('ls')` or `inspec.powershell('ls')` + +Similarly, use `inspec.file(PATH)` to access files or directories from +remote systems in your tests or custom resources. + + +## Using rubygems + +Ruby gems are self-contained programs and libraries. If you create a custom +resource please vendor gems into the library. This ensures that all resources +are self-contained and complete and don't need any resolution at runtime. We +vendor resources and requirements through dependency resolution, which is +independent of programming languages and their resolver mechanisms. + +## Interactive Debugging with Pry + +Here's a sample InSpec control that users Ruby variables to instantiate +an InSpec resource once and use the content in multipLe tests. + +```ruby +control 'check-perl' do + impact 0.3 + title 'Check perl compiled options and permissions' + perl_out = command('perl -V') + #require 'pry'; binding.pry; + describe perl_out do + its('exit_status') { should eq 0 } + its('stdout') { should match (/USE_64_BIT_ALL/) } + its('stdout') { should match (/useposix=true/) } + its('stdout') { should match (/-fstack-protector/) } + end + + # extract an array of include directories + perl_inc = perl_out.stdout.partition('@INC:').last.strip.split("\n") + # ensure include directories are only writable by 'owner' + perl_inc.each do |path| + describe directory(path.strip) do + it { should_not be_writable.by('group') } + it { should_not be_writable.by('other') } + end + end +end +``` + +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: + +```ruby +[1] pry> perl_out.exit_status +=> 0 +[2] pry> perl_out.stderr +=> "" +[3] pry> ls perl_out +Inspec::Plugins::Resource#methods: inspect +Inspec::Resources::Cmd#methods: command exist? exit_status result stderr stdout to_s +Inspec::Plugins::ResourceCommon#methods: resource_skipped skip_resource +Inspec::Resource::Registry::Command#methods: inspec +instance variables: @__backend_runner__ @__resource_name__ @command @result +[4] pry> perl_out.stdout.partition('@INC:').last.strip.split("\n") +=> ["/Library/Perl/5.18/darwin-thread-multi-2level", + " /Library/Perl/5.18", +...REDACTED... +[5] pry> exit # or abort +``` + +You can use `pry` inside both the controls DSL and resources. Similarly, +for dev and test, you can use `inspec shell` which is based on `pry`, +for example: + +```ruby +$ inspec shell +Welcome to the interactive InSpec Shell +To find out how to use it, type: help + +inspec> command('ls /home/gordon/git/inspec/docs').stdout +=> "ctl_inspec.rst\ndsl_inspec.rst\ndsl_resource.rst\n" +inspec> command('ls').stdout.split("\n") +=> ["ctl_inspec.rst", "dsl_inspec.rst", "dsl_resource.rst"] + +inspec> help command +Name: command + +Description: +Use the command InSpec audit resource to test an arbitrary command that is run on the system. + +Example: +describe command('ls -al /') do + it { should exist } + its('stdout') { should match /bin/ } + its('stderr') { should eq '' } + its('exit_status') { should eq 0 } +end +``` diff --git a/docs/ruby_usage.rst b/docs/ruby_usage.rst deleted file mode 100644 index 5d33a5a2b..000000000 --- a/docs/ruby_usage.rst +++ /dev/null @@ -1,145 +0,0 @@ -===================================================== -Using |ruby| in InSpec -===================================================== - -The |inspec| DSL is a |ruby| based DSL for writing audit controls, which includes audit resources that you can invoke. -Core and custom resources are written as regular |ruby| classes which inherit from ``Inspec.resource``. - -Assuming we have a |json| file like this on the node to be tested: - -.. code-block:: json - - { - "keys":[ - {"username":"john", "key":"/opt/keys/johnd.key"}, - {"username":"jane", "key":"/opt/keys/janed.key"}, - {"username":"sunny ", "key":"/opt/keys/sunnym.key"} - ] - } - -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: - -.. code-block:: ruby - - control 'check-interns' do - # use the json inspec resource to get the file - json_obj = json('/opt/keys/interns.json') - describe json_obj do - its('keys') { should_not eq nil } - end - if json_obj['keys'] - # loop over the keys array - json_obj['keys'].each do |intern| - username = intern['username'].strip - # check for white spaces chars in usernames - describe username do - it { should_not match(/\s/) } - end - # check key file owners and permissions - describe file(intern['key']) do - it { should be_owned_by username } - its('mode') { should eq 0600 } - end - end - end - end - -Execution -===================================================== - -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). - -For example, using ```ls``` or ``system('ls')`` will result in the ``ls`` command being run locally and not on the target(remote) system. -In order to process the output of ``ls`` executed on the target system, use ``inspec.command('ls')`` or ``inspec.powershell('ls')`` - -Similarly, use ``inspec.file(PATH)`` to access files or directories from remote systems in your tests or custom resources. - -Using rubygems -===================================================== - -|ruby| gems are self-contained programs and libraries ... - - -Interactive Debugging with Pry -===================================================== - -Here's a sample |inspec| control that users |ruby| variables to instantiate an |inspec| resource once and use the content in multipLe tests. - -.. code-block:: ruby - - control 'check-perl' do - impact 0.3 - title 'Check perl compiled options and permissions' - perl_out = command('perl -V') - #require 'pry'; binding.pry; - describe perl_out do - its('exit_status') { should eq 0 } - its('stdout') { should match (/USE_64_BIT_ALL/) } - its('stdout') { should match (/useposix=true/) } - its('stdout') { should match (/-fstack-protector/) } - end - - # extract an array of include directories - perl_inc = perl_out.stdout.partition('@INC:').last.strip.split("\n") - # ensure include directories are only writable by 'owner' - perl_inc.each do |path| - describe directory(path.strip) do - it { should_not be_writable.by('group') } - it { should_not be_writable.by('other') } - end - end - end - -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: - -.. code-block:: ruby - - [1] pry> perl_out.exit_status - => 0 - [2] pry> perl_out.stderr - => "" - [3] pry> ls perl_out - Inspec::Plugins::Resource#methods: inspect - Inspec::Resources::Cmd#methods: command exist? exit_status result stderr stdout to_s - Inspec::Plugins::ResourceCommon#methods: resource_skipped skip_resource - Inspec::Resource::Registry::Command#methods: inspec - instance variables: @__backend_runner__ @__resource_name__ @command @result - [4] pry> perl_out.stdout.partition('@INC:').last.strip.split("\n") - => ["/Library/Perl/5.18/darwin-thread-multi-2level", - " /Library/Perl/5.18", - ...REDACTED... - [5] pry> exit # or abort - -You can use ``pry`` inside both the controls DSL and resources. -Similarly, for dev and test, you can use ``inspec shell`` which is based on ``pry``, for example: - -.. code-block:: ruby - - $ inspec shell - Welcome to the interactive InSpec Shell - To find out how to use it, type: help - - inspec> command('ls /home/gordon/git/inspec/docs').stdout - => "ctl_inspec.rst\ndsl_inspec.rst\ndsl_resource.rst\n" - inspec> command('ls').stdout.split("\n") - => ["ctl_inspec.rst", "dsl_inspec.rst", "dsl_resource.rst"] - - inspec> help command - Name: command - - Description: - Use the command InSpec audit resource to test an arbitrary command that is run on the system. - - Example: - describe command('ls -al /') do - it { should exist } - its('stdout') { should match /bin/ } - its('stderr') { should eq '' } - its('exit_status') { should eq 0 } - end - -.. |inspec| replace:: InSpec -.. |chef compliance| replace:: Chef Compliance -.. |ruby| replace:: Ruby -.. |csv| replace:: CSV -.. |json| replace:: JSON diff --git a/docs/shared/matcher_be.md.erb b/docs/shared/matcher_be.md.erb new file mode 100644 index 000000000..6a443c412 --- /dev/null +++ b/docs/shared/matcher_be.md.erb @@ -0,0 +1 @@ +Use the `be` matcher to use a comparison operator---`=` (equal to), `>` (greater than), `<` (less than), `>=` (greater than or equal to), and `<=` (less than or equal to)---to compare two values: `its('value') { should be >= value }`, `its('value') { should be < value }`, and so on. diff --git a/docs/shared/matcher_cmp.md.erb b/docs/shared/matcher_cmp.md.erb new file mode 100644 index 000000000..6b3fcc64a --- /dev/null +++ b/docs/shared/matcher_cmp.md.erb @@ -0,0 +1,43 @@ +Use the `cmp` matcher compare two values, such as comparing strings to numbers, comparing a single value to an array of values, comparing an array of strings to a regular expression, improving the printing of octal values, and comparing while ignoring case sensitivity. + +Compare a single value to an array: + + describe some_resource do + its('users') { should cmp 'root' } + its('users') { should cmp ['root'] } + end + +Compare strings and regular expressions: + + describe some_resource do + its('setting') { should cmp /raw/i } + end + +Compare strings and numbers: + + describe some_resource do + its('setting') { should eq '2' } + end + +vs: + + describe some_resource do + its('setting') { should cmp '2' } + its('setting') { should cmp 2 } + end + +Ignoring case sensitivity: + + describe some_resource do + its('setting') { should cmp 'raw' } + its('setting') { should cmp 'RAW' } + end + +Printing octal values: + + describe some_resource('/proc/cpuinfo') do + its('mode') { should cmp '0345' } + end + + expected: 0345 + got: 0444 diff --git a/docs/shared/matcher_eq.md.erb b/docs/shared/matcher_eq.md.erb new file mode 100644 index 000000000..c037b3dad --- /dev/null +++ b/docs/shared/matcher_eq.md.erb @@ -0,0 +1,3 @@ +Use the `eq` matcher to test the equality of two values: `its('Port') { should eq '22' }`. + +Using `its('Port') { should eq 22 }` will fail because `22` is not a string value! Use the `cmp` matcher for less restrictive value comparisons. diff --git a/docs/shared/matcher_include.md.erb b/docs/shared/matcher_include.md.erb new file mode 100644 index 000000000..967052291 --- /dev/null +++ b/docs/shared/matcher_include.md.erb @@ -0,0 +1 @@ +Use the `include` matcher to verify that a string value is included in a list: `its('list') { should include 'string' }`. diff --git a/docs/shared/matcher_match.md.erb b/docs/shared/matcher_match.md.erb new file mode 100644 index 000000000..d61b3c515 --- /dev/null +++ b/docs/shared/matcher_match.md.erb @@ -0,0 +1 @@ +Use the `match` matcher to check if a string matches a regular expression: `its('string') { should_not match /regex/ }`. diff --git a/docs/shell.md b/docs/shell.md new file mode 100644 index 000000000..a3008abf0 --- /dev/null +++ b/docs/shell.md @@ -0,0 +1,150 @@ +--- +title: InSpec Shell +--- + +# InSpec Shell + +The InSpec interactive shell is a pry based REPL that can be used to +quickly run InSpec controls and tests without having to write it to a +file. Its functionality is similar to `chef shell` - it provides a way +to exercise the InSpec DSL, its resources, tests and plugins without +having to create a profile or write a test file. See +[http://pryrepl.org/](http://pryrepl.org/) for an introduction to what pry is and what it can +do. + +## Launching the shell + +If you are using InSpec from a platform-specific package (rpm, msi, +etc.) or from a chef prepared shell in ChefDK, you can directly launch +InSpec shell against your local machine using the following. See + for details. + +```bash +$ inspec shell +$ inspec help shell # This will describe inspec shell usage +``` + +If you wish to connect to a remote machine (called a target within +InSpec), you can use the `-t` flag. We support connecting using ssh, +WinRm and docker. If no target is provided, we implicitly support the +"local" target - i.e. tests running on the current machine running +InSpec. For an ssh connection, use `-i` for specifying ssh key files, +and the `--sudo*` commands for requesting a privelege escalation after +logging in. For a WinRM connection, use `--path` to change the login +path, `--ssl` to use SSL for transport layer encryption. + +```bash +$ inspec shell -t ssh://root@192.168.64.2:11022 # Login to remote machine using ssh as root. +$ inspec shell -t ssh://user@hostname:1234 -i /path/to/user_key # Login to hostname on port 1234 as user using given ssh key. +$ inspec shell -t winrm://UserName:Password@windowsmachine:1234 # Login to windowsmachine over WinRM as UserName. +$ inspec shell -t docker://container_id # Login to a docker container. +``` + +## Using Ruby in InSpec shell + +Since InSpec shell is pry based, you may treat the shell as an +interactive Ruby session. You may write Ruby expressions and evaluate +them. Source high-lighting, automatic indentation and command history +(using the up and down arrow keys) are available to make your experience +more delightful. You can exit the shell using `exit`. + +```bash +$ inspec shell +Welcome to the interactive InSpec Shell +To find out how to use it, type: help + +inspec> 1 + 2 +=> 3 +inspec> exit +``` + +## Using InSpec DSL in InSpec shell + +InSpec shell will automatically evaluate the result of every command as +if it were a test file. If you type in a Ruby command that is not an +InSpec control or test, the shell will evaluate it as if it were a +regular ruby command. + +Bare InSpec resources are instantiated and their help text is presented. +You may also access the resource contents or other matchers that they +define. Run `help ` to get more help on using a particular +resource or see the InSpec resources documentation online. + +```bash +$ inspec shell +Welcome to the interactive InSpec Shell +To find out how to use it, type: help + +inspec> file('/Users/ksubramanian').directory? +=> true +inspec> os_env('HOME') +=> Environment variable HOME +inspec> os_env('HOME').content +=> /Users/ksubramanian +inspec> exit +``` + +InSpec tests are immediately executed. + +```bash +inspec> describe file('/Users') # Empty test. +Summary: 0 successful, 0 failures, 0 skipped +inspec> describe file('/Users') do # Test with one check. +inspec> it { should exist } +inspec> end + ✔ File /Users should exist + +Summary: 1 successful, 0 failures, 0 skipped +``` + +All tests in a control are immediately executed as well. If a control is +redefined in the shell, the old control's tests are destroyed and +replaced with the redefinition and the control is re-run. + +```bash +inspec> control 'my_control' do +inspec> describe os_env('HOME') do +inspec> its('content') { should eq '/Users/ksubramanian' } +inspec> end +inspec> end + ✔ my_control: Environment variable HOME content should eq "/Users/ksubramanian" + + Summary: 1 successful, 0 failures, 0 skipped +``` + +Syntax errors are illegal tests are also detected and reported. + +```bash +inspec> control 'foo' do +inspec> thisisnonsense +inspec> end +NameError: undefined local variable or method `thisisnonsense' for #<#:0x007fd639825cc8> +from /usr/local/lib/ruby/gems/2.3.0/gems/rspec-expectations-3.5.0/lib/rspec/matchers.rb:967:in `method_missing' +inspec> control 'foo' do +inspec> describe file('wut') do +inspec> its('thismakesnosense') { should cmp 'fail' } +inspec> end +inspec> end + ✖ foo: File wut thismakesnosense (undefined method `thismakesnosense' for File wut:Inspec::Resource::Registry::File) + + Summary: 0 successful, 1 failures, 0 skipped +``` + +## Running a single InSpec command + +If you wish to run a single InSpec command and fetch its results, you +may use the `-c` flag. This is similar to using `bash -c`. + +```bash +$ inspec shell -c 'describe file("/Users/ksubramanian") do it { should exist } end'} +Target: local:// + + ✔ File /Users/ksubramanian should exist + +Summary: 1 successful, 0 failures, 0 skipped +``` + +```bash +$ inspec shell --format json -c 'describe file("/Users/ksubramanian") do it { should exist } end' +{"version":"0.30.0","profiles":{"":{"supports":[],"controls":{"(generated from in_memory.rb:1 5aab65c33fb1f133d9244017958eef64)":{"title":null,"desc":null,"impact":0.5,"refs":[],"tags":{},"code":" rule = rule_class.new(id, profile_id, {}) do\n res = describe(*args, &block)\n end\n","source_location":{"ref":"/Users/ksubramanian/repo/chef/inspec/lib/inspec/profile_context.rb","line":184},"results":[{"status":"passed","code_desc":"File /Users/ksubramanian should exist","run_time":0.000747,"start_time":"2016-08-16 11:41:40 -0400"}]}},"groups":{"in_memory.rb":{"title":null,"controls":["(generated from in_memory.rb:1 5aab65c33fb1f133d9244017958eef64)"]}},"attributes":[]}},"other_checks":[],"summary":{"duration":0.001078,"example_count":1,"failure_count":0,"skip_count":0}}} +``` diff --git a/docs/template.rst b/docs/template.rst deleted file mode 100644 index 3f5cfab5b..000000000 --- a/docs/template.rst +++ /dev/null @@ -1,51 +0,0 @@ -resource_name -===================================================== -Use the ``resource_name`` audit resource to xxxxx. - -Syntax ------------------------------------------------------ -A ``resource_name`` audit resource block declares xxxxx. For example: - -.. code-block:: ruby - - describe xxxxx(xxxxx) do - it { should xxxxx } - end - -where - -* ``xxxxx`` must specify xxxxx -* xxxxx -* ``xxxxx`` is a valid matcher for this audit resource - -Matchers ------------------------------------------------------ -This audit resource has the following matchers. - -xxxxx -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``xxxxx`` matcher tests if xxxxx. For example: - -.. code-block:: ruby - - it { should xxxxx } - -xxxxx -+++++++++++++++++++++++++++++++++++++++++++++++++++++ -The ``xxxxx`` matcher tests if xxxxx. For example: - -.. code-block:: ruby - - it { should xxxxx } - -Examples ------------------------------------------------------ -The following examples show how to use this audit resource in a recipe. - -**xxxxx** - -xxxxx - -**xxxxx** - -xxxxx diff --git a/examples/meta-profile/README.md b/examples/meta-profile/README.md new file mode 100644 index 000000000..0cd7a5da6 --- /dev/null +++ b/examples/meta-profile/README.md @@ -0,0 +1,6 @@ +# meta-profile + +The inspec.yml file in this profile shows how one can use dependencies +from non-local sources such as Git or an HTTP url. This feature can +be used to build up a environment-wide profile that is based on more +specific profiles managed by others. diff --git a/examples/meta-profile/controls/example.rb b/examples/meta-profile/controls/example.rb new file mode 100644 index 000000000..37849956a --- /dev/null +++ b/examples/meta-profile/controls/example.rb @@ -0,0 +1,8 @@ +# encoding: utf-8 +# copyright: 2015, The Authors +# license: All rights reserved +include_controls 'ssh-hardening' +include_controls 'os-hardening' +include_controls 'ssl-benchmark' +include_controls 'linux' +include_controls 'windows-patch-benchmark' diff --git a/examples/meta-profile/inspec.yml b/examples/meta-profile/inspec.yml new file mode 100644 index 000000000..4f57305b5 --- /dev/null +++ b/examples/meta-profile/inspec.yml @@ -0,0 +1,17 @@ +name: meta-profile +title: Meta Compliance Profile +maintainer: InSpec Authors +copyright: InSpec Authors +copyright_email: support@chef.io +license: Apache 2 +summary: InSpec Profile that is only consuming dependencies +version: 0.2.0 +depends: + - name: hardening/ssh-hardening # defaults to supermarket + - name: os-hardening + url: https://github.com/dev-sec/tests-os-hardening/archive/master.zip + - git: https://github.com/dev-sec/ssl-benchmark.git + - name: windows-patch-benchmark + git: https://github.com/chris-rock/windows-patch-benchmark.git + - name: linux + compliance: base/linux diff --git a/examples/profile/README.md b/examples/profile/README.md index b1ffbc675..7d8f53663 100644 --- a/examples/profile/README.md +++ b/examples/profile/README.md @@ -1,6 +1,6 @@ # Example InSpec Profile -This example shows the implementation of an InSpec [profile](../../docs/profiles.rst). +This example shows the implementation of an InSpec [profile](../../docs/profiles.md). ## Verify a profile diff --git a/habitat/plan.sh b/habitat/plan.sh new file mode 100644 index 000000000..09b12589c --- /dev/null +++ b/habitat/plan.sh @@ -0,0 +1,56 @@ +pkg_name=inspec +pkg_origin=chef +pkg_version=$(cat "VERSION") +pkg_description="InSpec is an open-source testing framework for infrastructure + with a human- and machine-readable language for specifying compliance, + security and policy requirements." +pkg_upstream_url=https://github.com/chef/inspec +pkg_maintainer="The Habitat Maintainers " +pkg_license=('Apache-2.0') +pkg_source=false +pkg_deps=( + core/coreutils + core/ruby + core/net-tools +) +pkg_build_deps=( + core/bundler + core/coreutils + core/gcc + core/make + core/readline +) +pkg_bin_dirs=(bin) + +do_download() { + return 0 +} + +do_verify() { + return 0 +} + +do_unpack() { + return 0 +} + +do_prepare() { + # Create a Gemfile with what we need + cat > Gemfile <=0.16.0', '<1.0' + spec.add_dependency 'train', '>=0.20.1', '<1.0' spec.add_dependency 'thor', '~> 0.19' - spec.add_dependency 'json', '~> 1.8' + spec.add_dependency 'json', '>= 1.8', '< 3.0' spec.add_dependency 'rainbow', '~> 2' spec.add_dependency 'method_source', '~> 0.8' spec.add_dependency 'rubyzip', '~> 1.1' @@ -34,6 +34,7 @@ Gem::Specification.new do |spec| spec.add_dependency 'rspec-its', '~> 1.2' spec.add_dependency 'pry', '~> 0' spec.add_dependency 'hashie', '~> 3.4' - spec.add_dependency 'molinillo', '~> 0' + spec.add_dependency 'mixlib-log' spec.add_dependency 'sslshake', '~> 1' + spec.add_dependency 'parallel', '~> 1.9' end diff --git a/lib/bundles/inspec-artifact.rb b/lib/bundles/inspec-artifact.rb new file mode 100644 index 000000000..6ccb2dddb --- /dev/null +++ b/lib/bundles/inspec-artifact.rb @@ -0,0 +1,7 @@ +# encoding: utf-8 +# author: Dave Parfitt + +libdir = File.dirname(__FILE__) +$LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir) + +require 'inspec-artifact/cli' diff --git a/lib/bundles/inspec-artifact/README.md b/lib/bundles/inspec-artifact/README.md new file mode 100644 index 000000000..464090415 --- /dev/null +++ b/lib/bundles/inspec-artifact/README.md @@ -0,0 +1 @@ +# TODO diff --git a/lib/bundles/inspec-artifact/cli.rb b/lib/bundles/inspec-artifact/cli.rb new file mode 100644 index 000000000..9dd68baba --- /dev/null +++ b/lib/bundles/inspec-artifact/cli.rb @@ -0,0 +1,284 @@ +# encoding: utf-8 +# frozen_string_literal: true +require 'base64' +require 'openssl' +require 'pathname' +require 'set' +require 'tempfile' +require 'yaml' + +# Notes: +# +# Generate keys +# The initial implementation uses 2048 bit RSA key pairs (public + private). +# Public keys must be available for a customer to install and verify an artifact. +# Private keys should be stored in a secure location and NOT be distributed. +# (They're only for creating artifacts). +# +# +# .IAF file format +# .iaf = "Inspec Artifact File", easy to rename if you'd like something more appropriate. +# The iaf file wraps a binary artifact with some metadata. The first implementation +# looks like this: +# +# INSPEC-PROFILE-1 +# name_of_signing_key +# algorithm +# signature +# +# binary-blob +# +# +# Let's look at each line: +# INSPEC-PROFILE-1: +# This is the artifact version descriptor. It should't change unless the +# format of the archive changes. +# +# name_of_signing_key +# The name of the public key that can be used to verify an artifact +# +# algorithm +# The digest used to sign, I picked SHA512 to start with. +# If we support multiple digests, we'll need to have the verify() method +# support each digest. +# +# signature +# The result of passing the binary artifact through the digest algorithm above. +# Result is base64 encoded. +# +# +# We use an empty line to separate artifact header from artifact body (binary blob). +# The artifact body can be anything you like. +# +# binary-blob +# A binary blob, most likely a .tar.gz or tar.xz file. We'll need to pick one and +# stick with it as part of the "INSPEC-PROFILE-1" artifact version. If we change block +# format, the artifact version descriptor must be incremented, and the sign() +# and verify() methods must be updated to support a newer version. +# +# +# Key revocation +# This implementation doesn't support key revocation. However, a customer +# can remove the public cert file before installation, and artifacts will then +# fail verification. +# +# Key locations +# This implementation uses the current working directory to find public and +# private keys. We should establish a common key directory (similar to /hab/cache/keys +# or ~/.hab/cache/keys in Habitat). +# +# Extracting artifacts outside of Inspec +# As in Habitat, the artifact format for Inspec allows the use of common +# Unix tools to read the header and body of an artifact. +# To extract the header from a .iaf: +# sed '/^$/q' foo.iaf +# To extract the raw content from a .iaf: +# sed '1,/^$/d' foo.iaf + +module Artifact + KEY_BITS=2048 + KEY_ALG=OpenSSL::PKey::RSA + + INSPEC_PROFILE_VERSION_1='INSPEC-PROFILE-1'.freeze + INSPEC_REPORT_VERSION_1='INSPEC-REPORT-1'.freeze + + ARTIFACT_DIGEST=OpenSSL::Digest::SHA512 + ARTIFACT_DIGEST_NAME='SHA512'.freeze + + VALID_PROFILE_VERSIONS=Set.new [INSPEC_PROFILE_VERSION_1] + VALID_PROFILE_DIGESTS=Set.new [ARTIFACT_DIGEST_NAME] + + SIGNED_PROFILE_SUFFIX='iaf'.freeze + SIGNED_REPORT_SUFFIX='iar'.freeze + + # rubocop:disable Metrics/ClassLength + class CLI < Inspec::BaseCLI + namespace 'artifact' + + # TODO: find another solution, once https://github.com/erikhuda/thor/issues/261 is fixed + def self.banner(command, _namespace = nil, _subcommand = false) + "#{basename} #{subcommand_prefix} #{command.usage}" + end + + def self.subcommand_prefix + namespace + end + + desc 'generate', 'Generate a RSA key pair for signing and verification' + option :keyname, type: :string, required: true, + desc: 'Desriptive name of key' + option :keydir, type: :string, default: './', + desc: 'Directory to search for keys' + def generate_keys + puts 'Generating keys' + keygen + end + + desc 'sign-profile', 'Create a signed .iaf artifact' + option :profile, type: :string, required: true, + desc: 'Path to profile directory' + option :keyname, type: :string, required: true, + desc: 'Desriptive name of key' + def sign_profile + profile_sign + end + + desc 'verify-profile', 'Verify a signed .iaf artifact' + option :infile, type: :string, required: true, + desc: '.iaf file to verify' + def verify_profile + profile_verify + end + + desc 'install-profile', 'Verify and install a signed .iaf artifact' + option :infile, type: :string, required: true, + desc: '.iaf file to install' + option :destdir, type: :string, required: true, + desc: 'Installation directory' + def install_profile + profile_install + end + + private + + def keygen + key = KEY_ALG.new KEY_BITS + puts 'Generating private key' + open "#{options['keyname']}.pem.key", 'w' do |io| io.write key.to_pem end + puts 'Generating public key' + open "#{options['keyname']}.pem.pub", 'w' do |io| io.write key.public_key.to_pem end + end + + def read_profile_metadata(path_to_profile) + begin + p = Pathname.new(path_to_profile) + p = p.join('inspec.yml') + if not p.exist? + fail "#{path_to_profile} doesn't appear to be a valid Inspec profile" + end + yaml = YAML.load_file(p.to_s) + yaml = yaml.to_hash + + if not yaml.key? 'name' + fail 'Profile is invalid, name is not defined' + end + + if not yaml.key? 'version' + fail 'Profile is invalid, version is not defined' + end + rescue => e + # rewrap it and pass it up to the CLI + raise "Error reading Inspec profile metadata: #{e}" + end + + yaml + end + + def profile_compress(path_to_profile, profile_md, workdir) + profile_name = profile_md['name'] + profile_version = profile_md['version'] + outfile_name = "#{workdir}/#{profile_name}-#{profile_version}.tar.gz" + `tar czf #{outfile_name} -C #{path_to_profile} .` + outfile_name + end + + def profile_sign + Dir.mktmpdir do |workdir| + puts "Signing #{options['profile']} with key #{options['keyname']}" + path_to_profile = options['profile'] + profile_md = read_profile_metadata(path_to_profile) + artifact_filename = "#{profile_md['name']}-#{profile_md['version']}.#{SIGNED_PROFILE_SUFFIX}" + tarfile = profile_compress(path_to_profile, profile_md, workdir) + content = IO.binread(tarfile) + signing_key = KEY_ALG.new File.read "#{options['keyname']}.pem.key" + sha = ARTIFACT_DIGEST.new + signature = signing_key.sign sha, content + # convert the signature to Base64 + signature_base64 = Base64.encode64(signature) + tar_content = IO.binread(tarfile) + File.open(artifact_filename, 'wb') do |f| + f.puts(INSPEC_PROFILE_VERSION_1) + f.puts(options['keyname']) + f.puts(ARTIFACT_DIGEST_NAME) + f.puts(signature_base64) + f.puts('') # newline separates artifact header with body + f.write(tar_content) + end + puts "Successfully generated #{artifact_filename}" + end + end + + def valid_header?(file_alg, file_version, file_keyname) + public_keyfile = "#{file_keyname}.pem.pub" + puts "Looking for #{public_keyfile} to verify artifact" + if not File.exist? public_keyfile + fail "Can't find #{public_keyfile}" + end + + if not VALID_PROFILE_DIGESTS.member? file_alg + fail 'Invalid artifact digest algorithm detected' + end + + if not VALID_PROFILE_VERSIONS.member? file_version + fail 'Invalid artifact version detected' + end + end + + def verify(file_to_verifiy, &content_block) + f = File.open(file_to_verifiy, 'r') + file_version = f.readline.strip! + file_keyname = f.readline.strip! + file_alg = f.readline.strip! + + file_sig = '' + # the signature is multi-line + while (line = f.readline) != "\n" + file_sig += line + end + file_sig.strip! + f.close + + valid_header?(file_alg, file_version, file_keyname) + + public_keyfile = "#{file_keyname}.pem.pub" + verification_key = KEY_ALG.new File.read public_keyfile + + f = File.open(file_to_verifiy, 'r') + while f.readline != "\n" do end + content = f.read + + signature = Base64.decode64(file_sig) + digest = ARTIFACT_DIGEST.new + if verification_key.verify digest, signature, content + content_block.yield(content) + else + puts 'Artifact is invalid' + end + end + + def profile_verify + file_to_verifiy = options['infile'] + puts "Verifying #{file_to_verifiy}" + verify(file_to_verifiy) do || + puts 'Artifact is valid' + end + end + + def profile_install + puts 'Installing profile' + file_to_verifiy = options['infile'] + dest_dir = options['destdir'] + verify(file_to_verifiy) do |content| + Dir.mktmpdir do |workdir| + tmpfile = Pathname.new(workdir).join('artifact_to_install.tar.gz') + File.write(tmpfile, content) + puts "Installing to #{dest_dir}" + `tar xzf #{tmpfile} -C #{dest_dir}` + end + end + end + end + + # register the subcommand to Inspec CLI registry + Inspec::Plugins::CLI.add_subcommand(Artifact::CLI, 'artifact', 'artifact SUBCOMMAND ...', 'Sign, verify and install artifacts', {}) +end diff --git a/lib/bundles/inspec-compliance/api.rb b/lib/bundles/inspec-compliance/api.rb index e880a2327..3c91fc40a 100755 --- a/lib/bundles/inspec-compliance/api.rb +++ b/lib/bundles/inspec-compliance/api.rb @@ -9,18 +9,6 @@ module Compliance # API Implementation does not hold any state by itself, # everything will be stored in local Configuration store class API - # login method for pre-1.0 compliance server - def self.legacy_login_post(url, username, password, insecure) - # form request - # TODO: reuse post function - uri = URI.parse(url) - req = Net::HTTP::Post.new(uri.path) - req.basic_auth(username, password) - req.form_data={} - - send_request(uri, req, insecure) - end - # return all compliance profiles available for the user def self.profiles(config) url = "#{config['server']}/user/compliance" @@ -86,19 +74,19 @@ Please login using `inspec compliance login https://compliance.test --user admin [res.is_a?(Net::HTTPSuccess), res.body] end - def self.post_refresh_token(url, token, insecure) + # Use username and refresh_toke to get an API access token + def self.get_token_via_refresh_token(url, refresh_token, insecure) uri = URI.parse("#{url}/login") req = Net::HTTP::Post.new(uri.path) - # req['Authorization'] = "Bearer #{token}" - req.body = { token: token }.to_json + req.body = { token: refresh_token }.to_json access_token = nil response = Compliance::HTTP.send_request(uri, req, insecure) data = response.body - if !data.nil? + if response.code == '200' begin tokendata = JSON.parse(data) access_token = tokendata['access_token'] - msg = 'Successfully fetched access token' + msg = 'Successfully fetched API access token' success = true rescue JSON::ParserError => e success = false @@ -106,7 +94,29 @@ Please login using `inspec compliance login https://compliance.test --user admin end else success = false - msg = 'Invalid refresh_token' + msg = "Failed to authenticate to #{url} \n\ + Response code: #{response.code}\n Body: #{response.body}" + end + + [success, msg, access_token] + end + + # Use username and password to get an API access token + def self.get_token_via_password(url, username, password, insecure) + uri = URI.parse("#{url}/login") + req = Net::HTTP::Post.new(uri.path) + req.body = { userid: username, password: password }.to_json + access_token = nil + response = Compliance::HTTP.send_request(uri, req, insecure) + data = response.body + if response.code == '200' + access_token = data + msg = 'Successfully fetched an API access token valid for 12 hours' + success = true + else + success = false + msg = "Failed to authenticate to #{url} \n\ + Response code: #{response.code}\n Body: #{response.body}" end [success, msg, access_token] diff --git a/lib/bundles/inspec-compliance/cli.rb b/lib/bundles/inspec-compliance/cli.rb index 050a8c2b3..afbbeb830 100644 --- a/lib/bundles/inspec-compliance/cli.rb +++ b/lib/bundles/inspec-compliance/cli.rb @@ -22,9 +22,9 @@ module Compliance option :insecure, aliases: :k, type: :boolean, desc: 'Explicitly allows InSpec to perform "insecure" SSL connections and transfers' option :user, type: :string, required: false, - desc: 'Chef Compliance Username (for legacy auth)' + desc: 'Chef Compliance Username' option :password, type: :string, required: false, - desc: 'Chef Compliance Password (for legacy auth)' + desc: 'Chef Compliance Password' option :apipath, type: :string, default: '/api', desc: 'Set the path to the API, defaults to /api' option :token, type: :string, required: false, @@ -38,7 +38,7 @@ module Compliance url = options['server'] + options['apipath'] if !options['user'].nil? && !options['password'].nil? # username / password - _success, msg = login_legacy(url, options['user'], options['password'], options['insecure']) + _success, msg = login_username_password(url, options['user'], options['password'], options['insecure']) elsif !options['user'].nil? && !options['token'].nil? # access token _success, msg = store_access_token(url, options['user'], options['token'], options['insecure']) @@ -199,7 +199,7 @@ module Compliance private def login_refreshtoken(url, options) - success, msg, access_token = Compliance::API.post_refresh_token(url, options['refresh_token'], options['insecure']) + success, msg, access_token = Compliance::API.get_token_via_refresh_token(url, options['refresh_token'], options['insecure']) if success config = Compliance::Configuration.new config['server'] = url @@ -212,25 +212,17 @@ module Compliance [success, msg] end - def login_legacy(url, username, password, insecure) + def login_username_password(url, username, password, insecure) config = Compliance::Configuration.new - success, data = Compliance::API.legacy_login_post(url+'/oauth/token', username, password, insecure) - if !data.nil? - tokendata = JSON.parse(data) - if tokendata['access_token'] - config['server'] = url - config['user'] = username - config['token'] = tokendata['access_token'] - config['insecure'] = insecure - config['version'] = Compliance::API.version(url, insecure) - config.store - success = true - msg = 'Successfully authenticated' - else - msg = 'Response does not include a token' - end - else - msg = "Authentication failed for Server: #{url}" + success, msg, api_token = Compliance::API.get_token_via_password(url, username, password, insecure) + if success + config['server'] = url + config['user'] = username + config['token'] = api_token + config['insecure'] = insecure + config['version'] = Compliance::API.version(url, insecure) + config.store + success = true end [success, msg] end @@ -245,10 +237,10 @@ module Compliance config['version'] = Compliance::API.version(url, insecure) config.store - [true, 'access token stored'] + [true, 'API access token stored'] end - # saves the a user refresh token supplied by the user + # saves a refresh token supplied by the user def store_refresh_token(url, refresh_token, verify, user, insecure) config = Compliance::Configuration.new config['server'] = url @@ -260,13 +252,13 @@ module Compliance if !verify config.store success = true - msg = 'refresh token stored' + msg = 'API refresh token stored' else - success, msg, access_token = Compliance::API.post_refresh_token(url, refresh_token, insecure) + success, msg, access_token = Compliance::API.get_token_via_refresh_token(url, refresh_token, insecure) if success config['token'] = access_token config.store - msg = 'token verified and stored' + msg = 'API access token verified and stored' end end diff --git a/lib/bundles/inspec-compliance/http.rb b/lib/bundles/inspec-compliance/http.rb index e44c73e93..7918cfc08 100644 --- a/lib/bundles/inspec-compliance/http.rb +++ b/lib/bundles/inspec-compliance/http.rb @@ -41,6 +41,7 @@ module Compliance # post a file def self.post_file(url, token, file_path, insecure, basic_auth = false) uri = URI.parse(url) + fail "Unable to parse URL: #{url}" if uri.nil? || uri.host.nil? http = Net::HTTP.new(uri.host, uri.port) # set connection flags @@ -71,6 +72,7 @@ module Compliance } opts[:verify_mode] = OpenSSL::SSL::VERIFY_NONE if insecure + fail "Unable to parse URI: #{uri}" if uri.nil? || uri.host.nil? res = Net::HTTP.start(uri.host, uri.port, opts) {|http| http.request(req) } diff --git a/lib/bundles/inspec-compliance/target.rb b/lib/bundles/inspec-compliance/target.rb index e833589b6..3adf9fe64 100644 --- a/lib/bundles/inspec-compliance/target.rb +++ b/lib/bundles/inspec-compliance/target.rb @@ -4,7 +4,7 @@ require 'uri' require 'inspec/fetcher' -require 'fetchers/url' +require 'inspec/errors' # InSpec Target Helper for Chef Compliance # reuses UrlHelper, but it knows the target server and the access token already @@ -14,30 +14,61 @@ module Compliance name 'compliance' priority 500 - def self.resolve(target, _opts = {}) - # check for local scheme compliance:// - uri = URI(target) - return nil unless URI(uri).scheme == 'compliance' + def self.resolve(target) + uri = if target.is_a?(String) && URI(target).scheme == 'compliance' + URI(target) + elsif target.respond_to?(:key?) && target.key?(:compliance) + URI("compliance://#{target[:compliance]}") + end + + return nil if uri.nil? # check if we have a compliance token config = Compliance::Configuration.new - return nil if config['token'].nil? + if config['token'].nil? + fail Inspec::FetcherFailure, < _e nil end - def self.target_url(config, profile) + def self.target_url(profile, config) owner, id = profile.split('/') "#{config['server']}/owners/#{owner}/compliance/#{id}/tar" end + # + # We want to save compliance: in the lockfile rather than url: to + # make sure we go back through the ComplianceAPI handling. + # + def resolved_source + { compliance: supermarket_profile_name } + end + def to_s 'Chef Compliance Profile Loader' end + + private + + def supermarket_profile_name + m = %r{^#{@config['server']}/owners/(?[^/]+)/compliance/(?[^/]+)/tar$}.match(@target) + "#{m[:owner]}/#{m[:id]}" + end end end diff --git a/lib/bundles/inspec-supermarket/api.rb b/lib/bundles/inspec-supermarket/api.rb index 56aff2b05..581d97b33 100644 --- a/lib/bundles/inspec-supermarket/api.rb +++ b/lib/bundles/inspec-supermarket/api.rb @@ -1,4 +1,5 @@ # encoding: utf-8 +# frozen_string_literal: true # author: Christoph Hartmann # author: Dominik Richter @@ -8,18 +9,14 @@ module Supermarket class API SUPERMARKET_URL = 'https://supermarket.chef.io'.freeze - def self.supermarket_url - SUPERMARKET_URL - end - # displays a list of profiles - def self.profiles - url = "#{SUPERMARKET_URL}/api/v1/tools-search" - _success, data = get(url, { q: 'compliance_profile' }) + def self.profiles(supermarket_url = SUPERMARKET_URL) + url = "#{supermarket_url}/api/v1/tools" + _success, data = get(url, { start: 0, items: 100, order: 'recently_added' }) if !data.nil? profiles = JSON.parse(data) - profiles['items'].map { |x| - m = %r{^#{Supermarket::API.supermarket_url}/api/v1/tools/(?[\w-]+)(/)?$}.match(x['tool']) + profiles['items'].select { |p| p['tool_type'] == 'compliance_profile' }.map { |x| + m = %r{^#{supermarket_url}/api/v1/tools/(?[\w-]+)(/)?$}.match(x['tool']) x['slug'] = m[:slug] x } @@ -36,10 +33,10 @@ module Supermarket end # displays profile infos - def self.info(profile) + def self.info(profile, supermarket_url = SUPERMARKET_URL) _tool_owner, tool_name = profile_name("supermarket://#{profile}") return if tool_name.nil? || tool_name.empty? - url = "#{SUPERMARKET_URL}/api/v1/tools/#{tool_name}" + url = "#{supermarket_url}/api/v1/tools/#{tool_name}" _success, data = get(url, {}) JSON.parse(data) if !data.nil? rescue JSON::ParserError @@ -47,24 +44,24 @@ module Supermarket end # compares a profile with the supermarket tool info - def self.same?(profile, supermarket_tool) + def self.same?(profile, supermarket_tool, supermarket_url = SUPERMARKET_URL) tool_owner, tool_name = profile_name(profile) - tool = "#{SUPERMARKET_URL}/api/v1/tools/#{tool_name}" + tool = "#{supermarket_url}/api/v1/tools/#{tool_name}" supermarket_tool['tool_owner'] == tool_owner && supermarket_tool['tool'] == tool end - def self.find(profile) - profiles = Supermarket::API.profiles + def self.find(profile, supermarket_url) + profiles = Supermarket::API.profiles(supermarket_url=SUPERMARKET_URL) if !profiles.empty? - index = profiles.index { |t| same?(profile, t) } + index = profiles.index { |t| same?(profile, t, supermarket_url) } # return profile or nil profiles[index] if !index.nil? && index >= 0 end end # verifies that a profile exists - def self.exist?(profile) - !find(profile).nil? + def self.exist?(profile, supermarket_url = SUPERMARKET_URL) + !find(profile, supermarket_url).nil? end def self.get(url, params) diff --git a/lib/bundles/inspec-supermarket/target.rb b/lib/bundles/inspec-supermarket/target.rb index 9b36c0816..8880e03ec 100644 --- a/lib/bundles/inspec-supermarket/target.rb +++ b/lib/bundles/inspec-supermarket/target.rb @@ -8,16 +8,22 @@ require 'fetchers/url' # InSpec Target Helper for Supermarket module Supermarket - class Fetcher < Fetchers::Url + class Fetcher < Inspec.fetcher(1) name 'supermarket' priority 500 def self.resolve(target, opts = {}) - return nil unless URI(target).scheme == 'supermarket' - return nil unless Supermarket::API.exist?(target) - tool_info = Supermarket::API.find(target) - super(tool_info['tool_source_url'], opts) - rescue URI::Error => _e + supermarket_uri, supermarket_server = if target.is_a?(String) && URI(target).scheme == 'supermarket' + [target, Supermarket::API::SUPERMARKET_URL] + elsif target.respond_to?(:key?) && target.key?(:supermarket) + supermarket_server = target[:supermarket_url] || Supermarket::API::SUPERMARKET_URL + ["supermarket://#{target[:supermarket]}", supermarket_server] + end + return nil unless supermarket_uri + return nil unless Supermarket::API.exist?(supermarket_uri, supermarket_server) + tool_info = Supermarket::API.find(supermarket_uri, supermarket_server) + resolve_next(tool_info['tool_source_url'], opts) + rescue URI::Error nil end diff --git a/lib/fetchers/git.rb b/lib/fetchers/git.rb new file mode 100644 index 000000000..03f37cb8d --- /dev/null +++ b/lib/fetchers/git.rb @@ -0,0 +1,166 @@ +# encoding: utf-8 +require 'tmpdir' +require 'fileutils' +require 'mixlib/shellout' +require 'inspec/log' + +module Fetchers + # + # The git fetcher uses the git binary to fetch remote git sources. + # Git-based sources should be specified with the `git:` key in the + # source hash. Additionally, we accept `:branch`, `:ref`, and `:tag` + # keys to allow users to pin to a particular revision. + # + # Parts of this class are derived from: + # + # https://github.com/chef/omnibus/blob/master/lib/omnibus/fetchers/git_fetcher.rb + # + # which is Copyright 2012-2014 Chef Software, Inc. and offered under + # the same Apache 2 software license as inspec. + # + # Many thanks to the omnibus authors! + # + # Note that we haven't replicated all of omnibus' features here. If + # you got to this file during debugging, you may want to look at the + # omnibus source for hints. + # + class Git < Inspec.fetcher(1) + name 'git' + priority 200 + + def self.resolve(target, opts = {}) + if target.respond_to?(:has_key?) &&target.key?(:git) + new(target[:git], opts.merge(target)) + end + end + + def initialize(remote_url, opts = {}) + @branch = opts[:branch] + @tag = opts[:tag] + @ref = opts[:ref] + @remote_url = remote_url + @repo_directory = nil + end + + def fetch(dir) + @repo_directory = dir + if cloned? + checkout + else + Dir.mktmpdir do |tmpdir| + checkout(tmpdir) + Inspec::Log.debug("Checkout of #{resolved_ref} successful. Moving checkout to #{dir}") + FileUtils.cp_r(tmpdir, @repo_directory) + end + end + @repo_directory + end + + def cache_key + resolved_ref + end + + def archive_path + @repo_directory + end + + def resolved_source + { git: @remote_url, ref: resolved_ref } + end + + private + + def resolved_ref + @resolved_ref ||= if @ref + @ref + elsif @branch + resolve_ref(@branch) + elsif @tag + resolve_ref(@tag) + else + resolve_ref('master') + end + end + + def resolve_ref(ref_name) + cmd = shellout("git ls-remote \"#{@remote_url}\" \"#{ref_name}*\"") + ref = parse_ls_remote(cmd.stdout, ref_name) + if !ref + fail "Unable to resolve #{ref_name} to a specific git commit for #{@remote_url}" + end + ref + end + + # + # The following comment is a minor modification of the comment in + # the omnibus source for a similar function: + # + # Dereference annotated tags. + # + # The +remote_list+ parameter is assumed to look like this: + # + # a2ed66c01f42514bcab77fd628149eccb4ecee28 refs/tags/rel-0.11.0 + # f915286abdbc1907878376cce9222ac0b08b12b8 refs/tags/rel-0.11.0^{} + # + # The SHA with ^{} is the commit pointed to by an annotated + # tag. If ref isn't an annotated tag, there will not be a line + # with trailing ^{}. + # + # @param [String] output + # output from `git ls-remote origin` command + # @param [String] ref_name + # the target git ref_name + # + # @return [String] + # + def parse_ls_remote(output, ref_name) + pairs = output.lines.map { |l| l.chomp.split("\t") } + tagged_commit = pairs.find { |m| m[1].end_with?("#{ref_name}^{}") } + if tagged_commit + tagged_commit.first + else + found = pairs.find { |m| m[1].end_with?(ref_name.to_s) } + if found + found.first + end + end + end + + def cloned? + File.directory?(File.join(@repo_directory, '.git')) + end + + def clone(dir = @repo_directory) + git_cmd("clone #{@remote_url} ./", dir) unless cloned? + @repo_directory + end + + def checkout(dir = @repo_directory) + clone(dir) + git_cmd("checkout #{resolved_ref}", dir) + @repo_directory + end + + def git_cmd(cmd, dir = @repo_directory) + cmd = shellout("git #{cmd}", cwd: dir) + cmd.error! + cmd.status + rescue Errno::ENOENT + raise 'To use git sources, you must have git installed.' + end + + def shellout(cmd, opts = {}) + Inspec::Log.debug("Running external command: #{cmd} (#{opts})") + cmd = Mixlib::ShellOut.new(cmd, opts) + cmd.run_command + Inspec::Log.debug("External command: completed with exit status: #{cmd.exitstatus}") + Inspec::Log.debug('External command: STDOUT BEGIN') + Inspec::Log.debug(cmd.stdout) + Inspec::Log.debug('External command: STDOUT END') + Inspec::Log.debug('External command: STDERR BEGIN') + Inspec::Log.debug(cmd.stderr) + Inspec::Log.debug('External command: STDERR END') + cmd + end + end +end diff --git a/lib/fetchers/local.rb b/lib/fetchers/local.rb index 7d355525c..c457ab7df 100644 --- a/lib/fetchers/local.rb +++ b/lib/fetchers/local.rb @@ -7,28 +7,71 @@ module Fetchers name 'local' priority 0 - attr_reader :files - def self.resolve(target) - if !File.exist?(target) - nil + local_path = if target.is_a?(String) + resolve_from_string(target) + elsif target.is_a?(Hash) + resolve_from_hash(target) + end + + if local_path + new(local_path) + end + end + + def self.resolve_from_hash(target) + if target.key?(:path) + local_path = target[:path] + if target.key?(:cwd) + local_path = File.expand_path(local_path, target[:cwd]) + end + local_path + end + end + + def self.resolve_from_string(target) + # Support "urls" in the form of file:// + if target.start_with?('file://') + target = target.gsub(%r{^file://}, '') else - new(target) + # support for windows paths + target = target.tr('\\', '/') + end + + if File.exist?(target) + target end end def initialize(target) - if File.file?(target) - @files = [target] - else - @files = Dir[File.join(target, '**', '*')] - end + @target = target end - def read(file) - return nil unless files.include?(file) - return nil unless File.file?(file) - File.read(file) + def fetch(_path) + archive_path + end + + def archive_path + @target + end + + def writable? + File.directory?(@target) + end + + def cache_key + sha256.to_s + end + + def sha256 + return nil if File.directory?(@target) + @archive_shasum ||= Digest::SHA256.hexdigest File.read(@target) + end + + def resolved_source + h = { path: @target } + h[:sha256] = sha256 if sha256 + h end end end diff --git a/lib/fetchers/mock.rb b/lib/fetchers/mock.rb index fc81cc186..0dd941779 100644 --- a/lib/fetchers/mock.rb +++ b/lib/fetchers/mock.rb @@ -16,12 +16,20 @@ module Fetchers @data = data end - def files - @data.keys + def fetch(_path) + archive_path end - def read(file) - @data[file] + def archive_path + { mock: @data } + end + + def resolved_source + { mock_fetcher: true } + end + + def cache_key + '' end end end diff --git a/lib/fetchers/tar.rb b/lib/fetchers/tar.rb deleted file mode 100644 index c6f057a59..000000000 --- a/lib/fetchers/tar.rb +++ /dev/null @@ -1,49 +0,0 @@ -# encoding: utf-8 -# author: Dominik Richter -# author: Christoph Hartmann - -require 'rubygems/package' -require 'zlib' - -module Fetchers - class Tar < Inspec.fetcher(1) - name 'tar' - priority 100 - - attr_reader :files - - def self.resolve(target) - unless target.is_a?(String) && File.file?(target) && target.end_with?('.tar.gz', '.tgz') - return nil - end - new(target) - end - - def initialize(target) - @target = target - @contents = {} - @files = [] - Gem::Package::TarReader.new(Zlib::GzipReader.open(@target)) do |tar| - @files = tar.map(&:full_name) - end - end - - def read(file) - @contents[file] ||= read_from_tar(file) - end - - def read_from_tar(file) - return nil unless @files.include?(file) - res = nil - # NB `TarReader` includes `Enumerable` beginning with Ruby 2.x - Gem::Package::TarReader.new(Zlib::GzipReader.open(@target)) do |tar| - tar.each do |entry| - next unless entry.file? && file == entry.full_name - res = entry.read - break - end - end - res - end - end -end diff --git a/lib/fetchers/url.rb b/lib/fetchers/url.rb index 7a045a661..1955e11c0 100644 --- a/lib/fetchers/url.rb +++ b/lib/fetchers/url.rb @@ -3,25 +3,37 @@ # author: Christoph Hartmann require 'uri' +require 'digest' require 'tempfile' require 'open-uri' module Fetchers class Url < Inspec.fetcher(1) + MIME_TYPES = { + 'application/x-zip-compressed' => '.zip', + 'application/zip' => '.zip', + 'application/x-gzip' => '.tar.gz', + 'application/gzip' => '.tar.gz', + }.freeze + name 'url' priority 200 - attr_reader :files - def self.resolve(target, opts = {}) + if target.is_a?(Hash) && target.key?(:url) + resolve_from_string(target[:url], opts) + elsif target.is_a?(String) + resolve_from_string(target, opts) + end + end + + def self.resolve_from_string(target, opts) uri = URI.parse(target) return nil if uri.nil? or uri.scheme.nil? return nil unless %{ http https }.include? uri.scheme target = transform(target) - # fetch this url and hand it off - res = new(target, opts) - resolve_next(res.archive.path, res) - rescue URI::Error => _e + new(target, opts) + rescue URI::Error nil end @@ -43,63 +55,96 @@ module Fetchers # https://github.com/hardening-io/tests-os-hardening/tree/48bd4388ddffde68badd83aefa654e7af3231876 # is transformed to # https://github.com/hardening-io/tests-os-hardening/archive/48bd4388ddffde68badd83aefa654e7af3231876.tar.gz + GITHUB_URL_REGEX = %r{^https?://(www\.)?github\.com/(?[\w-]+)/(?[\w-]+)(\.git)?(/)?$} + GITHUB_URL_WITH_TREE_REGEX = %r{^https?://(www\.)?github\.com/(?[\w-]+)/(?[\w-]+)/tree/(?[\w\.]+)(/)?$} def self.transform(target) - # support for default github url - m = %r{^https?://(www\.)?github\.com/(?[\w-]+)/(?[\w-]+)(\.git)?(/)?$}.match(target) - return "https://github.com/#{m[:user]}/#{m[:repo]}/archive/master.tar.gz" if m + transformed_target = if m = GITHUB_URL_REGEX.match(target) # rubocop:disable Lint/AssignmentInCondition + "https://github.com/#{m[:user]}/#{m[:repo]}/archive/master.tar.gz" + elsif m = GITHUB_URL_WITH_TREE_REGEX.match(target) # rubocop:disable Lint/AssignmentInCondition + "https://github.com/#{m[:user]}/#{m[:repo]}/archive/#{m[:commit]}.tar.gz" + end - # support for branch and commit urls - m = %r{^https?://(www\.)?github\.com/(?[\w-]+)/(?[\w-]+)/tree/(?[\w\.]+)(/)?$}.match(target) - return "https://github.com/#{m[:user]}/#{m[:repo]}/archive/#{m[:commit]}.tar.gz" if m - - # if we could not find a match, return the original value - target + if transformed_target + Inspec::Log.warn("URL target #{target} transformed to #{transformed_target}. Consider using the git fetcher") + transformed_target + else + target + end end - MIME_TYPES = { - 'application/x-zip-compressed' => '.zip', - 'application/zip' => '.zip', - 'application/x-gzip' => '.tar.gz', - 'application/gzip' => '.tar.gz', - }.freeze + attr_reader :files, :archive_path - # download url into archive using opts, - # returns File object and content-type from HTTP headers - def self.download_archive(url, opts = {}) - http_opts = {} - # http_opts['http_basic_authentication'] = [opts['user'] || '', opts['password'] || ''] if opts['user'] - http_opts['ssl_verify_mode'.to_sym] = OpenSSL::SSL::VERIFY_NONE if opts['insecure'] - http_opts['Authorization'] = "Bearer #{opts['token']}" if opts['token'] + def initialize(url, opts) + @target = url + @insecure = opts['insecure'] + @token = opts['token'] + @config = opts + end - remote = open( - url, - http_opts, - ) + def fetch(path) + @archive_path ||= download_archive(path) + end + def resolved_source + @resolved_source ||= { url: @target, sha256: sha256 } + end + + def cache_key + @archive_shasum ||= sha256 + end + + def to_s + @target + end + + private + + def sha256 + file = @archive_path || temp_archive_path + Digest::SHA256.hexdigest File.read(file) + end + + def file_type_from_remote(remote) content_type = remote.meta['content-type'] - file_type = MIME_TYPES[content_type] || - throw(RuntimeError, 'Failed to resolve URL target, its '\ - "metadata did not match ZIP or TAR: #{content_type}") + file_type = MIME_TYPES[content_type] - # fall back to tar if file_type.nil? - fail "Could not determine file type for content type #{content_type}." + Inspec::Log.warn("Unrecognized content type: #{content_type}. Assuming tar.gz") + file_type = '.tar.gz' end - # download content - archive = Tempfile.new(['inspec-dl-', file_type]) + file_type + end + + def temp_archive_path + @temp_archive_path ||= download_archive_to_temp + end + + # Downloads archive to temporary file with side effect :( of setting @archive_type + def download_archive_to_temp + return @temp_archive_path if ! @temp_archive_path.nil? + Inspec::Log.debug("Fetching URL: #{@target}") + http_opts = {} + http_opts['ssl_verify_mode'.to_sym] = OpenSSL::SSL::VERIFY_NONE if @insecure + http_opts['Authorization'] = "Bearer #{@token}" if @token + remote = open(@target, http_opts) + @archive_type = file_type_from_remote(remote) # side effect :( + archive = Tempfile.new(['inspec-dl-', @archive_type]) archive.binmode archive.write(remote.read) archive.rewind archive.close - archive + Inspec::Log.debug("Archive stored at temporary location: #{archive.path}") + @temp_archive_path = archive.path end - attr_reader :archive - - def initialize(url, opts) - @target = url - @archive = self.class.download_archive(url, opts) + def download_archive(path) + download_archive_to_temp + final_path = "#{path}#{@archive_type}" + FileUtils.mv(temp_archive_path, final_path) + Inspec::Log.debug("Fetched archive moved to: #{final_path}") + @temp_archive_path = nil + final_path end end end diff --git a/lib/fetchers/zip.rb b/lib/fetchers/zip.rb deleted file mode 100644 index 0ce199b71..000000000 --- a/lib/fetchers/zip.rb +++ /dev/null @@ -1,49 +0,0 @@ -# encoding: utf-8 -# author: Dominik Richter -# author: Christoph Hartmann - -require 'zip' - -module Fetchers - class Zip < Inspec.fetcher(1) - name 'zip' - priority 100 - - attr_reader :files - - def self.resolve(target) - unless target.is_a?(String) && File.file?(target) && target.end_with?('.zip') - return nil - end - new(target) - end - - def initialize(target) - @target = target - @contents = {} - @files = [] - ::Zip::InputStream.open(@target) do |io| - while (entry = io.get_next_entry) - @files.push(entry.name.sub(%r{/+$}, '')) - end - end - end - - def read(file) - @contents[file] ||= read_from_zip(file) - end - - def read_from_zip(file) - return nil unless @files.include?(file) - res = nil - ::Zip::InputStream.open(@target) do |io| - while (entry = io.get_next_entry) - next unless file == entry.name - res = io.read - break - end - end - res - end - end -end diff --git a/lib/inspec.rb b/lib/inspec.rb index 935b7d2c5..3a5982b67 100644 --- a/lib/inspec.rb +++ b/lib/inspec.rb @@ -4,9 +4,6 @@ # author: Dominik Richter # author: Christoph Hartmann -Encoding.default_external = Encoding::UTF_8 -Encoding.default_internal = Encoding::UTF_8 - libdir = File.dirname(__FILE__) $LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir) diff --git a/lib/inspec/base_cli.rb b/lib/inspec/base_cli.rb index a175a1ac7..359d020ef 100644 --- a/lib/inspec/base_cli.rb +++ b/lib/inspec/base_cli.rb @@ -3,6 +3,7 @@ # author: Dominik Richter require 'thor' +require 'inspec/log' module Inspec class BaseCLI < Thor # rubocop:disable Metrics/ClassLength @@ -31,6 +32,12 @@ module Inspec desc: 'Additional sudo options for a remote scan.' option :sudo_command, type: :string, desc: 'Alternate command for sudo.' + option :shell, type: :boolean, + desc: 'Run scans in a subshell. Only activates on Unix.' + option :shell_options, type: :string, + desc: 'Additional shell options.' + option :shell_command, type: :string, + desc: 'Specify a particular shell to use.' option :ssl, type: :boolean, desc: 'Use SSL for transport layer encryption (WinRM).' option :self_signed, type: :boolean, @@ -57,6 +64,10 @@ module Inspec desc: 'Use colors in output.' option :attrs, type: :array, desc: 'Load attributes file (experimental)' + option :cache, type: :string, + desc: 'Use the given path for caching dependencies. (default: ~/.inspec/cache)' + option :create_lockfile, type: :boolean, default: true, + desc: 'Write out a lockfile based on this execution (unless one already exists)' end private @@ -64,11 +75,12 @@ module Inspec # helper method to run tests def run_tests(targets, opts) o = opts.dup - o[:logger] = Logger.new(opts['format'] == 'json' ? nil : STDOUT) + log_device = opts['format'] == 'json' ? nil : STDOUT + o[:logger] = Logger.new(log_device) o[:logger].level = get_log_level(o.log_level) runner = Inspec::Runner.new(o) - targets.each { |target| runner.add_target(target, opts) } + targets.each { |target| runner.add_target(target) } exit runner.run rescue RuntimeError, Train::UserError => e $stderr.puts e.message @@ -126,7 +138,33 @@ module Inspec Logger.const_get(l.upcase) end + def pretty_handle_exception(exception) + case exception + when Inspec::Error + $stderr.puts exception.message + exit(1) + else + raise exception # rubocop:disable Style/SignalException + end + end + def configure_logger(o) + # + # TODO(ssd): This is a big gross, but this configures the + # logging singleton Inspec::Log. Eventually it would be nice to + # move internal debug logging to use this logging singleton. + # + loc = if o.log_location + o.log_location + elsif %w{json json-min}.include?(o['format']) + STDERR + else + STDOUT + end + + Inspec::Log.init(loc) + Inspec::Log.level = get_log_level(o.log_level) + o[:logger] = Logger.new(STDOUT) # output json if we have activated the json formatter if opts['log-format'] == 'json' diff --git a/lib/inspec/cached_fetcher.rb b/lib/inspec/cached_fetcher.rb new file mode 100644 index 000000000..2c5377e5e --- /dev/null +++ b/lib/inspec/cached_fetcher.rb @@ -0,0 +1,67 @@ +# encoding: utf-8 +require 'inspec/fetcher' +require 'forwardable' + +module Inspec + class CachedFetcher + extend Forwardable + + attr_reader :cache, :target, :fetcher + def initialize(target, cache) + @target = target + @fetcher = Inspec::Fetcher.resolve(target) + + if @fetcher.nil? + fail("Could not fetch inspec profile in #{target.inspect}.") + end + + @cache = cache + end + + def resolved_source + fetch + @fetcher.resolved_source + end + + def cache_key + k = if target.is_a?(Hash) + target[:sha256] || target[:ref] + end + + if k.nil? + fetcher.cache_key + else + k + end + end + + def fetch + if cache.exists?(cache_key) + Inspec::Log.debug "Using cached dependency for #{target}" + [cache.prefered_entry_for(cache_key), false] + else + Inspec::Log.debug "Dependency does not exist in the cache #{target}" + fetcher.fetch(cache.base_path_for(fetcher.cache_key)) + assert_cache_sanity! + [fetcher.archive_path, fetcher.writable?] + end + end + + def assert_cache_sanity! + if target.respond_to?(:key?) && target.key?(:sha256) + if fetcher.resolved_source[:sha256] != target[:sha256] + fail < e + pretty_handle_exception(e) end desc 'check PATH', 'verify all tests at the specified PATH' @@ -52,6 +61,7 @@ class Inspec::InspecCLI < Inspec::BaseCLI # rubocop:disable Metrics/ClassLength o = opts.dup # configure_logger(o) # we do not need a logger for check yet o[:ignore_supports] = true # we check for integrity only + o[:backend] = Inspec::Backend.create(target: 'mock://') # run check profile = Inspec::Profile.for_target(path, o) @@ -91,6 +101,22 @@ class Inspec::InspecCLI < Inspec::BaseCLI # rubocop:disable Metrics/ClassLength end end exit 1 unless result[:summary][:valid] + rescue StandardError => e + pretty_handle_exception(e) + end + + desc 'vendor', 'Download all dependencies and generate a lockfile' + def vendor(path = nil) + o = opts.dup + o[:cache] = Inspec::Cache.new(path) + o[:backend] = Inspec::Backend.create(target: 'mock://') + configure_logger(o) + + profile = Inspec::Profile.for_target('./', o) + lockfile = profile.generate_lockfile + File.write('inspec.lock', lockfile.to_yaml) + rescue StandardError => e + pretty_handle_exception(e) end desc 'archive PATH', 'archive a profile to tar.gz (default) or zip' @@ -111,27 +137,33 @@ class Inspec::InspecCLI < Inspec::BaseCLI # rubocop:disable Metrics/ClassLength o = opts.dup o[:logger] = Logger.new(STDOUT) o[:logger].level = get_log_level(o.log_level) + o[:backend] = Inspec::Backend.create(target: 'mock://') profile = Inspec::Profile.for_target(path, o) result = profile.check if result && !opts[:ignore_errors] == false - @logger.info 'Profile check failed. Please fix the profile before generating an archive.' + o[:logger].info 'Profile check failed. Please fix the profile before generating an archive.' return exit 1 end # generate archive exit 1 unless profile.archive(opts) + rescue StandardError => e + pretty_handle_exception(e) end desc 'exec PATHS', 'run all test files at the specified PATH.' exec_options def exec(*targets) diagnose + configure_logger(opts) o = opts.dup # run tests run_tests(targets, o) + rescue StandardError => e + pretty_handle_exception(e) end desc 'detect', 'detect the target OS' @@ -140,7 +172,7 @@ class Inspec::InspecCLI < Inspec::BaseCLI # rubocop:disable Metrics/ClassLength def detect o = opts.dup o[:command] = 'os.params' - res = run_command(o) + (_, res) = run_command(o) if opts['format'] == 'json' puts res.to_json else @@ -150,33 +182,49 @@ class Inspec::InspecCLI < Inspec::BaseCLI # rubocop:disable Metrics/ClassLength mark_text(res[item.to_sym])) } end + rescue StandardError => e + pretty_handle_exception(e) end desc 'shell', 'open an interactive debugging shell' target_options - option :command, aliases: :c - option :format, type: :string, default: nil, hide: true + option :command, aliases: :c, + desc: 'A single command string to run instead of launching the shell' + option :format, type: :string, default: nil, hide: true, + desc: 'Which formatter to use: cli, progress, documentation, json, json-min' def shell_func diagnose o = opts.dup - o[:logger] = Logger.new(STDOUT) + + json_output = ['json', 'json-min'].include?(opts['format']) + log_device = json_output ? nil : STDOUT + o[:logger] = Logger.new(log_device) o[:logger].level = get_log_level(o.log_level) + if o[:command].nil? runner = Inspec::Runner.new(o) return Inspec::Shell.new(runner).start - else - res = run_command(o) - jres = res.respond_to?(:to_json) ? res.to_json : JSON.dump(res) - puts jres end + + run_type, res = run_command(o) + exit res unless run_type == :ruby_eval + + # No InSpec tests - just print evaluation output. + res = (res.respond_to?(:to_json) ? res.to_json : JSON.dump(res)) if json_output + puts res + exit 0 rescue RuntimeError, Train::UserError => e $stderr.puts e.message + rescue StandardError => e + pretty_handle_exception(e) end desc 'env', 'Output shell-appropriate completion configuration' def env(shell = nil) p = Inspec::EnvPrinter.new(self.class, shell) p.print_and_exit! + rescue StandardError => e + pretty_handle_exception(e) end desc 'version', 'prints the version of this tool' @@ -187,9 +235,12 @@ class Inspec::InspecCLI < Inspec::BaseCLI # rubocop:disable Metrics/ClassLength private def run_command(opts) - opts[:test_collector] = Inspec::RunnerMock.new runner = Inspec::Runner.new(opts) - runner.create_context.load(opts[:command]) + res = runner.eval_with_virtual_profile(opts[:command]) + runner.load + + return :ruby_eval, res if runner.all_rules.empty? + return :rspec_run, runner.run_tests # rubocop:disable Style/RedundantReturn end end diff --git a/lib/inspec/control_eval_context.rb b/lib/inspec/control_eval_context.rb new file mode 100644 index 000000000..e909e5d53 --- /dev/null +++ b/lib/inspec/control_eval_context.rb @@ -0,0 +1,155 @@ +# encoding: utf-8 +# author: Dominik Richter +# author: Christoph Hartmann +require 'inspec/dsl' +require 'inspec/dsl_shared' + +module Inspec + # + # ControlEvalContext constructs an anonymous class that control + # files will be instance_exec'd against. + # + # The anonymous class includes the given passed resource_dsl as well + # as the basic DSL of the control files (describe, control, title, + # etc). + # + class ControlEvalContext + # Create the context for controls. This includes all components of the DSL, + # including matchers and resources. + # + # @param [ResourcesDSL] resources_dsl which has all resources to attach + # @return [RuleContext] the inner context of rules + def self.rule_context(resources_dsl) + require 'rspec/core/dsl' + Class.new(Inspec::Rule) do + include RSpec::Core::DSL + with_resource_dsl resources_dsl + end + end + + # Creates the heart of the control eval context: + # + # An instantiated object which has all resources registered to it + # and exposes them to the a test file. + # + # @param profile_context [Inspec::ProfileContext] + # @param outer_dsl [OuterDSLClass] + # @return [ProfileContextClass] + # + # rubocop:disable Lint/NestedMethodDefinition + def self.create(profile_context, resources_dsl) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength + rule_class = rule_context(resources_dsl) + profile_context_owner = profile_context + profile_id = profile_context.profile_id + + Class.new do + include Inspec::DSL + include Inspec::DSL::RequireOverride + include resources_dsl + + def initialize(backend, conf, dependencies, require_loader) + @backend = backend + @conf = conf + @dependencies = dependencies + @require_loader = require_loader + @skip_profile = false + end + + define_method :title do |arg| + profile_context_owner.set_header(:title, arg) + end + + def to_s + "Control Evaluation Context (#{profile_name})" + end + + define_method :profile_name do + profile_id + end + + define_method :control do |*args, &block| + id = args[0] + opts = args[1] || {} + register_control(rule_class.new(id, profile_id, opts, &block)) + end + + # + # Describe allows users to write rspec-like bare describe + # blocks without declaring an inclosing control. Here, we + # generate a control for them automatically and then execute + # the describe block in the context of that control. + # + define_method :describe do |*args, &block| + loc = block_location(block, caller[0]) + id = "(generated from #{loc} #{SecureRandom.hex})" + + res = nil + rule = rule_class.new(id, profile_id, {}) do + res = describe(*args, &block) + end + register_control(rule, &block) + + res + end + + define_method :add_resource do |name, new_res| + resources_dsl.module_exec do + define_method name.to_sym do |*args| + new_res.new(@backend, name.to_s, *args) + end + end + end + + define_method :add_resources do |context| + self.class.class_eval do + include context.to_resources_dsl + end + + rule_class.class_eval do + include context.to_resources_dsl + end + end + + define_method :add_subcontext do |context| + profile_context_owner.add_subcontext(context) + end + + define_method :register_control do |control, &block| + if @skip_profile || !profile_context_owner.profile_supports_os? + ::Inspec::Rule.set_skip_rule(control, true) + end + + profile_context_owner.register_rule(control, &block) unless control.nil? + end + + # method for attributes; import attribute handling + define_method :attribute do |name, options| + profile_context_owner.register_attribute(name, options) + end + + define_method :skip_control do |id| + profile_context_owner.unregister_rule(id) + end + + def only_if + return unless block_given? + @skip_profile ||= !yield + end + + alias_method :rule, :control + alias_method :skip_rule, :skip_control + + private + + def block_location(block, alternate_caller) + if block.nil? + alternate_caller[/^(.+:\d+):in .+$/, 1] || 'unknown' + else + path, line = block.source_location + "#{File.basename(path)}:#{line}" + end + end + end + end + end +end diff --git a/lib/inspec/dependencies/cache.rb b/lib/inspec/dependencies/cache.rb new file mode 100644 index 000000000..60b8bb8de --- /dev/null +++ b/lib/inspec/dependencies/cache.rb @@ -0,0 +1,73 @@ +# encoding: utf-8 +require 'digest' +require 'fileutils' + +module Inspec + # + # Inspec::Cache manages an on-disk cache of inspec profiles. The + # cache can contain: + # + # - .tar.gz profile archives + # - .zip profile archives + # - unpacked profiles + # + # Cache entries names include a hash of their source to prevent + # conflicts between depenedencies with the same name from different + # sources. + # + # + class Cache + attr_reader :path + def initialize(path = nil) + @path = path || File.join(Dir.home, '.inspec', 'cache') + FileUtils.mkdir_p(@path) unless File.directory?(@path) + end + + def prefered_entry_for(key) + path = base_path_for(key) + if File.directory?(path) + path + else + archive_entry_for(key) + end + end + + def archive_entry_for(key) + path = base_path_for(key) + if File.exist?("#{path}.tar.gz") + "#{path}.tar.gz" + elsif File.exist?("#{path}.zip") + "#{path}.zip" + end + end + + # + # For a given name and source_url, return true if the + # profile exists in the Cache. + # + # @param [String] name + # @param [String] source_url + # @return [Boolean] + # + def exists?(key) + return false if key.nil? || key.empty? + path = base_path_for(key) + File.directory?(path) || File.exist?("#{path}.tar.gz") || File.exist?("#{path}.zip") + end + + # + # Return the path to given profile in the cache. + # + # The `source_url` parameter should be a URI-like string that + # fully specifies the source of the exact version we want to pull + # down. + # + # @param [String] name + # @param [String] source_url + # @return [String] + # + def base_path_for(cache_key) + File.join(@path, cache_key) + end + end +end diff --git a/lib/inspec/dependencies/dependency_set.rb b/lib/inspec/dependencies/dependency_set.rb index 25b5bdb6a..62242c5af 100644 --- a/lib/inspec/dependencies/dependency_set.rb +++ b/lib/inspec/dependencies/dependency_set.rb @@ -1,26 +1,80 @@ # encoding: utf-8 -require 'inspec/dependencies/vendor_index' +require 'inspec/dependencies/requirement' require 'inspec/dependencies/resolver' module Inspec # # A DependencySet manages a list of dependencies for a profile. # - # Currently this class is a thin wrapper interface to coordinate the - # VendorIndex and the Resolver. - # class DependencySet - attr_reader :list, :vendor_path + # + # Return a dependency set given a lockfile. + # + # @param lockfile [Inspec::Lockfile] A lockfile to generate the dependency set from + # @param cwd [String] Current working directory for relative path includes + # @param vendor_path [String] Path to the vendor directory + # + def self.from_lockfile(lockfile, cwd, cache, backend) + dep_tree = lockfile.deps.map do |dep| + Inspec::Requirement.from_lock_entry(dep, cwd, cache, backend) + end + dep_list = flatten_dep_tree(dep_tree) + new(cwd, cache, dep_list, backend) + end + + def self.from_array(dependencies, cwd, cache, backend) + dep_list = {} + dependencies.each do |d| + dep_list[d.name] = d + end + new(cwd, cache, dep_list, backend) + end + + # This is experimental code to test the working of the + # dependency loader - perform a proper dependency related search + # in the future. + # + # Flatten tree because that is all we know how to deal with for + # right now. Last dep seen for a given name wins right now. + def self.flatten_dep_tree(dep_tree) + dep_list = {} + dep_tree.each do |d| + dep_list[d.name] = d + dep_list.merge!(flatten_dep_tree(d.dependencies)) + end + dep_list + end + + attr_reader :vendor_path + attr_writer :dep_list # initialize # # @param cwd [String] current working directory for relative path includes # @param vendor_path [String] path which contains vendored dependencies # @return [dependencies] this - def initialize(cwd, vendor_path) + def initialize(cwd, cache, dep_list, backend) @cwd = cwd - @vendor_path = vendor_path || File.join(Dir.home, '.inspec', 'cache') - @list = nil + @cache = cache + @dep_list = dep_list + @backend = backend + end + + def each + @dep_list.each do |_k, v| + yield v.profile + end + end + + def list + @dep_list || {} + end + + def to_array + return [] if @dep_list.nil? + @dep_list.map do |_k, v| + v.to_hash + end.compact end # @@ -29,10 +83,10 @@ module Inspec # # @param dependencies [Gem::Dependency] list of dependencies # @return [nil] + # def vendor(dependencies) return nil if dependencies.nil? || dependencies.empty? - @vendor_index ||= VendorIndex.new(@vendor_path) - @list = Resolver.resolve(dependencies, @vendor_index, @cwd) + @dep_list = Resolver.resolve(dependencies, @cache, @cwd, @backend) end end end diff --git a/lib/inspec/dependencies/lockfile.rb b/lib/inspec/dependencies/lockfile.rb new file mode 100644 index 000000000..8643e732f --- /dev/null +++ b/lib/inspec/dependencies/lockfile.rb @@ -0,0 +1,112 @@ +# encoding: utf-8 +require 'yaml' + +module Inspec + class Lockfile + # When we finalize this feature, we should set these to 1 + MINIMUM_SUPPORTED_VERSION = 1 + CURRENT_LOCKFILE_VERSION = 1 + + def self.from_dependency_set(dep_set) + lockfile_content = { + 'lockfile_version' => CURRENT_LOCKFILE_VERSION, + 'depends' => dep_set.to_array, + } + new(lockfile_content) + end + + def self.from_file(path) + parsed_content = YAML.load(File.read(path)) + version = parsed_content['lockfile_version'] + fail "No lockfile_version set in #{path}!" if version.nil? + validate_lockfile_version!(version.to_i) + new(parsed_content) + end + + def self.validate_lockfile_version!(version) + if version < MINIMUM_SUPPORTED_VERSION + fail < CURRENT_LOCKFILE_VERSION + fail < CURRENT_LOCKFILE_VERSION, + 'depends' => @deps.map { |i| stringify_keys(i) }, + }.to_yaml + end + + private + + # Refactor this to be "version-wise" - i.e. make one dispatch + # function for each version so that even if it duplicates code, + # it can describe the part of the code that it expects to be + # different. Then that dispatch routine can call more well + # defined methods like "parse_v0_dependencies" or + # "parse_flat_dependencies" or what not as things generally + # develop. It does help people easily set breakpoints/track + # different entry points of the API. + def parse_content_hash(lockfile_content_hash) + case version + when 1 + parse_content_hash_1(lockfile_content_hash) + else + # If we've gotten here, there is likely a mistake in the + # lockfile version validation in the constructor. + fail "No lockfile parser for version #{version}" + end + end + + def parse_content_hash_1(lockfile_content_hash) + @deps = if lockfile_content_hash['depends'] + lockfile_content_hash['depends'].map { |i| symbolize_keys(i) } + end + end + + def mutate_hash_keys_with(hash, fun) + hash.each_with_object({}) do |v, memo| + key = fun.call(v[0]) + value = if v[1].is_a?(Hash) + mutate_hash_keys_with(v[1], fun) + elsif v[1].is_a?(Array) + v[1].map do |i| + i.is_a?(Hash) ? mutate_hash_keys_with(i, fun) : i + end + else + v[1] + end + memo[key] = value + end + end + + def stringify_keys(hash) + mutate_hash_keys_with(hash, proc { |i| i.to_s }) + end + + def symbolize_keys(hash) + mutate_hash_keys_with(hash, proc { |i| i.to_sym }) + end + end +end diff --git a/lib/inspec/dependencies/requirement.rb b/lib/inspec/dependencies/requirement.rb index f0c10471e..a5b064c01 100644 --- a/lib/inspec/dependencies/requirement.rb +++ b/lib/inspec/dependencies/requirement.rb @@ -1,5 +1,7 @@ # encoding: utf-8 -require 'inspec/fetcher' +require 'inspec/cached_fetcher' +require 'inspec/dependencies/dependency_set' +require 'digest' module Inspec # @@ -7,97 +9,101 @@ module Inspec # appropriate we delegate to Inspec::Profile directly. # class Requirement - attr_reader :name, :dep, :cwd, :opts + def self.from_metadata(dep, cache, opts) + fail 'Cannot load empty dependency.' if dep.nil? || dep.empty? + new(dep[:name], dep[:version], cache, opts[:cwd], opts.merge(dep)) + end - def initialize(name, version_constraints, vendor_index, cwd, opts) + def self.from_lock_entry(entry, cwd, cache, backend) + req = new(entry[:name], + entry[:version_constraints], + cache, + cwd, + entry[:resolved_source].merge(backend: backend)) + + locked_deps = [] + Array(entry[:dependencies]).each do |dep_entry| + locked_deps << Inspec::Requirement.from_lock_entry(dep_entry, cwd, cache, backend) + end + req.lock_deps(locked_deps) + req + end + + attr_reader :cwd, :opts, :required_version + def initialize(name, version_constraints, cache, cwd, opts) @name = name - @dep = Gem::Dependency.new(name, - Gem::Requirement.new(Array(version_constraints)), - :runtime) - @vendor_index = vendor_index + @required_version = Gem::Requirement.new(Array(version_constraints)) + @cache = cache + @backend = opts[:backend] @opts = opts @cwd = cwd end - def matches_spec?(spec) - params = spec.profile.metadata.params - @dep.match?(params[:name], params[:version]) + # + # A dependency can be renamed in inspec.yml/inspec.lock. Prefer + # the name the user gave this dependency over the profile name. + # + def name + @name || profile.name end - def source_url - case source_type - when :local_path - "file://#{File.expand_path(opts[:path])}" - when :url - @opts[:url] + def source_version + profile.version + end + + def source_satisfies_spec? + gem_dep.match?(profile.name, profile.version) + end + + def gem_dep + @gem_dep ||= Gem::Dependency.new(profile.name, required_version, :runtime) + end + + def resolved_source + @resolved_source ||= fetcher.resolved_source + end + + def to_hash + h = { + 'name' => name, + 'resolved_source' => resolved_source, + 'version_constraints' => required_version.to_s, + } + + if !dependencies.empty? + h['dependencies'] = dependencies.map(&:to_hash) end + + h end - def local_path - @local_path ||= case source_type - when :local_path - File.expand_path(opts[:path], @cwd) - else - @vendor_index.prefered_entry_for(@name, source_url) - end + def lock_deps(dep_array) + @dependencies = dep_array end - def source_type - @source_type ||= if @opts[:path] - :local_path - elsif opts[:url] - :url - else - fail "Cannot determine source type from #{opts}" - end + def fetcher + @fetcher ||= Inspec::CachedFetcher.new(opts, @cache) end - def fetcher_class - @fetcher_class ||= case source_type - when :local_path - Fetchers::Local - when :url - Fetchers::Url - else - fail "No known fetcher for dependency #{name} with source_type #{source_type}" - end - - fail "No fetcher for #{name} (options: #{opts})" if @fetcher_class.nil? - @fetcher_class - end - - def pull - case source_type - when :local_path - local_path - else - if @vendor_index.exists?(@name, source_url) - local_path - else - archive = fetcher_class.download_archive(source_url) - @vendor_index.add(@name, source_url, archive.path) - end + def dependencies + @dependencies ||= profile.metadata.dependencies.map do |r| + Inspec::Requirement.from_metadata(r, @cache, cwd: @cwd, backend: @backend) end end def to_s - dep.to_s - end - - def path - @path ||= pull + name end def profile - return nil if path.nil? - @profile ||= Inspec::Profile.for_target(path, {}) - end + return @profile if ! @profile.nil? - def self.from_metadata(dep, vendor_index, opts) - fail 'Cannot load empty dependency.' if dep.nil? || dep.empty? - name = dep[:name] || fail('You must provide a name for all dependencies') - version = dep[:version] - new(name, version, vendor_index, opts[:cwd], opts.merge(dep)) + opts = @opts.dup + opts[:backend] = @backend + if !@dependencies.nil? + opts[:dependencies] = Inspec::DependencySet.from_array(@dependencies, @cwd, @cache, @backend) + end + @profile = Inspec::Profile.for_fetcher(fetcher, opts) end end end diff --git a/lib/inspec/dependencies/resolver.rb b/lib/inspec/dependencies/resolver.rb index 268865720..a71c34bcf 100644 --- a/lib/inspec/dependencies/resolver.rb +++ b/lib/inspec/dependencies/resolver.rb @@ -1,188 +1,88 @@ # encoding: utf-8 -# author: Dominik Richter -# author: Christoph Hartmann -require 'logger' -require 'molinillo' +# author: Steven Danna +require 'inspec/log' require 'inspec/errors' -require 'inspec/dependencies/requirement' module Inspec # - # Inspec::Resolver is responsible for recursively resolving all the - # depenendencies for a given top-level dependency set. + # Inspec::Resolver is a simple dependency resolver. Unlike Bundler + # or Berkshelf, it does not attempt to resolve each named dependency + # to a single version. Rather, it traverses down the dependency tree + # and: + # + # - Fetches the dependency from the source + # - Checks the presence of cycles, and + # - Checks that the specified dependency source satisfies the + # specified version constraint + # + # The full dependency tree is then available for the loader, which + # will provide the isolation necessary to support multiple versions + # of the same profile being used at runtime. + # + # Currently the fetching happens somewhat lazily depending on the + # implementation of the fetcher being used. # class Resolver - def self.resolve(requirements, vendor_index, cwd, opts = {}) - reqs = requirements.map do |req| - req = Inspec::Requirement.from_metadata(req, vendor_index, cwd: cwd) + def self.resolve(dependencies, cache, working_dir, backend) + reqs = dependencies.map do |dep| + req = Inspec::Requirement.from_metadata(dep, cache, cwd: working_dir, backend: backend) req || fail("Cannot initialize dependency: #{req}") end - - new(vendor_index, opts.merge(cwd: cwd)).resolve(reqs) + new.resolve(reqs) end - def initialize(vendor_index, opts = {}) - @logger = opts[:logger] || Logger.new(nil) - @debug_mode = false - - @vendor_index = vendor_index - @cwd = opts[:cwd] || './' - @resolver = Molinillo::Resolver.new(self, self) - @search_cache = {} - end - - # Resolve requirements. - # - # @param requirements [Array(Inspec::requirement)] Array of requirements - # @return [Array(String)] list of resolved dependency paths - def resolve(requirements) - requirements.each(&:pull) - @base_dep_graph = Molinillo::DependencyGraph.new - @dep_graph = @resolver.resolve(requirements, @base_dep_graph) - arr = @dep_graph.map(&:payload) - Hash[arr.map { |e| [e.name, e] }] - rescue Molinillo::VersionConflict => e - raise VersionConflict.new(e.conflicts.keys.uniq, e.message) - rescue Molinillo::CircularDependencyError => e - names = e.dependencies.sort_by(&:name).map { |d| "profile '#{d.name}'" } - raise CyclicDependencyError, - 'Your profile has requirements that depend on each other, creating '\ - "an infinite loop. Please remove #{names.count > 1 ? 'either ' : ''} "\ - "#{names.join(' or ')} and try again." - end - - # -------------------------------------------------------------------------- - # SpecificationProvider - - # Search for the specifications that match the given dependency. - # The specifications in the returned array will be considered in reverse - # order, so the latest version ought to be last. - # @note This method should be 'pure', i.e. the return value should depend - # only on the `dependency` parameter. - # - # @param [Object] dependency - # @return [Array] the specifications that satisfy the given - # `dependency`. - def search_for(dep) - unless dep.is_a?(Inspec::Requirement) - fail 'Internal error: Dependency resolver requires an Inspec::Requirement object for #search_for(dependency)' - end - @search_cache[dep] ||= uncached_search_for(dep) - end - - def uncached_search_for(dep) - # pre-cached and specified dependencies - return [dep] unless dep.profile.nil? - - results = @vendor_index.find(dep) - return [] unless results.any? - - # TODO: load dep from vendor index - # vertex = @dep_graph.vertex_named(dep.name) - # locked_requirement = vertex.payload.requirement if vertex - fail NotImplementedError, "load dependency #{dep} from vendor index" - end - - # Returns the dependencies of `specification`. - # @note This method should be 'pure', i.e. the return value should depend - # only on the `specification` parameter. - # - # @param [Object] specification - # @return [Array] the dependencies that are required by the given - # `specification`. - def dependencies_for(specification) - specification.profile.metadata.dependencies.map do |r| - Inspec::Requirement.from_metadata(r, @vendor_index, cwd: @cwd) + def detect_duplicates(deps, top_level, path_string) + seen_items_local = [] + deps.each do |dep| + if seen_items_local.include?(dep.name) + problem_cookbook = if top_level + 'the inspec.yml for this profile.' + else + "the dependency information for #{path_string.split(' ').last}" + end + fail Inspec::DuplicateDep, "The dependency #{dep.name} is listed twice in #{problem_cookbook}" + else + seen_items_local << dep.name + end end end - # Determines whether the given `requirement` is satisfied by the given - # `spec`, in the context of the current `activated` dependency graph. - # - # @param [Object] requirement - # @param [DependencyGraph] activated the current dependency graph in the - # resolution process. - # @param [Object] spec - # @return [Boolean] whether `requirement` is satisfied by `spec` in the - # context of the current `activated` dependency graph. - def requirement_satisfied_by?(requirement, _activated, spec) - requirement.matches_spec?(spec) || spec.is_a?(Inspec::Profile) - end - - # Returns the name for the given `dependency`. - # @note This method should be 'pure', i.e. the return value should depend - # only on the `dependency` parameter. - # - # @param [Object] dependency - # @return [String] the name for the given `dependency`. - def name_for(dependency) - unless dependency.is_a?(Inspec::Requirement) - fail 'Internal error: Dependency resolver requires an Inspec::Requirement object for #name_for(dependency)' + def resolve(deps, top_level = true, seen_items = {}, path_string = '') # rubocop:disable Metrics/AbcSize + graph = {} + if top_level + Inspec::Log.debug("Starting traversal of dependencies #{deps.map(&:to_s)}") + else + Inspec::Log.debug("Traversing dependency tree of transitive dependency #{deps.map(&:name)}") end - dependency.name - end - # @return [String] the name of the source of explicit dependencies, i.e. - # those passed to {Resolver#resolve} directly. - def name_for_explicit_dependency_source - 'inspec.yml' - end + detect_duplicates(deps, top_level, path_string) + deps.each do |dep| + new_seen_items = seen_items.dup + new_path_string = if path_string.empty? + dep.name + else + path_string + " -> #{dep.name}" + end - # @return [String] the name of the source of 'locked' dependencies, i.e. - # those passed to {Resolver#resolve} directly as the `base` - def name_for_locking_dependency_source - 'inspec.lock' - end + if new_seen_items.key?(dep.resolved_source) + fail Inspec::CyclicDependencyError, "Dependency #{dep} would cause a dependency cycle (#{new_path_string})" + else + new_seen_items[dep.resolved_source] = true + end - # Sort dependencies so that the ones that are easiest to resolve are first. - # Easiest to resolve is (usually) defined by: - # 1) Is this dependency already activated? - # 2) How relaxed are the requirements? - # 3) Are there any conflicts for this dependency? - # 4) How many possibilities are there to satisfy this dependency? - # - # @param [Array] dependencies - # @param [DependencyGraph] activated the current dependency graph in the - # resolution process. - # @param [{String => Array}] conflicts - # @return [Array] a sorted copy of `dependencies`. - def sort_dependencies(dependencies, activated, conflicts) - dependencies.sort_by do |dependency| - name = name_for(dependency) - [ - activated.vertex_named(name).payload ? 0 : 1, - # amount_constrained(dependency), # TODO - conflicts[name] ? 0 : 1, - # activated.vertex_named(name).payload ? 0 : search_for(dependency).count, # TODO - ] + if !dep.source_satisfies_spec? + fail Inspec::UnsatisfiedVersionSpecification, "The profile #{dep.name} from #{dep.resolved_source} has a version #{dep.source_version} which doesn't match #{dep.required_version}" + end + + Inspec::Log.debug("Adding dependency #{dep.name} (#{dep.resolved_source})") + graph[dep.name] = dep + if !dep.dependencies.empty? + resolve(dep.dependencies, false, new_seen_items.dup, new_path_string) + end end + + Inspec::Log.debug('Dependency traversal complete.') if top_level + graph end - - # Returns whether this dependency, which has no possible matching - # specifications, can safely be ignored. - # - # @param [Object] dependency - # @return [Boolean] whether this dependency can safely be skipped. - def allow_missing?(_dependency) - # TODO - false - end - - # -------------------------------------------------------------------------- - # UI - - include Molinillo::UI - - # The {IO} object that should be used to print output. `STDOUT`, by default. - # - # @return [IO] - def output - self - end - - def print(what = '') - @logger.info(what) - end - alias puts print end end diff --git a/lib/inspec/dependencies/vendor_index.rb b/lib/inspec/dependencies/vendor_index.rb deleted file mode 100644 index d65b5d2a4..000000000 --- a/lib/inspec/dependencies/vendor_index.rb +++ /dev/null @@ -1,98 +0,0 @@ -# encoding: utf-8 -require 'digest' -require 'fileutils' - -module Inspec - # - # VendorIndex manages an on-disk cache of inspec profiles. The - # cache can contain: - # - # - .tar.gz profile archives - # - .zip profile archives - # - unpacked profiles - # - # Cache entries names include a hash of their source to prevent - # conflicts between depenedencies with the same name from different - # sources. - # - # - class VendorIndex - attr_reader :path - def initialize(path) - @path = path - FileUtils.mkdir_p(path) unless File.directory?(path) - end - - def add(name, source, path_from) - path_to = base_path_for(name, source) - path_to = if File.directory?(path_to) - path_to - elsif path_from.end_with?('.zip') - "#{path_to}.tar.gz" - elsif path_from.end_with?('.tar.gz') - "#{path_to}.tar.gz" - else - fail "Cannot add unknown archive #{path} to vendor index" - end - FileUtils.cp_r(path_from, path_to) - path_to - end - - def prefered_entry_for(name, source_url) - path = base_path_for(name, source_url) - if File.directory?(path) - path - elsif File.exist?("#{path}.tar.gz") - "#{path}.tar.gz" - elsif File.exist?("#{path}.zip") - "#{path}.zip" - end - end - - # - # For a given name and source_url, return true if the - # profile exists in the VendorIndex. - # - # @param [String] name - # @param [String] source_url - # @return [Boolean] - # - def exists?(name, source_url) - path = base_path_for(name, source_url) - File.directory?(path) || File.exist?("#{path}.tar.gz") || File.exist?("#{path}.zip") - end - - # - # Return the path to given profile in the vendor index. - # - # The `source_url` parameter should be a URI-like string that - # fully specifies the source of the exact version we want to pull - # down. - # - # @param [String] name - # @param [String] source_url - # @return [String] - # - def base_path_for(name, source_url) - File.join(@path, key_for(name, source_url)) - end - - private - - # - # Return the key for a given profile in the vendor index. - # - # The `source_url` parameter should be a URI-like string that - # fully specifies the source of the exact version we want to pull - # down. - # - # @param [String] name - # @param [String] source_url - # @return [String] - # - def key_for(name, source_url) - source_hash = Digest::SHA256.hexdigest source_url - "#{name}-#{source_hash}" - end - end -end diff --git a/lib/inspec/dsl.rb b/lib/inspec/dsl.rb index 6b3f4a651..1b2bd6b39 100644 --- a/lib/inspec/dsl.rb +++ b/lib/inspec/dsl.rb @@ -1,8 +1,8 @@ # encoding: utf-8 # copyright: 2015, Dominik Richter -# license: All rights reserved # author: Dominik Richter # author: Christoph Hartmann +require 'inspec/log' module Inspec::DSL def require_controls(id, &block) @@ -18,60 +18,51 @@ module Inspec::DSL alias require_rules require_controls alias include_rules include_controls - def self.rule_from_check(m, a, b) - if a.is_a?(Array) && !a.empty? && - a[0].respond_to?(:resource_skipped) && - !a[0].resource_skipped.nil? - ::Inspec::Rule.__send__(m, *a) do - it a[0].resource_skipped - end - else - # execute the method - ::Inspec::Rule.__send__(m, *a, &b) - end + def require_resource(options = {}) + fail 'You must specify a specific resource name when calling require_resource()' if options[:resource].nil? + + from_profile = options[:profile] || profile_name + target_name = options[:as] || options[:resource] + res = resource_class(from_profile, options[:resource]) + add_resource(target_name, res) end def self.load_spec_files_for_profile(bind_context, opts, &block) - # get all spec files - target = opts[:dependencies].list[opts[:profile_id]] || - fail("Can't find profile #{opts[:profile_id].inspect}, please add it as a dependency.") - profile = Inspec::Profile.for_target(target.path, opts) - context = load_profile_context(opts[:profile_id], profile, opts) + dependencies = opts[:dependencies] + profile_id = opts[:profile_id] + dep_entry = dependencies.list[profile_id] + if dep_entry.nil? + fail <" + end + + # return info using uncached params + def info! + info(load_params.dup) + end + + def info(res = params.dup) # add information about the controls - controls = res[:controls].map do |id, rule| + res[:controls] = res[:controls].map do |id, rule| next if id.to_s.empty? data = rule.dup data.delete(:checks) data[:impact] ||= 0.5 data[:impact] = 1.0 if data[:impact] > 1.0 data[:impact] = 0.0 if data[:impact] < 0.0 - [id, data] + data[:id] = id + data + end.compact + + # resolve hash structure in groups + res[:groups] = res[:groups].map do |id, group| + group[:id] = id + group end - res[:controls] = Hash[controls.compact] # add information about the required attributes res[:attributes] = res[:attributes].map(&:to_hash) unless res[:attributes].nil? || res[:attributes].empty? @@ -211,6 +311,48 @@ module Inspec @locked_dependencies ||= load_dependencies end + def lockfile_exists? + File.exist?(lockfile_path) + end + + def lockfile_path + File.join(cwd, 'inspec.lock') + end + + # + # TODO(ssd): Relative path handling really needs to be carefully + # thought through, especially with respect to relative paths in + # tarballs. + # + def cwd + @target.is_a?(String) && File.directory?(@target) ? @target : './' + end + + def lockfile + @lockfile ||= if lockfile_exists? + Inspec::Lockfile.from_file(lockfile_path) + else + generate_lockfile + end + end + + # + # Generate an in-memory lockfile. This won't render the lock file + # to disk, it must be explicitly written to disk by the caller. + # + # @param vendor_path [String] Path to the on-disk vendor dir + # @return [Inspec::Lockfile] + # + def generate_lockfile + res = Inspec::DependencySet.new(cwd, @cache, nil, @backend) + res.vendor(metadata.dependencies) + Inspec::Lockfile.from_dependency_set(res) + end + + def load_dependencies + Inspec::DependencySet.from_lockfile(lockfile, cwd, @cache, @backend) + end + private # Create an archive name for this profile and an additional options @@ -225,7 +367,7 @@ module Inspec name = params[:name] || fail('Cannot create an archive without a profile name! Please '\ - 'specify the name in metadata or use --output to create the archive.') + 'specify the name in metadata or use --output to create the archive.') ext = opts[:zip] ? 'zip' : 'tar.gz' slug = name.downcase.strip.tr(' ', '-').gsub(/[^\w-]/, '_') Pathname.new(Dir.pwd).join("#{slug}.#{ext}") @@ -240,33 +382,17 @@ module Inspec end def load_checks_params(params) + load_libraries + tests = collect_tests params[:controls] = controls = {} params[:groups] = groups = {} prefix = @source_reader.target.prefix || '' - - if @runner_context.nil? - # we're checking a profile, we don't care if it runs on the host machine - opts = @options.dup - opts[:ignore_supports] = true - runner = Runner.new( - id: @profile_id, - backend: :mock, - test_collector: opts.delete(:test_collector), - ) - runner.add_profile(self, opts) - runner.rules.values.each do |rule| - f = load_rule_filepath(prefix, rule) - load_rule(rule, f, controls, groups) - end - params[:attributes] = runner.attributes - else - # load from context - @runner_context.rules.values.each do |rule| - f = load_rule_filepath(prefix, rule) - load_rule(rule, f, controls, groups) - end - params[:attributes] = @runner_context.attributes + tests.each do |rule| + next if rule.nil? + f = load_rule_filepath(prefix, rule) + load_rule(rule, f, controls, groups) end + params[:attributes] = @runner_context.attributes params end @@ -295,12 +421,5 @@ module Inspec } groups[file][:controls].push(id) end - - def load_dependencies - cwd = File.directory?(@target) ? @target : nil - res = Inspec::DependencySet.new(cwd, nil) - res.vendor(metadata.dependencies) - res - end end end diff --git a/lib/inspec/profile_context.rb b/lib/inspec/profile_context.rb index 20e027688..de5904a31 100644 --- a/lib/inspec/profile_context.rb +++ b/lib/inspec/profile_context.rb @@ -1,38 +1,107 @@ # encoding: utf-8 # author: Dominik Richter # author: Christoph Hartmann - +require 'inspec/log' require 'inspec/rule' -require 'inspec/dsl' +require 'inspec/resource' +require 'inspec/library_eval_context' +require 'inspec/control_eval_context' require 'inspec/require_loader' require 'securerandom' require 'inspec/objects/attribute' module Inspec class ProfileContext # rubocop:disable Metrics/ClassLength - attr_reader :rules - attr_reader :attributes + def self.for_profile(profile, backend, attributes) + new(profile.name, backend, { 'profile' => profile, + 'attributes' => attributes }) + end + + attr_reader :attributes, :profile_id, :resource_registry, :backend + attr_accessor :rules def initialize(profile_id, backend, conf) if backend.nil? fail 'ProfileContext is initiated with a backend == nil. ' \ 'This is a backend error which must be fixed upstream.' end - @profile_id = profile_id @backend = backend @conf = conf.dup @rules = {} - @dependencies = {} - @dependencies = conf['profile'].locked_dependencies unless conf['profile'].nil? + @control_subcontexts = [] + @lib_subcontexts = [] @require_loader = ::Inspec::RequireLoader.new @attributes = [] - reload_dsl + # A local resource registry that only contains resources defined + # in the transitive dependency tree of the loaded profile. + @resource_registry = Inspec::Resource.new_registry + @library_eval_context = Inspec::LibraryEvalContext.create(@resource_registry, @require_loader) + end + + def dependencies + if @conf['profile'].nil? + {} + else + @conf['profile'].locked_dependencies + end + end + + def to_resources_dsl + Inspec::Resource.create_dsl(self) + end + + def control_eval_context + @control_eval_context ||= begin + ctx = Inspec::ControlEvalContext.create(self, to_resources_dsl) + ctx.new(@backend, @conf, dependencies, @require_loader) + end end def reload_dsl - resources_dsl = Inspec::Resource.create_dsl(@backend) - ctx = create_context(resources_dsl, rule_context(resources_dsl)) - @profile_context = ctx.new(@backend, @conf, @dependencies, @require_loader) + @control_eval_context = nil + end + + def profile_supports_os? + return true if @conf['profile'].nil? + + @conf['profile'].supports_os? + end + + def remove_rule(id) + @rules[id] = nil if @rules.key?(id) + @control_subcontexts.each do |c| + c.remove_rule(id) + end + end + + def all_controls + ret = @rules.values + ret += @control_subcontexts.map(&:all_rules).flatten + ret + end + alias all_rules all_controls + + def subcontext_by_name(name) + found = @lib_subcontexts.find { |c| c.profile_id == name } + if !found + @lib_subcontexts.each do |c| + found = c.subcontext_by_name(name) + break if found + end + end + + found + end + + def add_resources(context) + @resource_registry.merge!(context.resource_registry) + control_eval_context.add_resources(context) + @lib_subcontexts << context + reload_dsl + end + + def add_subcontext(context) + @control_subcontexts << context end def load_libraries(libs) @@ -52,20 +121,29 @@ module Inspec # load all files directly that are flat inside the libraries folder autoloads.each do |path| next unless path.end_with?('.rb') - load(*@require_loader.load(path)) unless @require_loader.loaded?(path) + load_library_file(*@require_loader.load(path)) unless @require_loader.loaded?(path) end - reload_dsl end - def load(content, source = nil, line = nil) + def load_control_file(*args) + load_with_context(control_eval_context, *args) + end + alias load load_control_file + + def load_library_file(*args) + load_with_context(@library_eval_context, *args) + end + + def load_with_context(context, content, source = nil, line = nil) + Inspec::Log.debug("Loading #{source || ''} into #{self}") @current_load = { file: source } if content.is_a? Proc - @profile_context.instance_eval(&content) + context.instance_eval(&content) elsif source.nil? && line.nil? - @profile_context.instance_eval(content) + context.instance_eval(content) else - @profile_context.instance_eval(content, source || 'unknown', line || 1) + context.instance_eval(content, source || 'unknown', line || 1) end end @@ -73,10 +151,17 @@ module Inspec @rules.delete(full_id(@profile_id, id)) end + attr_reader :current_load + def register_rule(r) # get the full ID - r.instance_variable_set(:@__file, @current_load[:file]) - r.instance_variable_set(:@__group_title, @current_load[:title]) + file = if @current_load.nil? + 'unknown' + else + @current_load[:file] || 'unknown' + end + r.instance_variable_set(:@__file, file) + r.instance_variable_set(:@__group_title, current_load[:title]) # add the rule to the registry fid = full_id(Inspec::Rule.profile_id(r), Inspec::Rule.rule_id(r)) @@ -107,122 +192,5 @@ module Inspec return rid.to_s if pid.to_s.empty? pid.to_s + '/' + rid.to_s end - - # Create the context for controls. This includes all components of the DSL, - # including matchers and resources. - # - # @param [ResourcesDSL] resources_dsl which has all resources to attach - # @return [RuleContext] the inner context of rules - def rule_context(resources_dsl) - require 'rspec/core/dsl' - Class.new(Inspec::Rule) do - include RSpec::Core::DSL - include resources_dsl - end - end - - # Creates the heart of the profile context: - # An instantiated object which has all resources registered to it - # and exposes them to the a test file. The profile context serves as a - # container for all profiles which are registered. Within the context - # profiles get access to all DSL calls for creating tests and controls. - # - # @param outer_dsl [OuterDSLClass] - # @return [ProfileContextClass] - def create_context(resources_dsl, rule_class) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength - profile_context_owner = self - profile_id = @profile_id - - # rubocop:disable Lint/NestedMethodDefinition - Class.new do - include Inspec::DSL - include resources_dsl - - def initialize(backend, conf, dependencies, require_loader) # rubocop:disable Lint/NestedMethodDefinition, Lint/DuplicateMethods - @backend = backend - @conf = conf - @dependencies = dependencies - @require_loader = require_loader - @skip_profile = false - end - - # Save the toplevel require method to load all ruby dependencies. - # It is used whenever the `require 'lib'` is not in libraries. - alias_method :__ruby_require, :require - - def require(path) - rbpath = path + '.rb' - return __ruby_require(path) if !@require_loader.exists?(rbpath) - return false if @require_loader.loaded?(rbpath) - - # This is equivalent to calling `require 'lib'` with lib on disk. - # We cannot rely on libraries residing on disk however. - # TODO: Sandboxing. - content, path, line = @require_loader.load(rbpath) - eval(content, TOPLEVEL_BINDING, path, line) # rubocop:disable Lint/Eval - end - - define_method :title do |arg| - profile_context_owner.set_header(:title, arg) - end - - def to_s - 'Profile Context Run' - end - - define_method :control do |*args, &block| - id = args[0] - opts = args[1] || {} - register_control(rule_class.new(id, profile_id, opts, &block)) - end - - define_method :describe do |*args, &block| - loc = block_location(block, caller[0]) - id = "(generated from #{loc} #{SecureRandom.hex})" - - res = nil - rule = rule_class.new(id, profile_id, {}) do - res = describe(*args, &block) - end - register_control(rule, &block) - res - end - - define_method :register_control do |control, &block| - ::Inspec::Rule.set_skip_rule(control, true) if @skip_profile - - profile_context_owner.register_rule(control, &block) unless control.nil? - end - - # method for attributes; import attribute handling - define_method :attribute do |name, options| - profile_context_owner.register_attribute(name, options) - end - - define_method :skip_control do |id| - profile_context_owner.unregister_rule(id) - end - - def only_if - return unless block_given? - @skip_profile ||= !yield - end - - alias_method :rule, :control - alias_method :skip_rule, :skip_control - - private - - def block_location(block, alternate_caller) - if block.nil? - alternate_caller[/^(.+:\d+):in .+$/, 1] || 'unknown' - else - path, line = block.source_location - "#{File.basename(path)}:#{line}" - end - end - end - # rubocop:enable all - end end end diff --git a/lib/inspec/resource.rb b/lib/inspec/resource.rb index 1f98aeb84..5dbe8043e 100644 --- a/lib/inspec/resource.rb +++ b/lib/inspec/resource.rb @@ -3,17 +3,22 @@ # license: All rights reserved # author: Dominik Richter # author: Christoph Hartmann - require 'inspec/plugins' module Inspec + class ProfileNotFound < StandardError; end + class Resource - class Registry - # empty class for namespacing resource classes in the registry + def self.default_registry + @default_registry ||= {} end def self.registry - @registry ||= {} + @registry ||= default_registry + end + + def self.new_registry + default_registry.dup end # Creates the inner DSL which includes all resources for @@ -22,10 +27,22 @@ module Inspec # # @param backend [BackendRunner] exposing the target to resources # @return [ResourcesDSL] - def self.create_dsl(backend) - # need the local name, to use it in the module creation further down - my_registry = registry + def self.create_dsl(profile_context) + backend = profile_context.backend + my_registry = profile_context.resource_registry + Module.new do + define_method :resource_class do |profile_name, resource_name| + inner_context = if profile_name == profile_context.profile_id + profile_context + else + profile_context.subcontext_by_name(profile_name) + end + + fail ProfileNotFound, "Cannot find profile named: #{profile_name}" if inner_context.nil? + inner_context.resource_registry[resource_name] + end + my_registry.each do |id, r| define_method id.to_sym do |*args| r.new(backend, id.to_s, *args) @@ -41,10 +58,14 @@ module Inspec # @param [int] version the resource version to use # @return [Resource] base class for creating a new resource def self.resource(version) + validate_resource_dsl_version!(version) + Inspec::Plugins::Resource + end + + def self.validate_resource_dsl_version!(version) if version != 1 fail 'Only resource version 1 is supported!' end - Inspec::Plugins::Resource end end @@ -62,7 +83,7 @@ require 'resources/directory' require 'resources/etc_group' require 'resources/file' require 'resources/gem' -require 'resources/group' +require 'resources/groups' require 'resources/grub_conf' require 'resources/host' require 'resources/iis_site' @@ -100,7 +121,8 @@ require 'resources/service' require 'resources/shadow' require 'resources/ssl' require 'resources/ssh_conf' -require 'resources/user' +require 'resources/sys_info' +require 'resources/users' require 'resources/vbscript' require 'resources/windows_feature' require 'resources/xinetd' diff --git a/lib/inspec/rspec_json_formatter.rb b/lib/inspec/rspec_json_formatter.rb index 19bd34149..296d4eb82 100644 --- a/lib/inspec/rspec_json_formatter.rb +++ b/lib/inspec/rspec_json_formatter.rb @@ -36,11 +36,8 @@ class InspecRspecMiniJson < RSpec::Core::Formatters::JsonFormatter # Called after stop has been called and the run is complete. def dump_summary(summary) @output_hash[:version] = Inspec::VERSION - @output_hash[:summary] = { + @output_hash[:statistics] = { duration: summary.duration, - example_count: summary.example_count, - failure_count: summary.failure_count, - skip_count: summary.pending_count, } end @@ -66,10 +63,18 @@ class InspecRspecMiniJson < RSpec::Core::Formatters::JsonFormatter private def format_example(example) + if example.metadata[:description_args].length > 0 && !example.metadata[:skip].nil? + # For skipped profiles, rspec returns in full_description the skip_message as well. We don't want + # to mix the two, so we pick the full_description from the example.metadata[:example_group] hash. + code_description = example.metadata[:example_group][:description] + else + code_description = example.metadata[:full_description] + end + res = { id: example.metadata[:id], status: example.execution_result.status.to_s, - code_desc: example.full_description, + code_desc: code_description, } unless (pid = example.metadata[:profile_id]).nil? @@ -86,7 +91,7 @@ class InspecRspecMiniJson < RSpec::Core::Formatters::JsonFormatter end end -class InspecRspecJson < InspecRspecMiniJson +class InspecRspecJson < InspecRspecMiniJson # rubocop:disable Metrics/ClassLength RSpec::Core::Formatters.register self, :start, :stop, :dump_summary attr_writer :backend @@ -108,7 +113,7 @@ class InspecRspecJson < InspecRspecMiniJson def start(_notification) # Note that the default profile may have no name - therefore # the hash may have a valid nil => entry. - @profiles_info ||= Hash[@profiles.map { |x| profile_info(x) }] + @profiles_info = @profiles.map(&:info!).map(&:dup) end def dump_one_example(example, control) @@ -133,20 +138,59 @@ class InspecRspecJson < InspecRspecMiniJson @output_hash[:other_checks] = missing end - def dump_summary(summary) - super(summary) + def controls_summary + failed = 0 + skipped = 0 + passed = 0 + critical = 0 + major = 0 + minor = 0 + + @control_tests.each do |control| + next if control[:id].start_with? '(generated from ' + next unless control[:results] + if control[:results].any? { |r| r[:status] == 'failed' } + failed += 1 + if control[:impact] >= 0.7 + critical += 1 + elsif control[:impact] >= 0.4 + major += 1 + else + minor += 1 + end + elsif control[:results].any? { |r| r[:status] == 'skipped' } + skipped += 1 + else + passed += 1 + end + end + + total = failed + passed + skipped + + { 'total' => total, + 'failed' => { + 'total' => failed, + 'critical' => critical, + 'major' => major, + 'minor' => minor, + }, + 'skipped' => skipped, + 'passed' => passed } + end + + def tests_summary total = 0 failed = 0 skipped = 0 passed = 0 - @profiles_info.each do |_name, profile| - total += profile[:controls].length - profile[:controls].each do |_control_name, control| - next unless control[:results] - if control[:results].any? { |r| r[:status] == 'failed' } + all_tests = @anonymous_tests + @control_tests + all_tests.each do |control| + next unless control[:results] + control[:results].each do |result| + if result[:status] == 'failed' failed += 1 - elsif control[:results].any? { |r| r[:status] == 'skipped' } + elsif result[:status] == 'skipped' skipped += 1 else passed += 1 @@ -154,20 +198,38 @@ class InspecRspecJson < InspecRspecMiniJson end end - # TODO: provide this information in the output + { 'total' => total, 'failed' => failed, 'skipped' => skipped, 'passed' => passed } end private - def profile_info(profile) - info = profile.info.dup - [info[:name], info] + # + # TODO(ssd+vj): We should probably solve this by either ensuring the example has + # the profile_id of the top level profile when it is included as a dependency, or + # by registrying all dependent profiles with the formatter. The we could remove + # this heuristic matching. + # + def example2profile(example, profiles) + profiles.find { |p| profile_contains_example?(p, example) } + end + + def profile_contains_example?(profile, example) + # Heuristic for finding the profile an example came from: + # Case 1: The profile_id on the example matches the name of the profile + # Case 2: The profile contains a control that matches the id of the example + if profile[:name] == example[:profile_id] + true + elsif profile[:controls] && profile[:controls].any? { |x| x[:id] == example[:id] } + true + else + false + end end def example2control(example, profiles) - profile = profiles[example[:profile_id]] - return nil if profile.nil? || profile[:controls].nil? - profile[:controls][example[:id]] + profile = example2profile(example, profiles) + return nil unless profile && profile[:controls] + profile[:controls].find { |x| x[:id] == example[:id] } end def format_example(example) @@ -210,12 +272,7 @@ class InspecRspecCli < InspecRspecJson # rubocop:disable Metrics/ClassLength 'passed' => ' ✔ ', 'unknown' => ' ? ', 'empty' => ' ', - }.freeze - - TEST_INDICATORS = { - 'failed' => ' fail: ', - 'skipped' => ' skip: ', - 'empty' => ' ', + 'small' => ' ', }.freeze MULTI_TEST_CONTROL_SUMMARY_MAX_LEN = 60 @@ -223,37 +280,38 @@ class InspecRspecCli < InspecRspecJson # rubocop:disable Metrics/ClassLength def initialize(*args) @colors = COLORS @indicators = INDICATORS - @test_indicators = TEST_INDICATORS @format = '%color%indicator%id%summary' @current_control = nil @current_profile = nil @missing_controls = [] + @anonymous_tests = [] + @control_tests = [] + @profile_printed = false super(*args) end - def close(_notification) + def close(_notification) # rubocop:disable Metrics/AbcSize flush_current_control output.puts('') unless @current_control.nil? + print_tests + output.puts('') - @profiles_info.each do |_id, profile| - next if profile[:already_printed] - @current_profile = profile - next unless print_current_profile - print_line( - color: '', indicator: @indicators['empty'], id: '', profile: '', - summary: 'No tests executed.' - ) - output.puts('') - end + print_profiles_info if !@profile_printed + controls_res = controls_summary + tests_res = tests_summary - res = @output_hash[:summary] - passed = res[:example_count] - res[:failure_count] - res[:skip_count] - s = format('Summary: %s%d successful%s, %s%d failures%s, %s%d skipped%s', - COLORS['passed'], passed, COLORS['reset'], - COLORS['failed'], res[:failure_count], COLORS['reset'], - COLORS['skipped'], res[:skip_count], COLORS['reset']) - output.puts(s) + s = format('Profile Summary: %s%d successful%s, %s%d failures%s, %s%d skipped%s', + COLORS['passed'], controls_res['passed'], COLORS['reset'], + COLORS['failed'], controls_res['failed']['total'], COLORS['reset'], + COLORS['skipped'], controls_res['skipped'], COLORS['reset']) + output.puts(s) if controls_res['total'] > 0 + + s = format('Test Summary: %s%d successful%s, %s%d failures%s, %s%d skipped%s', + COLORS['passed'], tests_res['passed'], COLORS['reset'], + COLORS['failed'], tests_res['failed'], COLORS['reset'], + COLORS['skipped'], tests_res['skipped'], COLORS['reset']) + output.puts(s) if !@anonymous_tests.empty? || @current_control.nil? end private @@ -274,13 +332,15 @@ class InspecRspecCli < InspecRspecJson # rubocop:disable Metrics/ClassLength summary_status = STATUS_TYPES['unknown'] skips = [] fails = [] + passes = [] @current_control[:results].each do |r| i = STATUS_TYPES[r[:status_type]] summary_status = i if i > summary_status fails.push(r) if i > 0 + passes.push(r) if i == STATUS_TYPES['passed'] skips.push(r) if i == STATUS_TYPES['skipped'] end - [fails, skips, STATUS_TYPES.key(summary_status)] + [fails, skips, passes, STATUS_TYPES.key(summary_status)] end def current_control_title @@ -313,8 +373,6 @@ class InspecRspecCli < InspecRspecJson # rubocop:disable Metrics/ClassLength if res.length == 1 # Single test - be nice and just print the exception message if the test # failed. No need to say "1 failed". - fails.clear - skips.clear res[0][:message].to_s else [ @@ -344,43 +402,80 @@ class InspecRspecCli < InspecRspecJson # rubocop:disable Metrics/ClassLength lines.gsub(/\n/, "\n" + indentation) end - def print_fails_and_skips(all, color) + def print_results(all) all.each do |x| - indicator = @test_indicators[x[:status]] - indicator = @test_indicators['empty'] if all.length == 1 || indicator.nil? - msg = x[:message] || x[:skip_message] || x[:code_desc] + test_status = x[:status_type] + test_color = @colors[test_status] + indicator = @indicators[x[:status]] + indicator = @indicators['empty'] if indicator.nil? + if x[:message] + msg = x[:code_desc] + "\n" + x[:message] + else + msg = x[:skip_message] || x[:code_desc] + end print_line( - color: color, - indicator: indicator, - summary: format_lines(msg, @test_indicators['empty']), + color: test_color, + indicator: @indicators['small'] + indicator, + summary: format_lines(msg, @indicators['empty']), id: nil, profile: nil ) end end + def print_tests # rubocop:disable Metrics/AbcSize + @anonymous_tests.each do |control| + control_result = control[:results] + title = control_result[0][:code_desc].split[0..1].join(' ') + puts ' ' + title + # iterate over all describe blocks in anonoymous control block + control_result.each do |test| + control_id = '' + # display exceptions + unless test[:exception].nil? + test_result = test[:message] + else + # determine title + test_result = test[:skip_message] || test[:code_desc].split[2..-1].join(' ') + # show error message + test_result += "\n" + test[:message] unless test[:message].nil? + end + status_indicator = test[:status_type] + print_line( + color: @colors[status_indicator] || '', + indicator: @indicators['small'] + @indicators[status_indicator] || @indicators['unknown'], + summary: format_lines(test_result, @indicators['empty']), + id: control_id, + profile: control[:profile_id], + ) + end + end + end + def flush_current_control return if @current_control.nil? - prev_profile = @current_profile - @current_profile = @profiles_info[@current_control[:profile_id]] - print_current_profile if prev_profile != @current_profile + @current_profile = @profiles_info.find { |i| i[:id] == @current_control[:profile_id] } + print_current_profile if !@profile_printed - fails, skips, summary_indicator = current_control_infos + fails, skips, passes, summary_indicator = current_control_infos summary = current_control_summary(fails, skips) control_id = @current_control[:id].to_s control_id += ': ' - control_id = '' if control_id.start_with? '(generated from ' + if control_id.start_with? '(generated from ' + @anonymous_tests.push(@current_control) + else + @control_tests.push(@current_control) + print_line( + color: @colors[summary_indicator] || '', + indicator: @indicators[summary_indicator] || @indicators['unknown'], + summary: format_lines(summary, @indicators['empty']), + id: control_id, + profile: @current_control[:profile_id], + ) - print_line( - color: @colors[summary_indicator] || '', - indicator: @indicators[summary_indicator] || @indicators['unknown'], - summary: format_lines(summary, @indicators['empty']), - id: control_id, - profile: @current_control[:profile_id], - ) - - print_fails_and_skips(fails + skips, @colors[summary_indicator] || '') + print_results(fails + skips + passes) + end end def print_target(before, after) @@ -390,14 +485,32 @@ class InspecRspecCli < InspecRspecJson # rubocop:disable Metrics/ClassLength output.puts(before + connection.uri + after) end + def print_profiles_info + @profiles_info.each do |profile| + next if profile[:already_printed] + @current_profile = profile + next unless print_current_profile + print_line( + color: '', indicator: @indicators['empty'], id: '', profile: '', + summary: 'No tests executed.' + ) if @current_control.nil? + output.puts('') + end + end + def print_current_profile profile = @current_profile - return false if profile.nil? - + if profile.nil? + print_profiles_info + @profile_printed = true + return true + end output.puts '' profile[:already_printed] = true + if profile[:name].nil? print_target('Target: ', "\n\n") + @profile_printed = true return true end @@ -410,6 +523,7 @@ class InspecRspecCli < InspecRspecJson # rubocop:disable Metrics/ClassLength output.puts 'Version: ' + (profile[:version] || 'unknown') print_target('Target: ', "\n") output.puts + @profile_printed = true true end diff --git a/lib/inspec/rule.rb b/lib/inspec/rule.rb index f5170b599..eea945ac9 100644 --- a/lib/inspec/rule.rb +++ b/lib/inspec/rule.rb @@ -12,6 +12,24 @@ module Inspec class Rule # rubocop:disable Metrics/ClassLength include ::RSpec::Matchers + # + # Include any resources from the given resource DSL. The passed + # resource_dsl will also be included in any Inspec::Expect objects + # we make. + # + # @params resource_dsl [Module] + # @returns [TrueClass] + # + def self.with_resource_dsl(resource_dsl) + include resource_dsl + @resource_dsl = resource_dsl + true + end + + def self.resource_dsl # rubocop:disable Style/TrivialAccessors + @resource_dsl + end + def initialize(id, profile_id, _opts, &block) @impact = nil @title = nil @@ -27,11 +45,16 @@ module Inspec @__profile_id = profile_id @__checks = [] @__skip_rule = nil + @__merge_count = 0 # evaluate the given definition instance_eval(&block) if block_given? end + def to_s + Inspec::Rule.rule_id(self) + end + def id(*_) # never overwrite the ID @id @@ -101,12 +124,12 @@ module Inspec include dsl end.new(method(:__add_check)) else - __add_check('describe', values, block) + __add_check('describe', values, with_dsl(block)) end end def expect(value, &block) - target = Inspec::Expect.new(value, &block) + target = Inspec::Expect.new(value, &with_dsl(block)) __add_check('expect', [value], target) target end @@ -135,6 +158,10 @@ module Inspec rule.instance_variable_set(:@__skip_rule, value) end + def self.merge_count(rule) + rule.instance_variable_get(:@__merge_count) + end + def self.prepare_checks(rule) msg = skip_status(rule) return checks(rule) unless msg @@ -169,6 +196,8 @@ module Inspec dst.instance_variable_set(:@__checks, sc) unless sc.empty? sr = skip_status(src) set_skip_rule(dst, sr) unless sr.nil? + # increment merge count + dst.instance_variable_set(:@__merge_count, merge_count(dst) + 1) end private @@ -177,6 +206,31 @@ module Inspec @__checks.push([describe_or_expect, values, block]) end + # + # Takes a block and returns a block that will run the given block + # with access to the resource_dsl of the current class. This is to + # ensure that inside the constructed Rspec::ExampleGroup users + # have access to DSL methods. Previous this was done in + # Inspec::Runner before sending the example groups to rspec. It + # was moved here to ensure that code inside `its` blocks hae the + # same visibility into resources as code outside its blocks. + # + # @param [Proc] block + # @return [Proc] + # + def with_dsl(block) + return nil if block.nil? + if self.class.resource_dsl + dsl = self.class.resource_dsl + proc do |*args| + include dsl + instance_exec(*args, &block) + end + else + block + end + end + # Idio(ma)tic unindent # TODO: replace this # diff --git a/lib/inspec/runner.rb b/lib/inspec/runner.rb index 4fd54a15e..ab44c8a87 100644 --- a/lib/inspec/runner.rb +++ b/lib/inspec/runner.rb @@ -11,17 +11,39 @@ require 'inspec/profile_context' require 'inspec/profile' require 'inspec/metadata' require 'inspec/secrets' +require 'inspec/dependencies/cache' # spec requirements module Inspec + # + # Inspec::Runner coordinates the running of tests and is the main + # entry point to the application. + # + # Users are expected to insantiate a runner, add targets to be run, + # and then call the run method: + # + # ``` + # r = Inspec::Runner.new() + # r.add_target("/path/to/some/profile") + # r.add_target("http://url/to/some/profile") + # r.run + # ``` + # class Runner # rubocop:disable Metrics/ClassLength extend Forwardable + + def_delegator :@test_collector, :report + attr_reader :backend, :rules, :attributes def initialize(conf = {}) - @rules = {} + @rules = [] @conf = conf.dup @conf[:logger] ||= Logger.new(nil) - + @target_profiles = [] + @controls = @conf[:controls] || [] + @ignore_supports = @conf[:ignore_supports] + @create_lockfile = @conf[:create_lockfile] + @cache = Inspec::Cache.new(@conf[:cache]) @test_collector = @conf.delete(:test_collector) || begin require 'inspec/runner_rspec' RunnerRspec.new(@conf) @@ -38,19 +60,58 @@ module Inspec @test_collector.tests end - def normalize_map(hm) - res = {} - hm.each {|k, v| - res[k.to_s] = v - } - res - end - def configure_transport @backend = Inspec::Backend.create(@conf) @test_collector.backend = @backend end + def reset + @test_collector.reset + @target_profiles.each do |profile| + profile.runner_context.rules = {} + end + @rules = [] + end + + def load + all_controls = [] + + @target_profiles.each do |profile| + @test_collector.add_profile(profile) + write_lockfile(profile) if @create_lockfile + profile.locked_dependencies + profile.load_libraries + @attributes |= profile.runner_context.attributes + all_controls += profile.collect_tests + end + + all_controls.each do |rule| + register_rule(rule) unless rule.nil? + end + end + + def run(with = nil) + Inspec::Log.debug "Starting run with targets: #{@target_profiles.map(&:to_s)}" + load + run_tests(with) + end + + def write_lockfile(profile) + return false if !profile.writable? + + if profile.lockfile_exists? + Inspec::Log.debug "Using existing lockfile #{profile.lockfile_path}" + else + Inspec::Log.debug "Creating lockfile: #{profile.lockfile_path}" + lockfile = profile.generate_lockfile + File.write(profile.lockfile_path, lockfile.to_yaml) + end + end + + def run_tests(with = nil) + @test_collector.run(with) + end + # determine all attributes before the execution, fetch data from secrets backend def load_attributes(options) attributes = {} @@ -66,99 +127,85 @@ module Inspec options['attributes'] = attributes end - def add_target(target, options = {}) - profile = Inspec::Profile.for_target(target, options) + # + # add_target allows the user to add a target whose tests will be + # run when the user calls the run method. + # + # A target is a path or URL that points to a profile. Using this + # target we generate a Profile and a ProfileContext. The content + # (libraries, tests, and attributes) from the Profile are loaded + # into the ProfileContext. + # + # If the profile depends on other profiles, those profiles will be + # loaded on-demand when include_content or required_content are + # called using similar code in Inspec::DSL. + # + # Once the we've loaded all of the tests files in the profile, we + # query the profile for the full list of rules. Those rules are + # registered with the @test_collector which is ultimately + # responsible for actually running the tests. + # + # TODO: Deduplicate/clarify the loading code that exists in here, + # the ProfileContext, the Profile, and Inspec::DSL + # + # @params target [String] A path or URL to a profile or raw test. + # @params _opts [Hash] Unused, but still here to avoid breaking kitchen-inspec + # + # @eturns [Inspec::ProfileContext] + # + def add_target(target, _opts = []) + profile = Inspec::Profile.for_target(target, + cache: @cache, + backend: @backend, + controls: @controls, + attributes: @conf[:attributes]) fail "Could not resolve #{target} to valid input." if profile.nil? - add_profile(profile, options) + @target_profiles << profile if supports_profile?(profile) end def supports_profile?(profile) - return true if profile.metadata.nil? + return true if @ignore_supports - if !profile.metadata.supports_runtime? + if !profile.supports_runtime? fail 'This profile requires InSpec version '\ "#{profile.metadata.inspec_requirement}. You are running "\ "InSpec v#{Inspec::VERSION}.\n" end - if !profile.metadata.supports_transport?(@backend) - os_info = @backend.os[:name].to_s - fail "This OS/platform (#{os_info}) is not supported by this profile." + if !profile.supports_os? + fail "This OS/platform (#{@backend.os[:name]}) is not supported by this profile." end true end - def add_profile(profile, options = {}) - return if !options[:ignore_supports] && !supports_profile?(profile) - - @test_collector.add_profile(profile) - options[:metadata] = profile.metadata - options[:profile] = profile - - libs = profile.libraries.map do |k, v| - { ref: k, content: v } - end - - tests = profile.tests.map do |ref, content| - r = profile.source_reader.target.abs_path(ref) - { ref: r, content: content } - end - - add_content(tests, libs, options) + # In some places we read the rules off of the runner, in other + # places we read it off of the profile context. To keep the API's + # the same, we provide an #all_rules method here as well. + def all_rules + @rules end - def create_context(options = {}) - meta = options[:metadata] - profile_id = nil - profile_id = meta.params[:name] unless meta.nil? - Inspec::ProfileContext.new(profile_id, @backend, @conf.merge(options)) + def register_rules(ctx) + new_tests = false + ctx.rules.each do |rule_id, rule| + next if block_given? && !(yield rule_id, rule) + new_tests = true + register_rule(rule) + end + new_tests end - def add_content(tests, libs, options = {}) - return if tests.nil? || tests.empty? - - # load all libraries - ctx = create_context(options) - ctx.load_libraries(libs.map { |x| [x[:content], x[:ref], x[:line]] }) - - # hand the context to the profile for further evaluation - unless (profile = options[:profile]).nil? - profile.runner_context = ctx - end - - # evaluate the test content - tests = [tests] unless tests.is_a? Array - tests.each { |t| add_test_to_context(t, ctx) } - - # merge all collect all attributes - @attributes |= ctx.attributes - - # process the resulting rules - filter_controls(ctx.rules, options[:controls]).each do |rule_id, rule| - register_rule(rule_id, rule) - end + def eval_with_virtual_profile(command) + require 'fetchers/mock' + add_target({ 'inspec.yml' => 'name: inspec-shell' }) + our_profile = @target_profiles.first + ctx = our_profile.runner_context + ctx.load(command) end - def_delegator :@test_collector, :run - def_delegator :@test_collector, :report - private - def add_test_to_context(test, ctx) - content = test[:content] - return if content.nil? || content.empty? - ctx.load(content, test[:ref], test[:line]) - end - - def filter_controls(controls_map, include_list) - return controls_map if include_list.nil? || include_list.empty? - controls_map.select do |_, c| - id = ::Inspec::Rule.rule_id(c) - include_list.include?(id) - end - end - def block_source_info(block) return {} if block.nil? || !block.respond_to?(:source_location) opts = {} @@ -202,24 +249,15 @@ module Inspec nil end - def register_rule(rule_id, rule) - @rules[rule_id] = rule + def register_rule(rule) + Inspec::Log.debug "Registering rule #{rule}" + @rules << rule checks = ::Inspec::Rule.prepare_checks(rule) - examples = checks.map do |m, a, b| + examples = checks.flat_map do |m, a, b| get_check_example(m, a, b) - end.flatten.compact + end.compact - examples.each do |example| - # TODO: Remove this!! It is very dangerous to do this here. - # The goal of this is to make the audit DSL available to all - # describe blocks. Right now, these blocks are executed outside - # the scope of this run, thus not gaining ony of the DSL pieces. - # To circumvent this, the full DSL is attached to the example's - # scope. - dsl = Inspec::Resource.create_dsl(backend) - example.send(:include, dsl) - @test_collector.add_test(example, rule) - end + examples.each { |e| @test_collector.add_test(e, rule) } end end end diff --git a/lib/inspec/runner_mock.rb b/lib/inspec/runner_mock.rb index 10aaebe67..9037475ba 100644 --- a/lib/inspec/runner_mock.rb +++ b/lib/inspec/runner_mock.rb @@ -7,6 +7,10 @@ module Inspec attr_reader :tests, :profiles attr_writer :backend def initialize + reset + end + + def reset @tests = [] @profiles = [] end diff --git a/lib/inspec/runner_rspec.rb b/lib/inspec/runner_rspec.rb index 8e9975a66..0e1e25bcc 100644 --- a/lib/inspec/runner_rspec.rb +++ b/lib/inspec/runner_rspec.rb @@ -15,8 +15,7 @@ module Inspec def initialize(conf) @conf = conf @formatter = nil - reset_tests - configure_output + reset end # Create a new RSpec example group from arguments and block. @@ -87,17 +86,18 @@ module Inspec reporter.output_hash end - private - # Empty the list of registered tests. # # @return [nil] - def reset_tests + def reset @tests = RSpec::Core::World.new # resets "pending examples" in reporter RSpec.configuration.reset + configure_output end + private + FORMATTERS = { 'json-min' => 'InspecRspecMiniJson', 'json' => 'InspecRspecJson', diff --git a/lib/inspec/shell.rb b/lib/inspec/shell.rb index aae8cdf07..113284d33 100644 --- a/lib/inspec/shell.rb +++ b/lib/inspec/shell.rb @@ -3,24 +3,29 @@ # author: Christoph Hartmann require 'rspec/core/formatters/base_text_formatter' +require 'pry' module Inspec + # A pry based shell for inspec. Given a runner (with a configured backend and + # all that jazz), this shell will produce a pry shell from which you can run + # inspec/ruby commands that will be run within the context of the runner. class Shell def initialize(runner) @runner = runner - # load and configure pry - require 'pry' - configure_pry end def start - # store context to run commands in this context - c = { content: 'binding.pry', ref: nil, line: nil } - @runner.add_content(c, []) - @runner.run + # This will hold a single evaluation binding context as opened within + # the instance_eval context of the anonymous class that the profile + # context creates to evaluate each individual test file. We want to + # pretend like we are constantly appending to the same file and want + # to capture the local variable context from inside said class. + @ctx_binding = @runner.eval_with_virtual_profile('binding') + configure_pry + @ctx_binding.pry end - def configure_pry + def configure_pry # rubocop:disable Metrics/AbcSize # Remove all hooks and checks Pry.hooks.clear_all that = self @@ -35,9 +40,31 @@ module Inspec Pry.prompt = [proc { "#{readline_ignore("\e[0;32m")}#{Pry.config.prompt_name}> #{readline_ignore("\e[0m")}" }] # Add a help menu as the default intro - Pry.hooks.add_hook(:before_session, :intro) do + Pry.hooks.add_hook(:before_session, 'inspec_intro') do intro end + + # Track the rules currently registered and what their merge count is. + Pry.hooks.add_hook(:before_eval, 'inspec_before_eval') do + @runner.reset + end + + # After pry has evaluated a commanding within the binding context of a + # test file, register all the rules it discovered. + Pry.hooks.add_hook(:after_eval, 'inspec_after_eval') do + @runner.load + @runner.run_tests if !@runner.all_rules.empty? + end + + # Don't print out control class inspection when the user uses DSL methods. + # Instead produce a result of evaluating their control. + Pry.config.print = proc do |_output_, value, pry| + next if !@runner.all_rules.empty? + pry.pager.open do |pager| + pager.print pry.config.output_prefix + Pry::ColorPrinter.pp(value, pager, Pry::Terminal.width! - 1) + end + end end def readline_ignore(code) @@ -120,12 +147,4 @@ EOF puts Inspec::Resource.registry.keys.join(' ') end end - - class NoSummaryFormatter < RSpec::Core::Formatters::BaseTextFormatter - RSpec::Core::Formatters.register self, :dump_summary - - def dump_summary(*_args) - # output nothing - end - end end diff --git a/lib/inspec/source_reader.rb b/lib/inspec/source_reader.rb index 070eea6bf..40d0ccb6e 100644 --- a/lib/inspec/source_reader.rb +++ b/lib/inspec/source_reader.rb @@ -11,9 +11,6 @@ module Inspec class SourceReaderRegistry < PluginRegistry def resolve(target) return nil if target.nil? - unless target.is_a? Inspec::Plugins::Fetcher - fail "SourceReader cannot resolve targets that aren't Fetchers: #{target.class}" - end super(target) end end diff --git a/lib/inspec/version.rb b/lib/inspec/version.rb index 479a10c49..dc7181cab 100644 --- a/lib/inspec/version.rb +++ b/lib/inspec/version.rb @@ -1,7 +1,8 @@ # encoding: utf-8 +# frozen_string_literal: true # author: Dominik Richter # author: Christoph Hartmann module Inspec - VERSION = '0.30.0'.freeze + VERSION = '1.3.0'.freeze end diff --git a/lib/matchers/matchers.rb b/lib/matchers/matchers.rb index e5b5bebfd..4f8fa33b4 100644 --- a/lib/matchers/matchers.rb +++ b/lib/matchers/matchers.rb @@ -219,7 +219,7 @@ end # unsupported RSpec::Matchers.define :contain do |_rule| match do |_resource| - fail "[UNSUPPORTED] `contain` matcher. Please use the following syntax `its('content') { should match('value') }`." + fail "[UNSUPPORTED] `contain` matcher. Please use the following syntax `its('content') { should include('value') }`." end end @@ -232,7 +232,7 @@ end RSpec::Matchers.define :cmp do |first_expected| def integer?(value) - !(value =~ /\A[1-9]\d*\Z/).nil? + !(value =~ /\A0+\Z|\A[1-9]\d*\Z/).nil? end def float?(value) @@ -305,14 +305,18 @@ RSpec::Matchers.define :cmp do |first_expected| end failure_message do |actual| - actual = '0' + actual.to_s(8) if octal?(@expected) + actual = ('0' + actual.to_s(8)).inspect if octal?(@expected) "\n" + format_expectation(false) + "\n got: #{actual}\n\n(compared using `cmp` matcher)\n" end failure_message_when_negated do |actual| - actual = '0' + actual.to_s(8) if octal?(@expected) + actual = ('0' + actual.to_s(8)).inspect if octal?(@expected) "\n" + format_expectation(true) + "\n got: #{actual}\n\n(compared using `cmp` matcher)\n" end + + description do + "cmp #{@operation} #{@expected.inspect}" + end end # user resource matcher for serverspec compatibility diff --git a/lib/resources/apache_conf.rb b/lib/resources/apache_conf.rb index 31eccee24..228d53816 100644 --- a/lib/resources/apache_conf.rb +++ b/lib/resources/apache_conf.rb @@ -21,7 +21,7 @@ module Inspec::Resources def initialize(conf_path = nil) @conf_path = conf_path || inspec.apache.conf_path - @conf_dir = File.dirname(@conf_path) + @conf_dir = conf_path ? File.dirname(@conf_path) : inspec.apache.conf_dir @files_contents = {} @content = nil @params = nil @@ -105,7 +105,7 @@ module Inspec::Resources includes = [] (include_files + include_files_optional).each do |f| - id = File.join(@conf_dir, f) + id = Pathname.new(f).absolute? ? f : File.join(@conf_dir, f) files = find_files(id, depth: 1, type: 'file') includes.push(files) if files diff --git a/lib/resources/file.rb b/lib/resources/file.rb index f14deedaf..f219e450e 100644 --- a/lib/resources/file.rb +++ b/lib/resources/file.rb @@ -7,7 +7,20 @@ require 'shellwords' module Inspec::Resources + module FilePermissionsSelector + def select_file_perms_style(os) + if os.unix? + UnixFilePermissions.new(inspec) + elsif os.windows? + WindowsFilePermissions.new(inspec) + end + end + end + class FileResource < Inspec.resource(1) # rubocop:disable Metrics/ClassLength + include FilePermissionsSelector + include MountParser + name 'file' desc 'Use the file InSpec audit resource to test all system file types, including files, directories, symbolic links, named pipes, sockets, character devices, block devices, and doors.' example " @@ -16,14 +29,16 @@ module Inspec::Resources it { should be_file } it { should be_readable } it { should be_writable } + it { should be_executable.by_user('root') } it { should be_owned_by 'root' } its('mode') { should cmp '0644' } end " - include MountParser attr_reader :file, :mount_options def initialize(path) + # select permissions style + @perms_provider = select_file_perms_style(inspec.os) @file = inspec.backend.file(path) end @@ -51,20 +66,23 @@ module Inspec::Resources def readable?(by_usergroup, by_specific_user) return false unless exist? + return skip_resource '`readable?` is not supported on your OS yet.' if @perms_provider.nil? - file_permission_granted?('r', by_usergroup, by_specific_user) + file_permission_granted?('read', by_usergroup, by_specific_user) end def writable?(by_usergroup, by_specific_user) return false unless exist? + return skip_resource '`writable?` is not supported on your OS yet.' if @perms_provider.nil? - file_permission_granted?('w', by_usergroup, by_specific_user) + file_permission_granted?('write', by_usergroup, by_specific_user) end def executable?(by_usergroup, by_specific_user) return false unless exist? + return skip_resource '`executable?` is not supported on your OS yet.' if @perms_provider.nil? - file_permission_granted?('x', by_usergroup, by_specific_user) + file_permission_granted?('execute', by_usergroup, by_specific_user) end def mounted?(expected_options = nil, identical = false) @@ -109,16 +127,14 @@ module Inspec::Resources private - def file_permission_granted?(flag, by_usergroup, by_specific_user) - unless inspec.os.unix? - fail 'Checking file permissions is not supported on your os' - end - + def file_permission_granted?(access, by_usergroup, by_specific_user) + fail '`file_permission_granted?` is not supported on your OS' if @perms_provider.nil? if by_specific_user.nil? || by_specific_user.empty? + fail '`check_file_permission_by_mask` is not supported on your OS' unless inspec.os.unix? usergroup = usergroup_for(by_usergroup, by_specific_user) - check_file_permission_by_mask(usergroup, flag) + check_file_permission_by_mask(usergroup, access) else - check_file_permission_by_user(by_specific_user, flag) + @perms_provider.check_file_permission_by_user(by_specific_user, access, source_path) end end @@ -129,23 +145,6 @@ module Inspec::Resources (file.mode & mask) != 0 end - def check_file_permission_by_user(user, flag) - if inspec.os.linux? - perm_cmd = "su -s /bin/sh -c \"test -#{flag} #{source_path}\" #{user}" - elsif inspec.os.bsd? || inspec.os.solaris? - perm_cmd = "sudo -u #{user} test -#{flag} #{source_path}" - elsif inspec.os.aix? - perm_cmd = "su #{user} -c test -#{flag} #{source_path}" - elsif inspec.os.hpux? - perm_cmd = "su #{user} -c \"test -#{flag} #{source_path}\"" - else - return skip_resource 'The `file` resource does not support `by_user` on your OS.' - end - - cmd = inspec.command(perm_cmd) - cmd.exit_status == 0 ? true : false - end - def usergroup_for(usergroup, specific_user) if usergroup == 'others' 'other' @@ -156,4 +155,57 @@ module Inspec::Resources end end end + + class FilePermissions + attr_reader :inspec + def initialize(inspec) + @inspec = inspec + end + end + + class UnixFilePermissions < FilePermissions + def check_file_permission_by_user(user, access_type, path) + flag = case access_type + when 'read' + 'r' + when 'write' + 'w' + when 'execute' + 'x' + else + fail 'Invalid access_type provided' + end + if inspec.os.linux? + perm_cmd = "su -s /bin/sh -c \"test -#{flag} #{path}\" #{user}" + elsif inspec.os.bsd? || inspec.os.solaris? + perm_cmd = "sudo -u #{user} test -#{flag} #{path}" + elsif inspec.os.aix? + perm_cmd = "su #{user} -c test -#{flag} #{path}" + elsif inspec.os.hpux? + perm_cmd = "su #{user} -c \"test -#{flag} #{path}\"" + else + return skip_resource 'The `file` resource does not support `by_user` on your OS.' + end + + cmd = inspec.command(perm_cmd) + cmd.exit_status == 0 ? true : false + end + end + + class WindowsFilePermissions < FilePermissions + def check_file_permission_by_user(user, access_type, path) + access_rule = case access_type + when 'read' + '@(\'FullControl\', \'Modify\', \'ReadAndExecute\', \'Read\', \'ListDirectory\')' + when 'write' + '@(\'FullControl\', \'Modify\', \'Write\')' + when 'execute' + '@(\'FullControl\', \'Modify\', \'ReadAndExecute\', \'ExecuteFile\')' + else + fail 'Invalid access_type provided' + end + cmd = inspec.command("@(@((Get-Acl '#{path}').access | Where-Object {$_.AccessControlType -eq 'Allow' -and $_.IdentityReference -eq '#{user}' }) | Where-Object {($_.FileSystemRights.ToString().Split(',') | % {$_.trim()} | ? {#{access_rule} -contains $_}) -ne $null}) | measure | % { $_.Count }") + cmd.stdout.chomp == '0' ? false : true + end + end end diff --git a/lib/resources/gem.rb b/lib/resources/gem.rb index c34480a46..3cf04e036 100644 --- a/lib/resources/gem.rb +++ b/lib/resources/gem.rb @@ -9,6 +9,7 @@ module Inspec::Resources example " describe gem('rubocop') do it { should be_installed } + its('version') { should eq '0.33.0' } end " diff --git a/lib/resources/group.rb b/lib/resources/group.rb deleted file mode 100644 index 81ef3296e..000000000 --- a/lib/resources/group.rb +++ /dev/null @@ -1,137 +0,0 @@ -# encoding: utf-8 -# author: Christoph Hartmann -# author: Dominik Richter - -# Usage: -# describe group('root') do -# it { should exist } -# its('gid') { should eq 0 } -# end -# -# deprecated has matcher -# describe group('root') do -# it { should have_gid 0 } -# end - -module Inspec::Resources - class Group < Inspec.resource(1) - name 'group' - desc 'Use the group InSpec audit resource to test groups on the system.' - example " - describe group('root') do - it { should exist } - its('gid') { should eq 0 } - end - " - - def initialize(groupname, domain = nil) - @group = groupname.downcase - @domain = domain - @domain = @domain.downcase unless @domain.nil? - - @cache = nil - - # select group manager - @group_provider = nil - if inspec.os.unix? - @group_provider = UnixGroup.new(inspec) - elsif inspec.os.windows? - @group_provider = WindowsGroup.new(inspec) - else - return skip_resource 'The `group` resource is not supported on your OS yet.' - end - end - - # verifies if a group exists - def exists? - # ensure that we found one group - !group_info.nil? && group_info.size > 0 - end - - def gid - return nil if group_info.nil? || group_info.size == 0 - - # the default case should be one group - return group_info[0][:gid] if group_info.size == 1 - - # return array if we got multiple gids - group_info.map { |grp| grp[:gid] } - end - - # implements rspec has matcher, to be compatible with serverspec - def has_gid?(compare_gid) - gid == compare_gid - end - - def local - return nil if group_info.nil? || group_info.size == 0 - - # the default case should be one group - return group_info[0][:local] if group_info.size == 1 - - # return array if we got multiple gids - group_info.map { |grp| grp[:local] } - end - - def to_s - "Group #{@group}" - end - - private - - def group_info - return @cache if !@cache.nil? - @cache = @group_provider.group_info(@group, @domain) if !@group_provider.nil? - end - end - - class GroupInfo - attr_reader :inspec - def initialize(inspec) - @inspec = inspec - end - end - - # implements generic unix groups via /etc/group - class UnixGroup < GroupInfo - def group_info(group, _domain = nil) - inspec.etc_group.where(name: group).entries.map { |grp| - { - name: grp['name'], - gid: grp['gid'], - } - } - end - end - - class WindowsGroup < GroupInfo - def group_info(compare_group, compare_domain = nil) - cmd = inspec.command('Get-WmiObject Win32_Group | Select-Object -Property Caption, Domain, Name, SID, LocalAccount | ConvertTo-Json') - - # cannot rely on exit code for now, successful command returns exit code 1 - # return nil if cmd.exit_status != 0, try to parse json - begin - groups = JSON.parse(cmd.stdout) - rescue JSON::ParserError => _e - return nil - end - - # ensure we have an array of groups - groups = [groups] if !groups.is_a?(Array) - - # reduce list - groups.each_with_object([]) do |grp, grp_collection| - # map object - grp_info = { - name: grp['Name'], - domain: grp['Domain'], - caption: grp['Caption'], - gid: nil, - sid: grp['SID'], - local: grp['LocalAccount'], - } - return grp_collection.push(grp_info) if grp_info[:name].casecmp(compare_group) == 0 && (compare_domain.nil? || grp_info[:domain].casecmp(compare_domain) == 0) - end - end - end -end diff --git a/lib/resources/groups.rb b/lib/resources/groups.rb new file mode 100644 index 000000000..f64745a03 --- /dev/null +++ b/lib/resources/groups.rb @@ -0,0 +1,190 @@ +# encoding: utf-8 +# author: Christoph Hartmann +# author: Dominik Richter + +require 'utils/filter' + +module Inspec::Resources + # This file contains two resources, the `group` and `groups` resource. + # The `group` resource is optimized for requests that verify specific groups + # that you know upfront for testing. If you need to query all groups or search + # specific groups with certain properties, use the `groups` resource. + module GroupManagementSelector + # select group provider based on the operating system + # returns nil, if no group manager was found for the operating system + def select_group_manager(os) + if os.unix? + @group_provider = UnixGroup.new(inspec) + elsif os.windows? + @group_provider = WindowsGroup.new(inspec) + end + end + end + + class Groups < Inspec.resource(1) + include GroupManagementSelector + + name 'groups' + desc 'Use the group InSpec audit resource to test groups on the system. Groups can be filtered.' + example " + describe groups.where { name == 'root'} do + its('names') { should eq ['root'] } + its('gids') { should eq [0] } + end + + describe groups.where { name == 'Administrators'} do + its('names') { should eq ['Administrators'] } + its('gids') { should eq ['S-1-5-32-544'] } + end + " + + def initialize + # select group manager + @group_provider = select_group_manager(inspec.os) + return skip_resource 'The `groups` resource is not supported on your OS yet.' if @group_provider.nil? + end + + filter = FilterTable.create + filter.add_accessor(:where) + .add_accessor(:entries) + .add(:names, field: 'name') + .add(:gids, field: 'gid') + .add(:domains, field: 'domain') + .add(:exists?) { |x| !x.entries.empty? } + filter.connect(self, :collect_group_details) + + def to_s + 'Groups' + end + + private + + # collects information about every group + def collect_group_details + return @groups_cache ||= @group_provider.groups unless @group_provider.nil? + [] + end + end + + # Usage: + # describe group('root') do + # it { should exist } + # its('gid') { should eq 0 } + # end + # + # deprecated has matcher + # describe group('root') do + # it { should have_gid 0 } + # end + class Group < Inspec.resource(1) + include GroupManagementSelector + + name 'group' + desc 'Use the group InSpec audit resource to test groups on the system.' + example " + describe group('root') do + it { should exist } + its('gid') { should eq 0 } + end + " + + def initialize(groupname) + @group = groupname + @group = @group.downcase unless inspec.os.windows? + + # select group manager + @group_provider = select_group_manager(inspec.os) + return skip_resource 'The `group` resource is not supported on your OS yet.' if @group_provider.nil? + end + + # verifies if a group exists + def exists? + group_info.entries.size > 0 + end + + def gid + gids = group_info.gids + if gids.size == 0 + nil + # the default case should be one group + elsif gids.size == 1 + gids.entries[0] + else + fail 'found more than one group with the same name, please use `groups` resource' + end + end + + # implements rspec has matcher, to be compatible with serverspec + def has_gid?(compare_gid) + gid == compare_gid + end + + def local + # at this point the implementation only returns local groups + true + end + + def to_s + "Group #{@group}" + end + + private + + def group_info + # we need a local copy for the block + group = @group.dup + @groups_cache ||= inspec.groups.where { name == group } + end + end + + class GroupInfo + attr_reader :inspec + def initialize(inspec) + @inspec = inspec + end + + def groups + fail 'group provider must implement the `groups` method' + end + end + + # implements generic unix groups via /etc/group + class UnixGroup < GroupInfo + def groups + inspec.etc_group.entries + end + end + + class WindowsGroup < GroupInfo + # returns all local groups + def groups + script = <<-EOH +Function ConvertTo-SID { Param([byte[]]$BinarySID) + (New-Object System.Security.Principal.SecurityIdentifier($BinarySID,0)).Value +} + +$Computername = $Env:Computername +$adsi = [ADSI]"WinNT://$Computername" +$groups = $adsi.Children | where {$_.SchemaClassName -eq 'group'} | ForEach { + $name = $_.Name[0] + $sid = ConvertTo-SID -BinarySID $_.ObjectSID[0] + $group =[ADSI]$_.Path + new-object psobject -property @{name = $group.Name[0]; gid = $sid; domain=$Computername} +} +$groups | ConvertTo-Json -Depth 3 + EOH + cmd = inspec.powershell(script) + # cannot rely on exit code for now, successful command returns exit code 1 + # return nil if cmd.exit_status != 0, try to parse json + begin + groups = JSON.parse(cmd.stdout) + rescue JSON::ParserError => _e + return [] + end + + # ensure we have an array of groups + groups = [groups] if !groups.is_a?(Array) + groups + end + end +end diff --git a/lib/resources/host.rb b/lib/resources/host.rb index 6a1463869..53a102687 100644 --- a/lib/resources/host.rb +++ b/lib/resources/host.rb @@ -32,6 +32,10 @@ module Inspec::Resources describe host('example.com') do it { should be_reachable } end + + describe host('example.com', port: '80') do + it { should be_reachable } + end " def initialize(hostname, params = {}) @@ -49,7 +53,7 @@ module Inspec::Resources end end - # if we get the IP adress, the host is resolvable + # if we get the IP address, the host is resolvable def resolvable?(type = nil) warn "The `host` resource ignores #{type} parameters. Continue to resolve host." if !type.nil? resolve.nil? || resolve.empty? ? false : true @@ -60,7 +64,7 @@ module Inspec::Resources ping.nil? ? false : ping end - # returns all A records of the IP adress, will return an array + # returns all A records of the IP address, will return an array def ipaddress resolve.nil? || resolve.empty? ? nil : resolve end @@ -122,9 +126,7 @@ module Inspec::Resources # TCP and port: Test-NetConnection -ComputerName www.microsoft.com -RemotePort 80 request = "Test-NetConnection -ComputerName #{hostname}" request += " -RemotePort #{port}" unless port.nil? - request += '| Select-Object -Property ComputerName, RemoteAddress, RemotePort, SourceAddress, PingSucceeded | ConvertTo-Json' - p request - request += '| Select-Object -Property ComputerName, PingSucceeded | ConvertTo-Json' + request += '| Select-Object -Property ComputerName, TcpTestSucceeded, PingSucceeded | ConvertTo-Json' cmd = inspec.command(request) begin @@ -133,7 +135,12 @@ module Inspec::Resources return nil end - ping['PingSucceeded'] + # Logic being if you provided a port you wanted to check it was open + if port.nil? + ping['PingSucceeded'] + else + ping['TcpTestSucceeded'] + end end def resolve(hostname) diff --git a/lib/resources/iis_site.rb b/lib/resources/iis_site.rb index daefede61..e90bf0291 100644 --- a/lib/resources/iis_site.rb +++ b/lib/resources/iis_site.rb @@ -1,4 +1,5 @@ # encoding: utf-8 +# frozen_string_literal: true # check for site in IIS # Usage: # describe iis_site('Default Web Site') do @@ -37,6 +38,22 @@ module Inspec::Resources return skip_resource 'The `iis_site` resource is not supported on your OS.' if inspec.os[:family] != 'windows' end + def app_pool + iis_site[:app_pool] + end + + def bindings + iis_site[:bindings] + end + + def state + iis_site[:state] + end + + def path + iis_site[:path] + end + def exists? !iis_site.nil? && !iis_site[:name].nil? end diff --git a/lib/resources/inetd_conf.rb b/lib/resources/inetd_conf.rb index e34d9b9b3..ba123a554 100644 --- a/lib/resources/inetd_conf.rb +++ b/lib/resources/inetd_conf.rb @@ -22,6 +22,12 @@ module Inspec::Resources @conf_path = path || '/etc/inetd.conf' end + # overwrite exec to ensure it works with its + # TODO: this needs to be fixed in RSpec + def exec + read_params['exec'] + end + def method_missing(name) read_params[name.to_s] end diff --git a/lib/resources/mysql.rb b/lib/resources/mysql.rb index d95b93fb2..b81613ea0 100644 --- a/lib/resources/mysql.rb +++ b/lib/resources/mysql.rb @@ -33,7 +33,7 @@ module Inspec::Resources @log_dir = '/var/log/' @log_path = '/var/log/mysql.log' @log_group = 'adm' - case os[:release] + case inspec.os[:release] when '14.04' @log_dir_group = 'syslog' else diff --git a/lib/resources/oneget.rb b/lib/resources/oneget.rb index 589c98c99..fea2616a7 100644 --- a/lib/resources/oneget.rb +++ b/lib/resources/oneget.rb @@ -16,6 +16,7 @@ module Inspec::Resources example " describe oneget('zoomit') do it { should be_installed } + its('version') { should eq '1.2.3' } end " diff --git a/lib/resources/os.rb b/lib/resources/os.rb index 667946d1f..26ac6faf4 100644 --- a/lib/resources/os.rb +++ b/lib/resources/os.rb @@ -7,7 +7,7 @@ module Inspec::Resources name 'os' desc 'Use the os InSpec audit resource to test the platform on which the system is running.' example " - describe os.family do + describe os[:family] do it { should eq 'redhat' } end @@ -21,7 +21,7 @@ module Inspec::Resources " # reuse helper methods from backend - %w{aix? redhat? debian? suse? bsd? solaris? linux? unix? windows? hpux?}.each do |os_family| + %w{aix? redhat? debian? suse? bsd? solaris? linux? unix? windows? hpux? darwin?}.each do |os_family| define_method(os_family.to_sym) do inspec.backend.os.send(os_family) end diff --git a/lib/resources/package.rb b/lib/resources/package.rb index f5d0ffa57..8a042ed28 100644 --- a/lib/resources/package.rb +++ b/lib/resources/package.rb @@ -91,9 +91,11 @@ module Inspec::Resources assignment_re: /^\s*([^:]*?)\s*:\s*(.*?)\s*$/, multiple_values: false, ).params + # If the package is removed and not purged, Status is "deinstall ok config-files" with exit_status 0 + # If the package is purged cmd fails with non-zero exit status { name: params['Package'], - installed: true, + installed: params['Status'].split(' ').first == 'install', version: params['Version'], type: 'deb', } @@ -184,14 +186,27 @@ module Inspec::Resources end end - # Determines the installed packages on Windows - # Currently we use 'Get-WmiObject -Class Win32_Product' as a detection method - # TODO: evaluate if alternative methods as proposed by Microsoft are still valid: + # Determines the installed packages on Windows using the Windows package registry entries. # @see: http://blogs.technet.com/b/heyscriptingguy/archive/2013/11/15/use-powershell-to-find-installed-software.aspx class WindowsPkg < PkgManagement def info(package_name) + search_paths = [ + 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*', + 'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*', + ] + + # add 64 bit search paths + if inspec.os.arch == 'x86_64' + search_paths << 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*' + search_paths << 'HKCU:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*' + end + # Find the package - cmd = inspec.command("Get-WmiObject -Class Win32_Product | Where-Object {$_.Name -eq '#{package_name}'} | Select-Object -Property Name,Version,Vendor,PackageCode,Caption,Description | ConvertTo-Json") + cmd = inspec.command <<-EOF.gsub(/^\s*/, '') + Get-ItemProperty (@("#{search_paths.join('", "')}") | Where-Object { Test-Path $_ }) | + Where-Object { $_.DisplayName -like "#{package_name}" -or $_.PSChildName -like "#{package_name}" } | + Select-Object -Property DisplayName,DisplayVersion | ConvertTo-Json + EOF begin package = JSON.parse(cmd.stdout) @@ -199,10 +214,13 @@ module Inspec::Resources return nil end + # What if we match multiple packages? just pick the first one for now. + package = package[0] if package.is_a?(Array) + { - name: package['Name'], + name: package['DisplayName'], installed: true, - version: package['Version'], + version: package['DisplayVersion'], type: 'windows', } end diff --git a/lib/resources/parse_config.rb b/lib/resources/parse_config.rb index 13c2a03ca..c775a0326 100644 --- a/lib/resources/parse_config.rb +++ b/lib/resources/parse_config.rb @@ -19,10 +19,27 @@ module Inspec::Resources desc 'Use the parse_config InSpec audit resource to test arbitrary configuration files.' example " output = command('some-command').stdout - describe parse_config(output, { data_config_option: value } ) do its('setting') { should eq 1 } end + + output2 = command('curl http://127.0.0.1/php_status').stdout + # php status is in format 'key : value', and we do not allow for multiple values + options2 = { + assignment_re: /^\s*([^:]*?)\s*:\s*(.*?)\s*$/, + multiple_values: false + } + + describe parse_config(output2, options2) do + its('pool') { should eq 'www'} + its('process manager') { should eq process_manager } + end + + # getting specific key from the output above, convert it to integer and then compare + # make sure 'listen queue' is below 100 + describe parse_config(output2, options2 ).params['listen queue'].to_i do + it { should be < 100 } + end " attr_reader :content diff --git a/lib/resources/pip.rb b/lib/resources/pip.rb index 1b93334b2..1eb6ab4f2 100644 --- a/lib/resources/pip.rb +++ b/lib/resources/pip.rb @@ -49,7 +49,7 @@ module Inspec::Resources end def to_s - "Pip Package #{@package_name}" + "Pip Package #{@package_name}" end private diff --git a/lib/resources/port.rb b/lib/resources/port.rb index ccc199787..f978ed21e 100644 --- a/lib/resources/port.rb +++ b/lib/resources/port.rb @@ -5,17 +5,6 @@ require 'utils/parser' require 'utils/filter' -# Usage: -# describe port(80) do -# it { should be_listening } -# its('protocol') {should eq 'tcp'} -# end -# -# not supported serverspec syntax -# describe port(80) do -# it { should be_listening.with('tcp') } -# end -# # TODO: currently we return local ip only # TODO: improve handling of same port on multiple interfaces module Inspec::Resources @@ -26,6 +15,7 @@ module Inspec::Resources describe port(80) do it { should be_listening } its('protocols') {should eq ['tcp']} + its('addresses') {should eq ['127.0.0.1']} end describe port.where { protocol =~ /tcp/ && port > 80 } do diff --git a/lib/resources/powershell.rb b/lib/resources/powershell.rb index 61e2f8078..93c962e8e 100644 --- a/lib/resources/powershell.rb +++ b/lib/resources/powershell.rb @@ -22,13 +22,9 @@ module Inspec::Resources unless inspec.os.windows? return skip_resource 'The `script` resource is not supported on your OS yet.' end - - # encodes a script as base64 to run as powershell encodedCommand - # this comes with performance issues: @see https://gist.github.com/fnichol/7b20596b950e65fb96f9 - require 'winrm' - script = WinRM::PowershellScript.new(script) - cmd = "powershell -encodedCommand #{script.encoded}" - super(cmd) + # since WinRM 2.0 and the default use of powershell for local execution in + # train, we do not need to wrap the script here anymore + super(script) end # we cannot determine if a command exists, because that does not work for scripts diff --git a/lib/resources/processes.rb b/lib/resources/processes.rb index 3013000de..0955d6d7f 100644 --- a/lib/resources/processes.rb +++ b/lib/resources/processes.rb @@ -26,7 +26,7 @@ module Inspec::Resources grep = '(/[^/]*)*'+grep if grep[0] != '/' grep = Regexp.new('^' + grep + '(\s|$)') end - all_cmds = ps_aux + all_cmds = ps_axo @list = all_cmds.find_all do |hm| hm[:command] =~ grep end @@ -43,39 +43,37 @@ module Inspec::Resources private - def ps_aux + def ps_axo os = inspec.os if os.linux? - command = 'ps auxZ' + command = 'ps axo label,pid,pcpu,pmem,vsz,rss,tty,stat,start,time,user:32,command' regex = /^([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+(.*)$/ else - command = 'ps aux' - regex = /^([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+(.*)$/ + command = 'ps axo pid,pcpu,pmem,vsz,rss,tty,stat,start,time,user,command' + regex = /^\s*([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+(.*)$/ end build_process_list(command, regex, os) end - Process = Struct.new(:label, :user, :pid, + Process = Struct.new(:label, :pid, :cpu, :mem, :vsz, :rss, :tty, :stat, - :start, :time, :command) + :start, :time, :user, :command) def build_process_list(command, regex, os) cmd = inspec.command(command) all = cmd.stdout.split("\n")[1..-1] return [] if all.nil? - lines = all.map do |line| line.match(regex) end.compact - lines.map do |m| a = m.to_a[1..-1] # grab all matching groups a.unshift(nil) unless os.linux? - a[2] = a[2].to_i + a[1] = a[1].to_i + a[4] = a[4].to_i a[5] = a[5].to_i - a[6] = a[6].to_i Process.new(*a) end end diff --git a/lib/resources/registry_key.rb b/lib/resources/registry_key.rb index b3f16ff50..8e9473f97 100644 --- a/lib/resources/registry_key.rb +++ b/lib/resources/registry_key.rb @@ -147,6 +147,11 @@ module Inspec::Resources script = <<-EOH Function InSpec-GetRegistryKey($path) { $reg = Get-Item ('Registry::' + $path) + if ($reg -eq $null) { + Write-Error "InSpec: Failed to find registry key" + exit 1001 + } + $properties = New-Object -Type PSObject $reg.Property | ForEach-Object { $key = $_ @@ -167,11 +172,16 @@ module Inspec::Resources # cannot rely on exit code for now, successful command returns exit code 1 # return nil if cmd.exit_status != 0, try to parse json begin - @registry_cache = JSON.parse(cmd.stdout) - # convert keys to lower case - @registry_cache = Hash[@registry_cache.map do |key, value| - [key.downcase, value] - end] + if cmd.exit_status == 1001 && cmd.stderr =~ /InSpec: Failed to find registry key/ + # TODO: provide the stderr output + @registry_cache = nil + else + @registry_cache = JSON.parse(cmd.stdout) + # convert keys to lower case + @registry_cache = Hash[@registry_cache.map do |key, value| + [key.downcase, value] + end] + end rescue JSON::ParserError => _e @registry_cache = nil end diff --git a/lib/resources/security_policy.rb b/lib/resources/security_policy.rb index b31db97a4..b0699fced 100644 --- a/lib/resources/security_policy.rb +++ b/lib/resources/security_policy.rb @@ -13,72 +13,155 @@ # All local GPO parameters can be examined via Registry, but not all security # parameters. Therefore we need a combination of Registry and secedit output +require 'hashie' + module Inspec::Resources + # known and supported MS privilege rights + # @see https://technet.microsoft.com/en-us/library/dd277311.aspx + # @see https://msdn.microsoft.com/en-us/library/windows/desktop/bb530716(v=vs.85).aspx + MS_PRIVILEGES_RIGHTS = [ + 'SeNetworkLogonRight', + 'SeBackupPrivilege', + 'SeChangeNotifyPrivilege', + 'SeSystemtimePrivilege', + 'SeCreatePagefilePrivilege', + 'SeDebugPrivilege', + 'SeRemoteShutdownPrivilege', + 'SeAuditPrivilege', + 'SeIncreaseQuotaPrivilege', + 'SeIncreaseBasePriorityPrivilege', + 'SeLoadDriverPrivilege', + 'SeBatchLogonRight', + 'SeServiceLogonRight', + 'SeInteractiveLogonRight', + 'SeSecurityPrivilege', + 'SeSystemEnvironmentPrivilege', + 'SeProfileSingleProcessPrivilege', + 'SeSystemProfilePrivilege', + 'SeAssignPrimaryTokenPrivilege', + 'SeRestorePrivilege', + 'SeShutdownPrivilege', + 'SeTakeOwnershipPrivilege', + 'SeUndockPrivilege', + 'SeManageVolumePrivilege', + 'SeRemoteInteractiveLogonRight', + 'SeImpersonatePrivilege', + 'SeCreateGlobalPrivilege', + 'SeIncreaseWorking', + 'SeTimeZonePrivilege', + 'SeCreateSymbolicLinkPrivilege', + 'SeDenyNetworkLogonRight', # Deny access to this computer from the network + 'SeDenyInteractiveLogonRight', # Deny logon locally + 'SeDenyBatchLogonRight', # Deny logon as a batch job + 'SeDenyServiceLogonRight', # Deny logon as a service + 'SeTcbPrivilege', + 'SeMachineAccountPrivilege', + 'SeCreateTokenPrivilege', + 'SeCreatePermanentPrivilege', + 'SeEnableDelegationPrivilege', + 'SeLockMemoryPrivilege', + 'SeSyncAgentPrivilege', + 'SeUnsolicitedInputPrivilege', + 'SeTrustedCredManAccessPrivilege', + 'SeRelabelPrivilege', # the privilege to change a Windows integrity label (new to Windows Vista) + 'SeDenyRemoteInteractiveLogonRight', # Deny logon through Terminal Services + ].freeze + class SecurityPolicy < Inspec.resource(1) name 'security_policy' desc 'Use the security_policy InSpec audit resource to test security policies on the Microsoft Windows platform.' example " describe security_policy do - its('SeNetworkLogonRight') { should eq '*S-1-5-11' } + its('SeNetworkLogonRight') { should include 'S-1-5-11' } end " - def initialize - @loaded = false - @policy = nil - @exit_status = nil + + def content + read_content end - # load security content - def load + def params(*opts) + opts.inject(read_params) do |res, nxt| + res.respond_to?(:key) ? res[nxt] : nil + end + end + + def method_missing(name) + params = read_params + return nil if params.nil? + + # deep search for hash key + params.extend Hashie::Extensions::DeepFind + res = params.deep_find(name.to_s) + + # return an empty array if configuration does not include rights configuration + return [] if res.nil? && MS_PRIVILEGES_RIGHTS.include?(name.to_s) + res + end + + def to_s + 'Security Policy' + end + + private + + def read_content + return @content if defined?(@content) + # export the security policy cmd = inspec.command('secedit /export /cfg win_secpol.cfg') return nil if cmd.exit_status.to_i != 0 # store file content cmd = inspec.command('Get-Content win_secpol.cfg') - @exit_status = cmd.exit_status.to_i - return nil if @exit_status != 0 - @policy = cmd.stdout - @loaded = true - - # returns self - self + return skip_resource "Can't read security policy" if cmd.exit_status.to_i != 0 + @content = cmd.stdout + if @content.empty? && file.size > 0 + return skip_resource "Can't read security policy" + end + @content ensure # delete temp file inspec.command('Remove-Item win_secpol.cfg').exit_status.to_i end - def method_missing(method) - # load data if needed - if @loaded == false - load - end + def read_params + return @params if defined?(@params) + return @params = {} if read_content.nil? - # find line with key - key = Regexp.escape(method.to_s) - target = '' - @policy.each_line {|s| - target = s.strip if s =~ /^\s*#{key}\s*=\s*(.*)\b/ - } - - # extract variable value - result = target.match(/[=]{1}\s*(?.*)/) - - if !result.nil? - val = result[:value] - val = val.to_i if val =~ /^\d+$/ - else - # TODO: we may need to return skip or failure if the - # requested value is not available - val = nil - end - - val + conf = SimpleConfig.new( + @content, + assignment_re: /^\s*(.*)=\s*(\S*)\s*$/, + ) + @params = convert_hash(conf.params) end - def to_s - 'Security Policy' + # extracts the values, this methods detects: + # numbers and SIDs and optimizes them for further usage + def extract_value(val) + if val =~ /^\d+$/ + val.to_i + # special handling for SID array + elsif val =~ /^\*\S/ + val.split(',').map { |v| + v.sub('*S', 'S') + } + # special handling for string values with " + elsif !(m = /^\"(.*)\"$/.match(val)).nil? + m[1] + else + val + end + end + + def convert_hash(hash) + new_hash = {} + hash.each do |k, v| + v.is_a?(Hash) ? value = convert_hash(v) : value = extract_value(v) + new_hash[k.strip] = value + end + new_hash end end end diff --git a/lib/resources/service.rb b/lib/resources/service.rb index 980b74451..83ae1940a 100644 --- a/lib/resources/service.rb +++ b/lib/resources/service.rb @@ -77,6 +77,7 @@ module Inspec::Resources it { should be_enabled } it { should be_running } its('type') { should be 'systemd' } + its ('startmode') { should be 'Auto'} end describe service('service_name').runlevels(3, 5) do @@ -119,6 +120,13 @@ module Inspec::Resources else Systemd.new(inspec, service_ctl) end + elsif %w{linuxmint}.include?(platform) + version = os[:release].to_f + if version < 18 + Upstart.new(inspec, service_ctl) + else + Systemd.new(inspec, service_ctl) + end elsif %w{debian}.include?(platform) version = os[:release].to_i if version > 7 @@ -210,6 +218,12 @@ module Inspec::Resources info[:description] end + # returns the service start up mode from info + def startmode + return nil if info.nil? + info[:startmode] + end + def to_s "Service #{@service_name}" end @@ -400,9 +414,9 @@ module Inspec::Resources # read all enabled services from runlevel # on rhel via: 'chkconfig --list', is not installed by default # bash: for i in `find /etc/rc*.d -name S*`; do basename $i | sed -r 's/^S[0-9]+//'; done | sort | uniq - enabled_services_cmd = inspec.command('find /etc/rc*.d -name S*') + enabled_services_cmd = inspec.command('find /etc/rc*.d /etc/init.d/rc*.d -name S*').stdout service_line = %r{rc(?[0-6])\.d/S[^/]*?#{Regexp.escape service_name}$} - all_services = enabled_services_cmd.stdout.split("\n").map { |line| + all_services = enabled_services_cmd.split("\n").map { |line| service_line.match(line) }.compact enabled = !all_services.empty? @@ -547,6 +561,7 @@ module Inspec::Resources # # Until StartMode is not added to Get-Service, we need to do a workaround # @see: https://connect.microsoft.com/PowerShell/feedback/details/424948/i-would-like-to-see-the-property-starttype-added-to-get-services + # Also see: https://msdn.microsoft.com/en-us/library/aa384896(v=vs.85).aspx # Use the following powershell to determine the start mode # PS: Get-WmiObject -Class Win32_Service | Where-Object {$_.Name -eq $name -or $_.DisplayName -eq $name} | Select-Object -Prop # erty Name, StartMode, State, Status | ConvertTo-Json @@ -567,7 +582,7 @@ module Inspec::Resources # - 6: Pause Pending # - 7: Paused def info(service_name) - cmd = inspec.command("New-Object -Type PSObject | Add-Member -MemberType NoteProperty -Name Service -Value (Get-Service -Name #{service_name}| Select-Object -Property Name, DisplayName, Status) -PassThru | Add-Member -MemberType NoteProperty -Name WMI -Value (Get-WmiObject -Class Win32_Service | Where-Object {$_.Name -eq '#{service_name}' -or $_.DisplayName -eq '#{service_name}'} | Select-Object -Property StartMode) -PassThru | ConvertTo-Json") + cmd = inspec.command("New-Object -Type PSObject | Add-Member -MemberType NoteProperty -Name Service -Value (Get-Service -Name '#{service_name}'| Select-Object -Property Name, DisplayName, Status) -PassThru | Add-Member -MemberType NoteProperty -Name WMI -Value (Get-WmiObject -Class Win32_Service | Where-Object {$_.Name -eq '#{service_name}' -or $_.DisplayName -eq '#{service_name}'} | Select-Object -Property StartMode) -PassThru | ConvertTo-Json") # cannot rely on exit code for now, successful command returns exit code 1 # return nil if cmd.exit_status != 0 @@ -587,6 +602,7 @@ module Inspec::Resources installed: true, running: service_running?(service), enabled: service_enabled?(service), + startmode: service['WMI']['StartMode'], type: 'windows', } end diff --git a/lib/resources/ssl.rb b/lib/resources/ssl.rb index 5953fdb64..6b0cc3f3f 100644 --- a/lib/resources/ssl.rb +++ b/lib/resources/ssl.rb @@ -6,6 +6,8 @@ require 'sslshake' require 'utils/filter' +require 'uri' +require 'parallel' # Custom resource based on the InSpec resource DSL class SSL < Inspec.resource(1) @@ -39,16 +41,19 @@ class SSL < Inspec.resource(1) 'tls1.2', ].freeze - attr_reader :host, :port + attr_reader :host, :port, :timeout, :retries def initialize(opts = {}) - @host = opts[:host] || - inspec.backend.instance_variable_get(:@hostname) - if @host.nil? && inspec.backend.class.to_s == 'Train::Transports::Local::Connection' - @host = 'localhost' - end + @host = opts[:host] if @host.nil? - fail 'Cannot determine host for SSL test. Please specify it or use a different target.' + # Transports like SSH and WinRM will provide a hostname + if inspec.backend.respond_to?('hostname') + @host = inspec.backend.hostname + elsif inspec.backend.class.to_s == 'Train::Transports::Local::Connection' + @host = 'localhost' + else + fail 'Cannot determine host for SSL test. Please specify it or use a different target.' + end end @port = opts[:port] || 443 @timeout = opts[:timeout] @@ -63,10 +68,10 @@ class SSL < Inspec.resource(1) .add(:enabled?) { |x| x.handshake.values.any? { |i| i['success'] } } .add(:handshake) { |x| groups = x.entries.group_by(&:protocol) - res = groups.map do |proto, e| + res = Parallel.map(groups, in_threads: 8) do |proto, e| [proto, SSLShake.hello(x.resource.host, port: x.resource.port, protocol: proto, ciphers: e.map(&:cipher), - timeout: @timeout, retries: @retries)] + timeout: x.resource.timeout, retries: x.resource.retries)] end Hash[res] } diff --git a/lib/resources/sys_info.rb b/lib/resources/sys_info.rb new file mode 100644 index 000000000..ec4702082 --- /dev/null +++ b/lib/resources/sys_info.rb @@ -0,0 +1,26 @@ +# encoding: utf-8 +module Inspec::Resources + # this resource returns additional system informatio + class System < Inspec.resource(1) + name 'sys_info' + + desc 'Use the user InSpec system resource to test for operating system properties.' + example " + describe sys_info do + its('hostname') { should eq 'example.com' } + end + " + + # returns the hostname of the local system + def hostname + os = inspec.os + if os.linux? + inspec.command('hostname').stdout.chomp + elsif os.windows? + inspec.powershell('$env:computername').stdout.chomp + else + skip_resource 'The `sys_info.hostname` resource is not supported on your OS yet.' + end + end + end +end diff --git a/lib/resources/user.rb b/lib/resources/user.rb deleted file mode 100644 index 733b7971a..000000000 --- a/lib/resources/user.rb +++ /dev/null @@ -1,474 +0,0 @@ -# encoding: utf-8 -# author: Christoph Hartmann -# author: Dominik Richter - -# Usage: -# -# describe user('root') do -# it { should exist } -# its('uid') { should eq 0 } -# its('gid') { should eq 0 } -# its('group') { should eq 'root' } -# its('groups') { should eq ['root', 'wheel']} -# its('home') { should eq '/root' } -# its('shell') { should eq '/bin/bash' } -# its('mindays') { should eq 0 } -# its('maxdays') { should eq 99 } -# its('warndays') { should eq 5 } -# end -# -# The following Serverspec matchers are deprecated in favor for direct value access -# -# describe user('root') do -# it { should belong_to_group 'root' } -# it { should have_uid 0 } -# it { should have_home_directory '/root' } -# it { should have_login_shell '/bin/bash' } -# its('minimum_days_between_password_change') { should eq 0 } -# its('maximum_days_between_password_change') { should eq 99 } -# end - -# ServerSpec tests that are not supported: -# -# describe user('root') do -# it { should have_authorized_key 'ssh-rsa ADg54...3434 user@example.local' } -# its(:encrypted_password) { should eq 1234 } -# end - -require 'utils/parser' -require 'utils/convert' - -module Inspec::Resources - class User < Inspec.resource(1) # rubocop:disable Metrics/ClassLength - name 'user' - desc 'Use the user InSpec audit resource to test user profiles, including the groups to which they belong, the frequency of required password changes, the directory paths to home and shell.' - example " - describe user('root') do - it { should exist } - its('uid') { should eq 1234 } - its('gid') { should eq 1234 } - end - " - def initialize(user) - @user = user - - # select package manager - @user_provider = nil - os = inspec.os - if os.linux? - @user_provider = LinuxUser.new(inspec) - elsif os.windows? - @user_provider = WindowsUser.new(inspec) - elsif ['darwin'].include?(os[:family]) - @user_provider = DarwinUser.new(inspec) - elsif ['freebsd'].include?(os[:family]) - @user_provider = FreeBSDUser.new(inspec) - elsif ['aix'].include?(os[:family]) - @user_provider = AixUser.new(inspec) - elsif os.solaris? - @user_provider = SolarisUser.new(inspec) - elsif ['hpux'].include?(os[:family]) - @user_provider = HpuxUser.new(inspec) - else - return skip_resource 'The `user` resource is not supported on your OS yet.' - end - end - - def exists? - !identity.nil? && !identity[:user].nil? - end - - def uid - identity[:uid] unless identity.nil? - end - - def gid - identity[:gid] unless identity.nil? - end - - def group - identity[:group] unless identity.nil? - end - - def groups - identity[:groups] unless identity.nil? - end - - def home - meta_info[:home] unless meta_info.nil? - end - - def shell - meta_info[:shell] unless meta_info.nil? - end - - # returns the minimum days between password changes - def mindays - credentials[:mindays] unless credentials.nil? - end - - # returns the maximum days between password changes - def maxdays - credentials[:maxdays] unless credentials.nil? - end - - # returns the days for password change warning - def warndays - credentials[:warndays] unless credentials.nil? - end - - # implement 'mindays' method to be compatible with serverspec - def minimum_days_between_password_change - deprecated('minimum_days_between_password_change', "Please use: its('mindays')") - mindays - end - - # implement 'maxdays' method to be compatible with serverspec - def maximum_days_between_password_change - deprecated('maximum_days_between_password_change', "Please use: its('maxdays')") - maxdays - end - - # implements rspec has matcher, to be compatible with serverspec - # @see: https://github.com/rspec/rspec-expectations/blob/master/lib/rspec/matchers/built_in/has.rb - def has_uid?(compare_uid) - deprecated('has_uid?') - uid == compare_uid - end - - def has_home_directory?(compare_home) - deprecated('has_home_directory?', "Please use: its('home')") - home == compare_home - end - - def has_login_shell?(compare_shell) - deprecated('has_login_shell?', "Please use: its('shell')") - shell == compare_shell - end - - def has_authorized_key?(_compare_key) - deprecated('has_authorized_key?') - fail NotImplementedError - end - - def deprecated(name, alternative = nil) - warn "[DEPRECATION] #{name} is deprecated. #{alternative}" - end - - def to_s - "User #{@user}" - end - - def identity - return @id_cache if defined?(@id_cache) - @id_cache = @user_provider.identity(@user) if !@user_provider.nil? - end - - private - - def meta_info - return @meta_cache if defined?(@meta_cache) - @meta_cache = @user_provider.meta_info(@user) if !@user_provider.nil? - end - - def credentials - return @cred_cache if defined?(@cred_cache) - @cred_cache = @user_provider.credentials(@user) if !@user_provider.nil? - end - end - - class UserInfo - include Converter - - attr_reader :inspec - def initialize(inspec) - @inspec = inspec - end - - def credentials(_username) - end - end - - # implements generic unix id handling - class UnixUser < UserInfo - attr_reader :inspec, :id_cmd - def initialize(inspec) - @inspec = inspec - @id_cmd ||= 'id' - super - end - - # parse one id entry like '0(wheel)'' - def parse_value(line) - SimpleConfig.new( - line, - line_separator: ',', - assignment_re: /^\s*([^\(]*?)\s*\(\s*(.*?)\)*$/, - group_re: nil, - multiple_values: false, - ).params - end - - # extracts the identity - def identity(username) - cmd = inspec.command("#{id_cmd} #{username}") - return nil if cmd.exit_status != 0 - - # parse words - params = SimpleConfig.new( - parse_id_entries(cmd.stdout.chomp), - assignment_re: /^\s*([^=]*?)\s*=\s*(.*?)\s*$/, - group_re: nil, - multiple_values: false, - ).params - - { - uid: convert_to_i(parse_value(params['uid']).keys[0]), - user: parse_value(params['uid']).values[0], - gid: convert_to_i(parse_value(params['gid']).keys[0]), - group: parse_value(params['gid']).values[0], - groups: parse_value(params['groups']).values, - } - end - - # splits the results of id into seperate lines - def parse_id_entries(raw) - data = [] - until (index = raw.index(/\)\s{1}/)).nil? - data.push(raw[0, index+1]) # inclue closing ) - raw = raw[index+2, raw.length-index-2] - end - data.push(raw) if !raw.nil? - data.join("\n") - end - end - - class LinuxUser < UnixUser - include PasswdParser - include CommentParser - - def meta_info(username) - cmd = inspec.command("getent passwd #{username}") - return nil if cmd.exit_status != 0 - # returns: root:x:0:0:root:/root:/bin/bash - passwd = parse_passwd_line(cmd.stdout.chomp) - { - home: passwd['home'], - shell: passwd['shell'], - } - end - - def credentials(username) - cmd = inspec.command("chage -l #{username}") - return nil if cmd.exit_status != 0 - - params = SimpleConfig.new( - cmd.stdout.chomp, - assignment_re: /^\s*([^:]*?)\s*:\s*(.*?)\s*$/, - group_re: nil, - multiple_values: false, - ).params - - { - mindays: convert_to_i(params['Minimum number of days between password change']), - maxdays: convert_to_i(params['Maximum number of days between password change']), - warndays: convert_to_i(params['Number of days of warning before password expires']), - } - end - end - - class SolarisUser < LinuxUser - def initialize(inspec) - @inspec = inspec - @id_cmd ||= 'id -a' - super - end - - def credentials(_username) - nil - end - end - - class AixUser < UnixUser - def identity(username) - id = super(username) - return nil if id.nil? - # AIX 'id' command doesn't include the primary group in the supplementary - # yet it can be somewhere in the supplementary list if someone added root - # to a groups list in /etc/group - # we rearrange to expected list if that is the case - if id[:groups].first != id[:group] - id[:groups].reject! { |i| i == id[:group] } if id[:groups].include?(id[:group]) - id[:groups].unshift(id[:group]) - end - - id - end - - def meta_info(username) - lsuser = inspec.command("lsuser -C -a home shell #{username}") - return nil if lsuser.exit_status != 0 - - user = lsuser.stdout.chomp.split("\n").last.split(':') - { - home: user[1], - shell: user[2], - } - end - - def credentials(username) - cmd = inspec.command( - "lssec -c -f /etc/security/user -s #{username} -a minage -a maxage -a pwdwarntime", - ) - return nil if cmd.exit_status != 0 - - user_sec = cmd.stdout.chomp.split("\n").last.split(':') - - { - mindays: user_sec[1].to_i * 7, - maxdays: user_sec[2].to_i * 7, - warndays: user_sec[3].to_i, - } - end - end - - class HpuxUser < UnixUser - def meta_info(username) - hpuxuser = inspec.command("logins -x -l #{username}") - return nil if hpuxuser.exit_status != 0 - user = hpuxuser.stdout.chomp.split(' ') - { - home: user[4], - shell: user[5], - } - end - end - - # we do not use 'finger' for MacOS, because it is harder to parse data with it - # @see https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man8/fingerd.8.html - # instead we use 'dscl' to request user data - # @see https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/dscl.1.html - # @see http://superuser.com/questions/592921/mac-osx-users-vs-dscl-command-to-list-user - class DarwinUser < UnixUser - def meta_info(username) - cmd = inspec.command("dscl -q . -read /Users/#{username} NFSHomeDirectory PrimaryGroupID RecordName UniqueID UserShell") - return nil if cmd.exit_status != 0 - - params = SimpleConfig.new( - cmd.stdout.chomp, - assignment_re: /^\s*([^:]*?)\s*:\s*(.*?)\s*$/, - group_re: nil, - multiple_values: false, - ).params - - { - home: params['NFSHomeDirectory'], - shell: params['UserShell'], - } - end - end - - # FreeBSD recommends to use the 'pw' command for user management - # @see: https://www.freebsd.org/doc/handbook/users-synopsis.html - # @see: https://www.freebsd.org/cgi/man.cgi?pw(8) - # It offers the following commands: - # - adduser(8) The recommended command-line application for adding new users. - # - rmuser(8) The recommended command-line application for removing users. - # - chpass(1) A flexible tool for changing user database information. - # - passwd(1) The command-line tool to change user passwords. - class FreeBSDUser < UnixUser - include PasswdParser - - def meta_info(username) - cmd = inspec.command("pw usershow #{username} -7") - return nil if cmd.exit_status != 0 - # returns: root:*:0:0:Charlie &:/root:/bin/csh - passwd = parse_passwd_line(cmd.stdout.chomp) - { - home: passwd['home'], - shell: passwd['shell'], - } - end - end - - # For now, we stick with WMI Win32_UserAccount - # @see https://msdn.microsoft.com/en-us/library/aa394507(v=vs.85).aspx - # @see https://msdn.microsoft.com/en-us/library/aa394153(v=vs.85).aspx - # - # using Get-AdUser would be the best command for domain machines, but it will not be installed - # on client machines by default - # @see https://technet.microsoft.com/en-us/library/ee617241.aspx - # @see https://technet.microsoft.com/en-us/library/hh509016(v=WS.10).aspx - # @see http://woshub.com/get-aduser-getting-active-directory-users-data-via-powershell/ - # @see http://stackoverflow.com/questions/17548523/the-term-get-aduser-is-not-recognized-as-the-name-of-a-cmdlet - # - # Just for reference, we could also use ADSI (Active Directory Service Interfaces) - # @see https://mcpmag.com/articles/2015/04/15/reporting-on-local-accounts.aspx - class WindowsUser < UserInfo - # parse windows account name - def parse_windows_account(username) - account = username.split('\\') - name = account.pop - domain = account.pop if account.size > 0 - [name, domain] - end - - def identity(username) - # extract domain/user information - account, domain = parse_windows_account(username) - - # TODO: escape content - if !domain.nil? - filter = "Name = '#{account}' and Domain = '#{domain}'" - else - filter = "Name = '#{account}' and LocalAccount = true" - end - - script = <<-EOH - # find user - $user = Get-WmiObject Win32_UserAccount -filter "#{filter}" - # get related groups - $groups = $user.GetRelated('Win32_Group') | Select-Object -Property Caption, Domain, Name, LocalAccount, SID, SIDType, Status - # filter user information - $user = $user | Select-Object -Property Caption, Description, Domain, Name, LocalAccount, Lockout, PasswordChangeable, PasswordExpires, PasswordRequired, SID, SIDType, Status - # build response object - New-Object -Type PSObject | ` - Add-Member -MemberType NoteProperty -Name User -Value ($user) -PassThru | ` - Add-Member -MemberType NoteProperty -Name Groups -Value ($groups) -PassThru | ` - ConvertTo-Json - EOH - - cmd = inspec.script(script) - - # cannot rely on exit code for now, successful command returns exit code 1 - # return nil if cmd.exit_status != 0, try to parse json - begin - params = JSON.parse(cmd.stdout) - rescue JSON::ParserError => _e - return nil - end - - user = params['User']['Caption'] unless params['User'].nil? - groups = params['Groups'] - # if groups is no array, generate one - groups = [groups] if !groups.is_a?(Array) - groups = groups.map { |grp| grp['Caption'] } unless params['Groups'].nil? - - { - uid: nil, - user: user, - gid: nil, - group: nil, - groups: groups, - } - end - - # not implemented yet - def meta_info(_username) - { - home: nil, - shell: nil, - } - end - end -end diff --git a/lib/resources/users.rb b/lib/resources/users.rb new file mode 100644 index 000000000..16d9dd133 --- /dev/null +++ b/lib/resources/users.rb @@ -0,0 +1,652 @@ +# encoding: utf-8 +# author: Christoph Hartmann +# author: Dominik Richter + +require 'utils/parser' +require 'utils/convert' +require 'utils/filter' + +module Inspec::Resources + # This file contains two resources, the `user` and `users` resource. + # The `user` resource is optimized for requests that verify specific users + # that you know upfront for testing. If you need to query all users or search + # specific users with certain properties, use the `users` resource. + module UserManagementSelector + # select user provider based on the operating system + # returns nil, if no user manager was found for the operating system + def select_user_manager(os) + if os.linux? + LinuxUser.new(inspec) + elsif os.windows? + WindowsUser.new(inspec) + elsif ['darwin'].include?(os[:family]) + DarwinUser.new(inspec) + elsif ['freebsd'].include?(os[:family]) + FreeBSDUser.new(inspec) + elsif ['aix'].include?(os[:family]) + AixUser.new(inspec) + elsif os.solaris? + SolarisUser.new(inspec) + elsif ['hpux'].include?(os[:family]) + HpuxUser.new(inspec) + end + end + end + + # The InSpec users resources looksup all local users available on a system. + # TODO: the current version of the users resource will use eg. /etc/passwd + # on Linux to parse all usernames. Therefore the resource may not return + # users managed on other systems like LDAP/ActiveDirectory. Please open + # a feature request at https://github.com/chef/inspec if you need that + # functionality + # + # This resource allows complex filter mechanisms + # + # describe users.where(uid: 0).entries do + # it { should eq ['root'] } + # its('uids') { should eq [1234] } + # its('gids') { should eq [1234] } + # end + # + # describe users.where { uid =~ /S\-1\-5\-21\-\d+\-\d+\-\d+\-500/ } do + # it { should exist } + # end + class Users < Inspec.resource(1) + include UserManagementSelector + + name 'users' + desc 'Use the users InSpec audit resource to test local user profiles. Users can be filtered by groups to which they belong, the frequency of required password changes, the directory paths to home and shell.' + example " + describe users.where(uid: 0).entries do + it { should eq ['root'] } + its('uids') { should eq [1234] } + its('gids') { should eq [1234] } + end + " + def initialize + # select user provider + @user_provider = select_user_manager(inspec.os) + return skip_resource 'The `users` resource is not supported on your OS yet.' if @user_provider.nil? + end + + filter = FilterTable.create + filter.add_accessor(:where) + .add_accessor(:entries) + .add(:usernames, field: :username) + .add(:uids, field: :uid) + .add(:gids, field: :gid) + .add(:groupnames, field: :groupname) + .add(:groups, field: :groups) + .add(:homes, field: :home) + .add(:shells, field: :shell) + .add(:mindays, field: :mindays) + .add(:maxdays, field: :maxdays) + .add(:warndays, field: :warndays) + .add(:disabled, field: :disabled) + .add(:exists?) { |x| !x.entries.empty? } + .add(:disabled?) { |x| x.where { disabled == false }.entries.empty? } + .add(:enabled?) { |x| x.where { disabled == true }.entries.empty? } + filter.connect(self, :collect_user_details) + + def to_s + 'Users' + end + + private + + # method to get all available users + def list_users + @username_cache ||= @user_provider.list_users unless @user_provider.nil? + end + + # collects information about every user + def collect_user_details + @users_cache ||= @user_provider.collect_user_details unless @user_provider.nil? + end + end + + # The `user` resource handles the special case where only one resource is required + # + # describe user('root') do + # it { should exist } + # its('uid') { should eq 0 } + # its('gid') { should eq 0 } + # its('group') { should eq 'root' } + # its('groups') { should eq ['root', 'wheel']} + # its('home') { should eq '/root' } + # its('shell') { should eq '/bin/bash' } + # its('mindays') { should eq 0 } + # its('maxdays') { should eq 99 } + # its('warndays') { should eq 5 } + # end + # + # The following Serverspec matchers are deprecated in favor for direct value access + # + # describe user('root') do + # it { should belong_to_group 'root' } + # it { should have_uid 0 } + # it { should have_home_directory '/root' } + # it { should have_login_shell '/bin/bash' } + # its('minimum_days_between_password_change') { should eq 0 } + # its('maximum_days_between_password_change') { should eq 99 } + # end + # + # ServerSpec tests that are not supported: + # + # describe user('root') do + # it { should have_authorized_key 'ssh-rsa ADg54...3434 user@example.local' } + # its(:encrypted_password) { should eq 1234 } + # end + class User < Inspec.resource(1) + include UserManagementSelector + name 'user' + desc 'Use the user InSpec audit resource to test user profiles, including the groups to which they belong, the frequency of required password changes, the directory paths to home and shell.' + example " + describe user('root') do + it { should exist } + its('uid') { should eq 1234 } + its('gid') { should eq 1234 } + end + " + def initialize(username = nil) + @username = username + # select user provider + @user_provider = select_user_manager(inspec.os) + return skip_resource 'The `user` resource is not supported on your OS yet.' if @user_provider.nil? + end + + def exists? + !identity.nil? && !identity[:username].nil? + end + + def disabled? + identity[:disabled] == true unless identity.nil? + end + + def enabled? + identity[:disabled] == false unless identity.nil? + end + + def username + identity[:username] unless identity.nil? + end + + def uid + identity[:uid] unless identity.nil? + end + + def gid + identity[:gid] unless identity.nil? + end + + def groupname + identity[:groupname] unless identity.nil? + end + alias group groupname + + def groups + identity[:groups] unless identity.nil? + end + + def home + meta_info[:home] unless meta_info.nil? + end + + def shell + meta_info[:shell] unless meta_info.nil? + end + + # returns the minimum days between password changes + def mindays + credentials[:mindays] unless credentials.nil? + end + + # returns the maximum days between password changes + def maxdays + credentials[:maxdays] unless credentials.nil? + end + + # returns the days for password change warning + def warndays + credentials[:warndays] unless credentials.nil? + end + + # implement 'mindays' method to be compatible with serverspec + def minimum_days_between_password_change + deprecated('minimum_days_between_password_change', "Please use: its('mindays')") + mindays + end + + # implement 'maxdays' method to be compatible with serverspec + def maximum_days_between_password_change + deprecated('maximum_days_between_password_change', "Please use: its('maxdays')") + maxdays + end + + # implements rspec has matcher, to be compatible with serverspec + # @see: https://github.com/rspec/rspec-expectations/blob/master/lib/rspec/matchers/built_in/has.rb + def has_uid?(compare_uid) + deprecated('has_uid?') + uid == compare_uid + end + + def has_home_directory?(compare_home) + deprecated('has_home_directory?', "Please use: its('home')") + home == compare_home + end + + def has_login_shell?(compare_shell) + deprecated('has_login_shell?', "Please use: its('shell')") + shell == compare_shell + end + + def has_authorized_key?(_compare_key) + deprecated('has_authorized_key?') + fail NotImplementedError + end + + def deprecated(name, alternative = nil) + warn "[DEPRECATION] #{name} is deprecated. #{alternative}" + end + + def to_s + "User #{@username}" + end + + private + + # returns the iden + def identity + return @id_cache if defined?(@id_cache) + @id_cache = @user_provider.identity(@username) if !@user_provider.nil? + end + + def meta_info + return @meta_cache if defined?(@meta_cache) + @meta_cache = @user_provider.meta_info(@username) if !@user_provider.nil? + end + + def credentials + return @cred_cache if defined?(@cred_cache) + @cred_cache = @user_provider.credentials(@username) if !@user_provider.nil? + end + end + + # This is an abstract class that every user provoider has to implement. + # A user provider implements a system abstracts and helps the InSpec resource + # hand-over system specific behavior to those providers + class UserInfo + include Converter + + attr_reader :inspec + def initialize(inspec) + @inspec = inspec + end + + # returns a hash with user-specific values: + # { + # uid: '', + # user: '', + # gid: '', + # group: '', + # groups: '', + # } + def identity(_username) + fail 'user provider must implement the `identity` method' + end + + # returns optional information about a user, eg shell + def meta_info(_username) + nil + end + + # returns a hash with meta-data about user credentials + # { + # mindays: 1, + # maxdays: 1, + # warndays: 1, + # } + # this method is optional and may not be implemented by each provider + def credentials(_username) + nil + end + + # returns an array with users + def list_users + fail 'user provider must implement the `list_users` method' + end + + # retuns all aspects of the user as one hash + def user_details(username) + item = {} + id = identity(username) + item.merge!(id) unless id.nil? + meta = meta_info(username) + item.merge!(meta) unless meta.nil? + cred = credentials(username) + item.merge!(cred) unless cred.nil? + item + end + + # returns the full information list for a user + def collect_user_details + list_users.map { |username| + user_details(username.chomp) + } + end + end + + # implements generic unix id handling + class UnixUser < UserInfo + attr_reader :inspec, :id_cmd, :list_users_cmd + def initialize(inspec) + @inspec = inspec + @id_cmd ||= 'id' + @list_users_cmd ||= 'cut -d: -f1 /etc/passwd | grep -v "^#"' + super + end + + # returns a list of all local users on a system + def list_users + cmd = inspec.command(list_users_cmd) + return [] if cmd.exit_status != 0 + cmd.stdout.chomp.lines + end + + # parse one id entry like '0(wheel)'' + def parse_value(line) + SimpleConfig.new( + line, + line_separator: ',', + assignment_re: /^\s*([^\(]*?)\s*\(\s*(.*?)\)*$/, + group_re: nil, + multiple_values: false, + ).params + end + + # extracts the identity + def identity(username) + cmd = inspec.command("#{id_cmd} #{username}") + return nil if cmd.exit_status != 0 + + # parse words + params = SimpleConfig.new( + parse_id_entries(cmd.stdout.chomp), + assignment_re: /^\s*([^=]*?)\s*=\s*(.*?)\s*$/, + group_re: nil, + multiple_values: false, + ).params + + { + uid: convert_to_i(parse_value(params['uid']).keys[0]), + username: parse_value(params['uid']).values[0], + gid: convert_to_i(parse_value(params['gid']).keys[0]), + groupname: parse_value(params['gid']).values[0], + groups: parse_value(params['groups']).values, + } + end + + # splits the results of id into seperate lines + def parse_id_entries(raw) + data = [] + until (index = raw.index(/\)\s{1}/)).nil? + data.push(raw[0, index+1]) # inclue closing ) + raw = raw[index+2, raw.length-index-2] + end + data.push(raw) if !raw.nil? + data.join("\n") + end + end + + class LinuxUser < UnixUser + include PasswdParser + include CommentParser + + def meta_info(username) + cmd = inspec.command("getent passwd #{username}") + return nil if cmd.exit_status != 0 + # returns: root:x:0:0:root:/root:/bin/bash + passwd = parse_passwd_line(cmd.stdout.chomp) + { + home: passwd['home'], + shell: passwd['shell'], + } + end + + def credentials(username) + cmd = inspec.command("chage -l #{username}") + return nil if cmd.exit_status != 0 + + params = SimpleConfig.new( + cmd.stdout.chomp, + assignment_re: /^\s*([^:]*?)\s*:\s*(.*?)\s*$/, + group_re: nil, + multiple_values: false, + ).params + + { + mindays: convert_to_i(params['Minimum number of days between password change']), + maxdays: convert_to_i(params['Maximum number of days between password change']), + warndays: convert_to_i(params['Number of days of warning before password expires']), + } + end + end + + class SolarisUser < LinuxUser + def initialize(inspec) + @inspec = inspec + @id_cmd ||= 'id -a' + super + end + end + + class AixUser < UnixUser + def identity(username) + id = super(username) + return nil if id.nil? + # AIX 'id' command doesn't include the primary group in the supplementary + # yet it can be somewhere in the supplementary list if someone added root + # to a groups list in /etc/group + # we rearrange to expected list if that is the case + if id[:groups].first != id[:group] + id[:groups].reject! { |i| i == id[:group] } if id[:groups].include?(id[:group]) + id[:groups].unshift(id[:group]) + end + + id + end + + def meta_info(username) + lsuser = inspec.command("lsuser -C -a home shell #{username}") + return nil if lsuser.exit_status != 0 + + user = lsuser.stdout.chomp.split("\n").last.split(':') + { + home: user[1], + shell: user[2], + } + end + + def credentials(username) + cmd = inspec.command( + "lssec -c -f /etc/security/user -s #{username} -a minage -a maxage -a pwdwarntime", + ) + return nil if cmd.exit_status != 0 + + user_sec = cmd.stdout.chomp.split("\n").last.split(':') + + { + mindays: user_sec[1].to_i * 7, + maxdays: user_sec[2].to_i * 7, + warndays: user_sec[3].to_i, + } + end + end + + class HpuxUser < UnixUser + def meta_info(username) + hpuxuser = inspec.command("logins -x -l #{username}") + return nil if hpuxuser.exit_status != 0 + user = hpuxuser.stdout.chomp.split(' ') + { + home: user[4], + shell: user[5], + } + end + end + + # we do not use 'finger' for MacOS, because it is harder to parse data with it + # @see https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man8/fingerd.8.html + # instead we use 'dscl' to request user data + # @see https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/dscl.1.html + # @see http://superuser.com/questions/592921/mac-osx-users-vs-dscl-command-to-list-user + class DarwinUser < UnixUser + def initialize(inspec) + @list_users_cmd ||= 'dscl . list /Users' + super + end + + def meta_info(username) + cmd = inspec.command("dscl -q . -read /Users/#{username} NFSHomeDirectory PrimaryGroupID RecordName UniqueID UserShell") + return nil if cmd.exit_status != 0 + + params = SimpleConfig.new( + cmd.stdout.chomp, + assignment_re: /^\s*([^:]*?)\s*:\s*(.*?)\s*$/, + group_re: nil, + multiple_values: false, + ).params + + { + home: params['NFSHomeDirectory'], + shell: params['UserShell'], + } + end + end + + # FreeBSD recommends to use the 'pw' command for user management + # @see: https://www.freebsd.org/doc/handbook/users-synopsis.html + # @see: https://www.freebsd.org/cgi/man.cgi?pw(8) + # It offers the following commands: + # - adduser(8) The recommended command-line application for adding new users. + # - rmuser(8) The recommended command-line application for removing users. + # - chpass(1) A flexible tool for changing user database information. + # - passwd(1) The command-line tool to change user passwords. + class FreeBSDUser < UnixUser + include PasswdParser + + def meta_info(username) + cmd = inspec.command("pw usershow #{username} -7") + return nil if cmd.exit_status != 0 + # returns: root:*:0:0:Charlie &:/root:/bin/csh + passwd = parse_passwd_line(cmd.stdout.chomp) + { + home: passwd['home'], + shell: passwd['shell'], + } + end + end + + # This optimization was inspired by + # @see https://mcpmag.com/articles/2015/04/15/reporting-on-local-accounts.aspx + # Alternative solutions are WMI Win32_UserAccount + # @see https://msdn.microsoft.com/en-us/library/aa394507(v=vs.85).aspx + # @see https://msdn.microsoft.com/en-us/library/aa394153(v=vs.85).aspx + class WindowsUser < UserInfo + def parse_windows_account(username) + account = username.split('\\') + name = account.pop + domain = account.pop if account.size > 0 + [name, domain] + end + + def identity(username) + # TODO: we look for local users only at this point + name, _domain = parse_windows_account(username) + return if collect_user_details.nil? + res = collect_user_details.select { |user| user[:username] == name } + res[0] if res.length > 0 + end + + def list_users + collect_user_details.map { |user| user[:username] } + end + + # https://msdn.microsoft.com/en-us/library/aa746340(v=vs.85).aspx + def collect_user_details # rubocop:disable Metrics/MethodLength + return @users_cache if defined?(@users_cache) + script = <<-EOH +Function ConvertTo-SID { Param([byte[]]$BinarySID) + (New-Object System.Security.Principal.SecurityIdentifier($BinarySID,0)).Value +} + +Function Convert-UserFlag { Param ($UserFlag) + $List = @() + Switch ($UserFlag) { + ($UserFlag -BOR 0x0001) { $List += 'SCRIPT' } + ($UserFlag -BOR 0x0002) { $List += 'ACCOUNTDISABLE' } + ($UserFlag -BOR 0x0008) { $List += 'HOMEDIR_REQUIRED' } + ($UserFlag -BOR 0x0010) { $List += 'LOCKOUT' } + ($UserFlag -BOR 0x0020) { $List += 'PASSWD_NOTREQD' } + ($UserFlag -BOR 0x0040) { $List += 'PASSWD_CANT_CHANGE' } + ($UserFlag -BOR 0x0080) { $List += 'ENCRYPTED_TEXT_PWD_ALLOWED' } + ($UserFlag -BOR 0x0100) { $List += 'TEMP_DUPLICATE_ACCOUNT' } + ($UserFlag -BOR 0x0200) { $List += 'NORMAL_ACCOUNT' } + ($UserFlag -BOR 0x0800) { $List += 'INTERDOMAIN_TRUST_ACCOUNT' } + ($UserFlag -BOR 0x1000) { $List += 'WORKSTATION_TRUST_ACCOUNT' } + ($UserFlag -BOR 0x2000) { $List += 'SERVER_TRUST_ACCOUNT' } + ($UserFlag -BOR 0x10000) { $List += 'DONT_EXPIRE_PASSWORD' } + ($UserFlag -BOR 0x20000) { $List += 'MNS_LOGON_ACCOUNT' } + ($UserFlag -BOR 0x40000) { $List += 'SMARTCARD_REQUIRED' } + ($UserFlag -BOR 0x80000) { $List += 'TRUSTED_FOR_DELEGATION' } + ($UserFlag -BOR 0x100000) { $List += 'NOT_DELEGATED' } + ($UserFlag -BOR 0x200000) { $List += 'USE_DES_KEY_ONLY' } + ($UserFlag -BOR 0x400000) { $List += 'DONT_REQ_PREAUTH' } + ($UserFlag -BOR 0x800000) { $List += 'PASSWORD_EXPIRED' } + ($UserFlag -BOR 0x1000000) { $List += 'TRUSTED_TO_AUTH_FOR_DELEGATION' } + ($UserFlag -BOR 0x04000000) { $List += 'PARTIAL_SECRETS_ACCOUNT' } + } + $List +} + +$Computername = $Env:Computername +$adsi = [ADSI]"WinNT://$Computername" +$adsi.Children | where {$_.SchemaClassName -eq 'user'} | ForEach { + New-Object PSObject -property @{ + uid = ConvertTo-SID -BinarySID $_.ObjectSID[0] + username = $_.Name[0] + description = $_.Description[0] + disabled = $_.AccountDisabled[0] + userflags = Convert-UserFlag -UserFlag $_.UserFlags[0] + passwordage = [math]::Round($_.PasswordAge[0]/86400) + minpasswordlength = $_.MinPasswordLength[0] + mindays = [math]::Round($_.MinPasswordAge[0]/86400) + maxdays = [math]::Round($_.MaxPasswordAge[0]/86400) + warndays = $null + badpasswordattempts = $_.BadPasswordAttempts[0] + maxbadpasswords = $_.MaxBadPasswordsAllowed[0] + gid = $null + group = $null + groups = $null + home = $_.HomeDirectory[0] + shell = $null + domain = $Computername + } +} | ConvertTo-Json + EOH + cmd = inspec.powershell(script) + # cannot rely on exit code for now, successful command returns exit code 1 + # return nil if cmd.exit_status != 0, try to parse json + begin + users = JSON.parse(cmd.stdout) + rescue JSON::ParserError => _e + return nil + end + + # ensure we have an array of groups + users = [users] if !users.is_a?(Array) + # convert keys to symbols + @users_cache = users.map { |user| user.each_with_object({}) { |(k, v), h| h[k.to_sym] = v } } + end + end +end diff --git a/lib/resources/vbscript.rb b/lib/resources/vbscript.rb index b55830b33..d0ed5ad96 100644 --- a/lib/resources/vbscript.rb +++ b/lib/resources/vbscript.rb @@ -2,6 +2,8 @@ # author: Christoph Hartmann # author: Dominik Richter +require 'securerandom' + module Inspec::Resources # This resource allows users to run vbscript on windows machines. We decided # not to use scriptcontrol, due to the fact that it works on 32 bit systems only: @@ -34,10 +36,11 @@ module Inspec::Resources def initialize(vbscript) return skip_resource 'The `vbscript` resource is not supported on your OS yet.' unless inspec.os.windows? - + @seperator = SecureRandom.uuid cmd = <<-EOH $vbscript = @" #{vbscript} +Wscript.Stdout.Write "#{@seperator}" "@ $filename = [System.IO.Path]::GetTempFileName() + ".vbs" New-Item $filename -type file -force -value $vbscript | Out-Null @@ -47,8 +50,21 @@ EOH super(cmd) end + def result + @result ||= parse_stdout + end + def to_s 'Windows VBScript' end + + private + + def parse_stdout + res = inspec.backend.run_command(@command) + parsed_result = res.stdout.gsub(/#{@seperator}\r\n$/, '') + res.stdout = parsed_result + res + end end end diff --git a/lib/source_readers/inspec.rb b/lib/source_readers/inspec.rb index 9e159e5e8..72d8b3987 100644 --- a/lib/source_readers/inspec.rb +++ b/lib/source_readers/inspec.rb @@ -34,7 +34,6 @@ module SourceReaders @tests = load_tests @libraries = load_libs - prepare_load_paths end private @@ -52,27 +51,5 @@ module SourceReaders end Hash[tests.map { |x| [x, @target.read(x)] }] end - - # Ensure each test directory exists on the $LOAD_PATH. This - # will ensure traditional RSpec-isms like `require 'spec_helper'` - # continue to work. The method outlined here is only meant to be temporary! - def prepare_load_paths - t = @target - t = @target.parent unless @target.parent.nil? - unless t.is_a?(Fetchers::Local) - return # no need to mess with load-paths if this is not on disk - end - - rel_dirs = (@libraries.keys + @tests.keys) - .map { |x| File.dirname(x) }.uniq - - abs_dirs = rel_dirs.map { |x| @target.abs_path(x) } - .find_all { |x| File.directory?(x) } - .map { |x| File.expand_path(x) } - - abs_dirs.each do |dir| - $LOAD_PATH.unshift dir unless $LOAD_PATH.include?(dir) - end - end end end diff --git a/lib/utils/filter.rb b/lib/utils/filter.rb index 80716df1f..74980b9ca 100644 --- a/lib/utils/filter.rb +++ b/lib/utils/filter.rb @@ -44,6 +44,7 @@ module FilterTable def initialize(resource, params, filters) @resource = resource @params = params + @params = [] if @params.nil? @filters = filters end diff --git a/omnibus/Gemfile b/omnibus/Gemfile index 9f0f13e34..b20bd3849 100644 --- a/omnibus/Gemfile +++ b/omnibus/Gemfile @@ -4,11 +4,16 @@ source 'https://rubygems.org' # Install omnibus # Sadly due to an ongoing msys2 issue, producing windows builds requires # the two branches below. -gem 'omnibus', github: 'chef/omnibus', branch: 'ksubrama/gcc_investigate' +# gem 'omnibus', github: 'chef/omnibus', branch: 'ksubrama/gcc_investigate' # Use Chef's software definitions. It is recommended that you write your own # software definitions, but you can clone/fork Chef's to get you started. -gem 'omnibus-software', github: 'chef/omnibus-software', branch: 'ksubrama/ruby23' +# gem 'omnibus-software', github: 'chef/omnibus-software', branch: 'ksubrama/ruby23' + +# Use entries from chef's Gemfile +gem 'omnibus', github: 'chef/omnibus', branch: 'sersut/ff-ksubrama/gcc_investigate' +gem 'omnibus-software', github: 'chef/omnibus-software', branch: 'shain/ruby_windows_monster' +gem 'license_scout', github: 'chef/license_scout' # This development group is installed by default when you run `bundle install`, # but if you are using Omnibus in a CI-based infrastructure, you do not need diff --git a/omnibus/config/projects/inspec.rb b/omnibus/config/projects/inspec.rb index a1f672292..b095d6691 100644 --- a/omnibus/config/projects/inspec.rb +++ b/omnibus/config/projects/inspec.rb @@ -16,6 +16,8 @@ # limitations under the License. # +require_relative '../../../lib/inspec/version.rb' + name 'inspec' friendly_name 'InSpec' maintainer 'Chef Software, Inc ' @@ -32,7 +34,7 @@ else install_dir "#{default_root}/#{name}" end -build_version Omnibus::BuildVersion.semver +build_version Inspec::VERSION build_iteration 1 dependency 'preparation' diff --git a/omnibus/config/software/inspec.rb b/omnibus/config/software/inspec.rb index b7238f45d..e7b0c9a0f 100644 --- a/omnibus/config/software/inspec.rb +++ b/omnibus/config/software/inspec.rb @@ -44,5 +44,5 @@ build do gem "build #{name}.gemspec", env: env gem "install #{name}-*.gem --no-document", env: env - appbundle 'inspec' + appbundle 'inspec', env: env end diff --git a/omnibus/resources/inspec/dmg/background.png b/omnibus/resources/inspec/dmg/background.png index fa6282257..3af963add 100644 Binary files a/omnibus/resources/inspec/dmg/background.png and b/omnibus/resources/inspec/dmg/background.png differ diff --git a/omnibus/resources/inspec/msi/assets/banner_background.bmp b/omnibus/resources/inspec/msi/assets/banner_background.bmp index c292286eb..ca3b478b3 100644 Binary files a/omnibus/resources/inspec/msi/assets/banner_background.bmp and b/omnibus/resources/inspec/msi/assets/banner_background.bmp differ diff --git a/omnibus/resources/inspec/msi/assets/dialog_background.bmp b/omnibus/resources/inspec/msi/assets/dialog_background.bmp index ff0c0cc95..295cda9af 100644 Binary files a/omnibus/resources/inspec/msi/assets/dialog_background.bmp and b/omnibus/resources/inspec/msi/assets/dialog_background.bmp differ diff --git a/omnibus/resources/inspec/pkg/background.png b/omnibus/resources/inspec/pkg/background.png index fa6282257..3af963add 100644 Binary files a/omnibus/resources/inspec/pkg/background.png and b/omnibus/resources/inspec/pkg/background.png differ diff --git a/tasks/docs.rb b/tasks/docs.rb new file mode 100644 index 000000000..4ac781254 --- /dev/null +++ b/tasks/docs.rb @@ -0,0 +1,273 @@ +# encoding: utf-8 +# Copyright:: Copyright (c) 2015 Chef Software, Inc. +# License:: Apache License, Version 2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +require 'erb' +require 'ruby-progressbar' +require 'fileutils' + +class Markdown + class << self + def h1(msg) + "# #{msg}\n\n" + end + + def h2(msg) + "## #{msg}\n\n" + end + + def h3(msg) + "### #{msg}\n\n" + end + + def code(msg, syntax = nil) + "```#{syntax}\n"\ + "#{msg}\n"\ + "```\n\n" + end + + def li(msg) + "* #{msg.gsub("\n", "\n ")}\n" + end + + def ul(msg) + msg + "\n" + end + + def p(msg) + "#{msg}\n\n" + end + + def a(name, dst = nil) + dst ||= name + "[#{name}](#{dst})" + end + + def suffix + '.md' + end + + def meta(opts) + o = opts.map { |k, v| "#{k}: #{v}" }.join("\n") + "---\n#{o}\n---\n\n" + end + end +end + +class RST + class << self + def h1(msg) + "=====================================================\n"\ + "#{msg}\n"\ + "=====================================================\n\n"\ + end + + def h2(msg) + "#{msg}\n"\ + "=====================================================\n\n"\ + end + + def h3(msg) + "#{msg}\n"\ + "-----------------------------------------------------\n\n"\ + end + + def code(msg, syntax = nil) + ".. code-block:: #{syntax}\n\n"\ + " #{msg.gsub("\n", "\n ")}\n\n" + end + + def li(msg) + "#{msg.gsub("\n", "\n ")}\n\n" + end + + def ul(msg) + msg + end + + def p(msg) + "#{msg}\n\n" + end + + def a(name, _dst = nil) + # FIXME: needs link handling + "`#{name}`_" + end + + def suffix + '.rst' + end + + def meta(_o) + '' # ignore for now + end + end +end + +class ResourceDocs + def initialize(root) + @paths = {} # cache of paths + @root = root # relative root path for all docs + end + + def render(path) + @paths[path] ||= render_path(path) + end + + def partial(x) + render(x + '.md.erb') + end + + private + + def render_path(path) + abs = File.join(@root, path) + fail "Can't find file to render in #{abs}" unless File.file?(abs) + + ERB.new(File.read(abs)).result(binding) + end +end + +namespace :docs do + desc 'Create cli docs' + task :cli do + # formatter for the output file + f = Markdown + # list of subcommands we ignore; these are e.g. plugins + skip_commands = %w{scap} + + res = f.meta(title: 'About the InSpec CLI') + res << f.h1('InSpec CLI') + res << f.p('Use the InSpec CLI to run tests and audits against targets '\ + 'using local, SSH, WinRM, or Docker connections.') + + require 'inspec/cli' + cmds = Inspec::InspecCLI.all_commands + cmds.keys.sort.each do |key| + next if skip_commands.include? key + cmd = cmds[key] + + res << f.h2(cmd.usage.split.first) + res << f.p(cmd.description.capitalize) + + res << f.h3('Syntax') + res << f.p('This subcommand has the following syntax:') + res << f.code("$ inspec #{cmd.usage}", 'bash') + + opts = cmd.options.select { |_, o| !o.hide } + unless opts.empty? + res << f.h3('Options') + f.p('This subcommand has additional options:') + + list = '' + opts.keys.sort.each do |option| + opt = cmd.options[option] + # TODO: remove when UX of help is reworked 1.0 + usage = opt.usage.split(', ') + .map { |x| x.tr('[]', '') } + .map { |x| x.start_with?('-') ? x : '-'+x } + .map { |x| '``' + x + '``' } + list << f.li("#{usage.join(', ')} \n#{opt.description}") + end.join + res << f.ul(list) + end + + # FIXME: for some reason we have extra lines in our RST; needs investigation + res << "\n\n" if f == RST + end + + dst = 'docs/cli' + f.suffix + File.write(dst, res) + puts "Documentation generated in #{dst.inspect}" + end + + desc 'Create resources docs' + task :resources, [:clean] do + src = 'docs' + dst = 'www/source/docs/reference/resources' + FileUtils.mkdir_p(dst) + + docs = ResourceDocs.new(src) + resources = Dir[File.join(src, 'resources/*.md.erb')] + .map { |x| x.sub(/^#{src}/, '') } + puts "Found #{src.length} resource docs" + puts "Rendering docs to #{dst}/" + + progressbar = ProgressBar.create(total: resources.length, title: 'Rendering') + resources.each do |file| + progressbar.log(' '+file) + dst_name = File.basename(file).sub(/\.md\.erb$/, '.html.md') + res = docs.render(file) + File.write(File.join(dst, dst_name), res) + progressbar.increment + end + progressbar.finish + + f = Markdown + res = f.meta(title: 'InSpec Resources Reference') + res << f.h1('InSpec Resources Reference') + res << f.p('The following InSpec audit resources are available:') + list = '' + resources.each do |file| + name = File.basename(file).sub(/\.md\.erb$/, '') + list << f.li(f.a(name.sub('_', '\\_'), 'resources/' + name + '.html')) + end + res << f.ul(list) + dst = File.join(src, 'resources.md') + puts "Create #{dst}" + File.write(dst, res) + end + + desc 'Clean all rendered docs from www/' + task :clean do + dst = 'www/source/docs/reference' + puts "Clean up #{dst}" + FileUtils.rm_rf(dst) if File.exist?(dst) + FileUtils.mkdir_p(dst) + end + + desc 'Copy fixed doc files' + task copy: [:clean, :resources] do + src = 'docs' + dst = 'www/source/docs/reference' + files = Dir[File.join(src, '*.md')] + + progressbar = ProgressBar.create(total: files.length, title: 'Copying') + files.each do |path| + name = File.basename(path).sub(/\.md$/, '.html.md') + progressbar.log(' '+File.join(dst, name)) + FileUtils.cp(path, File.join(dst, name)) + progressbar.increment + end + progressbar.finish + end +end + +def run_tasks_in_namespace(ns) + Rake.application.in_namespace(ns) do |x| + x.tasks.each do |task| + puts "----> #{task}" + task.invoke + end + end +end + +desc 'Create all docs in docs/ from source code' +task :docs do + run_tasks_in_namespace :docs + Verify.file('www/source/docs/reference/README.html.md') + Verify.file('www/source/docs/reference/cli.html.md') + Verify.file('www/source/docs/reference/resources.html.md') +end diff --git a/tasks/maintainers.rb b/tasks/maintainers.rb index 6aefc4711..874b9d4a9 100644 --- a/tasks/maintainers.rb +++ b/tasks/maintainers.rb @@ -27,9 +27,10 @@ begin require 'tomlrb' require 'octokit' require 'pp' - task default: :generate namespace :maintainers do + task default: :generate + desc 'Generate MarkDown version of MAINTAINERS file' task :generate do maintainers = Tomlrb.load_file SOURCE diff --git a/tasks/shared.rb b/tasks/shared.rb new file mode 100644 index 000000000..2c1a6704d --- /dev/null +++ b/tasks/shared.rb @@ -0,0 +1,37 @@ +# encoding: utf-8 +# Copyright:: Copyright (c) 2015 Chef Software, Inc. +# License:: Apache License, Version 2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +module Log + def self.section(msg) + puts "\n\033[36;1m====> #{msg}\033[0m" + end + + def self.info(msg) + puts "\033[32;1m----> #{msg}\033[0m" + end +end + +module Verify + def self.file(path) + return print("\033[32m.\033[0m") if File.file?(path) + fail "Failed to build this step. Looking for file in #{path} but it doesn't exist." + end + + def self.ok + puts "\n\033[32mAll build checks passed.\033[0m" + end +end diff --git a/tasks/www.rb b/tasks/www.rb new file mode 100644 index 000000000..4c8848c16 --- /dev/null +++ b/tasks/www.rb @@ -0,0 +1,126 @@ +# encoding: utf-8 +# Copyright:: Copyright (c) 2015 Chef Software, Inc. +# License:: Apache License, Version 2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +require_relative 'shared.rb' + +namespace :www do + desc 'Builds the tutorial contents' + task :tutorial do + Log.section 'Build the online tutorial in www/tutorial/' + sh('cd www/tutorial/ && npm install') + sh('cd www/tutorial/ && gulp build') + Verify.file('www/tutorial/dist/index.html') + Verify.file('www/tutorial/dist/css/inspec_tutorial.css') + Verify.file('www/tutorial/dist/scripts/inspec_tutorial.js') + Verify.file('www/tutorial/dist/dist/inspec_tutorial.js') + end + + desc 'Builds the middleman site' + task :site do + Log.section 'Build middleman project in www/' + Bundler.with_clean_env { + sh('cd www/ && bundle install && bundle exec middleman build') + } + Verify.file('www/build/index.html') + Verify.file('www/build/javascripts/all.js') + Verify.file('www/build/stylesheets/site.css') + end + + desc 'Assemble the website site from middleman and the tutorial' + task :assemble do + Log.section 'Copy only tutorial into middleman build directory' + sh('rsync -a --exclude=index.html www/tutorial/dist/* www/build/') + end + + desc 'Builds the full site locally' + task build: ['www:tutorial', 'www:site', 'www:assemble'] + + task :clean do + dst = 'www/build' + FileUtils.rm_rf(dst) if File.directory?(dst) + end + + desc 'Releases the site to gh-pages' + task :release do + # This folder contains the built files + dst = 'www/build' + unless File.directory?(dst) && File.file?(File.join(dst, 'index.html')) + puts 'It looks like you have not built the site yet. Calling rake www:build' + Rake::Task['www:build'].invoke + end + + unless File.directory?(dst) && File.file?(File.join(dst, 'index.html')) + fail 'It looks like the site was not build. Aborting.' + end + + # check if git exists + sh('command -v git >/dev/null 2>&1') || + fail("It looks like `git` isn't installed. It is required to run this build task.") + + unless sh('git diff-index --quiet HEAD --') + fail 'Please make sure you have no uncommitted changes in this repository.' + end + + File.write('www/build/CNAME', 'inspec.io') + file_count = Dir['www/build/*'].length + file_size = `du -hs www/build`.sub(/\s+.*$/m, '') + + Log.info 'Remove local gh-pages branch' + sh('git branch -D gh-pages') + + current_branch = `git rev-parse --abbrev-ref HEAD`.strip + if current_branch.empty? + fail 'Cannot determine current branch to go back to! Aborting.' + end + + Log.info 'Create empty gh-pages branch' + sh('git checkout --orphan gh-pages') + + Log.info 'Clear out all local git files!' + sh('git rm -rf .') + + Log.info "Add the built files in #{dst}" + sh("git add #{dst}") + + Log.info 'Remove all other files in this empty branch' + sh('git clean -df') + + Log.info 'Move the site to the root directory' + sh("git mv #{File.join(dst, '*')} .") + + Log.info 'Commit to gh-pages' + sh("git commit -m 'website update'") + + require 'inquirer' + if Ask.confirm("Ready to go, I have #{file_count} files at #{file_size}. "\ + 'Do you want to push this live?', default: false) + Log.info 'push to origin, this may take a moment' + sh('git push -u origin --force-with-lease gh-pages') + else + puts 'Aborted.' + end + + sh("git checkout #{current_branch}") + end +end + +task :www do + Rake::Task['www:clean'].invoke + Rake::Task['docs'].invoke + Rake::Task['www:build'].invoke + Rake::Task['www:release'].invoke +end diff --git a/test/cookbooks/os_prepare/recipes/file.rb b/test/cookbooks/os_prepare/recipes/file.rb index 79167a757..5726bca16 100644 --- a/test/cookbooks/os_prepare/recipes/file.rb +++ b/test/cookbooks/os_prepare/recipes/file.rb @@ -40,7 +40,30 @@ if node['platform_family'] != 'windows' else - directory 'C:\Test Directory' - file 'C:\Test Directory\test file.txt' + user 'TestUser' do + password 'p@ssw0rd' + end + + directory 'C:\Test Directory' do + rights :read, 'Administrators' + rights :read_execute, 'Administrators' + rights :write, 'Administrators' + rights :modify, 'Administrators' + rights :full_control, 'Administrators', :applies_to_children => true + deny_rights :read, 'TestUser' + deny_rights :write, 'TestUser' + deny_rights :read_execute, 'TestUser' + end + + file 'C:\Test Directory\test file.txt' do + rights :read, 'Administrators' + rights :read_execute, 'Administrators' + rights :write, 'Administrators' + rights :modify, 'Administrators' + rights :full_control, 'Administrators' + deny_rights :read, 'TestUser' + deny_rights :write, 'TestUser' + deny_rights :read_execute, 'TestUser' + end end diff --git a/test/docker_test.rb b/test/docker_test.rb index 154491b76..dde6d0cf2 100644 --- a/test/docker_test.rb +++ b/test/docker_test.rb @@ -50,7 +50,7 @@ class DockerTester puts "--> run test on docker #{container.id}" opts = { 'target' => "docker://#{container.id}" } runner = Inspec::Runner.new(opts) - @tests.each { |test| runner.add_target(test, opts) } + @tests.each { |test| runner.add_target(test) } runner.tests.map { |g| g.run(report) } end end diff --git a/test/functional/gitfetcher_test.rb b/test/functional/gitfetcher_test.rb new file mode 100644 index 000000000..e6c66a4cd --- /dev/null +++ b/test/functional/gitfetcher_test.rb @@ -0,0 +1,44 @@ +require 'functional/helper' +require 'fileutils' +require 'tmpdir' + +describe 'profiles with git-based dependencies' do + include FunctionalHelper + before(:all) do + @tmpdir = Dir.mktmpdir + @profile_dir = File.join(@tmpdir, "test-profile") + @git_dep_dir = File.join(@tmpdir, "git-dep") + + Dir.chdir(@tmpdir) do + inspec("init profile git-dep") + inspec("init profile test-profile") + end + + Dir.chdir(@git_dep_dir) do + CMD.run_command("git init") + CMD.run_command("git add .") + CMD.run_command("git commit -m 'initial commit' --no-gpg-sign") + CMD.run_command("git commit -m 'another commit' --allow-empty --no-gpg-sign") + CMD.run_command("git tag antag") + end + + File.open(File.join(@profile_dir, "inspec.yml"), 'a') do |f| + f.write < we have partial stdout output right now - out.stderr.must_include "Don't understand inspec profile in \"/proc\"" - out.exit_status.must_equal 1 - File.exist?(dst.path).must_equal false + Dir.tmpdir do |target_dir| + out = inspec('archive #{target_dir} --output ' + dst.path) + # out.stdout.must_equal '' => we have partial stdout output right now + out.stderr.must_include "Don't understand inspec profile in \"#{target_dir}\"" + out.exit_status.must_equal 1 + File.exist?(dst.path).must_equal false + end end it 'archive wont overwrite existing files' do diff --git a/test/functional/inspec_artifact_test.rb b/test/functional/inspec_artifact_test.rb new file mode 100644 index 000000000..98005c174 --- /dev/null +++ b/test/functional/inspec_artifact_test.rb @@ -0,0 +1,48 @@ +# encoding: utf-8 + +require 'fileutils' +require 'functional/helper' +require 'securerandom' + +describe 'inspec exec' do + include FunctionalHelper + + it 'can generate keys' do + unique_key_name = SecureRandom.uuid() + out = inspec("artifact generate --keyname #{unique_key_name}") + # haha, ruby so shitty, there's ALWAYS gem problems + #out.stderr.must_equal '' + out.exit_status.must_equal 0 + stdout = out.stdout.force_encoding(Encoding::UTF_8) + stdout.must_include 'Generating private key' + stdout.must_include 'Generating public key' + + FileUtils.rm("#{unique_key_name}.pem.pub") + FileUtils.rm("#{unique_key_name}.pem.key") + end + + it 'can sign, verify and install a signed profile' do + FileUtils.rm_f('profile-1.0.0.iaf') + unique_key_name = SecureRandom.uuid() + install_dir = SecureRandom.uuid() + FileUtils.mkdir(install_dir) + + out = inspec("artifact generate --keyname #{unique_key_name}") + out.exit_status.must_equal 0 + + out = inspec("artifact sign-profile --profile #{example_profile} --keyname #{unique_key_name}") + out.exit_status.must_equal 0 + + out = inspec("artifact install-profile --infile profile-1.0.0.iaf --destdir #{install_dir}") + out.exit_status.must_equal 0 + stdout = out.stdout.force_encoding(Encoding::UTF_8) + stdout.must_include "Installing to #{install_dir}" + entries = Dir.entries install_dir + entries.join.must_include "inspec.yml" + FileUtils.rm_rf(install_dir) + FileUtils.rm("#{unique_key_name}.pem.pub") + FileUtils.rm("#{unique_key_name}.pem.key") + FileUtils.rm('profile-1.0.0.iaf') + end + +end diff --git a/test/functional/inspec_exec_json_test.rb b/test/functional/inspec_exec_json_test.rb index 64a6acdb8..2b4a289b8 100644 --- a/test/functional/inspec_exec_json_test.rb +++ b/test/functional/inspec_exec_json_test.rb @@ -8,37 +8,40 @@ describe 'inspec exec with json formatter' do include FunctionalHelper it 'can execute a simple file with the json formatter' do - out = inspec('exec ' + example_control + ' --format json') + out = inspec('exec ' + example_control + ' --format json --no-create-lockfile') out.stderr.must_equal '' out.exit_status.must_equal 0 JSON.load(out.stdout).must_be_kind_of Hash end it 'can execute the profile with the json formatter' do - out = inspec('exec ' + example_profile + ' --format json') + out = inspec('exec ' + example_profile + ' --format json --no-create-lockfile') out.stderr.must_equal '' out.exit_status.must_equal 0 JSON.load(out.stdout).must_be_kind_of Hash end describe 'execute a profile with json formatting' do - let(:json) { JSON.load(inspec('exec ' + example_profile + ' --format json').stdout) } - let(:profile) { json['profiles']['profile'] } + let(:json) { JSON.load(inspec('exec ' + example_profile + ' --format json --no-create-lockfile').stdout) } + let(:profile) { json['profiles'][0] } let(:controls) { profile['controls'] } - let(:ex1) { controls['tmp-1.0'] } - let(:ex2) { - k = controls.keys.find { |x| x =~ /generated/ } - controls[k] - } - let(:ex3) { profile['controls']['gordon-1.0'] } + let(:ex1) { controls.find { |x| x['id'] == 'tmp-1.0' } } + let(:ex2) { controls.find { |x| x['id'] =~ /generated/ } } + let(:ex3) { profile['controls'].find { |x| x['id'] == 'gordon-1.0' } } let(:check_result) { ex3['results'].find { |x| x['resource'] == 'gordon_config' } } + it 'has only one profile' do + json['profiles'].must_be_kind_of(Array) + json['profiles'].length.must_equal 1 + end + it 'has all the metadata' do actual = profile.dup - key = actual.delete('controls').keys - .find { |x| x =~ /generated from example.rb/ } + key = actual.delete('controls') + .find { |x| x['id'] =~ /generated from example.rb/ }['id'] + groups = actual.delete('groups') actual.must_equal({ "name" => "profile", "title" => "InSpec Example Profile", @@ -49,13 +52,14 @@ describe 'inspec exec with json formatter' do "summary" => "Demonstrates the use of InSpec Compliance Profile", "version" => "1.0.0", "supports" => [{"os-family" => "unix"}], - "groups" => { - "controls/meta.rb" => {"title"=>"SSH Server Configuration", "controls"=>["ssh-1"]}, - "controls/example.rb" => {"title"=>"/tmp profile", "controls"=>["tmp-1.0", key]}, - "controls/gordon.rb" => {"title"=>"Gordon Config Checks", "controls"=>["gordon-1.0"]}, - }, "attributes" => [] }) + + groups.sort_by { |x| x['id'] }.must_equal([ + {"id"=>"controls/example.rb", "title"=>"/tmp profile", "controls"=>["tmp-1.0", key]}, + {"id"=>"controls/gordon.rb", "title"=>"Gordon Config Checks", "controls"=>["gordon-1.0"]}, + {"id"=>"controls/meta.rb", "title"=>"SSH Server Configuration", "controls"=>["ssh-1"]}, + ]) end it 'must have 4 controls' do @@ -63,7 +67,7 @@ describe 'inspec exec with json formatter' do end it 'has an id for every control' do - controls.keys.find(&:nil?).must_be :nil? + controls.find { |x| x['id'].nil? }.must_be :nil? end it 'has no missing checks' do @@ -91,6 +95,7 @@ describe 'inspec exec with json formatter' do result['start_time'].wont_be :nil? actual.must_equal({ + "id" => "tmp-1.0", "title" => "Create /tmp directory", "desc" => "An optional description...", "impact" => 0.7, @@ -110,7 +115,7 @@ describe 'inspec exec with json formatter' do end describe 'with a profile that is not supported on this OS/platform' do - let(:out) { inspec('exec ' + File.join(profile_path, 'skippy-profile-os') + ' --format json') } + let(:out) { inspec('exec ' + File.join(profile_path, 'skippy-profile-os') + ' --format json --no-create-lockfile') } let(:json) { JSON.load(out.stdout) } # TODO: failure handling in json formatters... diff --git a/test/functional/inspec_exec_jsonmin_test.rb b/test/functional/inspec_exec_jsonmin_test.rb index dcf8b9982..df1178b41 100644 --- a/test/functional/inspec_exec_jsonmin_test.rb +++ b/test/functional/inspec_exec_jsonmin_test.rb @@ -8,21 +8,21 @@ describe 'inspec exec' do include FunctionalHelper it 'can execute the profile with the mini json formatter' do - out = inspec('exec ' + example_profile + ' --format json-min') + out = inspec('exec ' + example_profile + ' --format json-min --no-create-lockfile') out.stderr.must_equal '' out.exit_status.must_equal 0 JSON.load(out.stdout).must_be_kind_of Hash end it 'can execute a simple file with the mini json formatter' do - out = inspec('exec ' + example_control + ' --format json-min') + out = inspec('exec ' + example_control + ' --format json-min --no-create-lockfile') out.stderr.must_equal '' out.exit_status.must_equal 0 JSON.load(out.stdout).must_be_kind_of Hash end describe 'execute a profile with mini json formatting' do - let(:json) { JSON.load(inspec('exec ' + example_profile + ' --format json-min').stdout) } + let(:json) { JSON.load(inspec('exec ' + example_profile + ' --format json-min --no-create-lockfile').stdout) } let(:controls) { json['controls'] } let(:ex1) { controls.find{|x| x['id'] == 'tmp-1.0'} } let(:ex2) { controls.find{|x| x['id'] =~ /generated/} } diff --git a/test/functional/inspec_exec_test.rb b/test/functional/inspec_exec_test.rb index a51620941..dd2873e43 100644 --- a/test/functional/inspec_exec_test.rb +++ b/test/functional/inspec_exec_test.rb @@ -8,95 +8,112 @@ describe 'inspec exec' do include FunctionalHelper it 'can execute the profile' do - out = inspec('exec ' + example_profile) + out = inspec('exec ' + example_profile + ' --no-create-lockfile') out.stderr.must_equal '' out.exit_status.must_equal 0 stdout = out.stdout.force_encoding(Encoding::UTF_8) - stdout.must_include "\n\e[32m ✔ ssh-1: Allow only SSH Protocol 2\e[0m\n" - stdout.must_include "\n\e[32m ✔ tmp-1.0: Create /tmp directory\e[0m\n" + stdout.must_include "\e[32m ✔ ssh-1: Allow only SSH Protocol 2\e[0m\n" + stdout.must_include "\e[32m ✔ tmp-1.0: Create /tmp directory\e[0m\n" stdout.must_include " \e[37m ○ gordon-1.0: Verify the version number of Gordon (1 skipped)\e[0m -\e[37m Can't find file \"/tmp/gordon/config.yaml\"\e[0m +\e[37m ○ Can't find file \"/tmp/gordon/config.yaml\"\e[0m " - stdout.must_include "\nSummary: \e[32m4 successful\e[0m, \e[31m0 failures\e[0m, \e[37m1 skipped\e[0m\n" + stdout.must_include "\nProfile Summary: \e[32m2 successful\e[0m, \e[31m0 failures\e[0m, \e[37m1 skipped\e[0m" + stdout.must_include "\nTest Summary: \e[32m4 successful\e[0m, \e[31m0 failures\e[0m, \e[37m1 skipped\e[0m\n" end it 'executes a minimum metadata-only profile' do - out = inspec('exec ' + File.join(profile_path, 'simple-metadata')) + out = inspec('exec ' + File.join(profile_path, 'simple-metadata') + ' --no-create-lockfile') out.stderr.must_equal '' out.exit_status.must_equal 0 out.stdout.must_equal " + Profile: yumyum profile Version: unknown Target: local:// No tests executed.\e[0m -Summary: \e[32m0 successful\e[0m, \e[31m0 failures\e[0m, \e[37m0 skipped\e[0m +Test Summary: \e[32m0 successful\e[0m, \e[31m0 failures\e[0m, \e[37m0 skipped\e[0m " end it 'executes a metadata-only profile' do - out = inspec('exec ' + File.join(profile_path, 'complete-metadata')) + out = inspec('exec ' + File.join(profile_path, 'complete-metadata') + ' --no-create-lockfile') out.stderr.must_equal '' out.exit_status.must_equal 0 out.stdout.must_equal " + Profile: title (name) Version: 1.2.3 Target: local:// No tests executed.\e[0m -Summary: \e[32m0 successful\e[0m, \e[31m0 failures\e[0m, \e[37m0 skipped\e[0m +Test Summary: \e[32m0 successful\e[0m, \e[31m0 failures\e[0m, \e[37m0 skipped\e[0m " end + it "executes a profile and reads attributes" do + out = inspec("exec #{File.join(examples_path, 'profile-attribute')} --no-create-lockfile --attrs #{File.join(examples_path, "profile-attribute.yml")}") + out.stderr.must_equal '' + out.exit_status.must_equal 0 + out.stdout.force_encoding(Encoding::UTF_8).must_include "Summary: \e[32m2 successful\e[0m, \e[31m0 failures\e[0m, \e[37m0 skipped\e[0m" + end + it 'executes a specs-only profile' do - out = inspec('exec ' + File.join(profile_path, 'spec_only')) + out = inspec('exec ' + File.join(profile_path, 'spec_only') + ' --no-create-lockfile') out.stderr.must_equal '' out.exit_status.must_equal 1 - out.stdout.force_encoding(Encoding::UTF_8).must_equal " -Target: local:// - -\e[32m ✔ working should eq \"working\"\e[0m -\e[37m ○ skippy This will be skipped intentionally.\e[0m -\e[31m ✖ failing should eq \"as intended\" ( - expected: \"as intended\" - got: \"failing\" - - (compared using ==) - )\e[0m - -Summary: \e[32m1 successful\e[0m, \e[31m1 failures\e[0m, \e[37m1 skipped\e[0m -" + out.stdout.force_encoding(Encoding::UTF_8).must_include "Target: local://" + out.stdout.force_encoding(Encoding::UTF_8).must_include "working should" + out.stdout.force_encoding(Encoding::UTF_8).must_include "✔ eq \"working\"" + out.stdout.force_encoding(Encoding::UTF_8).must_include "skippy\n" + out.stdout.force_encoding(Encoding::UTF_8).must_include "○ This will be skipped intentionally" + out.stdout.force_encoding(Encoding::UTF_8).must_include "failing should" + out.stdout.force_encoding(Encoding::UTF_8).must_include "✖ eq \"as intended\"" + out.stdout.force_encoding(Encoding::UTF_8).must_include "Test Summary: \e[32m1 successful\e[0m, \e[31m1 failures\e[0m, \e[37m1 skipped\e[0m" end it 'executes only specified controls' do - out = inspec('exec ' + example_profile + ' --controls tmp-1.0') + out = inspec('exec ' + example_profile + ' --no-create-lockfile --controls tmp-1.0') out.stderr.must_equal '' out.exit_status.must_equal 0 - out.stdout.must_include "\nSummary: \e[32m1 successful\e[0m, \e[31m0 failures\e[0m, \e[37m0 skipped\e[0m\n" + out.stdout.must_include "\nProfile Summary: \e[32m1 successful\e[0m, \e[31m0 failures\e[0m, \e[37m0 skipped\e[0m\n" end it 'can execute a simple file with the default formatter' do - out = inspec('exec ' + example_control) + out = inspec('exec ' + example_control + ' --no-create-lockfile') out.stderr.must_equal '' out.exit_status.must_equal 0 - out.stdout.must_include "\nSummary: \e[32m2 successful\e[0m, \e[31m0 failures\e[0m, \e[37m0 skipped\e[0m\n" + out.stdout.must_include "\nProfile Summary: \e[32m1 successful\e[0m, \e[31m0 failures\e[0m, \e[37m0 skipped\e[0m\n" + out.stdout.must_include "\nTest Summary: \e[32m2 successful\e[0m, \e[31m0 failures\e[0m" end describe 'with a profile that is not supported on this OS/platform' do - let(:out) { inspec('exec ' + File.join(profile_path, 'skippy-profile-os')) } + let(:out) { inspec('exec ' + File.join(profile_path, 'skippy-profile-os') + ' --no-create-lockfile') } let(:json) { JSON.load(out.stdout) } it 'exits with an error' do - out.stderr.must_match /^This OS\/platform \(.+\) is not supported by this profile.$/ + out.stderr.must_match(/^This OS\/platform \(.+\) is not supported by this profile.$/) out.exit_status.must_equal 1 end end + describe 'with a profile that contains skipped controls' do + let(:out) { inspec('exec ' + File.join(profile_path, 'skippy-controls') + ' --no-create-lockfile') } + let(:json) { JSON.load(out.stdout) } + + it 'exits with an error' do + out.stdout.force_encoding(Encoding::UTF_8).must_include "skippy\e[0m\n\e[37m ○ This will be skipped super intentionally.\e[0m\n" + out.stdout.force_encoding(Encoding::UTF_8).must_include " ○ CONTROL database: MySQL Session\e[0m\n\e[37m ○ Can't run MySQL SQL checks without authentication\e[0m\n" + out.stdout.force_encoding(Encoding::UTF_8).must_include "Profile Summary: \e[32m0 successful\e[0m, \e[31m0 failures\e[0m, \e[37m2 skipped\e[0m" + out.exit_status.must_equal 0 + end + end + describe 'with a profile that is supported on this version of inspec' do - let(:out) { inspec('exec ' + File.join(profile_path, 'supported_inspec')) } + let(:out) { inspec('exec ' + File.join(profile_path, 'supported_inspec') + ' --no-create-lockfile') } it 'exits cleanly' do out.stderr.must_equal '' @@ -105,7 +122,7 @@ Summary: \e[32m1 successful\e[0m, \e[31m1 failures\e[0m, \e[37m1 skipped\e[0m end describe 'with a profile that is not supported on this version of inspec' do - let(:out) { inspec('exec ' + File.join(profile_path, 'unsupported_inspec')) } + let(:out) { inspec('exec ' + File.join(profile_path, 'unsupported_inspec') + ' --no-create-lockfile') } it 'does not support this profile' do out.exit_status.must_equal 1 @@ -114,10 +131,119 @@ Summary: \e[32m1 successful\e[0m, \e[31m1 failures\e[0m, \e[37m1 skipped\e[0m end describe 'with a profile that loads a library and reference' do - let(:out) { inspec('exec ' + File.join(profile_path, 'library')) } + let(:out) { inspec('exec ' + File.join(profile_path, 'library') + ' --no-create-lockfile') } it 'executes the profile without error' do out.exit_status.must_equal 0 end end + + describe 'given a profile with controls and anonymous describe blocks' do + let(:out) { inspec('exec ' + example_control + ' --no-create-lockfile') } + + it 'prints the control results, then the anonymous describe block results' do + out.stdout.force_encoding(Encoding::UTF_8).must_equal " +Target: local:// + +\e[32m \xE2\x9C\x94 tmp-1.0: Create /tmp directory\e[0m +\e[32m \xE2\x9C\x94 File /tmp should be directory\e[0m + + File /tmp +\e[32m \xE2\x9C\x94 should be directory\e[0m + +Profile Summary: \e[32m1 successful\e[0m, \e[31m0 failures\e[0m, \e[37m0 skipped\e[0m +Test Summary: \e[32m2 successful\e[0m, \e[31m0 failures\e[0m, \e[37m0 skipped\e[0m +" + end + end + + describe 'given a profile with an anonymous describe block' do + let(:out) { inspec('exec ' + failure_control + ' --no-create-lockfile') } + + it 'prints the exception message when a test has a syntax error' do + out.stdout.must_include "undefined method `should_nota' " + end + end + + describe 'given an inherited profile that has more that one test per control block' do + let(:out) { inspec('exec ' + simple_inheritance + ' --no-create-lockfile') } + + it 'should print all the results' do + out.stdout.force_encoding(Encoding::UTF_8).must_include "✖ tmp-1.0: Create /tmp directory (1 failed)\e[0m" + out.stdout.force_encoding(Encoding::UTF_8).must_include "✖ should not be directory\n" + out.stdout.force_encoding(Encoding::UTF_8).must_include "✖ undefined method `should_nota'" + out.stdout.force_encoding(Encoding::UTF_8).must_include "✖ should not be directory\n expected `File /tmp.directory?` to return false, got true\e[0m" + out.stdout.force_encoding(Encoding::UTF_8).must_include "✖ 7 should cmp >= 9\n" + out.stdout.force_encoding(Encoding::UTF_8).must_include "✖ 7 should not cmp == /^\\d$/\n" + out.stdout.force_encoding(Encoding::UTF_8).must_include "✔ 7 should cmp == \"7\"" + out.stdout.force_encoding(Encoding::UTF_8).must_include " expected: \"01147\" + got: \"01777\"\n" + end + end + + describe 'when passing in two profiles given an inherited profile that has more that one test per control block' do + let(:out) { inspec('exec ' + File.join(profile_path, 'dependencies', 'profile_d') + ' ' + simple_inheritance + ' --no-create-lockfile') } + + it 'should print all the results' do + out.stdout.force_encoding(Encoding::UTF_8).must_include "✖ tmp-1.0: Create /tmp directory (1 failed)\e[0m" + out.stdout.force_encoding(Encoding::UTF_8).must_include "✖ should not be directory" + out.stdout.force_encoding(Encoding::UTF_8).must_include "✖ undefined method `should_nota'" + out.stdout.force_encoding(Encoding::UTF_8).must_include "✖ should not be directory\n expected `File /tmp.directory?` to return false, got true\e[0m" + out.stdout.force_encoding(Encoding::UTF_8).must_include "✔ profiled-1: Create /tmp directory (profile d)" + end + end + + describe 'given an inherited profile' do + let(:out) { inspec('exec ' + simple_inheritance) } + + it 'should print the profile information and then the test results' do + out.stdout.force_encoding(Encoding::UTF_8).must_include "local://\n\n\n\e[31;1m ✖ tmp-1.0: Create /tmp directory (1 failed)\e[0m\n\e[31;1m ✖ File /tmp should not be directory\n" + end + end + + describe 'using namespaced resources' do + it 'works' do + out = inspec('exec ' + File.join(profile_path, 'dependencies', 'resource-namespace') + ' --no-create-lockfile') + out.stderr.must_equal '' + out.exit_status.must_equal 0 + out.stdout.force_encoding(Encoding::UTF_8).must_include "Summary: \e[32m5 successful\e[0m, \e[31m0 failures\e[0m, \e[37m0 skipped\e[0m\n" + end + end + + describe 'with require_controls' do + it 'does not run rules you did not include' do + out = inspec('exec ' + File.join(profile_path, 'dependencies', 'require_controls_test') + ' --no-create-lockfile') + out.stderr.must_equal '' + out.exit_status.must_equal 0 + out.stdout.force_encoding(Encoding::UTF_8).must_include "Summary: \e[32m1 successful\e[0m, \e[31m0 failures\e[0m, \e[37m0 skipped\e[0m\n" + end + end + + describe "with a 2-level dependency tree" do + it 'correctly runs tests from the whole tree' do + out = inspec('exec ' + File.join(profile_path, 'dependencies', 'inheritance') + ' --no-create-lockfile') + out.stderr.must_equal '' + out.exit_status.must_equal 0 + out.stdout.force_encoding(Encoding::UTF_8).must_include "Summary: \e[32m6 successful\e[0m, \e[31m0 failures\e[0m, \e[37m0 skipped\e[0m\n" + end + end + + describe 'when using profiles on the supermarket' do + it 'can run supermarket profiles directly from the command line' do + out = inspec("exec supermarket://nathenharvey/tmp-compliance-profile --no-create-lockfile") + out.stdout.force_encoding(Encoding::UTF_8).must_include "Summary: \e[32m2 successful\e[0m, \e[31m0 failures\e[0m, \e[37m0 skipped\e[0m\n" + end + + it 'can run supermarket profiles from inspec.yml' do + out = inspec("exec #{File.join(profile_path, 'supermarket-dep')} --no-create-lockfile") + out.stdout.force_encoding(Encoding::UTF_8).must_include "Summary: \e[32m2 successful\e[0m, \e[31m0 failures\e[0m, \e[37m0 skipped\e[0m\n" + end + end + + describe 'when a dependency does not support our backend platform' do + it 'skips the controls from that profile' do + out = inspec("exec #{File.join(profile_path, 'profile-support-skip')} --no-create-lockfile") + out.stdout.force_encoding(Encoding::UTF_8).must_include "Summary: \e[32m0 successful\e[0m, \e[31m0 failures\e[0m, \e[37m2 skipped\e[0m\n" + end + end end diff --git a/test/functional/inspec_json_profile_test.rb b/test/functional/inspec_json_profile_test.rb index ba8bad26a..816cee45d 100644 --- a/test/functional/inspec_json_profile_test.rb +++ b/test/functional/inspec_json_profile_test.rb @@ -47,7 +47,7 @@ describe 'inspec json' do end describe 'a control' do - let(:control) { json['controls']['tmp-1.0'] } + let(:control) { json['controls'].find { |x| x['id'] == 'tmp-1.0' } } it 'has a title' do control['title'].must_equal 'Create /tmp directory' @@ -72,7 +72,7 @@ describe 'inspec json' do end it 'has a the source code' do - control['code'].must_match /\Acontrol \"tmp-1.0\" do.*end\n\Z/m + control['code'].must_match(/\Acontrol \"tmp-1.0\" do.*end\n\Z/m) end end end @@ -87,8 +87,10 @@ describe 'inspec json' do it 'only has one control included' do json = JSON.load(out.stdout) - json['controls'].keys.must_equal %w{tmp-1.0} - json['groups'].keys.must_equal %w{controls/example.rb} + json['controls'].length.must_equal 1 + json['controls'][0]['id'].must_equal 'tmp-1.0' + json['groups'].length.must_equal 1 + json['groups'][0]['id'].must_equal 'controls/example.rb' end end diff --git a/test/functional/inspec_shell_test.rb b/test/functional/inspec_shell_test.rb new file mode 100644 index 000000000..7eb458078 --- /dev/null +++ b/test/functional/inspec_shell_test.rb @@ -0,0 +1,183 @@ +# encoding: utf-8 + +require 'functional/helper' + +describe 'inspec shell tests' do + include FunctionalHelper + + describe 'cmd' do + def do_shell_c(code, exit_status, json = false, stderr = '') + json_suffix = " --format 'json'" if json + out = inspec("shell -c '#{code.tr('\'','\\\'')}'#{json_suffix}") + out.stderr.must_equal stderr + out.exit_status.must_equal exit_status + out + end + + it 'can run ruby expressions (json output)' do + x = rand + y = rand + out = do_shell_c("#{x} + #{y}", 0, true) + j = JSON.load(out.stdout) + j.must_equal x+y + end + + it 'can run ruby expressions' do + x = rand + y = rand + out = do_shell_c("#{x} + #{y}", 0) + out.stdout.must_equal "#{x+y}\n" + end + + it 'can run arbitrary ruby (json output)' do + out = do_shell_c('x = [1,2,3].inject(0) {|a,v| a + v*v}; x+10', 0, true) + j = JSON.load(out.stdout) + j.must_equal 24 # 1^2 + 2^2 + 3^2 + 10 + end + + it 'can run arbitrary ruby' do + out = do_shell_c('x = [1,2,3].inject(0) {|a,v| a + v*v}; x+10', 0) + out.stdout.must_equal "24\n" + end + + it 'retrieves resources (json output)' do + out = do_shell_c('os.params', 0, true) + j = JSON.load(out.stdout) + j.keys.must_include 'name' + j.keys.must_include 'family' + j.keys.must_include 'arch' + j.keys.must_include 'release' + end + + it 'retrieves resources' do + out = do_shell_c('os.params', 0) + out.stdout.must_include 'name' + out.stdout.must_include 'family' + out.stdout.must_include 'arch' + out.stdout.must_include 'release' + end + + it 'runs anonymous tests that succeed (json output)' do + out = do_shell_c("describe file(\"#{__FILE__}\") do it { should exist } end", 0, true) + j = JSON.load(out.stdout) + j.keys.must_include 'version' + j.keys.must_include 'profiles' + j.keys.must_include 'other_checks' + j.keys.must_include 'statistics' + end + + it 'runs anonymous tests that succeed' do + out = do_shell_c("describe file(\"#{__FILE__}\") do it { should exist } end", 0) + out.stdout.must_include '1 successful' + out.stdout.must_include '0 failures' + end + + it 'runs anonymous tests that fail (json output)' do + out = do_shell_c("describe file(\"foo/bar/baz\") do it { should exist } end", 1, true) + j = JSON.load(out.stdout) + j.keys.must_include 'version' + j.keys.must_include 'profiles' + j.keys.must_include 'other_checks' + j.keys.must_include 'statistics' + end + + it 'runs anonymous tests that fail' do + out = do_shell_c("describe file(\"foo/bar/baz\") do it { should exist } end", 1) + out.stdout.must_include '0 successful' + out.stdout.must_include '1 failures' + end + + it 'runs controls with tests (json output)' do + out = do_shell_c("control \"test\" do describe file(\"#{__FILE__}\") do it { should exist } end end", 0, true) + j = JSON.load(out.stdout) + j.keys.must_include 'version' + j.keys.must_include 'profiles' + j.keys.must_include 'other_checks' + j.keys.must_include 'statistics' + end + + it 'runs controls with tests' do + out = do_shell_c("control \"test\" do describe file(\"#{__FILE__}\") do it { should exist } end end", 0) + out.stdout.must_include '1 successful' + out.stdout.must_include '0 failures' + end + + it 'runs controls with multiple tests (json output)' do + out = do_shell_c("control \"test\" do describe file(\"#{__FILE__}\") do it { should exist } end; describe file(\"foo/bar/baz\") do it { should exist } end end", 1, true) + j = JSON.load(out.stdout) + j.keys.must_include 'version' + j.keys.must_include 'profiles' + j.keys.must_include 'other_checks' + j.keys.must_include 'statistics' + end + + it 'runs controls with multiple tests' do + out = do_shell_c("control \"test\" do describe file(\"#{__FILE__}\") do it { should exist } end; describe file(\"foo/bar/baz\") do it { should exist } end end", 1) + out.stdout.must_include '0 successful' + out.stdout.must_include '1 failures' + end + end + + describe 'shell' do + def do_shell(code, exit_status = 0, stderr = '') + cmd = "echo '#{code.tr('\'','\\\'')}' | #{exec_inspec} shell" + out = CMD.run_command(cmd) + #out.stderr.must_equal stderr + out.exit_status.must_equal exit_status + out + end + + it 'provides a help command' do + out = do_shell('help') + out.stdout.must_include 'Available commands:' + out.stdout.must_include 'You are currently running on:' + end + + it 'exposes all resources' do + out = do_shell('os') + out.stdout.must_match(/\=> .*Operating.* .*System.* .*Detection/) + end + + it 'can run ruby expressions' do + x = rand + y = rand + out = do_shell("#{x} + #{y}") + out.stdout.must_include "#{x+y}" + end + + it 'can run arbitrary ruby' do + out = do_shell('x = [1,2,3].inject(0) {|a,v| a + v*v}; x+10') + out.stdout.must_include "24" + end + + it 'runs anonymous tests that succeed' do + out = do_shell("describe file(\"#{__FILE__}\") do it { should exist } end") + out.stdout.must_include '1 successful' + out.stdout.must_include '0 failures' + end + + it 'runs anonymous tests that fail' do + out = do_shell("describe file(\"foo/bar/baz\") do it { should exist } end") + out.stdout.must_include '0 successful' + out.stdout.must_include '1 failures' + end + + it 'runs controls with tests' do + out = do_shell("control \"test\" do describe file(\"#{__FILE__}\") do it { should exist } end end") + out.stdout.must_include '1 successful' + out.stdout.must_include '0 failures' + end + + it 'runs controls with multiple tests' do + out = do_shell("control \"test\" do describe file(\"#{__FILE__}\") do it { should exist } end; describe file(\"foo/bar/baz\") do it { should exist } end end") + out.stdout.must_include '0 successful' + out.stdout.must_include '1 failures' + end + + it 'reruns controls when redefined' do + out = do_shell("control \"test\" do describe file(\"#{__FILE__}\") do it { should exist } end end\ncontrol \"test\" do describe file(\"foo/bar/baz\") do it { should exist } end end") + out.stdout.must_include '1 successful' + out.stdout.must_include '1 failures' + end + end +end diff --git a/test/functional/inspec_test.rb b/test/functional/inspec_test.rb index 7a2126766..737d64c69 100644 --- a/test/functional/inspec_test.rb +++ b/test/functional/inspec_test.rb @@ -34,29 +34,6 @@ describe 'command tests' do end end - describe 'cmd' do - it 'can run arbitrary ruby' do - x = rand - y = rand - out = inspec("shell -c '#{x} + #{y}'") - out.stderr.must_equal '' - out.exit_status.must_equal 0 - j = JSON.load(out.stdout) - j.must_equal x+y - end - - it 'retrieves resources in JSON' do - out = inspec("shell -c 'os.params'") - out.stderr.must_equal '' - out.exit_status.must_equal 0 - j = JSON.load(out.stdout) - j.keys.must_include 'name' - j.keys.must_include 'family' - j.keys.must_include 'arch' - j.keys.must_include 'release' - end - end - describe 'version' do it 'provides the version number on stdout' do out = inspec('version') @@ -66,25 +43,10 @@ describe 'command tests' do end end - describe 'shell' do - it 'provides a help command' do - out = CMD.run_command("echo \"help\nexit\" | #{exec_inspec} shell") - out.exit_status.must_equal 0 - out.stdout.must_include 'Available commands:' - out.stdout.must_include 'You are currently running on:' - end - - it 'exposes all resources' do - out = CMD.run_command("echo \"os\nexit\" | #{exec_inspec} shell") - out.exit_status.must_equal 0 - out.stdout.must_match /^=> .*Operating.* .*System.* .*Detection.*$/ - end - end - describe 'check' do it 'verifies that a profile is ok' do out = inspec('check ' + example_profile) - out.stdout.must_match /Valid.*true/ + out.stdout.must_match(/Valid.*true/) out.exit_status.must_equal 0 end end diff --git a/test/helper.rb b/test/helper.rb index 3891cf61a..b58797cad 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -1,11 +1,6 @@ # encoding: utf-8 # author: Dominik Richter # author: Christoph Hartmann - -require 'minitest/autorun' -require 'minitest/spec' -require 'mocha/setup' - require 'simplecov' SimpleCov.start do add_filter '/test/' @@ -14,6 +9,9 @@ SimpleCov.start do add_group 'Backends', 'lib/inspec/backend' end +require 'minitest/autorun' +require 'minitest/spec' +require 'mocha/setup' require 'fileutils' require 'pathname' require 'tempfile' @@ -51,6 +49,8 @@ class MockLoader ubuntu1204: { name: 'ubuntu', family: 'debian', release: '12.04', arch: 'x86_64' }, ubuntu1404: { name: 'ubuntu', family: 'debian', release: '14.04', arch: 'x86_64' }, ubuntu1504: { name: 'ubuntu', family: 'debian', release: '15.04', arch: 'x86_64' }, + mint17: { name: 'linuxmint', family: 'debian', release: '17.3', arch: 'x86_64' }, + mint18: { name: 'linuxmint', family: 'debian', release: '18', arch: 'x86_64' }, windows: { name: 'windows', family: 'windows', release: '6.2.9200', arch: 'x86_64' }, wrlinux: { name: 'wrlinux', family: 'redhat', release: '7.0(3)I2(2)', arch: 'x86_64' }, solaris11: { name: "solaris", family: 'solaris', release: '11', arch: 'i386'}, @@ -70,7 +70,7 @@ class MockLoader scriptpath = ::File.realpath(::File.dirname(__FILE__)) # create mock backend - @backend = Inspec::Backend.create({ backend: :mock }) + @backend = Inspec::Backend.create({ backend: :mock, verbose: true }) mock = @backend.backend # set os emulation @@ -118,6 +118,9 @@ class MockLoader 'rootwrap.conf' => mockfile.call('rootwrap.conf'), '/etc/apache2/apache2.conf' => mockfile.call('apache2.conf'), '/etc/apache2/ports.conf' => mockfile.call('ports.conf'), + '/etc/httpd/conf/httpd.conf' => mockfile.call('httpd.conf'), + '/etc/httpd/conf.d/ssl.conf' => mockfile.call('ssl.conf'), + '/etc/httpd/mods-enabled/status.conf' => mockfile.call('status.conf'), '/etc/apache2/conf-enabled/serve-cgi-bin.conf' => mockfile.call('serve-cgi-bin.conf'), '/etc/xinetd.conf' => mockfile.call('xinetd.conf'), '/etc/xinetd.d' => mockfile.call('xinetd.d'), @@ -137,16 +140,16 @@ class MockLoader } mock.commands = { - 'ps aux' => cmd.call('ps-aux'), - 'ps auxZ' => cmd.call('ps-auxZ'), + 'ps axo pid,pcpu,pmem,vsz,rss,tty,stat,start,time,user,command' => cmd.call('ps-axo'), + 'ps axo label,pid,pcpu,pmem,vsz,rss,tty,stat,start,time,user:32,command' => cmd.call('ps-axoZ'), 'Get-Content win_secpol.cfg' => cmd.call('secedit-export'), 'secedit /export /cfg win_secpol.cfg' => cmd.call('success'), 'Remove-Item win_secpol.cfg' => cmd.call('success'), 'env' => cmd.call('env'), '${Env:PATH}' => cmd.call('$env-PATH'), - # registry key test (winrm 1.6.0, 1.6.1) - 'dd429dd12596fa193ba4111469b4417ecbd78a1d7ba4317c334c9111644bae44' => cmd.call('reg_schedule'), - 'Fdd429dd12596fa193ba4111469b4417ecbd78a1d7ba4317c334c9111644bae44' => cmd.call('reg_schedule'), + # registry key test using winrm 2.0 + '2376c7b3d81de9382303356e1efdea99385effb84788562c3e697032d51bf942' => cmd.call('reg_schedule'), + '89b48f91634e7efc40105fc082c5e12693b08c0a7c4a578b1f3a07e34f676c66' => cmd.call('reg_schedule'), 'Auditpol /get /subcategory:\'User Account Management\' /r' => cmd.call('auditpol'), '/sbin/auditctl -l' => cmd.call('auditctl'), '/sbin/auditctl -s' => cmd.call('auditctl-s'), @@ -159,7 +162,7 @@ class MockLoader 'pip show jinja2' => cmd.call('pip-show-jinja2'), "Get-Package -Name 'Mozilla Firefox' | ConvertTo-Json" => cmd.call('get-package-firefox'), "Get-Package -Name 'Ruby 2.1.6-p336-x64' | ConvertTo-Json" => cmd.call('get-package-ruby'), - "New-Object -Type PSObject | Add-Member -MemberType NoteProperty -Name Service -Value (Get-Service -Name dhcp| Select-Object -Property Name, DisplayName, Status) -PassThru | Add-Member -MemberType NoteProperty -Name WMI -Value (Get-WmiObject -Class Win32_Service | Where-Object {$_.Name -eq 'dhcp' -or $_.DisplayName -eq 'dhcp'} | Select-Object -Property StartMode) -PassThru | ConvertTo-Json" => cmd.call('get-service-dhcp'), + "New-Object -Type PSObject | Add-Member -MemberType NoteProperty -Name Service -Value (Get-Service -Name 'dhcp'| Select-Object -Property Name, DisplayName, Status) -PassThru | Add-Member -MemberType NoteProperty -Name WMI -Value (Get-WmiObject -Class Win32_Service | Where-Object {$_.Name -eq 'dhcp' -or $_.DisplayName -eq 'dhcp'} | Select-Object -Property StartMode) -PassThru | ConvertTo-Json" => cmd.call('get-service-dhcp'), "Get-WindowsFeature | Where-Object {$_.Name -eq 'dhcp' -or $_.DisplayName -eq 'dhcp'} | Select-Object -Property Name,DisplayName,Description,Installed,InstallState | ConvertTo-Json" => cmd.call('get-windows-feature'), 'lsmod' => cmd.call('lsmod'), '/sbin/sysctl -q -n net.ipv4.conf.all.forwarding' => cmd.call('sbin_sysctl'), @@ -173,7 +176,7 @@ class MockLoader # ports on freebsd 'sockstat -46l' => cmd.call('sockstat'), # packages on windows - "Get-WmiObject -Class Win32_Product | Where-Object {$_.Name -eq 'Microsoft Visual C++ 2008 Redistributable - x64 9.0.30729.6161'} | Select-Object -Property Name,Version,Vendor,PackageCode,Caption,Description | ConvertTo-Json" => cmd.call('win32_product'), + '6785190b3df7291a7622b0b75b0217a9a78bd04690bc978df51ae17ec852a282' => cmd.call('get-item-property-package'), # service status upstart on ubuntu 'initctl status ssh' => cmd.call('initctl-status-ssh'), # service config for upstart on ubuntu @@ -192,7 +195,7 @@ class MockLoader 'service sendmail onestatus' => cmd.call('service-sendmail-onestatus'), # services for system 5 e.g. centos6, debian 6 'service sshd status' => cmd.call('service-sshd-status'), - 'find /etc/rc*.d -name S*' => cmd.call('find-etc-rc-d-name-S'), + 'find /etc/rc*.d /etc/init.d/rc*.d -name S*' => cmd.call('find-etc-rc-d-name-S'), 'ls -1 /etc/init.d/' => cmd.call('ls-1-etc-init.d'), # user information for linux 'id root' => cmd.call('id-root'), @@ -208,10 +211,9 @@ class MockLoader # user info for freebsd 'pw usershow root -7' => cmd.call('pw-usershow-root-7'), # user info for windows (winrm 1.6.0, 1.6.1) - '650b6b72a66316418b25421a54afe21a230704558082914c54711904bb10e370' => cmd.call('GetUserAccount'), - '174686f0441b8dd387b35cf1cbeed3f98441544351de5d8fb7b54f655e75583f' => cmd.call('GetUserAccount'), + '21c8fabaade05b84ec979759a30814f04353722f173424921bddedc7b65cacbf' => cmd.call('adsiusers'), # group info for windows - 'Get-WmiObject Win32_Group | Select-Object -Property Caption, Domain, Name, SID, LocalAccount | ConvertTo-Json' => cmd.call('GetWin32Group'), + 'd8d5b3e3355650399e23857a526ee100b4e49e5c2404a0a5dbb7d85d7f4de5cc' => cmd.call('adsigroups'), # network interface '9e80f048a1af5a0f6ab8a465e46ea5ed5ba6587e9b5e54a7a0c0a1a02bb6f663' => cmd.call('find-net-interface'), 'c33821dece09c8b334e03a5bb9daefdf622007f73af4932605e758506584ec3f' => empty.call, @@ -232,6 +234,8 @@ class MockLoader 'iptables -S' => cmd.call('iptables-s'), # apache_conf 'find /etc/apache2/ports.conf -maxdepth 1 -type f' => cmd.call('find-apache2-ports-conf'), + 'find /etc/httpd/conf.d/*.conf -maxdepth 1 -type f' => cmd.call('find-httpd-ssl-conf'), + 'find /etc/httpd/mods-enabled/*.conf -maxdepth 1 -type f' => cmd.call('find-httpd-status-conf'), 'find /etc/apache2/conf-enabled/*.conf -maxdepth 1 -type f' => cmd.call('find-apache2-conf-enabled'), # mount "mount | grep -- ' on /'" => cmd.call("mount"), @@ -245,7 +249,7 @@ class MockLoader # xinetd configuration 'find /etc/xinetd.d -type f' => cmd.call('find-xinetd.d'), # wmi test - "4762fab9e8180997634ae70aae6d5f59e641084111fb9f5e5bf2848a583aa5f5" => cmd.call('get-wmiobject'), + "2979ebeb80a475107d85411f109209a580ccf569071b3dc7acff030b8635c6b9" => cmd.call('get-wmiobject'), #user info on hpux "logins -x -l root" => cmd.call('logins-x'), #packages on hpux @@ -254,6 +258,10 @@ class MockLoader 'netstat -an -f inet' => cmd.call('hpux-netstat-inet'), #ipv6 ports on hpux 'netstat -an -f inet6' => cmd.call('hpux-netstat-inet6'), + # hostname linux + 'hostname' => cmd.call('hostname'), + # hostname windows + '$env:computername' => cmd.call('$env-computername'), } @backend @@ -289,6 +297,7 @@ class MockLoader def self.load_profile(name, opts = {}) opts[:test_collector] = Inspec::RunnerMock.new + opts[:backend] = Inspec::Backend.create(opts) Inspec::Profile.for_target(profile_path(name), opts) end diff --git a/test/integration/default/apache_conf_spec.rb b/test/integration/default/apache_conf_spec.rb index 5c27e97aa..2b247b31d 100644 --- a/test/integration/default/apache_conf_spec.rb +++ b/test/integration/default/apache_conf_spec.rb @@ -4,8 +4,9 @@ if ENV['DOCKER'] return end -if !os.linux? - STDERR.puts "\033[1;33mTODO: Not running #{__FILE__} because we are not on linux.\033[0m" +supported = %w{ubuntu centos amazon fedora} +unless supported.include?(os[:name]) + STDERR.puts "\033[1;33mTODO: Not running #{__FILE__} because we are not on #{supported.join(', ')}.\033[0m" return end diff --git a/test/integration/default/cmp_matcher_spec.rb b/test/integration/default/cmp_matcher_spec.rb index 9e0a360f9..82a837ed8 100644 --- a/test/integration/default/cmp_matcher_spec.rb +++ b/test/integration/default/cmp_matcher_spec.rb @@ -112,4 +112,14 @@ if os.linux? it { should cmp 'False' } it { should cmp false } end + + describe 0 do + it { should cmp 0 } + it { should cmp 00 } + it { should cmp '0' } + it { should cmp '00' } + it { should_not cmp 1 } + it { should_not cmp '01' } + end + end diff --git a/test/integration/default/etc_group_spec.rb b/test/integration/default/etc_group_spec.rb index 9f8481abb..6072bd1a6 100644 --- a/test/integration/default/etc_group_spec.rb +++ b/test/integration/default/etc_group_spec.rb @@ -8,10 +8,12 @@ end # lets define our own group root_group = 'root' -if os[:family] == 'aix' +if os[:name] == 'aix' root_group = 'system' -elsif os[:family] == 'freebsd' +elsif os[:name] == 'freebsd' root_group = 'wheel' +elsif os[:name] == 'suse' + root_group = 'sfcb' elsif os.solaris? root_group = 'sys' end @@ -23,7 +25,9 @@ if os.unix? its('users') { should include 'root' } end + puts "ROOT GROUP: " + root_group describe etc_group.where(name: root_group) do + its('users') { should_not eq [] } its('users') { should include 'root' } end end diff --git a/test/integration/default/file_spec.rb b/test/integration/default/file_spec.rb index 9974ea5e9..da7695c5d 100644 --- a/test/integration/default/file_spec.rb +++ b/test/integration/default/file_spec.rb @@ -4,7 +4,11 @@ if ENV['DOCKER'] return end -if os[:family] == 'freebsd' +if os[:family] == 'windows' + filedata = { + user: os_env('COMPUTERNAME').content + '\TestUser' + } +elsif os[:name] == 'freebsd' filedata = { user: 'root', group: 'wheel', @@ -12,7 +16,7 @@ if os[:family] == 'freebsd' dir_md5sum: '598f4fe64aefab8f00bcbea4c9239abf', dir_sha256sum: '9b4fb24edd6d1d8830e272398263cdbf026b97392cc35387b991dc0248a628f9', } -elsif os[:family] == 'aix' +elsif os[:name] == 'aix' filedata = { user: 'root', group: 'system', @@ -60,8 +64,8 @@ if os.unix? # it { should have_mode } its('mode') { should eq 00765 } it { should be_mode 00765 } - its('mode') { should cmp 0765 } - its('mode') { should_not cmp 0777 } + its('mode') { should cmp '0765' } + its('mode') { should_not cmp '0777' } its('suid') { should eq false } its('sgid') { should eq false } its('sticky') { should eq false } @@ -111,7 +115,7 @@ if os.unix? its('type') { should eq :file } end - describe file('/tmp/file') do + describe file('/tmp/sfile') do its('suid') { should eq true } its('sgid') { should eq true } its('sticky') { should eq true } @@ -177,14 +181,26 @@ if os.windows? its('path') { should cmp "C:\\Windows" } end - describe file('C:\\Test Directory\\test file.txt') do + describe file('C:/Test Directory/test file.txt') do it { should exist } it { should be_file } + it { should be_readable.by_user('NT AUTHORITY\SYSTEM') } + it { should be_writable.by_user('NT AUTHORITY\SYSTEM') } + it { should be_executable.by_user('NT AUTHORITY\SYSTEM') } + it { should_not be_readable.by_user(filedata[:user]) } + it { should_not be_writable.by_user(filedata[:user]) } + it { should_not be_executable.by_user(filedata[:user]) } end - describe file('C:\\Test Directory') do + describe file('C:/Test Directory') do it { should exist } it { should be_directory } + it { should be_readable.by_user('NT AUTHORITY\SYSTEM') } + it { should be_writable.by_user('NT AUTHORITY\SYSTEM') } + it { should be_executable.by_user('NT AUTHORITY\SYSTEM') } + it { should_not be_readable.by_user(filedata[:user]) } + it { should_not be_writable.by_user(filedata[:user]) } + it { should_not be_executable.by_user(filedata[:user]) } end describe file("C:/Program Files (x86)/Windows NT/Accessories/wordpad.exe") do @@ -192,4 +208,10 @@ if os.windows? # Only works on Windows 2012 R2 its('file_version') { should eq '6.3.9600.17415' } end + + # read the owner of a file + describe directory('C:/opscode/chef') do + its('owner') { should cmp 'NT AUTHORITY\SYSTEM' } + it { should be_owned_by 'NT AUTHORITY\SYSTEM' } + end end diff --git a/test/integration/default/iis_site_spec.rb b/test/integration/default/iis_site_spec.rb index 6f8e23ed0..124ca0e7e 100644 --- a/test/integration/default/iis_site_spec.rb +++ b/test/integration/default/iis_site_spec.rb @@ -2,22 +2,25 @@ return unless os.windows? -# iis service is running -describe service('W3SVC') do +# iis service is running +describe service('W3SVC') do it { should be_installed } it { should be_running } end -# test the site without the iis resource +# test the site without the iis resource describe powershell("Get-Website") do its(:stdout) {should match '.*?Default Web Site.*?'} end -# test the site with the resource +# test the site with the resource describe iis_site('Default Web Site') do it { should exist } it { should be_running } it { should have_app_pool('DefaultAppPool') } + its('app_pool') { should eq 'DefaultAppPool' } it { should have_binding('http *:80:') } - it { should have_path('%SystemDrive%\\inetpub\\wwwroot\\') } + its('bindings') { should include 'http *:80:' } + it { should have_path('%SystemDrive%\\inetpub\\wwwroot') } + its('path') { should eq '%SystemDrive%\\inetpub\\wwwroot' } end diff --git a/test/integration/default/kernel_parameter_spec.rb b/test/integration/default/kernel_parameter_spec.rb index 5ef603755..da529e46b 100644 --- a/test/integration/default/kernel_parameter_spec.rb +++ b/test/integration/default/kernel_parameter_spec.rb @@ -5,7 +5,7 @@ if ENV['DOCKER'] end # prepare values -if ['ubuntu', 'centos', 'fedora', 'opensuse', 'debian'].include?(os[:family]) +if ['ubuntu', 'centos', 'fedora', 'opensuse', 'debian', 'suse'].include?(os[:name]) test_values = { kernel_panic: 0, ip_local_port_range: "32768\t61000", @@ -15,17 +15,18 @@ if ['ubuntu', 'centos', 'fedora', 'opensuse', 'debian'].include?(os[:family]) } # configue parameter derivations for different OS - test_values[:sched_autogroup_enabled] = 0 if ['centos', 'debian'].include?(os[:family]) + test_values[:sched_autogroup_enabled] = 0 if ['centos', 'debian'].include?(os[:name]) - if (os[:family] == 'ubuntu' && os[:release].to_f == 10.04) || - (os[:family] == 'debian' && os[:release].to_i == 6) || - (os[:family] == 'centos' && os[:release].to_i == 5) || - (os[:family] == 'opensuse') + if (os[:name] == 'ubuntu' && os[:release].to_f == 10.04) || + (os[:name] == 'debian' && os[:release].to_i == 6) || + (os[:name] == 'centos' && os[:release].to_i == 5) || + (os[:name] == 'opensuse') || + (os[:name] == 'suse') test_values[:sched_autogroup_enabled] = nil end - test_values[:nf_log] = nil if os[:family] == 'centos' && os[:release].to_i == 5 - test_values[:kernel_panic] = 90 if os[:family] == 'opensuse' + test_values[:nf_log] = nil if os[:name] == 'centos' && os[:release].to_i == 5 + test_values[:kernel_panic] = 90 if os[:name] == 'opensuse' else test_values = {} diff --git a/test/integration/default/package_spec.rb b/test/integration/default/package_spec.rb index e32e0a781..3886cf5e0 100644 --- a/test/integration/default/package_spec.rb +++ b/test/integration/default/package_spec.rb @@ -28,3 +28,31 @@ end describe package('nginx') do it { should_not be_installed } end + +# the following test will iterate over all packages retrieved via WMI and verifies that the +# optimized package implementation is returning the same results +if os.windows? + # compare optimized version with wmi results + packages = powershell("Get-WmiObject -Class Win32_Product | % { $_.Name }").stdout.strip.split("\n") + + packages.each { |pkg| + package_name = pkg.strip + # get wmi package information + cmd = powershell("Get-WmiObject -Class Win32_Product | Where-Object {$_.Name -eq '#{package_name}'} | Select-Object -Property Name,Version,Vendor,PackageCode,Caption,Description | ConvertTo-Json") + wmi_package = JSON.parse(cmd.stdout) + wmi_info = { + name: wmi_package['Name'], + installed: true, + version: wmi_package['Version'], + type: 'windows', + } + + # get registry package information + info = package(package_name).info + + # compare results + describe wmi_info do + it { should eq info} + end + } +end diff --git a/test/integration/default/registry_key_spec.rb b/test/integration/default/registry_key_spec.rb index 4d6902975..14b3e2e80 100644 --- a/test/integration/default/registry_key_spec.rb +++ b/test/integration/default/registry_key_spec.rb @@ -21,6 +21,10 @@ describe registry_key('HKLM\System\Test') do it { should have_property_value('Binary value', :binary, 'dfa0f066') } end +describe registry_key('HKLM\Missing\In\Action') do + it { should_not exist } +end + # serverspec compatability describe windows_registry_key('HKLM\System\Test') do it { should exist } diff --git a/test/integration/default/service_spec.rb b/test/integration/default/service_spec.rb index c182af615..9a5b9f0a6 100644 --- a/test/integration/default/service_spec.rb +++ b/test/integration/default/service_spec.rb @@ -5,7 +5,7 @@ if ENV['DOCKER'] end # based on operating system we select the available service -if ['centos', 'fedora', 'freebsd', 'opensuse'].include?(os[:family]) +if ['centos', 'fedora', 'freebsd', 'opensuse', 'suse'].include?(os[:family]) # CentOS, Fedora unavailable_service = 'ssh' available_service = 'sshd' diff --git a/test/integration/default/user_spec.rb b/test/integration/default/user_spec.rb index 168822f96..8fed43c2d 100644 --- a/test/integration/default/user_spec.rb +++ b/test/integration/default/user_spec.rb @@ -1,12 +1,11 @@ # encoding: utf-8 - -if ['centos', 'redhat', 'fedora', 'opensuse', 'debian', 'ubuntu'].include?(os[:family]) +if ['centos', 'redhat', 'fedora', 'suse', 'debian', 'ubuntu'].include?(os[:family]) userinfo = { - name: 'root', - group: 'root', + username: 'root', + groupname: 'root', uid: 0, gid: 0, - groups: ["root"], + groups: "root", home: '/root', shell: '/bin/bash', } @@ -16,8 +15,8 @@ if ['centos', 'redhat', 'fedora', 'opensuse', 'debian', 'ubuntu'].include?(os[:f if os[:release].to_i == 5 elsif ['freebsd'].include?(os[:family]) userinfo = { - name: 'root', - group: 'wheel', + username: 'root', + groupname: 'wheel', uid: 0, gid: 0, groups: "wheel", # at least this group should be there @@ -25,19 +24,22 @@ elsif ['freebsd'].include?(os[:family]) shell: '/bin/csh', } elsif os.windows? + hostname = powershell('$env:computername').stdout.chomp userinfo = { - name: 'Administrator', - group: nil, + username: hostname + '\Administrator', + groupname: nil, uid: nil, gid: nil, groups: nil, home: nil, shell: nil, } + # store uid of user + userinfo[:uid] = user(userinfo[:username]).uid elsif os[:family] == 'aix' userinfo = { - name: 'bin', - group: 'bin', + username: 'bin', + groupname: 'bin', uid: 2, gid: 2, groups: "adm", # at least this group should be there @@ -50,8 +52,8 @@ elsif os[:family] == 'aix' elsif os.solaris? if os[:release].to_i > 10 userinfo = { - name: 'root', - group: 'root', + username: 'root', + groupname: 'root', uid: 0, gid: 0, groups: "sys", # at least this group should be there @@ -60,8 +62,8 @@ elsif os.solaris? } else userinfo = { - name: 'root', - group: 'root', + username: 'root', + groupname: 'root', uid: 0, gid: 0, groups: "sys", # at least this group should be there @@ -69,23 +71,41 @@ elsif os.solaris? shell: '/sbin/sh', } end +elsif os.darwin? + userinfo = { + username: 'root', + groupname: 'wheel', + uid: 0, + gid: 0, + groups: "wheel", # at least this group should be there + home: '/var/root', + shell: '/bin/sh', + } else userinfo = {} end if os.windows? - describe user(userinfo[:name]) do + # test single `user` resource + describe user(userinfo[:username]) do it { should exist } + # should return the SID of the user + its('uid') { should_not eq nil} + end + + # also support simple username for local users without domain + describe user('Administrator') do + it { should exist } + # should return the SID of the user + its('uid') { should_not eq nil} end else - describe user(userinfo[:name]) do + # test single `user` resource + describe user(userinfo[:username]) do it { should exist } userinfo.each do |k, v| - next if k.to_sym == :name - # check that the user is part of the groups if k.to_s == 'groups' - # TODO: do not run those tests on docker yet its(k) { should include v } unless ENV['DOCKER'] # default eq comparison else @@ -93,4 +113,32 @@ else end end end + + describe users.where(username: userinfo[:username]).groups.entries[0] do + it { should include userinfo[:groups] } + end +end + +# test `users` resource +describe users.where(username: userinfo[:username]) do + userinfo.each do |k, v| + name = k.to_s + if name == 'groups' + # its(name) { should include v } + else + name += 's' unless %w{ maxdays mindays warndays }.include? name + expected_value = [v] + its(name) { should eq expected_value} + end + end +end + +# catch case where user is not existant +describe user('not_available') do + it { should_not exist } + its ('uid') { should eq nil} + its ('username') { should eq nil} + its ('gid') { should eq nil} + its ('home') { should eq nil} + its ('shell') { should eq nil} end diff --git a/test/integration/default/vbscript_spec.rb b/test/integration/default/vbscript_spec.rb index 37f661155..34037d9a5 100644 --- a/test/integration/default/vbscript_spec.rb +++ b/test/integration/default/vbscript_spec.rb @@ -2,18 +2,23 @@ return unless os.windows? -# script that may have multiple lines -vbscript = <<-EOH - WScript.Echo "hello" -EOH - -describe vbscript(vbscript) do +describe vbscript("WScript.Echo \"hello\"") do its('stdout') { should eq "hello\r\n" } end -# remove whitespace \r\n from stdout +# script that may have multiple lines +vbscript = <<-EOH + WScript.Echo "hello" + Wscript.Stdout.Write "end" +EOH + describe vbscript(vbscript) do - its('strip') { should eq "hello" } + its('stdout') { should eq "hello\r\nend" } +end + +# remove whitespace from stdout +describe vbscript("WScript.Echo \"hello\"") do + its('strip') { should eq 'hello' } end # ensure that we do not require a newline diff --git a/test/resource/file_test.rb b/test/resource/file_test.rb index 7ba348ba9..92897744d 100644 --- a/test/resource/file_test.rb +++ b/test/resource/file_test.rb @@ -68,6 +68,8 @@ end describe file('/dev') do its('mode') { should eq 00755 } + its('mode') { should cmp '00755' } + its('mode') { should_not cmp '00777' } end describe file('/dev') do diff --git a/test/unit/dependencies/lockfile_test.rb b/test/unit/dependencies/lockfile_test.rb new file mode 100644 index 000000000..3d70713de --- /dev/null +++ b/test/unit/dependencies/lockfile_test.rb @@ -0,0 +1,72 @@ +require 'helper' + +describe Inspec::Lockfile do + # Ruby 1.9: .to_yaml format is slightly different + if Gem::Version.new(RUBY_VERSION) < Gem::Version.new("2.0") + let(:lockfile_content) { + <= 0' + dependencies: + - name: bar + resolved_source: + url: http://bar + version_constraints: ! '>= 0' +EOF + } + else + let(:lockfile_content) { + <= 0" + dependencies: + - name: bar + resolved_source: + url: http://bar + version_constraints: ">= 0" +EOF + } + end + + let(:lockfile_hash) { + { 'lockfile_version' => 1, + 'depends' => [ + { 'name' => "foo", 'resolved_source' => {'url' => "http://foo"}, 'version_constraints' => ">= 0", + 'dependencies' => [{ 'name' => 'bar', 'resolved_source' => {'url' => 'http://bar' }, 'version_constraints' => ">= 0"}] + }]} + } + + let(:lockfile_hash_with_symbols) { + { 'lockfile_version' => 1, + 'depends' => [ + { name: "foo", resolved_source: {url: "http://foo"}, version_constraints: ">= 0", + dependencies: [{ name: 'bar', resolved_source: {url: 'http://bar' }, version_constraints: ">= 0"}] + }]} + } + + it "can generate a yaml representation of the lockfile" do + l = Inspec::Lockfile.new(lockfile_hash) + l.to_yaml.force_encoding("UTF-8").must_equal lockfile_content + end + + it "can generates a yaml representation of the lockfile even when the depends keys are symbols" do + l = Inspec::Lockfile.new(lockfile_hash_with_symbols) + l.to_yaml.force_encoding("UTF-8").must_equal lockfile_content + end + + it "uses symbol keys for the deps by default" do + File.stubs(:read).with("testfile").returns(lockfile_content) + l = Inspec::Lockfile.from_file("testfile") + l.deps.must_equal lockfile_hash_with_symbols['depends'] + end +end diff --git a/test/unit/dependencies/resolver_test.rb b/test/unit/dependencies/resolver_test.rb new file mode 100644 index 000000000..4bb8a7455 --- /dev/null +++ b/test/unit/dependencies/resolver_test.rb @@ -0,0 +1,54 @@ +require 'helper' +require 'inspec/errors' +require 'inspec/dependencies/resolver' + +class FakeDep + attr_reader :name + def initialize(name) + @name = name + end + + def resolved_source + { path: name } + end + + def source_satisfies_spec? + true + end +end + +describe Inspec::Resolver do + let(:subject) { Inspec::Resolver.new } + + describe "#resolve" do + it "returns a Hash" do + subject.resolve([]).must_equal({}) + end + + it "errors if a dependency is listed twice at the same level" do + dep = FakeDep.new("fake_dep_0") + lambda { subject.resolve([dep, dep]) }.must_raise Inspec::DuplicateDep + end + + it "fails if there is a simple cycle " do + dep0 = FakeDep.new("fake_dep_0") + dep1 = FakeDep.new("fake_dep_1") + dep2 = FakeDep.new("fake_dep_2") + + dep0.stubs(:dependencies).returns([dep1]) + + dep1.stubs(:dependencies).returns([dep2]) + dep2.stubs(:dependencies).returns([dep1]) + lambda { subject.resolve([dep0]) }.must_raise Inspec::CyclicDependencyError + end + + + it "errors if the source version doesn't match the requirement" do + dep = FakeDep.new("fake_dep_0") + dep.expects(:source_satisfies_spec?).returns(false) + dep.expects(:source_version).returns("1.0.0") + dep.expects(:required_version).returns(">= 1.0.1") + lambda { subject.resolve([dep]) }.must_raise Inspec::UnsatisfiedVersionSpecification + end + end +end diff --git a/test/unit/dsl/control_test.rb b/test/unit/dsl/control_test.rb index 7556f77e5..9c09fc721 100644 --- a/test/unit/dsl/control_test.rb +++ b/test/unit/dsl/control_test.rb @@ -10,7 +10,7 @@ describe 'controls' do 'inspec.yml' => "name: mock", 'controls/mock.rb' => "control '1' do\n#{content}\nend\n", } - opts = { test_collector: Inspec::RunnerMock.new } + opts = { test_collector: Inspec::RunnerMock.new, backend: Inspec::Backend.create({ backend: 'mock' }) } Inspec::Profile.for_target(data, opts) .params[:controls]['1'] end diff --git a/test/unit/fetchers/fetchers_test.rb b/test/unit/fetchers/fetchers_test.rb index 163ac3883..b477f9b68 100644 --- a/test/unit/fetchers/fetchers_test.rb +++ b/test/unit/fetchers/fetchers_test.rb @@ -3,63 +3,47 @@ # author: Christoph Hartmann require 'helper' +require 'bundles/inspec-supermarket/target' +require 'bundles/inspec-supermarket/api' describe Inspec::Fetcher do it 'loads the local fetcher for this file' do res = Inspec::Fetcher.resolve(__FILE__) res.must_be_kind_of Fetchers::Local end -end -describe Inspec::Plugins::RelFetcher do - def fetcher - src_fetcher.expects(:files).returns(in_files).at_least_once - Inspec::Plugins::RelFetcher.new(src_fetcher) - end + describe "without a source specified" do + let(:mock_open) { + m = Minitest::Mock.new + m.expect :meta, {'content-type' => 'application/gzip'} + m.expect :read, "fake content" + m + } - let(:src_fetcher) { mock() } + before do + Supermarket::API.expects(:exist?).returns(true) + Supermarket::API.expects(:find).returns({'tool_source_url' => "http://mock-url" }) + end - IN_AND_OUT = { - [] => [], - %w{file} => %w{file}, - # don't prefix just by filename - %w{file file_a} => %w{file file_a}, - %w{path/file path/file_a} => %w{file file_a}, - %w{path/to/file} => %w{file}, - %w{/path/to/file} => %w{file}, - %w{alice bob} => %w{alice bob}, - # mixed paths - %w{x/a y/b} => %w{x/a y/b}, - %w{/x/a /y/b} => %w{x/a y/b}, - %w{z/x/a z/y/b} => %w{x/a y/b}, - %w{/z/x/a /z/y/b} => %w{x/a y/b}, - # mixed with relative path - %w{a path/to/b} => %w{a path/to/b}, - %w{path/to/b a} => %w{path/to/b a}, - %w{path/to/b path/a} => %w{to/b a}, - %w{path/to/b path/a c} => %w{path/to/b path/a c}, - # mixed with absolute paths - %w{/path/to/b /a} => %w{path/to/b a}, - %w{/path/to/b /path/a} => %w{to/b a}, - %w{/path/to/b /path/a /c} => %w{path/to/b path/a c}, - # mixing absolute and relative paths - %w{path/a /path/b} => %w{path/a /path/b}, - %w{/path/a path/b} => %w{/path/a path/b}, - # extract folder structure buildup - %w{/a /a/b /a/b/c} => %w{c}, - %w{/a /a/b /a/b/c/d/e} => %w{e}, - # ignore pax_global_header, which are commonly seen in github tars and are not - # ignored by all tar streaming tools, its not extracted by GNU tar since 1.14 - %w{/pax_global_header /a/b} => %w{b}, - %w{pax_global_header a/b} => %w{b}, - }.each do |ins, outs| - describe 'empty profile' do - let(:in_files) { ins } + it "defaults to supermarket if only a name is given" do + res = Inspec::Fetcher.resolve({:name => "mock/test-profile"}) + res.expects(:open).returns(mock_open) + res.must_be_kind_of Fetchers::Url + res.resolved_source[:url].must_equal("http://mock-url") + end - it 'also has no files' do - fetcher.files.must_equal outs - end + it "ignores keys that might have come along for the ride" do + res = Inspec::Fetcher.resolve({:name => "mock/test-profile", cwd: "/tmp/inspec-test", cache: "ancache", backend: "test-backend"}) + res.must_be_kind_of Fetchers::Url end end + it 'is able to handle Windows paths' do + # simulate a local windows path + file = __FILE__ + file.tr!('/', '\\') + res = Inspec::Fetcher.resolve(file) + res.must_be_kind_of Fetchers::Local + res.target.must_equal __FILE__ + end end diff --git a/test/unit/fetchers/git_test.rb b/test/unit/fetchers/git_test.rb new file mode 100644 index 000000000..c180d1333 --- /dev/null +++ b/test/unit/fetchers/git_test.rb @@ -0,0 +1,125 @@ +# encoding: utf-8 +# author: Dominik Richter +# author: Christoph Hartmann +require 'helper' + +describe Fetchers::Git do + let(:fetcher) { Fetchers::Git } + + it 'registers with the fetchers registry' do + reg = Inspec::Fetcher.registry + _(reg['git']).must_equal fetcher + end + + it "handles sources specified by a :git key" do + f = fetcher.resolve({git: "https://example.com/foo.gi"}) + f.wont_be_nil + f.must_be_kind_of Fetchers::Git + end + + describe "when given a valid repository" do + let(:git_dep_dir) { "test-directory" } + let(:git_master_ref) { "bf4d5774f02d24155bfc34b5897d22785a304cfa" } + let(:git_branch_ref) { "b979579e5fc8edb72511fe5d2a1230dede71eff7" } + let(:git_tag_ref) { "efc85d89ee9d5798ca93ee95db0c711b99061590" } + let(:git_output) { + out = mock() + out.stubs(:stdout).returns("") + out.stubs(:exitstatus).returns(0) + out.stubs(:stderr).returns("") + out.stubs(:status).returns(true) + out.stubs(:error!).returns(false) + out.stubs(:run_command).returns(true) + out + } + + let(:git_ls_remote_output) { + out = mock() + out.stubs(:stdout).returns("9abea97db10a428709353fd582b969d0e17cb923\tHEAD +bf4d5774f02d24155bfc34b5897d22785a304cfa\trefs/heads/master +b979579e5fc8edb72511fe5d2a1230dede71eff7\trefs/heads/somebranch +d9d5a6fe85c3df709bb1c878c2de8f2cb5893ced\trefs/tags/boringtag +ad280246a1a2b3d1b1179e1a8d9e1a044e7ee94f\trefs/tags/antag +efc85d89ee9d5798ca93ee95db0c711b99061590\trefs/tags/antag^{} +be002c56b0806ea40aabf7a2b742c41182336198\trefs/tags/anothertag +a7729ce65636d6d8b80159dd5dd7a40fdb6f2501\trefs/tags/anothertag^{}\n") + out.stubs(:exitstatus).returns(0) + out.stubs(:stderr).returns("") + out.stubs(:error!).returns(false) + out.stubs(:run_command).returns(true) + out + } + + before do + # git fetcher likes to make directories, let's stub that for every test + Dir.stubs(:mktmpdir).yields("test-tmp-dir") + File.stubs(:directory?).with("fetchpath/.git").returns(false) + FileUtils.stubs(:mkdir_p) + end + + def expect_ls_remote(ref) + Mixlib::ShellOut.expects(:new).with("git ls-remote \"#{git_dep_dir}\" \"#{ref}*\"", {}).returns(git_ls_remote_output) + end + + def expect_checkout(ref, at='test-tmp-dir') + Mixlib::ShellOut.expects(:new).with("git checkout #{ref}", {cwd: at}).returns(git_output) + end + + def expect_clone + Mixlib::ShellOut.expects(:new).with("git clone #{git_dep_dir} ./", {cwd: 'test-tmp-dir'}).returns(git_output) + end + + def expect_mv_into_place + FileUtils.expects(:cp_r).with('test-tmp-dir', 'fetchpath') + end + + it "resolves to the revision of master by default" do + expect_ls_remote('master') + result = fetcher.resolve({git: git_dep_dir}) + result.resolved_source.must_equal({git: git_dep_dir, ref: git_master_ref }) + end + + it "can resolve a tag" do + expect_ls_remote('antag') + result = fetcher.resolve({git: git_dep_dir, tag: 'antag'}) + result.resolved_source.must_equal({git: git_dep_dir, ref: git_tag_ref }) + end + + it "can resolve a branch" do + expect_ls_remote('somebranch') + result = fetcher.resolve({git: git_dep_dir, branch: 'somebranch'}) + result.resolved_source.must_equal({git: git_dep_dir, ref: git_branch_ref }) + end + + it "assumes the ref you gave it is the thing you want" do + result = fetcher.resolve({git: git_dep_dir, ref: 'a_test_ref'}) + result.resolved_source.must_equal({git: git_dep_dir, ref: 'a_test_ref' }) + end + + it "fetches to the given location" do + expect_ls_remote('master') + expect_clone() + expect_checkout(git_master_ref) + expect_mv_into_place() + result = fetcher.resolve({git: git_dep_dir}) + result.fetch("fetchpath") + end + + it "doesn't refetch an already cloned repo" do + File.expects(:directory?).with("fetchpath/.git").at_least_once.returns(true) + expect_ls_remote('master') + expect_checkout(git_master_ref, 'fetchpath') + result = fetcher.resolve({git: git_dep_dir}) + result.fetch("fetchpath") + end + + it "returns the repo_path that we fetched to as the archive_path" do + File.expects(:directory?).with("fetchpath/.git").at_least_once.returns(true) + expect_ls_remote('master') + expect_checkout(git_master_ref, 'fetchpath') + result = fetcher.resolve({git: git_dep_dir}) + result.fetch("fetchpath") + result.archive_path.must_equal 'fetchpath' + end + end +end diff --git a/test/unit/fetchers/local_test.rb b/test/unit/fetchers/local_test.rb index 0fdb9ca7e..f049fc55b 100644 --- a/test/unit/fetchers/local_test.rb +++ b/test/unit/fetchers/local_test.rb @@ -18,24 +18,6 @@ describe Fetchers::Local do it 'must be resolved' do _(res).must_be_kind_of fetcher end - - it 'must only contain this file' do - _(res.files).must_equal [__FILE__] - end - - it 'must not read if the file doesnt exist' do - _(res.read('file-does-not-exist')).must_be_nil - end - - it 'must not read files not covered' do - not_covered = File.expand_path('../tar_test.rb', __FILE__) - _(File.file?(not_covered)).must_equal true - _(res.read(not_covered)).must_be_nil - end - - it 'must read the contents of the file' do - _(res.read(__FILE__)).must_equal File.read(__FILE__) - end end describe 'applied to this folder' do @@ -45,23 +27,5 @@ describe Fetchers::Local do it 'must be resolved' do _(res).must_be_kind_of fetcher end - - it 'must contain all files' do - _(res.files).must_include __FILE__ - end - - it 'must not read if the file doesnt exist' do - _(res.read('file-not-in-folder')).must_be_nil - end - - it 'must not read files not covered' do - not_covered = File.expand_path('../../../helper.rb', __FILE__) - _(File.file?(not_covered)).must_equal true - _(res.read(not_covered)).must_be_nil - end - - it 'must read the contents of the file' do - _(res.read(__FILE__)).must_equal File.read(__FILE__) - end end end diff --git a/test/unit/fetchers/mock_test.rb b/test/unit/fetchers/mock_test.rb index 199e579de..f2c3fb26f 100644 --- a/test/unit/fetchers/mock_test.rb +++ b/test/unit/fetchers/mock_test.rb @@ -24,20 +24,5 @@ describe Fetchers::Mock do it 'must be resolved' do fetcher.resolve({}).must_be_kind_of fetcher end - - it 'has no files on empty' do - fetcher.resolve({}).files.must_equal [] - end - - it 'has files' do - f = rand.to_s - fetcher.resolve({f => nil}).files.must_equal [f] - end - - it 'can read a file' do - f = rand.to_s - s = rand.to_s - fetcher.resolve({f => s}).read(f).must_equal s - end end end diff --git a/test/unit/fetchers/tar_test.rb b/test/unit/fetchers/tar_test.rb deleted file mode 100644 index e130899b9..000000000 --- a/test/unit/fetchers/tar_test.rb +++ /dev/null @@ -1,36 +0,0 @@ -# encoding: utf-8 -# author: Dominik Richter -# author: Christoph Hartmann - -require 'helper' - -describe Fetchers::Tar do - let(:fetcher) { Fetchers::Tar } - - it 'registers with the fetchers registry' do - reg = Inspec::Fetcher.registry - _(reg['tar']).must_equal fetcher - end - - describe 'applied to a tar archive' do - let(:target) { MockLoader.profile_tgz('complete-profile') } - let(:res) { fetcher.resolve(target) } - - it 'must be resolved' do - _(res).must_be_kind_of fetcher - end - - it 'must contain all files' do - _(res.files.sort).must_equal %w{inspec.yml libraries libraries/testlib.rb - controls controls/filesystem_spec.rb}.sort - end - - it 'must not read if the file isnt included' do - _(res.read('file-not-in-archive')).must_be_nil - end - - it 'must read the contents of the file' do - _(res.read('inspec.yml')).must_match /^name: complete$/ - end - end -end diff --git a/test/unit/fetchers/url_test.rb b/test/unit/fetchers/url_test.rb index 9a5b9467c..ab666cdf2 100644 --- a/test/unit/fetchers/url_test.rb +++ b/test/unit/fetchers/url_test.rb @@ -1,7 +1,6 @@ # encoding: utf-8 # author: Dominik Richter # author: Christoph Hartmann - require 'helper' describe Fetchers::Url do @@ -13,7 +12,7 @@ describe Fetchers::Url do end describe 'testing different urls' do - let(:mock_file) { MockLoader.profile_path('complete-metadata') } + let(:fetcher) { Class.new(Fetchers::Url) do attr_reader :target, :archive @@ -24,20 +23,31 @@ describe Fetchers::Url do end } + # We don't use the MockLoader here becuase it produces tarballs + # with different sha's on each run + let(:expected_shasum) { "98b1ae45059b004178a8eee0c1f6179dcea139c0fd8a69ee47a6f02d97af1f17" } + let(:mock_open) { + m = Minitest::Mock.new + m.expect :meta, {'content-type' => 'application/gzip'} + m.expect :read, "fake content" + m + } + it 'handles a http url' do url = 'http://chef.io/some.tar.gz' res = fetcher.resolve(url) - _(res).must_be_kind_of Fetchers::Local - _(res.parent).must_be_kind_of Fetchers::Url - _(res.parent.target).must_equal 'http://chef.io/some.tar.gz' + res.expects(:open).returns(mock_open) + _(res).must_be_kind_of Fetchers::Url + _(res.resolved_source).must_equal({url: 'http://chef.io/some.tar.gz', sha256: expected_shasum}) end it 'handles a https url' do url = 'https://chef.io/some.tar.gz' res = fetcher.resolve(url) - _(res).must_be_kind_of Fetchers::Local - _(res.parent).must_be_kind_of Fetchers::Url - _(res.parent.target).must_equal 'https://chef.io/some.tar.gz' + res.expects(:open).returns(mock_open) + _(res).must_be_kind_of Fetchers::Url + _(res.resolved_source).must_equal({url: 'https://chef.io/some.tar.gz', sha256: expected_shasum}) + end it 'doesnt handle other schemas' do @@ -56,97 +66,54 @@ describe Fetchers::Url do http://www.github.com/chef/inspec.git}.each do |github| it "resolves a github url #{github}" do res = fetcher.resolve(github) + res.expects(:open).returns(mock_open) _(res).wont_be_nil - _(res.parent.target).must_equal 'https://github.com/chef/inspec/archive/master.tar.gz' + _(res.resolved_source).must_equal({url: 'https://github.com/chef/inspec/archive/master.tar.gz', sha256: expected_shasum}) end end it "resolves a github branch url" do github = 'https://github.com/hardening-io/tests-os-hardening/tree/2.0' res = fetcher.resolve(github) + res.expects(:open).returns(mock_open) _(res).wont_be_nil - _(res.parent.target).must_equal 'https://github.com/hardening-io/tests-os-hardening/archive/2.0.tar.gz' + _(res.resolved_source).must_equal({url: 'https://github.com/hardening-io/tests-os-hardening/archive/2.0.tar.gz', sha256: expected_shasum}) end it "resolves a github commit url" do github = 'https://github.com/hardening-io/tests-os-hardening/tree/48bd4388ddffde68badd83aefa654e7af3231876' res = fetcher.resolve(github) + res.expects(:open).returns(mock_open) _(res).wont_be_nil - _(res.parent.target).must_equal 'https://github.com/hardening-io/tests-os-hardening/archive/48bd4388ddffde68badd83aefa654e7af3231876.tar.gz' + _(res.resolved_source).must_equal({url: 'https://github.com/hardening-io/tests-os-hardening/archive/48bd4388ddffde68badd83aefa654e7af3231876.tar.gz', + sha256: expected_shasum}) end end describe 'applied to a valid url (mocked tar.gz)' do let(:mock_file) { MockLoader.profile_tgz('complete-profile') } let(:target) { 'http://myurl/file.tar.gz' } - let(:res) { - mock_open = Minitest::Mock.new - mock_open.expect :meta, {'content-type' => 'application/gzip'} - mock_open.expect :read, File.open(mock_file, 'rb').read - fetcher.expects(:open).returns(mock_open) - fetcher.resolve(target) + let(:subject) { fetcher.resolve(target) } + let(:mock_open) { + m = Minitest::Mock.new + m.expect :meta, {'content-type' => 'application/gzip'} + m.expect :read, File.open(mock_file, 'rb').read + m } - it 'must be resolved to the final format' do - _(res).must_be_kind_of Fetchers::Tar - end - - it 'must be resolved to the final format' do - _(res.parent).must_be_kind_of fetcher - end - - it 'must contain all files' do - _(res.files.sort).must_equal %w{inspec.yml libraries libraries/testlib.rb - controls controls/filesystem_spec.rb}.sort - end - - it 'must not read if the file isnt included' do - _(res.read('file-not-in-archive')).must_be_nil - end - - it 'must read the contents of the file' do - _(res.read('inspec.yml')).must_match /^name: complete$/ - end - end - - describe 'applied to a valid url (mocked zip)' do - let(:mock_file) { MockLoader.profile_zip('complete-profile') } - let(:target) { 'http://myurl/file.tar.gz' } - let(:res) { - mock_open = Minitest::Mock.new - mock_open.expect :meta, {'content-type' => 'application/zip'} - mock_open.expect :read, File.open(mock_file, 'rb').read - fetcher.expects(:open).returns(mock_open) - fetcher.resolve(target) + let(:mock_dest) { + f = Tempfile.new("url-fetch-test") + f.path } - it 'must be resolved to the final format' do - _(res).must_be_kind_of Fetchers::Zip + it 'tries to fetch the file' do + subject.expects(:open).returns(mock_open) + subject.fetch(mock_dest) end - it 'must contain all files' do - _(res.files.sort).must_equal %w{inspec.yml libraries libraries/testlib.rb - controls controls/filesystem_spec.rb}.sort - end - - it 'must not read if the file isnt included' do - _(res.read('file-not-in-archive')).must_be_nil - end - - it 'must read the contents of the file' do - _(res.read('inspec.yml')).must_match /^name: complete$/ - end - end - - describe 'applied to a valid url with wrong content-type' do - let(:mock_file) { MockLoader.profile_zip('complete-profile') } - let(:target) { 'http://myurl/file.tar.gz' } - - it 'must be resolved to the final format' do - mock_open = Minitest::Mock.new - mock_open.expect :meta, {'content-type' => 'wrong'} - fetcher.expects(:open).returns(mock_open) - proc { fetcher.resolve(target) }.must_throw RuntimeError + it "returns the resolved_source hash" do + subject.expects(:open).returns(mock_open) + subject.resolved_source[:url].must_equal(target) end end end diff --git a/test/unit/fetchers/zip_test.rb b/test/unit/fetchers/zip_test.rb deleted file mode 100644 index d63ec4a00..000000000 --- a/test/unit/fetchers/zip_test.rb +++ /dev/null @@ -1,36 +0,0 @@ -# encoding: utf-8 -# author: Dominik Richter -# author: Christoph Hartmann - -require 'helper' - -describe Fetchers::Zip do - let(:fetcher) { Fetchers::Zip } - - it 'registers with the fetchers registry' do - reg = Inspec::Fetcher.registry - _(reg['zip']).must_equal fetcher - end - - describe 'applied to a zipped archive' do - let(:target) { MockLoader.profile_zip('complete-profile') } - let(:res) { fetcher.resolve(target) } - - it 'must be resolved' do - _(res).must_be_kind_of fetcher - end - - it 'must contain all files' do - _(res.files.sort).must_equal %w{inspec.yml libraries libraries/testlib.rb - controls controls/filesystem_spec.rb}.sort - end - - it 'must not read if the file isnt included' do - _(res.read('file-not-in-archive')).must_be_nil - end - - it 'must read the contents of the file' do - _(res.read('inspec.yml')).must_match /^name: complete$/ - end - end -end diff --git a/test/unit/file_provider_test.rb b/test/unit/file_provider_test.rb new file mode 100644 index 000000000..ac4c80a35 --- /dev/null +++ b/test/unit/file_provider_test.rb @@ -0,0 +1,205 @@ +# encoding: utf-8 +# author: Dominik Richter +# author: Christoph Hartmann + +require 'helper' + +describe Inspec::MockProvider do + let(:subject) { Inspec::MockProvider.new(target) } + + describe 'without data' do + let(:target) {{ mock: {}}} + it 'has no files on empty' do + subject.files.must_equal [] + end + end + + describe 'with_data' do + let(:file_name) { rand.to_s } + let(:file_content) { rand.to_s } + let(:target) {{ mock: { file_name => file_content } }} + + it 'has files' do + subject.files.must_equal [file_name] + end + + it 'can read a file' do + subject.read(file_name).must_equal file_content + end + end +end + +describe Inspec::DirProvider do + let(:subject) { Inspec::DirProvider.new(target) } + + describe 'applied to this file' do + let(:target) { __FILE__ } + + it 'must only contain this file' do + subject.files.must_equal [__FILE__] + end + + it 'must not read if the file doesnt exist' do + subject.read('file-does-not-exist').must_be_nil + end + + it 'must not read files not covered' do + not_covered = File.expand_path('../../helper.rb', __FILE__) + puts "#{not_covered}" + File.file?(not_covered).must_equal true + subject.read(not_covered).must_be_nil + end + + it 'must read the contents of the file' do + subject.read(__FILE__).must_equal File.read(__FILE__) + end + end + + describe 'applied to this folder' do + let(:target) { File.dirname(__FILE__) } + + it 'must contain all files' do + subject.files.must_include __FILE__ + end + + it 'must not read if the file doesnt exist' do + subject.read('file-not-in-folder').must_be_nil + end + + it 'must not read files not covered' do + not_covered = File.expand_path('../../helper.rb', __FILE__) + File.file?(not_covered).must_equal true + subject.read(not_covered).must_be_nil + end + + it 'must read the contents of the file' do + subject.read(__FILE__).must_equal File.read(__FILE__) + end + end +end + +describe Inspec::ZipProvider do + let(:subject) { Inspec::ZipProvider.new(target) } + + describe 'applied to a tar archive' do + let(:target) { MockLoader.profile_zip('complete-profile') } + + it 'must contain all files' do + subject.files.sort.must_equal %w{inspec.yml libraries libraries/testlib.rb + controls controls/filesystem_spec.rb}.sort + end + + it 'must not read if the file isnt included' do + subject.read('file-not-in-archive').must_be_nil + end + + it 'must read the contents of the file' do + subject.read('inspec.yml').must_match(/^name: complete$/) + end + end +end + + +describe Inspec::ZipProvider do + let(:subject) { Inspec::ZipProvider.new(target) } + + describe 'applied to a tar archive' do + let(:target) { MockLoader.profile_zip('complete-profile') } + + it 'must contain all files' do + subject.files.sort.must_equal %w{inspec.yml libraries libraries/testlib.rb + controls controls/filesystem_spec.rb}.sort + end + + it 'must not read if the file isnt included' do + subject.read('file-not-in-archive').must_be_nil + end + + it 'must read the contents of the file' do + subject.read('inspec.yml').must_match(/^name: complete$/) + end + end +end + +describe Inspec::TarProvider do + let(:subject) { Inspec::TarProvider.new(target) } + + describe 'applied to a tar archive' do + let(:target) { MockLoader.profile_tgz('complete-profile') } + + it 'must contain all files' do + subject.files.sort.must_equal %w{inspec.yml libraries libraries/testlib.rb + controls controls/filesystem_spec.rb}.sort + end + + it 'must not read if the file isnt included' do + subject.read('file-not-in-archive').must_be_nil + end + + it 'must read the contents of the file' do + subject.read('inspec.yml').must_match(/^name: complete$/) + end + end +end + +describe Inspec::RelativeFileProvider do + def fetcher + src_fetcher.expects(:files).returns(in_files).at_least_once + Inspec::RelativeFileProvider.new(src_fetcher) + end + + let(:src_fetcher) { mock() } + + IN_AND_OUT = { + [] => [], + %w{file} => %w{file}, + # don't prefix just by filename + %w{file file_a} => %w{file file_a}, + %w{path/file path/file_a} => %w{file file_a}, + %w{path/to/file} => %w{file}, + %w{/path/to/file} => %w{file}, + %w{alice bob} => %w{alice bob}, + # mixed paths + %w{x/a y/b} => %w{x/a y/b}, + %w{/x/a /y/b} => %w{x/a y/b}, + %w{z/x/a z/y/b} => %w{x/a y/b}, + %w{/z/x/a /z/y/b} => %w{x/a y/b}, + # mixed with relative path + %w{a path/to/b} => %w{a path/to/b}, + %w{path/to/b a} => %w{path/to/b a}, + %w{path/to/b path/a} => %w{to/b a}, + %w{path/to/b path/a c} => %w{path/to/b path/a c}, + # When the first element is the directory + %w{path/ path/to/b path/a} => %w{to/b a}, + %w{path path/to/b path/a} => %w{to/b a}, + # mixed with absolute paths + %w{/path/to/b /a} => %w{path/to/b a}, + %w{/path/to/b /path/a} => %w{to/b a}, + %w{/path/to/b /path/a /c} => %w{path/to/b path/a c}, + # mixing absolute and relative paths + %w{path/a /path/b} => %w{path/a /path/b}, + %w{/path/a path/b} => %w{/path/a path/b}, + # extract folder structure buildup + %w{/a /a/b /a/b/c} => %w{c}, + %w{/a /a/b /a/b/c/d/e} => %w{e}, + # extract folder structure buildup (relative) + %w{a a/b a/b/c} => %w{c}, + %w{a a/b a/b/c/d/e} => %w{e}, + # extract folder structure buildup (relative) + %w{a/ a/b/ a/b/c} => %w{c}, + %w{a/ a/b/ a/b/c/d/e} => %w{e}, + # ignore pax_global_header, which are commonly seen in github tars and are not + # ignored by all tar streaming tools, its not extracted by GNU tar since 1.14 + %w{/pax_global_header /a/b} => %w{b}, + %w{pax_global_header a/b} => %w{b}, + }.each do |ins, outs| + describe 'empty profile' do + let(:in_files) { ins } + + it "turns #{ins} into #{outs}" do + fetcher.files.must_equal outs + end + end + end + +end diff --git a/test/unit/mock/cmd/$env-computername b/test/unit/mock/cmd/$env-computername new file mode 100644 index 000000000..fb718ceb9 --- /dev/null +++ b/test/unit/mock/cmd/$env-computername @@ -0,0 +1 @@ +WIN-CIV7VMLVHLD diff --git a/test/unit/mock/cmd/GetUserAccount b/test/unit/mock/cmd/GetUserAccount deleted file mode 100644 index 499a825a5..000000000 --- a/test/unit/mock/cmd/GetUserAccount +++ /dev/null @@ -1,33 +0,0 @@ -{ - "User": { - "Caption": "EXAMPLE\\Administrator", - "Description": "Built-in account for administering the computer/domain", - "Domain": "EXAMPLE", - "Name": "Administrator", - "LocalAccount": false, - "Lockout": false, - "PasswordChangeable": true, - "PasswordExpires": true, - "PasswordRequired": true, - "SID": "S-1-5-21-725088257-906184668-2367214287-500", - "SIDType": 1, - "Status": "OK" - }, - "Groups": [{ - "Caption": "WIN-K0AKLED332V\\Administrators", - "Domain": "WIN-K0AKLED332V", - "Name": "Administrators", - "LocalAccount": true, - "SID": "S-1-5-32-544", - "SIDType": 4, - "Status": "OK" - }, { - "Caption": "EXAMPLE\\Domain Admins", - "Domain": "EXAMPLE", - "Name": "Domain Admins", - "LocalAccount": false, - "SID": "S-1-5-21-725088257-906184668-2367214287-512", - "SIDType": 2, - "Status": "OK" - }] -} diff --git a/test/unit/mock/cmd/GetWin32Group b/test/unit/mock/cmd/GetWin32Group deleted file mode 100644 index 8bffdcc38..000000000 --- a/test/unit/mock/cmd/GetWin32Group +++ /dev/null @@ -1,23 +0,0 @@ -[ - { - "Caption": "WIN-K0AKLED332V\\Administrators", - "Domain": "WIN-K0AKLED332V", - "Name": "Administrators", - "SID": "S-1-5-32-544", - "LocalAccount": true - }, - { - "Caption": "WIN-K0AKLED332V\\Users", - "Domain": "WIN-K0AKLED332V", - "Name": "Users", - "SID": "S-1-5-32-545", - "LocalAccount": true - }, - { - "Caption": "EXAMPLE\\Domain Admins", - "Domain": "EXAMPLE", - "Name": "Domain Admins", - "SID": "S-1-5-21-725088257-906184668-2367214287-512", - "LocalAccount": false - } -] diff --git a/test/unit/mock/cmd/adsigroups b/test/unit/mock/cmd/adsigroups new file mode 100644 index 000000000..d209b4680 --- /dev/null +++ b/test/unit/mock/cmd/adsigroups @@ -0,0 +1,22 @@ +[ + { + "gid": "S-1-5-32-544", + "domain": "WIN-CIV7VMLVHLD", + "name": "Administrators" + }, + { + "gid": "S-1-5-32-546", + "domain": "WIN-CIV7VMLVHLD", + "name": "Guests" + }, + { + "gid": "S-1-5-32-547", + "domain": "WIN-CIV7VMLVHLD", + "name": "Power Users" + }, + { + "gid": "S-1-5-32-545", + "domain": "WIN-CIV7VMLVHLD", + "name": "Users" + } +] diff --git a/test/unit/mock/cmd/adsiusers b/test/unit/mock/cmd/adsiusers new file mode 100644 index 000000000..d02a9345e --- /dev/null +++ b/test/unit/mock/cmd/adsiusers @@ -0,0 +1,53 @@ +[ + { + "warndays": null, + "mindays": 0, + "minpasswordlength": 0, + "badpasswordattempts": 0, + "description": "Built-in account for administering the computer/domain", + "username": "Administrator", + "disabled": false, + "passwordage": 355, + "maxbadpasswords": 0, + "home": "", + "uid": "S-1-5-21-1759981009-4135989804-1844563890-500", + "domain": "WIN-CIV7VMLVHLD", + "group": null, + "userflags": [ + "SCRIPT", + "NORMAL_ACCOUNT", + "PASSWORD_EXPIRED" + ], + "groups": null, + "gid": null, + "maxdays": 42, + "shell": null + }, + { + "warndays": null, + "mindays": 0, + "minpasswordlength": 0, + "badpasswordattempts": 0, + "description": "Built-in account for guest access to the computer/domain", + "username": "Guest", + "disabled": true, + "passwordage": 0, + "maxbadpasswords": 0, + "home": "", + "uid": "S-1-5-21-1759981009-4135989804-1844563890-501", + "domain": "WIN-CIV7VMLVHLD", + "group": null, + "userflags": [ + "SCRIPT", + "ACCOUNTDISABLE", + "PASSWD_NOTREQD", + "PASSWD_CANT_CHANGE", + "NORMAL_ACCOUNT", + "DONT_EXPIRE_PASSWORD" + ], + "groups": null, + "gid": null, + "maxdays": 42, + "shell": null + } +] diff --git a/test/unit/mock/cmd/find-httpd-ssl-conf b/test/unit/mock/cmd/find-httpd-ssl-conf new file mode 100644 index 000000000..a463ce440 --- /dev/null +++ b/test/unit/mock/cmd/find-httpd-ssl-conf @@ -0,0 +1 @@ +/etc/httpd/conf.d/ssl.conf diff --git a/test/unit/mock/cmd/find-httpd-status-conf b/test/unit/mock/cmd/find-httpd-status-conf new file mode 100644 index 000000000..a2108ce30 --- /dev/null +++ b/test/unit/mock/cmd/find-httpd-status-conf @@ -0,0 +1 @@ +/etc/httpd/mods-enabled/status.conf diff --git a/test/unit/mock/cmd/get-item-property-package b/test/unit/mock/cmd/get-item-property-package new file mode 100644 index 000000000..36e581f2b --- /dev/null +++ b/test/unit/mock/cmd/get-item-property-package @@ -0,0 +1,4 @@ +{ + "DisplayName": "Chef Client v12.12.15", + "DisplayVersion": "12.12.15.1" +} diff --git a/test/unit/mock/cmd/hostname b/test/unit/mock/cmd/hostname new file mode 100644 index 000000000..de54ac668 --- /dev/null +++ b/test/unit/mock/cmd/hostname @@ -0,0 +1 @@ +example.com diff --git a/test/unit/mock/cmd/ps-aux b/test/unit/mock/cmd/ps-aux deleted file mode 100644 index 6c3cb9998..000000000 --- a/test/unit/mock/cmd/ps-aux +++ /dev/null @@ -1,5 +0,0 @@ -USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND -root 1 0.0 0.0 18084 3228 ? Ss 14:15 0:00 /bin/bash -root 13 0.0 0.0 15284 2148 ? R+ 15:08 0:00 ps aux -noot 19 0.0 0.0 24521 1536 s001 Ss 09:23 0:00 svc -noot 23 0.0 0.0 25044 1908 s000 S 08:46 0:00 svc diff --git a/test/unit/mock/cmd/ps-auxZ b/test/unit/mock/cmd/ps-auxZ deleted file mode 100644 index a70f437da..000000000 --- a/test/unit/mock/cmd/ps-auxZ +++ /dev/null @@ -1,3 +0,0 @@ -LABEL USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND -system_u:system_r:kernel_t:s0 root 1 0.0 0.0 19232 1492 ? Ss May04 0:01 /sbin/init -system_u:system_r:kernel_t:s0 root 39 0.0 0.0 0 0 ? S May04 0:00 crypto/0 diff --git a/test/unit/mock/cmd/ps-axo b/test/unit/mock/cmd/ps-axo new file mode 100644 index 000000000..36b1fd7b8 --- /dev/null +++ b/test/unit/mock/cmd/ps-axo @@ -0,0 +1,4 @@ + PID %CPU %MEM VSZ RSS TTY STAT STARTED TIME USER COMMAND + 7115 0.3 0.0 2516588 3052 ttys008 U Fri05PM 0:00.05 root login -fp apop + 7116 0.0 0.0 2499948 1292 ttys008 S+ Fri05PM 0:00.97 apop -bash + 7853 0.0 0.1 2526272 8804 ttys009 Ss Fri05PM 0:00.06 apop /Users/apop/Applications/iTerm.app/Contents/MacOS/iTerm2 --server login -fp apop diff --git a/test/unit/mock/cmd/ps-axoZ b/test/unit/mock/cmd/ps-axoZ new file mode 100644 index 000000000..bbebab5c2 --- /dev/null +++ b/test/unit/mock/cmd/ps-axoZ @@ -0,0 +1,4 @@ +LABEL PID %CPU %MEM VSZ RSS TT STAT STARTED TIME USER COMMAND +system_u:system_r:init_t:s0 5127 0.0 0.2 547208 5376 ? Ss 10:54:22 00:00:00 opscode-pgsql postgres: bifrost bifrost 127.0.0.1(43699) idle +system_u:system_r:init_t:s0 5140 1.9 11.2 2908400 215308 ? Ssl 10:54:23 00:00:05 opscode java -Xmx466M -Xms466M -XX:NewSize=32M -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -Xloggc:/var/log/opscode/opscode-solr4/gclog.log -verbose:gc -XX:+PrintHeapAtGC -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -XX:+PrintTenuringDistribution -Dsolr.data.dir=/var/opt/opscode/opscode-solr4/data -Dsolr.solr.home=/var/opt/opscode/opscode-solr4/home -Djava.io.tmpdir=/var/opt/opscode/opscode-solr4/ -server -jar /opt/opscode/embedded/service/opscode-solr4/jetty/start.jar +system_u:system_r:init_t:s0 5169 0.0 0.0 4084 536 ? S 10:54:23 00:00:00 opscode svlogd -tt /var/log/opscode/opscode-solr4 diff --git a/test/unit/mock/cmd/win32_product b/test/unit/mock/cmd/win32_product deleted file mode 100644 index 591e53378..000000000 --- a/test/unit/mock/cmd/win32_product +++ /dev/null @@ -1,8 +0,0 @@ -{ - "Name": "Microsoft Visual C++ 2008 Redistributable - x64 9.0.30729.6161", - "Version": "9.0.30729.6161", - "Vendor": "Microsoft Corporation", - "PackageCode": "{9C7D912C-6EDE-47A4-962E-7A83663440BA}", - "Caption": "Microsoft Visual C++ 2008 Redistributable - x64 9.0.30729.6161", - "Description": "Microsoft Visual C++ 2008 Redistributable - x64 9.0.30729.6161" -} diff --git a/test/unit/mock/files/httpd.conf b/test/unit/mock/files/httpd.conf new file mode 100644 index 000000000..b78bf088d --- /dev/null +++ b/test/unit/mock/files/httpd.conf @@ -0,0 +1,29 @@ +# This is the main Apache server configuration file. It contains comments. +ServerRoot "/etc/httpd" + +# User/Group: The name (or #number) of the user/group to run httpd as. +# . On SCO (ODT 3) use "User nouser" and "Group nogroup". +# . On HPUX you may not be able to use shared memory as nobody, and the +# suggested workaround is to create a user www and use that user. +# NOTE that some kernels refuse to setgid(Group) or semctl(IPC_SET) +# when the value of (unsigned)Group is above 60000; +# don't use Group #-1 on these systems! +# +User apache +Group apache + +# Load config files from the config directory "/etc/httpd/conf.d". +# +Include conf.d/*.conf + +# Load config files using an absolute path +# +Include /etc/httpd/mods-enabled/*.conf + +# First, we configure the "default" to be a very restrictive set of +# features. +# + + Options FollowSymLinks + AllowOverride None + diff --git a/test/unit/mock/files/ssl.conf b/test/unit/mock/files/ssl.conf new file mode 100644 index 000000000..cb577c29d --- /dev/null +++ b/test/unit/mock/files/ssl.conf @@ -0,0 +1,6 @@ +# apache ssl.conf +Listen 80 + + + Listen 443 + diff --git a/test/unit/mock/files/status.conf b/test/unit/mock/files/status.conf new file mode 100644 index 000000000..5d1709461 --- /dev/null +++ b/test/unit/mock/files/status.conf @@ -0,0 +1 @@ +ExtendedStatus Off diff --git a/test/unit/mock/profiles/complete-metadata/inspec.yml b/test/unit/mock/profiles/complete-metadata/inspec.yml index c705f9736..345784662 100644 --- a/test/unit/mock/profiles/complete-metadata/inspec.yml +++ b/test/unit/mock/profiles/complete-metadata/inspec.yml @@ -4,4 +4,6 @@ maintainer: bob title: title copyright: left summary: nothing -supports: linux +supports: + - linux + - darwin diff --git a/test/unit/mock/profiles/dependencies/inheritance/controls/example.rb b/test/unit/mock/profiles/dependencies/inheritance/controls/example.rb index b33fd1bdb..aa717f0a3 100644 --- a/test/unit/mock/profiles/dependencies/inheritance/controls/example.rb +++ b/test/unit/mock/profiles/dependencies/inheritance/controls/example.rb @@ -2,14 +2,3 @@ include_controls 'profile_a' include_controls 'profile_b' -include_controls 'os-hardening' do - skip_control 'os-01' - - 1.upto(5) do |i| - skip_control "package-%02d" % i - end - - 1.upto(33) do |i| - skip_control "sysctl-%02d" % i - end -end diff --git a/test/unit/mock/profiles/dependencies/inheritance/inspec.yml b/test/unit/mock/profiles/dependencies/inheritance/inspec.yml index 1299403ae..fbf27b297 100644 --- a/test/unit/mock/profiles/dependencies/inheritance/inspec.yml +++ b/test/unit/mock/profiles/dependencies/inheritance/inspec.yml @@ -10,5 +10,3 @@ depends: path: ../profile_a - name: profile_b path: ../profile_b - - name: os-hardening - url: https://github.com/dev-sec/tests-os-hardening/archive/master.tar.gz diff --git a/test/unit/mock/profiles/dependencies/profile_a/controls/example.rb b/test/unit/mock/profiles/dependencies/profile_a/controls/example.rb index 1aeb05cb7..cbbcc9fee 100644 --- a/test/unit/mock/profiles/dependencies/profile_a/controls/example.rb +++ b/test/unit/mock/profiles/dependencies/profile_a/controls/example.rb @@ -4,11 +4,12 @@ title 'sample section' include_controls 'profile_c' - -# you can also use plain tests -describe file('/tmp') do - it { should be_directory } -end +# +# The following should fail even in the case where profile_d or +# profile_b is pulled in somewhere else in the dependency tree. +# +# include_controls 'profile_d' +# include_controls 'profile_b' # you add controls here control 'profilea-1' do # A unique ID for this control @@ -19,3 +20,9 @@ control 'profilea-1' do # A unique ID for this control it { should be_directory } end end + +control 'profilea-2' do + describe gordon_config do + its('version') { should eq('1.0') } + end +end diff --git a/test/unit/mock/profiles/dependencies/profile_b/controls/example.rb b/test/unit/mock/profiles/dependencies/profile_b/controls/example.rb index 97e833de2..8c41170cb 100644 --- a/test/unit/mock/profiles/dependencies/profile_b/controls/example.rb +++ b/test/unit/mock/profiles/dependencies/profile_b/controls/example.rb @@ -3,11 +3,7 @@ # license: All rights reserved title 'sample section' - -# you can also use plain tests -describe file('/tmp') do - it { should be_directory } -end +include_controls 'profile_d' # you add controls here control 'profileb-1' do # A unique ID for this control @@ -18,3 +14,9 @@ control 'profileb-1' do # A unique ID for this control it { should be_directory } end end + +control 'profileb-2' do + describe gordon_config do + its('version') { should eq('2.0') } + end +end diff --git a/test/unit/mock/profiles/dependencies/profile_b/inspec.yml b/test/unit/mock/profiles/dependencies/profile_b/inspec.yml index b15faeb4a..204477714 100644 --- a/test/unit/mock/profiles/dependencies/profile_b/inspec.yml +++ b/test/unit/mock/profiles/dependencies/profile_b/inspec.yml @@ -6,3 +6,6 @@ copyright_email: you@example.com license: All Rights Reserved summary: An InSpec Compliance Profile version: 0.1.0 +depends: + - name: profile_d + path: ../profile_d diff --git a/test/unit/mock/profiles/dependencies/profile_c/libraries/gordon_config.rb b/test/unit/mock/profiles/dependencies/profile_c/libraries/gordon_config.rb new file mode 100644 index 000000000..cecf89512 --- /dev/null +++ b/test/unit/mock/profiles/dependencies/profile_c/libraries/gordon_config.rb @@ -0,0 +1,15 @@ +class GordonConfig < Inspec.resource(1) + name 'gordon_config' + + desc "Gordon's resource description ..." + + example " + describe gordon_config do + its('version') { should eq('1.0') } + end + " + + def version + "1.0" + end +end diff --git a/test/unit/mock/profiles/dependencies/profile_d/controls/example.rb b/test/unit/mock/profiles/dependencies/profile_d/controls/example.rb new file mode 100644 index 000000000..696427424 --- /dev/null +++ b/test/unit/mock/profiles/dependencies/profile_d/controls/example.rb @@ -0,0 +1,9 @@ +# you add controls here +control 'profiled-1' do # A unique ID for this control + impact 0.7 # The criticality, if this control fails. + title 'Create /tmp directory (profile d)' # A human-readable title + desc 'An optional description...' + describe file('/tmp') do # The actual test + it { should be_directory } + end +end diff --git a/test/unit/mock/profiles/dependencies/profile_d/inspec.yml b/test/unit/mock/profiles/dependencies/profile_d/inspec.yml new file mode 100644 index 000000000..0d2577e4f --- /dev/null +++ b/test/unit/mock/profiles/dependencies/profile_d/inspec.yml @@ -0,0 +1,8 @@ +name: profile_d +title: InSpec Profile +maintainer: The Authors +copyright: The Authors +copyright_email: you@example.com +license: All Rights Reserved +summary: An InSpec Compliance Profile +version: 0.1.0 diff --git a/.delivery/build-cookbook/secrets/fakey-mcfakerton b/test/unit/mock/profiles/dependencies/profile_d/libraries/.gitkeep similarity index 100% rename from .delivery/build-cookbook/secrets/fakey-mcfakerton rename to test/unit/mock/profiles/dependencies/profile_d/libraries/.gitkeep diff --git a/test/unit/mock/profiles/dependencies/profile_d/libraries/gordon_config.rb b/test/unit/mock/profiles/dependencies/profile_d/libraries/gordon_config.rb new file mode 100644 index 000000000..8b033559f --- /dev/null +++ b/test/unit/mock/profiles/dependencies/profile_d/libraries/gordon_config.rb @@ -0,0 +1,15 @@ +class GordonConfig < Inspec.resource(1) + name 'gordon_config' + + desc "Gordon's resource description ..." + + example " + describe gordon_config do + its('version') { should eq('2.0') } + end + " + + def version + "2.0" + end +end diff --git a/test/unit/mock/profiles/dependencies/require_controls_test/controls/example.rb b/test/unit/mock/profiles/dependencies/require_controls_test/controls/example.rb new file mode 100644 index 000000000..58612cd72 --- /dev/null +++ b/test/unit/mock/profiles/dependencies/require_controls_test/controls/example.rb @@ -0,0 +1,6 @@ +# encoding: utf-8 + +require_controls 'profile_a' +require_controls 'profile_b' do + control 'profileb-2' +end diff --git a/test/unit/mock/profiles/dependencies/require_controls_test/inspec.yml b/test/unit/mock/profiles/dependencies/require_controls_test/inspec.yml new file mode 100644 index 000000000..0fb5097c0 --- /dev/null +++ b/test/unit/mock/profiles/dependencies/require_controls_test/inspec.yml @@ -0,0 +1,12 @@ +name: require_controls_test +title: InSpec example inheritance +maintainer: Chef Software, Inc. +copyright: Chef Software, Inc. +copyright_email: support@chef.io +license: Apache 2 license +version: 1.0.0 +depends: + - name: profile_a + path: ../profile_a + - name: profile_b + path: ../profile_b diff --git a/test/unit/mock/profiles/dependencies/resource-namespace/controls/example.rb b/test/unit/mock/profiles/dependencies/resource-namespace/controls/example.rb new file mode 100644 index 000000000..fc55f0485 --- /dev/null +++ b/test/unit/mock/profiles/dependencies/resource-namespace/controls/example.rb @@ -0,0 +1,27 @@ +# encoding: utf-8 +# copyright: 2015, The Authors +# license: All rights reserved +require_resource(profile: 'profile_c', resource: 'gordon_config', as: 'gordy_config') + +describe gordy_config do + its('version') { should eq('1.0') } +end + +control 'whichgordon' do + describe gordy_config do + its('version') { should eq('1.0') } + end + + describe gordon_config do + its('version') { should eq('2.0') } + end + + describe gordy_config do + its('version') { should eq(gordy_config.version) } + end + + describe gordon_config do + its('version') { should eq(gordon_config.version) } + end + +end diff --git a/test/unit/mock/profiles/dependencies/resource-namespace/inspec.yml b/test/unit/mock/profiles/dependencies/resource-namespace/inspec.yml new file mode 100644 index 000000000..188a17ae6 --- /dev/null +++ b/test/unit/mock/profiles/dependencies/resource-namespace/inspec.yml @@ -0,0 +1,13 @@ +name: resource-namespace +title: InSpec Profile +maintainer: The Authors +copyright: The Authors +copyright_email: you@example.com +license: All Rights Reserved +summary: An InSpec Compliance Profile +version: 0.1.0 +depends: + - name: profile_a + path: '../profile_a' + - name: profile_d + path: '../profile_d' diff --git a/test/unit/mock/profiles/failures/controls/failures.rb b/test/unit/mock/profiles/failures/controls/failures.rb new file mode 100644 index 000000000..eb0cd28e0 --- /dev/null +++ b/test/unit/mock/profiles/failures/controls/failures.rb @@ -0,0 +1,43 @@ +# encoding: utf-8 +# copyright: 2015, Chef Software, Inc. +# license: All rights reserved + +title 'failures /tmp profile' + +# control, first test passes, second fails +control "tmp-1.0" do # A unique ID for this control + impact 0.7 # The criticality, if this control fails. + title "Create /tmp directory" # A human-readable title + desc "An optional description..." # Describe why this is needed + tag data: "temp data" # A tag allows you to associate key information + tag "security" # to the test + ref "Document A-12", url: 'http://...' # Additional references + + describe file('/tmp') do # The actual test + it { should be_directory } + it { should_not be_directory } + end +end + +# anonymous describe block, first passes, second is syntax error +describe file('/tmp') do + it { should be_directory } + it { should_nota be_directory } +end + +# anonymous describe block, first fails, second passes +describe file('/tmp') do + it { should_not be_directory } + it { should be_directory } + its('mode') { should cmp '01147' } +end + +# control, first and second fail, third passes +control 'cmp-1.0' do + title 'Using the cmp matcher for numbers' + describe 7 do + it { should cmp >= 9 } + it { should_not cmp /^\d$/ } + it { should cmp == '7' } + end +end diff --git a/test/unit/mock/profiles/failures/inspec.yml b/test/unit/mock/profiles/failures/inspec.yml new file mode 100644 index 000000000..9c6a347aa --- /dev/null +++ b/test/unit/mock/profiles/failures/inspec.yml @@ -0,0 +1,8 @@ +name: failures +title: InSpec Profile +maintainer: The Authors +copyright: The Authors +copyright_email: you@example.com +license: All Rights Reserved +summary: An InSpec Compliance Profile +version: 0.1.0 diff --git a/test/unit/mock/profiles/library/inspec.yml b/test/unit/mock/profiles/library/inspec.yml index 35b69c8e8..48c27927a 100644 --- a/test/unit/mock/profiles/library/inspec.yml +++ b/test/unit/mock/profiles/library/inspec.yml @@ -7,4 +7,5 @@ license: Proprietary, All rights reserved summary: Testing stub version: 1.0.0 supports: -- os-family: linux + - linux + - darwin diff --git a/test/unit/mock/profiles/profile-support-skip/controls/example.rb b/test/unit/mock/profiles/profile-support-skip/controls/example.rb new file mode 100644 index 000000000..4aec8958a --- /dev/null +++ b/test/unit/mock/profiles/profile-support-skip/controls/example.rb @@ -0,0 +1,5 @@ +# encoding: utf-8 +# copyright: 2015, The Authors +# license: All rights reserved + +include_controls 'windows-only' diff --git a/test/unit/mock/profiles/profile-support-skip/inspec.yml b/test/unit/mock/profiles/profile-support-skip/inspec.yml new file mode 100644 index 000000000..0a5c2e7b4 --- /dev/null +++ b/test/unit/mock/profiles/profile-support-skip/inspec.yml @@ -0,0 +1,11 @@ +name: profile-support-skip +title: InSpec Profile +maintainer: The Authors +copyright: The Authors +copyright_email: you@example.com +license: All Rights Reserved +summary: An InSpec Compliance Profile +version: 0.1.0 +depends: + - name: windows-only + path: '../windows-only' diff --git a/test/unit/mock/profiles/simple-inheritance/controls/simple-inheritance.rb b/test/unit/mock/profiles/simple-inheritance/controls/simple-inheritance.rb new file mode 100644 index 000000000..4d3f9e943 --- /dev/null +++ b/test/unit/mock/profiles/simple-inheritance/controls/simple-inheritance.rb @@ -0,0 +1,7 @@ +# encoding: utf-8 + +include_controls 'failures' + +describe file('/tmp') do + it { should be_directory } +end diff --git a/test/unit/mock/profiles/simple-inheritance/inspec.yml b/test/unit/mock/profiles/simple-inheritance/inspec.yml new file mode 100644 index 000000000..3916a8021 --- /dev/null +++ b/test/unit/mock/profiles/simple-inheritance/inspec.yml @@ -0,0 +1,10 @@ +name: simple inheritance +title: InSpec example simple inheritance +maintainer: Chef Software, Inc. +copyright: Chef Software, Inc. +copyright_email: support@chef.io +license: Apache 2 license +version: 1.0.0 +depends: + - name: failures + path: ../failures diff --git a/test/unit/mock/profiles/skippy-controls/controls/skipper.rb b/test/unit/mock/profiles/skippy-controls/controls/skipper.rb new file mode 100644 index 000000000..7baf3209a --- /dev/null +++ b/test/unit/mock/profiles/skippy-controls/controls/skipper.rb @@ -0,0 +1,11 @@ +control 'CONTROL super' do + describe 'skippy' do + skip 'This will be skipped super intentionally.' + end +end + +control 'CONTROL database' do + describe mysql_session do + its('something') { should be 3 } + end +end diff --git a/test/unit/mock/profiles/skippy-controls/inspec.yml b/test/unit/mock/profiles/skippy-controls/inspec.yml new file mode 100644 index 000000000..968975d37 --- /dev/null +++ b/test/unit/mock/profiles/skippy-controls/inspec.yml @@ -0,0 +1,3 @@ +name: skippy-controls +title: skip skip skip +version: 1.0.0 diff --git a/test/unit/mock/profiles/supermarket-dep/controls/default.rb b/test/unit/mock/profiles/supermarket-dep/controls/default.rb new file mode 100644 index 000000000..e3e95ed12 --- /dev/null +++ b/test/unit/mock/profiles/supermarket-dep/controls/default.rb @@ -0,0 +1,3 @@ +# encoding: utf-8 + +include_controls 'nathenharvey/tmp-compliance-profile' diff --git a/test/unit/mock/profiles/supermarket-dep/inspec.yml b/test/unit/mock/profiles/supermarket-dep/inspec.yml new file mode 100644 index 000000000..b7dddbf2a --- /dev/null +++ b/test/unit/mock/profiles/supermarket-dep/inspec.yml @@ -0,0 +1,9 @@ +name: supermarket-dep +title: InSpec example simple inheritance +maintainer: Chef Software, Inc. +copyright: Chef Software, Inc. +copyright_email: support@chef.io +license: Apache 2 license +version: 1.0.0 +depends: + - name: nathenharvey/tmp-compliance-profile diff --git a/test/unit/mock/profiles/windows-only/controls/example.rb b/test/unit/mock/profiles/windows-only/controls/example.rb new file mode 100644 index 000000000..18419cae8 --- /dev/null +++ b/test/unit/mock/profiles/windows-only/controls/example.rb @@ -0,0 +1,17 @@ +# encoding: utf-8 +# copyright: 2015, The Authors +# license: All rights reserved + +control 'dhcp-disabled' do + title 'DHCP is disabled' + describe windows_feature('dhcp') do + it { should be_installed } + end +end + +control 'cdrive' do + title 'Has a C://' + describe file("C://") do + it { should be_directory } + end +end diff --git a/test/unit/mock/profiles/windows-only/inspec.yml b/test/unit/mock/profiles/windows-only/inspec.yml new file mode 100644 index 000000000..6a260f212 --- /dev/null +++ b/test/unit/mock/profiles/windows-only/inspec.yml @@ -0,0 +1,10 @@ +name: windows-only +title: InSpec Profile +maintainer: The Authors +copyright: The Authors +copyright_email: you@example.com +license: All Rights Reserved +summary: An InSpec Compliance Profile +version: 0.1.0 +supports: + - windows diff --git a/test/unit/plugins/resource_test.rb b/test/unit/plugins/resource_test.rb index 8b7051bc4..a1e2decd1 100644 --- a/test/unit/plugins/resource_test.rb +++ b/test/unit/plugins/resource_test.rb @@ -14,19 +14,13 @@ describe Inspec::Plugins::Resource do Class.new(base) do name 'hello'; end Inspec::Resource.registry['hello'].wont_be :nil? end - - it "will create a good class name" do - Class.new(base) do name 'hello_world'; end - Inspec::Resource.registry['hello_world'].to_s - .must_equal 'Inspec::Resource::Registry::HelloWorld' - end end def create(&block) random_name = (0...50).map { (65 + rand(26)).chr }.join Class.new(base) do name random_name - instance_eval &block + instance_eval(&block) end Inspec::Resource.registry[random_name] end diff --git a/test/unit/profiles/control_eval_context_tests.rb b/test/unit/profiles/control_eval_context_tests.rb new file mode 100644 index 000000000..904b20a7c --- /dev/null +++ b/test/unit/profiles/control_eval_context_tests.rb @@ -0,0 +1,77 @@ +# encoding: utf-8 +# author: Steven Danna + +require 'helper' +require 'inspec/control_eval_context' + +describe Inspec::ControlEvalContext do + module FakeDSL + def foobar + "wombat" + end + end + + let(:control_content) { <"}) + eval_context.instance_eval(control_content) + profile_context.all_rules.each do |rule| + # Turn each rule into an example group and run it, none of the + # example content should raise an exception + Inspec::Rule.prepare_checks(rule).each do |m, a, b| + # if we require this at the top level, none of the other tests + # in this file will run. itsfine.jpg + require 'rspec/core' + RSpec::Core::ExampleGroup.describe(*a, &b).run + end + end + end + + describe "#resource" do + let(:resource_dsl) { Inspec::Resource.create_dsl(profile_context) } + let(:inner_context) { Inspec::ProfileContext.new('inner-context', backend, {}) } + let(:control_content) do < mock(:new => 'newfoo')}) + eval_context.instance_eval(control_content).must_equal "newfoo" + end + + end +end diff --git a/test/unit/profiles/library_eval_context_tests.rb b/test/unit/profiles/library_eval_context_tests.rb new file mode 100644 index 000000000..f554b498b --- /dev/null +++ b/test/unit/profiles/library_eval_context_tests.rb @@ -0,0 +1,40 @@ +# encoding: utf-8 +# author: Steven Danna + +require 'helper' +require 'inspec/resource' +require 'inspec/library_eval_context' + +describe Inspec::LibraryEvalContext do + let(:resource_content) { < current_version }) diff --git a/test/unit/profiles/profile_context_test.rb b/test/unit/profiles/profile_context_test.rb index 5a900acdf..42ace4113 100644 --- a/test/unit/profiles/profile_context_test.rb +++ b/test/unit/profiles/profile_context_test.rb @@ -91,7 +91,7 @@ describe Inspec::ProfileContext do it 'supports empty describe calls' do load('describe').must_output '' profile.rules.keys.length.must_equal 1 - profile.rules.keys[0].must_match /^\(generated from \(eval\):1 [0-9a-f]+\)$/ + profile.rules.keys[0].must_match(/^\(generated from \(eval\):1 [0-9a-f]+\)$/) profile.rules.values[0].must_be_kind_of Inspec::Rule end @@ -99,7 +99,7 @@ describe Inspec::ProfileContext do load('describe true do; it { should_eq true }; end') .must_output '' profile.rules.keys.length.must_equal 1 - profile.rules.keys[0].must_match /^\(generated from \(eval\):1 [0-9a-f]+\)$/ + profile.rules.keys[0].must_match(/^\(generated from \(eval\):1 [0-9a-f]+\)$/) profile.rules.values[0].must_be_kind_of Inspec::Rule end @@ -108,7 +108,7 @@ describe Inspec::ProfileContext do .must_output '' profile.rules.keys.length.must_equal 3 [0, 1, 2].each do |i| - profile.rules.keys[i].must_match /^\(generated from \(eval\):2 [0-9a-f]+\)$/ + profile.rules.keys[i].must_match(/^\(generated from \(eval\):2 [0-9a-f]+\)$/) profile.rules.values[i].must_be_kind_of Inspec::Rule end end diff --git a/test/unit/profiles/profile_test.rb b/test/unit/profiles/profile_test.rb index 402eb8b02..72bb578ec 100644 --- a/test/unit/profiles/profile_test.rb +++ b/test/unit/profiles/profile_test.rb @@ -96,7 +96,6 @@ describe Inspec::Profile do let(:profile_id) { 'legacy-empty-metadata' } it 'prints loads of warnings' do - metadata_rb = "#{home}/mock/profiles/#{profile_id}/metadata.rb" logger.expect :info, nil, ["Checking profile in #{home}/mock/profiles/#{profile_id}"] logger.expect :error, nil, ["Missing profile name in metadata.rb"] logger.expect :warn, nil, ['The use of `metadata.rb` is deprecated. Use `inspec.yml`.'] diff --git a/test/unit/resources/apache_conf_test.rb b/test/unit/resources/apache_conf_test.rb index bc50dcbfb..46b202cb3 100644 --- a/test/unit/resources/apache_conf_test.rb +++ b/test/unit/resources/apache_conf_test.rb @@ -2,30 +2,32 @@ # author: Stephan Renatus require 'helper' +require 'inspec/resource' +require 'hashie' describe 'Inspec::Resources::ApacheConf' do - let(:resource) { load_resource('apache_conf') } - - it 'verify content is a string' do - _(resource.content).must_be_kind_of String - end - - it 'verify params is a hashmap' do + # debian style apache2 + it 'reads values in apache2.conf and from Include, IncludeOptional params' do + resource = MockLoader.new(:ubuntu1404).load_resource('apache_conf') _(resource.params).must_be_kind_of Hash - end - - it 'reads values in apache2.conf' do + _(resource.content).must_be_kind_of String _(resource.params('ServerRoot')).must_equal ['"/etc/apache2"'] - end - - it 'reads values in from the direct include ports.conf' do _(resource.params('Listen').sort).must_equal ['443', '80'] - end - - it 'reads values in from wildcard include serve-cgi-bin.conf' do # TODO(sr) currently, the parser only merges parameter across separate # source files, not in one file _(resource.params('Define')).must_equal ['ENABLE_USR_LIB_CGI_BIN', 'ENABLE_USR_LIB_CGI_BIN'] end + + # non debian style httpd + it 'reads values in httpd.conf and from Include, IncludeOptional params' do + resource = MockLoader.new(:centos6).load_resource('apache_conf') + _(resource.params).must_be_kind_of Hash + _(resource.content).must_be_kind_of String + _(resource.params('ServerRoot')).must_equal ['"/etc/httpd"'] + _(resource.params('Listen').sort).must_equal ['443', '80'] + + # sourced using an absolute path in httpd.conf + _(resource.params('ExtendedStatus')).must_equal ['Off'] + end end diff --git a/test/unit/resources/apt_test.rb b/test/unit/resources/apt_test.rb index a741bcc4e..28c7524de 100644 --- a/test/unit/resources/apt_test.rb +++ b/test/unit/resources/apt_test.rb @@ -25,8 +25,26 @@ describe 'Inspec::Resources::AptRepo' do _(resource.enabled?).must_equal true end + it 'check apt on mint' do + resource = MockLoader.new(:mint18).load_resource('apt', 'http://archive.ubuntu.com/ubuntu/') + _(resource.exists?).must_equal true + _(resource.enabled?).must_equal true + end + + it 'check apt on mint with ppa' do + resource = MockLoader.new(:mint18).load_resource('apt', 'ubuntu-wine/ppa') + _(resource.exists?).must_equal true + _(resource.enabled?).must_equal true + end + + it 'check apt on mint with ppa' do + resource = MockLoader.new(:mint18).load_resource('apt', 'ppa:ubuntu-wine/ppa') + _(resource.exists?).must_equal true + _(resource.enabled?).must_equal true + end + it 'check apt on debian' do - resource = MockLoader.new(:ubuntu1504).load_resource('apt', 'http://archive.ubuntu.com/ubuntu/') + resource = MockLoader.new(:debian8).load_resource('apt', 'http://archive.ubuntu.com/ubuntu/') _(resource.exists?).must_equal true _(resource.enabled?).must_equal true end diff --git a/test/unit/resources/file_test.rb b/test/unit/resources/file_test.rb index 06fc767f3..4bce18e98 100644 --- a/test/unit/resources/file_test.rb +++ b/test/unit/resources/file_test.rb @@ -5,198 +5,62 @@ require 'helper' require 'inspec/resource' -def shared_file_permission_tests(method_under_test) - it 'returns false if the file does not exist' do - resource.stubs(:exist?).returns(false) - resource.send(method_under_test, nil, nil).must_equal(false) - end - - it 'returns the value of #file_permission_granted?' do - resource.stubs(:exist?).returns(true) - resource.stubs(:file_permission_granted?).returns('test_result') - resource.send(method_under_test, nil, nil).must_equal('test_result') - end -end - describe Inspec::Resources::FileResource do - let(:resource) { load_resource('file', '/fakepath/fakefile') } - - describe '#readable?' do - shared_file_permission_tests(:readable?) + let(:file) { stub(unix_mode_mask: 000, mode: 000) } + it 'responds on Ubuntu' do + resource = MockLoader.new(:ubuntu1404).load_resource('file', '/fakepath/fakefile') + resource.stubs(:exist?).returns(true) + resource.stubs(:mounted?).returns(true) + resource.stubs(:source_path).returns('/fakepath/fakefile') + resource.stubs(:file).returns(file) + resource.stubs(:content).returns('content') + resource.stubs(:mode).returns(000) + resource.stubs(:suid).returns(true) + resource.stubs(:sgid).returns(true) + resource.stubs(:sticky).returns(true) + resource.stubs(:file_permission_granted?).with('read', 'by_usergroup', 'by_specific_user').returns('test_result') + resource.stubs(:file_permission_granted?).with('write', 'by_usergroup', 'by_specific_user').returns('test_result') + resource.stubs(:file_permission_granted?).with('execute', 'by_usergroup', 'by_specific_user').returns('test_result') + _(resource.content).must_equal 'content' + _(resource.exist?).must_equal true + _(resource.mounted?).must_equal true + _(resource.to_s).must_equal 'File /fakepath/fakefile' + _(resource.readable?('by_usergroup', 'by_specific_user')).must_equal 'test_result' + _(resource.writable?('by_usergroup', 'by_specific_user')).must_equal 'test_result' + _(resource.executable?('by_usergroup', 'by_specific_user')).must_equal 'test_result' + _(resource.suid).must_equal true + _(resource.sgid).must_equal true + _(resource.sticky).must_equal true end - - describe '#writable?' do - shared_file_permission_tests(:writable?) + it 'responds on Windows' do + resource = MockLoader.new(:windows).load_resource('file', 'C:/fakepath/fakefile') + resource.stubs(:exist?).returns(true) + resource.stubs(:mounted?).returns(true) + resource.stubs(:content).returns('content') + resource.stubs(:file_permission_granted?).with('read', 'by_usergroup', 'by_specific_user').returns('test_result') + resource.stubs(:file_permission_granted?).with('write', 'by_usergroup', 'by_specific_user').returns('test_result') + resource.stubs(:file_permission_granted?).with('execute', 'by_usergroup', 'by_specific_user').returns('test_result') + _(resource.content).must_equal 'content' + _(resource.exist?).must_equal true + _(resource.mounted?).must_equal true + _(resource.readable?('by_usergroup', 'by_specific_user')).must_equal 'test_result' + _(resource.writable?('by_usergroup', 'by_specific_user')).must_equal 'test_result' + _(resource.executable?('by_usergroup', 'by_specific_user')).must_equal 'test_result' end - - describe '#executable?' do - shared_file_permission_tests(:executable?) + it 'does not support check by mask on Windows' do + resource = MockLoader.new(:windows).load_resource('file', 'C:/fakepath/fakefile') + resource.stubs(:exist?).returns(true) + proc { resource.send('readable?', 'by_usergroup', nil) }.must_raise(RuntimeError) + proc { resource.send('writable?', 'by_usergroup', nil) }.must_raise(RuntimeError) + proc { resource.send('executable?', 'by_usergroup', nil) }.must_raise(RuntimeError) end - - describe '#basename' do - it 'returns the basename' do - resource.stubs(:basename).returns('fakefile') - resource.basename.must_equal('fakefile') - end - end - - describe '#to_s' do - it 'returns a properly formatted string' do - resource.to_s.must_equal('File /fakepath/fakefile') - end - end - - describe '#file_permission_granted?' do - describe 'when not on a unix OS' do - it 'raises an exception' do - MockLoader.mock_os(resource, :windows) - proc { resource.send(:file_permission_granted?, 'flag', nil, nil) }.must_raise(RuntimeError) - end - end - - describe 'when on a unix OS' do - before do - MockLoader.mock_os(resource, :centos7) - end - - describe 'when no user is provided' do - it 'checks file permission by mask' do - resource.expects(:check_file_permission_by_mask).with('usergroup', 'flag') - resource.send(:file_permission_granted?, 'flag', 'usergroup', nil) - end - end - - describe 'when a user is provided' do - it 'checks file permission by user' do - resource.expects(:check_file_permission_by_user).with('user', 'flag') - resource.send(:file_permission_granted?, 'flag', nil, 'user') - end - end - end - end - - describe '#check_file_permission_by_mask' do - describe 'when no mask is returned' do - let(:file) { stub(unix_mode_mask: nil) } - - it 'raises an exception' do - file = stub(unix_mode_mask: nil) - resource.stubs(:file).returns(file) - proc { resource.send(:check_file_permission_by_mask, 'usergroup', 'flag') }.must_raise(RuntimeError) - end - end - - describe 'when a mask is returned' do - describe 'when the bitwise AND returns a non-zero' do - let(:file) { stub(unix_mode_mask: 292, mode: 420) } - it 'returns true' do - resource.stubs(:file).returns(file) - resource.send(:check_file_permission_by_mask, 'usergroup', 'flag').must_equal(true) - end - end - - describe 'when the bitwise AND returns zero' do - let(:file) { stub(unix_mode_mask: 73, mode: 420) } - it 'returns false' do - resource.stubs(:file).returns(file) - resource.send(:check_file_permission_by_mask, 'usergroup', 'flag').must_equal(false) - end - end - end - end - - describe 'check_file_permission_by_user' do - describe 'when on linux' do - before do - MockLoader.mock_os(resource, :centos7) - end - - it 'executes a properly formatted command' do - MockLoader.mock_command(resource, - 'su -s /bin/sh -c "test -flag /fakepath/fakefile" user', - exit_status: 0) - resource.send(:check_file_permission_by_user, 'user', 'flag') - end - - it 'returns true when the cmd exits 0' do - MockLoader.mock_command(resource, 'su -s /bin/sh -c "test -flag /fakepath/fakefile" user', exit_status: 0) - resource.send(:check_file_permission_by_user, 'user', 'flag').must_equal(true) - end - - it 'returns false when the cmd exits non-zero' do - MockLoader.mock_command(resource, 'su -s /bin/sh -c "test -flag /fakepath/fakefile" user', exit_status: 1) - resource.send(:check_file_permission_by_user, 'user', 'flag').must_equal(false) - end - end - - describe 'when on freebsd' do - before do - MockLoader.mock_os(resource, :freebsd10) - end - - it 'executes a properly formatted command' do - MockLoader.mock_command(resource, 'sudo -u user test -flag /fakepath/fakefile', exit_status: 0) - resource.send(:check_file_permission_by_user, 'user', 'flag') - end - - it 'returns true when the cmd exits 0' do - MockLoader.mock_command(resource, 'sudo -u user test -flag /fakepath/fakefile', exit_status: 0) - resource.send(:check_file_permission_by_user, 'user', 'flag').must_equal(true) - end - - it 'returns false when the cmd exits non-zero' do - MockLoader.mock_command(resource, 'sudo -u user test -flag /fakepath/fakefile', exit_status: 1) - resource.send(:check_file_permission_by_user, 'user', 'flag').must_equal(false) - end - end - - describe 'when on hpux' do - before do - MockLoader.mock_os(resource, :hpux) - end - - it 'executes a properly formatted command' do - MockLoader.mock_command(resource, "su user -c \"test -flag /fakepath/fakefile\"", exit_status: 0) - resource.send(:check_file_permission_by_user, 'user', 'flag') - end - - it 'returns true when the cmd exits 0' do - MockLoader.mock_command(resource, "su user -c \"test -flag /fakepath/fakefile\"", exit_status: 0) - resource.send(:check_file_permission_by_user, 'user', 'flag').must_equal(true) - end - - it 'returns false when the cmd exits non-zero' do - MockLoader.mock_command(resource, "su user -c \"test -flag /fakepath/fakefile\"", exit_status: 1) - resource.send(:check_file_permission_by_user, 'user', 'flag').must_equal(false) - end - end - - describe 'when not on linux or freebsd' do - before do - MockLoader.mock_os(resource, :undefined) - end - - it 'returns an error string' do - resource.send(:check_file_permission_by_user, 'user', 'flag').must_equal('The `file` resource does not support `by_user` on your OS.') - end - end - end - - describe '#usergroup_for' do - it 'returns "other" if "others" is provided' do - resource.send(:usergroup_for, 'others', nil).must_equal('other') - end - - it 'returns "all" if no usergroup or user is specified' do - resource.send(:usergroup_for, nil, nil).must_equal('all') - end - - it 'returns nil if the usergroup is nil and a user is specified' do - resource.send(:usergroup_for, nil, 'user').must_equal(nil) - end - - it 'returns the passed-in usergroup if usergroup is not nil and user is nil' do - resource.send(:usergroup_for, 'mygroup', nil).must_equal('mygroup') - end + it 'responds with errors on unsupported OS' do + resource = MockLoader.new(:unsupported).load_resource('file', 'C:/fakepath/fakefile') + resource.stubs(:exist?).returns(true) + _(resource.exist?).must_equal true + _(resource.readable?('by_usergroup', 'by_specific_user')).must_equal '`readable?` is not supported on your OS yet.' + _(resource.writable?('by_usergroup', 'by_specific_user')).must_equal '`writable?` is not supported on your OS yet.' + _(resource.executable?('by_usergroup', 'by_specific_user')).must_equal '`executable?` is not supported on your OS yet.' + proc { resource.send(:contain, nil) }.must_raise(RuntimeError) end end diff --git a/test/unit/resources/group_test.rb b/test/unit/resources/group_test.rb index a09799eff..a34cf7202 100644 --- a/test/unit/resources/group_test.rb +++ b/test/unit/resources/group_test.rb @@ -50,30 +50,7 @@ describe 'Inspec::Resources::Group' do it 'verify group on windows' do resource = MockLoader.new(:windows).load_resource('group', 'Administrators') _(resource.exists?).must_equal true - _(resource.gid).must_equal nil - _(resource.has_gid?(0)).must_equal false - end - - it 'verify group on windows' do - resource = MockLoader.new(:windows).load_resource('group', 'Administrators', 'WIN-K0AKLED332V') - _(resource.exists?).must_equal true - _(resource.gid).must_equal nil - _(resource.has_gid?(0)).must_equal false - end - - # windows with domain group - it 'verify domain group on windows' do - resource = MockLoader.new(:windows).load_resource('group', 'Domain Admins', 'EXAMPLE') - _(resource.exists?).must_equal true - _(resource.gid).must_equal nil - _(resource.has_gid?(0)).must_equal false - end - - # windows with domain group - it 'verify domain group on windows wiht lower case' do - resource = MockLoader.new(:windows).load_resource('group', 'domain admins', 'example') - _(resource.exists?).must_equal true - _(resource.gid).must_equal nil + _(resource.gid).must_equal 'S-1-5-32-544' _(resource.has_gid?(0)).must_equal false end diff --git a/test/unit/resources/os_test.rb b/test/unit/resources/os_test.rb index 76ea50850..f49f68721 100644 --- a/test/unit/resources/os_test.rb +++ b/test/unit/resources/os_test.rb @@ -37,4 +37,12 @@ describe 'Inspec::Resources::Os' do _(resource.release).must_equal '15.04' _(resource.arch).must_equal 'x86_64' end + + it 'verify os parsing on Mint' do + resource = MockLoader.new(:mint18).load_resource('os') + _(resource.name).must_equal 'linuxmint' + _(resource.family).must_equal 'debian' + _(resource.release).must_equal '18' + _(resource.arch).must_equal 'x86_64' + end end diff --git a/test/unit/resources/package_test.rb b/test/unit/resources/package_test.rb index 97db0f2c4..35fe7ee06 100644 --- a/test/unit/resources/package_test.rb +++ b/test/unit/resources/package_test.rb @@ -24,6 +24,15 @@ describe 'Inspec::Resources::Package' do _(resource.info).must_equal pkg end + # mint + it 'verify mint package parsing' do + resource = MockLoader.new(:mint17).load_resource('package', 'curl') + pkg = { name: 'curl', installed: true, version: '7.35.0-1ubuntu2', type: 'deb' } + _(resource.installed?).must_equal true + _(resource.version).must_equal '7.35.0-1ubuntu2' + _(resource.info).must_equal pkg + end + # centos it 'verify centos package parsing' do resource = MockLoader.new(:centos7).load_resource('package', 'curl') @@ -53,10 +62,10 @@ describe 'Inspec::Resources::Package' do # windows it 'verify windows package parsing' do - resource = MockLoader.new(:windows).load_resource('package', 'Microsoft Visual C++ 2008 Redistributable - x64 9.0.30729.6161') - pkg = { name: 'Microsoft Visual C++ 2008 Redistributable - x64 9.0.30729.6161', installed: true, version: '9.0.30729.6161', type: 'windows' } + resource = MockLoader.new(:windows).load_resource('package', 'Chef Client v12.12.15') + pkg = { name: 'Chef Client v12.12.15', installed: true, version: '12.12.15.1', type: 'windows' } _(resource.installed?).must_equal true - _(resource.version).must_equal '9.0.30729.6161' + _(resource.version).must_equal '12.12.15.1' _(resource.info).must_equal pkg end diff --git a/test/unit/resources/powershell_test.rb b/test/unit/resources/powershell_test.rb index 2260cae4b..3584d524b 100644 --- a/test/unit/resources/powershell_test.rb +++ b/test/unit/resources/powershell_test.rb @@ -14,19 +14,13 @@ describe 'Inspec::Resources::Powershell' do it 'check if `powershell` for windows is properly generated ' do resource = MockLoader.new(:windows).load_resource('powershell', ps1_script) - if Gem.loaded_specs['winrm'].version < Gem::Version.new('1.6.1') - _(resource.command).must_equal 'powershell -encodedCommand IAAgACAAIAAjACAAYwBhAGwAbAAgAGgAZQBsAHAAIABmAG8AcgAgAGcAZQB0ACAAYwBvAG0AbQBhAG4AZAAKACAAIAAgACAARwBlAHQALQBIAGUAbABwACAARwBlAHQALQBDAG8AbQBtAGEAbgBkAAoA' - else - _(resource.command).must_equal 'powershell -encodedCommand JABQAHIAbwBnAHIAZQBzAHMAUAByAGUAZgBlAHIAZQBuAGMAZQA9ACcAUwBpAGwAZQBuAHQAbAB5AEMAbwBuAHQAaQBuAHUAZQAnADsAIAAgACAAIAAjACAAYwBhAGwAbAAgAGgAZQBsAHAAIABmAG8AcgAgAGcAZQB0ACAAYwBvAG0AbQBhAG4AZAAKACAAIAAgACAARwBlAHQALQBIAGUAbABwACAARwBlAHQALQBDAG8AbQBtAGEAbgBkAAoA' - end + # string should be the same + _(resource.command.to_s).must_equal ps1_script end it 'check if legacy `script` for windows is properly generated ' do resource = MockLoader.new(:windows).load_resource('script', ps1_script) - if Gem.loaded_specs['winrm'].version < Gem::Version.new('1.6.1') - _(resource.command).must_equal 'powershell -encodedCommand IAAgACAAIAAjACAAYwBhAGwAbAAgAGgAZQBsAHAAIABmAG8AcgAgAGcAZQB0ACAAYwBvAG0AbQBhAG4AZAAKACAAIAAgACAARwBlAHQALQBIAGUAbABwACAARwBlAHQALQBDAG8AbQBtAGEAbgBkAAoA' - else - _(resource.command).must_equal 'powershell -encodedCommand JABQAHIAbwBnAHIAZQBzAHMAUAByAGUAZgBlAHIAZQBuAGMAZQA9ACcAUwBpAGwAZQBuAHQAbAB5AEMAbwBuAHQAaQBuAHUAZQAnADsAIAAgACAAIAAjACAAYwBhAGwAbAAgAGgAZQBsAHAAIABmAG8AcgAgAGcAZQB0ACAAYwBvAG0AbQBhAG4AZAAKACAAIAAgACAARwBlAHQALQBIAGUAbABwACAARwBlAHQALQBDAG8AbQBtAGEAbgBkAAoA' - end + # string should be the same + _(resource.command.to_s).must_equal ps1_script end end diff --git a/test/unit/resources/processes_test.rb b/test/unit/resources/processes_test.rb index 45dc6be48..bcf47977d 100644 --- a/test/unit/resources/processes_test.rb +++ b/test/unit/resources/processes_test.rb @@ -12,61 +12,62 @@ describe 'Inspec::Resources::Processes' do end it 'verify processes resource' do - resource = MockLoader.new(:freebsd10).load_resource('processes', '/bin/bash') - _(resource.list.length).must_equal 1 + resource = MockLoader.new(:freebsd10).load_resource('processes', 'login -fp apop') + _(resource.list.length).must_equal 2 _(resource.list[0].to_h).must_equal({ label: nil, - user: 'root', - pid: 1, - cpu: '0.0', + pid: 7115, + cpu: '0.3', mem: '0.0', - vsz: 18084, - rss: 3228, - tty: '?', - stat: 'Ss', - start: '14:15', - time: '0:00', - command: '/bin/bash', + vsz: 2516588, + rss: 3052, + tty: 'ttys008', + stat: 'U', + start: 'Fri05PM', + time: '0:00.05', + user: 'root', + command: 'login -fp apop', }) end it 'verify processes resource on linux os' do - resource = MockLoader.new(:centos6).load_resource('processes', '/sbin/init') + resource = MockLoader.new(:centos6).load_resource('processes', 'postgres: bifrost bifrost') _(resource.list.length).must_equal 1 _(resource.list[0].to_h).must_equal({ - label: 'system_u:system_r:kernel_t:s0', - user: 'root', - pid: 1, + label: 'system_u:system_r:init_t:s0', + pid: 5127, cpu: '0.0', - mem: '0.0', - vsz: 19232, - rss: 1492, + mem: '0.2', + vsz: 547208, + rss: 5376, tty: '?', stat: 'Ss', - start: 'May04', - time: '0:01', - command: '/sbin/init', + start: '10:54:22', + time: '00:00:00', + user: 'opscode-pgsql', + command: 'postgres: bifrost bifrost 127.0.0.1(43699) idle', }) end it 'access attributes of a process' do - resource = MockLoader.new(:centos6).load_resource('processes', '/sbin/init') + resource = MockLoader.new(:centos6).load_resource('processes', 'postgres: bifrost bifrost') process = resource.list[0] - process.user.must_equal 'root' - process[:user].must_equal 'root' - process['user'].must_equal 'root' - process[1].must_equal 'root' + process.user.must_equal 'opscode-pgsql' + process[:user].must_equal 'opscode-pgsql' + process['user'].must_equal 'opscode-pgsql' + process[-1].must_equal 'postgres: bifrost bifrost 127.0.0.1(43699) idle' + process[1].must_equal 5127 end it 'retrieves the users and states as arrays' do - resource = MockLoader.new(:freebsd10).load_resource('processes', 'svc') - _(resource.users.sort).must_equal ['noot'] - _(resource.states.sort).must_equal ['S', 'Ss'] + resource = MockLoader.new(:freebsd10).load_resource('processes', 'login -fp apop') + _(resource.users.sort).must_equal ['apop', 'root'] + _(resource.states.sort).must_equal ['Ss', 'U'] end it 'retrieves the users and states as arrays on linux os' do - resource = MockLoader.new(:centos6).load_resource('processes', 'crypto/0') - _(resource.users.sort).must_equal ['root'] - _(resource.states.sort).must_equal ['S'] + resource = MockLoader.new(:centos6).load_resource('processes', 'postgres: bifrost bifrost') + _(resource.users.sort).must_equal ['opscode-pgsql'] + _(resource.states.sort).must_equal ['Ss'] end end diff --git a/test/unit/resources/security_policy_test.rb b/test/unit/resources/security_policy_test.rb index 6d9806db1..278a4ef08 100644 --- a/test/unit/resources/security_policy_test.rb +++ b/test/unit/resources/security_policy_test.rb @@ -10,7 +10,7 @@ describe 'Inspec::Resources::SecurityPolicy' do resource = load_resource('security_policy') _(resource.MaximumPasswordAge).must_equal 42 _(resource.send('MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Setup\RecoveryConsole\SecurityLevel')).must_equal '4,0' - _(resource.SeUndockPrivilege).must_equal '*S-1-5-32-544' - _(resource.SeRemoteInteractiveLogonRight).must_equal '*S-1-5-32-544,*S-1-5-32-555' + _(resource.SeUndockPrivilege).must_equal ["S-1-5-32-544"] + _(resource.SeRemoteInteractiveLogonRight).must_equal ["S-1-5-32-544","S-1-5-32-555"] end end diff --git a/test/unit/resources/service_test.rb b/test/unit/resources/service_test.rb index b1b91cfdf..0bf7d9f7f 100644 --- a/test/unit/resources/service_test.rb +++ b/test/unit/resources/service_test.rb @@ -19,6 +19,7 @@ describe 'Inspec::Resources::Service' do _(resource.installed?).must_equal true _(resource.enabled?).must_equal true _(resource.running?).must_equal true + _(resource.startmode). must_equal 'Auto' _(resource.params).must_equal params end @@ -74,6 +75,58 @@ describe 'Inspec::Resources::Service' do _(resource.params).must_equal params end + # linux mint 17 with upstart + it 'verify mint package parsing' do + resource = MockLoader.new(:mint17).load_resource('service', 'ssh') + params = Hashie::Mash.new({}) + _(resource.type).must_equal 'upstart' + _(resource.name).must_equal 'ssh' + _(resource.description).must_equal nil + _(resource.installed?).must_equal true + _(resource.enabled?).must_equal true + _(resource.running?).must_equal true + _(resource.params).must_equal params + end + + it 'verify mint package parsing with default upstart_service' do + resource = MockLoader.new(:mint17).load_resource('upstart_service', 'ssh') + params = Hashie::Mash.new({}) + _(resource.type).must_equal 'upstart' + _(resource.name).must_equal 'ssh' + _(resource.description).must_equal nil + _(resource.installed?).must_equal true + _(resource.enabled?).must_equal true + _(resource.running?).must_equal true + _(resource.params).must_equal params + _(resource.params.UnitFileState).must_equal nil + end + + # mint 18 with systemd + it 'verify mint package parsing' do + resource = MockLoader.new(:mint18).load_resource('service', 'sshd') + params = Hashie::Mash.new({ 'ActiveState' => 'active', 'Description' => 'OpenSSH server daemon', 'Id' => 'sshd.service', 'LoadState' => 'loaded', 'Names' => 'sshd.service', 'SubState' => 'running', 'UnitFileState' => 'enabled' }) + _(resource.type).must_equal 'systemd' + _(resource.name).must_equal 'sshd.service' + _(resource.description).must_equal 'OpenSSH server daemon' + _(resource.installed?).must_equal true + _(resource.enabled?).must_equal true + _(resource.running?).must_equal true + _(resource.params).must_equal params + _(resource.params.SubState).must_equal 'running' + end + + it 'verify mint package parsing with default systemd_service' do + resource = MockLoader.new(:mint18).load_resource('systemd_service', 'sshd') + params = Hashie::Mash.new({ 'ActiveState' => 'active', 'Description' => 'OpenSSH server daemon', 'Id' => 'sshd.service', 'LoadState' => 'loaded', 'Names' => 'sshd.service', 'SubState' => 'running', 'UnitFileState' => 'enabled' }) + _(resource.type).must_equal 'systemd' + _(resource.name).must_equal 'sshd.service' + _(resource.description).must_equal 'OpenSSH server daemon' + _(resource.installed?).must_equal true + _(resource.enabled?).must_equal true + _(resource.running?).must_equal true + _(resource.params).must_equal params + end + # centos 6 with sysv it 'verify centos 6 package parsing' do resource = MockLoader.new(:centos6).load_resource('service', 'sshd') diff --git a/test/unit/resources/sys_info_test.rb b/test/unit/resources/sys_info_test.rb new file mode 100644 index 000000000..c0ac932f7 --- /dev/null +++ b/test/unit/resources/sys_info_test.rb @@ -0,0 +1,25 @@ +# encoding: utf-8 +# author: Christoph Hartmann +# author: Dominik Richter + +require 'helper' +require 'inspec/resource' + +describe 'Inspec::Resources::SysInfo' do + describe 'sys_info' do + it 'check ssh config parsing for Ubuntu' do + resource = MockLoader.new(:ubuntu1504).load_resource('sys_info') + _(resource.hostname).must_equal 'example.com' + end + + it 'check ssh config parsing for Ubuntu' do + resource = MockLoader.new(:windows).load_resource('sys_info') + _(resource.hostname).must_equal 'WIN-CIV7VMLVHLD' + end + + it 'check ssh config parsing for freebsd' do + resource = MockLoader.new(:freebsd10).load_resource('sys_info') + _(resource.hostname).must_equal 'The `sys_info.hostname` resource is not supported on your OS yet.' + end + end +end diff --git a/test/unit/resources/user_test.rb b/test/unit/resources/user_test.rb index bb514dcae..b5ca93ccf 100644 --- a/test/unit/resources/user_test.rb +++ b/test/unit/resources/user_test.rb @@ -99,19 +99,28 @@ describe 'Inspec::Resources::User' do end it 'read user on Windows' do - resource = MockLoader.new(:windows).load_resource('user', 'example/Administrator') + resource = MockLoader.new(:windows).load_resource('user', 'Administrator') + _(resource.uid).wont_be_nil _(resource.exists?).must_equal true _(resource.group).must_equal nil - _(resource.groups).must_equal ['WIN-K0AKLED332V\\Administrators', 'EXAMPLE\\Domain Admins'] + _(resource.groups).must_equal nil _(resource.home).must_equal nil _(resource.shell).must_equal nil _(resource.mindays).must_equal nil _(resource.maxdays).must_equal nil _(resource.warndays).must_equal nil + _(resource.disabled?).must_equal false + end + + it 'read disabled user on Windows' do + resource = MockLoader.new(:windows).load_resource('user', 'Guest') + _(resource.uid).wont_be_nil + _(resource.exists?).must_equal true + _(resource.disabled?).must_equal true end it 'read user on undefined os' do - resource = MockLoader.new(:undefined).load_resource('user', 'example/Administrator') + resource = MockLoader.new(:undefined).load_resource('user', 'root') _(resource.exists?).must_equal false _(resource.group).must_equal nil _(resource.groups).must_equal nil diff --git a/test/unit/resources/vbscript_test.rb b/test/unit/resources/vbscript_test.rb index 1f72c8a48..853a5d92a 100644 --- a/test/unit/resources/vbscript_test.rb +++ b/test/unit/resources/vbscript_test.rb @@ -13,6 +13,6 @@ describe 'Inspec::Resources::VbScript' do it 'check if `vbscript` for windows is properly generated ' do resource = MockLoader.new(:windows).load_resource('vbscript', vb_script) - _(resource.command).must_equal 'powershell -encodedCommand JABQAHIAbwBnAHIAZQBzAHMAUAByAGUAZgBlAHIAZQBuAGMAZQA9ACcAUwBpAGwAZQBuAHQAbAB5AEMAbwBuAHQAaQBuAHUAZQAnADsAJAB2AGIAcwBjAHIAaQBwAHQAIAA9ACAAQAAiAAoAIAAgACAAIABXAFMAYwByAGkAcAB0AC4ARQBjAGgAbwAgACIAaABlAGwAbABvACAAdgBiAHMAYwByAGkAcAB0ACIACgAKACIAQAAKACQAZgBpAGwAZQBuAGEAbQBlACAAPQAgAFsAUwB5AHMAdABlAG0ALgBJAE8ALgBQAGEAdABoAF0AOgA6AEcAZQB0AFQAZQBtAHAARgBpAGwAZQBOAGEAbQBlACgAKQAgACsAIAAiAC4AdgBiAHMAIgAKAE4AZQB3AC0ASQB0AGUAbQAgACQAZgBpAGwAZQBuAGEAbQBlACAALQB0AHkAcABlACAAZgBpAGwAZQAgAC0AZgBvAHIAYwBlACAALQB2AGEAbAB1AGUAIAAkAHYAYgBzAGMAcgBpAHAAdAAgAHwAIABPAHUAdAAtAE4AdQBsAGwACgBjAHMAYwByAGkAcAB0AC4AZQB4AGUAIAAvAG4AbwBsAG8AZwBvACAAJABmAGkAbABlAG4AYQBtAGUACgBSAGUAbQBvAHYAZQAtAEkAdABlAG0AIAAkAGYAaQBsAGUAbgBhAG0AZQAgAHwAIABPAHUAdAAtAE4AdQBsAGwACgA=' + _(resource.command.to_s).must_include vb_script end end diff --git a/test/unit/source_readers/flat_test.rb b/test/unit/source_readers/flat_test.rb index 770eaeea8..254a94544 100644 --- a/test/unit/source_readers/flat_test.rb +++ b/test/unit/source_readers/flat_test.rb @@ -13,8 +13,8 @@ describe SourceReaders::Flat do end describe 'with a flat file' do - let(:target) { Inspec::Fetcher.resolve(__FILE__) } - let(:res) { Inspec::SourceReader.resolve(target.relative_target) } + let(:target) { Inspec::FileProvider.for_path(__FILE__) } + let(:res) { Inspec::SourceReader.resolve(target.relative_provider) } it 'resolves the target' do _(res).must_be_kind_of reader @@ -35,8 +35,8 @@ describe SourceReaders::Flat do end describe 'with a flat folder' do - let(:target) { Inspec::Fetcher.resolve(File.dirname(__FILE__)) } - let(:res) { Inspec::SourceReader.resolve(target.relative_target) } + let(:target) { Inspec::FileProvider.for_path(File.dirname(__FILE__)) } + let(:res) { Inspec::SourceReader.resolve(target.relative_provider) } it 'resolves the target' do _(res).must_be_kind_of reader diff --git a/test/unit/source_readers/inspec_test.rb b/test/unit/source_readers/inspec_test.rb index 56caf58e7..177fd3073 100644 --- a/test/unit/source_readers/inspec_test.rb +++ b/test/unit/source_readers/inspec_test.rb @@ -13,8 +13,8 @@ describe SourceReaders::InspecReader do end describe 'with a valid profile' do - let(:mock_file) { mock_file = MockLoader.profile_tgz('complete-profile') } - let(:target) { Inspec::Fetcher.resolve(mock_file) } + let(:mock_file) { MockLoader.profile_tgz('complete-profile') } + let(:target) { Inspec::FileProvider.for_path(mock_file) } let(:res) { Inspec::SourceReader.resolve(target) } it 'resolves the target to inspec' do @@ -27,12 +27,12 @@ describe SourceReaders::InspecReader do it 'retrieves all files' do _(res.tests.keys).must_equal %w{controls/filesystem_spec.rb} - _(res.tests.values[0]).must_match /^control 'test01' do$/ + _(res.tests.values[0]).must_match(/^control 'test01' do$/) end it 'retrieves all libraries' do _(res.libraries.keys).must_equal %w{libraries/testlib.rb} - _(res.libraries.values[0]).must_match /^# Library resource$/ + _(res.libraries.values[0]).must_match(/^# Library resource$/) end end end diff --git a/test/unit/utils/filter_table_test.rb b/test/unit/utils/filter_table_test.rb index c8c1dbc04..aaff04b1f 100644 --- a/test/unit/utils/filter_table_test.rb +++ b/test/unit/utils/filter_table_test.rb @@ -28,6 +28,16 @@ describe FilterTable do factory.must_be_kind_of FilterTable::Factory end + it 'supports empty arrays' do + factory.add_accessor(:where).add(:baz).connect(resource, :data) + resource.new([]).where { false }.params.must_equal [] + end + + it 'supports nil arrays' do + factory.add_accessor(:where).add(:baz).connect(resource, :data) + resource.new(nil).where { false }.params.must_equal [] + end + it 'retrieves the resource from all entries' do factory.add_accessor(:where) .add(:baz?) { |x| x.resource } diff --git a/www/.gitignore b/www/.gitignore new file mode 100644 index 000000000..ea10d7e67 --- /dev/null +++ b/www/.gitignore @@ -0,0 +1,21 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. +# +# If you find yourself ignoring temporary files generated by your text editor +# or operating system, you probably want to add a global ignore instead: +# git config --global core.excludesfile ~/.gitignore_global + +# Ignore bundler config +/.bundle + +# Ignore the build directory +/build + +# Ignore cache +/.sass-cache +/.cache + +# Ignore .DS_store file +.DS_Store + +# Ignore rendered files from docs/ +source/docs/reference/ diff --git a/www/Gemfile b/www/Gemfile new file mode 100644 index 000000000..64f16c703 --- /dev/null +++ b/www/Gemfile @@ -0,0 +1,21 @@ +# encoding: utf-8 +# If you do not have OpenSSL installed, update +# the following line to use 'http://' instead +source 'https://rubygems.org' + +gem 'slim', '>= 3.0' + +# For faster file watcher updates on Windows: +gem 'wdm', '~> 0.1.0', platforms: [:mswin, :mingw] + +# windows does not come with time zone data +gem 'tzinfo-data', platforms: [:mswin, :mingw] + +# Middleman Gems +gem 'middleman-sprockets', '>= 4.0.0' +gem 'middleman-compass', '>= 4.0.0' +gem 'middleman', '>= 4.0.0' +gem 'middleman-livereload' +gem 'middleman-autoprefixer' +gem 'middleman-syntax' +gem 'redcarpet' diff --git a/www/Gemfile.lock b/www/Gemfile.lock new file mode 100644 index 000000000..b0a92b287 --- /dev/null +++ b/www/Gemfile.lock @@ -0,0 +1,156 @@ +GEM + remote: https://rubygems.org/ + specs: + activesupport (4.2.7.1) + i18n (~> 0.7) + json (~> 1.7, >= 1.7.7) + minitest (~> 5.1) + thread_safe (~> 0.3, >= 0.3.4) + tzinfo (~> 1.1) + addressable (2.4.0) + autoprefixer-rails (6.4.1) + execjs + backports (3.6.8) + chunky_png (1.3.7) + coffee-script (2.4.1) + coffee-script-source + execjs + coffee-script-source (1.10.0) + compass (1.0.3) + chunky_png (~> 1.2) + compass-core (~> 1.0.2) + compass-import-once (~> 1.0.5) + rb-fsevent (>= 0.9.3) + rb-inotify (>= 0.9) + sass (>= 3.3.13, < 3.5) + compass-core (1.0.3) + multi_json (~> 1.0) + sass (>= 3.3.0, < 3.5) + compass-import-once (1.0.5) + sass (>= 3.2, < 3.5) + concurrent-ruby (1.0.2) + contracts (0.13.0) + dotenv (2.1.1) + em-websocket (0.5.1) + eventmachine (>= 0.12.9) + http_parser.rb (~> 0.6.0) + erubis (2.7.0) + eventmachine (1.2.0.1) + execjs (2.7.0) + fast_blank (1.0.0) + fastimage (2.0.0) + addressable (~> 2) + ffi (1.9.14) + haml (4.0.7) + tilt + hamster (3.0.0) + concurrent-ruby (~> 1.0) + hashie (3.4.4) + http_parser.rb (0.6.0) + i18n (0.7.0) + json (1.8.3) + kramdown (1.12.0) + listen (3.0.8) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + memoist (0.15.0) + middleman (4.1.10) + coffee-script (~> 2.2) + compass-import-once (= 1.0.5) + haml (>= 4.0.5) + kramdown (~> 1.2) + middleman-cli (= 4.1.10) + middleman-core (= 4.1.10) + sass (>= 3.4.0, < 4.0) + middleman-autoprefixer (2.7.0) + autoprefixer-rails (>= 6.3.1, < 7.0.0) + middleman-core (>= 3.3.3) + middleman-cli (4.1.10) + thor (>= 0.17.0, < 2.0) + middleman-compass (4.0.1) + compass (>= 1.0.0, < 2.0.0) + middleman-core (>= 4.0.0) + middleman-core (4.1.10) + activesupport (~> 4.2) + addressable (~> 2.3) + backports (~> 3.6) + bundler (~> 1.1) + contracts (~> 0.13.0) + dotenv + erubis + execjs (~> 2.0) + fast_blank + fastimage (~> 2.0) + hamster (~> 3.0) + hashie (~> 3.4) + i18n (~> 0.7.0) + listen (~> 3.0.0) + memoist (~> 0.14) + padrino-helpers (~> 0.13.0) + parallel + rack (>= 1.4.5, < 2.0) + sass (>= 3.4) + servolux + tilt (~> 1.4.1) + uglifier (~> 3.0) + middleman-livereload (3.4.6) + em-websocket (~> 0.5.1) + middleman-core (>= 3.3) + rack-livereload (~> 0.3.15) + middleman-sprockets (4.0.0) + middleman-core (~> 4.0) + sprockets (>= 3.0) + middleman-syntax (3.0.0) + middleman-core (>= 3.2) + rouge (~> 2.0) + minitest (5.9.0) + multi_json (1.12.1) + padrino-helpers (0.13.3.2) + i18n (~> 0.6, >= 0.6.7) + padrino-support (= 0.13.3.2) + tilt (>= 1.4.1, < 3) + padrino-support (0.13.3.2) + activesupport (>= 3.1) + parallel (1.9.0) + rack (1.6.4) + rack-livereload (0.3.16) + rack + rb-fsevent (0.9.7) + rb-inotify (0.9.7) + ffi (>= 0.5.0) + redcarpet (3.3.4) + rouge (2.0.6) + sass (3.4.22) + servolux (0.12.0) + slim (3.0.7) + temple (~> 0.7.6) + tilt (>= 1.3.3, < 2.1) + sprockets (3.7.0) + concurrent-ruby (~> 1.0) + rack (> 1, < 3) + temple (0.7.7) + thor (0.19.1) + thread_safe (0.3.5) + tilt (1.4.1) + tzinfo (1.2.2) + thread_safe (~> 0.1) + uglifier (3.0.2) + execjs (>= 0.3.0, < 3) + +PLATFORMS + ruby + +DEPENDENCIES + middleman (>= 4.0.0) + middleman-autoprefixer + middleman-compass (>= 4.0.0) + middleman-livereload + middleman-sprockets (>= 4.0.0) + middleman-syntax + redcarpet + slim (>= 3.0) + tzinfo-data + wdm (~> 0.1.0) + +BUNDLED WITH + 1.11.2 diff --git a/www/README.md b/www/README.md new file mode 100644 index 000000000..33669d57b --- /dev/null +++ b/www/README.md @@ -0,0 +1,52 @@ +# InSpec homepage + +## Development + +Get all dependencies: + +```bash +bundle install +``` + +To run it live run: + +```bash +bundle exec middleman server +``` + +For the online tutorial, take a look at `www/tutorial`. + +## Building + +To build the site to a local static folder (without tutorial): + +```bash +bundle exec middleman build +``` + +To build everything including the online tutorial: + +``` +bundle exec rake www:build +``` + +## Releasing + +To build everything and push a new version of the website, run this command: + +``` +bundle exec rake www +``` + +It will clear everything and build from scratch and create a local `gh-pages` branch with a static version of the website. +Before pushing, it will ask you if you are happy with it. + +**Please verify the site now!** To host the current folder you can run: + +``` +ruby -run -e httpd . -p 8000 +``` + +Open your browser to [localhost:8000](http://localhost:8000). + +If you are happy, you can confirm the site and let the release task push it live. diff --git a/www/config.rb b/www/config.rb new file mode 100644 index 000000000..ced52f01f --- /dev/null +++ b/www/config.rb @@ -0,0 +1,57 @@ +# encoding: utf-8 +require 'slim' + +### +# Page options, layouts, aliases and proxies +### + +# Per-page layout changes: +# +# With no layout +page '/*.xml', layout: false +page '/*.json', layout: false +page '/*.txt', layout: false + +# With alternative layout: we send the sidebar request to the default layout +page 'docs/*', layout: :layout, locals: { sidebar_layout: 'docs' } + +# Proxy pages (http://middlemanapp.com/basics/dynamic-pages/) +# proxy '/this-page-has-no-template.html', '/template-file.html', locals: { +# which_fake_page: 'Rendering a fake page with a local variable' } + +### +# Helpers +### + +# Reload the browser automatically whenever files change +configure :development do + activate :livereload +end + +# Methods defined in the helpers block are available in templates +require 'lib/sidebar_helpers' +helpers SidebarHelpers + +# Methods defined in the helpers block are available in templates +# helpers do +# def some_helper +# 'Helping' +# end +# end +# +# Build-specific configuration +configure :build do + # Minify CSS on build + activate :minify_css + + # Minify Javascript on build + activate :minify_javascript +end + +activate :sprockets +activate :autoprefixer +activate :directory_indexes +activate :syntax +set :trailing_slash, false +set :markdown_engine, :redcarpet +set :markdown, fenced_code_blocks: true, smartypants: true, coderay_line_numbers: :table diff --git a/www/config.ru b/www/config.ru new file mode 100644 index 000000000..f237e0c49 --- /dev/null +++ b/www/config.ru @@ -0,0 +1,14 @@ +# encoding: utf-8 +require 'middleman-core/load_paths' +::Middleman.setup_load_paths + +require 'middleman-core' +require 'middleman-core/rack' + +require 'fileutils' +FileUtils.mkdir('log') unless File.exist?('log') +::Middleman::Logger.singleton("log/#{ENV['RACK_ENV']}.log") + +app = ::Middleman::Application.new + +run ::Middleman::Rack.new(app).to_app diff --git a/www/data/docs_sidebar.yml b/www/data/docs_sidebar.yml new file mode 100644 index 000000000..aa43e470c --- /dev/null +++ b/www/data/docs_sidebar.yml @@ -0,0 +1,32 @@ +--- +sidebar_links: +- title: Getting Started + links: + - title: Overview + link: "/docs" + - title: Get InSpec + link: "https://downloads.chef.io/inspec" + - title: Tutorials + link: "/docs/tutorials.html" + - title: InSpec and friends + link: "/docs/reference/inspec_and_friends.html" +- title: Reference + links: + - title: inspec executable + link: "/docs/reference/cli.html" + - title: Profiles + link: "/docs/reference/profiles.html" + - title: Resources + link: "/docs/reference/resources.html" + - title: Matchers + link: "/docs/reference/matchers.html" + - title: InSpec DSL + link: "/docs/reference/dsl_inspec.html" + - title: Resource DSL + link: "/docs/reference/dsl_resource.html" + - title: kitchen-inspec + link: "/docs/reference/plugin_kitchen_inspec.html" + - title: inspec shell + link: "/docs/reference/shell.html" + - title: Ruby usage + link: "/docs/reference/ruby_usage.html" diff --git a/www/lib/sidebar_helpers.rb b/www/lib/sidebar_helpers.rb new file mode 100644 index 000000000..d9ca03ef6 --- /dev/null +++ b/www/lib/sidebar_helpers.rb @@ -0,0 +1,46 @@ +# encoding: utf-8 +# helper methods for source/layouts/sidebar.slim +module SidebarHelpers + SIDEBAR_LAYOUTS = %w{docs}.freeze + + def sidebar_data(sidebar_layout) + unless SIDEBAR_LAYOUTS.include?(sidebar_layout) + fail "'#{sidebar_layout}' is not a valid sidebar layout type." + end + + data.public_send(:"#{sidebar_layout}_sidebar").sidebar_links.dup + end + + def link_classes(current_url, item_link) + 'is-active' if same_link?(current_url, item_link.link) + end + + def print_sub_links?(current_url, item_link) + return false unless sub_links?(item_link) + + same_link?(item_link.link, current_url) || + active_child?(current_url, item_link) + end + + def same_link?(one, two) + strip_trailing_slash(one) == strip_trailing_slash(two) + end + + def strip_trailing_slash(str) + str.end_with?('/') ? str[0..-2] : str + end + + def active_child?(current_url, item_link) + return false unless sub_links?(item_link) + + sub_link_urls(item_link).include?(strip_trailing_slash(current_url)) + end + + def sub_links?(item_link) + item_link.respond_to?(:sub_links) && item_link.sub_links.count > 0 + end + + def sub_link_urls(item) + item.sub_links.collect { |sub| strip_trailing_slash(sub.link) } + end +end diff --git a/www/source/community.html.slim b/www/source/community.html.slim new file mode 100644 index 000000000..8d7d553ff --- /dev/null +++ b/www/source/community.html.slim @@ -0,0 +1,42 @@ +--- +title: InSpec - Community +description: This is where you interact with the InSpec open source community - contribute to the project, provide feedback and ask questions of other community members. +--- + +.row + .columns.large-10.large-offset-1 + img.hero--img src="/images/community/community-icon.png" + h1.hero--heading InSpec Community + h2.hero--subhead.text-center + | Let's build together +.icon-blocks.row + .columns.medium-4.center + img.icon-block--img src="/images/community/contribute-icon.png" + h3.icon-block--heading Contribute to InSpec + .columns.medium-4.center + img.icon-block--img src="/images/community/get-icon.png" + h3.icon-block--heading Get Answers Quickly + .columns.medium-4.center + img.icon-block--img src="/images/community/report-icon.png" + h3.icon-block--heading Report Bugs and Request Features +.icon-blocks.row + .columns.medium-4 + p.icon-block--text + | InSpec is an open source project created and supported by active and + passionate users. If you would like to contribute, we would love to have you. + .columns.medium-4 + p.icon-block--text + | Is something unclear or are you just feeling stuck? We're here to + help keep you moving. Chat with us on Slack, so we can help you keep + moving. + .columns.medium-4 + p.icon-block--text + | We rely on your feedback to improve InSpec. Whether you found a bug + or have a great idea for an improvement, join us on GitHub. +.icon-blocks.row + .columns.medium-4 + a.button.primary.block href="https://github.com/chef/inspec" Start Contributing + .columns.medium-4 + a.button.primary.block href="https://community-slack.chef.io" Get Help + .columns.medium-4 + a.button.primary.block href="https://github.com/chef/inspec/issues" Give Feedback diff --git a/www/source/docs/index.html.slim b/www/source/docs/index.html.slim new file mode 100644 index 000000000..3a93cf8de --- /dev/null +++ b/www/source/docs/index.html.slim @@ -0,0 +1,23 @@ +h1 InSpec Documentation + +p Welcome to the InSpec documentation! This is a reference guide for all available features and options. + +p In the navigation, you will see 2 sections. The first provides a few links to get started and context around InSpec. The second section contains references to all elements of InSpec: The DSL, CLI, profiles, resources, and matchers. + +h2 Are you new to InSpec? + +p If you're just getting started and want a quick introduction, then we recommend you start with the following items in the order listed. + +.row + .columns.medium-6.center + a.button.try-demo href="#" Try InSpec demo + p Complete a short interactive demo + .columns.medium-6.center + a.button.try-demo href="tutorials" Tutorials + p Get your first hands-on experience + +h2 Contributing + +p This documentation is automatically generated from the InSpec repository and source code. + +p To contribute, please have a look at the docs folder of the project. diff --git a/www/source/docs/search.html.slim b/www/source/docs/search.html.slim new file mode 100644 index 000000000..8e3396501 --- /dev/null +++ b/www/source/docs/search.html.slim @@ -0,0 +1,19 @@ +--- +title: Search InSpec Docs +--- + +h2 Search the InSpec Documentation + +javascript: + // TODO: add the inspec search here + (function() { + var cx = '014746884379529974319:rvxyzhpu2us'; + var gcse = document.createElement('script'); + gcse.type = 'text/javascript'; + gcse.async = true; + gcse.src = 'https://cse.google.com/cse.js?cx=' + cx; + var s = document.getElementsByTagName('script')[0]; + s.parentNode.insertBefore(gcse, s); + })(); + + diff --git a/www/source/docs/tutorials.html.md b/www/source/docs/tutorials.html.md new file mode 100644 index 000000000..f2b478855 --- /dev/null +++ b/www/source/docs/tutorials.html.md @@ -0,0 +1,23 @@ +# InSpec Tutorials + +The following tutorial provides step-by-step instructions on how easy it is to build, configure, deploy, and manage applications in Habitat. Huge thanks to Annie Hedgpeth for these fantastic guides! + +* [Day 1 - Hello World](http://www.anniehedgie.com/inspec-basics-1) +* [Day 2 - Command Resource Blog Logo](http://www.anniehedgie.com/inspec-basics-2) +* [Day 3 - File Resource](http://www.anniehedgie.com/inspec-basics-3) +* [Day 4 - Custom Matchers](http://www.anniehedgie.com/inspec-basics-4) +* [Day 5 - Creating a Profile](http://www.anniehedgie.com/inspec-basics-5) +* [Day 6 - Ways to Run It and Places to Store It](http://www.anniehedgie.com/inspec-basics-6) +* [Day 7 - How to Inherit a Profile from Chef Compliance Server](http://www.anniehedgie.com/inspec-basics-7) + +Additionally, these are great guides for specific areas or more advanced topics: + +* [Windows infrastructure testing using InSpec – Part I](http://datatomix.com/?p=236) +* [Windows infrastructure testing using InSpec and Profiles – Part II](http://datatomix.com/?p=238) +* [Operating InSpec in an air-gapped environment](https://github.com/jeremymv2/chef-intranet-scaffolding/blob/master/README.md) +* [Testing Ansible with InSpec](http://scienceofficersblog.blogspot.de/2016/02/testing-ansible-with-inspec.html) + +Podcasts: + +* [InSpec Foodfight](http://foodfightshow.org/2016/02/inspec.html) +* [Test Driven Infrastructure With Arthur Maltson And Michael Goetz](https://www.arresteddevops.com/tdi/) diff --git a/www/source/favicon.ico b/www/source/favicon.ico new file mode 100644 index 000000000..2c0cfc708 Binary files /dev/null and b/www/source/favicon.ico differ diff --git a/www/source/favicon.png b/www/source/favicon.png new file mode 100644 index 000000000..024453a8f Binary files /dev/null and b/www/source/favicon.png differ diff --git a/www/source/fonts/jaapokki-regular-webfont.eot b/www/source/fonts/jaapokki-regular-webfont.eot new file mode 100755 index 000000000..be9c0caeb Binary files /dev/null and b/www/source/fonts/jaapokki-regular-webfont.eot differ diff --git a/www/source/fonts/jaapokki-regular-webfont.ttf b/www/source/fonts/jaapokki-regular-webfont.ttf new file mode 100755 index 000000000..3296c2472 Binary files /dev/null and b/www/source/fonts/jaapokki-regular-webfont.ttf differ diff --git a/www/source/fonts/jaapokki-regular-webfont.woff b/www/source/fonts/jaapokki-regular-webfont.woff new file mode 100755 index 000000000..4b20ed5b1 Binary files /dev/null and b/www/source/fonts/jaapokki-regular-webfont.woff differ diff --git a/www/source/fonts/jaapokki-regular-webfont.woff2 b/www/source/fonts/jaapokki-regular-webfont.woff2 new file mode 100755 index 000000000..1bc2ea8f2 Binary files /dev/null and b/www/source/fonts/jaapokki-regular-webfont.woff2 differ diff --git a/www/source/fonts/jaapokkisubtract-regular-webfont.eot b/www/source/fonts/jaapokkisubtract-regular-webfont.eot new file mode 100755 index 000000000..a69a39a46 Binary files /dev/null and b/www/source/fonts/jaapokkisubtract-regular-webfont.eot differ diff --git a/www/source/fonts/jaapokkisubtract-regular-webfont.ttf b/www/source/fonts/jaapokkisubtract-regular-webfont.ttf new file mode 100755 index 000000000..cb0a05585 Binary files /dev/null and b/www/source/fonts/jaapokkisubtract-regular-webfont.ttf differ diff --git a/www/source/fonts/jaapokkisubtract-regular-webfont.woff b/www/source/fonts/jaapokkisubtract-regular-webfont.woff new file mode 100755 index 000000000..325ae98bf Binary files /dev/null and b/www/source/fonts/jaapokkisubtract-regular-webfont.woff differ diff --git a/www/source/fonts/jaapokkisubtract-regular-webfont.woff2 b/www/source/fonts/jaapokkisubtract-regular-webfont.woff2 new file mode 100755 index 000000000..de6e4018f Binary files /dev/null and b/www/source/fonts/jaapokkisubtract-regular-webfont.woff2 differ diff --git a/www/source/fonts/roboto-light-webfont.eot b/www/source/fonts/roboto-light-webfont.eot new file mode 100755 index 000000000..b19ce9f3a Binary files /dev/null and b/www/source/fonts/roboto-light-webfont.eot differ diff --git a/www/source/fonts/roboto-light-webfont.ttf b/www/source/fonts/roboto-light-webfont.ttf new file mode 100755 index 000000000..898bfdcd3 Binary files /dev/null and b/www/source/fonts/roboto-light-webfont.ttf differ diff --git a/www/source/fonts/roboto-light-webfont.woff b/www/source/fonts/roboto-light-webfont.woff new file mode 100755 index 000000000..3170ebd44 Binary files /dev/null and b/www/source/fonts/roboto-light-webfont.woff differ diff --git a/www/source/fonts/roboto-light-webfont.woff2 b/www/source/fonts/roboto-light-webfont.woff2 new file mode 100755 index 000000000..4654c183d Binary files /dev/null and b/www/source/fonts/roboto-light-webfont.woff2 differ diff --git a/www/source/fonts/roboto-medium-webfont.eot b/www/source/fonts/roboto-medium-webfont.eot new file mode 100755 index 000000000..9a8f25fd0 Binary files /dev/null and b/www/source/fonts/roboto-medium-webfont.eot differ diff --git a/www/source/fonts/roboto-medium-webfont.ttf b/www/source/fonts/roboto-medium-webfont.ttf new file mode 100755 index 000000000..c506157b8 Binary files /dev/null and b/www/source/fonts/roboto-medium-webfont.ttf differ diff --git a/www/source/fonts/roboto-medium-webfont.woff b/www/source/fonts/roboto-medium-webfont.woff new file mode 100755 index 000000000..f8fe2ad3a Binary files /dev/null and b/www/source/fonts/roboto-medium-webfont.woff differ diff --git a/www/source/fonts/roboto-medium-webfont.woff2 b/www/source/fonts/roboto-medium-webfont.woff2 new file mode 100755 index 000000000..884e60517 Binary files /dev/null and b/www/source/fonts/roboto-medium-webfont.woff2 differ diff --git a/www/source/images/chef-logo.png b/www/source/images/chef-logo.png new file mode 100644 index 000000000..511fff71b Binary files /dev/null and b/www/source/images/chef-logo.png differ diff --git a/www/source/images/community/community-icon.png b/www/source/images/community/community-icon.png new file mode 100755 index 000000000..277487a78 Binary files /dev/null and b/www/source/images/community/community-icon.png differ diff --git a/www/source/images/community/contribute-icon.png b/www/source/images/community/contribute-icon.png new file mode 100755 index 000000000..cad70e0df Binary files /dev/null and b/www/source/images/community/contribute-icon.png differ diff --git a/www/source/images/community/get-icon.png b/www/source/images/community/get-icon.png new file mode 100755 index 000000000..260834c3f Binary files /dev/null and b/www/source/images/community/get-icon.png differ diff --git a/www/source/images/community/report-icon.png b/www/source/images/community/report-icon.png new file mode 100755 index 000000000..4065d3297 Binary files /dev/null and b/www/source/images/community/report-icon.png differ diff --git a/www/source/images/home/code-1.png b/www/source/images/home/code-1.png new file mode 100755 index 000000000..8a3f4d4dd Binary files /dev/null and b/www/source/images/home/code-1.png differ diff --git a/www/source/images/home/code-1.svg b/www/source/images/home/code-1.svg new file mode 100755 index 000000000..eeaed527c --- /dev/null +++ b/www/source/images/home/code-1.svg @@ -0,0 +1,12973 @@ + + + + + + + + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + eJzsveuOHbmVJvoE8Q77/GjAHrS2gwwGGfQZDLAvmX180O42XO6eHgwGBblKLmtaJRVUKvf4PP35 +vsVL8LYzU6VylexWEpJS+xLBIBfX9Vtr/d3/9ZvPnp2+fPP7F8+W43yY/u7vLm9fPH/35u0vD/Lq +4VevXn337bu3fOlnv/35QbnjjA+dfrV9Hj/4ry/efvvyzetfHvR8VPLmPb/9s9PrL/98+M3zt2/+ +8IefH372c7z+u5fvXr3AO1+8+fLFM/X747d/+urn6Ya4wvX5O7yr5l+4Xyh78L9U+nD6Nd9//vpP +z7/99uX/x3ftsi147fzmu9dfvnz91fnN/8GLXh+eOasOdlaHZ8YafOD/efnbF9+2nzp6Z/3mnbGz +N/wKZmy882pVdps9vj8f9bzOm17VaqyWix2Vt7OZ7WaWVePK1zdffPf1i9fvfvP2zRcvvv328ubV +m7ff/vJw+fPz14dfP/8K7zw//I8Xr169+Y8Jy7R+fv/y1QusyNfP3x3UwvU5/Urpz8/fvXz15T99 +9/XvX2CtlDN8eflcLvYv3+IquCB/58vu8199jVc+e/HuHZ4Ft+Ia//YfzuUE8KKMn/3P37746qXs +F1b0f/08Xvbtm2++fv7237/9wVaBV/3di6+/eYU9k9VdvD2uh2dWafxT/id+FosQdmE7rl7Ni1XL +7Jzzh2cet1NOe2XVPK+bOrhVl5/ZDs8WbaqPhGvuG/HiTy9f/McvD//05vWLsOant+8+C/RizDyH +v8M7v/3u1Yu3//L65buwjqdf+bDovwZNvsLn8/fvXz2XtZah9r/DB373/O1XL96BxN68+u6dUP+W +7oBN/cfnf35BmpCrKff5GXvyGvd5/Q7T/fzlHz7/Uzgzn3/17pfKhY/5z//5mxevf/fmX+VRnmER +DkYf5uPqOP3tsBmFxZN5PDOHZcszU/vf8XanV+9evH2NnUm3/IGvf/f6y8/jqX/xZXmPVe7BO6QV +cCDV34B4//ntSyzBLz0uji3cAln/w9uXX+5U7fRhC3/JOh+xoPxRoNjZa//UV7z8gBuATuQBH30l +rA72+x2eI22a/vzy6+LEzcdff4ZHwZNf3nxNovuWTIjbilP46s1X4b38u7yDr3/3TViWQACgz9+8 +ffma15z+Sd7ZPv/Nq+/w1j+8ffPdN796/Yc3088C1/3XF1+AtYKEvzz88+//N/4DFipc4PC7t8+/ +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 +L/71gOWguHIUyLpYSIITqnR0ZNGgG7VvyTxqS8JCq7rGtIIguS4FoD7uOPiLqBB82OfzvEKGF5FB +6vgWxR47JPyKCQGBFk/ksbM5aQ5UidCJ2CveKf0SqTD11zC6FqWFrFtgLvcTksYwKbV9FfCalo+L +d9UmCgXwpjJgKAzuJ4dq7U/icP6UYB+Ztz/Jvv0jD3bhEts+JdT6P35NS+btz/787R//4adPlt7+ +8q9/+OFf3v7sr37xd7/88cdvf/f9N7/4/Td/+8vffP/NVz/89j+++eGfv/mbX//mx//yux/+9bdx +0td/8fff/vbbX/747a+/2af47OLWz17B9faXf//tLz87IKf84Xff/OfffPfN3337u199+/2P3/wf +3/5HHLe+/eUvvv/xRTT/9cv/51++jQv/+odfvf8NBcrjnRqIvJ8643//zf77f/jNr3/8n/GH7adO +9ne/+/bffvPtv+9z/cvvf/K+fPIz9jX95tvff3JFPxn99bf//OM3+/b/r7/74fsffy74v//w24+x +ex30B3/d//btb/7H//zx/+fP+/sf/v33Lx/n33zxv/zVL8o3f/P9r89f8u/Gv7/5rz98/3f7pf1x +v7d/8Rex+a+//R/7Kj/Z8cV//S17Zuz569/96+//532cP/s/v//+l999++u3/udfXG9/tf//P/77 +F7LK//X9v/7zF59RyK+3/33/j/93b/r3t/r2t2//1/99vf2av/z7L/5iT1yIQOIo8CW0hr9AGoOa +cb+3ff3Zto4QEk3tr9//9tW2+2+/f7+q//YF69qdkIL1Bfm/FygXHpo4U+LHdLHMv/RGg1HbSZP3 +QI/iHo6piwyPnv9Oa4sypJeNnMkfwZnuk5pHgwF0TIfugCKzPn4Hcz8aFtd4/7noLMVWmGGxUe4C +a+uAJn1+E2jEqIIam6vkb2PRgDsHWLCqOCqi1G9PZ//qi3/2zyVUuZ0rmflcFjoJrtaB8rFejwcB +ADD4kzS5+7356SBfn6MLc6v3jqueo1OkulJsdsEfG6lZxcZrr07e4oQTtxA3iuT66lwHKMFzHeR/ +9+XtiWLFVds9//qc7npspoBzTjdyP0em6Pn28nrv2yQ97Nx85FXOD0GyqpzNdOTeYqPsivNE2jgb +94qinQMsKUNnM+CJ2Ezp8d447411v3NnozaAbszl8fcU9u+t+xefjcEgc2O///7DL3j/aZ8f+Lvz +5Kac6gi/f9j7rwWc+wev6/Ot9wsxv1RnLV5iei/3fZx65rB552v5PDi8cO7vgGfyFofIKrS7sZSz +LUE8dVvGhOyrc7ba7m/j8YwpSty3jHXP28vr+upxwc180i+J1Oa7s7nwiro5rXlfMIJw9XxlKJed +Y1dgs7HxOo/z6bjvjyOMUriShdjFz5wwq4QSH3q5j50hWbqxwXo5v3CU80VLQrlv0V7bnfEH0fU7 +tuR5/4zHC/Thwt6veDxOB0L38Ux7OA04sl33Z6CpdJwO6MyJXPeltdk++TZiEYldHGPQebcBLMdV +EPvyCr56jD/UEM9AQz5/jz/rrJEyxeDxGCeGvEqjqbnem2fLZ7SibXZGipzi+dEnb28vz3YuQwLd +/UHq5vHd2ZzTvRnFoLfYCH3rjB4pvmg29nTeKxwuzh06s0PElsd4h0tLP2/4YCF2rsECpF8kfMqX +F/Z+xR9OeF9x1WvGZ4rC69d39Frpk5f5bKz3IfRQ+Ikf8vjO2n3vUTJ+vEQryqZBplmP116YWIzT +V3ls/XCMM+ooAVLvcYBX7buzWQinm6970KHrpcesT2WU980fjnEfHNe6O34P1ukcnA== + + + Ktf9udDjfIuN/QgfqIpez8Y6Z/kkk/nqHGCciX2Ga0RsBHV0Lvm8/gV9jXv0LDiM3gdY9MHiClhL +n6Omnu6Rct/alz/hfg3KJzt8ab47m0vN9xCKlWlszGWdjYpU/YFLK2EBeAb2cf8MCoznAOPcsacr ++OrxTLHmvAfEUR7P9GLK/WywZeOa9XwnPVILtMfWfTo1pb86Bzh+Hh73Wo/Hn9L7+Hu+KVboI90b +W3l7eWHvVywf5KRg9f0t/IkTAs85m0n8YuP+pO5BHEuqs1HYhhtl89yha92h1x2KC83TQT9c1/sg +cDy7vLKVH4MA7aRPpqLzq687YfRX/8StuGPruQrfmcdR76toj0HrwxXcw8VC3fkcmR/33dkq3zQS +PZiMZ4w7v/mk1RE5rnuoQKH+MaC2ts5Qn8fJm4EN3NktZPy3Vxfwq8c9A2x4tpdS3wfOcl/ZvgHp +MXDWk/NazL/vxF5FnOfZWrlH6qqxmZNhafeH9HS6r9+f3apnXlfp/Lufij/RdZ3roFf6vvnzg7yP +edqGxzBeRn+MeetsVF3xDADlfrsfz7rE3B8b+3oMCpHEOYucj4mu1nVelbLmPQj2eV9tWaM9xjua +x/dRzyyEcvD9iZqBv7z89090rccL23p5/K7r8URSvwfSK5eP3xea2vcNS/8fc+/VI0mSpYu9E6iu +zAwt3MM9lIcO1yIjMiO1jKzK0rK7ulpN93RXj57Z2ct7Lxe7ex8u9oUCBAgSIMAnvvKJf4A/jN8x +s2MeJXqGBAGS2Nqe7lMe5uZmx875jrTUTfTMgPUYCrHQ9TYWl1qbWp+cAM9MXPTBQ1C+wzsmu3xA +fAXJqZXehvWXpkyUN+YRMRTXnjL54ycTngN1RdXEyGPNr3/8waRy/ogjllMi+5zXUVyaoDg744Wk +HinqWVI+iqi/iwoh9EKG1CxDkuleE7XFEa9ukP0dFqFGIfwuVn6JllwUPPzk/HOFmGnAJBAXK0Rx +qZFEpb7aYMpF429wXZ+VXCIwnyAmbC8ROWPUl6kjL1JnlapOqEfcJydwrJecmjSrgck41qyrQbQb +SWOUiHRPpSSGieZd6qKriEG+ZJSjoWZGpjYTNQrP8hPx/gz+7tQ8bQt4Ggv54uoueSiy6G8zg++G +6Qe8TzPjT2N/yt84lpEmk7XPaxPyWXfD6G9/GlXnygNEd25lgT6WwhsgDIzYk0YqNaqPxNVidLtT +KO2IgLJRfH4y8VgWhgT+1LO0IJJG2eRKDyV+8HeOtRYBEYusTWJMkSpJjGM+fhl1IeMBImVvetoE +pH7WoWQmed2hfNCLQjUr6gesfx+HccRGk5JuFG5MlPtI3PUniUkWK/0cyq5Y6tks4AE8NQB1DQyU +4eaF0l1CSSSeuEKVgpRxmgunD/ZgzeQkViurT1WsbqsjIl00an1yb3nTyc3ELCJ8Ce8UWXSGlWQC +7Gt+Wt7wykJS7S954RSXqRNId5y5CqZSQDjfS8Hn8rB5Pu9lxCrMC1JN/FhIi5t59emJ/Hxa73/E +Wos4FYUWnxFEWsSlET+fxMqaoFgf4xcNuAKN5IhLwhzzUw9nSQ6Ur4zuaEl9Zci5lEUsidQEkWFH +4usP8TRqyHL7wHcZh7EDjD7Bz/S3+Wk+gzTRPpeMAQqfSpIiCY/6aYASxgzJtRoXvclYXkQemz2/ +JOX1ZN2UP1aam5KW8QfEmX4wy/IlVHcmCzL7Ld4je64b6yG0qeB6nyKGUT5u7GtBqCcWR1o8Z26m +9yvR+CRL8gG0uvWUsKB3bZol/LH6RXR/Y74uPKqGQsHGEaGMdutj5vTyhVEXXgup7+uVlZdWiu3K +/L8zA0ULk3z6uSsvCf/O+uXPUs4SE6PgE7vyiY39RdHh6y8IMpbBbsLiRPD2J8/shh8ni5S0o5Qb +bQZIpS7IkfYF0TZJmh8HmigPgoBp2urwlM4gz0FuZ6Usm6mxmfXJ9+cTC9RKksoPMz2xQGkYcTkz +j+wrDeHnQMqVJeuSGPIZ9TPtMKIB8q/wWeZv2Jaf/jRKKFGPKq4jCzDiQd000p+WsjKkBvX52gTa +W0iboi09hVzFLYmeGiK3LP0wYwdg7oWkLE09rogPCDKFStlUTNm2FeL5k0u7icNYpxNQZhhGybBK +KZPHZK3IgYrDKQWuyVminqabzTSZ2t2qiagoFGExbXlHcazx1XuT2DBwUrb+KK/pAwNHuJqoKJ+1 +eC6chFm5/vQgrNRE3ybtg+f4DZEDjiVQdx01DPU8j5UipoZDmvzBIGr0lFJ/pQynKwLZZy+vtvMl +mRLH5TB0NUAUKbJofaGIKh4grmiLrU+OqxYryZQzV/xFyDo6EQ0ZxOeLhvexfCE1mVJAOZSOb0X0 +eXIcbvt4XPVCulYq1O6diB0u4rp1DtBQ8xZLEnMTxZcniGixduPRPcDH6vdp6muFGKsVEsNqnehm +PGwUa3OKsM8n56UmHFPP9kTJDCq6lhMmsvIx+NLXKolRxtIwpd69ipgwME/ZdUVU5Qkg9Bjyo6GK +4YrOKJkiBlkuYlP9e2rFqB4N9aPstyb/sMeDfvAB+ZdxSJRqm5jZKNNZBEaI7JO0Wiuyq+BJOAuU +hKBEoVQ64EItvz8eV72Q8kgT5pRQR6RAjpUHLJIAfa3IQexrsuRjatIp3xfJ4Ocnh1XvC8XN3YwG +tKuDSmUCjpRT3x9LEmOXHZriyh9JhOBnossmCQ2QaXSstAC9TDs7GD9+PIP83HHgyN0I5FAVpzad +Q4XQU1fZyMIESzI+0Z6erzDBjnlc7VKNFYAgYsCwTgHLjyfAixZtBBldN1IHlK47jLXhGsqTRMSA +nYBu4jGREhZZuLHxQclfPmNmFhNhuOGZEKHAv7nqItCh4lnSxSRSyjIlDhJXHqOPP0F+W0ZJc36m +xKBH94S8Y3KYajkqIlqCmLiRIqbCYSiICrWKq3Pk1ARZ4eZIOSAELeZHFez7xATUzHxXRZCEURQo +85/IfsLB3USN7It2UB4TxX4SkfrKKqIbSzwoyNqoUJa6GEC7nGMZUPvEDNgRTS1QtQ7TAbyMUDu7 +jyhEqR7l2EjmWZ/68fEnh2TlmpKLQSEh0a77HZOVX86jDHIJgEmssoc9Yf8MtbMIOHCaOzEoZ5Cz +TRL2HackN5XFSFXh1idnoFYhpNr5WIlmsb7vmJx4wQaZiYxVNVPmQWhFPOYBAj2A8j0JYsbPJkrA +fDSDY71BOZD3PO1FyDasXDWzgEJ1WvSxNydToX8dCedN8rVTy1XmaKaO2/tjfvD6fF6eThShu1D0 +vFyxm9LFqTnHdRMWBGyhUGiTQUEWeb7ezSxkoUHVAvpZxgXUB8r65AzyqUU6MSYLOZ0ooOYRWhwF +AS8PlVnwLELvb69ZIBoYy2f1AsmMCzmqF//tg5HoR6lERc1KJ69AkPPvP/gCxajimhGJbgI5hXeK +HKgkCjJxpekjQqnSHgr09xLRT5noKWuEIqnKFxNKS0wRlRctlMz5yQkw9KNmpqnCBbGOiQiyGzFZ +MhoRFbOLKuWYiVHGA8iL3/jZxGOyqwdQqVogymgN0VR2B9E4hvzxvJQ4ouZgysMH3UP9ad8psqds +bFGpzWOzuQjQ40bZ335hlkpUGlCrQWXZffw6mofIOxz9SaADKrFOWaUQvHunyGx/kq/VUyYMdQzw +pRSKyT8uZkQlBypwEmknPI2rECZlOx5/+l1EpLuwI5VSGcQSkRPRTVh7upwyRTcUKpQVSaf6WpET +lzWgn0iWIaLvq2eDSBPpRhdFDNn3Rj3hVMYemQcSeKeiU45aaD0xVzuD6OLlUIkPYQtFMW93yhiL +PQMhXW8b/ZLVpKCT5nrqtKONo5xlE5mllIjGyYnaUpXKIMpQXCby0SeLSdl41AVmw+T6BUvM9VPN +8zLGmaQ6mVG00/QVMVYpWOEs/4ZUexHyBaPfq5hJKHMs1O9TfpKuPdcDsNUXypDHWpFlNag8BlLM +iJfx7gitzC+L1Lh0k4QeN1BxZapUzHiAQGU2hDJLk4iA/aGrWFkEaOQAlAHIfEd8u1ZUDgJQjbR0 +LCaJbPInWYl4mIgxNbdTh4GeUcPSzQQSb5OpH/MUxLWe8pAkagAa1eONpHasPC/P8z1mBS9ULxMa +UBIzl2fATlRqCROnegYclaZO4Fming0yJtKdCIrIkadIelN4AGHt5MaTXJpo4yMiV+JqIqpViKQ3 +ThKjOFKzTTUnRDofkJwC/HMORlGsSiqWRM0oTdjbKi4ulmsSUfFWon4bBnI8kW4ridRO3g35JXE+ +ADtSKLahDl0wUzc40bNKPoPo5fI50udAVPar4yUUhnxWpBmqrZJWLQ0g722iFQncTA8gmvSxiGd+ +87WDPpTnTxEDT50DxnpEDNmEzoNO1I0v4WdjlRVAz/rMGRzUTHytb0MZmOUBwJGRUjKR4gyKo/CC +c9ZX4lItvHqVL8suJZllQRjLEAXV4oQsC2Lmd3cm7uqQq6XDbgklM7DgEjwqiXSpjdqFUKK0mPrY +uwpwUFcW5eH4RT9EpPKyqA2l1BXknFAQIGBP0af8HpKcaBweKZdQLJoGKBTOkpOcGwqYiO7akR4g +UOxFOeex8ulRiycVZSA3p8dDUBtvOQSHPn7RoRMoqw5UN+J5ce6Wz5ksNGbCjuWAtAv/Hla1dgh5 +6lFPiQxfhmTVmMrioL4mSZw7lHSQ0st9R6EK9FLkMuaF/bRDi5UHDStltFhXX+0LVdUxUUtzgRp5 +gNTTCDXzeYAkcNWomZ/xF8TKsqHeoUH+BbFyNNMA/C66Np5ha8AryI5q0l3iDlFFjuOIT5d2yUVK +aIbi5iG1KsoLQAg5y/IdVJFudeY1Y2QML0XuuCQnG9iZrvNU5FgHsSk+I73zsbjiRy2NaGBBxEhr +L192S5aziLSLjG4JU08GHu94pJQEEX2GJkJ06p+rIHOgU77jeMP3JzCAJMZKINJ3xbyKsQ68hOJG +XEVTWiqU3nFJDGNel9RjAEATCHlYERtdMzlhp2KicsLoGyKeV6Q8eTF5VpiYurGvx/X1hwlQRkQK +l2VqEQT8kkTqGsDyiH8f6sh+KON9kihavcsJeB4PGqnaD+FpTPIBEvbWcxYt9bHyU593KwwVkXP8 +glzPUs9OLfioOlk9GrtMTCOPB41D/iqRqsYDBKrmJsiX0KdbMnnUWG2NL1+gRC/XmMSiwyOrn5iz +pUWHfEZygbLHY1c78UIpZSSRs6EoMs8LQ5cLx2oNqIicfx+xVRgqe5WImT5h0tUwFfZUmMTsCqJr +6taKHOmMGHFPniR6IRtZvi+lzC8bluxNCrXbiG5miyNmL4Wco1Sn4IWiyIV/n3NimPH7fS1R2W9P +D/q8M6xARQdTllJ+JnWl6CgabxjnkuYrM4VezimoVFcdeh+AZno21KanUnSR6Piq+C23tPCs6/Kz +ouW6ejZgtBcmkonoySCJ+RzqARJZCCI/i876WpEjhY0CDW3o2ViLDV/CY2pE6mokHA== + + + ZIEe11cep5D92VFMrRV4ryKZfSda2rOlHod6ZWIdFQolxOdgUebqw5zHhTKP1XLKC0YiJmNizIiJ +OgiqkG/AfmQiUs9X3kYpUCMCsT7HTQIO+VJHZBWmp54D8jDS5cFBqPBGLF121IxNefQ9ycXy94FW +NXSRqqdkZ0Td9SVRYOC1ejYPqLsKikWhBhGBTJiRxFwiRwTIebK+PqEigVASw5hxL90gy6N6LOkz +nXIcBbp4L9IZdjSqNu9DJeUiQpAhmxPEHDxAEHmKnGNvImfJB/CdrhpQci6URS2KqKxCYgRWFVGg +K/oiofN5WHEVjlJsMrRCq5iwauU0A+olF/iMsLRpG1GmGYt15RuMfB3GE11ZfCZGjL1Fg1/+fRBr +vxPLM5J4MaPkRDm6yE2e+h+xl68P9CbkoJ5d6uhQrFYagCByaIe0jfowSjnXBy9k5EaNnmKG+pHK +PKK7BvxY2+FquXI3SyS7BfMAUcJynRMaaVSfnfZpwoOGISc/+DqxLVKJZ8FmCSbdExEy9hY+dkkM +Ig7bhjpJMcxkcpU8uUqPU5e/hI8zuy1oVL0EQcxJFUT22QwUh0y9TLkiyBMqN5eIucZOknwAkRwp +dXYQ6mcTxk2hYtqQdA2fuyDmCDiRVRpLoIMkIVUjpqyBfClqqUOaG6tpiQwSHiDUAwjFqYiuxtS+ +FAgh6Yscn3BONJ5l/0LAuUB4NIo4H5LT7sNEW3a+LKTgUIin0024loeILltxqnz0U5EQIlPTuEj9 +PlGQI6QK4Vh9latq7ihqqA0IOuAcoczPsi85nmKRCplweJuaNMcaRmm7UkQtGXcLYSSJcZyyuuXo +TqiZWPRJ1L/n0oBAV3RRzFOlo5EG1XOKPZZawrHLA0QqHybQrowwR62BruAN86TCQAI2OUCgfSG+ +9KiryUYemxPKrKNvTdgeES4jvQRJoDZblTKGAsTrdCV1CgOZny/Pa8buIHGVMNdoc1ER3WScsarL +Av0Fbp6u5LEgCj3yafOzscwcCyl5yOWUtlC6YkJPu4Nc6QeXA1BTO10Onqoot7dhRbP1RXdcJ5xK +FsrQkiRzpJFyhfXL0oCFjquq3GhaccL6N83yT0h0RalIw17zlynrnFqcSDEv7ljxeL2VJzv0tbPV +lx5YXlvP5ddxuWsocoXUAJEK6gSZjhsEM304RWiM81UY9lIUzHV5AonKxM10adiGe4NGdRluiKuL +14rMGIAKaDOObbk6irsRhmOjyBOtpXhYVyWJeHmuYaqKI1UyMRM5akPZcLwuILt+oGLLdJuhmleq +E/09fW6CVEN/j3zPoSKK2m/1pGiSI8l+xgMEKqAQJDr4kWdLUvaKy/AuYpuGWngGjNqEq2+tyGHM +dSuZgslBIpMZA5mt7XKGOwdwKIzBYRm6ZJjyA2WcNFJ1UPHGgonNkcQsiTZ7R/AA7DxxdcSbFlfn +ZiSpFL3ia7lGJtG19IHois8zyHQ0f6P8nAsrU1W7IHsaaFYE2eMS+5Rrd9KNLHRqJaaIvxRATnVW +mOcy2zIjuHlBLJXzciWaKMPPuc7jjGRfPxrrelEl/z8VG+dnOR1XtAR8n5Vd6WBWxLyyJOBiezGu +LolWzghB1MX2nPJKXxDzAKFOLqXeX5x/LFI7JTFNOGMgCD0+N2nIiUZhtCEP8qJsXVVB28RFdoCU +PAMOyHgzDWZDlUsuqLpyKNMKxJVml/p9xtV4IueZB/A91gvC7b1mcsjJQ6I7hRLrPtfucb4+PakL +XlwNZkNXRz4oESwOtQCW9eaCwxPpqAlFwawisvwLPcX2kj01PiNRxmkEiareIAme6okpg0/cCMic +5Oba1d+omxC/WjM55oxvsetrpcxjrfVElwalzH0+kbxpv5yvFen6Z9+X/mxCUy6fhyCSLg3CXYEu +uA20xqFG9y6vQ67JYuWWlylf0pcYJtKTndeNS6JMyZSiit2sYaJynUU5uycTEQnA65LvOPAYf0ug +JAvJNedk0sejpELAZiNlUOV5KdriYa84JbykTBQt3JS8Zf8aWUcJV3aLigM2r7jUKk3ZZuPUMCrG +VQ4MX+f4uhJrss3GJqqr4+VkIOp9DHyPjdnAZX7Oy58iiltxSsmG2cppgnSLpZTB5H3QNZGhz8lT +5KvQX8tJqVGk1ltqDJ2v62nlFHpcEkHkkDP/Qk9WRRAx4CQ2gZ+m7/lV3DyTXjzKlb8MosW7WGUF +Kv+MiLqqQjyp/TJJXsbq8wTYL+PmjsBPZAGrZ2NdkMzOpUjbsq42OokY6BloZEsD6DpJukdCPRvp +cx6yQ4CK2HS9na4n/+X85jRjpuHwRpSXm7kyDKuIOulVFJGwK0w6lyTT++xLy5MGA5XGTAOkvDTU +IFcP4GrpoTxe8UZ6ITdJoHshYy7CgfbNXXGhz9XoXFMPIhuoVM0QsOORLRl3oxgsSqQJJF/mSTxD +/kityLgaHkRPlydEcZp7OfNeK6qSV/QiZPDFsTh6UIEkT5qy/Psg4ToG0YhYEmM3zVsFsJeUfbcE +H7X3OiVHLi8XA2PyaWu4CtAZaHLi80f4qaxPkldLcsOrWEIXcl5HrKCjjF0tsauBlqcLtSmjSVft +s9uPnO0JTzdvpkPkMNZGGgNTag2vYSx/MV3M4vMyJApl0H0uMftwQpcTLOI8t8iVHzyV4RF1Hmlx +Aw7w+DqdOda1U3GoWzx4ihPxZBroJjFSB8abJynP3Isj7QMnlhFPqkQPuYKqpJCe8zm3OPD0y2Nt +fKvOQ5Iod1YmKkqHRpxsJFILiX/M4cAwL0iXh5Zu+vF1AT2vX0KBLD7zhAJ5gEDjNIaPdIWQy2go +UIG/RIdvFSL8Wv0+1hUsWerzZGVkRWYpRvwBImlDFpeGefTTDbm+JlXgkQLQOnU9zuPfbE97smEN +D6DYx/PyCH6cJayldEybjwt5OZl7SP9z2RDbgTF1aebWSl6kg78cZibcyDoizqTrU5KVkU/pCiEz +xUa+A+dk0wli3JiI/GmebCSxYEJHT7cBiTkHgkGytxFtSeg0cVF2oOKTILI68bRjlO7kjvio0d2I +eoDYZUEkFP1akXOvjs7k8bX6Fhc2KFoY8buoZ26eiKK76UW6VFQ0C+a3uSrOmwiIysa0aseXBBtl +2cKSPVYDJPpoJ9yshnJ3goDLYlSvr4Q8W1wgxwWQSbRRE6YKAuWzrOc86iWoc5w4W83XBpfouc8S +h3tAUJKUNuN87Z1LxOW8DKdVZae4hJztbta+iUpwYvsh0wPEQkZLGJbqAbTyYpmXxLqIR1yxkM8g +jlmrhso/CGLo6UPLqU6xahchxQ6bfHQhqsuWvy4NSTbKQLgAI8mzPoQTnzOKUpWcLGWcNNmSdKN8 +XOQnSmKkyqaJOVhEJKlqJyb2UZWaJ5nMuZXrpaJuqbuh7EVykhhAXHLGm5O6G5UwTBT+2OkvlsdQ +RqeGG1y1kJJZyu4m15dOP2pXrdsWhHQdqxzAU0GJzSIUurFd9w3wlY+TiLrtUqJj6HQ/rXZ0pLpA +l8i6Jk2EfZmcpgw8uVYzjTaEahbKU5ZGOqvHm+ly5jTaiIz78jTRk9oed1WzOCJGuiQ+ZStdXGL9 +YaMHuvZaFynpBU82qlVztyPIvsceWZFAxLVd3FPK00HRNNWdIvKWHWmmI5205SzsiKxtlSTy9LPa +UuHjlFL2fbipmcUAWV7u4nFReSayB3xuaSZReubrFA9qQsWMkFHeH+uLMOb8VwyR+dytIlaiKqPk +K/a9cqCT7qVVgU5fpsLxuJnyi1AJn4ylZRTuZdSnMpuyQPUBFTSXOZx+H7EaEQ1V1oqcurnWk67H +jLJD+Bu4ZygRXZbLefJIFulyd08bwnQpjLahIuXEoYZ02oaiW6zUAOlGp9W80HajBMGTnb2YHMb6 +dUpzyjabfEikGUcd6TwGaWLPj3lYn3mUe0YK3ySzoq6ASDI+NsIQpp9nwvbSgibOqx1yH6WbcrUE +x4pdcdMR/57RBPEZO6dkkRsbvQRN1urpvFeN8FYLUszZhK5ME8nE3/Jpdj2VWJTRf2hbXGldejbN +2N5THZLEk1omCatdD+CyO1KldwliqInSJZNxIbkcwHPzAVLd1Ub4LtaKzBlinqypZHLmZRpAuXJk +n+ojWQBl+nWZDveKw/D1Hfls6LFDQRWHZG6epeBx+41M5Ju7Wr2FvD25Q8BT7RCIxkkhnkwKIaK4 +tYqxGqemEtlzue2w9OMTje5HURBDOh6JGCYp9xbwN37PCXmuwLBES7QSIeswChQxTlmihWw1i2ej +vKeOWoB000CXuWxEDHWrnyjUExCX7fLLgjTiZzNXa+0oVMQk1Zwpf5zp7ALRbIAe81wK7rHLIBM1 +Spnn6cxgV3Z3FL8nsu5RoSr3iJhopOvKZrriyYSDKD63BKIqyrwVW6AsUKIm+niKtVJEDdZDmQGb +eYFs6CAnkGWpGjbY8D6pvBEi5oaF6s4mntTNZnxOvYRZojsduNxlGIJfKk4pkGUGK9ifytE2G6vJ +ATIN4UmYZYl6NtWHVtU8/1K5Jz2r8YKKw4hnQzaMPXVciOjpI8AxYCLTzSxqAM6+zKhluMd2TJDI +YljfkzEV+awMDVPb9NyOClTAhB5NIg6S+anKHKSHPdXbyWcpn4me5RyUVJhWEFWG3kbKAU039XQg +X6auyJpXrnNQlhitDMA857Owb5HIvsfpbHRNsnqWa/NDlQhAtLxgJkxU4oj4vS4VcJWYBdH1eLKq +v1Dm5S6hULbGkQOkUmvJd5FrUTJzIkGUelpxQqLldMhtfonpOJhPaVihZkVmGpWmslbkKNBZlbK+ +kIh5qUEk24EJXg516hy7+4js+hz5VxUbGd0C6HOeZCzbn4kZ6CQoEWjkAcKY057FzSXyPOUpFbI/ +M9E4gBHKXuv6kGY8Wb22uS0ZSmApiXQTFX9rnA/g63KFhPy+a0V2M53XQwnMLFRSjzOTQlctGAW7 +mWlULEgQ1YdFUtmxrOL+a1ThE8XqWXbYRbK/8C/UhrOwixRZ5NaxZOUVz7KUJWiiK/Y8L9W/55Ld +UMqftRLCrK501SVJdm5BFc2kM1ZqEL22gXLqE5ndi5ThEbLKT3R0OJDGqySmeW6njHKRDsxUb65w +tqkZWf7Q9cO+EhQg5wm6Kk2AiHkeaabYhjR2yEV/Qo/wuNxlNZSaRKn8TKetSp+P0O0el52kXo4Y +WGXQeUp89ftYT1aZ5JlogsJZRCISJQcINUQKJfpcK3KsAAK1zkoUaGEHUcA5gUT0Uk4U13JVHFjO +1+T+AK64eowziaJM/TzweQtETpn8faAdtBHXpxC84ogv5ylmInuLqwjFNU0M/OQVcjKl3E3U+/MC +OFUVRwNwxIkmxQJclOtkOj/J55fx0Q8k3lQzUBJtI6lSzCDj/CThjZNEzv+MGYm52tUSyiiWhr4R +J3XKDBpJY7ZgLSw8FlwHou0MAbMDzvXPpAoUgJvHDFzhyySipxlQdAtkOyVL9VqpLg== + + + 06KFEBOVYk1Fuxsupcm0AhKBLpYEwsepLY2YV4vTXcl+SnldZTYihVAzneEWszdaXA3GmYuxn7L5 +5ensfVHYOP10tbckuzqzVkQJ1KguZ8Mp4SDsQp2UqtONhLXIepXL+UXjJlfLnIA3ljN1QtnmnieQ ++pxczN306AsyLXPYEM9kUFI+6Yp7qfgLdOGPpyxIUUzLKcuqIiBLdbFjKO8y4U9gB2UofVhrRYYh +vlmeIg3pVBcVqEQuupnK5azpPIADct5rRFSlrRU5ilh/xaq6RFy4yrWwsUoToUvmAm4Qlfc0pOtj +XRYFotGtfJajHVIYygf9jGWxyEmUv49ltY7cXHX/A4ixbgPFyUJZJH8mNVqS5h6GWMuiSJofNAB3 +zYh0t3Q8CfStC+W5/ivLG31GuhtNFml/W6R79WR5RDracFZlofYJRazsxQB5HxhVBZGFG3W7ic6/ +z0IN5iI++am4OJ4ZlG+fEBfaM76jKyL1AJ5O+AXMZr8BpV5yiS43+sqCTdmbKF4MdNdaJQ6O1QCh +LhFJWa0KH1LAkkrY10z2/HzR+YqQLO9lTOnjci8px5AhKXYrUkQ30gnlkZu7pryITxRXgZHDTGcz +c9JS5uloWrjRHDLLO9nn6dDktOPCG5XmkpErR5+mkMtGMk8HzqjGX3Ez2b/cpsfnEbk1ZSiLe/nn +OdDmWn66V87TLdhklyBBVNh5szKdvkqlJkXyPghJdDXTcjw2I+d0pIkcZMxcHSIVuQf8Mr4II9LJ +f5kIonHzBZfTW+lqwUQDHp2EmbnaDFP1BurZvLxDpfpkop86H4b84JByy/vCKdXi6iQ3OiMpu2hT +jep19C7NdIddOrmStYgYszzgNpA0K39DnuXO4DjiPeTC9jTTSRf5cU5z20w5fCSRfbwQLSHXgdAV +t+qQxroSPU21NZ2XUJM/O2aJyiFFeW1uwrsodViah38j7ZhMxbWvDMNS7g2UxpTvxrJLtQFK8/ti +Itk3cSrc95FKSIykGGb3v6d1hShU5agCt3SgEJjLAYRYdwbhAgSKP4RcJJpwLIuCFbpknWtEU1H+ +zu06YhVaIXOM+VBYrDyAp8vQZSBK9CBhwSXcrJLIujKa6Tx/umjY16vFTeCok0qiGyFkTPygiQm1 +ovGsExUP45CLuBtMNcoBOch5OfC4p0Pss8Jg4EDdHzwuvcmivM9DpM9YqDpAJ3mS70Y1/0cT4MZ8 +iU7ECiSbv1PkVJUTkoZNOZqf12IkoQ6wewwVo7zAmpBDovCbrrMk5KHBfqhTDD6YADeHo9A2h55E +IuU7TWaHWqCuGtpIm1fN1hVRp4gFG7mRYaA73IacYE/Xu0oaN939+P3HokWO2NAw72Eq29y9Y6rO +AeEySEHkUJPYbkWMdPaZRpJEzjg0xu1+KEvU55tHdGWIqyWWK69X4QFSn8k68T7RYVfdLPDD+efM +KmwSnfDL15QIoybmRGYdTMxErI+zwthHIgwY3g4VqP14WHrl6AmvKOVKuJG2xtNY975kr3periWI +XCUoiuqnf6vUn1MKQx1NF0Rdfh/qBgofzGCjl6Tu/hJwayZBZW0u0u8UMeKGIso3/csSW2M9DtKn +iY6hRnqrP9Vz8lOzUp2kqJDLYxMBtr3qNxaS4mJ4rTiD+mzpgsBIV6L9UtFZqCsSVWt8GiBl5yWH +jD9+PzdCI9TP993F+c08yUbivMj95+oD0bZEkhW+JaKfcDott7z/IJuIc/8TSv7VqQmyw1CQbNwk +pRonfTyvvGU+Oyt9aefolvkeJ3jEfsQdrgNdXBInqhs54W0uC4z19XWBcDcpV3SQbbTcDxPdlEP1 +qgtVr1rZpVU1Wv9oXvkK+/pKS4H0eYXZcUzpL7ySXF/vyW4HU1mwEXNcKs9zIbLOzgv54ox4I5rJ +VSB5KuX7vw74/hQu6xNlJDpdyouY+MH0+btiXd3hyXALN0Lm6iFPp6lQLYrKJfc0U9MVDDEniYSJ +Ls6gi6x1agD3dYwJPfCo3Bfvoxnk3f1SnW2rLwnJdKMDV/evJWLGCfxJwPUGsuWIrE/RFROqa7S6 +aUylvrs60cVlD+JHr88ZgXu7qlRvZgQv4hboIimGj1reqjwKc+oHY6zzHpCa1f3Ei3TnTE6uUeWu +XN3EHaZ8SvDhCprY01WZqn5QNMnk0+LrCnwqwdGz4+RpMQeuffN8XVXz/ryO81af7w/MExZyV5J1 +WYqvK9X9IOWyFD+/wCOK84mxO8rXie00aMgH1mM58Ikv0yJRt68X4o73iYPvdMB1O/Z0I+wrWgys +Pz0Ia4JAd6pTfenfKTKbjD6ZgVx1krtyfV0eTuWbuvyVq/ao3sPlZheRTjuj12XccD5ULc5CupSC +6xFFrOOTE2PM52s7TnWseKfInm6Cw7f0EVFdVRDIWxUkkUv6g7wDXejrJg6qCnn96bflC8eV26qV +EC9coB2YnHIYBtpHFupub2HeVUWBDl6hvCuKbkGcdwQOtPvx4xkca+2eZVz3KjQga/c05T1NM72n +JFUSJQzThI2yjwdZ647paciF9CJflDumBz47qzbKMvIGYWzJU01ClHuw8pqG3D0pAkeSGAfcrCJR +zgSqU/DYeIliPy/LSH3dDc6L+V3iYhkJNFTTyY+/IG8G/8HI/Gmhjsroao1Qg0PddiSSdReSqDPJ +RREH9zMLVSeuSPkQ1Ki/9F2yGbO3UUsoSkXfKXLm8a06WR4Zzy/yyANWHw+xVmP70pgJdJLBOybr +69rwbzy6uoSc/EFxfjF5nvoGdC1j8UpkBzpp9JPv4u7jsW7uEMvamndMVt0qI1mjsWayjlamqnyG +Mk8DdnUmMgQpUldVlCiSfYuPP/26/LqDNGVPcKxNNiK7sXZbcz94V/dMiWRnrPWnx+DBQ93+M5Y1 +N+8UmQOXsSyTkkT2HsSkQNijwZ6WOE/S+MUBZFntpqf94xnQ+j+5k1mDofX82Xv/1ju8TN+c/vzN +0e//9Ifvb9/+8Y/f/v5nSTz69lc//PweefDk55/fvvv2G0tQLZAtb0iNYvH/z/+S31TvWa74v+d/ +xX9c4V9+DdJfLM+1bqxXn7vWN/T8wzvTJMmoZ46VRJR+TeVk74joRbK0NCev3ydTTQ/ZH+vNIT5J +zAf4Ge98eEcUw/qwX6kFaEAdKsiezkLoLZgVnihoFDd2QsLQQcWq+kQheBxE5J0KI/yNRZYsjPvE +j6AcPYoviuwj4IGUrOrIBV9SgSxZdVT1Af7ByXl+CLP6Cmvxa0sAtL9YoXVD0w1EAY74Cmp0La/3 +TRJqtpqGm+T1nUf5Msv/oQ6lAcUSocpciieRNU/T9PALAEeoOpqdDxnhAYNgKim1iBOxQkzKS9Qk +LdEFeHPClvCJ4FNc/jT6AvzQ+ovaD1HQQg4FGUF5p5bexbHdIP+0Oen7/2/P+O1HPKgmL/ySmCVV +Tyaa80QPO019j+3wPeJm9g+J4iO/fp9FY1/2o31/ULqRxmUiv18R5QCxvDzp/Wdjea/e+6PmxPdm +sEnWs81H3fys9xfg6/dEhNov2k/CNPKbNlYqI7sXMHhzSD50G2/eIOVz1MT8azaGy797482ba5RR +L8Eg+uhZP4y9D0bNie+9f5OsZ5qPmn/Qh5/+9S+KUSHuvrkTv798+n/+fyB5xLllgeMHEsRBslCz +NYkGBBkQJ5DkkK4N+kmJJ+EgxDpEZFR4zEAutDOErGSyTLZGwX978mZnsdgEXgB/6beEfsn83ZR3 +ojkhEMaL9+Udk4UwT+kK9TB+fwgKVVGwN3/dn1n6UHowzyoRTeW996eexvIOzfwzj+9IskAR+aJ8 +JLn+P93Dt3c2JRgBQHzfhuaTW+jLBAZBTiiYSUSRTigUSSI3noiRNLwEMaQ9+lrxQBS6kVwFYZ/+ +pMaNKRNTnAUgCiaKxA7xbKqOokiuDPllEbmpPjXbX5I3qXjrR99FdR5R/MF3UewozsL3v4twEll7 +H3wXVY9QKeQH30UhMALA8rvI8c9kkXb93peBmJBp8d6XfTzf/8tS4v8x+oKC/Bh/edbhb/9vgTDR +MCGklUmkS1XBj4xMe5i2m3+x/uAvqE2AoubDfJK4MQRhsY05ejRHfHT05uyHn77dlf8qvv/h2z/g +0+9gtTDX8zvzk2///MPX3z48P7Ke37vzijBCKEaYin8Tx1+//nOL4r2eG9Nvv//7T9Pf8C/4f4Hu +MTsvERMNLfHzO72emNvJ2z++3bXIF+bdeX75X1jtrG64Rsvv9Bbd/l63u7TsRdNc2t2T3vDM7qxa +rbRen9ud3cn00hme9AYHhhXXDA+/Mu241c7s9q5hev3+7nB85AZXY/eqNzrv4rf9Y2e8rht+udIt +l9uN+qjdTZ3x8di9Gc7v9cdX7eGR0U6qjdncOxtND00rHY6vZvNbP3rWGZyarWV3eGF19ptGVKvP +W+1lu3/UdY7m4a3ZXRbKw7oRmu2sYbjV2tQ049H4LIieDOdX3eFh3fDMdmK2g+4gqxqTtrPrxo/8 +7PNk9d3Yf4Sf11thzYAKfZgefOnvvvCSp9HizXB2z3YOaqbX6a/sLhYhrNQm5crAMGct2+/2sk5/ +Ua4O8K6Wtag2/FozqJuR1d3r9I/s7rLnHNidpWnvJclrL3hqtlfVpl+qTsq1acPwJrPL4fi01pjW +6pO+czQYnrW7+7W6V6lMmoY/cA6z7HmzFZqtqNc7KFfGO4Uu/rbRCBpN/Ik6vZOOc2p1jqzOQbEy +qdTmIBpmapppt3fY7uw3mqFlL2sNv1QZNcyoacT1hl9veo5zPBqeYW0bzbhUnW0XuvhTLA3KZXyI +37aTDhigPq9WR6bhFoud7Z1WqeJU67N606/Vg5a112rtYrRKFTOft3v7DSMoljq12gyTLBadZjOy +2wcta9XpHPcHZ4Ph8cnJF1F2U28MjVbqDM9nwb3B5LRan1Yrw2YjxIDt/onZ3qvU/Up11u3uz+fr +6eTcNCDUr7vOqtEKwBJGK+4NzvrD804nnU0PK9UB/oA5J7Pb/mht98Bd52DObm/fbqe12rhlxxN3 +HS1fTYOHg+k9q39Ut6KWnb3+/D/sH39u2pHRikaTe+nyBy/+wu4eN8wYTFJvuvXmvNaY1RpzfG/L +3m33jhpm2jCTcnVSLA0xbTwADu/095pW0uosR9N1vPvlwfG395/+ttULG635YHLupi8WJz/4u5+3 +hxdt5wQ78uzpP17e/7nZSSv12Wh2f3Xyc7L3Tds5t52zZiut1WdYRsOMMHi5Ot4p9qp1t9H0sBGF +Inan3zBCCwzf27ew4FbWbO02zF3D3mt1wXg4CyusITgQj+GHtYYLRi2V+/XGzLZjHMZafVqpjOvV +eaPugsHASKaR7MbP4uhxodAt7HTK5WGh2NvesbGJ+FjTXnV656Z12DT3nf71YHBVrkwaTd8wY7u9 +hy2DQGiakA+n0/l9w4q2CtbdbQPMCZkyGl0OBxc4LDRaeVyreTuF9ta2USzYZtNvtw== + + + DzrdQ6uV7BQ6mIZhhKWyU6kOwUu1elgozao1v97wmtaiM7wkwVId4iuKWIRizzBi13vqBy8871mv +f5zEj//8l//+4Yt3n92tDCdX+8ffpwdvusOTSm1Gh6gZgeHLtXGpMgalYUTj+cVocmqDw+3s0aPf +T9yLSmNWqDi2vYizN37y2m5nlu1XKjgIwWR6AQnTtHbrrV27dzKZ3Q+TZ4PRqdGcTyYnyfL5JLhq +D5Zt5xAr3x+dz/3b65uf5v7atCKw5cx7NA2etJ3TRjNttfeaLeI3cFeh1C3ji5pzHMCWjbOzsNtH +kGy2fWBacbU+bllRp78Lnjfa2dx/fHL154vbPx1efWt0w3Z/d+xejLyrgXdtD07d6MXBya/Txauz +8++S5VNIYNOMJvO1lzwZTK/NzqHVwyccmK0M4gWsVSwPIApK5YlpLfGf1eoEG1QqD81W2mwl5fqs +1PDq2NbWYcs+mXjPWr1lqepgnYfTe5WaWyyPtnb6kDNNI6w3IMFciKlGk/5Zr83LpUGx0CsVsZXT +es0dj077/UNwVKHQKxb629ttYrNip1qfm/ZyMLrp9q+7/cvJ5NFodK9WB1fsQaxBPjQNbMGRaR8O +x/fC+LXVXW4VWsVS1zBDHDq7vTTNBKIA067V3Ebd39oywVqVimM0Pcs6MFoQoVG9HrbbxwPnuNPJ +nP4CB2GnNC6WPUhp00pwcJr2cRNCuxVi2J2CTbLOTHq9Qzxg2VB5B7P5/dXxd9Pw+rO7VWdy5McP +h9PLBuSetQdpYLSyslAEOFZYAauNAZMGbXEyGZ6sb37oOnu1ptuyUwzVH14YNlZyDAFiWel4fDZ1 +r5pm1BseWL09u3dg4lx3DzCfWm0SBPdWJ29nwbUXXY/9y7Zz4EzOR+4a/7S7+y17kaZPx+55seqU +qiPDSJ3BpWXvY0MhQ8Dk1QbEF47/pFydVetxp3uKpe45Z3YXK5Pa7UW7u+gPDpzxSXdwPJrdzOPn +Y/+21V160WM3vN+fnEzc8+7kMF5+cfPgr6vTH7D+OCMQJpPRCSTqTrELFhqN19nyW+zOaLJ2BseW +vQuxA9EKyQbZVSwPwQPNZgwF1LIgpiJovTp21lqZ1nGnd+2GX+LINEwgzEeD6U2pOi2URoXSGNoK +g0DoNU0fWsxq7+G816ozSKdqZYI/xGPFXhN6zdqtVGaF4qBYGlcqU3DC3e1WqTyoN8Nu/7hS98oV +zGReqUKExt3+EVYbChFsg/WpNFzDWrR759hHyLROZ9k0JpA/YOxaA+IogIRsQY0a0fZ2p1wal0rO +1pZVrye9/lkL8tbar9XCTnvf967ns7OdYgeTL1VI91Vr4O393vB2HjyZzK4h3LZ32qVSH7Jre8fc +2bFtK13uvhiML432frk2w4loGAPLjju9A+zRYHLPsPebLbBoBjDQ7y8bjaFpelZnrzu4mMwezD1s +5b7ZCqAcD06+b5oJ9hpaA0qh2z/p9U8wDg7XeHIdZo+BdnbKDoQehG3fOQVvT+ZXo9lFEj361//4 +Pz7/6q9GJ2raQWcASHbtBk/i9OXu3ufdwSF9BUZuBGZrv+esR7Ono+mTwfgWj5mtpN9djGdXlUYI +ZV2th1jJ4fh6MF73Rldh+Pjps78cnnxZbc7szt7Mf5Ttf7V78G128M3EW/vevX/843/jLtbF2rjR +Sgwwg70PeDAcngPeCJQygXJpd5Y4RBgZf2qkCIB/dg0r2y4Y5Qo+J2jQsV0Wy9NqLWo0s9HoYjA6 +3C5Ctoyq9aw3uB1NH42mt13n3GgtwA8VgiWjcrlXLGIvepXa2IJm6aywg0YzrlbdahXKpVcuO1BA +BGBKw52CUypPISfBWtAgEFlFCJBi++5WHRisVBpVKvN63YegwBaAZ6AWd0rdYnXYMAMw7WC07vRw +KPaw7DjRlgXOOcTgkDNQeYWCUygMqlXPbGYVfEV5YjSDQsGGENvabkNt4flm098madlvAuw1oI8m +LRvLkpn2ojc4x6K1O4fAYEYTssvCD+t1/CouVpztkrNdHODrjg+/K1W6wKXADJDtTSs1rD1ndC9K +30TJF9PpudOLsuRemD5u9w/AYIDNdm93MjnL0ufZ/ptq3RsOD/qDFeAioY7uSad/PhzfZnvfBClw +bAJYMnWv7e5em4TS3tS9H+0+Pzn/9vd/+q+vHv1gduLe6HgwWw+ma5gM/eHZaH7P7h2BySHocC56 +zvF4djOa3uv2zwajK+jK8fTm+vKn85vfVBpRtRFZ7ZUzOBmOzvFbZ3QRBI9W+5+PZxdNK2rTS1fA +gV70PN17O5xde+GDn3/7b8nqKRi+1vQh6/qjCyB2SFTgYUiAejPCv0NlGE0fr8aUIJdIlVh7Vvug +Up1UaLv7+FMuQ55DVhxBbCbpa2d0XCj1wSdNI60bWd2EolzYnaNO96jV2qvXY/ztdsEqlbvAovX6 +DHJp4Jz0ugfdzsrpn9YbEWRUA1q14ReKw3IFGGxSLo/AY6XSEDvbsrJKbQrttrPTqte9YnG0vQ2N +6TSaUEY4swDJcygOE2qrtQtOs+09sr+sJdiMtsba7XT2gZkxJvAbxsT8wVoAXSXgecil0oDQe6m/ +s9MDO5E6LvalpAL/2PYS6mk8XQOqAd6DxzAsNtRsxZXyCJgNA7ZwVA1vB4tgZVZn2e2DD4NSuQeZ +T7aGldFeDK7Txbd7xz9OZve63cWwv3t18fXh6ZetdtrpH3Sdg+H01AtuFnsvR/OLYnk8Gp8MRsfA +eEH4ZO49m7svcGYn3hO7B35ze53lYvWi2pgCjdvt/cXeN8cXP57f//ns9ifHO+sND4/OfuXGT6oG +uHrX6qzc8EmYfRHtvnFGV5jSYHTSbMW1RlA3IEz23OBRmLw6Pv/Jz15UmwsTWMvetelDIHKPxrP1 +aHJFFmUrw8L2B0eA/aadeeGT06uf59HjiX8/W70w7KREZ3AXKA6WCDQv9Aggfbd7jBdBcRSKTre9 +8IP7MH7BEtgRQLvR5LbbO6lXcLqF5KlMseOGkQCSdfqX+CeAsWXuYh22C71CaQC1hbnhP2s1YLOs +WJpA1RZK2LJOvTGHDY69BlIdOmdx+KzfP6vUYEdPhUW2BHtUyjCm3Ep1jJ9UazDWYCMH1Rqhfby0 +XAYknlWhEytTIH9ToAWIx07vCJsOewGcMBxd4J8ASPhPvGg0voT6gBKHBqyUx41GWCwOd3bakGME +6ooDSMIGEHthQFKxDHMMunhUBIOVh3iR0UzASwB1LSN2ekfFCjjKBjfubLdrdRfqGKAUardQdrBo +TdMtFIzPPqsAwdqA3HWv04H8PKbjPz5rdXZrpJSjkXO4OvhiFtxg2NHkGti71U06TjaZrXoOdJZH +voLwCRBvkr7qDy9hGjfMrFQLmuYucKzr3h9Oz8r1kdUBZ+6Pphf90XF/cmb2VkZn4UaPz9a/deNH +DQgH58TqgW+vp/7j0fyBM76BuY3nawAnrRicUDd8Z3Q5cZ/2x7et3pkFW6lzCCQDYdsDIurs1psB +Dm+lBjCzmEwfWe0M2B7yBMoa3wvEZeKgtffs7mo6uxclL2qGX2vOAfuBi2D1Q2LslIaAFtjBfu/Q +824aOIY7NrA3xhdGt18B+Clh0z1YdhAg+Kdlrwajh33nBqa3ZS5LdIphv2PL2ts7MNDMStVrNpZA +yLTpdbdYgl0/BbtCIoExxJofmq1FueoBO4FJut0jIHPLDAfdvWZzvrXdADeCr5rNtNGAnkqhoJuN +aADjuja+u1UrFmFIQuK5LTpQwKVgs/FweDkcXWF3oEOBmQnnmxmd0IZXKHQwbbyCPoF0WQt/IADr +tbDRiMFvmBgANlQ/qc6SUyw6EG6AbTgRULvL9PGLx3/cLnY+u9vAUC0jHQMtT/YNc0qTKUGnT3cK +xt3PisUdA2KtjgNSHgJGAmFiOyq1ASx9gOrh4Gw8uhiOT7GtMJ8H4wurvyzX+qbtdbrJYLgPeeXF +T0ezq2pz3h9fNKykWB1jr8FgXvDEjx73h8fl+gTmkmHH0I81wzXaCSy4/ugq3ftuHj53JpdNO3aD +B2Az7HXTDLrOWZi9XZ78OPQetHqwFzzwldFOK80ZfjXxX47clwNwTndVM8BLbhA+nvn3YXeQHVcd +42BCK2Hy+E/sFE4rlCOsy/7gxE9fjr2Hdv+wBc1u78KyG47PBrPrStPbLvVA6fYOcPqwVoBbkOFg +NstM8Ypt2oI6NhGIqFGfW2aE84gdx9GGZK7WJ1hScAv23TBwJGPwzPZOh4A3pFZjDg27Q7hlAP1C +qKk0hGSDVoUGbFlpjWzGgDRvZw9PVsgUBdDqg69q9XGp2HF6MI6OhabGN463d/rVyhx7Cutsa6ti +Gl7bzmow7avzAhQoCZlxt3M0nt5CJpMWrgzwOZA5gJHNZgDbFmIKrHJ3q7pTMMF4MHhbJlTbAOcI +BinEF0mbdjqFsWwthPfDurvVhATDt7TsBIYS1hbqr9fLKtXeTqGxs1Mr7DRq1Umvu5qMz0xz1qj2 +Z5MDIEyI3FptSnivnZbBBuas002xWdDvtDgwritDcr4NT9vOqlYfjaZHVjcFhRw1AKh1Eh3x7tvB +5AqowIvv14wpFhw/L0PdALXasRfezrx7o8lJuHjcHhxY3f3u4BQ2aRWcYKXp4sts9ZVhQyPvpftv +3eRFb3wJs6vaDKAl/eh5sHgBoQec5swvK023VJkWsAs1YPWl5z+EpMUnDMfHYANgFUK/1XmjEbjz +B0n6suOsGvXp7t6zoX9SqvWK1VEJn9YkXXl08qujq9+1R2dGK/LC+2YbegdopA/Ei62E2or8x4PB +SaHUrlb7rVawU2jhpGO7wQBgPPKKGFCp7abpwYqs1X1Aa2irYnFcKGK/ljDQqrVRhf6QW6xC6IX4 +cHuni4d7vTOABFgcDdOrNibYxK0tAjyVCtRTz7LCWnXUtsIovKwbEHSwGjwh1lb1ml+tQHKOCgWr +badGYw7BBZ1Vrwc4WQSBqrMaeXSxPjHeXiz3ShUHIqhUwsQcaCjAp2IJX9FrNGcCYtlbWwbkMGSU +sBEm08nFb37/35JzbLtZKnUA80AE30IVljB43dvbe7a/egimqpZbHWvWsQKYn4Jb5pBUViveP3gF +WwzWKPhWSDwX0AtcNxkfC9dKv1yaNup+08BHRd3ePrme2tnJxVfd4d7WTrsI25MgsdvpH+7ufdkb +nEzG5y/e/pfFapd8XAbs6MS2s76zAmuNJmd7u4+fvvmrMzstCsaAiLbt/bn7+PLeXxdH35ntZa9/ +MI8f1q2w2vSguTqA8fP72f7XXvY88m++/dU/+bv37u6YQj5DyBMAGI5u7O4RzPn9w7fAz4XCEJgB +/4m/HU+uYCZD5LZb2cX6h84o2dquQlaAqSBCu87++frH89vf9Sfn09HJze33leZoa7u2vW1YdgoJ +Bggxn91AYeGYWO3IMD2hnuwKiRSyi8HtLTtsNMczH3LblY7u7R3YerBwlw4wWAtAKA== + + + GE9O2t3F3S1ja6sJOx16RCidpO9c2YQfgrrpFssdIU/6kDmwtiAhcdIBt6bjoyC+KlYd4RaDoQGA +55OSKo5qlUnbSqfjsyZYyIp6vRXMOgjScgVKzcErmkawv//S7qSQXTgRYEWjmVXFoQM4B0d17GA0 +BI+BtdoQyKUiQBf9EGodFuWDJ78r1welgm01PRggkF3b2zT5cgXKJY2SRzP3vFgwLGPcsefNOiwL +2Ckju707HJ1C3HWdY8CkEpRpeVgowH4ZN7ER7dQZrCDSoYIr5ZkBDrFDOpjEjanv3h6cvu30lxDy +Bnn/cMA9AZjjBvlLT5+9+cdKc2zbieMcttsLyDGrvWtasWkF+4tHb3/4l2lwXSY4GuHsDJyz6fxe +sveqOzyuCG3eHR8W66N2bzdOH5ntRROGsJV1nKPzs7f/9K//8+nVl3hvx162INPqM7Bou3Mxnj0Z +Tu752efNziHMsdEACA2SFvo9xHuBY/vdw5l3U21OsMIOAadlvTltmDPI3lY3a7WT4+Wzf/1P/1Oj +NdvebrZM1w/XkLTYo50Czs4YUG3uXcLkgcwxTLfZnBpmAKWAkfHh3uzqh9//W8OCtd4RMSkP/zSM +GOoPosYPrt+8/fcnF99Ap2xvN0olG5wA5bJT7EP2Yo86vX0IB+A66FNIG2DjYsHe2bGA6EbO6Xx2 +2XWWhcoAGhNycmvHhgaBUu53Fv3OcjQ4ms8vrVYUeFe1+gRiZ2urUcWHE06OcU7D+EG3n0kxWC73 +hHnYJzsR6tvwxqPlZHwAWSQgInEOGAyAEH+wQVjA7R0DFs1keA7x+Nmd0s42BocxuIKwhdUAE7JQ +sKsEpXp4Nf692Qghu0QQYdg0gXUnWzsWZBQ0Y6sVm7DEjQjWyk6BGLhIgqtvtnzTDJz+QRI/Hcyu +APKxazi5dYqIjQ0rBFN1+6vh5AwmZG9waFjJ3Lvx0kd2F8b7otvftzpZp7dwvcuOs1+oQp1NCHJX +JzXyQ0LGDqCLe/19rDPGb9qp3V1CGBYrGDydzm8WB2/ig7fj4KHZ3avUZxC8ZIxXB8Xq0O7uwRq1 +2gfdwXXTWs3dp3PvIcBVpT7CfmGGWLdyBdZWQFC5Ni/XwDDm9k4D/2xhnv6jKHsaJetscR8gBwhn +gK0sGTuFJv4TSzEaXXf7Z+0e7E0fULlpuOVqn04T7F9nH4waBM+ywy+LFHJycKAKBSwyTrdVLNrV +6rA/PBy7V13niLxPjUml3C2V2tgI7H6TPGZZpRYA5LfbJzP3pWkvyCSsAnFhO4YA9pUq+e7avdMg ++RzWBGnqJvbO2YGIKPaatXGtMm4ZYejfgBmqVRcy2WhCPw5r1RnskWqd4mKOc4xntgCzdzp4b70+ +hX7cIejYIWsXcpKiNm1InkF/RTYI/engT7U2tex9MAlEltGENTrB0YONvFPokYlao8k4vRMo+nJx +MOodbW1bd+4Ad7WBTwiclKH6bRKh5NDoQx038KX2AcQmhCc5PYpgLQCJKaYEfoaqJV0zvuj3DxtA +LKY/GB1YnaTW9ButtG4sDOvQDz/fXX3v776GwdLuLKBGIUbAwxDRUILVRlhvxtDaeGnLiAbOQbU5 +7fUXjrPqD878+OXMf2x2dmHCA6vbsKDtxLDikfvKy74bB08NWIvNyLCWLfIzxJXGoA5w2Fnt7n07 +mt03WnvVRoCj3bIzyBYcf3xXswkUd9bunhqt3TI5iByywStDSNrOYM/sRK1ualqwyDLC1XU6jIbp +m3ZYa4A/fVgWsFhNew9amKKKrQTKGlATXyRM+1XXOTdbS6u1wNZDn1YrWMb29nYN2rPa8IAnG2Zq +Ee6aQqRgQ6EgioUOqSHYiXUMuGe1wXtptZFa9mGve9RoTok9hLMUe9RsZS28HcjTWoxH6yoAT6Ft +NFwDoLHUr5ahko6aRtZsRrUa0CYYBoA5Bt+aFgD84XSyHg/PICJqlVm55Ny9W71zpwgQVSTM09na +xkEjV2qZjN8Q5kaNbA3n7rYFKVoqTUolTHvme9fYIHB1q+E36xRIhTDEh+BXUG2WsR/Nn8HY3N4G +YOvBNP7sbhMCvFqdkoMO2hbGYw2ydLfXO4ZIgeovFUf4oW0vKuTK6JRJzgSd9uF0eoMVxgR63WWc +PDDsgBzvZtZ1rqfui2T3m+HsHgwxrEYQPoRNUa4Osd3d7nI4PB2OrjvdAyiLYmnQs/eS6HGlARHt +QBdP3NvV6Y9+8hL8U6174/mD7uCCzmNt5sZvJsFzs7OPzWrZy4n7cB696DtAwslwemK1l8PJVcMM +SxXodFj6i55zbJhYqC7wHoBNpRZV6nG55per0GhZtwv8swKf4FCYnbjTB7I6b8C+a7jFYrdSGjkk +CcOdYgtK0Bmf9kbH1QbkFTkMR5N70/nDGknOcYOigVC7C1j3hpGWylPgZBMnqDbc3mnC/ipVp/gD +xU1LV/NaBpRCXC5Pt+4aOP6A30AjBfJ6QQd5PedqPn8xmT4kT1HvqGVhAhZZedURpLpFgGo5Gl/V +a2OjMem1s8KOuQ3bbafXtc/wE2hMOvtAv7U5wEajGQA7QTfVa6FlLvBPs5HhoH32WRnarVig6OTd +u807d+oFsjohOlwIkyJkSzOGvr67ZZvmotnE6u0axtJ1b/p9YNp4OjxvNnwJHctFB1xnNCLYLC0j +2d62y2RptiG+KuXxdPYIqyTcFwMcZLBZiQIN0MuTMm1T2GgAqUY7mGShD02EXS6XKRgBMFYB3uud +juf3KPmkOrI7+3Zn1WhFMEm2i23IQ5wdL3wANVelxJKwYUCHgjmhF0aWlfa6h8PB+WAMVG83zSl2 +uTtc2Q6FivoA8JMrZ3LdIGcRsA0EyBjDFst9KEQA2rZz1uqd1BvZveNf3X/0UxmKrzIGJ0OFDSkX +CPrUK9IXjbLkYZkCeXPTOuwPzi0KpO7b7aO6EWP9P3/9715+8VfYaIBVO0VY4lO7FXXs3Wh+Y7WC +Bhnyu9DXW0Vzp9Rrdw+m8/t+9GI0uQHK6vaybn+xU2xvkQoISW4YMf1peJSK0/Q7Hfxtj6L89Rls +fEC+XufYNJaVioczazT8cqkL0wxGGWYlsgLIu7VTgj0YZtHzgZOWy5Cf83IVE+sXS1C1eNgxm67T +TsbOCuqpDMAPmwgsWoKqBeaxCQObWMATCBaYnI2a1zb3OhCt3WPb3K9Wxnfv1u4SY3fBCfiXUmEI +owAgqg5zHmvYCHv9C6iVcmWGf1YgBkvT7SLMzIkIQKymkxuoLdib+CL8oTwcCKstk2YCCIdvp/mA ++X0cvQIp3IllBgBUJUinYg/2Y7sDyEE+f8gWDAtjGd9epT2CIraLQPiViXBZ4LhNC4UelF3dCLYp +VcMktzN4oIZfzSHcDFig9rLTPwbOKRYtw8AEoMSjJl4nAvHAnEHwoDdabRVtaAFneOIMjsAnlZqH +41yt+TUS1B2zOe20I0y4XJtDwvSci9FkvVh9M8+eAHSBf5zhGZAD+WFwnAs2JmC2Estelitzw9xt +GkkBDI/dKQ/rdd+0Ei98eHb9q4PTN7AITIPcPlD64CijGQC+tltx10oHzgoLArFDLllAtQox9nB0 +Mhoe9ZwVeFjA4IFw74fgfCgFQCksERgGkgqYcDo5gz2Fxazjc8iR7u4UwAnYl3mtNhPKYoB1vvtZ +4+5n9WKhW6/5UBxdqPvGvFYZ9XvYiDaZAFCvFSzXGMi5Wh5hW4Vad3Z2jLufVcClINYqU9tI+v0D +AclGvc4C0BHaGbYtjFO8Auy0vd3GKyhqQEoQ7y1v38XgnXbLt82g0YhqjazawDeebxd7W9DdFdjy +EZi/2z2YTK+Gk8t6kyIa5GTesT77rARV26hN69Xxzg7YG58GkxDrYAjvaGK0okZjTiKxDmCQ2O2M +8qMMsvvAY7B5G+TL9ckDRgcQyndaLA5w0jF/MKphRk0rKtUmWEDwG36CzcK/A1XO3XWUPpn7Dxrk +fpwCtsH8rDUGDQP2UQj+HwCjegD8e+U6fj6Ik6fdPrmDKI8FIpSiwNgyFybheAy1lQr/PKALAN6B +ae2S/7O9oIy76sy0Mkgq7C/EI5A8MRIJjRkObK9/As2FfQTawYbiIMB4tHv7U//eeHZltvY73RP8 +FgikAOaHwGkvGw0f7IE1gSSpNhJAYuxjs4GFCvr9fYpim4tO57htLWsUBcDku1A3Itbch/kD1Fqp +u1jJLH1wcvHVXUi2CnBvInKletBThSKQ/1REl1xsSmEHx7+Df1JEb7u9tWWXoMuqM/AJdByEQwNY +t+IAy+EgQ4Vh+2qUAAbWghoCdGlvb9W2t8CcHdjyBfrSeRI+a3eCzz4r3P2sVC0RL2FiEAvQmCUR +TwR2wl/B6MC/YBC8xaSEk/OecwqoBjF+d6cLG5nMH2E7QNlhtrUG1HrWMhfAKpB+lhE3apOtuzCB +2wQRwUU1D8Cp26cslHZvD1DHaMWt9r6IFFPwrj86GrlXg9lFiUxRQFafkGR7gT+0TWXwrWfgV2SI +zavNOSF5k3COQymUe2Yr7vX2J5OjyexkMDprtVed3kGHPFHHLdt3/UsvuIWB3Gol2KZidVysjoDP +L6/eOcN9WOhGyy9Uhlv0adMK0AIF9I8ok7O7alHahrdVGGwXBk2TkBJsK0hvaNJWe68/PG11sq0d +A7ZzsdSHzISattoroOWWdQBmrlRhQfSgwVvt5eHJr49OfnQGa7tNMUQcHEpBqVDoRKR6OiLXLjVa +SxhKMNgh+nCyKiQ95vVG2u+dDwdQHxEYj9wOItmGPNjb7WKBsj3xaePJ2XB2gT0SnswZ2ek7nRoM +w1pSrcFCoVSTCnlBZ4XCYGvLghYTeBisNSgD+TTIBdoyI6e7X685pSLEWgB9CgsOuqbeoIRS207L +xfZnd8BClcKODQkM/gf2s+0j2F9kUOw0Oy1Kb4DyKhUdkTnsVikOjm+08ckiONUBVqmTERo1jIQ+ +qkbpH2Xy8/fu3KnevVOnWZEKi8zWrkXZaxn+pQOWaPlgyx06PmPJWo1mNhhf+snjmX9v6l16yW3H +gRV/0h9fDiaXbvQoyF7Ge2+M9kGTEktgAMIQPsTmUuzVxKlfmhak2YzEkZ2APwdj2OkH2Gvs72AM +hXXZc/Ym09OZe9N1TnvOSZuC5qvR+OLs7If91Zfj6TkMefI+NWGR7QILASTDGur2VjDbK00AjwHO +PjjHsHb7o7PB9NqZXMFYAxoXMd+JyHQ9tDp7VSBkazH1HsaL17ZDXm6ozoqQezulIczJweTGGd9C +w26T0xKSzRtOzweTM8y2WIYhFjZNyl91RqfQqrAuIcnBXRDCDUrvgQGyxrc3rQzMBrQzGKw63cOW +tQ+mhZVXN8EksAKiMjmrSSaQQoTiNiO7s2dgwvWwZgSVOiUwAGc2YSnXcFSzci1odVbD8SVQa6Xq +kY+xOha5B12gJsBaGJ6mmXbae932EnyF+VQphk56h0JLLezvLizxEpm90LkQI4Ar3Q== + + + ahXWmQepaFsQL9Dv6XRyXK70IHh7/aUX3uIgQH6CLTv9Q8DdOhlHyWi0otzm6hQbjR20u8etzkGd +EmijHZJ4YB4KO0KhkBgxAgiKmf/QDx8G0QNsNyzoeo3YlUKxjRD72BtihS/2Tl572QNYQ250259c +dMAS7lWyfLm6+CFcvu6PzinIa3pB8qA3PIV8aJNnYIndGc8veqPDWbDu9PZG03M/e+RMKD3PGV94 +yePFwRfp3rNZeNt2jqHC5u59D7DKOer2j8Uzp6PZ2d7RF87kpGHF+JDu8GowvR25D/qTdQt7190b +Ts7D3ccQRH7yPNj9ojs8N9qL7uCsA0btH0IgiLhk0miFVjfDn+H0dOrdePHTefCoPzzvdo/s9gqq +s0Yuiz2TEhdnwNUNYEsbOwu9DHQRUhjFXmBA/Ok6+AnlxtcNyJlJr78HBjaspDc4hR3a7R96wf0Z +jPHRSae36g6OmnZWgl4DB9qLqX87dtetzoL2qO5SDLS9a2NYByrgehbc7wyO2v0V5mn3UqAIs50O +p2cTd42jh2lY3T28COoVDFyvz4zmvGXCjHJ73VWvd9jDonWw7BDCe/gisGsViLTu4if4T/ztfLaG +soCoL9dcSrCp+dDgsFYc59D1r+LlQy9Zz8Pz03vfuNFDyv9pJp3+Sde5sLuHzvAw9C/CYG339uqt +CDtbozSwEcbH55BSM4GXho3mZOadmJbf66eD0SEgNOw4GOzjyUNKnBth9XaBSaD7jFbaoQ26DJeP +B/PLefww3H0yci/GLmTX/jQ43z/7Yv/iq4l/DR6YuSdXt78ezS8t4MPxGY68Gz2YBjeD2dlwTrbe +3url6frb3vCwCRE0OveTR+CrZO9ZvPeqN77uDddQte1uZHWwyzHkgx/fuvH9ib8Gt9TMaDi/7o2O +usNDZ3Ixcm/d9KWfvYwWr2fho8n07Or+b/zsedUIO85xkL4MMtCfzoKHHWfV6qRglTblxvvQtn1n +uVi9PDj7Ktt/sVi9mnn3IVWqjcAZn3edwwZlMAYiNWIO8w1gWwR/x1TcYSWd7p4zOA2ip6P5VX98 +NJqdevH9/vjAsENncopPxp+Jfx8Ltbv6PF48c9Pb9vBgB8a7GfcHR8Pp5cS/xT/pAydnfvzw4t6v +s6PXQ38dLZ/Hey8jSuG+t3v0Olo8AHc5o+Xy8Mnh+Zto8UhE9mWy/V5nsJrOzq02tOEIik9UBByO +5zfQJqRQ4ofEpf2V3Yc8x2Lih3sz797JxXdHl9/1RmcQNXZvBQudQvbG3G6nM/9q7/zNwdU3109+ +fv39f7V/8V13dNqfAAsdlaoAQkf94Znn3z89/2559CU+cDA5rwmHQKsVdp19oKMuZfAex7uPF4ev +osXjuXdGBTs2OOGq0zsyKEXtYB7eBruPhnPol0sqyekuO87+2L8aefemwYMge7J/9vZ4/c0sPJsG +J9HyQbB46C8exqtns2id7D+dhDeD+bkzPYEk6Q1XzuRo7F7iV8vVm8cv/uHx6z8vDl+68a0zu8Re +uOHai+8tjr6M9r8+uvod1sTuwPqA9Ig6/eU8uIY69nef96fXvcnl8uRbN7w/9S4GUzD2iZc+n4aP +x96D0fz+7uLJo5d/nscPyg0XG5csXvvp89H8ZjRfg8nxcG90PAtuDTuoNcfgXje88NPrdJ++Jd57 +AcTYdlYT77puBi0SuaSyIQHAY5Ba/eFxnSpidu3OwmiBEqTL16uzb5anXy6OPscfLBc+EyfI7u/3 +JsfT8N40vL9/8tXuwefYrGlwXW3MLDvu9yFMMmd04YWPcUJ3D16frn989e2/HFx9i+VN9l/56VNs +/fXz31+/+P3+xZdufC/Zvffg+a8fvvrt+e13YBVIwrG3Hswv8AovuhlOjg8OXkCEgrUm7jX+DKek +Si5ufzq6+i7MHp2v3yZ7DxqtwOou5sG9xcHr/YtvVuCuyVnTSoPkvt3PytVep5+FGUTWvf3Tt7ev +/uHVD/+yPPt6dfL67ff/3gsf1JvLafBsHj11oyd7B19eP/5TtPwcvFosO6YZdNrJ1D3LDl4Ei2fp +6vPrJ384uv4B+5guH17ffNUfnTYNYDNg7P3BaB1kr5an35/e/G4ePjw4/gIHBAZd1znwsxeLo28v +b//w9sd/++1f/ocvvvrHL7//x2jv0Txary6+XF1+Fe09WZ1/+fj1X1//8K/x6nl3uOoMFs5oP0hv +IaBO7/368uFP6f7zr378T9dPf+rOjrujAz9eJ8uHq8uvw9WX6ck3s90ns+TB6uJrqxvWmkNntMr2 +X57e/u700R+OH/z2+Pa32eqLhy9+vzh85Mbni5Mvgt3nkFTh4sXB2dvrp7/BD6ceePV+veXZ/V0H +u+xde9FttHh2ePnD2b3f9MeHg8mBF15YXd8Z787888XRF8c33x+vv79+8PPjF38BhJt467F7A3mL +z48XLxYHn59e/3hx+7vl0beQtNCVrXY6nl0ky+fL0zfB7pN5fOtlj3YPX03CdWd8PA7uTaP7XvZk +7+QrrPD1k99N3Eu7HfZ6mWXCEHC7/ZMoeX7/xR8uH/94dv/H9fM/H1589e1P/xErA+05dq9O7n// +4rv/8Pbnf/7mN//y8s2f4t17bnB5cPZlf3QymF70xufz+NGDl//u6tFvjq+/e/L6rzj4zVYwmB1D +ioaLZyfX3z949af7r/54/ejHn/78n2+fv/OSm3Z/MaSqlhfZ0ZuLJ789uPzV7ur19ePfWf2FZc/T +3Zvx9LBac4aTg5Pr7179+l9fff9PP/7pP/93/8v/HiSP3PD5ozf/vDr/vjs474+u5vETZ3LdorQl +H5KqabpQhcnyfnbwbO8U8uH7aPmi7RycnL/5X/+3/yM9eFmujaLk/qPnf44y7BcE42/Sg7cQvL/6 +9T93x0fVxnwKZLX38uzm54v7v7//4h8uHvyfJL33uxxXmS76D9xjSTv07hyqK+fU1V3VOeecdu+c +c1La0pZkBVuWZFmWc8DGCQMGxoCHAQMGmzDkMGQMGGwMZpghM8ycc+fc85znfiWep36wZau6aq3v +e0PVWm9t7h6/fvKOd7FKJZqc6c2enVw+P7F0tj44Oli9NLtzd3/i1OPPvpypAfzGw7F2trpRah+t +9o51Zg8m1u6s9rZmF0+u7d8NxNoabM1sXErXtuXIoDF5am73Zr53oOrVaLYlBPMIrjNSVQmPG9kF +IzOba2wW2ttarFXtLycq81KwrhptUsgEwq1QrBeK9rrTl5KFNZQOM3ImnBxnJFBWRROH9V4gPIik +F4uNo6X2XjBSDUXqglrWor1EYSGWnctVV2qdjc3jV2dXzwNasmI+VV6udXd7s6ernd18bStRXBeU +5vj4/sTCOa9fI9k4lESxtZetrscLS+Pz52eW7rh07alGf8+DRaHmteg0lL2RmFXCc6HEZqV7lhdK +CKLjVIpkU/HspBppR7PTWrQbTg4K9XVBrQOLaZFxXi7E0hOF+moiNysHiiQdAzas90/KwVYsMw1X +y0qleHYmW1vRU5MYW1Ij3XJ7LVWc4aRMurIYMOqJ7KAx2EuXl/R4r9hcufHw++FUvFzszZyaXr9c +nzqdqa1F09OsWAdBWyyvbx27P5Wf8aGiohXKjeXxhVMTKwft2bNT61clrR0ITdB8wWIlQB4E4/Pd ++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 +kzNHRjxDo54Ri5/mSqncVjyxyFBZp0NUtbIkJ/L55uLS9ubW/rlL1x564t1PvfDCRz71T1/55tfe +eutXf/mP/3zn3/74je/+6J4HnmqOb8K1jd1aA0bikSxo3WyrVh40O/ODifnVjd0zt196+Il33/vY +k5cfevjUXVcvXr95z6Pvvu/+Jz77yuc/+bnPrW2f2Nw+U6xOghLAiJASLAb0CiNEA4FkudKdnl1a +Xd86de7MlftuPPr0u5/78IuXH37s/PUHbz7+7If+6R9f+/IXv/St73z+q99874v/tLx9SgqkUFx1 +exgCU8J6OZ6oyaoRTxX6E/NLG8dnVrZbE9OTi6uz63s7++eeff79P3r9x7/89a9e/cpXLt/zwPjk +eiLZdLsFt0PyulUCMxLxXrm8SJKG3U4JfKw7WG30F3PVyWSxl6tPbp+888rNRx964ulPvvrqg08+ +c88j77755LNapAJSCuDO5WAFNi0KRVmpiVKeIPVwrJLM1ouVVqMzO7t4dP/ctafe88Kzzz//1W99 ++2dvvvX5r37t0t03ZxeOlSvTvJjx+jSPVwYIYtg4qFk4odMpYFg4lhhU22uJXDeRa52+cNd7P/KR +Zz70wXsffeThdz9344HHrt330CNPv+fzX//WB1966b4HHz516TonZTwewe1iadpQtWokOi5LpUSy +GwwW4vFmozm/dfTs1Mz0qTO3337n1Sv33Pupz3z2t7//07/94U+//8Mf33z77ec/8OFicXxkFBsd +paDpwuHJbHbFbhNsVgLxCqKQpui0DwkhiErRYYaNptPNvb0zl67ee/ritRsPPf7M+144ceqO/sx+ +vbstSllzLev/cPO03q1Pri/vnN0/e+3yne997t2vvfrKz974+a9+8+uf/Pynb7755n/97W+//u2/ +fv6fv/TCP3x489jtpeaGFzEQbzACrlxOJMPpDliI3YPzt99x5drdzzzzzOe++KUvfPXrH/vMKx94 +6SNf+trXXv/FL1957Qvf+vo3/va3v736pW+89x8+furC9US6ly/OdAbr+eqkpmezmfLC3OwdFw8e +f+S+D33ovR/7xEe/+q2vvvXOO996/Uef/8Y3vv3DH//xj3/6P//3//7pP+BKfvutH/zgkWeeb0+s +G9EmACZJSFE9VSu3V1fX4NjZ3bt2zz3v++ALL7/y8Rc/8Y8vfOwfX371le+//sOf/+Jnv/v33/z3 +//7vt379zgf+4SOXLt+by49LXIEhMmGjnyuu+FEd9Um6mgLg3ts9duPem088/cwTz7/v8eeef/WL +X/nej1//wU9e/9Nf//Tn//jPX/zy17/+zW9e/fyXd49dzuRmeL4Y1DocnzfiPT1SbzVnl5a2Tpw8 +ePjRh55+/j0feuljn3rtte//5Kc/++Vbr7/55i9+9fYf//yH//X//jd06/d+9PNPfvpL2eKU3ckC +J7pcvMNcIamSVFwNFHPZzubWsYcef+yhpx5/8RMv/eCNn/7kzV98+V+++dpXvvjWO2+//Ztf/fiN +13//x9//f//nf//6nV997FMvX7zz7lSmxTCgtzGHg0AQSeBi5eLU1MTayePn7rv/kSeefvqzX3j1 +hz/76Te//50vffNrv/n97/76X//19jtvv/X2G3/7n3/78S9+9uiTT3X6q/nykhpsulzm4ucxC85R +YYGNhPVSpTINmqTbmzm6f+ahdz3+8Zc//vobP/vVb3/7xa9/9adv/uJ//fd///Gvf/34K59+8pmn +7rn3QV1vcFyZJQKD1tTG0tbtJ09fv+vCg/fd9dxTD37li5/+93/7NVT0W2///Kc//e6nP/ORu+++ +tLq6msk3jFgbRQ2fV2bIoEAHdCVUy5WObe/ef/P+xx5/9IknH//Iix/43ve/+53vffdzX3ztG9/4 +2h///Ocf/uwnn3rlk5/+7Kfvun7/4up+s7OkKJlYuJov9jLZejJZmpta3lxdP7q58sDVi//8uU9/ +6Uuvfv2bX3rr7V/8/i9/ff0Xb77+85+9884v/+M///LOv7/zlW9/+eEnH1hc244k6pKSEeWEIhqV +Qn1uZvnMwflT+6f2jx29/8a1V1/95Btv/OjNX/3yu6+//pVvfvlnb/7oX3/79tu/euPXv4Jm+cln +Xn3l2vWb1eYsgesEpge1aiwxSZExjtYjWrpeqO1urDz7rke++LnPfuPb33z5s5/84es/+MOf/vjX +//zbG2/96A+//81P3vjhpz71kZc/9bHjBxc1owxyCMBKCZSMaCMSrQ7G52an5k6d3H/v80//48c+ +/IlP/dOnP/vyD3/8/f/4n//1r3/4/es/f/3b//LFP/7ht7/+7TuvfuFzzz7zXLO9jPiDYNwcNtrt +FBBfQODT1fJsMd85urP37Hue+egnPvpPn/nUD37yoz/85Y9/+Otfvv+TH7z59ht/+A== + + + 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 +REyO9T75xqfm5vf8IXl4hO4Xlum3h+g/gQFyDseMcmVO00tPP+UHPpQkkrJak7SmpLf7q+p29YVH +rz/z3GOeB9kzMTl7vTF+PlNcBGRoe+MI4vn6RwC4ZmuHJNzBQRRDXI6rMHSaxB04ah4/DgX95Hh7 ++f0P/2RkCD0JUOdjgKJQtJbrzcTcDkcZE1PrkpwGOYtiq7zeJXCpVFtsjO+2J3frYxuJ7KRuVqr1 +ldW9W8s7F9qTG6n8rJcCTNIEnte2at3eKUUr97eycBmWSdKkBaDVrwwQEcHXHBv3+4mAnwTK0HLb +sytXz998a33vme7M3tL89k9+9LN7z7+ueS0rOVVs7SXyK/na9tLW3Yu33pjfuNbobD549T3V7YZg +y0nPFtunq90Lpw7fOHXxtam1G63W5jf/9Gfvfen7EcwZDSpPeuQpCJmUrfF4erFaW7p95/mN/Rut +2YOJlQvt2TPJ8tz4/MHs8oXzV168/eKn0sX5anPt5v13nn/tg72LD8dmj9zUFCsWWL4kKq0gBLiR +BmEegYE/SgpiRTcbDJdlpUoIMnmhCCOyP4gifVFXl42mKJUxzAPpSVFzk7NnVLOUSNVr9elMYU53 +pmi+QlE5ikwC5/WfXaQBJKJRFcO9YFAcHARWmiWJOAKbIN1TlEfRHs3EJLWg6nWgyoZ9eBjicWDf +YGDeJVlNO16zO7U/t3JFM6oEZUXR/pmOJzvucKi/scpimJRut2HEDAX5wCgHmDbg5/2jdAT4Plgv +NdfnVi+2J/ecxDROp/wBTpPzrtPCMBvADMNiwO7pWo2m4mGAT9L7z1NakZBy8nj0xLHQieNB8C2G +aATaX0EjSff40/6gn/GNEP32iAORJ0swTGCU5PkEQRogUuKZmURuSeDMTG6iWFts9nYKjW3L60pS +FjjHdHGKl21WUFUzKyq5ZG4pW9kEXi/Y3+BqKHJFkgtPztji/TOAYYHA3VCAAzc7NBgBRpggLIK0 +RTXvZaYrjY3p+bOrq3vXbz83v7Lf6G7tHr24svPcuSuvbe/fK9cXDbtkO/VKefbo0rNmDPiF6YmF +iyvbN8dmD3PVRSfZUexiNt155v5r1555GcZty5tSzG4svXjq/Ktb51/Olxdnxte/+72/uP3wVSve +zlUWW9M7E4v7N59/44Nv/NnX/+wXn/n4uxcvP//xl7/zyU995GVnvcysEZvOljdnl28d3fj0ys4j +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 +klmQCHMWn9fQnbns+a3eVC3eTErbvcTz15c/+ezW518/9/i5nbuXN+Z75ZRtEhAMBzHIT1CIIfFp +FhdZBFdprOyx4wW1W9Dmmua5OfvZneyn7sx88fH2l1879cdffuW3P//S289tn1nvdSo5nRPxCIGE +SShEM5TDkxYRhoGpzmtiI6YVTXaqZCyPJWabqe255p1L65cPpu9fW3rz+f1P3r98ee90p1hKu7Ym +0Gg4DNQXFKB9QyiAk28IB4x68phvZDAY9SOwP6xRRNaUO6WUJ/MGQ1RTXjmdTOhu0kgSUebEcR8I +WMiPAbGlYmGbGK1bkTMT6vMHlVt7lftH7Q/fOPj6e1c+/+rq+w86v//erX/8zbt//rVn333lYGex +k3VdYB+CviDkG2ah0QwfnYwjU8ngUjF6YU67eip7uJE+Wk/f2KvdP19/7VbvjXvdDx5O/c1fvPz3 +v/nMtz935u5OIm+g4VG/3xdhCJklRDKCyEioY0b3W/TRJP/oTOrDF+c//Uz37TuNDx5N/uI7N//x +t5/5xTcv/+pbR//tZy/9j//+87/4+t03781f2q7kYg4RBdHKOqKetaRGkluqq/sTxkwGmSvinSSx +1LJWu95617m6XXrv0eYffvetX/36ax+9/8yju+t7G+OqQAR8o1AAg6Pi4GDwxLGBqG/E4yIpIZpT +YI8d9bhANyPO1czFtrE3abz9YOPtR/sv39388jsXfvKDd19/6WqtYM1NdWfndpa37qp6AQv6LRqO +80jLws6MKw/PVZ/dyx+MCy9fKP3iew9//oOXP/fc/Bce9H73wxf/7e+/9C9/+PxPvnjwz7968S+/ +fvHcgmPTEBLo1ySkYJGMYgIciLPBuSx+bzP23c/t//z7D771ufOfebb9tU9O/fCLB3/4y0d/+fHR +jz/c+effvPS3P7z6+WeLz+5ndmfSWUfNeSBXxk01JVFsQoh2XHilwNxc8d68MfHSucKj85k/ef/8 +b378+F/+4du//8W7v/ru7f/427f/v//3b/746/cfHZa/+fbWL3/w3LsPN9KmHByBQZIFNpYjFTQU +IkDKh3w6ETDx4dkseXkxfmk5vTehH81bL15s/emX73346s6Hjy+9+cLVjOPCERYwsIwRRZWeSmDb +VfLOovL+7cZ339n/zjt7P/3KzX/4yeP/8e9/8fuff+rHXzz4m/9y719+99mvffro1FQ6DRwkLTqa +JxKEScENA1vMwue75M055dW92LdfX/rp125+//Nnv/7m2o++cPAPP3rhP/76vX/97du/+f7N333v +8m/+5Npr16bLTj8JAhES8kewMOqJWkmTFxLUy1vqOxdjn7ue/c7rM7/9xrn/8w9v/N3PX/rzL+z9 +5ttH//iz+3/3w9s/fn/zpx+u/+ob+//lc1vXt9L1tBsJIEiYoiP4ylhhve2uVKXrS/qXHnZ//IXT +33x99uuPF37/k5d/9b1n/vSzuz/49Pp//7v3/+d//+E//tXj33/32v/xxze/9+HB9jjAgn94cCgc +gAG3Www7neE7ZritjV4epx5sWc9sWa9cyH34aPr7n9v6xpsLP/36lX//+y/97s9f/MOPX/q3v/3C +X37j1sFicabXzebaKKKkLbdiS90YuV3CLo1TH9yt//Krh7/99pXvvrv+7U+t/fSrl//1d+/88tvX +vvfu+n/9+Nz//uvXfvO1C994UPzgZupgjAesIlGcbzB48ukh1DcaZ4JTMehcm72+ZD46n3/v2amf +fev2P/3V6//bTx/+8YcP/vjj53/+8eHPP9r9809NffZ69tK0PBYjEhLWLyfK6gxheEauW6mvdBJT +aXouiVzsUZ+71/jTd7d++NHBn39h5xffufiHnz7/tz979MtvXf7lR5t/+4NL//yr537/gyvf/GTn +0xe9Fw8KtYQGhxmBy7C0o/FKI23UHGLMw872lHtryos7xlsX02A0/vrPbv/qOxd//rXD/+ufvvJ/ +/+uffPut9e985tyjW2scRmMRNiZKCZ5I85GOgy7l8KNx6eUzhW+8tvr9z+z/5INz//6bT//P//jJ +3/344Y/fP/3+g8VTs9mESnMYQSCCLidNOelInssxOQmez/KHU8m7W9kXTsd+8KnV//W79/7w43e+ ++NLyRw8633tr4adfOve1Nzfuny2dmcs3sgUDxJSQIjEDeDGWUDNmsmw7WREfd4kz49a5SevqvPWZ +a9Uffn7v19+59/3Pnf32W5tfeH758YXWa/ulO2uJtbZST/GmSEfCtMhkHb0ikULBUnMqVVTw+bxw +/1T+66/O/+j9U3/1ncu//f7dP/zFC//0q7d/9tWLP//i7j//7Pl/++XLv/7S5rcfZV/cT8wVBAYO +hQOIpRYyXlvnLIvG6wbRUqPzTvDGNPfJw/Sbl4tfeTT/779/559/9+bvf/jMf/vVK//2x8/99BvX +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 +f+Or3/7O5VvunF86Vq3NinIuiJiBoAoQxPFJULPwQq9XIohoIjWodzdShV6q0Dlz8eYPfvKTj3/0 +I3e894H73//k7fc8eO2u+x547ANf/e73P/Lss3fde//py7cKSi4QkPw+nmUjulmPxSdVpZJK90Kh +UjLZbrUXDx49NzM3e/rs9dffePXKbXc8/6Uv//HPf/m3d/7y53feff3NN5965hPl8uTIKDE6ykDS +RaPT+fya2yW5nBQalGQpy7BZBA2jqM6wUY6PZ7PtI0fOXr56x5lL126/76HHP/T0idM3TMydavYO +yUrermV9j19krV5zenN159ypc9duuvGDT77/pRdf+PVrv3nrD79/9Te/ev311//zH//4/R//9av/ +8o2nP/aJ7WPXV9pbQTSCBkMxcOVqKh3NjoOFOLx74fobrly75fHHH//K17/xtW9/9zNfeuGZZz/5 +je9855Xf/u6Fl772/e++/I9//OPFb7z8wY997vTFW1PZfrE8Nz7YLNanTSufz1WXFuZvuLT70AN3 +ffSjH/zM5z/17e9/+4233/7+K7/46ssv/+Dnv3z33b/8n//7f//yH9CSP37/Zz974PGnulObkXgb +AJOmlLiVaVS76+sb8OwcPnLttts+9JGnn3vhcx///Kef/synn3vxhZ++8vPf/PbXf/r3P/z3//7v +N37/9jMf++Tlm+4oFCcVocRRuWhkolBew3ALRxRLzwBwHzl87PY77nz4sccffupDDz351Itf/9ZP +fvnKz1595S9//8tf/+Ofv/3d73//hz+8+NVvHj52U64wJ4rlkDkuiMVIsm/Fmp32/MrKwRMnd+9/ +732PPfWBjz77medfeumnr/7q179745XXX//tW2+++9d3/tf/+9+QrT/5xW++8MVv5Mszbi8PnOjz +iR67QlKnmaRulAv58e2Dx+576MH7Hn3o459/9mev/erV13/7zR9+76Vvff2Nt9988w9v/fK1V/78 +7p//v//zv3//9lufef65Szfeksl1OA70NuHxUCiqSEKiWp6Zmdo4efz8XXc/8PBjj335ay/+/Ne/ ++t5Pf/SN733nD3/+09//8z/ffPvNN9587R//9Y9f/vbX733k0fGJ9WJ1RQ+1fT67+NkxRgpMVOJj +UatSq82CJun1546eOnvf+x763HOfe+W1X7/1xz9+/bvf/tXrv/1f//3f7/7975974YuPPP7obXfc +a1ktQajylDHozGytHLz+5Jlbb7547103P/novd/6+hf//d9+DxH9xpu/+dWvfvzFL33yllsur6+v +54qtSKKL4xEkqHJ0SGINSws3CpVjhw7ffefdDz703ocfeeiTH3/mJz/98Y9+8uOvfP2ll1/+zrt/ +/evPf/3q8y984Ytf/uLNt969vH6qPb6iablEtF4s93P5ZjpdWZhZ3V7fPLq9ds/VS//ylS9+4xsv +fvd733jjzd/++W9/f+W3r7/ym1+//fbv/uOff3v739/+1g++ef8j9yxvHIqlmoqWk9WUJkdqpebC +3OrZ3QunT50+dezo3bdfe/HFL7z22i9ef+t3P37llW9975u/fv0X//rHN99867XfvwXJ8uqXXnzh +2q131tvzFGlRhBUy64nUNEMnBNaKmdlmqXF4a+2J9z3w9a98+eUffO+5L3/h56/87J2/vPv3f/7j +tTd+8c6f//Dqaz9//vlPPvf8Z47vXjIjVZBDAFaaUYnEW7F4fTC5MD+zcPrkqQ8+9dinP/OJzz// +2S9++bmf//Kn//Ff//mv7/z5ld+88oMffv3dd/74+z++/eLXvvLE40+2u6soFgLj5g== + + + cbF+r4QihiRm69X5cnH86M6RJz7w+Kc+/6nPfun5n736i3f+9u47f//bT1/92etvvvbOu//+b3/6 +wyu/+snvfvfKL1/54VMffOzqLbdmsi1JjvsDFISWYRascDERra4tbT34wINf/drXfvbKz7//o+++ +/a9vvvPXd958+63f/O71v/39L/CeH/34Wz/9+cu/fPXHTz315NlLt6wfvVHSSqOjZMCnBnwCgYo+ +N8EQan987vrzF9774ANf+PIXv/gSzObnf/qzH/zzv/75hz/98WeQdr/8KUzUZ577xE033bC1cSQS +bVeqm2El2a6ONyrNcjY/Nd1fWVuam504tDV35+1nH3746u23nb3x0slKOR0yZJbmUJTFUcnjojwu +0uchaUyOa8lKsjJe606Odw8f3Nw5tL680D9/dvP+e88/8uDNt1y74dbbbz13+eJgdi4SzShqPhIH +7V0O+nk0wFO4yBA8CJfTxy4cPHg0n0p3Cpljm/M3XzrxwH1Xnnjizu9+80u/Arh5/dU3f/+rZz/3 +9MUbzkzNTYetpBkqMGBdMQXHVUWMnDx6/sKFa832VLXamu2Nby9OXzxz8NmPvu97L3/l9Tdee/tf +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 +Jy//j//66V987d5b95ev7DVKqQSFgGzlE7JZdJROVlhr62dmrIUCtlQlJ7PUWtfZ7Ce3+4nre7X3 +H+/87jd/9ItffvWjD559fG/79IlpXaIiwRAUIVBEHh2NDh0bQYKBpADnJKSkoUk+lBQi/YK81LJX +e9bpWeudhyfeeXzmlXs7f/DupR99773XX77eqjhLc/3Fpf313Xu6WSGiYYdF0yLWdYiz09qj883n +TpcPp6VXLtV+9p1HP/3eK599fvkLDwe/+f5L//4PX/rX333uR188/JdfvPSXX7t8fiXhshAW8WsS +MqhMI4SERtJ8dKlI3t9JffuzZ3763Yd/9NkLn36u99VPzH3/i4e/+8vHf/mViz/8cP9ffvXy333/ ++ueeqz53pnCwkC8m9FIScGXa1nMKw2ckZNJDNyrcrY3kW8/MvHy+8vhC4Y8/uPCrH77xr//4zd/+ +7L1ffPvOf/7dO//f//s3f/vLDx4f1b/xzu7Pv/f8e49O5G01GkAByQIbK9AaHotRgPKhoElFbHJ8 +sUhfXU1fWc+fnjEvLjsvXe7+yR/c//DV/Q/fuPLWi9cLCQ+FeYDAKkFVdXYuQ+w16bur2gd3Ot9+ +98y33j394y/f+scfvfE//uMvfvvTT/7wi4d/86f3//U3n/nqpy6enMvngYNk5YSRlCnKZtCORawW +0Qt9+taS9urp1DdfX/vxV29993PnvvbW1g++cPiPP3jxP//6/X/79Tu/+u6t33zn6q/++MZrN+br +CZ8EgQiJhWEijidlo2aoKxnmlV393cupz94sfuv1hV9//fz/+bs3//6nL//5F07/6psX/+knD/7+ ++3d++MHOjz/c/sXXz/zpZ3dv7ubbeQ+OYFicYWFyY6qy3fM2msrNNfNLj/o//MKpb7y++LU3Vn77 +o1d+8Z1n/+QzB9/71PZ//f0H//O/vv9Pf/XGb7994//427e+8+Hh3jSIhfD46Fg8ggJsdzh+viBO +2vGeEbo6zTzcdZ7ddT5+qfTh4/nvfnb362+t/Phr1/7jH770mz9/6Xc/fPnf/+4Lf/n124er1YVB +v1jq4ZiWd7yGq/RT9F6NuDLNfP5e++d/ePTrb1779nvb3/zk1o//8Oq//ebdn3/zxnfe2/5vXzn/ +v//ytV999dLXH1Y/fyt3OCUCVFEYITgaHX56DA+G0lx0LgWd7/E31+zHF8rvPzf3kz+6889/9fr/ +9uNHf/v9h3/7wxd++pWjn3508OefnPvMzeKVeXUqRWUUwi8nypscZSWtUr/R3pjMzOXZpSx2ecB8 +9n7nT97b/f5Hh3/+hf2ffevy7378wt/95PHP/+jqzz/a+bvvXfmXXzz/2+9d+8YnJj91OfnSYaWV +MdA4JwkFnk0YotbJW60ENZUkzg20+1vaS/vW25fzYDT++s/u/OJbl3/61aP/65+//H//2x9/8+3t +b336/OPbWwLBEjCfkpWMSOVFeDKBr5XIi9PKK2crX39t87ufPvOjz5//j1996n/+54/+/oePfvjB +qQ8erp5cLGZ0ViAoCpNMNWur2YSS9ASupKDLRfFoLntvt/jiqdT3Prn5v377/u9++O4XX17/6OHk +d95e+fGXzn/1rRMPztXOLpU7xYoFckrK0YQFvBhP6QU7W3cTRZmc9qiz0875Wef6svPpG83vf+70 +L791/7ufPffNt3e+8ML6G5e6r52p3d3KbPW0dk60ZRaOszJXTJgNhZYqjl7SmapGLpelByfLX3t1 ++QcfnPyrb1399Xfv/e4vXvznX7zzkz+8/NMvHvzLT17495+/8ssv7XzzcfGlM5mlisShsXgEc/RK +IdkzBcdhybZFdXVkORF9Zl74xFH+ravVLz9e/o/fvvsvv3nrt99/9r//4uP//ref/fHXb371jY33 +X1hcm0o5mskzDridRqFjCUJGprc7iUEKW0pDZzrMc9vpN670XjrXun8i/7nbk7/8xo0ff+XmN17b +/OLzM29fmbw8n1ouA07FZEpkcB0omfFhiENZGY0l6eiUS57oOGdmCwdTmWurxRfP1t66NvXOMwtv +PbNwbtI839MPJ+3lipsSZY3mJUoAml8RUhKXNuS8KXn1dKZqqxWd36gnzs/kjqadt660vv7a4l99 +/ew//+ylv/zi0ZcfzX75Qe/VPefhiv54J79VlR0yxiG4KmVtq0eTCWADKZgW4LhHQy2D2KoK53rM +89vWq2cyHz2Y/N0Pnv9//uMr//TLj//6Ow++8urZy8vVmZKnizqM6DjCE7E46+/rIos633K4may0 +0TCOFrNX1/LPH1T/4KX1P3zz1Dv35u7s1eZqpsiiUCQcDsShuJhJ9pr19XSip3GmQdGdpHVupX/9 +YGGQJS/O6C+f73zp9St3Tk1dWy/d3qnsDxL9gp41eGBwOMrxyxUiDkVngJEHDjqbbA== + + + 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 +nNcrQdGl04vV6lYoqAcDAk3qhl6W5DJFJ2jakeS0ombL5cGJExcv33r3+etvu+uBh5/40NNXnbth +duVsf/qoYVbRXtYr8KicnO4v7h46dvXZq2+76cYPfuD9L734wi9f+9Vbv/vtq7/6xeuvv/5ff/vb +b3//r1/+l689/c8f2zt1bWtwmKRTNBnPgCu3CsV0eQosxPELl6694Zbbbn/iiSe+9NWvfeWb3/7U +F1545tmPf+1b33rl17954aWvfPfbL//tb3978Wsvf/CfP3PuujsK5Zl6c2VqfrfeXXST1WqlvbG2 +esP1Fx5+6D0f+cgHP/XZT3zzu9984+23v/vKz7788svf++nP3333T//n//7fP/0HtOT33/3JTx56 +4qnJhd1UdgCAKQpmNlnqtSe3t3fgOnb8xG133vmhDz/93Auf+ehnP/n0pz753Isv/PiVn/7q17/8 +w7//7n/+9/+88du3n/nnj1++6e5afc7UGopQSadma80thk2ylJl0SgDcJ46fuuvuex55/IlHnvrQ +wx946sWvfuNHP3/lJ6++8qe//unP//Gfv/7Nb3/7u9+9+OWvHz91U6W2Eo024+6UFq2n8jPJTH84 +WN3cPHLVmQsPvveBx5/6x488+6nnX3rpx6/+4pe/eeOV11//9Vtvvvvnd/7X//s/UK0/+tmvPvf5 +r1WbS6GICpyIYdEw2iHpiFLeiTVr1am9I6ceePh9Dzz28Ec/++xPXvvFq6//+uvf/85L3/jqG2+/ ++ebv3vr5a6/88d0//n//53//9u23PvX8c9ffeHupMlQU0NtcOCzQtKlruXZzaWlh58zpa95z70OP +PP74F7/y4k9/+Yvv/PgHX/vOt373xz/89b/+682333zjzdf+9t9/+/mvf/neRx+bmt2utzed+ADD +0OZnv4/XpLSuZtLJVqezDJpkembl5NmLD/zDw5957jOvvPbLt37/+69++5u/eP3X/+t//ufdv/71 +My98/tEnHrvz7vuTyQlNa6tCbH64dHjzyLVnzt9x83X3v+fmDzx2/ze++vl//7ffQka/8eavfvGL +H37+Cx+//fbL29vblfpEKjfJsimKtBQxrsuxpJ3o1Vqnjh6/95573/fwex959OGPf/SZH/34hz/4 +0Q+/9NWXXn75W+/++c8//eWrz7/wuc9/8fM333Hvwe2zg6lN267k0t16c6ZS7ReLrQ== + + + taVDe9u7J/e27rv1+n/50ue/9rUXv/2dr73x5q//+Je/vvLr11/51S/ffvs3//Gff3n739/+xve+ +/uCj9x3cOZop9E27YlgF20h1Gv21lUMXL1w6d/bc2VMn773rthdf/Nxrr/3s9bd+88NXXvnGd77+ +y9d/9q+/f/PNt1777VtQLK9+4cUXbrvjnu5gVeCTApeMu91cYVESc5qczLjlfqN3/PDWk//w0Fe/ +9MWXv/ed5774uZ++8pN3/vTuX//zb6+98bN3/vi7V1/76fPPf/y55z91+sL1bqoNcgjAyo61UtmJ +TLY7P7e2urR27szZDz71+Cc/9bHPPv/pz3/xuZ/+/Mf/8d//9a/v/PGVX73yve9/9d13fv/b37/9 +4le+9OQTHxhMHqKZOBi3cFDGIzpNxfRoudtebdanTh478eQ/PvGJz37i0194/iev/uydv7z7zl// +8uNXf/L6m6+98+6//9sffvfKL370m9+88vNXvv/UBx+/9fY7SuUJ3cjihACpFXNryUQ9l25vbRx+ +30Pv+/JXvvKTV3763R98++1/ffOdP7/z5ttv/eo3r//lr3+C+/zgh9/48U9f/vmrP3zqqQ9cvP72 +7ZM36nbD6+UJzCIwjaOjWIiTOGtmauXaay69930Pfe6Ln//8SxDNz/74J9/7z//+z9/94fc/gbL7 ++Y8hUJ967mM33XTD4Z0TqfSg1d5NmPlBe6rX6jfL1YXFmc2tjZXl2aOHV+656+Ijj9x6150Xb7z+ +TKtZjMcMWVRoWmZpPRwUwkEeC/MiY2TtfCvfmupMzk1NHj+ye+zo9sG1mWsu7j54/zWPvu/m22+7 +4Y677rj68nXzyyupdMm0qqksaO8mias0oQpsVOJUEC7nTl06cuRktVAc1kqndldvvv6qhx645ckn +7/n217/wC4Cb119987e/ePYzT193w/mFlcVEMu/GaxJYV8ZkWcuMps6cvObSpdv6g4V2e2J5empv +ffG680ee/cg/fOflL73+xmtv/+sb3/nel77y0qe++LkPf+yfHnj8oZuuOnZkOFxMpNs4rglCgqRt +fxB8DRcKiQQmOarTzGdPbm08evfNX3r+2Ze+8rkXX3j6Zz/+lz/96fef/cyH7rh86syR9emJQbPZ +5XktEuZkKQEXyzlwSaKjino2UZhoDXdXD9529emnHr//E//82L+89Oxrr/3o3/7w1p//8odXf/bV +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 +R4O/+eGr/+2fvvZvv/nSj796/K+/fPUvv3n14mrM4RDc79YkZDGFQUkZ86eEwHKBerCb/O4Xj372 +/Ud/+MVLn39x6hufnv/hV49/85dP/vLrl3/08cG//uq1f/jhjS+9WHnxKH+4mCvEjGICuDJlG1mV +FdIy2otjm2X+9mbi3ednX7tYfnIp/0cfXfrVj97+t3/+9t/+/INffvfuf/7DZ/+///fv/v6vPnpy +UvuDz575xQ9e+uDxTs7WApMYkCzYWJHRiWCQBspHPBHab1MTSwXm2lrquY3cudnI5ZXoq1e7f/y7 +Dz5+4+Djt59795Ub+VgcCwuAwBpJVwxuPk3uNZh7a/pHd9vffe/oO++d+8nv3f7nH7/9P/7jz//2 +Z5/70VeP/+5PHvzb33zhG+9f3p/P5cBBckrMTCg0bbNY2yLXCtilPnN7WX/jXPLbb63/5Bu3v/+l +C998d+svvnL8z3/xyn/+lw///def/dX3b//N96796o9uvnlzoRZzSRBESNAXJkNEQjGrpraaZl8/ +Y7x3NfnFW4XvvLX4629d/L9+884//uy1P/vKuV99+/K//PThP/7w7o8+2v3Jx9u//NbRn3zxzK0z +uVYuHvbjeIjlwtTmdHl7Kr7ZUG+tR772uP+jr5z9g7eWvvn26t/++PVffu+FP/7C4Q/e3/7v//jR +//zvP/yXv377b7978//8+3e/9/Hx3gzEgm9ibDzkxwDbo7ywkJd6dmjK9F6bYR+dib5wJvqpK8WP +nyx8/4tnvvXu6k++ef0//ulrf/Nnr/7mR6/9t3/4yl9+687xWmVx0C8Upwhcz0XjdUftJ5m9Kvnc +DPvl+61f/P7Jr799/bsfbH/7c1s/+f1r//437/3i2ze/98H2//L1i//HX735q29c+dajypdvZ4+n +JUAVlRU9Y4GRZ8cJjzfFB+aTyMUp4da6/eRS6cMX53/6h3f/61+/9b/95PHf//DR3//o5Z99/eRn +nxz+2efmv3Cr8NyCNp2k0yrplhMVIjxtJaxiv97a7KXnc9xyBr86YL/4oP3HH5z54SfHf/aVg59/ +5+pvfvLyP/z0yS/+8NovPtn9hx8896+/fOlvf3D9Dz7de/9q4tXjcjNtYiFeFvMCFzMlvZ2zmjF6 +OkFeGOgPtvRXD6zPXM3BaPyXP737y+9c/dk3Tv7v//p7/8+//9G3P7P9nc9ffHJnSyQ5MiwkFTUt +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 +49qQqzauDblq49qQqzauDblq49qQqzauDblq49qQqzauDblq49qQqzauDblq49qQqzauDblq49qQ +qzauDblq49qQqzauDblq49qQqzauDblq49qQqzauDblq49qQqzauDblq49qQqzauDblq49qQqzau +Dblq49qQqzauDblq49qQqzauDblq49qQqzauDblq49qQqzauDblq49qQqzauDblq4/hf/Ucyxuh/ +JOM3KKr16Lx58uLkGzvdb1C1nnUEP89Onr+4/ewb429QR0rt2Yvm3bMXdx8/Onn2FvXgn1RZN1Fl +dvvkAcr+3TtReBM6eXb38v9l7L2jZLvKO9H/31pXt7srh5NzqKoT6lTOOXbOue/t2zdn3aichQQi +SIBMxsIDtjHY2CYLMMaAAduYJKJAIIxtgo2xZ57nzZr1frv1Zt7MrPfWmqVS3+7qOqf22d/3/cI+ +u/o7fQFPLhzfO3dCY028tIj/j1iszVqH/63eOpLIZnNu0s1mnYxj2146x2a9bC6Zdj0vm3Xzjpdj +z/9/vijtJB0rn81mcvhdhj1HXuTlyHN5y8p5GcvBizJZcpTtZu1c2k7//7zof3m7cw== + + + /ztjOnfk1JGVIxeOzB3Js6rGrq4cWfofvsO85ci8Na5cu3pqdu9OTMmFV55snMCc/E9Pq0sXLuyd +P7HPHj7L4mnWcTIaZqmO/1dvkG9OHLn2P8+axQ7wzRk8dYO1LXbMbmxZ7D55/TwZfd4jI86/MnPp +TDKbeeXn0f/4s2uRf0f//fX/68+Hr7/w/749/rn830dhk1Ecpkfn9LkThVe+Pby4/ydXMBUYTfdI +qnXi+unjJ+a7DXZ1+sgGnkwc5ssrX/HT4Vx73iuRyLNbrGPZuKYMOfzU/9YBZDz/7aD/9m+OdTFG +O3s43DRLDrSOSNLhCEl2F9gMAmkfWe3/HyxP2rFQjCNIRVEui6TfTDFOlzixJWkdTqgyDOk6wAkF +M9FXtJak1ig2E6FsHEVzGYbPk/7QtC3LBc1oWO7AsEjvMRHHyk3FGEUpJxgSg0E+FtVJ0yyjaVhj +LTUtGwNea1B8NhxLpuyOnqjTbE4zBsnUrOOtCGqbZkqi1mOFSpzyItEUw5d4uSEqjVR6lhZLvqAW +pdI0n49RVjiSoOmMbnRcb0lLDUStHqVsms/SvCuq+TBl8krByiw4+a1s9cBwFnB4lElHKMd253O1 +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 +UNtxi7u52tnR0l3J1IDn87LWUM1Gtb2RLi2U21uZ8lKxvtabOZ1Kz4DFMqXVpNOrNNd7MydrnR3H +66t6BWw4s3LNyc5XWlsYrWkPqu3t9vRBvrEhmYN0aWm4cKrR307YrebouFeYqbXXZtcuNYf7+epy +f+7g1c/8B5wq6fSXt29snX54ZvNma/pUubllWjMQtP3h6XNXXtfobnOi5WZ6w9kTq8durB/cWti5 +a/P0Y3Zmwcut68leMKxAHmSre0t7D89v3lvtnakOz1aIqFjpDnaGM3s0Z8eZNJR2MrvoEnJfK9W3 +Cbo67fHcyUpzA/bcyq4U2icytZ368ESxsR5lrGg8AfUlqznLHWYKq5X2sdb06f7C1c78Ffi+bH65 +2FjL12Zao616f7fU3sxXF9aWT7/vg58eLJxixUy+vLC2++ja7mMruw+sHzxQbG+Pp/ff+uzvvOX3 +PwGVsrR9fevMY4u79w1Xrq/uP7B24kGvuHrv3a9707s/mG/OB6Nmwp7JV7Za49PLe7dOXnlyvHJx +Y/PSe973x925k8iB0fzZ9vgAKbd//vHbD739wl3vKtVPrC6f3d67ifRIuYN0AUm1WuuemNu8vX/l +9efvftv06o2Tp+7a3rusW61MaSFXXbOzc25uvtreOnH5qYPrT4MXcsUlJJ5q1nGGhDOE/WSlJiM2 +yvVjs2tXJTWrJSrp/AxCDGnh5CFB52cXzj/19HtXtq7IZmNm/d7+4vXm8NTaift7y7ec0jGnsKHq +zWJpU9JqvJQrlhdrne3tU/cev/DIws5NA+rF6MzNnX/y9b9rWo1KY2lu9crc2k0rt4CxVdt71c4x +iNJidTVfWYqzlqjkAM64qHLr+Nb+PbcffivA/NTJu06dvTtpt8v1pdboeGf6zMru7Wv3veHJN74H +GHKwf+frn33PyrEb8ESCWoNZgF9u9q+OV++bXr0rW1g8der6rduPlCsjCYHOzFi5Na+yU24e3zr1 +6kJ9jxMLmeIC+BQlYHtg/OlcfcfJzjW6O4++9l1nrz7ICB5El6S22jMX66MzbmFFUjspa3zz5mte +/8x7s7k5M9VDRlUGJxuj8yvHHlQTbYb3JKXI8GmOd5z0OFdGiZ1BmDrz1wrNE7JcW1q87OX7tGCY +drXe3R3OnZ1dPjO9sL+6dTHhtsNx3fG6vdHZ7vhCo3cSLGbnp/vjYzfvft2JKw8LSg== + + + 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 +O3/nvXfeeHBl+/rM0nnLbpO9rEfopJ5fmtk4feLCXdfvevzhh97z7rd96vmPf/d73//xT3/y7e9/ +58UXX/y33/zmJz/7u8/8+efe+/t/cPbKPYO5Myxf4NlsCa7cqdWLzUVYiIu37r3nwUcff9U73/nO +T3/2c3/2hb/80Cc+/r4//MDnvvjFF37wo49/6s++8pdf+s1vfvP85770nt//kxv3PVFrLnf724tr +p7vjjUy+3W4Nj+3uPHj/rWff+Nrf+733fOhPP/iFr3zhhy+//JUXvvmZL33pr77xrV/+8lf/5b/+ +11/9C0bys698/etvfOdzC+unC+U5AKaq2OV8Y3q4cPLkKTwuXLz0+JNP/s7vvvfDH/+T9//pH733 +Q3/04ec//rUXvvH9H3z3H//hp//+n//9hz95+X2//4EHHn5Np7tqJ3qG0ioWVjr9A0HMi5ydTzcA +3JcuXnn1a556yzve+ZbnfufZdz/3/Gc//7ffeuHr337hV7/+1T/9y7/+4Ec/+clPf/r8Z/7i4pWH +W53tZLKfzSwmkt1CdTlfmpmf29nfP3fntVvPvOnpdzz327/3hx/66Kc+9bVvf+e7Pw== + + + +uELL774gx+/9Mt/+sV/+j//HdX6t9/8/kc+9rl2fzMaN8GJFJWMkR2SaVWrpr1+p7149tyVp599 +89Nvf/b9f/qHX//ed7794g/+4q+//KnPf/aHL7/00k9//K3vvfDzX/78//ov//knL//4Qx/98P0P +varRmjcM6G0pFlN43k4lKsP+5ub6qWtX737t6974lne845N/9vw3vvudL3/tbz735S/+9Of/+Ot/ ++7eXXn7phy997zf/8Tff+sF33/TWty+unOwO99PZOYoim59DQTmhFVNmqZgfjEZb0CRLy9uXr99+ ++ree/ZMP/8kL3/vuj3/2s8/+5Re+8+IP/tO///svf/3rP/n4x976zrc/+Zo35POzicTQVLy1+c0z +++fuuXbziUfue8NrH3n329/w+c9+7B/+/ifI6B++9P3vfOerH/vEB171qgdOnjzZ6s4WKguiWOBY +x1CzKd3Lu7npzuDK+Yuve+p1b372TW9567MfeP/7/vZrX/2bv/3qpz/7qS996Yu//Kd/+sZ3v/3R +j3/kY5/82CNPvO74yetzi/uu26oUx93+cqs9U68PdjdPnD15+vLZg9c/dv+ff/pjn/vc83/55c/9 +8KUf/Pyff/3CD1584fvfffnlH/3Lv/7zy//w8uf/6i+eeevrj586X6rN2G7LcmquVRj1Zna3T9y+ +de+N6zeuX7n8ulc//vzzH/ne97754o9/9NUXXvj8l//iuy9+8+9+9tJLP/7eT36MYvn2J57/+ONP +PDWe21HkvCLls5lxpbahqZWEni9lmjO96YtnDt71W2/87Kc/+aW/+vKHP/mRb7zw9V/86pe//tff +fO+H3/zFz3/67e9946Mf/cCHP/qhq7fuzxSGkEMAK9cbFMqzpfJ4bXV3Z3P3xrXr73nuHX/0oT/4 +04/+8cc++eFvfOtr//If/+3vfvHzF77/wl/99Wd/+Yuf/eRnLz//Z59+1zvfPbdwgheyMG6xiE7H +UzznpZLN8XCn3128fOHSu377nR/80w/+8Sc++vVvf/MX//zLX/z6n7/27a+/+NL3fvHLf/j7f/zp +C9/52x/96IVvvfDXz73nHY+96olGczZllWlGQWp5mU4+160UhwfHzrz5jW/+zJ/92ddf+MZX/uYv +X/67l37xT7946eUff/9HL/7zr3+F8/zNVz//tW986Vvf/upzz7379v2vOnn5oZTbCwRkhnIYKiHx +SSoqaZKzvPh/k/SezXJk6XngH1g2cE15l977zMqsrCzvva9bt673FtfA4wJoAI2Gb7SfZs+0GcsZ +zpAz4nBEDkU3FCmzJEVRLrQhhSKkWKsNfdDuB8V+3jcxERkI3AtU5clz3vd5nyfPOc9Ze/v+g9/8 +/LM/+rM//uNfwWj+4b/9d//yf/x//+P//G//9d9B2v0v/xYG6he//NmTJ4+PDs6TTr/RPEyo2X5z +1Gl068Xy0vLCzt7W2urk5Gjtg9d3v/ji+ev37r776GajnrfiCsfwGMYRmBwK0KEAFQlRDK6k9Wwj +2xi1houj4dmVw9OT/e2Nhft3D7/xyf0vP3/68sXjV69f3Xvn4XR1LekUVK2cTAP3riNRAYsJNCGx +pADE5fa1B1euXC3n8oNK4drh+tNHNz779Nl3v/vB3/yzP/2PADf/+T/8r//7f/z5H/z2w8d3ltaW +E3bWtCosSFdcJQhNlZI3r95/8OBFt7/UbPZWx6PjzeWHd678/He+9S/+9i/+83/5T//H//Vf/sW/ +/Iu//NUv/uyPfvKzH3367c+e3Di9MhgsJ5xmNCrSdALBdF8AdA0ZDDKxCGsIRj2bvrq39eX7T//i +H/38V3/5R3/+J7/97//tP/nv//2//uEf/PDVO9duXtkc9/r1epuixHCI5NgEXARpwMUyhsDI6USu +1xgcrm+/uHf9B9/+5Pd+9+t/8quf/6f/9G/+7//2v/0//+9/+w///q9+9uNvPn92q9uukYRA4HGG +ToWCQGncJco+D05jetqsZs3i6uLy7tbGxcXNp+8+fP3i3U/ff/Ynf/Djv/nrX/3pP/q9X/78h7// +O1//2S9/+vXHL++dn5YLLZaLx1ABRWWKNHkhVSwuWGaJxsWsnT87OPno/Q9//tOf/Oh7X3306uWP +v/ftf/33f/u3f/Orrz559JNvvv7x1588fnDr9GBn0l8olUbDyZmdHHi9pN/HkoSDxORIkCIQvpyp +n+8ffvTyyZ/+yS/+/Fd/9OMfff2D73zjlz//7X/99//q93/6049fPD/e3W812iJnkIQejWnhIBcO +YGiMJVCeISXTLOfz/eFgbX3jgJNUDAduKcQQIRrlcUylaSscZmdn/EEfTiAaTcZxRGYJnXMvWeDU +dLJsW3kcITEEx1FK4BSe1yW9FMUMf5CKhHnS3adgBiPUvAdULUHhChbjSUzWDBApSVE04orB4oTC +cqV0ql4pLi8uXLtxa2d/L5vNwjgGQ6Q/SIDoAKocicjBEB8Kc4qSSyRqgpCkKE0SzJTpgBxNmVYp +my5kc7V6a7q8nkwk805qodvtlEsJUSMRAVQzSVo8n7HTI1bIX54JAduJa3VNLNpqplduNLKFgmXm +TOt4e2fSrTSLqcVBN5epiYIhCjbL5nHMDPrpgA/3exGfJ+r1oL92suK5nC5XmuVpMVVvZCsfvHh6 +cfWkXchMO61upbY+6m8MW9VcDUfouVmfZy4a8JFzM6G52YjfRwJ2YYjOUUlDLTkgs9KlfLaiiHE8 +hquCkbNrCS1bzTcW+yvLg2VDkgvJXEJJsYQSDnHzPnrex0RihqrWdb3G80kMFXEEMtdJOW1IakUq +dntHm3vvLK3c0tU0EY0lVb2YzJmyReEAmBREkaLVe+NbcWvs97Nv/U8eIKIU6UQjIksYIq2njFTR +yeeS6VKmCvRdxGmZEuNy3tQqtllP2r1IBDJFS6YGit66/FYQQsXjQUJBGouJDJORpFK9unR+61UU +0yJR4JZ5QaxIcg10JU2nYogOPUBg7ruy2dkgXPMexOclCVTjmLQZbytKVeJzLJd2jaRCTCBEooSF +Yg70ucDmSdzy+bFIlI0iMhAbmtCQGB8OczSX5dWyGq/pehlBGBRhWFolCZllTUUrYqQB2p+iM5BK +l93NfTHguigaJ8kERZssZ4cjfCjEIYgSCJCRCBMO0zRpgkZWlQrHZQWxSBDxuJaRFXtuPjA/G0Wj +OsdmoKyzfMVMLtNM0eulgAOjiOTzYr75WMSPhnyxkC+KxzhLL8tCgiEVhrQiEQ3Utz/A/XpreSgo +k0QSiSoBLxl2dyrJgZASRROhiAY1jmHsamV8fnqnmK0FvSGZ0hXGkRmbhccBjJqNeD04hTteD3bp +LY9nHqGIRDDIwwUpH0MNaI8Ake+McDwOrYqbzWJ5wzQ7yXiNxQ00KqARbml0KLA2wB18FcGUabEl +yG1Nb5F0KoJoMcjoN+a3enwQTy7lyoel+n5/8cJ0Fv1+qHFyrTjGUe3yJb/PdbTQTKM3XbrTG16n +mcLsTMw3j1QLiySRmJmNwWiGQgKBWbrWKhTXM+mlcIDzzEYoFIqmHAywSFRDEYsgM6Ca4XZmYmFu +Dpv3RD3eiNcX9XljKOhWJiu4L66XGCabSwMXWhblEi+UcNwmyBTjLmuPY4QTReOXL/tnZ0Nw04Cf +o4mkyBVEsQThV69sNjtHc/Po/HwUBp0VClp8pOhd+FoM1WU+2etu8FLB40G9XsTvx1BUyxa2rPSS +Gu/wfDaXayWSlRgiwmeDQQBMC8FSstorVc9wGAgvjkRBSPfhq4Ih1h8gIepQ3JLVmiI3/a4xGgNQ +RhAmICSOW9BjkYhCUxnT6jJCxuNFYjFD13tGvMOw+RiWpLlqMKx5fTSEXyjEXHZ3LoQCXtTvRUMB +kiYTkG44FgeQDIfVS2/sPqJRHUGS0ajrOcAweRSzgwGgCiaCWa6Tnpf1BiToK9sZZosTnDThSX0e +lCVsiMDZy6FZd686BeIdicUda4rGbK+XgMvvp+Zmo/4ACz3sLjCgMpY9TaTWojGD5x3T7tB8DmI7 +5GPn3fXtGIVZ7dqewKW88wjHOJxYj8SsUMQIu25RJSOxqMYHCGpRVAJESmtwLV3YJKk8xRRCYc3j +wQylNFm4QWCJmcthismwbEEWSqZexzEL2PvMpWAkQG2sXKPptNfH0kwWI1M0W9SNUaG8L8ttv5cN ++BgcMyA1PPMxNCazTFZUOqLS080FUaq7FpSYrqhpXs14fFggKLguoHJDtbrJ9GJ3fJavrHBiVlSr +vFgxEgM9MWaEahRzQm/2t0KyR2Nv9vjP4jSZJsk0hicUuarFO3PzmBsGmEqyad0e0VIlGFXgx1y6 +ubN3SzaaXuhDRCNICPUEaCIYmkhEhPp49fRibfsMQgsDWKNzHFdh2bIktxRtANEu8umE1UAQcW4u +CmOB4wbDZSWtk8yuGeaUIjOF/JJld+BZ3BIclQgiAcAiSTXIRBQ1OTLRqm+wfB5G0OshfF4uhiQj +MTsSNe3UBEjXzGwEFAoDpT/IRMIshmo+GHTXItJi2SKAQCQKrcoSeDqGWPNeLBASMKoQT4wL5VVB +LofCiutvhthRxAJ6z3JZyA6PlxGFGsfkL7/ln70M/MM0jAVJaiGxhOu97GFATYhCFtqDxrRQWAq/ +WYgSQ+KupQkBPeOsrN1sD7ZxKgEt57kyS+dYOs/Q+VjMhE9BVUVjUjgMsOkuxkbwTLa4v3X4caN3 +HkFM6ARRLhKka5iGoVl3g5XZSVhNTWkocoOmUuGQuwY14AZ2aH4O8c7jc7NuJYpFZdNs4kQSYlWU +SgGgHyEoMbK79ewy/E8CRS0Mtd76DQ80gMJ1irS9PtHjk+e94uVZfGaOBBp5evxw7eD+fID2hyVW +amvJ1XT1oNg6srJLolJdHOzfeecTnEsFomIgIsewNE7mRakXtzcCEQMwAY0ZbwSFznEFnitQFHRI +GqcygCQUa3JymhYLBJfllJpiNikuy0oV3Z6kC7uy1gboFqQcRrkbwXSgOkaNZBIoaULlpWkXo2bn +IrNzsWBIgPDj+YIqV1kWqi0FNQUgGuo4YHsEsVCywPBtUWkralPV2/CYjtOOxkS/n4CvAgyh6BzD +FmyrfXL8UJTy8x7M5yNwLMkwJZ6v8UKdYvPQdSB7b918li+O3dD1EWhUAU4lyQ1Iw1hUA1BVjSbN +OnMexOPFA0EmiqgUm9OtHkYmeLGwvndPS3QuzUQuXQpHwipBOhSViZvddGYxElZ88xhDmJyQm5lF +31wYXCiaMs1ByhlJcklRa1FE8/ioYFiIxFSKzsOt650ry7uPeAliTB2MDhudIwxL+Pycx0P7fRwS +U1k6ARVzfi5GM+lsYSNd2MCprLv9KhYXjU6lez5avVD0BoAVw9WgzzmhGA7z0YgQ9LNvNvqZUN/n +gfUFWHeDSUQh8ASGGJGQ5HN9J/gYau3sPjK08qVLAY+HBBQ1tAFNFikyH41CuUTDIQ== + + + Eb5wdiYQDFDAVSApoogp6h2gKPn8QtxpeUEf4SbOZimxZOVWWKVGclnDbB8dPr77/AucdQg6qZnd +pLOccpZzuXXNXpjzMTyTXplcU7XGzAzACAuRTJE5KzGerj1sdI8zmc7NOy94rcbKpUx5pdjaL3cO +a/3T6vC6Yo0oLpNLdb/z7Z9Mt65DSqKoiqA6itu8WE9lNmS1G3bd4E0ADdQ1zymQdAmnSgxbM60F +MzmOxBSPJ0a4K4Lc3RkIbpNUFi6eLytqvVLbVpRy0m4lnBFG2JLS0O2xZHRwNh9BzUgsDq0F1vRm +E26cF6u2s8CzeSCKZqKKETqO6SzjQFyFgiKG2zSTAfpEMmlGKApKBUowZHEgwAB79/sojs3xQiFu +DzrLF4RQ9PhdlwwASZwwgZtB+EViOlQcDtgmAalNXrocnZ3DIDxiUZNharLcAX4iq21JabJCiWAy +nFQGchtzjaccQarIRisSlmQ+9fzZZ6pWBNDweHAEMaAcc2yWppPAtcJhURQKgpBjGAcaky0uF5o7 +SnKQyC8LSo1i0laiR5KOZ57w+3gUsSmqIIldRR5Go7bPL1JEMpUaA/MBLg3PNT+Hzs2i0DyarljJ +Sb64ARLDD7LF3U0mYYjlbgoLKDHUlrWWk50Cp1XlfNzMBoJoIESFwqJrIIO7E69QtsKIKmg1SszH +yEQit6wlF1K51cHCrcHSvWxtUxTz+fwkmVtgWMhEEycNwO15Pw3f2WkfyJrrk4NjCdbtvYyq1mqt +vVR+sVxeunjwEa9XBKNcHx51pzd6yzcqvaNC84CVqqyQmQx3/vxP//ntxx9GUYUkTFmuKWonm98t +104EqWUYHTdJCcfdCEwWRXVoJNey5dPO+O1kfgMBvUkYiUQHI5LBiBIABUqnZK0BnI0VyvHkuNXa +evHyy5Xtt8NR0D41O7diZlYlcxxPriTTm8BMoojOiuU3LjpJd49D1AoHXOsAJKbnsxNVrUJs+/08 +S6fMeJOXKpLW1qx+o3tUrO/iVDISBVSkAn4GeJ0Wb2Uqm6XeOau2RL2tmSPgb8Eg7c4V2n34oJNZ +yebWIFRmXTt3HO4CCBAMglSpilJDkOqc6Bra8EpTjg8ErQ2JHHhjhk/SOXgiPd5M2p2lxUOS1CGe +AawUGahCAQLM4yXm5mKyVJbEPNwx4Cd4NpkrjFOFBVYum86Elxu8ULESA44vuE5WrmtuDsOdN24A +ZtA1kcvqarNYWIG6gMQ0DIuHoI7PEyxToOgCy5cA9gHToKxEY+pbb3nnXKcdIFcFSaqqegOeHQpu +yhmALp+bCwQCUClUGJQwYD6ZBq2UzKy2Rjet1EIyP5WtrpYc6qlxqrSmWkNgF9P27jc+/MHi1k3g +5yBeMBApaFzRmvHEwDAHgRAXDXEUlQ5HVK+XiSEyEHUnNy3UdnLVTYZPGma5vXDkLjbWKu5eg/Sk +VN/pj86W1y9Ob34gKBmUkBOJnuubqjShVRiEDe3Y6Um6sh5GdI+XctLrvcV7/ZWLVHmTFWsolY1i +gEW1cm1TNduMWOSkoqgAfe0YyR7U8Xi6ly6NuuPddHlKUUZvcLC8+25rckfQepLehysY0Sajo5cf +fL9UnfoCLPBPgmyQZD2X2ynXrmbymy6Lk0qG1QYa4wMiGuLs7PLq5oOLR182+qcEndrfv1hduwE5 +LsmFcnunPj5vLNxY2n6ye/Z5tX0dWCjLJRWjSvFpYHFQNymuEnSNL9RgiHe3h3tJBIHSn4jG3C2c +OFMQ44NM8zhR3MWZIk6ZhtmUtDrgGCeWZK2m271Sc8d0BsBhAFtAmgUCfNRd4cCjqI6gca+PCgRA +HRtBPx4FTc04UOUT6amTX2elBiPUdGvSHNwoVo+CIWVuDsWJDC82KKYoKw3CpcoZlodQaQISsmwm +4HdnM13HHgTEXVEQqgl7CAL2rbc8fi/h8+DeeQygDJSFIIISL/JClaEz4SDUaCXo4jkBNI8VipLa +KNS28tXt5aWb733ww2RmyMulSudKuggDNxgu3FiY3i61DoOI5vWSLJdjoW4SSUWus3zRDScfhHSp +VFuj2DQ8ryyX4smBnZ3m6jtmatEwGkuLJy8++VEU1aCL8tXdmpv427XecbV77ORXMcLUNChJg0AQ +pD1L0WkIsExha+vk5WD1DkomQ0GOZlNRzAyEJW+AAZCRjX6hfmXr8JWTWUimx4X6OsklvQGCoO1E +erh++PbzT753//mX4/Xbol4pZlqnV58YTs8T4Ag2m6us5WubkjEsVHcmKyeGVY1E46XGqZ1eY7iK +qvVkvRNFDSi49eZ2Z3AErQIBDhRdMzu61RW1WjCqxlBjYfVaubURIzU73R+v3Vjav9dfPm0Mr6RL +66JeE4T07/6DP3/07BOCMYEc2umN+uhOpX9diy/4AyKM0Xiwd3z6/NJlEK2WYo4L3ZPe5oPh1jtO +dS9KpqxE87d/+scnZ498fhZUbSI1bY1vnd75fLB4zzWOmwsrYprjcvNe0hfgIGJ5qS1pA1BnIBOi +YY6hEyyXQTATsrg2OO8uX2yefbh7/RvD5buCWJ2ZwcYL54nkOOharZJwC+gBKBPDlQfZ4lbUdf9Q +gK9KImgfA5QF8LFg1AZCi5GuCzew91ngPx6Swm0MjTN0Fmg2jqWgVqII8PkEgCdNx2EoQxCciEay +SdA4qfxyvbdHco6o1uqD81L7JFXc7i/cTGZXXTvcAEcRhqqVUBx6Xgu7Bp6q3y/FYk4cJKdSA8BU +xJLttDFSQ3D1zTKwYrV9MNl8e7r3jijkxuOjRm8PZ21gX+nSWiK7xCutauuwu3A9mV0EliJKtXxp +w8ksprLTRHYiaB2USIsiZG52dh6dmccQ1CyUNnLlnWx1P5lbpdkMgFW5uamYDQQ3Fb0FBajd371+ +8er+u59tHr7NKYVBb/PVB9/Ol11n70rz+Pq9b73+5i+Wjz9Uk8sEm4Gh4dliqbIdcH3eKNz1CbTD +UY2kM2Zy4voDuI7cIo47kaiCEkmCzWuJfjK7UmzuxpPd3nDr+p0X8USX5lI4pdNikZLKol6ttrev +3f+0UF1yX48Qie7kAsqonhgEw1owLGGYUcovjsanUBYJwuHkKq9UOLluJJeM9GK+sTHZuP3OB98f +r92c8zA4lbZSU80cMnwRNNT8PAeQoqs1RSlduhwKRmQtMU3lD/TE1EgsAh0Crc1yLlTiZOLo+vOH +r78+uPFyuv3Izq0B1M97Qfvwz9//Sbm+BVQTx9OmPcbwDMdXC5Ut0LaQR0hMqlSmqlwA2XgJNKCX +ZeWOUz7MVA5z5X2KLKJIwjB6OGrPzYQ989QbE1QGtCSQonDY3QE0nh4Bm4W2uQ9LWhAb8fSqarsL +gyG0VLtLu0vUikp8LOqAY02adEQuxTJJCCEKIJQosEwDLpwo4WQBYDYUElv17UJ16rrq+QjQwpLa +rvdOutOb5c6WbVbeefTZxu5FjNCz5bXNoxcru8+ag+vT9QeLWw81e+D1M3GrD1IXh4KLa9ClNFdX +9THEg6TX5wCE3bNvHMvus2KJ5PKcVCPZoqy7uyM5uczLFTu1wIt5Rc51RweD5eu95WvV7tbm3v2l +jduG1bFTw87orDs+GS6fmtnFKJFxbZ8jSsoelitbHh8z76FEuWHYi7o5Ar4kKR0A5GhEZZgM6lpQ +UrxUS+XXxuv3W6Mb2dKaYVTPzu9/6/s/g7oJfUiQthofN3pnV+988vC9HwzX70LohmNSujCyMpMY +Zr45bIj2BUWccECYYHgyGpVFuYy5vsR0JGaKai9b3jq98/rDL3/vwfu/nanv+cOqIFegK2KYBSMF +VYwiC4rSkeQOCJzZOQSgKZFeY11neA1EEIwdFGsdSDvtAAIsrpyNp8e50lIyt8arA0ZqcHITSslo +9R2CKQSCiuksqWbHdVcIiNGY6frbzxEYblbr2xiqzVzyXH7LG4EecDdBL4taFyNTs/N8OGaDqvJ6 +3DdgoaASDuvhiA4aiiBSro02lSo2dzjKKRUXKTrpD7LwCJnKgZnZ1BKTbP0A8giqreq+p+rRfBme +Djg/QGU4JIVDciyigWyBbo+GFeClEOpvbAmlRKIfdu2qEBgIf0iElvByVXWPzGil0t3u4NBKdEWx +sLRxsbL3oL1wJZ7qcGKaZB2UsBEkbhgtmkxEwgIwQy2+VKxebfUvljaf4a75M89zOSs5AGoUiogg +z1GQDPGxaU+A/YpKZbhw1Ovvs0yCwrVKbXX7ytNrDz67+eDTF5/+pD0+V5Tmu3c/+OSz78t6GSMT +GJ3lQTKUdoeLF2tb7xJk8fIsOgcYQudNZ9GARCbSkN0BHwdkG7RY1D3zSNWtQdwe6sDuuDxFZxS5 +XKmvTw8esHItGo3XG0e9wZ1ieWt182J9/4Gg1sIR2TJrH33x43hqYX6ejSG2qAAnn7BCPRIzgOpD ++bBTY1BwwTAvybV0fi1X2RyvXL/z+NPd0yeC3kokBnfvvQbdF0WMeGKYLawVy9v50q4o993zsIIs +x6aAaEFdm5sH/mwVarvtyXm+tg0MjSDNTHYYjojBsAChBUlweOvT6d6zztIdRqxensEpPHX77c9Z +uQAVAQI+gjgIltPii+X6aaVxPue+4wpFwgzDpubmsTeHuykxUOt83XRWJbUHdwz6SRzXQCYHAwJG +pBge9Gx3/eDhxfOvo/BEQh7DLAxzV68Z9sBwJon8ll3cpYQSTaVq1Q1eBOmtS4DzUkVRG7IMSFWI +RTXQ/rOzwbm56Oxs1Ou6nTNvLMuUWCROk2mKsCJhTpYreqKbKS1nKmuN4WkiswhaOJVZsNMtmo+z +gsnytiwXJaUcN3uOs4QArY1IPJMkSCsU5oCgikKRYV2LPxS1Ba4Myho0ESR7DNEAPKFg+fwClGZR +queLa/FEhyTjDBW3ktW4U8nUJ72V08XNO/XWTrW6cXD4sNpaZfi0k5mUW8eyOUgV1ouNI8NeRdEc +hqU0rSHJJSBXIdCGAeENebA4pgD6guNqJJEEdj3nCV+eDSCIlrDHqcxGrXW2dfoecLC4UTs6edfO +TQG+whEJebO5g+NKTmqh0TuY93FeDyMJDUDFQEiYnUfgCkUkUa5ayTEBoY7KkHosm45EZCByUdxA +3FWg5cHo2urmHdBcilrujc44vhiLqkE/739j7h0MsByXCoc5kk7EUIvlyglnokJjkkNBbYh6czA5 +k5SKIGb7o4POwhX4DcGVorgVw+Kq3k5mQHEfuEZDIADNfjKzYac2cpUd1egHgnGIvWCAH/a2V1eu +uDZxXjKKxCWjk2vsN4fXdGs0O4fbVrtcHnk9yMzlEKABEAMnPVb1KiRCKMDHYiZcklwR1Son5ECX +FRqHuepBf3q/UD80UyOE0Eyr1Rue62YHJ1PhiAWiNewelsf6/bTPR3l95K/PZfi1Gx5N5gnUYXAn +bTU3Nm/QQlpQCv2Vazff+erW0+8MNx8Y6SVWyCWM0s766ebmPc1oRRElHJUxd7YxSQ== + + + EpZjt0nCiESYuF7S1RIIFpLKoXg+GIq/CWAq5M7ZMfPzgI0koCioG1npSlIbdARKxEUp1xltr2ye +7Fy5f3D92eH5k7Pb761s3yt2Dkku3WysXjl+KMrZGCrLWlUz+pzQ1owFgsjFYnGoxSCu0ZiBoTZB +ZAksFQOKhWjQySJflLU6L6Z1o4yTcYpJ0VyB4gqS0TLtTqe7c+feh2q8oagVUBa8WNbizXRmJR4f +cnwZyHDK6Tbrm0HXBzsWCEoIaitqW5TrolSlKSeRaAHqwr8CjwJJnittD6a3xmu3j85fw98h94fD +vf3jR782l8OxOOkuxeEwRBWEDEXE6601WS0BiEHgQbop8U6mttNbf7B/+n4mOznYu/WX//O/cdIT +f0DjhA5oimpz/9Hzb99/+l3VWpiZJSBrZLkGd4G08rgeg3wwaOrGgpWc6kYLQ3UgTpGwGIlIwbAY +iEiegOx1D/IwzMRA1sqhCAciOhhk/H7S7649Ewl3OQfU/QzNlWUDlFELBFe5uZ0qL2Uq69X+SbK4 +odhDYMiD4enhyftxuxdwLbhd8xOBK5FkGonFoSBClXSdyd3D0Tj32aMmEtEpzHTs+nCym0h1273t +zZNH5c5GubOdrm4JxoBk80mrebx/f2fvOfHmEI1IVGSYnCQ3OaGoqnWGzapKqVJZoukEaG0E0INv +CWKH5SvBN+bP7igEWMhxKCtvZsMVBE1wYk42qjC+ne72j37yR7/8i79b3roJvwHYTBdXh9Prze7B +4vhsc/26aZbNeM2ItzS9ZZgDmqkEA9rcrHvEkmceg9AKh0SfO4eFzM1GfF4i4KMowras/njhbHP3 +biDMA6vB3IP5bMVsFaq7pfqBYfUo2h6PDxutrZjr0i9RFDBSdwoMhHm5OKlXlz1zqHeeoMgU6Dsc +M30+NhyGnDIEoZBI9iAw3NeDTF7V6+nC1LB7klIT5SZA93h0MF06CwQEaAbHpqGSRsMSjmosncQx +PZ3pC6CR52MEBpwnKak13e6bACBanSLj5ULnwYP3AB4FqVOpnVcbZ4nEKJ+fprMLNFcCEq5J5Vp5 +GdJqdi765syCvKwsbu58uHHwWjV6Hg8NkgEqeywiXLocuOweoiGFwgmaLoPgIrkURpnRmDwzE/o1 +uPFSKVvdBNEHWjtT2XXym5xYzZdW7GwfYXQj1W2MToZLt46vfXD/yXfeff2js9ufCnJRlApAMzAM +VKfl89NzczGvB4tGAFF5lsuHXZ8cAUpJLCIxZJykDMUs9Md7tx98MN2+hsCPUBwrO43edUBdw2wn +U0PF6IRjGiPkKTaFYnGAdE6oyUq71T3tjUCqD/0BiYTKwgOqNxm2Eo1Z/pDhDxtvDvhTKdqBVI1E +BMiXGCIl073tg3sHp+80etvb+7fPbj+NOw1ByiazC6bT3zm8P5peI+kUhqvxeGFv706ptACfAgUd +i1nuu0Qsw3MFDImjMc3rwX2uUZ5r9gjP6PPiQAlS6UmusJLNTxW1cHT8bn90QnCOZLUb45v95fu5 +6o6Z6G/u3Gt1dgCmoEMyueVMZlmRa1AcgyHO40EvvRWIBAUCczF5di7o8RAoEsewOPCloDtjIjNU +JuRqVRTFoZ4WgCdUG7uW5c5eQXtYOh3Xa66H2xwCcBqLyBSRoEl3jtvvw8NBiqXsUAiAnfT4KKAT +qpRTREdVcoKQS2VGT199+/TaixgSp6icLDehpherO8BgaUIVuMQb52eKpjPu61ChLgk1Owk8PBf0 +M6qcdhINYDhvXQrEULfMAfPxuidhkf4AE4kpUHc880ggQAFRAZQDRRNDDM5VW1mKzfByDVKv0toz +7erZzScb+2+3Ovvj6fn6wduTzYtsZUOQiqXy1LBqb1bmGNADc7PuiiOacJ3BTBNkS7ndPcbIpNeL +ITGZE/LFxubJ7de3n3wxXDx/9uzzFx/9IJmbUGyO4Uo0W5C1tpNdaw3vjjef2fkVUcp3e1cqnQMr +NdTMLhDpQND1N47HJ6A+Ls9GLs9E5rw0I7ZFY4Hiqm9s+lSBLxWrWyyfAj6ZLy5cv/nk6+//9NaD +14XWlpWdikr94OT5zpV3tUQdp+MJZzyeXm20tm27WyqNVTULwwHKl+UKwGeCIfeMUff0nJjpujeQ +IAzjszMuakVCvKbWTGvMCQ2KLjhOa3f/Vq4wYEXHKUxWDh4d3nhvtH63Mb6lJkaRqFbJL9175xsk +l/AFyKi7OBlkvmugF/QJeMzUpfLa8tnh8TszM5GZywH4fiiCVmoKHULRWcCuZmN9/+gRaGEMT7A8 +pHOG4zIUbloWoHoGYFxkk4paCoe4UMhdOeP3UnAXJKZiiOaZD+OYLIoZUEMQadX60tbhnbWdi0x5 +s92/AkglSsXN/YccVwyHVdf/PyCEAhKKJWW9y/F5yCmvBwUkhLhFYypDJWkC+A8FN/XOY0CDRSFz ++ZL/8iXvpbe8szNBiGqo0bpcEhi73VrPgnAI0oZWiqG6IJcVq2dngGnv9KcXneGVrenBX/7Tf3V2 +6xloRi3ezlfXUvlleHAzucyIxRiqilx6d+dtnEzOz4V83nA4RIaCLCAhsEpgs4qal9UiSaVEuWZl +Rp3R/nj5tNFcffXy46evP7ezPVaq5Ep72fx2u39t5+SDla1Hi6t3rOQolx5dvf5EtXJRAqSlgxEF +qFOGOVb0YQxNBMMyiDJQKL6Q5nMPAqNAIoHOSmU37PQKiLVr5+8uLB5pZs3OLpSah53xrdWdJ+e3 +Pnnw+kftyVl3sHv77feS+ZWE0zfMDi8UQRcDKwY8NPRBDNUCQTfjUMzW1JFpLoLAx3EnGHA9mUW+ +7PcDyKBAMjEs5/pnonF3ekiuWE5PUAucmIG+Qom0ZvY2dx9Ml69CbDTby4yQlNWcnWhH3EHUo1Er +HNJiYZMl053G9nh0ZfbNSySC0IEPEHSGV5u82oDUmyyeLK+cy0pZkqBQNs1ES9WqPJ8xLNcZiaFT +zeoSjGMwSAX8JEQUTUAi2EhUDXhpwDTHbuRz7n4ciXPGS0fnd56f3/3Izm8wQh0jsnt79/7sH/91 +tTgBAhkMcDyXV+W2qg5ktRuNaUAzDL26sHLTSfVCQRrCKeChIkEOR1QS1U2tyLIJAHaRL/m8rsvu +7CyoCZFAzWhQwRELSn8mPXr90bfDEZ5mHV4pqYlesrhSaOyUaivb66dff+/3xtNjKPTd4SmUxXRh +FUKLV6B4AYUQU2bjNz//uWq3Ll2an5v1z89FffBEQQEqi8SnFzorF2+/MuwmCqxArYp6OZkd5KvT +/tJhfbDFStl0cbHWPVaNru1M7PRUUCpxq6OoTSe50OruaFY+W+6qZjcSM6EoELQdjGigfDmurGo9 +ULgkk/eFlJk5DEgXQjhGYsRLFVkqHR8+HE8OjUQzVVhuDs/Ha3d3jp/euv/R0u5FurS0tnHtp7/8 +q3hqBOwIoEzWmk52YtpLqragx8cEZetGvdO/omh19y1N2Pi1IyhcDFMSxIbXnc5m5j0oxFg0pkMz +JK2TLW31Fm7oFoxLYbp4Umts82JxNDlaXDmVQSWhOsWkQQGpSjUYkIANwtfGYgkkaiEhGao8wIVn +njbNtm5UglDF/LxmDUfr9yvdY9MZYVQKxRPd/p6T6ZC0Q7N5J71YrG4mU1NVgfqYhIgKh3iOTUbC +fNidaEuiiBFwl0Po3Juda1ArNbUCX+7kRmv7D/fPXxydvzy78frs5qvpZJNnQJZaHJt113bG3DOb +aDrvrtag00l7UK1tJROtcIAhEJ3G7UiAo7A4jZuxMOf3EhxbdpxVBEoeZ7kHSM1g0ZASCgI/KQBx +VZR6OtUlKZPlUhSTkNVypry8tHXn5Obzk5uvlw4ekpwLuUsbd2WzTUOm8CWKyXNCWRQLwM+ny0eg +HC9f8oX9LBo1IyF4TCEaETFEbFa6Jzce8nouRljp8kbcGcA3d1euFftXBL2hqsV7Fy8OTx4CsyII +wI1qKrOysnZne+ftTG5F0Zu95uJv/fBn/cWrl94K+gN0FJAET6XSi93+uZlcRFDj+ORJMjucmUd8 +ARaBKkO5nnVqvJ0pTBuN1YODW2s7t1EqrpjQpcNEqqNa1WZv5/rF+/eef5tXoehvVjqHjFjFiCTJ +ZGNYMoq689rFymaptolg6tw8xnH5pO1qRgLLRKOJeQ/v8bIIqs15o+EoR1J2IjXNVHer3ZNa7wRU +czk/+fKrn91++GkkqprJTro0tfNT0xkDbmO4iSCqrjWH4xuCWPd6Wfd9tftuUJydRUkia1mjpcXj +l6+/FKQaMEkj0VfMPkoVgGeWGod75+8n0v31javPXn01WDiJRA13eSTquMb7ZIph3Pk+NCZxtA1E +OhxxLbLnPUwwrCF4ynJWGu3jbG44Xbqyf/XZjXc+u/HON07uvEpkxlEsLsrFRmdvML0KAWCYdVC7 +NJMjKReog34xHJTDAR5gqlZcNY3W5bf8nnk0FpWi7nyxGI0CM9QEoXx09iQS1X/jN0IeDwM8WTOG +CWcK43X5MhKJShhh4JTBCmnNbjZGV9aOnwxW78uJiWy10qWV+uCYYjK2Pc4WN9PF9Vx5x3CGBJv0 +BV1D1EhIRiJK0M8CKs7OxSAScMLEyEQE1UMxSU80jHSLlpxsdWl572Gtd1jr7PUWzlp9EFNV4M+4 +u4GlKoH6ZjIMmxGkvKKVhoOtR48/tFP92ZkwTTtmoqdoDYxw3rj2ZSg2nS8t8UoBACQQBAIJhclR +jQZEL5DAemV4fHxjvLSPk0altbt5/OLs9jeuXHtveevWZO16qjDJpfs/+tkff/DVP3APFyNTneH5 +1v7LevN6vXnNSk5iqOHzE7lsT1HLMEYzs67Js8+vRWIOxVZyheXHzz99+dHXIFoDYSmCxXEmq8Tb +ncFhb3i9ObxNiRWIukJjA7CaZNMMV6SYHIoD9iaG09ua1fWHBIJyQI+/YXEmxDAAIFBWhkmUqotA +qyIRTYm3at3DweLNg9Mnazv3gHPqWv7F04/++C/+2WC8HQjKglAHFJWkFkGmYVjDEUWWygyT8oHK +jsnym74S1Wa9f7Z7/n6lvnm4e/13fvcf7hxcbF155+D2h8OtR4P1+9tnr4+uPj259qTe3Wu2Nv7x +P/83n3/1OxRpxbW6rncBwQQ2l0z0Ta2NxqyZGQIUKxCh+TlXL19+KzA3g7hCEs/p1lg1OpXqhh5v +CEpVSwxks6fZYzO9HImpilEpVJcHkxM90ax29xc2725cebJx8mLp4Gm5f2akJrnM9N7Fx2c3XvFK +RZAb1c5RsXGgWmuSsoggjt/PgowKhSBfeO+bZWwIjBqTBsWXr67makvN3vrxjWdXbj6/ePzx9pWH +tf6RoLdJJgNERZKrOB6PRHgEtSS51RtdmyzfzZU2eBkouoxB3cEMEFaQjAygpdq3kpu54q4ab8HI +hiIiw6XCETEU5ngxayS6hcpKvb0Bf5p2h+edemenPznrjY+yxdVSY7vc3Ion2tl09w== + + + xq3H20c3CcrK5Jcr7a1MaTGeHIpqOxzVITVITLt182m9vgb1KxBQECSDYQUML8TQZKm8/OTZN6bL +V3w+ihOKdn41V98br9595+V3P/ziF5tXXlNsadDZuH3xXFbzEGPl2t7C6uPVnVfN/r1EaoLiBo4Z +D9/+oNU5cNcw+zlQ0ziZAYWeq263xtdBqgz7O8srJ4DnDJsTtYZstCu1jeWte+3ReTY/AdisVKaG +2fS6p/eSfj/P8BXdHCXsSSwWDwZ5Ld5s9K/IWh3YOCfmBbWEk6ZpNurNdc0oL67fuvno887kvFhf +V4watJDnMkmnd+v+h1/91h9s7d0HYWVaE0GoxqIaEuUDXsI77xrae+Z521mEgXjrLd/8HOb3seEA +SAabExvQfgxLWPE2lGOKzbYWzo8vPr315DuL249AerT6h4dnLx49/3p1/cbjl1+sH97Lt1YXd+4C +Y8o0DpwclJgnD9/9cmX7rmp27PRSvXdYbuwazgpBF3592sL8HEpTDkUlou5KWp5iUqJalfV6urSc +LU/Prj999Opbmeqk2tscrkJ2nxabB53R7en6u5XmIUZZBGUqRouTK3F7aKWXtcSSldmQ9AFNFxB3 +3k1guCwjVqK4QzBl14qWL4bdow0yVqJNuG9W2TcbzxeHS3eWt9+udo95ua5q5fHSSbE2ZXgnW1lf +P3x8990vT+58nKtvmqkOzZuSlNrauTASZZI1JaPOyTUXNsU8R6fq1aVUqge8Meq64ruHswBgIqid +yU0brS1Rcncl0DQw9o5mNnWz3uhtbxw+KDZ3CNo52b3x+bd+y3HqDOMMFm73J3fqraNkejXkvp+h +QeI9eefjwfDA4x4y63qoGolxobrXndxqDM4EPvPy+ScPH78MBGnItXLzcHX/6cNXP7j99HuZ6j6C +2TRl/vRnf3Bycj8U1X59wohpL6fzu7xQ93gIDNVG4+Na58DnZxEkjhPuegNZb6Zyq3ZmqijFpy8/ +/+g3f5hOjzDcUvWWk12qNncPTh8/fv3dyepdQW5xXEnTexH38OjYpUt+eMyAXwB0ZdhqJJKYuRzB +ELWYXwI56fOAfBAxPA1lMRyJC1wJeB30nmH3mv3j7vg6J7eMeG0wuTpauQkl487Fi0+++FF/epQs +TC7e+eaLT392fOuzrf3nn335h5uHz+KJQb28fn7j/VRhFIxIUcQEtiaLGQyVw+5pREbO6UwWrshy +IRqVcNJSjEa5c9CcnK8fPFravWulO7vHdxc2bpZ7B6XuoV1YU6wur9XUZK/c3rMLU5SxaamAw9PZ +k3zrhJBaYcQhubJkdtOldUYsSWZTNHuM2JTUFifWOMGVt9GYCqnH8imaT0DAb5+8t3323mTj7fb4 +vNTchaHPZPtHN5+nytNsZWXz9FW5f2qkF/REGxTr3v4FSRvhiFCs7pjJBVEsW4kejicjEZnjUnay +J0q1y5dj8+7cnCYphVrrwLQHCGKFg2LK6ZMkfJaKxfh2f+fZ66+ev/fl9tGDUnnFSrQQRKQIXZFL +oLa87lnAAsdnG+2dRmMzl5uEQtzsbBRUD467HiYMm5TkIsM5HGO1GtOEXfJ6EeD264cPr1x8sLR9 +J1fZYPgaitqSmPnmV9/d2LwWiuo+P+8ay7jHQ7hvYIDO0VSi1d4wrealt0KgQ1mmoMe7mjnQrJE7 +q+50Pv70i1fvfynLUD3zy+uP+4t3yo1tAEMns0gQmYC7BUAaDM9YJu3xkBSRlqS2wJdYOoVj9swM +Egmxi6Pdn/zun/q95BxEXUAARmGYw3RmLZseS1xiaeVQ00tQszixI1sThtaa3e3+4vlo+by3cJSv +LFt2u9Pb27/2dPfs3mj5qFhbzxQBSQageZ1kdzI9NcyWu5RFKotCgWeTEFquMwCqwt8lMRcKMeEQ +C8wwmR6t7z268+Tbh9deTdau7Wye/PU//7uXH35hZobJwkpjeC1f26t1T3auvLj/9KvNo3f64+MP +Pv9RPD2J4slUab0xutqZ3Du9+Or0/rdWDt4dDo//6M/+7ke/9xcolQpGjDdn5BkEW9CTi7nSdqe7 +8+z5h0fX3x2u31zauzdav1FobSxu3lzfvXfn4SfPPvluqbHZGRw8ef29D7/1O9fuf7SwfjddXBHV +uig3VWMYQQAbeUhzFAd9VFDUtmX3Bakiau0oYstKAyf0UIQkXFLX0xMDVWtRVAbKkxGvLq/fiNvN +fLHX7a2W6xtWaoWX2xxX5dgCKK9fnyINIYFhcYrORCKqxwNSWmSZHIHbUO45LsPxGV7IavF63OoB +K/MF6Bgi0yDfcBDvmh4vpTKDycr1jb2HZqLDcEmMdPd0vFlxRyPuwqqkIBQtZ4QTdjQih4MSIG04 +JIeCPAq6D7eag8ON/fuj5Wup/CrNF0NhydRr6dSQohwIM4rKgtyzzC7P5WIQn2zm17u00KgxN4PN +Xo7OzkTgR4owGdKdQWPZ9MylUCQkBPyMezziPPpmCkYIB1lZzjNsAjIlV17LV3cUyS5Xlxrd7cH0 +rN4/SWYmmlYB5VhqrMi6IyrxuF1RjWqhulNpH4PWi7gLXBOG3tb0+ps9trS7BzCmMHQ6GpbgYb0e +FIQwwyQZ1lHjtUx5td0/Wt28tb9/7fGz9zf3rvcnV87vfrJ39v7th986uf6y1dtOOE0n1Wu31u++ +/Z6dBb2wurR1f+/kycL6RbWznSqMDadRKY1fvf7WO68+w2knmVkx7Em2tH165/Mrdz6rtbbXFg// +/Ff/9NlHnydzo2p7e7h6trR9/cmHX/3OL//qD//q73/rF39+/8GHv/j5n3zzuz/LVNYz5fVEdrXS +Ol7ffXr33e/vnX0qKE1VLk1XrkMSRZF4NKbRXBrEo5VZm6w9ShdWgNQtLO5oWtVMDJzCouH0gEyq +8e5gcv3G/d+U9YLtVJPprmS0B4u3FjceO/ldgqzQbMVKTfXEELRb3ChCPEBtjUWtUFh35xQCIi+U +Gu0DWa0iWBz4wOrO4/7S1XhqqIFIjNdwUmHFJEEbKCZyfEJS87JWVYxq3G5JajkaE2W9tH/6qNHe +AO6n6C0cM6F8oIipqm0MNQIBBkAAQgvBDV4umOlprXOuxgeCWFLErCK50jJutiJh1edleT5r2V1J +aQC+AY1EQGLMYqGgBDyHgIiN6iSRCAY44NXuysCwwjFp+DHgZyF3vH4+ggCrSfFyiRVzdrpX7+4Q +VLqQrhdKI1nLp7IDO71o2hPbWSiW1vLlZUlJ6rpjJqss71jJoZ1b1e0hlCFBqKSdaS63GAywsYhE +4nEUBU4ieeaRN55CCIElQPeRZEJSiqJa6Y+OT689v37xsjXakfVcKttZ370oVCa1xqRQXhCVIgRh +PN42zY6TGkAKl+urrf6ubtZ4pUoyDs2n4lbFSTYqtaV0fuCaQLYg3pYgC1Y2bg8XDguZxrQ//eij +T9d2ryTs2sra+cOXn734xtcffvnD19/6/ovf/PLmo5ebuyevP/j47qOPVtdvvf3ki5W9J2v7z/dP +Xqxt3wXRyvKZbKr7yRe/u35wd95L+QOsIBU1q19snQ2WLkSloCm5b37xA9tuAUFCKScFwrl/cnD1 +g6v3v1w5eKaohbt3nnzx9U+G0xNaKKrWgJGbnNJbWL5348HX3elNkrafPfukPz4IhmX3SPSwjpNZ +VqgNxsBD7plWZ2l6snXwaLh4vTU6VKwmQWckrW4ku83RkajXYqgEzyXIWVktsUISBAgr5K1Uf2n7 +/ntf/v5k7YZhNOz0AuZuEuHdKd2I+74LJEOnfygrFU0r5IsLmjXoLNy2MiusANIJ4Lelah0oZ9Fo +nGVzTmaYK00VvUHSafeYPB8gEgoDTdFpwFh3A5HXXczmdZcRuifcAZmfncUIwnHPn5onY7htpkZO +YSWRnZjJgW71I1HT0vOc4IQiHMVaklrKldZLjcNCHQRgS9ML+ULPdFoIqiRTo9bwWq172h5efWNK +6frvBf1UMl5PQYdHeI8n5pmPAYiBFuYYKNAFkSv2BgeMkFK1YhIiebBvZkZyvGo5/RZQVikdjboL +gQS5WazsFetHZnJCkg6BxxNOX1Aq3gCHYrYgFCCb0vmJZjRIyolEpUCA5jkHWEE44q4kYWnTVJxS +qlYpDlQ1m4gXet2VheWd3sJKqTo2nWYi3y80VtrDjdW9a7XO9vLy8aP3vlw7egg9aZo1gXNIQiNR +vpRunp49qnc3gT/biXE+u+qkFvR4j6Ch4tNxNX5+fotmHEFqO7mNVv9s/+p7J7dfbx4/TheWdDnz +8Qff+Lt/9x9Pbj7llHqxdVQb3Vo+/ujZJz89u/my3d9wnPJ3vv/j81vPo4gO4i7uLJfap6PlexeP +v1eqbeTT/W984/tPPvxeIKyAPIlhlqy29q68ePDqB/c/+FG6vNnrbn3xg3/Y7u/FYhqCaZrZ6gyv +X7n98dOPfry8+QiE1TtPvllrbM66p/NggYBIEFmIikp1c2P3gaaUnzx+/Yt/9FeKWuHkjpVZh7vb +ua2zi2/dffHD1uA6gdmvXn/98uNvZwtjX4D1+Cj4MxbTKTIryb1596xV9ubVR0/f/QgA5PLlwOVL +gbd+I3j5MhZD0nZqk8AT61vXx4tHIEt1C3CvStIZnMqHYjB2RRBZDG3Zdh3HNQz+zmfN1LhY3x1N +z3dP300WFikqXqmspnJT98xTxADe6A8I7vJIzjHUPI4I0RAhcno0TIbDLMlmKb4IcoZhixSbjyKy +adaBwvWWr1+588H22fPR5sNs9SAUEQhMMc0mhruv/t4ofQmJ6pJYLtU2eakCGZHLLkCTEEyF3vaH +ZFCLrn0fnjCUathdT6KUqutAdw21KrBZNKYzhAngUyiMeNEOhwmOSwLgxJONydrVo6vvbuxdJFP9 +fH6Qyo5oJilLGcMoiXyaJgyRsXgWPiJ4fRRoK4ErQsrTVJzAzWhE0aS8yDocbYMkhwSXxBIQZpqx +eTEtCBndqOTTnVF/s9PbgooAjV9cu9MeHeeKQz1e1LRMwsw4ZsbQCu7cvZ+ThIIGDRayFGVhqILF +RChPmdyCYg7CESNbXC/UthPJ4dLaja3jB83hAcPYjVLv6rWHleoyQ2XyxZVscSmR6mvxipmogSoH +JatqVZpJe98cTgFcMeksZXIbRrwrChlTTbWbk8n0wN2l2NjP1vY704vO5GaxtpYuLvNCjiXkg/2b +h6cPVa0CVNBKDBgW2FdGV2uhABvy00mj9slH3/7Nb30PtIx7vqpfDiEpRmoU6weFypYdL/3kZ7// +6effCQW42RkkFJRlpV1unU/2n0UiSjTEyQKMY5emLAANKEnQ+cD9RtMTIEIc9J6U3t682mqvxxAd +Qy0gsbxYhM7BUSESJII+BI+RmqhiCIojlChl64MzK72sWwu8XBN5e3Xx4Oz8cba0qFvNdAHE8hbJ +lGMxhadNTc7GIjwSEWkyyVJpiS8mkyPQZTiR4ehcXKkacmnQ3tjYukAIC8oKSdlITA== + + + DwPsh1iFtyuVxVBQ8HlI9whmH0vgFvSJKOYEMQ2Bkc70VL1AUKqT6TW6B9nihpVcGIyvZXJLBGEO ++zut1nos6jqTYDhI9Uw4kiKIqqp0oEmREJ7Qs7bVDIJuimq/ngFEkIS7Ex+1QiHJTLgZynJF2xk7 +yR7HpqJRBWgwz2dIwoyEWZ5xVyQylAlBSxLxGGL4/CxkBEsZIT/u7s4O8bEwLzK2wOUkpU4xuWhU +KFWnucoEw0Ci2nq8Isk5Qys5VlmT07Ewq0qZYrGPY5BWDE0ZEN6GAQ0uweOEQnwkLDFMGkXiJGFR +pA29RCCKLiUlLgmCAkP11uhIN1scl+X4HEnYwJdkMW8aJZaMR0K0dx6B3GSoxNxszDOHhgMkT4kK +b+SSzUZlFfJ0bg71ehgMyzJCjWZzFJXkOF0A0dIapZz63Bzm7gtLLY2Wbq8dPFnavgcSg4ZwohMk +odCE4lYHQofnUrRiKt110j2I/LiasYwcz1owEDwDmjRP0RZNmaEAReMqiQg0xumSxpK0LGg8Z6YL +PVEvE5SN43pCy13Zu3Zx95lpAUnL5gqrvcHNTH6LppMEKiJhJhKk8ZhCEXEcVQhUZWmb4/Kq1pX4 +Eokatla8fXLv9affxSkzhsokaWIAXJjJknAZ4RAd9JExIJYhUEMaiplvTB5kBNEkIeekuhyfZGij +1litNDayxRUnO00kFySARNx07LbjdOE/wyhksouF4j7NdAm8Eo1oAS8aCxOGklTl9IxrIxODAKbp +IsfWSCqLIBaO25ncRJRKQFRwIgV13P0lmQJiDMDoGoDMo2iEJ0A7+wjXFcFLkxRAXIEhEzSpBXyo +bdSK2QUSNwlEI1CTpYEJmCgiVmuTdLYdClE8m1CUrMA7Ep9iKR2PMUiYFFmzVGjEQlE8ijEk1BqH +49Jwu1CQ88yjAR8F1Hd2Juz3EgRqREMCBuNFGGQM0APCTB0vHsf1EhoVeC5NkSmasiEjYBz9HsQ3 +Hwn7SZaI+1yHChzkIY0nUnYtaUF2FyksMTMTgVI4O+ty6TfbYOlQkFZlW5ESNKUG/Dioxf+fpPd+ +kuS6zgX/gUdgpk15k957n1lZWd7b7qrqau+nu8f0eD+DwQw8CEuAIAmCoPegEb1IieatRJHioxXJ +FUWZ1ZNWbmO12oiN9zb2tz05iqiY6J6uysp773e+832ZN88Rxaph9jxvEJTGhtlJJphsBvIpNnMy +iqZJioQFkiXB6baXK5WRbTcp0kCyTCKBZlI8S1dp0qVJvVoc9ZfOzseAK5BYJBOPZFhCkFnNs0th +JaJ8TdYLmZDq86PeegNUkJwncblcGLhOEzIRQTnRKJ1NC2hW1sG86A2K1CFwMikGzXA4qgKnJWIc +iVo5q95vL7fbU57VXbvMcx5oVPggial4Vj15MguUhWXDoc3NJhMpBcV8UWqb5qLrTWynS2ASkM/m +1kXNBDMSgIrT9G4QLLVa214uvHKYTvE874liDqAe3hcLG1DSBHh/XMlmmHg0m46jDC4TCJyqmEyC +jMkZRleRQ6JAEPWhyRoC5whi38/vhQ+5EHY6vNEGvMpE59NIRgCbw/NFy6xJYvCwtEIqFcN31s9e +ufIUSzvJOJlNsnha0sQABkWgSibFRueyFKGKPLCNmklxFCZxhCTQCkupBEak40kaJeBXiERZqohC +KbxPnWCQjAhrdPLRWDJCJWNkFGBwIhk5mUlEaRzRRMYzlBLolmqhce3K4yAyIdllkyKwCppRsIzM +kw7ALx7BfXeYzy0RiMFAjsjIsXnixCOJeBTWRYdvnDkR42hTFoN0kksnYIoosG+xeZRGNYUrMLiN +pkWRzWtKb24+e/Jk/MSJKAyZoQzLAPlt+KZ//fodL9dMJNlsRiYpm+NLgtRk2GIyjjtq7tal+x/7 +0vcymPbIu+ZmZ5JYhtdE3zIKfq6iS/bNa3ePjm+iuByNoA9vyof35VnGkkRLV+xCDhTmuiLVOTYH +Gg9DRPh/GmclVjGVIoGJOELjGYaj9HyuK/AOhsAMpDSB93OASTGNMJksARlBl6uGuohkTMhE8xF0 +5mQMxzRZLgqCj4em1cJxhyZMQylwlIEhnGlWq+0dnIRvVJBMuD/z4V9LjlVPJKm5uQy4aSSt8nQe +R9RkgiRwsRRUyl5e5dRMEk8mCILQPH/Q6OwAojJpEc6oP9wPCpOwK/Q8CnDCUZkOM2CgKy2GzAGQ +yvlBrTjEsjRQusKbLKGypMaTCpohM0kEjn/z1i2GlKKzmfg8OnsiMX8ynUlwYZlH3n14I1jFEQdL +02gKjUeS0bkkkkJ93eiU/F6t4OhWuztW9XwsCh4qHQmXGCcRDUlJ8zPpk49GTz4STcd5RazJQglL +ixJjBU616NUto5aKU3hWpjDINUociOVEbO5kMj6PZBO0zAUUpiajKCA8EQPkCwyRo/B8JinPzaTn +TiZ0uQSAnJ9NAw4h7fKM6+o1nrAzcTE6S6ApiCw2MpuNR0k0DeQppeK4xIkyxxgy0y664/FAkGQc +DJJTbDcHQb4siBqGYjSG+WAaW4uFUm9mJhWZy6JpwVaCvBFoHO8qwrBW2N/fDsq1dJaKJ0gUgRxq +KrJZ8N1a2a+XvNM705dfeG5xcSMazUYj6ch8UmQUHeSRqVuyQiJYTldqgauJgKgYlk7KDFbJq92a +e/P85rWrpzaPpu0+HEy1TBAbGgiYh6aYgjMxFdOzdctQPdsXWddU6zyTA9mTjKASozSr7d5wyTQL +tcpQEByKkGhcRtLs/Gz2xIlEeC2LDsvFwNRlEgSo32Fnsrmxaak6kaWTcYIiDFAFfq4hyXmWc9vt +ZduumWZNlgupJINlBcAMRyu6aEqcQ2IypGxJqEh8Thc0g2Precs3bV1SXE2TaVIGkHH4dFjc2x4p +IrAiSyASnuZpVGVwExIZwAM4hAOFiYhoKoWnk1gq5cjKYsXb7uYvrDUeXB7du7j85nvvXzy7UXJs +jtFwVILcJ5IOAOzRd83PnkylwWWnxXQUY7KsTPF5zfBU3ZY1CoI3jeuiLPMcB/zIiSKtaLzvGnU0 +K8zPJk8+Oj9zIg7wgOQ4D65znj15Aj1xIjM7gySjDIA/m8DxDFEOagwuMCjnKHkiA5qf5am8IgSp +BDE7E0/GCBY0TIbCkkmZzuR1fFARNxZyexutQc9vVPVJ17t92H/uzs7x0eJi211o+sVc3tJzFCnP +nogkIikygzuClJcYk05VDfxgUhh0PNcWHEv2XEeT+JIn9xv6/th545kzb7x08cX72y89darbKkUj +qeh8lkRBsOYtSfFk1peIvIyvtKyDaWG5rdUcfNpQz6+V3nj28I3njr7zqdu/+dGHfv7Ldz7/+WfO +7NbLPq8rIscFBJ4nUE/lnHreGbWdtYXCSr8U6GLN91RByaYQLJ31FGWhXZ1Ou0entt94883+4gQn +yHSKgBOYmwG+EgxzkeMq4aW5EzMCQVRcd1CvNcs5CsuSWRzL4KqoLbZq925dW5qMPdc7OtqqVksk +wSIIo6p5UcyDcuOBlzAgAgFeNS/fKdchETY8uWmRF7brN8+trA+Ki2XteKX0yhOnPvDCuc9+8MZb +L1147t6ZnZVuJecyCI6nKSTJcISjyVWRVkWCNnmqG4jLLXPasrYX3RvbuRcu1D/67OaX3jr+gzfP +//UvvvKbn335Iy8dXz29Muk1bEmlUYbIskiGFzhfZj0mi4OpblrqQsFqu+J6xzm1VNparBxvLz77 +2Ol71zZefLD/9itXPvDivXuXL03anWo+Zyk8mc2C+kJSfDxCApziERoYdfZEPDafxpIEnsxaHFN3 +9UmnEuiyIzD9StCtlkt2vuyUGUyYORmHgEWSFIgtk8rmmMTQQ6+umq9c6z19uffi7fE7H7r2jU8/ +/tn3H37u5cnvvvf0P/z6E3/y9Rc+8b5rF/Ym9Xwe7EM6nkbiURFJ1GRsrUisl9P7bezOtnX/fP3W +mert09UnLw9evDl88+mVDz0//fyr63/1p2/83a8/+e3PXH3uQqnpkNlEMhlHBUYXGZVFCZ3ITFzs +yoi/vSa/frXyzms7H3/39CPPLnz+9bWff+epf/jNJ3/+rXu//MPb//2n7/0f//GzP/3Gc28/v/PY +ca9R8BkMolX0VbvuaQtlaX9oXll1NmvEdpuelJn9kXc4DU5P/fvHnU+/fvb3v/3DX/7q61/83Ltf +f+705TPLpsKk4gkkReGYOj+fnjkxh8VjgYRWFKxh4IGYCKTUtKZuD9y9sXN5zfnIy2c+8vqVN547 ++wcfu/PjH3zig++9P2h52+vTre0Lp849Z9otKp30eLwoEyOPurpsvHqj/8Ll5rVl5Y07nZ9/79Wf +/eCNz7y084WXV377w9f+9e++/M+//+yPv3Ttn3752p9/4+6NXT/HI0QqrEnI4SqLUQqeKorp7Tr9 +/NnCdz9z5Wfff/kPP3Pzky+Mv/6B9R9+6drv//z1P//q7R+9c+Gffv3ev/nh/c++0H7hSu3iZrXu +m40AcmXRNSsaJ5YUbJLHD1rCUwfB20+uvvdG6/WbtT/63M1f/+itf/77b//u55/45Xef+fe/+cj/ +9//+1V//6nOv3+p+6yPnfvGDlz7x6pmqq6djOCRZsLESa5CZDAMpH4nbTMqlo1t19t5e8bFT1cur +9u0d77W7oz/+g+ffef+Fd9567O333K/5eRwVgYF1immb/HqJOu6zz+4Zn3tm4bsfu/Kdj13+yVee ++vsfv/U//u1Pf/ezj/7oS9f+6r8+/8+//dTXP377/Hq1Cg6SV30rUBnG5fAFh9qr4zen7FPbxvsv +F779wf2ffP2p73/2+jfePvqzL1z7+z97z7//5af/5Tcf+fX3n/rt9+79+o8evPlgo+uHSRBESCaJ +UlkyUK2Ope+WuDfOmR+7W/jME/XvfHDzN9+88X/+/kN/+7P3/skXLv/627f/4acv/u0Pn/nR587+ +5J3Tv/zmlf/6mXNPnKsOq3k0RRBZjkfpg6XW6XH+oK89sW9/+dXpj75w6Vsf3PrGW7u/+/Ebv/ze +u//4Uxd/8PHT//G3n/uf//HDf/iLt3733Qf/x1+//b13rh0vAxaS0flINoUDt3uCuFGTJ252bCXu +LXMvn/Pefc57353GO69vfP8z57759u5PvvH4v/3dl3/7J6/9/kfv/de/+cKff/Ppa3vtzZVpvTEm +CaPq5Xs5bVpgjzvUY8vc558b/uJrt37z7ce/+4nT3/7o0U++du9ffvuxX3z7wfc+cfq/ffXG//6r +N3/99TvffLn9+acq15ZkYBWNk+Lz6dlHI2Q8URTS6wXkxlh8Yt99/Wbz0y+s//QPn/nHv/jg//aT +V//6hy//9Y9e+dlXb/3sixf/5KPrn3qi/tiGvlRgShoVlhMVbYFxAqcx7Q0PJqX1Kr9dJu6ucJ95 +fuGPP3Huh1+89idfuPDz79z9/U9e+Zufvv6LP7z3iy+e/ZsfPPZPv3zpdz94/FsfmA== + + + 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 +kHdjEiOEs9VZTi4wYh5KGjiaoPPN7onB9DlNb9kcJJQWyyeiqVEpkBP8RclfVtSSP1QqtuaLnQU9 +UUtkesnsTKawGI2PW83UvlusBw64aSaph5puJzN0wD4y7HXaJVkqlyvL2dwCw+YtFtpswjA8wCvZ +AyOeIZNnxOxj+HI6v5lILrB0zumQVK0iK8lCobWwuLWxeez0+Sv3PfzoY88++9FPf+Ir3/za22// ++q//+Y93//1P3/jej++457HW2AZcm+XmGjCKiOZA6+ba9cqg1Z0bjM+trO+cvPX8/Q8/eueDj1y4 +7/7jFy+fu3bjjvc8etfdD3/uM59/+fXXV7eObGydLNUmQAngZMgfLAX0KivGAoFUpdqbmllcWds8 +fvrkpbuuv+fxR596/rkL9z945tq9Nx568sOf+PhrX/7il7713c9/9Zvvf+4TS1vH5UAaI1S3hyVx +f0SvJJJ1RQ0n0sX++Nzi+uHp5a32+NTEwsrM2u72sdNPPv3Mj9/4ya9+8+tXv/KVC3fcMzaxlky1 +3G7R7ZC9bpXEw8nEaKWyQFFhu50WhXhvsNLsL+RrE6nSaL4xsXX09ks33nPfw4+//Oqr9z7yxB0P +PHrjkSe1aBWkFMCdy8GJXEYSS4q/LskFktIj8Woq1yhV283uzMzCwWOnrzz2vmeffPrpr37r2z9/ +6+3Pf/Vr56/emJk/VKlOCVLWi2gerwIQxHIJULPwhU6niOOReHJQ66wm871kvn3i7MX3f/SjT3z4 +Q3e+54H7H33q+j0PXrnrvgcef9/nv/6tD73wwl333n/8/DVezno8otvFMUxY1WrR2Jgil5OpXjBY +TCRazdbc5sFTk9NTx0/eeuvtly/dceenP/u53/3hz//+xz//4Y9/euudd57+4POl0tiICTeZaGi6 +SGQil1u220SblUS9oiRmaCaDoCEUVWkmwnKxTKa1u3vy/OU7T5y7cv2+h574wLNHjt/Wnz7W6G1J +cs5Yy/ovboHRe42JtaXtU8dOXblw+/ufevS1Vz/z8zd/8evf/uanv/jZW2+99V9///tvfvdvn//X +Lz37kec3Dt1abq170TDqDUbBlSvJVCTTBQuxs3fm1tsuXbn6xBNPvP7FL33hq19/8bOf+eALH/3S +1772xi9/9ZnXvvCtr3/j73//+6tf+sb7P/LJ42evJTOjhdJ0d7BWqE1oei6XrczPzg== + + + 3HZu76EH7vrwh9//4qc+9tVvffXtd9/91hs//vw3vvHtH/3kT3/68//5v//3z/8JV/K7b/3whw88 +8XRnfC0cawFgUqQc09P1SmdlZRU+2zu7V+644wMfevalz3zyuU99/NkXP/7Sq5/5wRs/+sUvf/77 +//jt//zv/3n7N+9+8CMfPX/hznxhTOaLLJmNhPv50rIP0zFE1tU0APfuzqHrd954+PEnHn76Aw89 +9fSrX/zK93/yxg9/+saf//bnv/znP375q9/85re/ffXzX945dCGbnxaEUlDr8kIhnBjVo412a2Zx +cfPI0b3733Pf40+/78MvvPjp1177wU9/9vNfvf3GW2/98tfv/Okvf/xf/+//QLd+/8e/ePmVL+VK +k3YnB5zocgkOY4WkStEJNVDK57obm4fue+jB+x576LlPvfDDN3/207d++eXvfPO1r3zx7Xffeee3 +v/7Jm2/84U9/+P/+z//+zbu/fvHTL527/Wo622ZZ0Nu4w0GiqCzy8UppcnJ89ejh03fd/cDDjz/+ +uS+8+qOf/+ybP/jul775td/+4fd/+6//eufdd95+582///fff/LLn7/nkce6/ZVCZVENtlwuY/Gz +xUzwdETkohG9XK1OgSbpjU4fPHbyvvc+9MmXPvnGmz//9e9+98Wvf/Vnb/3yf/3P//zpb3/75Gde +eeSJx+64815db/J8hSMDg/bk+uLmrUdPXLt49t67Lj712L1f+eIr//Hvv4GKfvudX/zsZ9975bMf +vXr1/MrKSrbQDMc7GBZGvApLBUUmoPtD9Xz50NbO3TfufvCh9zz8yEMffe6D3//B9777/e+9/sXX +vvGNr/3pL3/50c9/+unPvPzK5165eO3uhZVjre6i35+NR2qF0mg210ilyrOTSxsrawc3lu+5fO5f +X3/lS1969evf/NLb7/zyD3/92xu/fOuNX/z83Xd/9Z//+Ou7//HuV7795fsfuWdhdSuabMj+rKQk +/VK4WmzMTi+d3Dtz/NjxY4cO3n39yquvvvzmmz9+69e/+t4bb3zlm1/++Vs//rffvfPOr9/8za+h +WX762Vc/c+XajVprhiR0EteDWi2enKCpOM/oUS3TKNZ31peffO8DX3z9c9/49jdf+tzLP3rjh3/8 +85/+9o+/v/n2j//4h9/+9M0fffrTH33p0y8e3junhSsghwCs/IFyONaMxmqDsdmZydnjR4+9/+nH +P/7i85/69Cde+dxLP/rJD/7zv//r3/74hzd+8ca3v/PFP/3xd7/53buvfuH1J594qtVZQn1BMG4O +G+N2iigSEIVMrTJTKnQPbu8++b4nPvapj33is5/+4U9//Me//umPf/vrD376w7feefOPf/qPf//9 +b9/42fd/9as3fvLGd55+/+OXr15LZ5qiFHN7SCitgJbXQ4V4pLI8v/7gAw9+/gtf+OEbP/rWd7/+ +7r+988e//PGdd3/9i1+99de//Rm+57vf+8oPfvSNn/z0e08//dTJc1dXDt4u+osmE+FxKR4Xj6OC +y47TuDLanb719Jn3PPjAy5975ZXXYDY/9YMffvsf//2P3/7+dz+EtvvJD2CiXnzp+QsXbltf3Q1H +WuXKWkhOtCrderlRyuTGJ0YXl+enp/pb69M3rp98+OHL1+84efu5o+VSKhiQGIpFUQZDRYeNdNgI +l4OgfFLMnygnyt1qZ6zb2dlc295aWZgdPX1y7f57Tz/y4MWrV267dv3aqfNnB1PT4UhaVnLhGGjv +ktfNoR6OxAQa50C4HD90ZnPzYC6ZaufTh9ZmLp478sB9l5588sbXv/zZnwHcvPXTd37zsxc++ezZ +206MT0+E9IQWzNNgXX0yhimyED568PSZM1carfFKpTnV627MTZw9sfnCh9/7zW+8/tbbb777b29/ +89uvf+G1Fz/38oeef+a+xx+4cGR7s92eCEUqbjdPkiEv6rfYwNfgdjvlcdEqp5YSsYPL84/cefH1 +T7/w2hdefvUzz/74B//65z//7lOf/MC184eObs71mq1SqUYQvNOBM3QIPhiuwoemVI4SY6Fks9xe +m1m4curw04/f+7GPPPavr73w5pvf//ff//ovf/39T3/8xec/+NDlS8catSKOcZgvQJFRhx0kjbFE +2WLykag/phUSWmZqbGJpfnZv7+jF289ev3L7fXde+swnP/j1r7322U9/7KUXPvDxDz/2uZeee+ye +q6d2t3PpKs0EPAiHICKBaywXzWRGg1qW9PEJPbWzunX3nXe98NyHnnnq0buvXf3gU49/7zvf+MbX +X3v03nMfeuj6Bx+797Yzx7ZXF/ut0Wy22+nv6OG22YxbLTSORbwe0WUnMC+bi5d2V9buvnrhs595 +8dXXXv7gM489/cT9L73w7Pe+892PP/fcPVcubyytVMs1nlFxzO/2KE4747ShiIfGEJbCBU3LpVKt +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 +pHwoZJBRiwgsFanra+lHN/KHs8aVFfuFa70//spT779y8P7rj77xsZsF10NgDjCwgpNVjZnP4PtN +6sk19b0nOt99+9yHbx/+5Kt3/v7Hr//Pf/uz3/3skz/60oW//q9P/fNvP/P1T105PZ/PAwfJSK7u +SyRp0UjHxNeKyOUhdWdZfeUw9Z3X1n/y9Tvff/fiN97Y/vMvXPj7P//Yv//VZ//lN2/9+vt3fvu9 +67/+o1uv3lqou+MkCERIPALjCcyX9JqurGbol05pb19Lfe528cPXFn/zzUv/5+8/8bc/e/FPv3D4 +6+9c+Yef3vvbHz7xo/f2fvL+zi+/ee6/fu7U7VP5dt6DoyiaoBmY2Jyu7PS9zaZ8e9348v3hj75w +9luvLX3j9dXf/filX37v6T/+zJkffGrnP/72vf/1Hz/8h798/XffvfV//OGN771/YX8GYCESmJxK +RBHA7TbLLRSEgZXo6+HrM/Rzp+ynT9kvXy29/2Dh+5879c03Vn/yjRv/9ndf/u2fvvD7H734r3/z +hb/45uMX1qqLo2Gx1MdQNW97DUcepqj9Gv7oDP35u+1ffO3oN9+58d13dr7zye2ffA== + + + 7fq//PbtX3zn1vfe2flvH1z633/16q+/fvWbz1U/fyd3YVoArCLTfGgydvKRKSwUTrOx+RR0qc/d +XrceXC5/9pn5n377iX/8y9f+t5/c/8MPn/vDj57/2QdHP/vimT/95PxnbhcfXVCmU2RGxsflRDmD +JU3fLA0b7c1BZj7PLGfRayP6c091/vidUz/84oU//cLBzz+89vufPP83P33wi29f/8UX9/7mB4/+ +0y+f/d0Pbnzr44NPXfNfuFBpZXQkwYp8gWNcXVA7ebPlktM+fnGkPrWtvnBgvnktD2bjr/7kiV9+ +eO1nXz/6v/7xq//3v/zRd97c+fDTlx48vs3jDA5zKUnOCGRegAcutl4irszIL52vfPPVre9/+tyP +P3/p3379qf/17z/+2x/d/9F7Z997bu30UjGjMTxOkqhoKFlLybqy7/FsSUZWisLRfPbuqeLHzqZ+ +8Mmt//7dp37/o7e/9OLGF58bfO/N1Z98+dLX39i9d7F2frncKVZMEFNijsJN4MU4UitY2brjFiVi +xiPPz9iX5uybK/anbzV/+O7hrz586vufu/idN/e+8PzG61d7r56rPbmd2e6r7ZxgSQycYCS26BoN +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 + + + diff --git a/www/source/images/home/code-2.png b/www/source/images/home/code-2.png new file mode 100644 index 000000000..576d68f88 Binary files /dev/null and b/www/source/images/home/code-2.png differ diff --git a/www/source/images/home/code-2.svg b/www/source/images/home/code-2.svg new file mode 100644 index 000000000..46af6d549 --- /dev/null +++ b/www/source/images/home/code-2.svg @@ -0,0 +1,759 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/source/images/home/free-icon.png b/www/source/images/home/free-icon.png new file mode 100755 index 000000000..802e04e93 Binary files /dev/null and b/www/source/images/home/free-icon.png differ diff --git a/www/source/images/home/fully-icon.png b/www/source/images/home/fully-icon.png new file mode 100755 index 000000000..6ef580c88 Binary files /dev/null and b/www/source/images/home/fully-icon.png differ diff --git a/www/source/images/home/hero-code.gif b/www/source/images/home/hero-code.gif new file mode 100755 index 000000000..0a1b1891d Binary files /dev/null and b/www/source/images/home/hero-code.gif differ diff --git a/www/source/images/home/hero.png b/www/source/images/home/hero.png new file mode 100755 index 000000000..05b939f20 Binary files /dev/null and b/www/source/images/home/hero.png differ diff --git a/www/source/images/home/platform-icon.png b/www/source/images/home/platform-icon.png new file mode 100755 index 000000000..f3c1b2717 Binary files /dev/null and b/www/source/images/home/platform-icon.png differ diff --git a/www/source/images/home/test-icon.png b/www/source/images/home/test-icon.png new file mode 100755 index 000000000..81a322a98 Binary files /dev/null and b/www/source/images/home/test-icon.png differ diff --git a/www/source/images/inspec-by-chef-logo.png b/www/source/images/inspec-by-chef-logo.png new file mode 100644 index 000000000..4b6b195df Binary files /dev/null and b/www/source/images/inspec-by-chef-logo.png differ diff --git a/www/source/images/inspec-by-chef-logo.svg b/www/source/images/inspec-by-chef-logo.svg new file mode 100644 index 000000000..8593e19ff --- /dev/null +++ b/www/source/images/inspec-by-chef-logo.svg @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/source/images/inspec-logo.png b/www/source/images/inspec-logo.png new file mode 100644 index 000000000..e1c0876ec Binary files /dev/null and b/www/source/images/inspec-logo.png differ diff --git a/www/source/images/tutorials/tutorial-icon.png b/www/source/images/tutorials/tutorial-icon.png new file mode 100755 index 000000000..edaa757aa Binary files /dev/null and b/www/source/images/tutorials/tutorial-icon.png differ diff --git a/www/source/index.html.slim b/www/source/index.html.slim new file mode 100644 index 000000000..6cf33b640 --- /dev/null +++ b/www/source/index.html.slim @@ -0,0 +1,75 @@ +--- +title: InSpec - Audit and Test Framework +--- +.row + .columns.medium-12 + .home-hero + img.home-hero--code src="/images/home/hero-code.gif" alt="" + h2.main-subhead.text-center InSpec is compliance as code + p + | InSpec is compliance as code – a human-readable language for automating + the continuous testing and compliance auditing of your entire + infrastructure. You can also use it to verify if your servers and + applications are configured correctly. + p.text-center.home-hero--buttons + a.button.secondary href="https://downloads.chef.io/inspec" Download InSpec + a.button.primary.try-demo href="#" Start the Demo + hr.home-divider + .icon-blocks.row + .columns.large-3.small-6 + img.icon-block--img src="/images/home/platform-icon.png" + h3.icon-block--heading Platform Agnostic + p.icon-block--text + | InSpec supports all major operating systems and many applications + out of the box. + .columns.large-3.small-6 + img.icon-block--img src="/images/home/test-icon.png" + h3.icon-block--heading Test Locally or Remotely + p.icon-block--text + | InSpec provides a local agent, as well as full remote testing support. + .columns.large-3.small-6 + img.icon-block--img src="/images/home/free-icon.png" + h3.icon-block--heading Free to Run Anywhere + p.icon-block--text + | InSpec is a language that can easily express compliance as code, with the freedom to run anywhere. + .columns.large-3.small-6 + img.icon-block--img src="/images/home/fully-icon.png" + h3.icon-block--heading Fully Extensible Language + p.icon-block--text + | Easily extend the InSpec language to cover new operating systems, + devices, or applications. + hr.home-divider + .code-snippet.row + .columns.large-6 + img.code-snippet--img[src="/images/home/code-1.svg" onerror="this.src='/images/home/code-1.png'" + alt="Code Snippet"] + .columns.large-6.code-snippet--panel.first + small.code-snippet--description + strong Transform your compliance and security requirements into simple code. + h3.code-snippet--heading Codify Agreements: + p.code-snippet--text + | Combine profiles and customize them with overlays. Pick controls + and define exceptions as code. + h3.code-snippet--heading Add Context to Your Tests: + p.code-snippet--text Supports many fields like descriptions, tags, and impact. + h3.code-snippet--heading Apply to all systems: + p.code-snippet--text + | Combine profiles and customize them with overlays. Pick controls + and define exceptions as code. + .code-snippet.row + .columns.large-6 + img.code-snippet--img[src="/images/home/code-2.svg" onerror="this.src='/images/home/code-2.png'" + alt="Code Snippet"] + .columns.large-6.code-snippet--panel.second + small.code-snippet--description + strong Solve your infrastructure testing needs simply and efficiently. + h3.code-snippet--heading Test the desired state: + p.code-snippet--text Match your infrastructure to your expectations. + h3.code-snippet--heading Use simple and expressive code: + p.code-snippet--text These tests are easy to understand by anyone, reducing friction. + h3.code-snippet--heading Test any system anywhere: + p.code-snippet--text + | Runs locally and remotely. Supports all major operating systems + and configurations. + h3.code-snippet--heading Extensible: + p.code-snippet--text Easily create custom resources and share them. diff --git a/www/source/javascripts/all.js b/www/source/javascripts/all.js new file mode 100644 index 000000000..edae1808d --- /dev/null +++ b/www/source/javascripts/all.js @@ -0,0 +1,3 @@ +//= require vendor/jquery.min +//= require vendor/foundation.min +//= require nav \ No newline at end of file diff --git a/www/source/javascripts/nav.js b/www/source/javascripts/nav.js new file mode 100644 index 000000000..5d1239667 --- /dev/null +++ b/www/source/javascripts/nav.js @@ -0,0 +1,75 @@ +// Nav Scripts +const $navLinks = $('.main-nav--links'); +const $navToggle = $('.main-nav--toggle'); +const navBreakpoint = 730; // this should match $nav-breakpoint in _nav.scss +const $mainContent = $('#main-content'); +const $mainNav = $('#main-nav'); +const $mainNavCtas = $('#main-nav-ctas'); + +$navToggle.click(function() { + $(this).toggleClass('is-active'); + $navLinks.slideToggle(); +}); + +$(window).resize(function() { + if ($(window).width() >= navBreakpoint) { + $navToggle.removeClass('is-active'); + $navLinks.attr("style", ""); + } +}); + +// toggles fixed nav position when the window is too short +var footerOffsetTop, navOffsetBottom; + +function toggleFixedNavPosition() { + navOffsetBottom = $mainNav.outerHeight() + $(window).scrollTop(); + footerOffsetTop = $("#main-footer").offset().top; + + $mainNav.toggleClass("is-fixed-bottom", (footerOffsetTop < navOffsetBottom) && $(window).height() <= 759) +} + +$(document).ready(function() { + $mainContent.css('min-height', $mainNav.outerHeight() - $('#main-nav-ctas').outerHeight()); + toggleFixedNavPosition(); +}); + +$(window).scroll(function() { + toggleFixedNavPosition(); +}); + +// handle nav when global message exists +// gm_session_id is set on at template level +var globalMessageHeight; +const $globalMessage = $("#global-message"); + +function adjustNavPosition() { + globalMessageHeight = $globalMessage.outerHeight(); + + if ($globalMessage.is(":visible")) { + $mainNav.css('top', globalMessageHeight); + $mainNavCtas.css('top', globalMessageHeight); + $mainContent.css('margin-top', globalMessageHeight + 100); + } +} + +if(!localStorage.getItem(gm_session_id)) { + $globalMessage.addClass('is-visible'); + adjustNavPosition(); +} + +$(document).ready(function() { + $("#global-message .dismiss-button").click(function(e) { + $globalMessage.removeClass('is-visible') + $mainNav.css('top', ''); + $mainNavCtas.css('top', ''); + $mainContent.css('margin-top', 100); + localStorage.setItem(gm_session_id, "true"); + return false; + }); +}); + +$(window).resize(function() { + if(!localStorage.getItem(gm_session_id)) { + adjustNavPosition(); + } +}); \ No newline at end of file diff --git a/www/source/javascripts/vendor/foundation.min.js b/www/source/javascripts/vendor/foundation.min.js new file mode 100644 index 000000000..2c9b054ef --- /dev/null +++ b/www/source/javascripts/vendor/foundation.min.js @@ -0,0 +1,2 @@ +function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}!function(t){"use strict";function e(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/,i=e.exec(t.toString());return i&&i.length>1?i[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function i(t){return/true/.test(t)?!0:/false/.test(t)?!1:isNaN(1*t)?t:parseFloat(t)}function n(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}var o="6.2.2",s={version:o,_plugins:{},_uuids:[],rtl:function(){return"rtl"===t("html").attr("dir")},plugin:function(t,i){var o=i||e(t),s=n(o);this._plugins[s]=this[o]=t},registerPlugin:function(t,i){var o=i?n(i):e(t.constructor).toLowerCase();t.uuid=this.GetYoDigits(6,o),t.$element.attr("data-"+o)||t.$element.attr("data-"+o,t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf."+o),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var i=n(e(t.$element.data("zfPlugin").constructor));this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-"+i).removeData("zfPlugin").trigger("destroyed.zf."+i);for(var o in t)t[o]=null},reInit:function(e){var i=e instanceof t;try{if(i)e.each(function(){t(this).data("zfPlugin")._init()});else{var o=typeof e,s=this,a={object:function(e){e.forEach(function(e){e=n(e),t("[data-"+e+"]").foundation("_init")})},string:function(){e=n(e),t("[data-"+e+"]").foundation("_init")},undefined:function(){this.object(Object.keys(s._plugins))}};a[o](e)}}catch(r){console.error(r)}finally{return e}},GetYoDigits:function(t,e){return t=t||6,Math.round(Math.pow(36,t+1)-Math.random()*Math.pow(36,t)).toString(36).slice(1)+(e?"-"+e:"")},reflow:function(e,n){"undefined"==typeof n?n=Object.keys(this._plugins):"string"==typeof n&&(n=[n]);var o=this;t.each(n,function(n,s){var a=o._plugins[s],r=t(e).find("[data-"+s+"]").addBack("[data-"+s+"]");r.each(function(){var e=t(this),n={};if(e.data("zfPlugin"))return void console.warn("Tried to initialize "+s+" on an element that already has a Foundation plugin.");if(e.attr("data-options")){e.attr("data-options").split(";").forEach(function(t,e){var o=t.split(":").map(function(t){return t.trim()});o[0]&&(n[o[0]]=i(o[1]))})}try{e.data("zfPlugin",new a(t(this),n))}catch(o){console.error(o)}finally{return}})})},getFnName:e,transitionend:function(t){var e,i={transition:"transitionend",WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"otransitionend"},n=document.createElement("div");for(var o in i)"undefined"!=typeof n.style[o]&&(e=i[o]);return e?e:(e=setTimeout(function(){t.triggerHandler("transitionend",[t])},1),"transitionend")}};s.util={throttle:function(t,e){var i=null;return function(){var n=this,o=arguments;null===i&&(i=setTimeout(function(){t.apply(n,o),i=null},e))}}};var a=function(i){var n=typeof i,o=t("meta.foundation-mq"),a=t(".no-js");if(o.length||t('').appendTo(document.head),a.length&&a.removeClass("no-js"),"undefined"===n)s.MediaQuery._init(),s.reflow(this);else{if("string"!==n)throw new TypeError("We're sorry, "+n+" is not a valid parameter. You must use a string representing the method you wish to invoke.");var r=Array.prototype.slice.call(arguments,1),l=this.data("zfPlugin");if(void 0===l||void 0===l[i])throw new ReferenceError("We're sorry, '"+i+"' is not an available method for "+(l?e(l):"this element")+".");1===this.length?l[i].apply(l,r):this.each(function(e,n){l[i].apply(t(n).data("zfPlugin"),r)})}return this};window.Foundation=s,t.fn.foundation=a,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;es?o=window.requestAnimationFrame(n,e):(window.cancelAnimationFrame(o),e.trigger("finished.zf.animate",[e]).triggerHandler("finished.zf.animate",[e]))}var o,s,a=null;o=window.requestAnimationFrame(n)}function i(e,i,s,a){function r(){e||i.hide(),l(),a&&a.apply(i)}function l(){i[0].style.transitionDuration=0,i.removeClass(d+" "+u+" "+s)}if(i=t(i).eq(0),i.length){var d=e?n[0]:n[1],u=e?o[0]:o[1];l(),i.addClass(s).css("transition","none"),requestAnimationFrame(function(){i.addClass(d),e&&i.show()}),requestAnimationFrame(function(){i[0].offsetWidth,i.css("transition","").addClass(u)}),i.one(Foundation.transitionend(i),r)}}var n=["mui-enter","mui-leave"],o=["mui-enter-active","mui-leave-active"],s={animateIn:function(t,e,n){i(!0,t,e,n)},animateOut:function(t,e,n){i(!1,t,e,n)}};Foundation.Move=e,Foundation.Motion=s}(jQuery),!function(t){var e={Feather:function(e){var i=arguments.length<=1||void 0===arguments[1]?"zf":arguments[1];e.attr("role","menubar");var n=e.find("li").attr({role:"menuitem"}),o="is-"+i+"-submenu",s=o+"-item",a="is-"+i+"-submenu-parent";e.find("a:first").attr("tabindex",0),n.each(function(){var e=t(this),i=e.children("ul");i.length&&(e.addClass(a).attr({"aria-haspopup":!0,"aria-expanded":!1,"aria-label":e.children("a:first").text()}),i.addClass("submenu "+o).attr({"data-submenu":"","aria-hidden":!0,role:"menu"})),e.parent("[data-submenu]").length&&e.addClass("is-submenu-item "+s)})},Burn:function(t,e){var i=(t.find("li").removeAttr("tabindex"),"is-"+e+"-submenu"),n=i+"-item",o="is-"+e+"-submenu-parent";t.find("*").removeClass(i+" "+n+" "+o+" is-submenu-item submenu is-active").removeAttr("data-submenu").css("display","")}};Foundation.Nest=e}(jQuery),!function(t){function e(t,e,n,o){var s,a,r,l,d=i(t);if(e){var u=i(e);a=d.offset.top+d.height<=u.height+u.offset.top,s=d.offset.top>=u.offset.top,r=d.offset.left>=u.offset.left,l=d.offset.left+d.width<=u.width+u.offset.left}else a=d.offset.top+d.height<=d.windowDims.height+d.windowDims.offset.top,s=d.offset.top>=d.windowDims.offset.top,r=d.offset.left>=d.windowDims.offset.left,l=d.offset.left+d.width<=d.windowDims.width;var h=[a,s,r,l];return n?r===l==!0:o?s===a==!0:-1===h.indexOf(!1)}function i(t,e){if(t=t.length?t[0]:t,t===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var i=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),o=document.body.getBoundingClientRect(),s=window.pageYOffset,a=window.pageXOffset;return{width:i.width,height:i.height,offset:{top:i.top+s,left:i.left+a},parentDims:{width:n.width,height:n.height,offset:{top:n.top+s,left:n.left+a}},windowDims:{width:o.width,height:o.height,offset:{top:s,left:a}}}}function n(t,e,n,o,s,a){var r=i(t),l=e?i(e):null;switch(n){case"top":return{left:Foundation.rtl()?l.offset.left-r.width+l.width:l.offset.left,top:l.offset.top-(r.height+o)};case"left":return{left:l.offset.left-(r.width+s),top:l.offset.top};case"right":return{left:l.offset.left+l.width+s,top:l.offset.top};case"center top":return{left:l.offset.left+l.width/2-r.width/2,top:l.offset.top-(r.height+o)};case"center bottom":return{left:a?s:l.offset.left+l.width/2-r.width/2,top:l.offset.top+l.height+o};case"center left":return{left:l.offset.left-(r.width+s),top:l.offset.top+l.height/2-r.height/2};case"center right":return{left:l.offset.left+l.width+s+1,top:l.offset.top+l.height/2-r.height/2};case"center":return{left:r.windowDims.offset.left+r.windowDims.width/2-r.width/2,top:r.windowDims.offset.top+r.windowDims.height/2-r.height/2};case"reveal":return{left:(r.windowDims.width-r.width)/2,top:r.windowDims.offset.top+o};case"reveal full":return{left:r.windowDims.offset.left,top:r.windowDims.offset.top};case"left bottom":return{left:l.offset.left-(r.width+s),top:l.offset.top+l.height};case"right bottom":return{left:l.offset.left+l.width+s-r.width,top:l.offset.top+l.height};default:return{left:Foundation.rtl()?l.offset.left-r.width+l.width:l.offset.left,top:l.offset.top+l.height+o}}}Foundation.Box={ImNotTouchingYou:e,GetDimensions:i,GetOffsets:n}}(jQuery),!function(t){function e(){s(),n(),o(),i()}function i(e){var i=t("[data-yeti-box]"),n=["dropdown","tooltip","reveal"];if(e&&("string"==typeof e?n.push(e):"object"==typeof e&&"string"==typeof e[0]?n.concat(e):console.error("Plugin names must be strings")),i.length){var o=n.map(function(t){return"closeme.zf."+t}).join(" ");t(window).off(o).on(o,function(e,i){var n=e.namespace.split(".")[0],o=t("[data-"+n+"]").not('[data-yeti-box="'+i+'"]');o.each(function(){var e=t(this);e.triggerHandler("close.zf.trigger",[e])})})}}function n(e){var i=void 0,n=t("[data-resize]");n.length&&t(window).off("resize.zf.trigger").on("resize.zf.trigger",function(o){i&&clearTimeout(i),i=setTimeout(function(){a||n.each(function(){t(this).triggerHandler("resizeme.zf.trigger")}),n.attr("data-events","resize")},e||10)})}function o(e){var i=void 0,n=t("[data-scroll]");n.length&&t(window).off("scroll.zf.trigger").on("scroll.zf.trigger",function(o){i&&clearTimeout(i),i=setTimeout(function(){a||n.each(function(){t(this).triggerHandler("scrollme.zf.trigger")}),n.attr("data-events","scroll")},e||10)})}function s(){if(!a)return!1;var e=document.querySelectorAll("[data-resize], [data-scroll], [data-mutate]"),i=function(e){var i=t(e[0].target);switch(i.attr("data-events")){case"resize":i.triggerHandler("resizeme.zf.trigger",[i]);break;case"scroll":i.triggerHandler("scrollme.zf.trigger",[i,window.pageYOffset]);break;default:return!1}};if(e.length)for(var n=0;n<=e.length-1;n++){var o=new a(i);o.observe(e[n],{attributes:!0,childList:!1,characterData:!1,subtree:!1,attributeFilter:["data-events"]})}}var a=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e=l?a:l,t.data("paused",!1),n=Date.now(),o=setTimeout(function(){e.infinite&&s.restart(),i()},l),t.trigger("timerstart.zf."+r)},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-n,t.trigger("timerpaused.zf."+r)}}function i(e,i){function n(){o--,0===o&&i()}var o=e.length;0===o&&i(),e.each(function(){this.complete?n():"undefined"!=typeof this.naturalWidth&&this.naturalWidth>0?n():t(this).one("load",function(){n()})})}Foundation.Timer=e,Foundation.onImagesLoaded=i}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i'),i.data("savedHref",i.attr("href")).removeAttr("href"),i.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"menu"}),e._events(i)}),this.$submenus.each(function(){var i=t(this),n=i.find(".js-drilldown-back");n.length||i.prepend(e.options.backButton),e._back(i)}),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=t(this.options.wrapper).addClass("is-drilldown"),this.$wrapper=this.$element.wrap(this.$wrapper).parent().css(this._getMaxDims()))}},{key:"_events",value:function(e){var i=this;e.off("click.zf.drilldown").on("click.zf.drilldown",function(n){if(t(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&(n.stopImmediatePropagation(),n.preventDefault()),i._show(e.parent("li")),i.options.closeOnClick){var o=t("body");o.off(".zf.drilldown").on("click.zf.drilldown",function(e){e.target===i.$element[0]||t.contains(i.$element[0],e.target)||(e.preventDefault(),i._hideAll(),o.off(".zf.drilldown"))})}})}},{key:"_keyboardEvents",value:function(){var e=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a")).on("keydown.zf.drilldown",function(i){var n,o,s=t(this),a=s.parent("li").parent("ul").children("li").children("a");a.each(function(e){return t(this).is(s)?(n=a.eq(Math.max(0,e-1)),void(o=a.eq(Math.min(e+1,a.length-1)))):void 0}),Foundation.Keyboard.handleKey(i,"Drilldown",{next:function(){return s.is(e.$submenuAnchors)?(e._show(s.parent("li")),s.parent("li").one(Foundation.transitionend(s),function(){s.parent("li").find("ul li a").filter(e.$menuItems).first().focus()}),!0):void 0},previous:function(){return e._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one(Foundation.transitionend(s),function(){setTimeout(function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()},1)}),!0},up:function(){return n.focus(),!0},down:function(){return o.focus(),!0},close:function(){e._back()},open:function(){return s.is(e.$menuItems)?s.is(e.$submenuAnchors)&&(e._show(s.parent("li")),s.parent("li").one(Foundation.transitionend(s),function(){s.parent("li").find("ul li a").filter(e.$menuItems).first().focus()})):(e._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one(Foundation.transitionend(s),function(){setTimeout(function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()},1)})),!0},handled:function(t){t&&i.preventDefault(),i.stopImmediatePropagation()}})})}},{key:"_hideAll",value:function(){var t=this.$element.find(".is-drilldown-submenu.is-active").addClass("is-closing");t.one(Foundation.transitionend(t),function(e){t.removeClass("is-active is-closing")}),this.$element.trigger("closed.zf.drilldown")}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",function(i){i.stopImmediatePropagation(),e._hide(t)})}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",function(e){setTimeout(function(){t._hideAll()},0)})}},{key:"_show",value:function(t){t.children("[data-submenu]").addClass("is-active"),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){t.addClass("is-closing").one(Foundation.transitionend(t),function(){t.removeClass("is-active is-closing"),t.blur()}),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var e=0,i={};return this.$submenus.add(this.$element).each(function(){var i=t(this).children("li").length;e=i>e?i:e}),i["min-height"]=e*this.$menuItems[0].getBoundingClientRect().height+"px",i["max-width"]=this.$element[0].getBoundingClientRect().width+"px",i}},{key:"destroy",value:function(){this._hideAll(),Foundation.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each(function(){t(this).off(".zf.drilldown")}),this.$element.find("a").each(function(){var e=t(this);e.data("savedHref")&&e.attr("href",e.data("savedHref")).removeData("savedHref")}),Foundation.unregisterPlugin(this)}}]),e}();e.defaults={backButton:'
  • Back
  • ',wrapper:"
    ",parentLink:!1,closeOnClick:!1},Foundation.plugin(e,"Drilldown")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i-1,r=a?e.$tabs:s.siblings("li").add(s);r.each(function(e){return t(this).is(s)?(n=r.eq(e-1),void(o=r.eq(e+1))):void 0});var l=function(){s.is(":last-child")||(o.children("a:first").focus(),i.preventDefault())},d=function(){n.children("a:first").focus(),i.preventDefault()},u=function(){var t=s.children("ul.is-dropdown-submenu");t.length&&(e._show(t),s.find("li > a:first").focus(),i.preventDefault())},h=function(){var t=s.parent("ul").parent("li");t.children("a:first").focus(),e._hide(t),i.preventDefault()},f={open:u,close:function(){e._hide(e.$element),e.$menuItems.find("a:first").focus(),i.preventDefault()},handled:function(){i.stopImmediatePropagation()}};a?e.$element.hasClass(e.options.verticalClass)?"left"===e.options.alignment?t.extend(f,{down:l,up:d,next:u,previous:h}):t.extend(f,{down:l,up:d,next:h,previous:u}):t.extend(f,{next:l,previous:d,down:u,up:h}):"left"===e.options.alignment?t.extend(f,{next:u,previous:h,down:l,up:d}):t.extend(f,{next:h,previous:u,down:l,up:d}),Foundation.Keyboard.handleKey(i,"DropdownMenu",f)})}},{key:"_addBodyHandler",value:function(){var e=t(document.body),i=this;e.off("mouseup.zf.dropdownmenu touchend.zf.dropdownmenu").on("mouseup.zf.dropdownmenu touchend.zf.dropdownmenu",function(t){var n=i.$element.find(t.target);n.length||(i._hide(),e.off("mouseup.zf.dropdownmenu touchend.zf.dropdownmenu"))})}},{key:"_show",value:function(e){var i=this.$tabs.index(this.$tabs.filter(function(i,n){return t(n).find(e).length>0})),n=e.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,i),e.css("visibility","hidden").addClass("js-dropdown-active").attr({"aria-hidden":!1}).parent("li.is-dropdown-submenu-parent").addClass("is-active").attr({"aria-expanded":!0});var o=Foundation.Box.ImNotTouchingYou(e,null,!0);if(!o){var s="left"===this.options.alignment?"-right":"-left",a=e.parent(".is-dropdown-submenu-parent");a.removeClass("opens"+s).addClass("opens-"+this.options.alignment),o=Foundation.Box.ImNotTouchingYou(e,null,!0),o||a.removeClass("opens-"+this.options.alignment).addClass("opens-inner"),this.changed=!0}e.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownmenu",[e])}},{key:"_hide",value:function(t,e){var i;i=t&&t.length?t:void 0!==e?this.$tabs.not(function(t,i){return t===e}):this.$element;var n=i.hasClass("is-active")||i.find(".is-active").length>0;if(n){if(i.find("li.is-active").add(i).attr({"aria-expanded":!1,"data-is-click":!1}).removeClass("is-active"),i.find("ul.js-dropdown-active").attr({"aria-hidden":!0}).removeClass("js-dropdown-active"),this.changed||i.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";i.find("li.is-dropdown-submenu-parent").add(i).removeClass("opens-inner opens-"+this.options.alignment).addClass("opens-"+o),this.changed=!1}this.$element.trigger("hide.zf.dropdownmenu",[i])}}},{key:"destroy",value:function(){this.$menuItems.off(".zf.dropdownmenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),t(document.body).off(".zf.dropdownmenu"),Foundation.Nest.Burn(this.$element,"dropdown"),Foundation.unregisterPlugin(this)}}]),e}();e.defaults={disableHover:!1,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500, +alignment:"left",closeOnClick:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0},Foundation.plugin(e,"DropdownMenu")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i-1&&this.usedPositions.indexOf("left")<0?this.$element.addClass("left"):"top"===t&&this.usedPositions.indexOf("bottom")>-1&&this.usedPositions.indexOf("left")<0?this.$element.removeClass(t).addClass("left"):"left"===t&&this.usedPositions.indexOf("right")>-1&&this.usedPositions.indexOf("bottom")<0?this.$element.removeClass(t):"right"===t&&this.usedPositions.indexOf("left")>-1&&this.usedPositions.indexOf("bottom")<0?this.$element.removeClass(t):this.$element.removeClass(t),this.classChanged=!0,this.counter--}},{key:"_setPosition",value:function(){if("false"===this.$anchor.attr("aria-expanded"))return!1;var t=this.getPositionClass(),e=Foundation.Box.GetDimensions(this.$element),i=(Foundation.Box.GetDimensions(this.$anchor),"left"===t?"left":"right"===t?"left":"top"),n="top"===i?"height":"width";"height"===n?this.options.vOffset:this.options.hOffset;if(e.width>=e.windowDims.width||!this.counter&&!Foundation.Box.ImNotTouchingYou(this.$element))return this.$element.offset(Foundation.Box.GetOffsets(this.$element,this.$anchor,"center bottom",this.options.vOffset,this.options.hOffset,!0)).css({width:e.windowDims.width-2*this.options.hOffset,height:"auto"}),this.classChanged=!0,!1;for(this.$element.offset(Foundation.Box.GetOffsets(this.$element,this.$anchor,t,this.options.vOffset,this.options.hOffset));!Foundation.Box.ImNotTouchingYou(this.$element,!1,!0)&&this.counter;)this._reposition(t),this._setPosition()}},{key:"_events",value:function(){var e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":this._setPosition.bind(this)}),this.options.hover&&(this.$anchor.off("mouseenter.zf.dropdown mouseleave.zf.dropdown").on("mouseenter.zf.dropdown",function(){clearTimeout(e.timeout),e.timeout=setTimeout(function(){e.open(),e.$anchor.data("hover",!0)},e.options.hoverDelay)}).on("mouseleave.zf.dropdown",function(){clearTimeout(e.timeout),e.timeout=setTimeout(function(){e.close(),e.$anchor.data("hover",!1)},e.options.hoverDelay)}),this.options.hoverPane&&this.$element.off("mouseenter.zf.dropdown mouseleave.zf.dropdown").on("mouseenter.zf.dropdown",function(){clearTimeout(e.timeout)}).on("mouseleave.zf.dropdown",function(){clearTimeout(e.timeout),e.timeout=setTimeout(function(){e.close(),e.$anchor.data("hover",!1)},e.options.hoverDelay)})),this.$anchor.add(this.$element).on("keydown.zf.dropdown",function(i){var n=t(this),o=Foundation.Keyboard.findFocusable(e.$element);Foundation.Keyboard.handleKey(i,"Dropdown",{tab_forward:function(){e.$element.find(":focus").is(o.eq(-1))&&(e.options.trapFocus?(o.eq(0).focus(),i.preventDefault()):e.close())},tab_backward:function(){(e.$element.find(":focus").is(o.eq(0))||e.$element.is(":focus"))&&(e.options.trapFocus?(o.eq(-1).focus(),i.preventDefault()):e.close())},open:function(){n.is(e.$anchor)&&(e.open(),e.$element.attr("tabindex",-1).focus(),i.preventDefault())},close:function(){e.close(),e.$anchor.focus()}})})}},{key:"_addBodyHandler",value:function(){var e=t(document.body).not(this.$element),i=this;e.off("click.zf.dropdown").on("click.zf.dropdown",function(t){i.$anchor.is(t.target)||i.$anchor.find(t.target).length||i.$element.find(t.target).length||(i.close(),e.off("click.zf.dropdown"))})}},{key:"open",value:function(){if(this.$element.trigger("closeme.zf.dropdown",this.$element.attr("id")),this.$anchor.addClass("hover").attr({"aria-expanded":!0}),this._setPosition(),this.$element.addClass("is-open").attr({"aria-hidden":!1}),this.options.autoFocus){var t=Foundation.Keyboard.findFocusable(this.$element);t.length&&t.eq(0).focus()}this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdown",[this.$element])}},{key:"close",value:function(){if(!this.$element.hasClass("is-open"))return!1;if(this.$element.removeClass("is-open").attr({"aria-hidden":!0}),this.$anchor.removeClass("hover").attr("aria-expanded",!1),this.classChanged){var t=this.getPositionClass();t&&this.$element.removeClass(t),this.$element.addClass(this.options.positionClass).css({height:"",width:""}),this.classChanged=!1,this.counter=4,this.usedPositions.length=0}this.$element.trigger("hide.zf.dropdown",[this.$element])}},{key:"toggle",value:function(){if(this.$element.hasClass("is-open")){if(this.$anchor.data("hover"))return;this.close()}else this.open()}},{key:"destroy",value:function(){this.$element.off(".zf.trigger").hide(),this.$anchor.off(".zf.dropdown"),Foundation.unregisterPlugin(this)}}]),e}();e.defaults={hoverDelay:250,hover:!1,hoverPane:!1,vOffset:1,hOffset:1,positionClass:"",trapFocus:!1,autoFocus:!1,closeOnClick:!1},Foundation.plugin(e,"Dropdown")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;ie?o:e}).css("height",e+"px")}},{key:"destroy",value:function(){this.$element.find("."+this.options.linkClass).off(".zf.tabs").hide().end().find("."+this.options.panelClass).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&t(window).off("changed.zf.mediaquery",this._setHeightMqHandler),Foundation.unregisterPlugin(this)}}]),e}();e.defaults={autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,linkClass:"tabs-title",panelClass:"tabs-panel"},Foundation.plugin(e,"Tabs")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i").addClass("reveal-overlay").appendTo("body");return i}},{key:"_updatePosition",value:function(){var e,i,n=this.$element.outerWidth(),o=t(window).width(),s=this.$element.outerHeight(),a=t(window).height();e="auto"===this.options.hOffset?parseInt((o-n)/2,10):parseInt(this.options.hOffset,10),i="auto"===this.options.vOffset?s>a?parseInt(Math.min(100,a/10),10):parseInt((a-s)/4,10):parseInt(this.options.vOffset,10),this.$element.css({top:i+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:e+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var e=this,i=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,o){return n.target===i.$element[0]||t(n.target).parents("[data-closable]")[0]===o?e.close.apply(e):void 0},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){i._updatePosition()}}),this.$anchor.length&&this.$anchor.on("keydown.zf.reveal",function(t){13!==t.which&&32!==t.which||(t.stopPropagation(),t.preventDefault(),i.open())}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.reveal",function(e){e.target===i.$element[0]||t.contains(i.$element[0],e.target)||i.close()}),this.options.deepLink&&t(window).on("popstate.zf.reveal:"+this.id,this._handleState.bind(this))}},{key:"_handleState",value:function(t){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"open",value:function(){var e=this;if(this.options.deepLink){var i="#"+this.id;window.history.pushState?window.history.pushState(null,null,i):window.location.hash=i}if(this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),this.options.animationIn){var n;!function(){var t=function(){n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),console.log("focus")};n=e,e.options.overlay&&Foundation.Motion.animateIn(e.$overlay,"fade-in"),Foundation.Motion.animateIn(e.$element,e.options.animationIn,function(){e.focusableElements=Foundation.Keyboard.findFocusable(e.$element),t()})}()}else this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay);this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),this.$element.trigger("open.zf.reveal"),this.isMobile?(this.originalScrollPos=window.pageYOffset,t("html, body").addClass("is-reveal-open")):t("body").addClass("is-reveal-open"),setTimeout(function(){e._extraHandlers()},0)}},{key:"_extraHandlers",value:function(){var e=this;this.focusableElements=Foundation.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||t("body").on("click.zf.reveal",function(i){i.target===e.$element[0]||t.contains(e.$element[0],i.target)||e.close()}),this.options.closeOnEsc&&t(window).on("keydown.zf.reveal",function(t){Foundation.Keyboard.handleKey(t,"Reveal",{close:function(){e.options.closeOnEsc&&(e.close(),e.$anchor.focus())}})}),this.$element.on("keydown.zf.reveal",function(i){var n=t(this);Foundation.Keyboard.handleKey(i,"Reveal",{tab_forward:function(){return e.$element.find(":focus").is(e.focusableElements.eq(-1))?(e.focusableElements.eq(0).focus(),!0):0===e.focusableElements.length?!0:void 0},tab_backward:function(){return e.$element.find(":focus").is(e.focusableElements.eq(0))||e.$element.is(":focus")?(e.focusableElements.eq(-1).focus(),!0):0===e.focusableElements.length?!0:void 0},open:function(){e.$element.find(":focus").is(e.$element.find("[data-close]"))?setTimeout(function(){e.$anchor.focus()},1):n.is(e.focusableElements)&&e.open()},close:function(){e.options.closeOnEsc&&(e.close(),e.$anchor.focus())},handled:function(t){t&&i.preventDefault()}})})}},{key:"close",value:function(){function e(){i.isMobile?(t("html, body").removeClass("is-reveal-open"),i.originalScrollPos&&(t("body").scrollTop(i.originalScrollPos),i.originalScrollPos=null)):t("body").removeClass("is-reveal-open"),i.$element.attr("aria-hidden",!0),i.$element.trigger("closed.zf.reveal")}if(!this.isActive||!this.$element.is(":visible"))return!1;var i=this;this.options.animationOut?(this.options.overlay?Foundation.Motion.animateOut(this.$overlay,"fade-out",e):e(),Foundation.Motion.animateOut(this.$element,this.options.animationOut)):(this.options.overlay?this.$overlay.hide(0,e):e(),this.$element.hide(this.options.hideDelay)),this.options.closeOnEsc&&t(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&t("body").off("click.zf.reveal"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,i.options.deepLink&&(window.history.replaceState?window.history.replaceState("",document.title,window.location.pathname):window.location.hash="")}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"destroy",value:function(){this.options.overlay&&(this.$element.appendTo(t("body")),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),t(window).off(".zf.reveal:"+this.id),Foundation.unregisterPlugin(this)}}]),e}();o.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,btmOffsetPct:10,overlay:!0,resetOnClose:!1,deepLink:!1},Foundation.plugin(o,"Reveal")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i").addClass(i).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:e});return n}},{key:"_reposition",value:function(t){this.usedPositions.push(t?t:"bottom"),!t&&this.usedPositions.indexOf("top")<0?this.template.addClass("top"):"top"===t&&this.usedPositions.indexOf("bottom")<0?this.template.removeClass(t):"left"===t&&this.usedPositions.indexOf("right")<0?this.template.removeClass(t).addClass("right"):"right"===t&&this.usedPositions.indexOf("left")<0?this.template.removeClass(t).addClass("left"):!t&&this.usedPositions.indexOf("top")>-1&&this.usedPositions.indexOf("left")<0?this.template.addClass("left"):"top"===t&&this.usedPositions.indexOf("bottom")>-1&&this.usedPositions.indexOf("left")<0?this.template.removeClass(t).addClass("left"):"left"===t&&this.usedPositions.indexOf("right")>-1&&this.usedPositions.indexOf("bottom")<0?this.template.removeClass(t):"right"===t&&this.usedPositions.indexOf("left")>-1&&this.usedPositions.indexOf("bottom")<0?this.template.removeClass(t):this.template.removeClass(t),this.classChanged=!0,this.counter--}},{key:"_setPosition",value:function(){var t=this._getPositionClass(this.template),e=Foundation.Box.GetDimensions(this.template),i=Foundation.Box.GetDimensions(this.$element),n="left"===t?"left":"right"===t?"left":"top",o="top"===n?"height":"width";"height"===o?this.options.vOffset:this.options.hOffset;if(e.width>=e.windowDims.width||!this.counter&&!Foundation.Box.ImNotTouchingYou(this.template))return this.template.offset(Foundation.Box.GetOffsets(this.template,this.$element,"center bottom",this.options.vOffset,this.options.hOffset,!0)).css({width:i.windowDims.width-2*this.options.hOffset,height:"auto"}),!1;for(this.template.offset(Foundation.Box.GetOffsets(this.template,this.$element,"center "+(t||"bottom"),this.options.vOffset,this.options.hOffset));!Foundation.Box.ImNotTouchingYou(this.template)&&this.counter;)this._reposition(t),this._setPosition()}},{key:"show",value:function(){if("all"!==this.options.showOn&&!Foundation.MediaQuery.atLeast(this.options.showOn))return!1;var t=this;this.template.css("visibility","hidden").show(),this._setPosition(),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),t.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,function(){}),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,function(){t.isActive=!1,t.isClick=!1,t.classChanged&&(t.template.removeClass(t._getPositionClass(t.template)).addClass(t.options.positionClass),t.usedPositions=[],t.counter=4,t.classChanged=!1)}),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e=(this.template,!1);this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",function(e){t.isActive||(t.timeout=setTimeout(function(){t.show()},t.options.hoverDelay))}).on("mouseleave.zf.tooltip",function(i){clearTimeout(t.timeout),(!e||t.isClick&&!t.options.clickOpen)&&t.hide()}),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",function(e){e.stopImmediatePropagation(),t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())}):this.$element.on("mousedown.zf.tooltip",function(e){e.stopImmediatePropagation(),t.isClick=!0}),this.options.disableForTouch||this.$element.on("tap.zf.tooltip touchend.zf.tooltip",function(e){t.isActive?t.hide():t.show()}),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",function(i){return e=!0,t.isClick?(t.options.clickOpen||(e=!1),!1):void t.show()}).on("focusout.zf.tooltip",function(i){e=!1,t.isClick=!1,t.hide()}).on("resizeme.zf.trigger",function(){t.isActive&&t._setPosition()})}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tootip").removeAttr("aria-describedby").removeAttr("data-yeti-box").removeAttr("data-toggle").removeAttr("data-resize"),this.template.remove(),Foundation.unregisterPlugin(this)}}]),e}();e.defaults={disableForTouch:!1,hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,positionClass:"",vOffset:10,hOffset:12},Foundation.plugin(e,"Tooltip")}(jQuery); \ No newline at end of file diff --git a/www/source/javascripts/vendor/jquery.min.js b/www/source/javascripts/vendor/jquery.min.js new file mode 100644 index 000000000..41978ff76 --- /dev/null +++ b/www/source/javascripts/vendor/jquery.min.js @@ -0,0 +1,8 @@ +/*! + * jQuery JavaScript Library v2.2.2 + * http://jquery.com/ + * Date: 2016-03-17T17:51Z + */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"!==c&&!n.isWindow(a)&&("array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a)}function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return h.call(b,a)>-1!==c})}function F(a,b){for(;(a=a[b])&&1!==a.nodeType;);return a}function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}function J(){d.removeEventListener("DOMContentLoaded",J),a.removeEventListener("load",J),n.ready()}function M(){this.expando=n.expando+M.uid++}function R(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Q,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c||"false"!==c&&("null"===c?null:+c+""===c?+c:P.test(c)?n.parseJSON(c):c)}catch(a){}O.set(a,b,c)}else c=void 0;return c}function W(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return n.css(a,b,"")},i=h(),j=c&&c[3]||(n.cssNumber[b]?"":"px"),k=(n.cssNumber[b]||"px"!==j&&+i)&&T.exec(n.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,n.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}function _(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function aa(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=n.contains(f.ownerDocument,f),g=_(l.appendChild(f),"script"),j&&aa(g),c)for(k=0;f=g[k++];)Z.test(f.type||"")&&c.push(f);return l}function ga(){return!0}function ha(){return!1}function ia(){try{return d.activeElement}catch(a){}}function ja(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ja(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=ha;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}function pa(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function qa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function ra(a){var b=na.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function sa(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(N.hasData(a)&&(f=N.access(a),g=N.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c1&&"string"==typeof q&&!l.checkClone&&ma.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),ua(f,b,c,d)});if(o&&(e=ca(b,a[0].ownerDocument,!1,a,d),g=e.firstChild,1===e.childNodes.length&&(e=g),g||d)){for(h=n.map(_(e,"script"),qa),i=h.length;m")).appendTo(b.documentElement),b=wa[0].contentDocument,b.write(),b.close(),c=ya(a,b),wa.detach()),xa[a]=c),c}function Fa(a,b,c){var d,e,f,g,h=a.style;return c=c||Ca(a),g=c?c.getPropertyValue(b)||c[b]:void 0,""!==g&&void 0!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),c&&!l.pixelMarginRight()&&Ba.test(g)&&Aa.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f),void 0!==g?g+"":g}function Ga(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}function Ma(a){if(a in La)return a;for(var b=a[0].toUpperCase()+a.slice(1),c=Ka.length;c--;)if(a=Ka[c]+b,a in La)return a}function Na(a,b,c){var d=T.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Oa(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;f<4;f+=2)"margin"===c&&(g+=n.css(a,c+U[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+U[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+U[f]+"Width",!0,e))):(g+=n.css(a,"padding"+U[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+U[f]+"Width",!0,e)));return g}function Pa(b,c,e){var f=!0,g="width"===c?b.offsetWidth:b.offsetHeight,h=Ca(b),i="border-box"===n.css(b,"boxSizing",!1,h);if(d.msFullscreenElement&&a.top!==a&&b.getClientRects().length&&(g=Math.round(100*b.getBoundingClientRect()[c])),g<=0||null==g){if(g=Fa(b,c,h),(g<0||null==g)&&(g=b.style[c]),Ba.test(g))return g;f=i&&(l.boxSizingReliable()||g===b.style[c]),g=parseFloat(g)||0}return g+Oa(b,c,e||(i?"border":"content"),f,h)+"px"}function Qa(a,b){for(var c,d,e,f=[],g=0,h=a.length;g=0&&c=0},isPlainObject:function(a){var b;if("object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype||{},"isPrototypeOf"))return!1;for(b in a);return void 0===b||k.call(a,b)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=d.createElement("script"),b.text=a,d.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a))for(c=a.length;dd.cacheLength&&delete b[a.shift()],b[c+" "]=e}var a=[];return b}function ga(a){return a[u]=!0,a}function ha(a){var b=n.createElement("div");try{return!!a(b)}catch(a){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ia(a,b){for(var c=a.split("|"),e=c.length;e--;)d.attrHandle[c[e]]=b}function ja(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)for(;c=c.nextSibling;)if(c===b)return-1;return a?1:-1}function ka(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function la(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function ma(a){return ga(function(b){return b=+b,ga(function(c,d){for(var e,f=a([],c.length,b),g=f.length;g--;)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function na(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}function oa(){}function pa(a){for(var b=0,c=a.length,d="";b1?function(b,c,d){for(var e=a.length;e--;)if(!a[e](b,c,d))return!1;return!0}:a[0]}function sa(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=ta(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function va(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=qa(function(a){return a===b},h,!0),l=qa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ra(m),i>1&&pa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){for(o=0,g||l.ownerDocument===n||(m(l),h=!p);q=a[o++];)if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){for(o=0;q=b[o++];)q(t,u,g,h);if(f){if(r>0)for(;s--;)t[s]||u[s]||(u[s]=F.call(i));u=ta(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ea.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ga(f):f}var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=fa(),z=fa(),A=fa(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;c+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(a){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){for(var c=a.length,d=0;a[c++]=b[d++];);a.length=c-1}}}c=ea.support={},f=ea.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ea.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ha(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ha(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ha(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){for(;c=f[e++];)1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ha(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ha(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ha(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)for(;b=b.parentNode;)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ja(a,b);for(c=a;c=c.parentNode;)g.unshift(c);for(c=b;c=c.parentNode;)h.unshift(c);for(;g[d]===h[d];)d++;return d?ja(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ea.matches=function(a,b){return ea(a,null,null,b)},ea.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(a){}return ea(b,n,null,[a]).length>0},ea.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ea.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ea.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ea.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){for(;b=a[f++];)b===a[f]&&(e=d.push(f));for(;e--;)a.splice(d[e],1)}return k=null,a},e=ea.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else for(;b=a[d++];)c+=e(b);return c},d=ea.selectors={cacheLength:50,createPseudo:ga,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ea.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ea.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ea.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){for(;p;){for(m=b;m=m[p];)if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){for(m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];m=++n&&m&&m[p]||(t=n=0)||o.pop();)if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)for(;(m=++n&&m&&m[p]||(t=n=0)||o.pop())&&((h?m.nodeName.toLowerCase()!==r:1!==m.nodeType)||!++t||(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m!==b)););return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ea.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ga(function(a,c){for(var d,f=e(a,b),g=f.length;g--;)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ga(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ga(function(a,b,c,e){for(var f,g=d(a,null,e,[]),h=a.length;h--;)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ga(function(a){return function(b){return ea(a,b).length>0}}),contains:ga(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ga(function(a){return V.test(a||"")||ea.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:ma(function(){return[0]}),last:ma(function(a,b){return[b-1]}),eq:ma(function(a,b,c){return[c<0?c+b:c]}),even:ma(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:ma(function(a,b,c){for(var d=c<0?c+b:c;++d2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}for(i=W.needsContext.test(a)?0:j.length;i--&&(k=j[i],!d.relative[l=k.type]);)if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&na(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&pa(j),!a)return H.apply(e,f),e;break}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&na(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ha(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ha(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ia("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ha(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ia("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ha(function(a){return null==a.getAttribute("disabled")})||ia(K,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ea}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){for(var d=[],e=void 0!==c;(a=a[b])&&9!==a.nodeType;)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;b1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&f.parentNode&&(this.length=1,this[0]=f),this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?void 0!==c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?h.call(n(a),this[0]):h.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}}),n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||n.uniqueSort(e),D.test(a)&&e.reverse()),this.pushStack(e)}});var G=/\S+/g;n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1)for(c=g.shift();++h-1;)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var i,j,k,b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}};if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);b0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}}),n.ready.promise=function(b){return I||(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(n.ready):(d.addEventListener("DOMContentLoaded",J),a.addEventListener("load",J))),I.promise(b)},n.ready.promise();var K=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)K(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;h-1&&void 0!==c&&O.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){O.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=N.get(a,b),c&&(!d||n.isArray(c)?d=N.access(a,b,n.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return N.get(a,c)||N.access(a,c,{empty:n.Callbacks("once memory").add(function(){N.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length",""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};$.optgroup=$.option,$.tbody=$.tfoot=$.colgroup=$.caption=$.thead,$.th=$.td;var ba=/<|&#?\w+;/;!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var da=/^key/,ea=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,fa=/^([^.]*)(?:\.(.+)|)/;n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.get(a);if(r)for(c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return"undefined"!=typeof n&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(G)||[""],j=b.length;j--;)h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.hasData(a)&&N.get(a);if(r&&(i=r.events)){for(b=(b||"").match(G)||[""],j=b.length;j--;)if(h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){for(l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;f--;)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&N.remove(a,"handle events")}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(N.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){for(h=n.event.handlers.call(this,a,j),b=0;(f=h[b++])&&!a.isPropagationStopped();)for(a.currentTarget=f.elem,c=0;(g=f.handlers[c++])&&!a.isImmediatePropagationStopped();)a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()));return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!==this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;c-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,la=/\s*$/g;n.extend({htmlPrefilter:function(a){return a.replace(ka,"<$1>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=_(h),f=_(a),d=0,e=f.length;d0&&aa(g,!i&&_(a,"script")),h},cleanData:function(a){for(var b,c,d,e=n.event.special,f=0;void 0!==(c=a[f]);f++)if(L(c)){if(b=c[N.expando]){if(b.events)for(d in b.events)e[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);c[N.expando]=void 0}c[O.expando]&&(c[O.expando]=void 0)}}}),n.fn.extend({domManip:ua,detach:function(a){return va(this,a,!0)},remove:function(a){return va(this,a)},text:function(a){return K(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.appendChild(a)}})},prepend:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(_(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return K(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!la.test(a)&&!$[(Y.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;c1)},show:function(){return Qa(this,!0)},hide:function(){return Qa(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){V(this)?n(this).show():n(this).hide()})}}),n.Tween=Ra,Ra.prototype={constructor:Ra,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||n.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=Ra.propHooks[this.prop];return a&&a.get?a.get(this):Ra.propHooks._default.get(this)},run:function(a){var b,c=Ra.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ra.propHooks._default.set(this),this}},Ra.prototype.init.prototype=Ra.prototype,Ra.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[n.cssProps[a.prop]]&&!n.cssHooks[a.prop]?a.elem[a.prop]=a.now:n.style(a.elem,a.prop,a.now+a.unit)}}},Ra.propHooks.scrollTop=Ra.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},n.fx=Ra.prototype.init,n.fx.step={};var Sa,Ta,Ua=/^(?:toggle|show|hide)$/,Va=/queueHooks$/;n.Animation=n.extend(_a,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return W(c.elem,a,T.exec(b),c),c}]},tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.match(G);for(var c,d=0,e=a.length;d1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),e=n.attrHooks[b]||(n.expr.match.bool.test(b)?ab:void 0)),void 0!==c?null===c?void n.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=n.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!l.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(G);if(f&&1===a.nodeType)for(;c=f[e++];)d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)}}),ab={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=bb[b]||n.find.attr;bb[b]=function(a,b,d){var e,f;return d||(f=bb[b],bb[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,bb[b]=f),e}});var cb=/^(?:input|select|textarea|button)$/i,db=/^(?:a|area)$/i;n.fn.extend({prop:function(a,b){return K(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[n.propFix[a]||a]})}}),n.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&n.isXMLDoc(a)||(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=n.find.attr(a,"tabindex");return b?parseInt(b,10):cb.test(a.nodeName)||db.test(a.nodeName)&&a.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),l.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this});var eb=/[\t\r\n\f]/g;n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,fb(this)))});if("string"==typeof a&&a)for(b=a.match(G)||[];c=this[i++];)if(e=fb(c),d=1===c.nodeType&&(" "+e+" ").replace(eb," ")){for(g=0;f=b[g++];)d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=n.trim(d),e!==h&&c.setAttribute("class",h)}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,fb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a)for(b=a.match(G)||[];c=this[i++];)if(e=fb(c),d=1===c.nodeType&&(" "+e+" ").replace(eb," ")){for(g=0;f=b[g++];)for(;d.indexOf(" "+f+" ")>-1;)d=d.replace(" "+f+" "," ");h=n.trim(d),e!==h&&c.setAttribute("class",h)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):n.isFunction(a)?this.each(function(c){n(this).toggleClass(a.call(this,c,fb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c)for(d=0,e=n(this),f=a.match(G)||[];b=f[d++];)e.hasClass(b)?e.removeClass(b):e.addClass(b);else void 0!==a&&"boolean"!==c||(b=fb(this),b&&N.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":N.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;for(b=" "+a+" ";c=this[d++];)if(1===c.nodeType&&(" "+fb(c)+" ").replace(eb," ").indexOf(b)>-1)return!0;return!1}});var gb=/\r/g,hb=/[\x20\t\r\n\f]+/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(gb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a)).replace(hb," ")}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||e<0,g=f?null:[],h=f?e+1:d.length,i=e<0?h:f?e:0;i-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){if(n.isArray(b))return a.checked=n.inArray(n(a).val(),b)>-1}},l.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var ib=/^(?:focusinfocus|focusoutblur)$/;n.extend(n.event,{trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!ib.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),l=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},f||!o.trigger||o.trigger.apply(e,c)!==!1)){if(!f&&!o.noBubble&&!n.isWindow(e)){for(j=o.delegateType||q,ib.test(j+q)||(h=h.parentNode);h;h=h.parentNode)p.push(h),i=h;i===(e.ownerDocument||d)&&p.push(i.defaultView||i.parentWindow||a)}for(g=0;(h=p[g++])&&!b.isPropagationStopped();)b.type=g>1?j:o.bindType||q,m=(N.get(h,"events")||{})[b.type]&&N.get(h,"handle"),m&&m.apply(h,c),m=l&&h[l],m&&m.apply&&L(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=q,f||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!L(e)||l&&n.isFunction(e[q])&&!n.isWindow(e)&&(i=e[l],i&&(e[l]=null),n.event.triggered=q,e[q](),n.event.triggered=void 0,i&&(e[l]=i)),b.result}},simulate:function(a,b,c){var d=n.extend(new n.Event,c,{type:a,isSimulated:!0});n.event.trigger(d,null,b),d.isDefaultPrevented()&&c.preventDefault()}}),n.fn.extend({trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return n.event.trigger(a,b,c,!0)}}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),l.focusin="onfocusin"in a,l.focusin||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a))};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=N.access(d,b);e||d.addEventListener(a,c,!0),N.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=N.access(d,b)-1;e?N.access(d,b,e):(d.removeEventListener(a,c,!0),N.remove(d,b))}}});var jb=a.location,kb=n.now(),lb=/\?/;n.parseJSON=function(a){return JSON.parse(a+"")},n.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(a){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||n.error("Invalid XML: "+b),c};var mb=/#.*$/,nb=/([?&])_=[^&]*/,ob=/^(.*?):[ \t]*([^\r\n]*)$/gm,pb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,qb=/^(?:GET|HEAD)$/,rb=/^\/\//,sb={},tb={},ub="*/".concat("*"),vb=d.createElement("a");vb.href=jb.href,n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:jb.href,type:"GET",isLocal:pb.test(jb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":ub,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?yb(yb(a,n.ajaxSettings),b):yb(n.ajaxSettings,a)},ajaxPrefilter:wb(sb),ajaxTransport:wb(tb),ajax:function(b,c){function y(b,c,d,h){var j,l,t,u,w,y=c;2!==v&&(v=2,i&&a.clearTimeout(i),e=void 0,g=h||"",x.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(u=zb(m,x,d)),u=Ab(m,u,x,j),j?(m.ifModified&&(w=x.getResponseHeader("Last-Modified"),w&&(n.lastModified[f]=w),w=x.getResponseHeader("etag"),w&&(n.etag[f]=w)),204===b||"HEAD"===m.type?y="nocontent":304===b?y="notmodified":(y=u.state,l=u.data,t=u.error,j=!t)):(t=y,!b&&y||(y="error",b<0&&(b=0))),x.status=b,x.statusText=(c||y)+"",j?q.resolveWith(o,[l,y,x]):q.rejectWith(o,[x,y,t]),x.statusCode(s),s=void 0,k&&p.trigger(j?"ajaxSuccess":"ajaxError",[x,m,j?l:t]),r.fireWith(o,[x,y]),k&&(p.trigger("ajaxComplete",[x,m]),--n.active||n.event.trigger("ajaxStop")))}"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m=n.ajaxSetup({},c),o=m.context||m,p=m.context&&(o.nodeType||o.jquery)?n(o):n.event,q=n.Deferred(),r=n.Callbacks("once memory"),s=m.statusCode||{},t={},u={},v=0,w="canceled",x={readyState:0,getResponseHeader:function(a){var b;if(2===v){if(!h)for(h={};b=ob.exec(g);)h[b[1].toLowerCase()]=b[2];b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===v?g:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return v||(a=u[c]=u[c]||a,t[a]=b),this},overrideMimeType:function(a){return v||(m.mimeType=a),this},statusCode:function(a){var b;if(a)if(v<2)for(b in a)s[b]=[s[b],a[b]];else x.always(a[x.status]);return this},abort:function(a){var b=a||w;return e&&e.abort(b),y(0,b),this}};if(q.promise(x).complete=r.add,x.success=x.done,x.error=x.fail,m.url=((b||m.url||jb.href)+"").replace(mb,"").replace(rb,jb.protocol+"//"),m.type=c.method||c.type||m.method||m.type,m.dataTypes=n.trim(m.dataType||"*").toLowerCase().match(G)||[""],null==m.crossDomain){j=d.createElement("a");try{j.href=m.url,j.href=j.href,m.crossDomain=vb.protocol+"//"+vb.host!=j.protocol+"//"+j.host}catch(a){m.crossDomain=!0}}if(m.data&&m.processData&&"string"!=typeof m.data&&(m.data=n.param(m.data,m.traditional)),xb(sb,m,c,x),2===v)return x;k=n.event&&m.global,k&&0===n.active++&&n.event.trigger("ajaxStart"),m.type=m.type.toUpperCase(),m.hasContent=!qb.test(m.type),f=m.url,m.hasContent||(m.data&&(f=m.url+=(lb.test(f)?"&":"?")+m.data,delete m.data),m.cache===!1&&(m.url=nb.test(f)?f.replace(nb,"$1_="+kb++):f+(lb.test(f)?"&":"?")+"_="+kb++)),m.ifModified&&(n.lastModified[f]&&x.setRequestHeader("If-Modified-Since",n.lastModified[f]),n.etag[f]&&x.setRequestHeader("If-None-Match",n.etag[f])),(m.data&&m.hasContent&&m.contentType!==!1||c.contentType)&&x.setRequestHeader("Content-Type",m.contentType),x.setRequestHeader("Accept",m.dataTypes[0]&&m.accepts[m.dataTypes[0]]?m.accepts[m.dataTypes[0]]+("*"!==m.dataTypes[0]?", "+ub+"; q=0.01":""):m.accepts["*"]);for(l in m.headers)x.setRequestHeader(l,m.headers[l]);if(m.beforeSend&&(m.beforeSend.call(o,x,m)===!1||2===v))return x.abort();w="abort";for(l in{success:1,error:1,complete:1})x[l](m[l]);if(e=xb(tb,m,c,x)){if(x.readyState=1,k&&p.trigger("ajaxSend",[x,m]),2===v)return x;m.async&&m.timeout>0&&(i=a.setTimeout(function(){x.abort("timeout")},m.timeout));try{v=1,e.send(t,y)}catch(a){if(!(v<2))throw a;y(-1,a)}}else y(-1,"No Transport");return x},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax(n.extend({url:a,type:b,dataType:e,data:c,success:d},n.isPlainObject(a)&&a))}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,throws:!0})},n.fn.extend({wrapAll:function(a){var b;return n.isFunction(a)?this.each(function(b){n(this).wrapAll(a.call(this,b))}):(this[0]&&(b=n(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){for(var a=this;a.firstElementChild;)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return n.isFunction(a)?this.each(function(b){n(this).wrapInner(a.call(this,b))}):this.each(function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return!n.expr.filters.visible(a)},n.expr.filters.visible=function(a){return a.offsetWidth>0||a.offsetHeight>0||a.getClientRects().length>0};var Bb=/%20/g,Cb=/\[\]$/,Db=/\r?\n/g,Eb=/^(?:submit|button|image|reset|file)$/i,Fb=/^(?:input|select|textarea|keygen)/i;n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Gb(c,a[c],b,e);return d.join("&").replace(Bb,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&Fb.test(this.nodeName)&&!Eb.test(a)&&(this.checked||!X.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(Db,"\r\n")}}):{name:b.name,value:c.replace(Db,"\r\n")}}).get()}}),n.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(a){}};var Hb={0:200,1223:204},Ib=n.ajaxSettings.xhr();l.cors=!!Ib&&"withCredentials"in Ib,l.ajax=Ib=!!Ib,n.ajaxTransport(function(b){var c,d;if(l.cors||Ib&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Hb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(a){if(c)throw a}},abort:function(){c&&c()}}}),n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=n(" + + +
    +

    + font-awesome + font demo +

    + +
    +
    +
    +
    icon-cancel-circled0xe800
    +
    icon-angle-circled-left0xf137
    +
    icon-angle-circled-right0xf138
    +
    +
    + + + \ No newline at end of file diff --git a/www/tutorial/assets/font-awesome/font/font-awesome.eot b/www/tutorial/assets/font-awesome/font/font-awesome.eot new file mode 100755 index 000000000..924bec867 Binary files /dev/null and b/www/tutorial/assets/font-awesome/font/font-awesome.eot differ diff --git a/www/tutorial/assets/font-awesome/font/font-awesome.svg b/www/tutorial/assets/font-awesome/font/font-awesome.svg new file mode 100755 index 000000000..561964485 --- /dev/null +++ b/www/tutorial/assets/font-awesome/font/font-awesome.svg @@ -0,0 +1,16 @@ + + + +Copyright (C) 2016 by original authors @ fontello.com + + + + + + + + + + + + \ No newline at end of file diff --git a/www/tutorial/assets/font-awesome/font/font-awesome.ttf b/www/tutorial/assets/font-awesome/font/font-awesome.ttf new file mode 100755 index 000000000..498bea8db Binary files /dev/null and b/www/tutorial/assets/font-awesome/font/font-awesome.ttf differ diff --git a/www/tutorial/assets/font-awesome/font/font-awesome.woff b/www/tutorial/assets/font-awesome/font/font-awesome.woff new file mode 100755 index 000000000..a0b5d757d Binary files /dev/null and b/www/tutorial/assets/font-awesome/font/font-awesome.woff differ diff --git a/www/tutorial/assets/font-awesome/font/font-awesome.woff2 b/www/tutorial/assets/font-awesome/font/font-awesome.woff2 new file mode 100755 index 000000000..6a4bb6062 Binary files /dev/null and b/www/tutorial/assets/font-awesome/font/font-awesome.woff2 differ diff --git a/www/tutorial/config/webpack.config.js b/www/tutorial/config/webpack.config.js new file mode 100644 index 000000000..d5e19d9aa --- /dev/null +++ b/www/tutorial/config/webpack.config.js @@ -0,0 +1,35 @@ +module.exports = { + entry: "./app/main.ts", + output: { + path: __dirname, + filename: "./dist/inspec_tutorial.js", + }, + + // Enable sourcemaps for debugging webpack's output. + devtool: "source-map", + + resolve: { + // Add '.ts' and '.tsx' as resolvable extensions. + extensions: ["", ".webpack.js", ".web.js", ".ts", ".tsx", ".js"] + }, + + module: { + loaders: [ + // All files with a '.ts' or '.tsx' extension will be handled by 'ts-loader'. + { + test: /\.tsx?$/, loader: "ts-loader" + }, + { + test: /\.css$/, loader: 'style!css' + }, + { + test: /\.js$/, exclude: /(node_modules)/, loader: 'babel' + } + ], + + preLoaders: [ + // All output '.js' files will have any sourcemaps re-processed by 'source-map-loader'. + { test: /\.js$/, loader: "source-map-loader" } + ] + }, +}; diff --git a/www/tutorial/content/commands.yml b/www/tutorial/content/commands.yml new file mode 100644 index 000000000..0b082e43a --- /dev/null +++ b/www/tutorial/content/commands.yml @@ -0,0 +1,10 @@ +commands: + - ls + - cat README.md + - inspec help compliance + - inspec version + - inspec detect --format json + - inspec exec examples/profile --format json + - inspec exec examples/profile --format json | jq + - inspec json examples/profile + - inspec archive examples/profile diff --git a/www/tutorial/content/tutorial.yml b/www/tutorial/content/tutorial.yml new file mode 100644 index 000000000..401e8e43a --- /dev/null +++ b/www/tutorial/content/tutorial.yml @@ -0,0 +1,299 @@ +# Demos +demos: +- demo: 0:intro + title: InSpec Introduction + desc: | + Welcome to the interactive InSpec demo. You will learn how to use the command line and shell and get an introduction to all aspects of the language. + + To navigate this demo, type `next` to move forward and `prev` to move back. + Use `clear` to clear the terminal screen. +- demo: 1:inspec-help + title: InSpec Help + desc: | + InSpec is called via + + + ``` + inspec + ``` + + + Try it out! You will see the help menu. You can also view it with: + + + ``` + inspec help + ``` +- demo: 1:inspec-help-cmd + title: InSpec Help Subcommands + desc: | + This list of subcommands may be intimidating at first. It is easy to get help on any of these commands via `inspec help `. Let's try it out for a few: + + + ``` + inspec help version + ``` + + + ``` + inspec help detect + ``` + + + ``` + inspec help exec + ``` +- demo: 1:inspec-version + title: InSpec Version + desc: | + The easiest subcommand is `inspec version`. It tells you which version of InSpec is running. +- demo: 1:inspec-check + title: InSpec Check + desc: | + The most frequent use of InSpec is to execute profiles. You can find the `examples/profile` in the InSpec repository. Before executing it for the first time, let's verify if it is valid profile + + + ``` + inspec check examples/profile + ``` + + + This command is not only used for syntax testing and linting, but can also provide information on valid profiles including its version and control overview. +- demo: 1:inspec-exec + title: InSpec Exec + desc: | + Let's try testing some profiles! To run the profile and test the local machine, type: + + + ``` + inspec exec examples/profile + ``` + + + The result is shown in the report. +- demo: 1:inspec-exec-ssh + title: InSpec Exec SSH + desc: | + InSpec can also test your remote machines! Let's assume there is node `host.node` registered with SSH configured for user `bob` with a keyfile in the current directory (`bob.rsa`). You can run the same profile against this node via: + + + ``` + inspec exec examples/profile -t ssh://bob@host.node -i bob.rsa + ``` +- demo: 1:inspec-exec-ssh-long + title: InSpec Exec SSH (More Options) + desc: | + The wonderful `-t` option (or `--target`) is a shorthand for specifying all fields separately: + + + ``` + inspec exec examples/profile -b ssh --host host.node --user bob -i bob.rsa + ``` + + + For more options try: + + + ``` + inspec help exec + ``` +- demo: 1:inspec-exec-winrm + title: InSpec Exec WinRm + desc: | + We can also scan Windows machines. Let's assume `windows.node` is configured with WinRM access for user `alice` with a password `pass`. The command will now read: + + + ``` + inspec exec examples/profile -t winrm://alice:pass@windows.node + ``` +- demo: 1:inspec-exec-winrm-ssl + title: InSpec Exec WinRm SSL + desc: | + The previous example is not quite realistic. Most Windows nodes with WinRM are configured to use SSL. Let's assume the user also has a self-signed certificate. It would now read + + + ``` + inspec exec examples/profile -t winrm://alice:pass@windows.node --ssl --self-signed + ``` +- demo: 1:inspec-exec-docker + title: InSpec Exec Docker + desc: | + InSpec also supports scanning containers. Let's try it with Docker and pick a container + + + ``` + inspec exec examples/profile -t docker://abcdef123 + ``` +- demo: 1:inspec-detect + title: InSpec Detect + desc: | + InSpec is able to verify local and remote nodes before running tests. This is a utility command to check connections and get information on the target + + + ``` + inspec detect + ``` + + + ``` + inspec detect -t ssh://bob@host.node -i bob.rsa + ``` +- demo: 2:inspec-shell-c + title: InSpec Shell Introduction + desc: | + Let's explore the InSpec shell. It's an integrated utility to test and debug the InSpec language. Before we start it interactively, let's try the command execution mode. It runs code and resources and prints the result. + + First, we start with the OS detection: + + + ``` + inspec shell -c 'os.params' + ``` + + Another example is to test an existing resource: + + + ``` + inspec shell -c 'sshd_config.Protocol' + ``` +- demo: 2:inspec-shell-c-t + title: InSpec Shell with Remotes + desc: | + These commands also work with remote targets + + + + ``` + inspec shell -c 'sshd_config.Protocol' -t ssh://bob@host.node -i bob.rsa + ``` + + + ``` + inspec shell -c 'os.params' -t docker://abcdef123 + ``` +- demo: 2:inspec-shell + title: Interactive InSpec Shell + desc: | + It's time to see the interactive shell! Type + + + ``` + inspec shell + ``` + + + You can still use `next` and `prev` to move between demos. Look at how the shell prompt looks different between the system shell and the inspec shell. +- demo: 2:inspec-shell-help + title: InSpec Shell Help + desc: | + The greeting of the InSpec shell suggests to run the help command: + + + ``` + help + ``` + + + You will not only see the help menu, but also a quick summary of the machine where this is running. +- demo: 2:inspec-shell-help-resources + title: InSpec Shell Help Resources + desc: | + To get a list of all available resources, you can type: + + + ``` + help resources + ``` +- demo: 2:inspec-shell-help-resource + title: InSpec Shell Help Subcommands + desc: | + To explore any of these resources, you can try: + + + ``` + help file + ``` + + + ``` + help command + ``` + + + ``` + help os + ``` + + + These 3 resources are the core trinity of all executions. All other resources reference them in some way. They lead of system interactions. +- demo: 2:inspec-shell-command + title: InSpec Shell Commands + desc: | + To use any of these resources, you can call it and its arguments. Try these examples: + + + ``` + command('uname -a').stdout + ``` + + + ``` + file('/proc/cpuinfo').owner + ``` + + + ``` + sshd_config.params + ``` +- demo: 2:inspec-shell-describe + title: InSpec Shell - Describe Block + desc: | + `describe` blocks are used to create simple checks. We will create a test that verifies a file's access permissions. + + + ``` + describe file('/root') do + it { should exist } + its('mode') { should cmp '0750'} + end + ``` +- demo: 2:inspec-shell-control + title: Inspec Shell - Full Control + desc: | + Tests can be combined in controls, which offer more context. They are mainly used for policy/compliance testing: + + + ``` + control "id" do + title "Check permissions on /root!" + impact 0.5 + describe file('/root') do + its('mode') { should cmp '0750'} + end + end + ``` +parts: +- part: InSpec commandline + demos: + - 1:inspec-help + - 1:inspec-help-cmd + - 1:inspec-version + - 1:inspec-check + - 1:inspec-exec + - 1:inspec-exec-ssh + - 1:inspec-exec-ssh-long + - 1:inspec-exec-winrm + - 1:inspec-exec-winrm-ssl + - 1:inspec-exec-docker + - 1:inspec-detect +- part: InSpec shell + demos: + - 2:inspec-shell-c + - 2:inspec-shell-c-t + - 2:inspec-shell-help + - 2:inspec-shell-help-resources + - 2:inspec-shell-help-resource + - 2:inspec-shell-command + - 2:inspec-shell-describe + - 2:inspec-shell-control +# - part: Profiles diff --git a/www/tutorial/gulpfile.js b/www/tutorial/gulpfile.js new file mode 100644 index 000000000..44d3c78ad --- /dev/null +++ b/www/tutorial/gulpfile.js @@ -0,0 +1,40 @@ +var gulp = require('gulp'), + debug = require('gulp-debug'), + webpack = require('gulp-webpack'), + coffee = require('gulp-coffee'), + gutil = require('gulp-util'), + gif = require('gulp-if'), + gcopy = require('gulp-copy'), + useref = require('gulp-useref'), + gulpif = require('gulp-if'), + uglify = require('gulp-uglify'), + minifyCss = require('gulp-clean-css'); + +gulp.task('webpack', function() { + return gulp.src('app/main.ts') + .pipe(webpack( require('./config/webpack.config.js') )) + .pipe(gulp.dest('dist/')); +}) + +gulp.task('copy', function(){ + gulp.src([ + '*.png', + 'app/**/*.{css,html,json}', + 'app/responses/**/*', + 'tutorial_files/**', + ]) + .pipe(gcopy('dist/')); + gulp.src( + 'assets/font-awesome/{css,font}/*') + .pipe(gcopy('dist/', { prefix: 2 })); +}) + +gulp.task('build', ['webpack', 'copy'], function(){ + return gulp.src('index.html') + .pipe(useref()) + .pipe(debug({ title: 'Uglify scripts' })) + .pipe(gulpif('*.js', uglify())) + .pipe(debug({ title: 'Squash css' })) + .pipe(gulpif('*.css', minifyCss())) + .pipe(gulp.dest('dist')); +}) diff --git a/www/tutorial/index.html b/www/tutorial/index.html new file mode 100644 index 000000000..df7a0c2da --- /dev/null +++ b/www/tutorial/index.html @@ -0,0 +1,29 @@ + + + InSpec Interactive Tutorial + + + + + + + + + + + + + + + + + + + + + + + +
    Loading...
    + + diff --git a/www/tutorial/inspec-logo-white.png b/www/tutorial/inspec-logo-white.png new file mode 100644 index 000000000..4b914620f Binary files /dev/null and b/www/tutorial/inspec-logo-white.png differ diff --git a/www/tutorial/inspec-logo.png b/www/tutorial/inspec-logo.png new file mode 100644 index 000000000..e1c0876ec Binary files /dev/null and b/www/tutorial/inspec-logo.png differ diff --git a/www/tutorial/package.json b/www/tutorial/package.json new file mode 100644 index 000000000..3150d485b --- /dev/null +++ b/www/tutorial/package.json @@ -0,0 +1,57 @@ +{ + "name": "angular2-quickstart", + "version": "1.0.0", + "scripts": { + "build": "typings install && node --max-old-space-size=4096 ./node_modules/webpack/bin/webpack --config config/webpack.config.js --progress --profile --colors --display-error-details --display-cached", + "start": "typings install && node --max-old-space-size=4096 ./node_modules/webpack-dev-server/bin/webpack-dev-server --config config/webpack.config.js", + "dev": "typings install && node --max-old-space-size=4096 ./node_modules/webpack-dev-server/bin/webpack-dev-server --config config/webpack.config.js --inline --progress --hot --profile --colors --watch --display-error-details --display-cachedwebpack-dev-server" + }, + "license": "ISC", + "dependencies": { + "@angular/common": "2.0.0-rc.5", + "@angular/compiler": "2.0.0-rc.5", + "@angular/core": "2.0.0-rc.5", + "@angular/forms": "0.3.0", + "@angular/http": "2.0.0-rc.5", + "@angular/platform-browser": "2.0.0-rc.5", + "@angular/platform-browser-dynamic": "2.0.0-rc.5", + "@angular/router": "3.0.0-rc.1", + "@angular/router-deprecated": "2.0.0-rc.2", + "@angular/upgrade": "2.0.0-rc.5", + "angular2-in-memory-web-api": "0.0.15", + "bootstrap": "^3.3.6", + "core-js": "^2.4.0", + "reflect-metadata": "^0.1.3", + "rxjs": "5.0.0-beta.6", + "systemjs": "0.19.27", + "webpack": "^1.13.2", + "webpack-dev-server": "^1.15.1", + "xterm": "git://github.com/sourcelair/xterm.js.git#1.1.2", + "zone.js": "^0.6.12" + }, + "devDependencies": { + "babel-core": "^6.16.0", + "babel-loader": "^6.2.5", + "babel-preset-es2015": "^6.16.0", + "concurrently": "^2.0.0", + "css-loader": "^0.25.0", + "gulp": "^3.9.1", + "gulp-clean-css": "^2.0.12", + "gulp-coffee": "^2.3.2", + "gulp-copy": "0.0.2", + "gulp-debug": "^2.1.2", + "gulp-if": "^2.0.1", + "gulp-print": "^2.0.1", + "gulp-uglify": "^2.0.0", + "gulp-useref": "^3.1.2", + "gulp-util": "^3.0.7", + "gulp-webpack": "^1.5.0", + "lite-server": "^2.2.0", + "sass-loader": "^4.0.2", + "source-map-loader": "^0.1.5", + "ts-loader": "^0.8.2", + "typescript": "^1.8.10", + "typings": "^1.0.4", + "uglify-loader": "^1.3.0" + } +} diff --git a/www/tutorial/scripts/build_simulator_runtime.rb b/www/tutorial/scripts/build_simulator_runtime.rb new file mode 100644 index 000000000..907b61ee7 --- /dev/null +++ b/www/tutorial/scripts/build_simulator_runtime.rb @@ -0,0 +1,62 @@ +# encoding: utf-8 +require 'train' +require 'docker-api' +require 'fileutils' +require 'json' + +simulator = 'inspec-simulator' + +backend = Train.create('local') +conn = backend.connection + +def build_inspec(backend) + puts '----> build inspec.gem' + pwd = File.expand_path(File.dirname(__FILE__)) + cmd = backend.run_command("cd #{pwd}/../../../ && rm -f inspec-*.gem && gem build inspec.gemspec") + puts cmd.stdout + # move gem to simulator + FileUtils.mv(Dir.glob(pwd+'/../../../inspec-*.gem')[0], pwd + '/simulator/install/inspec.gem') +end + +def build_inspec_mock(backend) + puts '----> build inspec-mock.gem' + pwd = File.expand_path(File.dirname(__FILE__)) + # build gem + cmd = backend.run_command("cd #{pwd}/inspec-mock && rm -f inspec-mock*.gem && gem build inspec-mock.gemspec") + puts cmd.stdout + # move gem to simulator + FileUtils.mv(Dir.glob(pwd+'/inspec-mock/inspec-mock*.gem')[0], pwd + '/simulator/install/inspec-mock.gem') +end + +def build_simulator(name) + puts '----> build simulator container (this may take a minute)' + simulator_dir = File.expand_path(File.join(File.dirname(__FILE__), 'simulator')) + Docker.options[:read_timeout] = 5 * 60 + image = Docker::Image.build_from_dir(simulator_dir) do |v| + begin + if (log = JSON.parse(v)) && log.key?('stream') + puts log['stream'] + end + rescue JSON::ParserError => _e + puts v + end + end + image.tag('repo' => name, 'tag' => 'latest', force: true) +end + +def copy_examples + puts '----> copy examples' + pwd = File.expand_path(File.dirname(__FILE__)) + FileUtils.cp_r(Dir.glob(pwd+'/../../../examples/profile/*'), pwd + '/simulator/filesystem/examples/profile') +end + +# prepare everything for the simulator +build_inspec(conn) +build_inspec_mock(conn) +copy_examples + +# build simulator container +build_simulator(simulator) + +# close connection +conn.close diff --git a/www/tutorial/scripts/inspec-mock/Gemfile b/www/tutorial/scripts/inspec-mock/Gemfile new file mode 100644 index 000000000..b9c0b724c --- /dev/null +++ b/www/tutorial/scripts/inspec-mock/Gemfile @@ -0,0 +1,3 @@ +# encoding: utf-8 +source 'https://rubygems.org' +gemspec diff --git a/www/tutorial/scripts/inspec-mock/bin/inspec b/www/tutorial/scripts/inspec-mock/bin/inspec new file mode 100755 index 000000000..91dd38536 --- /dev/null +++ b/www/tutorial/scripts/inspec-mock/bin/inspec @@ -0,0 +1,67 @@ +#!/usr/bin/env ruby +# encoding: utf-8 + +# This mocks all InSpec backends. To use it, run +# `bundle install` +# `bundle exec ruby bin/inspec` +# `bundle exec ruby bin/inspec exec path/to/profile -t docker://123456` +# `bundle exec ruby bin/inspec exec path/to/profile -t winrm://user:password@host:22` +# `bundle exec ruby bin/inspec exec path/to/profile -t ssh://user@host:22 -i testkey`\ + +Encoding.default_external = Encoding::UTF_8 +Encoding.default_internal = Encoding::UTF_8 + +# load InSpec +require 'inspec' +require 'inspec/cli' + +# Load Train and monkey-patch the backends +require 'train' +require 'train/transports/local' + +module Train::Transports + class SSH < Local + name 'ssh' + + def connection(_ = nil) + @connection ||= MockConnection.new(@options) + end + + class MockConnection < Connection + def uri + "ssh://#{@options[:user]}@#{@options[:host]}:#{@options[:port]}" + end + end + end + + class WinRM < Local + name 'winrm' + + def connection(_ = nil) + @connection ||= MockConnection.new(@options) + end + + class MockConnection < Connection + def uri + "winrm://#{@options[:user]}@#{@options[:host]}:#{@options[:port]}" + end + end + end + + class Docker < Local + name 'docker' + + def connection(_ = nil) + @connection ||= MockConnection.new(@options) + end + + class MockConnection < Connection + def uri + "docker://#{@options[:host]}" + end + end + end +end + +# Call InSpec CLI +Inspec::InspecCLI.start(ARGV) diff --git a/www/tutorial/scripts/inspec-mock/inspec-mock.gemspec b/www/tutorial/scripts/inspec-mock/inspec-mock.gemspec new file mode 100644 index 000000000..dc29ad62f --- /dev/null +++ b/www/tutorial/scripts/inspec-mock/inspec-mock.gemspec @@ -0,0 +1,18 @@ +# coding: utf-8 +Gem::Specification.new do |spec| + spec.name = 'inspec-mock' + spec.version = '0.1.0' + spec.authors = ['Chef Software, Inc'] + spec.summary = 'Mock for InSpec.' + spec.files = %w{ + inspec-mock.gemspec Gemfile + } + Dir.glob( + '{bin,lib}/**/*', File::FNM_DOTMATCH + ).reject { |f| File.directory?(f) } + + spec.executables = %w{ inspec } + spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) + spec.require_paths = ['lib'] + + spec.add_dependency 'inspec' +end diff --git a/www/tutorial/scripts/run_simulator_recording.rb b/www/tutorial/scripts/run_simulator_recording.rb new file mode 100644 index 000000000..a59517b12 --- /dev/null +++ b/www/tutorial/scripts/run_simulator_recording.rb @@ -0,0 +1,171 @@ +# encoding: utf-8 +require 'train' +require 'yaml' +require 'github/markup' +require 'json' +require 'shellwords' +require 'digest' + +# global config +input_dir = File.expand_path(File.join(File.dirname(__FILE__), '../content')) +output_dir = File.expand_path(File.join(File.dirname(__FILE__), '../app/responses')) +simulator = 'inspec-simulator' + +# Create key given command +def create_key(command) + formatted_command = command.gsub(/\W/, '_') + not_too_long = formatted_command.gsub(/_{2,}/, '_') + # ensure file names do not get to long (for Windows) + if not_too_long.length > 40 + hash = Digest::MD5.hexdigest not_too_long + # hard_cut at 40 chars + not_too_long = not_too_long.slice(0..40) + # find last underscore and change end with hash + not_too_long.gsub!(/_[^_]*$/, '_' + hash) + end + not_too_long + '.txt' +end + +def indent(text) + ' ' + text +end + +# loads all commands from tutorial.yml +def load_tutorial_commands(demos) + # extract commands from instructions + raw_commands = demos.map { |x| x['desc'] }.map { |x| x.scan(/```(.*?)```/m) }.flatten.map(&:strip).map { |x| x.split("\n") } + + # find out if we have a single command or a multiline shell command + tutorial_commands = raw_commands.map { |x| + cmd = x.join("\n") + if cmd.include?('describe') + cmd + else + x + end + }.flatten + + # Pull shell commands out so they can be handled + # This is currently done by checking if the command includes the word inspec :/ + no_shell_tutorial_commands = tutorial_commands.select { |a| a.include?('inspec') && a != 'inspec shell' } + commands = no_shell_tutorial_commands.map {|cmd| + { + 'key' => create_key(cmd), + 'command' => cmd, + 'simulator_cmd' => cmd, + 'extra' => false, + 'shell' => 'sh', + } + } + + # special handling for InSpec shell commands + shell_tutorial_commands = tutorial_commands.reject { |a| a.include?('inspec') } + commands += shell_tutorial_commands.map {|cmd| + # Add 'echo' and ' | inspec shell' to shell commands to enable inspec shell command functionality + simulator_cmd = 'echo ' + Shellwords.escape(cmd) + ' | inspec shell' + { + 'key' => create_key(simulator_cmd), + 'command' => cmd, + 'simulator_cmd' => simulator_cmd, + 'extra' => false, + 'shell' => 'inspec', + } + } + commands +end + +# load all commands from commands.yml +def load_extra_commands(extra_commands) + extra_commands.map {|cmd| + { + 'key' => create_key(cmd), + 'command' => cmd, + 'simulator_cmd' => cmd, + 'extra' => true, + 'shell' => 'sh', + } + } +end + +def generate_webapp_instructions(demos, output_dir) + # Create instructions.json file + instructions_file = File.new(File.join(output_dir, 'instructions.json'), 'w') + tutorial_instructions = demos.map { |x| [x['title'], x['desc']] } + tutorial_instructions.map! { |set| [set[0], GitHub::Markup.render('instructions.markdown', set[1])] } + instructions_file.write(JSON.generate(tutorial_instructions)) + puts indent("Wrote #{instructions_file.path}") +end + +def generate_webapp_commands(commands, output_dir) + # Create commands.json file + commands_file = File.new(File.join(output_dir, 'commands.json'), 'w') + commands_file.write(JSON.generate(commands)) + puts indent("Wrote #{commands_file.path}") +end + +def run_command(command, conn, output_dir) + puts indent("Run `#{command['command']}` on `#{command['shell']}`") + cmd = conn.run_command(command['simulator_cmd']) + cmd.stdout + + # save the result and put it in inspec/www/app/responses with command as filename + result = cmd.stdout + + # filter inspec shell welcome message + welcome = "To find out how to use it, type: help\n\n" + # To find out how to use it, type: help + idx = result.index(welcome) + if command['shell'] == 'inspec' && !idx.nil? + # find welcome message + index = idx + welcome.length + # also remove the command before the welcome message + result = result.slice(index, result.length - index) + end + + key = command['key'] + filename = File.join(output_dir, key.to_s) + out_file = File.new(filename, 'w') + result.lines.each do |line| + line_to_write = "#{line.chomp}\r\n" + out_file.write(line_to_write) + end + out_file.close + puts indent("Wrote #{filename}") +end + +def generate_simulation_files(simulator, commands, output_dir) + require 'docker' + fail "#{simulator} docker image is not available" unless Docker::Image.exist?(simulator) + + # start container and get id + Docker.options[:read_timeout] = 3 * 60 + container = Docker::Container.create('Cmd' => ['/bin/sh'], 'Image' => simulator, 'Tty' => true) + container.start + puts indent("Run simulation on Container #{container.id}") + # Create Train connection + backend = Train.create('docker', { host: container.id }) + conn = backend.connection + + # Loop over sh commands + commands.each do |command| + run_command(command, conn, output_dir) + end + + # close train connection and stop container + conn.close + container.kill +end + +# start workflow +puts '---> Load Content' +# Load tutorial instructions +demos = YAML.load(File.read(File.join(input_dir, 'tutorial.yml')))['demos'] +commands = load_tutorial_commands(demos) + +extra_commands = YAML.load(File.read(File.join(input_dir, 'commands.yml')))['commands'] +commands += load_extra_commands(extra_commands) + +puts '---> Create files for web app' +generate_webapp_instructions(demos, output_dir) +generate_webapp_commands(commands, output_dir) +generate_simulation_files(simulator, commands, output_dir) diff --git a/www/tutorial/scripts/simulator/Dockerfile b/www/tutorial/scripts/simulator/Dockerfile new file mode 100644 index 000000000..bf948cad0 --- /dev/null +++ b/www/tutorial/scripts/simulator/Dockerfile @@ -0,0 +1,13 @@ +FROM ruby:alpine + +# install libraries +RUN apk add --update build-base libxml2-dev libffi-dev + +# copy gems +COPY install /install +RUN cd /install && sh bootstrap.sh + +COPY filesystem /filesystem + +WORKDIR /filesystem +CMD ["/bin/sh"] diff --git a/www/tutorial/scripts/simulator/filesystem/README.md b/www/tutorial/scripts/simulator/filesystem/README.md new file mode 100644 index 000000000..6815cf07e --- /dev/null +++ b/www/tutorial/scripts/simulator/filesystem/README.md @@ -0,0 +1 @@ +Only a few commands are implemented in this terminal. Please follow the demo. diff --git a/www/tutorial/scripts/simulator/filesystem/examples/profile/.gitkeep b/www/tutorial/scripts/simulator/filesystem/examples/profile/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/www/tutorial/scripts/simulator/install/bootstrap.sh b/www/tutorial/scripts/simulator/install/bootstrap.sh new file mode 100755 index 000000000..e5739dcfa --- /dev/null +++ b/www/tutorial/scripts/simulator/install/bootstrap.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +# install latest inspec +gem install inspec.gem +# use force to overwrite the binary +gem install inspec-mock.gem --force + +# prep environment +apk add --update openssh +sed -i '/# Protocol 2/c\Protocol 2' /etc/ssh/ssh_config diff --git a/www/tutorial/styles.css b/www/tutorial/styles.css new file mode 100644 index 000000000..b3fa8484d --- /dev/null +++ b/www/tutorial/styles.css @@ -0,0 +1,12 @@ +/* Master Styles */ + +.inspec-tutorial { + color: white; + background-color: black; + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + z-index: 100; +} diff --git a/www/tutorial/tsconfig.json b/www/tutorial/tsconfig.json new file mode 100644 index 000000000..4ad185663 --- /dev/null +++ b/www/tutorial/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "es5", + "module": "commonjs", + "moduleResolution": "node", + "sourceMap": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "removeComments": false, + "noImplicitAny": false + }, + "types": [ + "core-js" + ], + "exclude": [ + "node_modules", + "typings/main", + "typings/main.d.ts" + ] +} diff --git a/www/tutorial/tutorial_files/inspec-mock/Gemfile b/www/tutorial/tutorial_files/inspec-mock/Gemfile new file mode 100644 index 000000000..b9c0b724c --- /dev/null +++ b/www/tutorial/tutorial_files/inspec-mock/Gemfile @@ -0,0 +1,3 @@ +# encoding: utf-8 +source 'https://rubygems.org' +gemspec diff --git a/www/tutorial/tutorial_files/inspec-mock/bin/inspec b/www/tutorial/tutorial_files/inspec-mock/bin/inspec new file mode 100755 index 000000000..91dd38536 --- /dev/null +++ b/www/tutorial/tutorial_files/inspec-mock/bin/inspec @@ -0,0 +1,67 @@ +#!/usr/bin/env ruby +# encoding: utf-8 + +# This mocks all InSpec backends. To use it, run +# `bundle install` +# `bundle exec ruby bin/inspec` +# `bundle exec ruby bin/inspec exec path/to/profile -t docker://123456` +# `bundle exec ruby bin/inspec exec path/to/profile -t winrm://user:password@host:22` +# `bundle exec ruby bin/inspec exec path/to/profile -t ssh://user@host:22 -i testkey`\ + +Encoding.default_external = Encoding::UTF_8 +Encoding.default_internal = Encoding::UTF_8 + +# load InSpec +require 'inspec' +require 'inspec/cli' + +# Load Train and monkey-patch the backends +require 'train' +require 'train/transports/local' + +module Train::Transports + class SSH < Local + name 'ssh' + + def connection(_ = nil) + @connection ||= MockConnection.new(@options) + end + + class MockConnection < Connection + def uri + "ssh://#{@options[:user]}@#{@options[:host]}:#{@options[:port]}" + end + end + end + + class WinRM < Local + name 'winrm' + + def connection(_ = nil) + @connection ||= MockConnection.new(@options) + end + + class MockConnection < Connection + def uri + "winrm://#{@options[:user]}@#{@options[:host]}:#{@options[:port]}" + end + end + end + + class Docker < Local + name 'docker' + + def connection(_ = nil) + @connection ||= MockConnection.new(@options) + end + + class MockConnection < Connection + def uri + "docker://#{@options[:host]}" + end + end + end +end + +# Call InSpec CLI +Inspec::InspecCLI.start(ARGV) diff --git a/www/tutorial/tutorial_files/inspec-mock/inspec-mock.gemspec b/www/tutorial/tutorial_files/inspec-mock/inspec-mock.gemspec new file mode 100644 index 000000000..dc29ad62f --- /dev/null +++ b/www/tutorial/tutorial_files/inspec-mock/inspec-mock.gemspec @@ -0,0 +1,18 @@ +# coding: utf-8 +Gem::Specification.new do |spec| + spec.name = 'inspec-mock' + spec.version = '0.1.0' + spec.authors = ['Chef Software, Inc'] + spec.summary = 'Mock for InSpec.' + spec.files = %w{ + inspec-mock.gemspec Gemfile + } + Dir.glob( + '{bin,lib}/**/*', File::FNM_DOTMATCH + ).reject { |f| File.directory?(f) } + + spec.executables = %w{ inspec } + spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) + spec.require_paths = ['lib'] + + spec.add_dependency 'inspec' +end diff --git a/www/tutorial/typings.json b/www/tutorial/typings.json new file mode 100644 index 000000000..05624ad2c --- /dev/null +++ b/www/tutorial/typings.json @@ -0,0 +1,7 @@ +{ + "globalDependencies": { + "es6-shim": "registry:dt/es6-shim#0.31.2+20160602141504", + "jasmine": "registry:dt/jasmine#2.2.0+20160621224255", + "zone.js": "registry:dt/zone.js#0.0.0+20160316155526" + } +}