serverspec 0.6.21 → 0.6.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +1 -1
- data/lib/serverspec.rb +2 -0
- data/lib/serverspec/backend/exec.rb +2 -0
- data/lib/serverspec/commands/base.rb +5 -0
- data/lib/serverspec/commands/smartos.rb +8 -0
- data/lib/serverspec/commands/solaris.rb +7 -2
- data/lib/serverspec/commands/solaris11.rb +7 -0
- data/lib/serverspec/helper.rb +1 -0
- data/lib/serverspec/helper/solaris11.rb +9 -0
- data/lib/serverspec/matchers.rb +3 -0
- data/lib/serverspec/matchers/be_listening.rb +9 -0
- data/lib/serverspec/type/port.rb +11 -2
- data/lib/serverspec/version.rb +1 -1
- data/spec/darwin/port_spec.rb +18 -0
- data/spec/debian/port_spec.rb +18 -0
- data/spec/gentoo/port_spec.rb +18 -0
- data/spec/redhat/port_spec.rb +18 -0
- data/spec/solaris/commands_spec.rb +17 -2
- data/spec/solaris/port_spec.rb +18 -0
- data/spec/solaris10/commands_spec.rb +2 -2
- data/spec/solaris11/command_spec.rb +48 -0
- data/spec/solaris11/commands_spec.rb +82 -0
- data/spec/solaris11/cron_spec.rb +21 -0
- data/spec/solaris11/default_gateway_spec.rb +16 -0
- data/spec/solaris11/file_spec.rb +381 -0
- data/spec/solaris11/group_spec.rb +8 -0
- data/spec/solaris11/host_spec.rb +58 -0
- data/spec/solaris11/ipfilter_spec.rb +7 -0
- data/spec/solaris11/ipnat_spec.rb +7 -0
- data/spec/solaris11/package_spec.rb +76 -0
- data/spec/solaris11/port_spec.rb +12 -0
- data/spec/solaris11/routing_table_spec.rb +120 -0
- data/spec/solaris11/service_spec.rb +13 -0
- data/spec/solaris11/svcprop_spec.rb +8 -0
- data/spec/solaris11/user_spec.rb +12 -0
- data/spec/solaris11/zfs_spec.rb +9 -0
- metadata +37 -2
data/Rakefile
CHANGED
@@ -4,7 +4,7 @@ require 'rspec/core/rake_task'
|
|
4
4
|
task :spec => 'spec:all'
|
5
5
|
|
6
6
|
namespace :spec do
|
7
|
-
oses = %w( darwin debian gentoo redhat solaris solaris10 smartos )
|
7
|
+
oses = %w( darwin debian gentoo redhat solaris solaris10 solaris11 smartos )
|
8
8
|
|
9
9
|
task :all => [ oses.map {|os| "spec:#{os}" }, :helpers, :exec, :ssh ].flatten
|
10
10
|
|
data/lib/serverspec.rb
CHANGED
@@ -13,6 +13,7 @@ require 'serverspec/commands/debian'
|
|
13
13
|
require 'serverspec/commands/gentoo'
|
14
14
|
require 'serverspec/commands/solaris'
|
15
15
|
require 'serverspec/commands/solaris10'
|
16
|
+
require 'serverspec/commands/solaris11'
|
16
17
|
require 'serverspec/commands/smartos'
|
17
18
|
require 'serverspec/commands/darwin'
|
18
19
|
require 'serverspec/configuration'
|
@@ -35,6 +36,7 @@ RSpec.configure do |c|
|
|
35
36
|
c.include(Serverspec::Helper::Gentoo, :os => :gentoo)
|
36
37
|
c.include(Serverspec::Helper::Solaris, :os => :solaris)
|
37
38
|
c.include(Serverspec::Helper::Solaris10, :os => :solaris10)
|
39
|
+
c.include(Serverspec::Helper::Solaris11, :os => :solaris11)
|
38
40
|
c.include(Serverspec::Helper::SmartOS, :os => :smartos)
|
39
41
|
c.include(Serverspec::Helper::Darwin, :os => :darwin)
|
40
42
|
c.add_setting :os, :default => nil
|
@@ -200,6 +200,8 @@ module Serverspec
|
|
200
200
|
elsif (os = run_command('uname -sr')[:stdout]) && os =~ /SunOS/i
|
201
201
|
if os =~ /5.10/
|
202
202
|
'Solaris10'
|
203
|
+
elsif run_command('grep -q "Oracle Solaris 11" /etc/release')[:exit_status] == 0
|
204
|
+
'Solaris11'
|
203
205
|
elsif run_command('grep -q SmartOS /etc/release')[:exit_status] == 0
|
204
206
|
'SmartOS'
|
205
207
|
else
|
@@ -77,6 +77,11 @@ module Serverspec
|
|
77
77
|
"netstat -tunl | grep -- #{escape(regexp)}"
|
78
78
|
end
|
79
79
|
|
80
|
+
def check_listening_with_protocol(port, protocol)
|
81
|
+
regexp = "^#{protocol} .*:#{port} "
|
82
|
+
"netstat -tunl | grep -- #{escape(regexp)}"
|
83
|
+
end
|
84
|
+
|
80
85
|
def check_running(service)
|
81
86
|
"service #{escape(service)} status"
|
82
87
|
end
|
@@ -8,6 +8,14 @@ module Serverspec
|
|
8
8
|
end
|
9
9
|
cmd
|
10
10
|
end
|
11
|
+
|
12
|
+
def check_enabled(service, level=3)
|
13
|
+
"svcs -l #{escape(service)} 2> /dev/null | grep -wx '^enabled.*true$'"
|
14
|
+
end
|
15
|
+
|
16
|
+
def check_running(service)
|
17
|
+
"svcs -l #{escape(service)} status 2> /dev/null |grep -wx '^state.*online$'"
|
18
|
+
end
|
11
19
|
end
|
12
20
|
end
|
13
21
|
end
|
@@ -2,7 +2,7 @@ module Serverspec
|
|
2
2
|
module Commands
|
3
3
|
class Solaris < Base
|
4
4
|
def check_enabled(service, level=3)
|
5
|
-
"svcs -l #{escape(service)} 2> /dev/null |
|
5
|
+
"svcs -l #{escape(service)} 2> /dev/null | egrep '^enabled *true$'"
|
6
6
|
end
|
7
7
|
|
8
8
|
def check_installed(package, version=nil)
|
@@ -18,8 +18,13 @@ module Serverspec
|
|
18
18
|
"netstat -an 2> /dev/null | egrep 'LISTEN|Idle' | grep -- #{escape(regexp)}"
|
19
19
|
end
|
20
20
|
|
21
|
+
def check_listening_with_protocol(port, protocol)
|
22
|
+
regexp = ".*\.#{port} "
|
23
|
+
"netstat -an -P #{escape(protocol)} 2> /dev/null | egrep 'LISTEN|Idle' | grep -- #{escape(regexp)}"
|
24
|
+
end
|
25
|
+
|
21
26
|
def check_running(service)
|
22
|
-
"svcs -l #{escape(service)} status 2> /dev/null |
|
27
|
+
"svcs -l #{escape(service)} status 2> /dev/null | egrep '^state *online$'"
|
23
28
|
end
|
24
29
|
|
25
30
|
def check_cron_entry(user, entry)
|
data/lib/serverspec/helper.rb
CHANGED
@@ -11,6 +11,7 @@ require 'serverspec/helper/debian'
|
|
11
11
|
require 'serverspec/helper/gentoo'
|
12
12
|
require 'serverspec/helper/solaris'
|
13
13
|
require 'serverspec/helper/solaris10'
|
14
|
+
require 'serverspec/helper/solaris11'
|
14
15
|
require 'serverspec/helper/smartos'
|
15
16
|
require 'serverspec/helper/darwin'
|
16
17
|
require 'serverspec/helper/detect_os'
|
data/lib/serverspec/matchers.rb
CHANGED
@@ -6,6 +6,9 @@ require 'serverspec/matchers/be_writable'
|
|
6
6
|
require 'serverspec/matchers/be_executable'
|
7
7
|
require 'serverspec/matchers/match_md5checksum'
|
8
8
|
|
9
|
+
# port
|
10
|
+
require 'serverspec/matchers/be_listening'
|
11
|
+
|
9
12
|
# host
|
10
13
|
require 'serverspec/matchers/be_resolvable'
|
11
14
|
require 'serverspec/matchers/be_reachable'
|
data/lib/serverspec/type/port.rb
CHANGED
@@ -1,8 +1,17 @@
|
|
1
1
|
module Serverspec
|
2
2
|
module Type
|
3
3
|
class Port < Base
|
4
|
-
def listening?
|
5
|
-
|
4
|
+
def listening?(protocol)
|
5
|
+
if protocol
|
6
|
+
protocol = protocol.to_s.downcase
|
7
|
+
unless ["udp", "tcp"].include?(protocol)
|
8
|
+
raise ArgumentError.new("`be_listening` matcher doesn't support #{protocol}")
|
9
|
+
end
|
10
|
+
|
11
|
+
backend.check_listening_with_protocol(@name, protocol)
|
12
|
+
else
|
13
|
+
backend.check_listening(@name)
|
14
|
+
end
|
6
15
|
end
|
7
16
|
end
|
8
17
|
end
|
data/lib/serverspec/version.rb
CHANGED
data/spec/darwin/port_spec.rb
CHANGED
@@ -10,3 +10,21 @@ end
|
|
10
10
|
describe port('invalid') do
|
11
11
|
it { should_not be_listening }
|
12
12
|
end
|
13
|
+
|
14
|
+
describe port(80) do
|
15
|
+
it { should be_listening.with("tcp") }
|
16
|
+
its(:command) { should eq 'netstat -tunl | grep -- \\^tcp\\ .\\*:80\\ ' }
|
17
|
+
end
|
18
|
+
|
19
|
+
describe port(123) do
|
20
|
+
it { should be_listening.with("udp") }
|
21
|
+
its(:command) { should eq 'netstat -tunl | grep -- \\^udp\\ .\\*:123\\ ' }
|
22
|
+
end
|
23
|
+
|
24
|
+
describe port(80) do
|
25
|
+
it {
|
26
|
+
expect {
|
27
|
+
should be_listening.with('not implemented')
|
28
|
+
}.to raise_error(ArgumentError, %r/\A`be_listening` matcher doesn\'t support/)
|
29
|
+
}
|
30
|
+
end
|
data/spec/debian/port_spec.rb
CHANGED
@@ -10,3 +10,21 @@ end
|
|
10
10
|
describe port('invalid') do
|
11
11
|
it { should_not be_listening }
|
12
12
|
end
|
13
|
+
|
14
|
+
describe port(80) do
|
15
|
+
it { should be_listening.with("tcp") }
|
16
|
+
its(:command) { should eq 'netstat -tunl | grep -- \\^tcp\\ .\\*:80\\ ' }
|
17
|
+
end
|
18
|
+
|
19
|
+
describe port(123) do
|
20
|
+
it { should be_listening.with("udp") }
|
21
|
+
its(:command) { should eq 'netstat -tunl | grep -- \\^udp\\ .\\*:123\\ ' }
|
22
|
+
end
|
23
|
+
|
24
|
+
describe port(80) do
|
25
|
+
it {
|
26
|
+
expect {
|
27
|
+
should be_listening.with('not implemented')
|
28
|
+
}.to raise_error(ArgumentError, %r/\A`be_listening` matcher doesn\'t support/)
|
29
|
+
}
|
30
|
+
end
|
data/spec/gentoo/port_spec.rb
CHANGED
@@ -10,3 +10,21 @@ end
|
|
10
10
|
describe port('invalid') do
|
11
11
|
it { should_not be_listening }
|
12
12
|
end
|
13
|
+
|
14
|
+
describe port(80) do
|
15
|
+
it { should be_listening.with("tcp") }
|
16
|
+
its(:command) { should eq 'netstat -tunl | grep -- \\^tcp\\ .\\*:80\\ ' }
|
17
|
+
end
|
18
|
+
|
19
|
+
describe port(123) do
|
20
|
+
it { should be_listening.with("udp") }
|
21
|
+
its(:command) { should eq 'netstat -tunl | grep -- \\^udp\\ .\\*:123\\ ' }
|
22
|
+
end
|
23
|
+
|
24
|
+
describe port(80) do
|
25
|
+
it {
|
26
|
+
expect {
|
27
|
+
should be_listening.with('not implemented')
|
28
|
+
}.to raise_error(ArgumentError, %r/\A`be_listening` matcher doesn\'t support/)
|
29
|
+
}
|
30
|
+
end
|
data/spec/redhat/port_spec.rb
CHANGED
@@ -10,3 +10,21 @@ end
|
|
10
10
|
describe port('invalid') do
|
11
11
|
it { should_not be_listening }
|
12
12
|
end
|
13
|
+
|
14
|
+
describe port(80) do
|
15
|
+
it { should be_listening.with("tcp") }
|
16
|
+
its(:command) { should eq 'netstat -tunl | grep -- \\^tcp\\ .\\*:80\\ ' }
|
17
|
+
end
|
18
|
+
|
19
|
+
describe port(123) do
|
20
|
+
it { should be_listening.with("udp") }
|
21
|
+
its(:command) { should eq 'netstat -tunl | grep -- \\^udp\\ .\\*:123\\ ' }
|
22
|
+
end
|
23
|
+
|
24
|
+
describe port(80) do
|
25
|
+
it {
|
26
|
+
expect {
|
27
|
+
should be_listening.with('not implemented')
|
28
|
+
}.to raise_error(ArgumentError, %r/\A`be_listening` matcher doesn\'t support/)
|
29
|
+
}
|
30
|
+
end
|
@@ -21,12 +21,27 @@ end
|
|
21
21
|
|
22
22
|
describe 'check_enabled' do
|
23
23
|
subject { commands.check_enabled('httpd') }
|
24
|
-
it { should eq "svcs -l httpd 2> /dev/null |
|
24
|
+
it { should eq "svcs -l httpd 2> /dev/null | egrep '^enabled *true$'" }
|
25
25
|
end
|
26
26
|
|
27
27
|
describe 'check_running' do
|
28
28
|
subject { commands.check_running('httpd') }
|
29
|
-
it { should eq "svcs -l httpd status 2> /dev/null |
|
29
|
+
it { should eq "svcs -l httpd status 2> /dev/null | egrep '^state *online$'" }
|
30
|
+
end
|
31
|
+
|
32
|
+
describe 'check_listening' do
|
33
|
+
subject { commands.check_listening(80) }
|
34
|
+
it { should eq %q!netstat -an 2> /dev/null | egrep 'LISTEN|Idle' | grep -- .80\\ ! }
|
35
|
+
end
|
36
|
+
|
37
|
+
describe 'check_listening_with_tcp' do
|
38
|
+
subject { commands.check_listening_with_protocol(80, "tcp") }
|
39
|
+
it { should eq %q!netstat -an -P tcp 2> /dev/null | egrep 'LISTEN|Idle' | grep -- .\\*.80\\ ! }
|
40
|
+
end
|
41
|
+
|
42
|
+
describe 'check_listening_with_udp' do
|
43
|
+
subject { commands.check_listening_with_protocol(123, "udp") }
|
44
|
+
it { should eq %q!netstat -an -P udp 2> /dev/null | egrep 'LISTEN|Idle' | grep -- .\\*.123\\ ! }
|
30
45
|
end
|
31
46
|
|
32
47
|
describe 'check_belonging_group' do
|
data/spec/solaris/port_spec.rb
CHANGED
@@ -10,3 +10,21 @@ end
|
|
10
10
|
describe port('invalid') do
|
11
11
|
it { should_not be_listening }
|
12
12
|
end
|
13
|
+
|
14
|
+
describe port(80) do
|
15
|
+
it { should be_listening.with("tcp") }
|
16
|
+
its(:command) { should eq %q!netstat -an -P tcp 2> /dev/null | egrep 'LISTEN|Idle' | grep -- .\\*.80\\ ! }
|
17
|
+
end
|
18
|
+
|
19
|
+
describe port(123) do
|
20
|
+
it { should be_listening.with("udp") }
|
21
|
+
its(:command) { should eq %q!netstat -an -P udp 2> /dev/null | egrep 'LISTEN|Idle' | grep -- .\\*.123\\ ! }
|
22
|
+
end
|
23
|
+
|
24
|
+
describe port(80) do
|
25
|
+
it {
|
26
|
+
expect {
|
27
|
+
should be_listening.with('not implemented')
|
28
|
+
}.to raise_error(ArgumentError, %r/\A`be_listening` matcher doesn\'t support/)
|
29
|
+
}
|
30
|
+
end
|
@@ -20,12 +20,12 @@ end
|
|
20
20
|
|
21
21
|
describe 'check_enabled' do
|
22
22
|
subject { commands.check_enabled('httpd') }
|
23
|
-
it { should eq "svcs -l httpd 2> /dev/null |
|
23
|
+
it { should eq "svcs -l httpd 2> /dev/null | egrep '^enabled *true$'" }
|
24
24
|
end
|
25
25
|
|
26
26
|
describe 'check_running' do
|
27
27
|
subject { commands.check_running('httpd') }
|
28
|
-
it { should eq "svcs -l httpd status 2> /dev/null |
|
28
|
+
it { should eq "svcs -l httpd status 2> /dev/null | egrep '^state *online$'" }
|
29
29
|
end
|
30
30
|
|
31
31
|
describe 'check_belonging_group' do
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
include Serverspec::Helper::Solaris11
|
4
|
+
|
5
|
+
describe command('cat /etc/resolv.conf') do
|
6
|
+
let(:stdout) { "nameserver 127.0.0.1\r\n" }
|
7
|
+
it { should return_stdout("nameserver 127.0.0.1") }
|
8
|
+
its(:command) { should eq 'cat /etc/resolv.conf' }
|
9
|
+
end
|
10
|
+
|
11
|
+
describe 'complete matching of stdout' do
|
12
|
+
context command('cat /etc/resolv.conf') do
|
13
|
+
let(:stdout) { "foocontent-should-be-includedbar\r\n" }
|
14
|
+
it { should_not return_stdout('content-should-be-included') }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe 'regexp matching of stdout' do
|
19
|
+
context command('cat /etc/resolv.conf') do
|
20
|
+
let(:stdout) { "nameserver 127.0.0.1\r\n" }
|
21
|
+
it { should return_stdout(/127\.0\.0\.1/) }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe command('cat /etc/resolv.conf') do
|
26
|
+
let(:stdout) { "No such file or directory\r\n" }
|
27
|
+
it { should return_stderr("No such file or directory") }
|
28
|
+
its(:command) { should eq 'cat /etc/resolv.conf' }
|
29
|
+
end
|
30
|
+
|
31
|
+
describe 'complete matching of stderr' do
|
32
|
+
context command('cat /etc/resolv.conf') do
|
33
|
+
let(:stdout) { "No such file or directory\r\n" }
|
34
|
+
it { should_not return_stdout('file') }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe 'regexp matching of stderr' do
|
39
|
+
context command('cat /etc/resolv.conf') do
|
40
|
+
let(:stdout) { "No such file or directory\r\n" }
|
41
|
+
it { should return_stderr(/file/) }
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe command('cat /etc/resolv.conf') do
|
46
|
+
it { should return_exit_status 0 }
|
47
|
+
its(:command) { should eq 'cat /etc/resolv.conf' }
|
48
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
include Serverspec::Helper::Solaris11
|
4
|
+
|
5
|
+
describe 'Serverspec commands of Solaris11 family' do
|
6
|
+
|
7
|
+
it_behaves_like 'support command check_user', 'root'
|
8
|
+
it_behaves_like 'support command check_user', 'wheel'
|
9
|
+
|
10
|
+
it_behaves_like 'support command check_running_under_supervisor', 'httpd'
|
11
|
+
it_behaves_like 'support command check_monitored_by_monit', 'unicorn'
|
12
|
+
it_behaves_like 'support command check_process', 'httpd'
|
13
|
+
|
14
|
+
it_behaves_like 'support command check_uid', 'root', 0
|
15
|
+
|
16
|
+
it_behaves_like 'support command check_login_shell', 'root', '/bin/bash'
|
17
|
+
it_behaves_like 'support command check_home_directory', 'root', '/root'
|
18
|
+
|
19
|
+
it_behaves_like 'support command check_authorized_key'
|
20
|
+
end
|
21
|
+
|
22
|
+
describe 'check_enabled' do
|
23
|
+
subject { commands.check_enabled('httpd') }
|
24
|
+
it { should eq "svcs -l httpd 2> /dev/null | egrep '^enabled *true$'" }
|
25
|
+
end
|
26
|
+
|
27
|
+
describe 'check_running' do
|
28
|
+
subject { commands.check_running('httpd') }
|
29
|
+
it { should eq "svcs -l httpd status 2> /dev/null | egrep '^state *online$'" }
|
30
|
+
end
|
31
|
+
|
32
|
+
describe 'check_belonging_group' do
|
33
|
+
subject { commands.check_belonging_group('root', 'wheel') }
|
34
|
+
it { should eq "id -Gn root | grep -- wheel" }
|
35
|
+
end
|
36
|
+
|
37
|
+
describe 'check_gid' do
|
38
|
+
subject { commands.check_gid('root', 0) }
|
39
|
+
it { should eq "getent group | grep -- \\^root: | cut -f 3 -d ':' | grep -w -- 0" }
|
40
|
+
end
|
41
|
+
|
42
|
+
describe 'check_zfs' do
|
43
|
+
context 'check without properties' do
|
44
|
+
subject { commands.check_zfs('rpool') }
|
45
|
+
it { should eq "zfs list -H rpool" }
|
46
|
+
end
|
47
|
+
|
48
|
+
context 'check with a property' do
|
49
|
+
subject { commands.check_zfs('rpool', { 'mountpoint' => '/rpool' }) }
|
50
|
+
it { should eq "zfs list -H -o mountpoint rpool | grep -- \\^/rpool\\$" }
|
51
|
+
end
|
52
|
+
|
53
|
+
context 'check with multiple properties' do
|
54
|
+
subject { commands.check_zfs('rpool', { 'mountpoint' => '/rpool', 'compression' => 'off' }) }
|
55
|
+
it { should eq "zfs list -H -o compression rpool | grep -- \\^off\\$ && zfs list -H -o mountpoint rpool | grep -- \\^/rpool\\$" }
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe 'check_ip_filter_rule' do
|
60
|
+
subject { commands.check_ipfilter_rule('pass in quick on lo0 all') }
|
61
|
+
it { should eq "ipfstat -io 2> /dev/null | grep -- pass\\ in\\ quick\\ on\\ lo0\\ all" }
|
62
|
+
end
|
63
|
+
|
64
|
+
describe 'check_ipnat_rule' do
|
65
|
+
subject { commands.check_ipnat_rule('map net1 192.168.0.0/24 -> 0.0.0.0/32') }
|
66
|
+
it { should eq "ipnat -l 2> /dev/null | grep -- \\^map\\ net1\\ 192.168.0.0/24\\ -\\>\\ 0.0.0.0/32\\$" }
|
67
|
+
end
|
68
|
+
|
69
|
+
describe 'check_svcprop' do
|
70
|
+
subject { commands.check_svcprop('svc:/network/http:apache22', 'httpd/enable_64bit','false') }
|
71
|
+
it { should eq "svcprop -p httpd/enable_64bit svc:/network/http:apache22 | grep -- \\^false\\$" }
|
72
|
+
end
|
73
|
+
|
74
|
+
describe 'check_svcprops' do
|
75
|
+
subject {
|
76
|
+
commands.check_svcprops('svc:/network/http:apache22', {
|
77
|
+
'httpd/enable_64bit' => 'false',
|
78
|
+
'httpd/server_type' => 'worker',
|
79
|
+
})
|
80
|
+
}
|
81
|
+
it { should eq "svcprop -p httpd/enable_64bit svc:/network/http:apache22 | grep -- \\^false\\$ && svcprop -p httpd/server_type svc:/network/http:apache22 | grep -- \\^worker\\$" }
|
82
|
+
end
|