2015-09-03 15:33:19 +00:00
|
|
|
|
# encoding: utf-8
|
2015-10-06 16:55:44 +00:00
|
|
|
|
# author: Dominik Richter
|
|
|
|
|
# author: Christoph Hartmann
|
2015-09-04 18:24:38 +00:00
|
|
|
|
require 'simplecov'
|
|
|
|
|
SimpleCov.start do
|
|
|
|
|
add_filter '/test/'
|
|
|
|
|
add_group 'Resources', 'lib/resources'
|
|
|
|
|
add_group 'Matchers', 'lib/matchers'
|
2015-10-26 03:04:18 +00:00
|
|
|
|
add_group 'Backends', 'lib/inspec/backend'
|
2015-09-04 18:24:38 +00:00
|
|
|
|
end
|
|
|
|
|
|
2016-09-08 19:46:39 +00:00
|
|
|
|
require 'minitest/autorun'
|
|
|
|
|
require 'minitest/spec'
|
2017-01-05 19:29:11 +00:00
|
|
|
|
require 'webmock/minitest'
|
2016-09-08 19:46:39 +00:00
|
|
|
|
require 'mocha/setup'
|
2016-02-17 10:17:43 +00:00
|
|
|
|
require 'fileutils'
|
2016-02-18 13:27:16 +00:00
|
|
|
|
require 'pathname'
|
|
|
|
|
require 'tempfile'
|
2016-02-22 12:41:12 +00:00
|
|
|
|
require 'tmpdir'
|
2016-02-17 11:02:28 +00:00
|
|
|
|
require 'zip'
|
2016-02-17 10:17:43 +00:00
|
|
|
|
|
2016-07-16 03:23:26 +00:00
|
|
|
|
require 'inspec/base_cli'
|
2016-03-16 18:47:27 +00:00
|
|
|
|
require 'inspec/version'
|
2017-05-05 13:04:02 +00:00
|
|
|
|
require 'inspec/exceptions'
|
2016-02-21 00:45:55 +00:00
|
|
|
|
require 'inspec/fetcher'
|
2016-02-21 11:39:07 +00:00
|
|
|
|
require 'inspec/source_reader'
|
2015-10-26 03:04:18 +00:00
|
|
|
|
require 'inspec/resource'
|
|
|
|
|
require 'inspec/backend'
|
2015-10-26 21:57:34 +00:00
|
|
|
|
require 'inspec/profile'
|
2016-02-17 10:17:43 +00:00
|
|
|
|
require 'inspec/runner'
|
|
|
|
|
require 'inspec/runner_mock'
|
2016-03-17 22:00:55 +00:00
|
|
|
|
require 'fetchers/mock'
|
|
|
|
|
|
2017-05-26 19:30:37 +00:00
|
|
|
|
require_relative '../lib/bundles/inspec-compliance'
|
2017-02-22 13:36:42 +00:00
|
|
|
|
require_relative '../lib/bundles/inspec-habitat'
|
|
|
|
|
|
2016-03-17 22:00:55 +00:00
|
|
|
|
require 'train'
|
|
|
|
|
CMD = Train.create('local').connection
|
|
|
|
|
TMP_CACHE = {}
|
2015-09-03 15:33:19 +00:00
|
|
|
|
|
2017-06-15 16:10:47 +00:00
|
|
|
|
Inspec::Log.logger = Logger.new(nil)
|
|
|
|
|
|
2015-09-22 16:31:21 +00:00
|
|
|
|
class MockLoader
|
2016-01-29 20:54:48 +00:00
|
|
|
|
# collects emulation operating systems
|
|
|
|
|
OPERATING_SYSTEMS = {
|
2016-08-03 17:18:24 +00:00
|
|
|
|
arch: { name: 'arch', family: 'arch', release: nil, arch: nil },
|
|
|
|
|
centos5: { name: 'centos', family: 'redhat', release: '5.11', arch: 'x86_64' },
|
|
|
|
|
centos6: { name: 'centos', family: 'redhat', release: '6.6', arch: 'x86_64' },
|
|
|
|
|
centos7: { name: 'centos', family: 'redhat', release: '7.1.1503', arch: 'x86_64' },
|
2017-06-15 17:19:58 +00:00
|
|
|
|
coreos: { name: 'coreos', family: 'coreos', release: '1437.0.0', arch: 'x86_64' },
|
2016-08-03 17:18:24 +00:00
|
|
|
|
debian6: { name: 'debian', family: 'debian', release: '6', arch: 'x86_64' },
|
|
|
|
|
debian7: { name: 'debian', family: 'debian', release: '7', arch: 'x86_64' },
|
|
|
|
|
debian8: { name: 'debian', family: 'debian', release: '8', arch: 'x86_64' },
|
|
|
|
|
freebsd9: { name: 'freebsd', family: 'freebsd', release: '9', arch: 'amd64' },
|
|
|
|
|
freebsd10: { name: 'freebsd', family: 'freebsd', release: '10', arch: 'amd64' },
|
|
|
|
|
osx104: { name: 'mac_os_x',family: 'darwin', release: '10.10.4', arch: nil },
|
|
|
|
|
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' },
|
2017-02-03 20:42:55 +00:00
|
|
|
|
ubuntu1604: { name: 'ubuntu', family: 'debian', release: '16.04', arch: 'x86_64' },
|
2016-10-08 21:03:59 +00:00
|
|
|
|
mint17: { name: 'linuxmint', family: 'debian', release: '17.3', arch: 'x86_64' },
|
|
|
|
|
mint18: { name: 'linuxmint', family: 'debian', release: '18', arch: 'x86_64' },
|
2016-08-03 17:18:24 +00:00
|
|
|
|
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'},
|
|
|
|
|
solaris10: { name: "solaris", family: 'solaris', release: '10', arch: 'i386'},
|
|
|
|
|
hpux: { name: 'hpux', family: 'hpux', release: 'B.11.31', arch: 'ia64'},
|
|
|
|
|
undefined: { name: nil, family: nil, release: nil, arch: nil },
|
2016-01-29 20:54:48 +00:00
|
|
|
|
}
|
|
|
|
|
|
2015-09-22 16:31:21 +00:00
|
|
|
|
# pass the os identifier to emulate a specific operating system
|
|
|
|
|
def initialize(os = nil)
|
|
|
|
|
# selects operating system
|
2016-01-29 20:54:48 +00:00
|
|
|
|
@os = OPERATING_SYSTEMS[os || :ubuntu1404]
|
2015-09-22 16:31:21 +00:00
|
|
|
|
end
|
2015-09-06 18:24:25 +00:00
|
|
|
|
|
2015-10-05 21:22:13 +00:00
|
|
|
|
def backend
|
|
|
|
|
return @backend if defined?(@backend)
|
2015-09-22 16:31:21 +00:00
|
|
|
|
scriptpath = ::File.realpath(::File.dirname(__FILE__))
|
2015-09-06 18:24:25 +00:00
|
|
|
|
|
2015-09-22 16:31:21 +00:00
|
|
|
|
# create mock backend
|
2016-10-27 12:33:34 +00:00
|
|
|
|
@backend = Inspec::Backend.create({ backend: :mock, verbose: true })
|
2015-10-14 21:44:15 +00:00
|
|
|
|
mock = @backend.backend
|
|
|
|
|
|
|
|
|
|
# set os emulation
|
|
|
|
|
mock.mock_os(@os)
|
2015-09-03 15:33:19 +00:00
|
|
|
|
|
2015-09-22 16:31:21 +00:00
|
|
|
|
# create all mock files
|
2015-10-14 21:13:49 +00:00
|
|
|
|
local = Train.create('local').connection
|
2015-09-22 16:31:21 +00:00
|
|
|
|
mockfile = lambda { |x|
|
|
|
|
|
path = ::File.join(scriptpath, '/unit/mock/files', x)
|
|
|
|
|
local.file(path)
|
|
|
|
|
}
|
2015-10-09 13:07:58 +00:00
|
|
|
|
mockdir = lambda { |x|
|
|
|
|
|
md = Object.new
|
2015-10-09 17:55:16 +00:00
|
|
|
|
|
|
|
|
|
class << md
|
|
|
|
|
attr_accessor :isdir
|
|
|
|
|
end
|
|
|
|
|
md.isdir = x
|
|
|
|
|
|
2015-10-09 13:07:58 +00:00
|
|
|
|
def md.directory?
|
2015-10-09 17:55:16 +00:00
|
|
|
|
isdir
|
2015-10-09 13:07:58 +00:00
|
|
|
|
end
|
|
|
|
|
md
|
|
|
|
|
}
|
|
|
|
|
|
2015-10-05 21:22:13 +00:00
|
|
|
|
mock.files = {
|
2015-09-22 16:31:21 +00:00
|
|
|
|
'/proc/net/bonding/bond0' => mockfile.call('bond0'),
|
|
|
|
|
'/etc/ssh/ssh_config' => mockfile.call('ssh_config'),
|
|
|
|
|
'/etc/ssh/sshd_config' => mockfile.call('sshd_config'),
|
|
|
|
|
'/etc/passwd' => mockfile.call('passwd'),
|
2016-02-19 11:48:43 +00:00
|
|
|
|
'/etc/shadow' => mockfile.call('shadow'),
|
2015-09-22 16:31:21 +00:00
|
|
|
|
'/etc/ntp.conf' => mockfile.call('ntp.conf'),
|
|
|
|
|
'/etc/login.defs' => mockfile.call('login.defs'),
|
|
|
|
|
'/etc/security/limits.conf' => mockfile.call('limits.conf'),
|
|
|
|
|
'/etc/inetd.conf' => mockfile.call('inetd.conf'),
|
2015-10-06 11:47:34 +00:00
|
|
|
|
'/etc/group' => mockfile.call('etcgroup'),
|
2015-12-22 03:38:49 +00:00
|
|
|
|
'/etc/grub.conf' => mockfile.call('grub.conf'),
|
2015-09-22 16:31:21 +00:00
|
|
|
|
'/etc/audit/auditd.conf' => mockfile.call('auditd.conf'),
|
|
|
|
|
'/etc/mysql/my.cnf' => mockfile.call('mysql.conf'),
|
|
|
|
|
'/etc/mysql/mysql2.conf' => mockfile.call('mysql2.conf'),
|
2017-04-05 14:09:03 +00:00
|
|
|
|
'/etc/rabbitmq/rabbitmq.config' => mockfile.call('rabbitmq.config'),
|
2015-09-22 16:31:21 +00:00
|
|
|
|
'kitchen.yml' => mockfile.call('kitchen.yml'),
|
|
|
|
|
'example.csv' => mockfile.call('example.csv'),
|
|
|
|
|
'policyfile.lock.json' => mockfile.call('policyfile.lock.json'),
|
2016-12-15 13:00:56 +00:00
|
|
|
|
'nonexistent.json' => mockfile.call('nonexistent.json'),
|
2015-10-09 13:07:58 +00:00
|
|
|
|
'/sys/class/net/br0/bridge' => mockdir.call(true),
|
2015-11-24 12:06:31 +00:00
|
|
|
|
'rootwrap.conf' => mockfile.call('rootwrap.conf'),
|
2015-12-04 07:59:44 +00:00
|
|
|
|
'/etc/apache2/apache2.conf' => mockfile.call('apache2.conf'),
|
|
|
|
|
'/etc/apache2/ports.conf' => mockfile.call('ports.conf'),
|
2016-09-03 01:55:28 +00:00
|
|
|
|
'/etc/httpd/conf/httpd.conf' => mockfile.call('httpd.conf'),
|
|
|
|
|
'/etc/httpd/conf.d/ssl.conf' => mockfile.call('ssl.conf'),
|
2016-09-09 17:16:42 +00:00
|
|
|
|
'/etc/httpd/mods-enabled/status.conf' => mockfile.call('status.conf'),
|
2017-02-24 05:13:22 +00:00
|
|
|
|
'/etc/httpd/conf-enabled/security.conf' => mockfile.call('security.conf'),
|
2015-12-04 07:59:44 +00:00
|
|
|
|
'/etc/apache2/conf-enabled/serve-cgi-bin.conf' => mockfile.call('serve-cgi-bin.conf'),
|
2017-02-24 05:13:22 +00:00
|
|
|
|
'/etc/apache2/conf-enabled/security.conf' => mockfile.call('security.conf'),
|
2017-06-26 13:37:41 +00:00
|
|
|
|
'/etc/nginx/failed.conf' => mockfile.call('nginx_failed.conf'),
|
|
|
|
|
'/etc/nginx/nginx.conf' => mockfile.call('nginx.conf'),
|
|
|
|
|
'/etc/nginx/proxy.conf' => mockfile.call('nginx_proxy.conf'),
|
|
|
|
|
'/etc/nginx/conf/mime.types' => mockfile.call('nginx_mime.types'),
|
2016-02-26 12:19:16 +00:00
|
|
|
|
'/etc/xinetd.conf' => mockfile.call('xinetd.conf'),
|
|
|
|
|
'/etc/xinetd.d' => mockfile.call('xinetd.d'),
|
|
|
|
|
'/etc/xinetd.d/chargen-stream' => mockfile.call('xinetd.d_chargen-stream'),
|
|
|
|
|
'/etc/xinetd.d/chargen-dgram' => mockfile.call('xinetd.d_chargen-dgram'),
|
2017-01-31 12:37:43 +00:00
|
|
|
|
'/etc/xinetd.d/echo' => mockfile.call('xinetd.d_echo'),
|
2016-08-05 10:07:14 +00:00
|
|
|
|
'/etc/sysctl.conf' => mockfile.call('sysctl.conf'),
|
2017-01-03 17:51:39 +00:00
|
|
|
|
'/etc/postgresql/9.4/main/postgresql.conf' => mockfile.call('postgresql.conf'),
|
2017-03-15 23:57:31 +00:00
|
|
|
|
# Test certificate/key for x509_certificate using RSA keys in PEM format
|
|
|
|
|
'test_certificate.rsa.crt.pem' => mockfile.call('test_certificate.rsa.crt.pem'),
|
|
|
|
|
'test_certificate.rsa.key.pem' => mockfile.call('test_certificate.rsa.key.pem'),
|
|
|
|
|
'test_ca_public.key.pem' => mockfile.call('test_ca_public.key.pem'),
|
2017-04-04 14:34:09 +00:00
|
|
|
|
# Test DH parameters, 2048 bit long safe prime, generator 2 for dh_params in PEM format
|
|
|
|
|
'dh_params.dh_pem' => mockfile.call('dh_params.dh_pem'),
|
2017-06-15 20:54:12 +00:00
|
|
|
|
'default.toml' => mockfile.call('default.toml'),
|
2017-07-03 18:13:51 +00:00
|
|
|
|
'/test/path/to/postgres/pg_hba.conf' => mockfile.call('pg_hba.conf'),
|
2017-07-03 18:01:40 +00:00
|
|
|
|
'/etc/postgresql/9.5/main/pg_ident.conf' => mockfile.call('pg_ident.conf'),
|
|
|
|
|
'C:/etc/postgresql/9.5/main/pg_ident.conf' => mockfile.call('pg_ident.conf'),
|
|
|
|
|
'/etc/postgresql/9.5/main' => mockfile.call('9.5.main'),
|
|
|
|
|
'/var/lib/postgresql/9.5/main' => mockfile.call('var.9.5.main'),
|
2017-06-28 10:21:15 +00:00
|
|
|
|
'/var/lib/fake_rpmdb' => mockdir.call(true),
|
|
|
|
|
'/var/lib/rpmdb_does_not_exist' => mockdir.call(false),
|
2015-09-22 16:31:21 +00:00
|
|
|
|
}
|
2015-09-03 15:33:19 +00:00
|
|
|
|
|
2015-09-22 16:31:21 +00:00
|
|
|
|
# create all mock commands
|
|
|
|
|
cmd = lambda {|x|
|
|
|
|
|
stdout = ::File.read(::File.join(scriptpath, '/unit/mock/cmd/'+x))
|
2015-10-14 21:44:15 +00:00
|
|
|
|
mock.mock_command('', stdout, '', 0)
|
2015-09-22 16:31:21 +00:00
|
|
|
|
}
|
2015-10-08 10:11:55 +00:00
|
|
|
|
|
|
|
|
|
empty = lambda {
|
2015-10-14 21:44:15 +00:00
|
|
|
|
mock.mock_command('', '', '', 0)
|
2015-10-08 10:11:55 +00:00
|
|
|
|
}
|
|
|
|
|
|
2017-06-28 10:21:15 +00:00
|
|
|
|
cmd_exit_1 = mock.mock_command('', '', '', 1)
|
|
|
|
|
|
2015-10-05 21:22:13 +00:00
|
|
|
|
mock.commands = {
|
2016-10-17 14:23:50 +00:00
|
|
|
|
'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'),
|
2015-12-17 15:08:28 +00:00
|
|
|
|
'Get-Content win_secpol.cfg' => cmd.call('secedit-export'),
|
2015-09-22 16:31:21 +00:00
|
|
|
|
'secedit /export /cfg win_secpol.cfg' => cmd.call('success'),
|
2015-12-17 15:08:28 +00:00
|
|
|
|
'Remove-Item win_secpol.cfg' => cmd.call('success'),
|
2015-11-13 10:53:21 +00:00
|
|
|
|
'env' => cmd.call('env'),
|
2016-05-11 07:42:22 +00:00
|
|
|
|
'${Env:PATH}' => cmd.call('$env-PATH'),
|
2016-09-05 10:12:34 +00:00
|
|
|
|
# registry key test using winrm 2.0
|
2017-04-06 21:31:02 +00:00
|
|
|
|
'bd15a11a4b07de0224c4d1ab16c49ad78dd6147650c6ef629152c7093a5ac95e' => cmd.call('reg_schedule'),
|
2015-09-22 16:31:21 +00:00
|
|
|
|
'Auditpol /get /subcategory:\'User Account Management\' /r' => cmd.call('auditpol'),
|
|
|
|
|
'/sbin/auditctl -l' => cmd.call('auditctl'),
|
2016-01-29 09:03:17 +00:00
|
|
|
|
'/sbin/auditctl -s' => cmd.call('auditctl-s'),
|
2015-09-22 16:31:21 +00:00
|
|
|
|
'yum -v repolist all' => cmd.call('yum-repolist-all'),
|
|
|
|
|
'dpkg -s curl' => cmd.call('dpkg-s-curl'),
|
|
|
|
|
'rpm -qia curl' => cmd.call('rpm-qia-curl'),
|
2017-06-28 10:21:15 +00:00
|
|
|
|
'rpm -qia --dbpath /var/lib/fake_rpmdb curl' => cmd.call('rpm-qia-curl'),
|
|
|
|
|
'rpm -qia --dbpath /var/lib/rpmdb_does_not_exist curl' => cmd_exit_1,
|
2015-09-23 13:49:19 +00:00
|
|
|
|
'pacman -Qi curl' => cmd.call('pacman-qi-curl'),
|
2017-01-02 16:51:43 +00:00
|
|
|
|
'brew info --json=v1 curl' => cmd.call('brew-info--json-v1-curl'),
|
2017-04-04 19:35:40 +00:00
|
|
|
|
'gem list --local -a -q ^not-installed$' => cmd.call('gem-list-local-a-q-not-installed'),
|
2015-09-22 16:31:21 +00:00
|
|
|
|
'gem list --local -a -q ^rubocop$' => cmd.call('gem-list-local-a-q-rubocop'),
|
2017-03-25 05:28:42 +00:00
|
|
|
|
'/opt/ruby-2.3.1/embedded/bin/gem list --local -a -q ^pry$' => cmd.call('gem-list-local-a-q-pry'),
|
|
|
|
|
'/opt/chef/embedded/bin/gem list --local -a -q ^chef-sugar$' => cmd.call('gem-list-local-a-q-chef-sugar'),
|
2017-04-12 15:22:58 +00:00
|
|
|
|
'c:\opscode\chef\embedded\bin\gem.bat list --local -a -q ^json$' => cmd.call('gem-list-local-a-q-json'),
|
2017-03-25 05:28:42 +00:00
|
|
|
|
'/opt/opscode/embedded/bin/gem list --local -a -q ^knife-backup$' => cmd.call('gem-list-local-a-q-knife-backup'),
|
2015-09-22 16:31:21 +00:00
|
|
|
|
'npm ls -g --json bower' => cmd.call('npm-ls-g--json-bower'),
|
|
|
|
|
'pip show jinja2' => cmd.call('pip-show-jinja2'),
|
2015-10-02 09:09:47 +00:00
|
|
|
|
"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'),
|
2016-08-31 15:56:23 +00:00
|
|
|
|
"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'),
|
2015-09-22 16:31:21 +00:00
|
|
|
|
"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'),
|
2015-09-25 09:51:21 +00:00
|
|
|
|
# ports on windows
|
2016-08-12 13:18:43 +00:00
|
|
|
|
'Get-NetTCPConnection -state Listen | Select-Object -Property State, Caption, Description, LocalAddress, LocalPort, RemoteAddress, RemotePort, DisplayName, Status | ConvertTo-Json' => cmd.call('get-net-tcpconnection'),
|
|
|
|
|
'netstat -anbo | Select-String -CaseSensitive -pattern "^\s+UDP|\s+LISTENING\s+\d+$" -context 0,1' => cmd.call('netstat-anbo-pipe-select-string-pattern.utf8'),
|
2016-01-06 19:14:36 +00:00
|
|
|
|
# lsof formatted list of ports (should be quite cross platform)
|
2015-12-23 21:45:41 +00:00
|
|
|
|
'lsof -nP -i -FpctPn' => cmd.call('lsof-nP-i-FpctPn'),
|
2015-09-25 09:51:21 +00:00
|
|
|
|
# ports on linux
|
2015-09-23 13:19:48 +00:00
|
|
|
|
'netstat -tulpen' => cmd.call('netstat-tulpen'),
|
2015-09-25 09:51:21 +00:00
|
|
|
|
# ports on freebsd
|
2015-09-23 13:24:46 +00:00
|
|
|
|
'sockstat -46l' => cmd.call('sockstat'),
|
2015-09-25 09:51:21 +00:00
|
|
|
|
# packages on windows
|
2016-10-27 12:33:34 +00:00
|
|
|
|
'6785190b3df7291a7622b0b75b0217a9a78bd04690bc978df51ae17ec852a282' => cmd.call('get-item-property-package'),
|
2015-09-25 09:51:21 +00:00
|
|
|
|
# service status upstart on ubuntu
|
2015-09-23 20:32:31 +00:00
|
|
|
|
'initctl status ssh' => cmd.call('initctl-status-ssh'),
|
2015-09-25 09:51:21 +00:00
|
|
|
|
# service config for upstart on ubuntu
|
2015-09-23 20:32:31 +00:00
|
|
|
|
'initctl show-config ssh' => cmd.call('initctl-show-config-ssh'),
|
2016-02-05 11:01:33 +00:00
|
|
|
|
# upstart version on ubuntu
|
|
|
|
|
'initctl --version' => cmd.call('initctl--version'),
|
2015-09-25 09:51:21 +00:00
|
|
|
|
# show ssh service Centos 7
|
|
|
|
|
'systemctl show --all sshd' => cmd.call('systemctl-show-all-sshd'),
|
2016-01-21 10:41:48 +00:00
|
|
|
|
'/path/to/systemctl show --all sshd' => cmd.call('systemctl-show-all-sshd'),
|
2016-04-13 19:44:28 +00:00
|
|
|
|
'systemctl show --all dbus' => cmd.call('systemctl-show-all-dbus'),
|
|
|
|
|
'/path/to/systemctl show --all dbus' => cmd.call('systemctl-show-all-dbus'),
|
2015-09-25 10:51:12 +00:00
|
|
|
|
# services on macos
|
|
|
|
|
'launchctl list' => cmd.call('launchctl-list'),
|
2015-09-25 10:53:40 +00:00
|
|
|
|
# services on freebsd 10
|
|
|
|
|
'service -e' => cmd.call('service-e'),
|
|
|
|
|
'service sendmail onestatus' => cmd.call('service-sendmail-onestatus'),
|
2015-09-25 10:58:03 +00:00
|
|
|
|
# services for system 5 e.g. centos6, debian 6
|
|
|
|
|
'service sshd status' => cmd.call('service-sshd-status'),
|
2016-09-01 16:26:23 +00:00
|
|
|
|
'find /etc/rc*.d /etc/init.d/rc*.d -name S*' => cmd.call('find-etc-rc-d-name-S'),
|
2015-09-25 10:58:03 +00:00
|
|
|
|
'ls -1 /etc/init.d/' => cmd.call('ls-1-etc-init.d'),
|
2015-10-05 09:21:25 +00:00
|
|
|
|
# user information for linux
|
|
|
|
|
'id root' => cmd.call('id-root'),
|
|
|
|
|
'getent passwd root' => cmd.call('getent-passwd-root'),
|
2015-10-08 09:44:56 +00:00
|
|
|
|
'chage -l root' => cmd.call('chage-l-root'),
|
2015-11-24 15:18:55 +00:00
|
|
|
|
# user information for ldap test
|
|
|
|
|
'id jfolmer' => cmd.call('id-jfolmer'),
|
|
|
|
|
'getent passwd jfolmer' => cmd.call('getent-passwd-jfolmer'),
|
|
|
|
|
'chage -l jfolmer' => cmd.call('chage-l-root'),
|
2015-10-05 09:21:25 +00:00
|
|
|
|
# user info for mac
|
|
|
|
|
'id chartmann' => cmd.call('id-chartmann'),
|
|
|
|
|
'dscl -q . -read /Users/chartmann NFSHomeDirectory PrimaryGroupID RecordName UniqueID UserShell' => cmd.call('dscl'),
|
|
|
|
|
# user info for freebsd
|
|
|
|
|
'pw usershow root -7' => cmd.call('pw-usershow-root-7'),
|
2016-02-09 10:05:36 +00:00
|
|
|
|
# user info for windows (winrm 1.6.0, 1.6.1)
|
2017-04-20 14:02:21 +00:00
|
|
|
|
'27c6cda89fa5d196506251c0ed0d20468b378c5689711981dc1e1e683c7b02c1' => cmd.call('adsiusers'),
|
2015-10-07 10:04:48 +00:00
|
|
|
|
# group info for windows
|
2016-09-22 21:45:28 +00:00
|
|
|
|
'd8d5b3e3355650399e23857a526ee100b4e49e5c2404a0a5dbb7d85d7f4de5cc' => cmd.call('adsigroups'),
|
2015-10-08 10:11:55 +00:00
|
|
|
|
# network interface
|
2017-05-29 19:04:03 +00:00
|
|
|
|
'fddd70e8b8510f5fcc0413cfdc41598c55d6922bb2a0a4075e2118633a0bf422' => cmd.call('find-net-interface'),
|
2015-10-08 10:11:55 +00:00
|
|
|
|
'c33821dece09c8b334e03a5bb9daefdf622007f73af4932605e758506584ec3f' => empty.call,
|
2015-10-08 11:01:09 +00:00
|
|
|
|
'Get-NetAdapter | Select-Object -Property Name, InterfaceDescription, Status, State, MacAddress, LinkSpeed, ReceiveLinkSpeed, TransmitLinkSpeed, Virtual | ConvertTo-Json' => cmd.call('Get-NetAdapter'),
|
2015-10-09 13:26:59 +00:00
|
|
|
|
# bridge on linux
|
2015-10-09 13:07:58 +00:00
|
|
|
|
'ls -1 /sys/class/net/br0/brif/' => cmd.call('ls-sys-class-net-br'),
|
2015-10-09 13:26:59 +00:00
|
|
|
|
# bridge on Windows
|
|
|
|
|
'Get-NetAdapterBinding -ComponentID ms_bridge | Get-NetAdapter | Select-Object -Property Name, InterfaceDescription | ConvertTo-Json' => cmd.call('get-netadapter-binding-bridge'),
|
2015-10-09 17:21:55 +00:00
|
|
|
|
# host for Windows
|
|
|
|
|
'Resolve-DnsName –Type A microsoft.com | ConvertTo-Json' => cmd.call('Resolve-DnsName'),
|
2017-06-09 16:18:51 +00:00
|
|
|
|
'Test-NetConnection -ComputerName microsoft.com -WarningAction SilentlyContinue| Select-Object -Property ComputerName, TcpTestSucceeded, PingSucceeded | ConvertTo-Json' => cmd.call('Test-NetConnection'),
|
2015-10-09 17:55:06 +00:00
|
|
|
|
# host for Linux
|
2017-07-11 19:32:52 +00:00
|
|
|
|
'getent ahosts example.com' => cmd.call('getent-ahosts-example.com'),
|
2015-10-09 17:55:06 +00:00
|
|
|
|
'ping -w 1 -c 1 example.com' => cmd.call('ping-example.com'),
|
2017-04-13 15:32:04 +00:00
|
|
|
|
# host for Darwin
|
|
|
|
|
'host -t AAAA example.com' => cmd.call('host-AAAA-example.com'),
|
|
|
|
|
'ping -W 1 -c 1 example.com' => cmd.call('ping-example.com'),
|
2015-10-10 17:54:00 +00:00
|
|
|
|
# apt
|
|
|
|
|
"find /etc/apt/ -name *.list -exec sh -c 'cat {} || echo -n' \\;" => cmd.call('etc-apt'),
|
2015-10-12 08:32:14 +00:00
|
|
|
|
# iptables
|
|
|
|
|
'iptables -S' => cmd.call('iptables-s'),
|
2015-12-04 07:59:44 +00:00
|
|
|
|
# apache_conf
|
2017-05-29 19:04:03 +00:00
|
|
|
|
'find /etc/apache2/ports.conf -type f -maxdepth 1' => cmd.call('find-apache2-ports-conf'),
|
|
|
|
|
'find /etc/httpd/conf.d/*.conf -type f -maxdepth 1' => cmd.call('find-httpd-ssl-conf'),
|
|
|
|
|
'find /etc/httpd/mods-enabled/*.conf -type f -maxdepth 1' => cmd.call('find-httpd-status-conf'),
|
|
|
|
|
'find /etc/httpd/conf-enabled/*.conf -type l -maxdepth 1' => cmd.call('find-httpd-conf-enabled-link'),
|
|
|
|
|
'find /etc/apache2/conf-enabled/*.conf -type f -maxdepth 1' => cmd.call('find-apache2-conf-enabled'),
|
|
|
|
|
'find /etc/apache2/conf-enabled/*.conf -type l -maxdepth 1' => cmd.call('find-apache2-conf-enabled-link'),
|
2015-12-31 00:10:06 +00:00
|
|
|
|
# mount
|
|
|
|
|
"mount | grep -- ' on /'" => cmd.call("mount"),
|
2016-01-02 23:01:26 +00:00
|
|
|
|
"mount | grep -- ' on /mnt/iso-disk'" => cmd.call("mount-multiple"),
|
2016-01-28 13:47:46 +00:00
|
|
|
|
# solaris 10 package manager
|
|
|
|
|
'pkginfo -l SUNWzfsr' => cmd.call('pkginfo-l-SUNWzfsr'),
|
|
|
|
|
# solaris 11 package manager
|
|
|
|
|
'pkg info system/file-system/zfs' => cmd.call('pkg-info-system-file-system-zfs'),
|
2017-02-13 13:13:22 +00:00
|
|
|
|
# dpkg-query all packages
|
2017-02-14 13:24:48 +00:00
|
|
|
|
"dpkg-query -W -f='${db:Status-Abbrev} ${Package} ${Version}\\n'" => cmd.call('dpkg-query-W'),
|
2017-02-13 13:13:22 +00:00
|
|
|
|
# rpm query all packages
|
2017-02-14 13:24:48 +00:00
|
|
|
|
"rpm -qa --queryformat '%{NAME} %{VERSION}-%{RELEASE}\\n'" => cmd.call('rpm-qa-queryformat'),
|
2016-01-28 13:47:46 +00:00
|
|
|
|
# port netstat on solaris 10 & 11
|
|
|
|
|
'netstat -an -f inet -f inet6' => cmd.call('s11-netstat-an-finet-finet6'),
|
2016-02-26 12:19:16 +00:00
|
|
|
|
# xinetd configuration
|
|
|
|
|
'find /etc/xinetd.d -type f' => cmd.call('find-xinetd.d'),
|
2016-03-19 17:50:32 +00:00
|
|
|
|
# wmi test
|
2016-09-05 10:12:34 +00:00
|
|
|
|
"2979ebeb80a475107d85411f109209a580ccf569071b3dc7acff030b8635c6b9" => cmd.call('get-wmiobject'),
|
2016-04-21 08:31:56 +00:00
|
|
|
|
#user info on hpux
|
|
|
|
|
"logins -x -l root" => cmd.call('logins-x'),
|
|
|
|
|
#packages on hpux
|
2016-05-03 09:00:59 +00:00
|
|
|
|
"swlist -l product | grep vim" => cmd.call('swlist-l-product'),
|
|
|
|
|
# ipv4 ports on hpux
|
2016-05-03 16:08:39 +00:00
|
|
|
|
'netstat -an -f inet' => cmd.call('hpux-netstat-inet'),
|
2016-05-03 09:00:59 +00:00
|
|
|
|
#ipv6 ports on hpux
|
2016-05-03 16:08:39 +00:00
|
|
|
|
'netstat -an -f inet6' => cmd.call('hpux-netstat-inet6'),
|
2016-09-09 08:30:41 +00:00
|
|
|
|
# hostname linux
|
|
|
|
|
'hostname' => cmd.call('hostname'),
|
|
|
|
|
# hostname windows
|
|
|
|
|
'$env:computername' => cmd.call('$env-computername'),
|
2016-11-18 23:32:52 +00:00
|
|
|
|
# windows_task doesnt exist
|
|
|
|
|
"schtasks /query /v /fo csv /tn 'does-not-exist' | ConvertFrom-Csv | Select @{N='URI';E={$_.TaskName}},@{N='State';E={$_.Status.ToString()}},'Logon Mode','Last Result','Task To Run','Run As User','Scheduled Task State' | ConvertTo-Json -Compress" => cmd.call('schtasks-error'),
|
|
|
|
|
# windows_task exist
|
|
|
|
|
"schtasks /query /v /fo csv /tn 'WeLovePizza' | ConvertFrom-Csv | Select @{N='URI';E={$_.TaskName}},@{N='State';E={$_.Status.ToString()}},'Logon Mode','Last Result','Task To Run','Run As User','Scheduled Task State' | ConvertTo-Json -Compress" => cmd.call('schtasks-success'),
|
2017-02-09 19:28:06 +00:00
|
|
|
|
'modinfo -F version dhcp' => cmd.call('modinfo-f-version-dhcp'),
|
|
|
|
|
# crontab display for root / current user
|
|
|
|
|
'crontab -l' => cmd.call('crontab-root'),
|
|
|
|
|
# crontab display for non-current user
|
2017-02-22 17:29:49 +00:00
|
|
|
|
'crontab -l -u foouser' => cmd.call('crontab-foouser'),
|
2017-05-23 17:02:32 +00:00
|
|
|
|
# crontab display for special time strings
|
|
|
|
|
'crontab -l -u special' => cmd.call('crontab-special'),
|
2017-06-04 20:03:04 +00:00
|
|
|
|
# zfs output for dataset tank/tmp
|
|
|
|
|
'/sbin/zfs get -Hp all tank/tmp' => cmd.call('zfs-get-all-tank-tmp'),
|
|
|
|
|
# zfs output for pool tank
|
|
|
|
|
'/sbin/zpool get -Hp all tank' => cmd.call('zpool-get-all-tank'),
|
2017-04-24 14:47:03 +00:00
|
|
|
|
# docker
|
2017-06-26 19:45:03 +00:00
|
|
|
|
"4f8e24022ea8b7d3b117041ec32e55d9bf08f11f4065c700e7c1dc606c84fd17" => cmd.call('docker-ps-a'),
|
2017-04-24 14:47:03 +00:00
|
|
|
|
"docker version --format '{{ json . }}'" => cmd.call('docker-version'),
|
|
|
|
|
"docker info --format '{{ json . }}'" => cmd.call('docker-info'),
|
|
|
|
|
"docker inspect 71b5df59442b" => cmd.call('docker-inspec'),
|
|
|
|
|
# docker images
|
|
|
|
|
"83c36bfade9375ae1feb91023cd1f7409b786fd992ad4013bf0f2259d33d6406" => cmd.call('docker-images'),
|
2017-07-05 09:41:44 +00:00
|
|
|
|
# modprobe for kernel_module
|
|
|
|
|
"modprobe --showconfig" => cmd.call('modprobe-config'),
|
2017-06-04 20:03:04 +00:00
|
|
|
|
# get-process cmdlet for processes resource
|
2017-06-09 16:18:51 +00:00
|
|
|
|
'$Proc = Get-Process -IncludeUserName | Where-Object {$_.Path -ne $null } | Select-Object PriorityClass,Id,CPU,PM,VirtualMemorySize,NPM,SessionId,Responding,StartTime,TotalProcessorTime,UserName,Path | ConvertTo-Csv -NoTypeInformation;$Proc.Replace("""","").Replace("`r`n","`n")' => cmd.call('get-process_processes'),
|
|
|
|
|
# host resource: check to see if netcat is installed
|
|
|
|
|
%{bash -c 'type "nc"'} => cmd.call('type-nc'),
|
|
|
|
|
'type "nc"' => cmd.call('type-nc'),
|
|
|
|
|
# host resource: netcat for TCP reachability check on linux
|
|
|
|
|
'echo | nc -v -w 1 example.com 1234' => cmd.call('nc-example-com'),
|
|
|
|
|
# host resource: netcat for TCP reachability check on darwin
|
|
|
|
|
'nc -vz -G 1 example.com 1234' => cmd.call('nc-example-com'),
|
|
|
|
|
# host resource: test-netconnection for reachability check on windows
|
|
|
|
|
'Test-NetConnection -ComputerName microsoft.com -WarningAction SilentlyContinue -RemotePort 1234| Select-Object -Property ComputerName, TcpTestSucceeded, PingSucceeded | ConvertTo-Json' => cmd.call('Test-NetConnection'),
|
2017-07-03 18:01:40 +00:00
|
|
|
|
# postgres tests
|
|
|
|
|
%q(bash -c 'type "psql"') => cmd.call('bash -c type psql'),
|
|
|
|
|
%q(psql --version | awk '{ print $NF }' | awk -F. '{ print $1"."$2 }') => cmd.call('psql-version'),
|
2017-06-29 15:01:32 +00:00
|
|
|
|
# mssql tests
|
|
|
|
|
"bash -c 'type \"sqlcmd\"'" => cmd.call('mssql-sqlcmd'),
|
|
|
|
|
"cf33896c4bb500abc23dda5b5eddb03cd35a9c46a7358a2c0a0abe41e08a73ae" => cmd.call('mssql-getdate'),
|
|
|
|
|
"cd283a171cbd65698a2ea6a15524cb4b8566ff1caff430a51091bd5065dcbdf7" => cmd.call('mssql-result'),
|
|
|
|
|
# oracle
|
|
|
|
|
"bash -c 'type \"sqlplus\"'" => cmd.call('oracle-cmd'),
|
|
|
|
|
"ef04e5199abee80e662cc0dd1dd3bf3e0aaae9b4498217d241db00b413820911" => cmd.call('oracle-result'),
|
2017-07-05 14:45:30 +00:00
|
|
|
|
# host resource: dig commands,
|
|
|
|
|
"dig +short A example.com" => cmd.call('dig-A-example.com'),
|
|
|
|
|
"dig +short AAAA example.com" => cmd.call('dig-AAAA-example.com'),
|
2017-06-04 20:03:04 +00:00
|
|
|
|
}
|
2015-10-05 21:22:13 +00:00
|
|
|
|
@backend
|
|
|
|
|
end
|
2015-09-22 16:31:21 +00:00
|
|
|
|
|
2015-10-05 21:22:13 +00:00
|
|
|
|
# loads a resource class and instantiates the class with the given arguments
|
|
|
|
|
def load_resource(resource, *args)
|
2015-09-22 16:31:21 +00:00
|
|
|
|
# initialize resource with backend and parameters
|
2015-10-26 03:04:18 +00:00
|
|
|
|
@resource_class = Inspec::Resource.registry[resource]
|
2015-10-07 21:59:26 +00:00
|
|
|
|
@resource = @resource_class.new(backend, resource, *args)
|
2015-09-22 16:31:21 +00:00
|
|
|
|
end
|
2016-01-29 20:54:48 +00:00
|
|
|
|
|
|
|
|
|
def self.mock_os(resource, name)
|
|
|
|
|
osinfo = OPERATING_SYSTEMS[name] ||
|
|
|
|
|
fail("Can't find operating system to mock: #{name}")
|
|
|
|
|
resource.inspec.backend.mock_os(osinfo)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def self.mock_command(resource, cmd, res = {})
|
|
|
|
|
resource.inspec.backend
|
|
|
|
|
.mock_command(cmd, res[:stdout], res[:stderr], res[:exit_status])
|
|
|
|
|
end
|
2016-02-17 10:17:43 +00:00
|
|
|
|
|
|
|
|
|
def self.home
|
|
|
|
|
File.join(File.dirname(__FILE__), 'unit')
|
|
|
|
|
end
|
|
|
|
|
|
2016-02-21 00:45:55 +00:00
|
|
|
|
def self.profile_path(name)
|
2016-02-17 10:17:43 +00:00
|
|
|
|
dst = name
|
2017-05-16 09:31:47 +00:00
|
|
|
|
dst = "#{home}/mock/profiles/#{name}" unless (Pathname.new name).absolute?
|
2016-02-21 00:45:55 +00:00
|
|
|
|
dst
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def self.load_profile(name, opts = {})
|
|
|
|
|
opts[:test_collector] = Inspec::RunnerMock.new
|
2016-08-31 11:17:44 +00:00
|
|
|
|
opts[:backend] = Inspec::Backend.create(opts)
|
2016-02-21 21:12:02 +00:00
|
|
|
|
Inspec::Profile.for_target(profile_path(name), opts)
|
2016-02-17 10:17:43 +00:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def self.profile_tgz(name)
|
2016-02-18 13:27:16 +00:00
|
|
|
|
path = File.join(home, 'mock', 'profiles', name)
|
2016-02-22 12:41:12 +00:00
|
|
|
|
dst = File.join(Dir.tmpdir, Dir::Tmpname.make_tmpname(name, '.tar.gz'))
|
2016-02-18 13:27:16 +00:00
|
|
|
|
|
|
|
|
|
# generate relative paths
|
|
|
|
|
files = Dir.glob("#{path}/**/*")
|
|
|
|
|
relatives = files.map { |e| Pathname.new(e).relative_path_from(Pathname.new(path)).to_s }
|
|
|
|
|
|
|
|
|
|
require 'inspec/archive/tar'
|
|
|
|
|
tag = Inspec::Archive::TarArchiveGenerator.new
|
|
|
|
|
tag.archive(path, relatives, dst)
|
|
|
|
|
|
2016-02-17 10:17:43 +00:00
|
|
|
|
dst
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def self.profile_zip(name, opts = {})
|
2016-02-18 13:27:16 +00:00
|
|
|
|
path = File.join(home, 'mock', 'profiles', name)
|
2016-02-22 12:41:12 +00:00
|
|
|
|
dst = File.join(Dir.tmpdir, Dir::Tmpname.make_tmpname(name, '.zip'))
|
2016-02-18 13:27:16 +00:00
|
|
|
|
|
|
|
|
|
# rubyzip only works relative paths
|
|
|
|
|
files = Dir.glob("#{path}/**/*")
|
|
|
|
|
relatives = files.map { |e| Pathname.new(e).relative_path_from(Pathname.new(path)).to_s }
|
|
|
|
|
|
|
|
|
|
require 'inspec/archive/zip'
|
|
|
|
|
zag = Inspec::Archive::ZipArchiveGenerator.new
|
|
|
|
|
zag.archive(path, relatives, dst)
|
2016-02-22 12:41:12 +00:00
|
|
|
|
|
2016-02-17 10:17:43 +00:00
|
|
|
|
dst
|
|
|
|
|
end
|
2015-09-22 16:31:21 +00:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def load_resource(*args)
|
|
|
|
|
m = MockLoader.new(:ubuntu1404)
|
|
|
|
|
m.send('load_resource', *args)
|
2015-09-03 15:33:19 +00:00
|
|
|
|
end
|