serverspec 0.0.1 → 0.0.2
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/.gitignore +2 -0
- data/README.md +106 -3
- data/Rakefile +3 -0
- data/lib/serverspec.rb +5 -0
- data/lib/serverspec/commands/base.rb +31 -0
- data/lib/serverspec/commands/debian.rb +13 -0
- data/lib/serverspec/commands/redhat.rb +13 -0
- data/lib/serverspec/helper.rb +12 -1
- data/lib/serverspec/matchers/be_enabled.rb +1 -1
- data/lib/serverspec/matchers/be_file.rb +1 -1
- data/lib/serverspec/matchers/be_installed.rb +1 -1
- data/lib/serverspec/matchers/be_listening.rb +1 -1
- data/lib/serverspec/matchers/be_running.rb +1 -1
- data/lib/serverspec/matchers/contain.rb +1 -1
- data/lib/serverspec/setup.rb +4 -4
- data/lib/serverspec/version.rb +1 -1
- data/spec/debian/matchers_spec.rb +12 -0
- data/spec/redhat/matchers_spec.rb +12 -0
- data/spec/spec_helper.rb +12 -0
- data/spec/support/shared_matcher_examples.rb +72 -0
- metadata +60 -65
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -35,17 +35,17 @@ spec/www.example.jp/httpd_spec.rb is a sample spec file and its content is like
|
|
35
35
|
```ruby
|
36
36
|
require 'spec_helper'
|
37
37
|
|
38
|
-
describe 'httpd' do
|
38
|
+
describe 'httpd', :os => :redhat do
|
39
39
|
it { should be_installed }
|
40
40
|
it { should be_enabled }
|
41
41
|
it { should be_running }
|
42
42
|
end
|
43
43
|
|
44
|
-
describe 'port 80' do
|
44
|
+
describe 'port 80', :os => :redhat do
|
45
45
|
it { should be_listening }
|
46
46
|
end
|
47
47
|
|
48
|
-
describe '/etc/httpd/conf/httpd.conf' do
|
48
|
+
describe '/etc/httpd/conf/httpd.conf', :os => :redhat do
|
49
49
|
it { should be_file }
|
50
50
|
it { should contain "ServerName www.example.jp" }
|
51
51
|
end
|
@@ -61,6 +61,109 @@ Host *.example.jp
|
|
61
61
|
IdentityFile ~/.ssh/id_rsa
|
62
62
|
```
|
63
63
|
|
64
|
+
Run tests.
|
65
|
+
|
66
|
+
```
|
67
|
+
$ rake spec
|
68
|
+
```
|
69
|
+
----
|
70
|
+
## Multi OS support
|
71
|
+
|
72
|
+
Serverspec is supporting Red Hat (and its clone) and Debian (and its clone) now.
|
73
|
+
|
74
|
+
If your target host's OS is Debian, you can write the spec like this.
|
75
|
+
|
76
|
+
```ruby
|
77
|
+
require 'spec_helper'
|
78
|
+
|
79
|
+
describe 'httpd', :os => :debian do
|
80
|
+
it { should be_installed }
|
81
|
+
it { should be_enabled }
|
82
|
+
it { should be_running }
|
83
|
+
end
|
84
|
+
|
85
|
+
describe 'port 80', :os => :debian do
|
86
|
+
it { should be_listening }
|
87
|
+
end
|
88
|
+
|
89
|
+
describe '/etc/httpd/conf/httpd.conf', :os => :debian do
|
90
|
+
it { should be_file }
|
91
|
+
it { should contain "ServerName www.example.jp" }
|
92
|
+
end
|
93
|
+
```
|
94
|
+
|
95
|
+
Or like this.
|
96
|
+
|
97
|
+
```ruby
|
98
|
+
require 'spec_helper'
|
99
|
+
|
100
|
+
describe 'www.example.jp', :os => :debian do
|
101
|
+
it do
|
102
|
+
'httpd'.should be_installed
|
103
|
+
end
|
104
|
+
|
105
|
+
it do
|
106
|
+
'httpd'.should be_enabled
|
107
|
+
end
|
108
|
+
|
109
|
+
it do
|
110
|
+
'httpd'.should be_running
|
111
|
+
end
|
112
|
+
|
113
|
+
it do
|
114
|
+
'port 80'.should be_listening
|
115
|
+
end
|
116
|
+
|
117
|
+
conf = '/etc/httpd/conf/httpd.conf'
|
118
|
+
|
119
|
+
it do
|
120
|
+
conf.should be_file
|
121
|
+
end
|
122
|
+
|
123
|
+
it do
|
124
|
+
conf.should contain "ServerName www.example.jp"
|
125
|
+
end
|
126
|
+
end
|
127
|
+
```
|
128
|
+
|
129
|
+
Or modify generated spec/spec_helper.rb like this
|
130
|
+
|
131
|
+
```
|
132
|
+
require 'serverspec'
|
133
|
+
require 'pathname'
|
134
|
+
|
135
|
+
RSpec.configure do |c|
|
136
|
+
c.include(Serverspec::DebianHelper)
|
137
|
+
c.before do
|
138
|
+
c.host = File.basename(Pathname.new(example.metadata[:location]).dirname)
|
139
|
+
end
|
140
|
+
end
|
141
|
+
```
|
142
|
+
|
143
|
+
And write the spec like this.
|
144
|
+
|
145
|
+
```ruby
|
146
|
+
require 'spec_helper'
|
147
|
+
|
148
|
+
describe 'httpd' do
|
149
|
+
it { should be_installed }
|
150
|
+
it { should be_enabled }
|
151
|
+
it { should be_running }
|
152
|
+
end
|
153
|
+
|
154
|
+
describe 'port 80' do
|
155
|
+
it { should be_listening }
|
156
|
+
end
|
157
|
+
|
158
|
+
describe '/etc/httpd/conf/httpd.conf' do
|
159
|
+
it { should be_file }
|
160
|
+
it { should contain "ServerName www.example.jp" }
|
161
|
+
end
|
162
|
+
```
|
163
|
+
|
164
|
+
Choose any style you like.
|
165
|
+
|
166
|
+
|
64
167
|
----
|
65
168
|
|
66
169
|
## Contributing
|
data/Rakefile
CHANGED
data/lib/serverspec.rb
CHANGED
@@ -4,8 +4,13 @@ require 'serverspec/version'
|
|
4
4
|
require 'serverspec/matchers'
|
5
5
|
require 'serverspec/helper'
|
6
6
|
require 'serverspec/setup'
|
7
|
+
require 'serverspec/commands/base'
|
8
|
+
require 'serverspec/commands/redhat'
|
9
|
+
require 'serverspec/commands/debian'
|
7
10
|
|
8
11
|
RSpec.configure do |c|
|
9
12
|
c.include(Serverspec::Helper)
|
13
|
+
c.include(Serverspec::RedHatHelper, :os => :redhat)
|
14
|
+
c.include(Serverspec::DebianHelper, :os => :debian)
|
10
15
|
c.add_setting :host, :default => nil
|
11
16
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Serverspec
|
2
|
+
module Commands
|
3
|
+
class Base
|
4
|
+
class NotImplementedError < Exception; end
|
5
|
+
|
6
|
+
def check_enabled service
|
7
|
+
raise NotImplementedError.new
|
8
|
+
end
|
9
|
+
|
10
|
+
def check_file file
|
11
|
+
"test -f #{file} 2> /dev/null"
|
12
|
+
end
|
13
|
+
|
14
|
+
def check_installed package
|
15
|
+
raise NotImplementedError.new
|
16
|
+
end
|
17
|
+
|
18
|
+
def check_listening port
|
19
|
+
"netstat -tnl 2> /dev/null | grep ':#{port} '"
|
20
|
+
end
|
21
|
+
|
22
|
+
def check_running service
|
23
|
+
"service #{service} status 2> /dev/null"
|
24
|
+
end
|
25
|
+
|
26
|
+
def check_file_contain file, expected_pattern
|
27
|
+
"\"grep -q '#{expected_pattern}' #{file} \" 2> /dev/null"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/serverspec/helper.rb
CHANGED
@@ -4,5 +4,16 @@ module Serverspec
|
|
4
4
|
`ssh root@#{host} -o'StrictHostKeyChecking no' -o'UserKnownHostsFile /dev/null' #{cmd}`
|
5
5
|
end
|
6
6
|
end
|
7
|
-
end
|
8
7
|
|
8
|
+
module RedHatHelper
|
9
|
+
def commands
|
10
|
+
Serverspec::Commands::RedHat.new
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
module DebianHelper
|
15
|
+
def commands
|
16
|
+
Serverspec::Commands::Debian.new
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
RSpec::Matchers.define :be_listening do
|
2
2
|
match do |actual|
|
3
3
|
port = actual.gsub(/port\s+/, '')
|
4
|
-
ssh_exec(RSpec.configuration.host,
|
4
|
+
ssh_exec(RSpec.configuration.host, commands.check_listening(port))
|
5
5
|
$? == 0
|
6
6
|
end
|
7
7
|
end
|
data/lib/serverspec/setup.rb
CHANGED
@@ -4,26 +4,26 @@ module Serverspec
|
|
4
4
|
class Setup
|
5
5
|
def self.run
|
6
6
|
%w( spec spec/www.example.jp ).each { |dir| safe_mkdir(dir) }
|
7
|
+
safe_create_spec
|
7
8
|
safe_create_spec_helper
|
8
9
|
safe_create_rakefile
|
9
|
-
safe_create_spec
|
10
10
|
end
|
11
11
|
|
12
12
|
def self.safe_create_spec
|
13
13
|
content = <<-EOF
|
14
14
|
require 'spec_helper'
|
15
15
|
|
16
|
-
describe 'httpd' do
|
16
|
+
describe 'httpd', :os => :redhat do
|
17
17
|
it { should be_installed }
|
18
18
|
it { should be_enabled }
|
19
19
|
it { should be_running }
|
20
20
|
end
|
21
21
|
|
22
|
-
describe 'port 80' do
|
22
|
+
describe 'port 80', :os => :redhat do
|
23
23
|
it { should be_listening }
|
24
24
|
end
|
25
25
|
|
26
|
-
describe '/etc/httpd/conf/httpd.conf' do
|
26
|
+
describe '/etc/httpd/conf/httpd.conf', :os => :redhat do
|
27
27
|
it { should be_file }
|
28
28
|
it { should contain "ServerName www.example.jp" }
|
29
29
|
end
|
data/lib/serverspec/version.rb
CHANGED
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Serverspec matchers of Debian family', :os => :debian do
|
4
|
+
let(:test_server_host) { 'serverspec-debian-host' }
|
5
|
+
|
6
|
+
it_behaves_like 'support be_enabled matcher', 'rc.local'
|
7
|
+
it_behaves_like 'support be_installed matcher', 'openssh-server'
|
8
|
+
it_behaves_like 'support be_running matcher', 'ssh'
|
9
|
+
it_behaves_like 'support be_listening matcher', 22
|
10
|
+
it_behaves_like 'support be_file matcher', '/etc/ssh/sshd_config'
|
11
|
+
it_behaves_like 'support contain matcher', '/etc/ssh/sshd_config', 'See the sshd_config(5) manpage'
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Serverspec matchers of Red Hat family', :os => :redhat do
|
4
|
+
let(:test_server_host) { 'serverspec-redhat-host' }
|
5
|
+
|
6
|
+
it_behaves_like 'support be_enabled matcher', 'sshd'
|
7
|
+
it_behaves_like 'support be_installed matcher', 'openssh'
|
8
|
+
it_behaves_like 'support be_running matcher', 'sshd'
|
9
|
+
it_behaves_like 'support be_listening matcher', 22
|
10
|
+
it_behaves_like 'support be_file matcher', '/etc/ssh/sshd_config'
|
11
|
+
it_behaves_like 'support contain matcher', '/etc/ssh/sshd_config', 'This is the sshd server system-wide configuration file'
|
12
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'serverspec'
|
2
|
+
require 'pathname'
|
3
|
+
|
4
|
+
PROJECT_ROOT = (Pathname.new(File.dirname(__FILE__)) + '..').expand_path
|
5
|
+
|
6
|
+
Dir[PROJECT_ROOT.join("spec/support/**/*.rb")].each { |file| require(file) }
|
7
|
+
|
8
|
+
RSpec.configure do |c|
|
9
|
+
c.before do
|
10
|
+
c.host = test_server_host
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
|
2
|
+
shared_examples_for 'support be_enabled matcher' do |valid_service|
|
3
|
+
describe 'be_enabled' do
|
4
|
+
describe valid_service do
|
5
|
+
it { should be_enabled }
|
6
|
+
end
|
7
|
+
|
8
|
+
describe 'this-is-dummy-service' do
|
9
|
+
it { should_not be_enabled }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
shared_examples_for 'support be_installed matcher' do |valid_package|
|
15
|
+
describe 'be_installed' do
|
16
|
+
describe valid_package do
|
17
|
+
it { should be_installed }
|
18
|
+
end
|
19
|
+
|
20
|
+
describe 'this-is-dummy-package' do
|
21
|
+
it { should_not be_installed }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
shared_examples_for 'support be_running matcher' do |valid_service|
|
27
|
+
describe 'be_running' do
|
28
|
+
describe valid_service do
|
29
|
+
it { should be_running }
|
30
|
+
end
|
31
|
+
|
32
|
+
describe 'this-is-dummy-daemon' do
|
33
|
+
it { should_not be_running }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
shared_examples_for 'support be_listening matcher' do |valid_port|
|
39
|
+
describe 'be_listening' do
|
40
|
+
describe "port #{ valid_port }" do
|
41
|
+
it { should be_listening }
|
42
|
+
end
|
43
|
+
|
44
|
+
describe 'port 9999' do
|
45
|
+
it { should_not be_listening }
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
shared_examples_for 'support be_file matcher' do |valid_file|
|
51
|
+
describe 'be_file' do
|
52
|
+
describe valid_file do
|
53
|
+
it { should be_file }
|
54
|
+
end
|
55
|
+
|
56
|
+
describe '/etc/thid_is_dummy_file' do
|
57
|
+
it { should_not be_file }
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
shared_examples_for 'support contain matcher' do |valid_file, pattern|
|
63
|
+
describe 'contain' do
|
64
|
+
describe valid_file do
|
65
|
+
it { should contain pattern }
|
66
|
+
end
|
67
|
+
|
68
|
+
describe '/etc/ssh/sshd_config' do
|
69
|
+
it { should_not contain 'This is duymmy text!!' }
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
metadata
CHANGED
@@ -1,62 +1,56 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: serverspec
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
- 1
|
10
|
-
version: 0.0.1
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
prerelease:
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Gosuke Miyashita
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
dependencies:
|
21
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2013-03-24 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
22
15
|
name: bundler
|
23
|
-
|
24
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
25
17
|
none: false
|
26
|
-
requirements:
|
18
|
+
requirements:
|
27
19
|
- - ~>
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
|
30
|
-
segments:
|
31
|
-
- 1
|
32
|
-
- 3
|
33
|
-
version: "1.3"
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '1.3'
|
34
22
|
type: :development
|
35
|
-
version_requirements: *id001
|
36
|
-
- !ruby/object:Gem::Dependency
|
37
|
-
name: rake
|
38
23
|
prerelease: false
|
39
|
-
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.3'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rake
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
40
33
|
none: false
|
41
|
-
requirements:
|
42
|
-
- -
|
43
|
-
- !ruby/object:Gem::Version
|
44
|
-
|
45
|
-
segments:
|
46
|
-
- 0
|
47
|
-
version: "0"
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
48
38
|
type: :development
|
49
|
-
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
50
46
|
description: RSpec tests for your provisioned servers
|
51
|
-
email:
|
47
|
+
email:
|
52
48
|
- gosukenator@gmail.com
|
53
|
-
executables:
|
49
|
+
executables:
|
54
50
|
- serverspec-init
|
55
51
|
extensions: []
|
56
|
-
|
57
52
|
extra_rdoc_files: []
|
58
|
-
|
59
|
-
files:
|
53
|
+
files:
|
60
54
|
- .gitignore
|
61
55
|
- Gemfile
|
62
56
|
- LICENSE.txt
|
@@ -64,6 +58,9 @@ files:
|
|
64
58
|
- Rakefile
|
65
59
|
- bin/serverspec-init
|
66
60
|
- lib/serverspec.rb
|
61
|
+
- lib/serverspec/commands/base.rb
|
62
|
+
- lib/serverspec/commands/debian.rb
|
63
|
+
- lib/serverspec/commands/redhat.rb
|
67
64
|
- lib/serverspec/helper.rb
|
68
65
|
- lib/serverspec/matchers.rb
|
69
66
|
- lib/serverspec/matchers/be_enabled.rb
|
@@ -75,39 +72,37 @@ files:
|
|
75
72
|
- lib/serverspec/setup.rb
|
76
73
|
- lib/serverspec/version.rb
|
77
74
|
- serverspec.gemspec
|
78
|
-
|
75
|
+
- spec/debian/matchers_spec.rb
|
76
|
+
- spec/redhat/matchers_spec.rb
|
77
|
+
- spec/spec_helper.rb
|
78
|
+
- spec/support/shared_matcher_examples.rb
|
79
79
|
homepage: https://github.com/mizzy/serverspec
|
80
|
-
licenses:
|
80
|
+
licenses:
|
81
81
|
- MIT
|
82
82
|
post_install_message:
|
83
83
|
rdoc_options: []
|
84
|
-
|
85
|
-
require_paths:
|
84
|
+
require_paths:
|
86
85
|
- lib
|
87
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
86
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
88
87
|
none: false
|
89
|
-
requirements:
|
90
|
-
- -
|
91
|
-
- !ruby/object:Gem::Version
|
92
|
-
|
93
|
-
|
94
|
-
- 0
|
95
|
-
version: "0"
|
96
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - ! '>='
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '0'
|
92
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
97
93
|
none: false
|
98
|
-
requirements:
|
99
|
-
- -
|
100
|
-
- !ruby/object:Gem::Version
|
101
|
-
|
102
|
-
segments:
|
103
|
-
- 0
|
104
|
-
version: "0"
|
94
|
+
requirements:
|
95
|
+
- - ! '>='
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '0'
|
105
98
|
requirements: []
|
106
|
-
|
107
99
|
rubyforge_project:
|
108
|
-
rubygems_version: 1.
|
100
|
+
rubygems_version: 1.8.25
|
109
101
|
signing_key:
|
110
102
|
specification_version: 3
|
111
103
|
summary: RSpec tests for your provisioned servers
|
112
|
-
test_files:
|
113
|
-
|
104
|
+
test_files:
|
105
|
+
- spec/debian/matchers_spec.rb
|
106
|
+
- spec/redhat/matchers_spec.rb
|
107
|
+
- spec/spec_helper.rb
|
108
|
+
- spec/support/shared_matcher_examples.rb
|