serverspec 0.1.7 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. data/README.md +15 -2
  2. data/lib/serverspec/backend/exec.rb +99 -0
  3. data/lib/serverspec/backend/puppet.rb +108 -0
  4. data/lib/serverspec/backend/ssh.rb +47 -0
  5. data/lib/serverspec/backend.rb +2 -0
  6. data/lib/serverspec/commands/base.rb +1 -1
  7. data/lib/serverspec/helper/debian.rb +9 -0
  8. data/lib/serverspec/helper/exec.rb +9 -0
  9. data/lib/serverspec/helper/gentoo.rb +9 -0
  10. data/lib/serverspec/helper/obsoleted.rb +62 -0
  11. data/lib/serverspec/helper/puppet.rb +9 -0
  12. data/lib/serverspec/helper/redhat.rb +9 -0
  13. data/lib/serverspec/helper/solaris.rb +9 -0
  14. data/lib/serverspec/helper/ssh.rb +10 -0
  15. data/lib/serverspec/helper.rb +13 -77
  16. data/lib/serverspec/matchers/be_directory.rb +1 -2
  17. data/lib/serverspec/matchers/be_enabled.rb +1 -2
  18. data/lib/serverspec/matchers/be_file.rb +1 -2
  19. data/lib/serverspec/matchers/be_group.rb +1 -2
  20. data/lib/serverspec/matchers/be_grouped_into.rb +1 -2
  21. data/lib/serverspec/matchers/be_installed.rb +1 -2
  22. data/lib/serverspec/matchers/be_installed_by_gem.rb +1 -6
  23. data/lib/serverspec/matchers/be_linked_to.rb +1 -2
  24. data/lib/serverspec/matchers/be_listening.rb +1 -2
  25. data/lib/serverspec/matchers/be_mode.rb +1 -2
  26. data/lib/serverspec/matchers/be_owned_by.rb +1 -2
  27. data/lib/serverspec/matchers/be_running.rb +1 -5
  28. data/lib/serverspec/matchers/be_user.rb +1 -2
  29. data/lib/serverspec/matchers/belong_to_group.rb +1 -2
  30. data/lib/serverspec/matchers/contain.rb +3 -3
  31. data/lib/serverspec/matchers/get_stdout.rb +1 -1
  32. data/lib/serverspec/matchers/have_cron_entry.rb +1 -2
  33. data/lib/serverspec/matchers/have_iptables_rule.rb +1 -2
  34. data/lib/serverspec/setup.rb +13 -6
  35. data/lib/serverspec/version.rb +1 -1
  36. data/lib/serverspec.rb +6 -5
  37. data/spec/debian/commands_spec.rb +2 -2
  38. data/spec/gentoo/commands_spec.rb +2 -2
  39. data/spec/redhat/commands_spec.rb +2 -2
  40. data/spec/solaris/commads_spec.rb +2 -2
  41. data/spec/spec_helper.rb +8 -6
  42. metadata +99 -77
data/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  RSpec tests for your servers provisioned by Puppet, Chef or anything else
4
4
 
5
+ You can see the details of serverspec on [serverspec.org](http://serverspec.org/).
6
+
5
7
  ----
6
8
 
7
9
  ## Installation
@@ -24,6 +26,13 @@ Or install it yourself as:
24
26
 
25
27
  ```
26
28
  $ serverspec-init
29
+ Select a backend type:
30
+
31
+ 1) SSH
32
+ 2) Exec (local)
33
+
34
+ Select number: 1
35
+
27
36
  Input target host name: www.example.jp
28
37
 
29
38
  Select OS type of target host:
@@ -92,7 +101,7 @@ Finished in 0.99715 seconds
92
101
 
93
102
  Serverspec is supporting Red Hat based OS, Debian based OS, Gentoo and Solaris now.
94
103
 
95
- If your target host's OS is Debian, you should include Serverspec::DebianHelper like this.
104
+ If your target host's OS is Debian, you should include `Serverspec::Helper::Debian` like this.
96
105
 
97
106
  ```ruby
98
107
  require 'serverspec'
@@ -100,8 +109,12 @@ require 'pathname'
100
109
  require 'net/ssh'
101
110
 
102
111
  RSpec.configure do |c|
112
+ # Include backend helper
113
+ c.include(Serverspec::Helper::Ssh)
103
114
  # Include OS helper
104
- c.include(Serverspec::DebianHelper)
115
+ c.include(Serverspec::Helper::Debian)
116
+ # Add SSH before hook in case you use the SSH backend
117
+ # (not required for the Exec backend)
105
118
  c.before do
106
119
  host = File.basename(Pathname.new(example.metadata[:location]).dirname)
107
120
  if c.host != host
@@ -0,0 +1,99 @@
1
+ module Serverspec
2
+ module Backend
3
+ class Exec
4
+ def initialize(commands)
5
+ @commands ||= commands
6
+ end
7
+
8
+ def commands
9
+ @commands
10
+ end
11
+
12
+ def do_check(cmd, opts={})
13
+ stdout = `#{cmd} 2>&1`
14
+ # In ruby 1.9, it is possible to use Open3.capture3, but not in 1.8
15
+ #stdout, stderr, status = Open3.capture3(cmd)
16
+ { :stdout => stdout, :stderr => nil,
17
+ :exit_code => $?, :exit_signal => nil }
18
+ end
19
+
20
+ def check_zero(cmd, *args)
21
+ ret = do_check(commands.send(cmd, *args))
22
+ ret[:exit_code] == 0
23
+ end
24
+
25
+ def check_directory(directory)
26
+ check_zero(:check_directory, directory)
27
+ end
28
+
29
+ def check_enabled(service)
30
+ check_zero(:check_enabled, service)
31
+ end
32
+
33
+ def check_file(file)
34
+ check_zero(:check_file, file)
35
+ end
36
+
37
+ def check_group(group)
38
+ check_zero(:check_group, group)
39
+ end
40
+
41
+ def check_grouped(file, group)
42
+ check_zero(:check_grouped, file, group)
43
+ end
44
+
45
+ def check_installed(package)
46
+ check_zero(:check_installed, package)
47
+ end
48
+
49
+ def check_installed_by_gem(package, version)
50
+ ret = do_check(commands.check_installed_by_gem(package))
51
+ res = ret[:exit_code] == 0
52
+ if res && version
53
+ res = false if not ret[:stdout].match(/\(#{version}\)/)
54
+ end
55
+ res
56
+ end
57
+
58
+ def check_link(link, target)
59
+ check_zero(:check_link, link, target)
60
+ end
61
+
62
+ def check_listening(port)
63
+ check_zero(:check_listening, port)
64
+ end
65
+
66
+ def check_mode(file, mode)
67
+ check_zero(:check_mode, file, mode)
68
+ end
69
+
70
+ def check_owner(file, owner)
71
+ check_zero(:check_owner, file, owner)
72
+ end
73
+
74
+ def check_running(process)
75
+ ret = do_check(commands.check_running(process))
76
+ if ret[:exit_code] == 1 || ret[:stdout] =~ /stopped/
77
+ ret = do_check(commands.check_process(process))
78
+ end
79
+ ret[:exit_code] == 0
80
+ end
81
+
82
+ def check_user(user)
83
+ check_zero(:check_user, user)
84
+ end
85
+
86
+ def check_belonging_group(user, group)
87
+ check_zero(:check_belonging_group, user, group)
88
+ end
89
+
90
+ def check_cron_entry(user, entry)
91
+ check_zero(:check_cron_entry, user, entry)
92
+ end
93
+
94
+ def check_iptables_rule(rule, table, chain)
95
+ check_zero(:check_iptables_rule, rule, table, chain)
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,108 @@
1
+ require 'puppet'
2
+ require 'puppet/type/file'
3
+ require 'puppet/type/group'
4
+ require 'puppet/type/user'
5
+ require 'puppet/type/package'
6
+ require 'puppet/type/service'
7
+
8
+ module Serverspec
9
+ module Backend
10
+ class Puppet < Exec # Use Exec methods as fallbacks
11
+
12
+ def check_directory(directory)
13
+ d = ::Puppet::Type::File.new(:name => directory, :ensure => 'directory')
14
+ d.insync?(d.retrieve)
15
+ end
16
+
17
+ def check_enabled(service)
18
+ s = ::Puppet::Type::Service.new(:name => service, :enable => 'true')
19
+ s.insync?(s.retrieve)
20
+ end
21
+
22
+ def check_file(file)
23
+ f = ::Puppet::Type::File.new(:name => file, :ensure => 'file')
24
+ f.insync?(f.retrieve)
25
+ end
26
+
27
+ def check_group(group)
28
+ g = ::Puppet::Type::Group.new(:name => group)
29
+ g_real = g.retrieve
30
+ if g.provider.exists?
31
+ g.insync?(g_real)
32
+ else
33
+ false
34
+ end
35
+ end
36
+
37
+ def check_grouped(file, group)
38
+ f = ::Puppet::Type::File.new(:name => file, :group => group)
39
+ f.insync?(f.retrieve)
40
+ end
41
+
42
+ def check_installed(package)
43
+ p = ::Puppet::Type::Package.new(:name => package)
44
+ p_real = p.retrieve
45
+ if p.exists?
46
+ p.insync?(p_real)
47
+ else
48
+ false
49
+ end
50
+ end
51
+
52
+ def check_installed_by_gem(package, version)
53
+ p = ::Puppet::Type::Package.new(:name => package, :provider => 'gem',
54
+ :ensure => version || 'present')
55
+ p_real = p.retrieve
56
+ if p.exists?
57
+ p.insync?(p_real)
58
+ else
59
+ false
60
+ end
61
+ end
62
+
63
+ def check_link(link, target)
64
+ f = ::Puppet::Type::File.new(:name => link, :ensure => 'link', :target => target)
65
+ f.insync?(f.retrieve)
66
+ end
67
+
68
+ # check_listening: inherited
69
+
70
+ def check_mode(file, mode)
71
+ f = ::Puppet::Type::File.new(:name => file, :mode => mode)
72
+ f.insync?(f.retrieve)
73
+ end
74
+
75
+ def check_owner(file, owner)
76
+ f = ::Puppet::Type::File.new(:name => file, :owner => owner)
77
+ f.insync?(f.retrieve)
78
+ end
79
+
80
+ def check_running(process)
81
+ s = ::Puppet::Type::Service.new(:name => process, :ensure => 'running')
82
+ s.insync?(s.retrieve)
83
+ end
84
+
85
+ def check_user(user)
86
+ u = ::Puppet::Type::User.new(:name => user)
87
+ u_real = u.retrieve
88
+ if u.provider.exists?
89
+ u.insync?(u_real)
90
+ else
91
+ false
92
+ end
93
+ end
94
+
95
+ # check_belonging_group: inherited, TODO
96
+ #def check_belonging_group(user, group)
97
+ # return false unless check_user(user)
98
+ # u = ::Puppet::Type::User.new(:name => user)
99
+ # u_real = u.retrieve
100
+ # # Get groups and compare
101
+ #end
102
+
103
+ # check_cron_entry: inherited
104
+
105
+ # check_iptables_rule: inherited
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,47 @@
1
+ require 'serverspec/backend/exec'
2
+
3
+ module Serverspec
4
+ module Backend
5
+ class Ssh < Exec
6
+ def do_check(cmd, opt={})
7
+ cmd = "sudo #{cmd}" if not RSpec.configuration.ssh.options[:user] == 'root'
8
+ ssh_exec!(cmd)
9
+ end
10
+
11
+ private
12
+ def ssh_exec!(command)
13
+ stdout_data = ''
14
+ stderr_data = ''
15
+ exit_code = nil
16
+ exit_signal = nil
17
+
18
+ ssh = RSpec.configuration.ssh
19
+ ssh.open_channel do |channel|
20
+ channel.request_pty do |ch, success|
21
+ abort "Could not obtain pty " if !success
22
+ end
23
+ channel.exec("#{command}") do |ch, success|
24
+ abort "FAILED: couldn't execute command (ssh.channel.exec)" if !success
25
+ channel.on_data do |ch,data|
26
+ stdout_data += data
27
+ end
28
+
29
+ channel.on_extended_data do |ch,type,data|
30
+ stderr_data += data
31
+ end
32
+
33
+ channel.on_request("exit-status") do |ch,data|
34
+ exit_code = data.read_long
35
+ end
36
+
37
+ channel.on_request("exit-signal") do |ch, data|
38
+ exit_signal = data.read_long
39
+ end
40
+ end
41
+ end
42
+ ssh.loop
43
+ { :stdout => stdout_data, :stderr => stderr_data, :exit_code => exit_code, :exit_signal => exit_signal }
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,2 @@
1
+ require 'serverspec/backend/ssh'
2
+ require 'serverspec/backend/exec'
@@ -72,7 +72,7 @@ module Serverspec
72
72
  end
73
73
 
74
74
  def check_installed_by_gem name
75
- "gem list --local | grep #{name}"
75
+ "gem list --local | grep '^#{name} '"
76
76
  end
77
77
 
78
78
  def check_belonging_group user, group
@@ -0,0 +1,9 @@
1
+ module Serverspec
2
+ module Helper
3
+ module Debian
4
+ def commands
5
+ Serverspec::Commands::Debian.new
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Serverspec
2
+ module Helper
3
+ module Exec
4
+ def backend
5
+ Serverspec::Backend::Exec.new(commands)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Serverspec
2
+ module Helper
3
+ module Gentoo
4
+ def commands
5
+ Serverspec::Commands::Gentoo.new
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,62 @@
1
+ module Serverspec
2
+ module SshHelper
3
+ def self.included(mod)
4
+ puts
5
+ puts "***********************************************************"
6
+ puts "Serverspec::SshHelper in spec/spec_helper.rb is deprecated."
7
+ puts "Use Serverspec::Helper::Ssh instead."
8
+ puts "Or remove spec/spec_helper.rb and run severspec-init again."
9
+ puts "***********************************************************"
10
+ puts
11
+ exit 1
12
+ end
13
+ end
14
+ module DebianHelper
15
+ def self.included(mod)
16
+ puts
17
+ puts "**************************************************************"
18
+ puts "Serverspec::DebianHelper in spec/spec_helper.rb is deprecated."
19
+ puts "Use Serverspec::Helper::Debian instead."
20
+ puts "Or remove spec/spec_helper.rb and run severspec-init again."
21
+ puts "**************************************************************"
22
+ puts
23
+ exit 1
24
+ end
25
+ end
26
+ module GentooHelper
27
+ def self.included(mod)
28
+ puts
29
+ puts "**************************************************************"
30
+ puts "Serverspec::GentooHelper in spec/spec_helper.rb is deprecated."
31
+ puts "Use Serverspec::Helper::Gentoo instead."
32
+ puts "Or remove spec/spec_helper.rb and run severspec-init again."
33
+ puts "**************************************************************"
34
+ puts
35
+ exit 1
36
+ end
37
+ end
38
+ module RedHatHelper
39
+ def self.included(mod)
40
+ puts
41
+ puts "**************************************************************"
42
+ puts "Serverspec::RedHatHelper in spec/spec_helper.rb is deprecated."
43
+ puts "Use Serverspec::Helper::RedHat instead."
44
+ puts "Or remove spec/spec_helper.rb and run severspec-init again."
45
+ puts "**************************************************************"
46
+ puts
47
+ exit 1
48
+ end
49
+ end
50
+ module SolarisHelper
51
+ def self.included(mod)
52
+ puts
53
+ puts "***************************************************************"
54
+ puts "Serverspec::SolarisHelper in spec/spec_helper.rb is deprecated."
55
+ puts "Use Serverspec::Helper::Solaris instead."
56
+ puts "Or remove spec/spec_helper.rb and run severspec-init again."
57
+ puts "***************************************************************"
58
+ puts
59
+ exit 1
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,9 @@
1
+ module Serverspec
2
+ module Helper
3
+ module Puppet
4
+ def backend
5
+ Serverspec::Backend::Puppet.new(commands)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Serverspec
2
+ module Helper
3
+ module RedHat
4
+ def commands
5
+ Serverspec::Commands::RedHat.new
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Serverspec
2
+ module Helper
3
+ module Solaris
4
+ def commands
5
+ Serverspec::Commands::Solaris.new
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ module Serverspec
2
+ module Helper
3
+ module Ssh
4
+ def backend
5
+ Serverspec::Backend::Ssh.new(commands)
6
+ end
7
+ end
8
+ end
9
+ end
10
+
@@ -1,79 +1,15 @@
1
1
  require 'etc'
2
2
 
3
- module Serverspec
4
- module SshHelper
5
- def do_check(cmd, opt={})
6
- cmd = "sudo #{cmd}" if not RSpec.configuration.ssh.options[:user] == 'root'
7
- ssh_exec!(cmd)
8
- end
9
-
10
- private
11
- def ssh_exec!(command)
12
- stdout_data = ''
13
- stderr_data = ''
14
- exit_code = nil
15
- exit_signal = nil
16
-
17
- ssh = RSpec.configuration.ssh
18
- ssh.open_channel do |channel|
19
- channel.request_pty do |ch, success|
20
- abort "Could not obtain pty " if !success
21
- end
22
- channel.exec("#{command}") do |ch, success|
23
- abort "FAILED: couldn't execute command (ssh.channel.exec)" if !success
24
- channel.on_data do |ch,data|
25
- stdout_data += data
26
- end
27
-
28
- channel.on_extended_data do |ch,type,data|
29
- stderr_data += data
30
- end
31
-
32
- channel.on_request("exit-status") do |ch,data|
33
- exit_code = data.read_long
34
- end
35
-
36
- channel.on_request("exit-signal") do |ch, data|
37
- exit_signal = data.read_long
38
- end
39
- end
40
- end
41
- ssh.loop
42
- { :stdout => stdout_data, :stderr => stderr_data, :exit_code => exit_code, :exit_signal => exit_signal }
43
- end
44
- end
45
-
46
- module ExecHelper
47
- def do_check(cmd, opts={})
48
- stdout = `#{cmd} 2>&1`
49
- # In ruby 1.9, it is possible to use Open3.capture3, but not in 1.8
50
- #stdout, stderr, status = Open3.capture3(cmd)
51
- { :stdout => stdout, :stderr => nil,
52
- :exit_code => $?, :exit_signal => nil }
53
- end
54
- end
55
-
56
- module RedHatHelper
57
- def commands
58
- Serverspec::Commands::RedHat.new
59
- end
60
- end
61
-
62
- module DebianHelper
63
- def commands
64
- Serverspec::Commands::Debian.new
65
- end
66
- end
67
-
68
- module GentooHelper
69
- def commands
70
- Serverspec::Commands::Gentoo.new
71
- end
72
- end
73
-
74
- module SolarisHelper
75
- def commands
76
- Serverspec::Commands::Solaris.new
77
- end
78
- end
79
- end
3
+ # Backend helpers
4
+ require 'serverspec/helper/ssh'
5
+ require 'serverspec/helper/exec'
6
+ require 'serverspec/helper/puppet'
7
+
8
+ # Command helpers
9
+ require 'serverspec/helper/redhat'
10
+ require 'serverspec/helper/debian'
11
+ require 'serverspec/helper/gentoo'
12
+ require 'serverspec/helper/solaris'
13
+
14
+ # Obsoleted helpers
15
+ require 'serverspec/helper/obsoleted'
@@ -1,6 +1,5 @@
1
1
  RSpec::Matchers.define :be_directory do
2
2
  match do |actual|
3
- ret = do_check(commands.check_directory(actual))
4
- ret[:exit_code] == 0
3
+ backend.check_directory(actual)
5
4
  end
6
5
  end
@@ -1,6 +1,5 @@
1
1
  RSpec::Matchers.define :be_enabled do
2
2
  match do |actual|
3
- ret = do_check(commands.check_enabled(actual))
4
- ret[:exit_code] == 0
3
+ backend.check_enabled(actual)
5
4
  end
6
5
  end
@@ -1,6 +1,5 @@
1
1
  RSpec::Matchers.define :be_file do
2
2
  match do |actual|
3
- ret = do_check(commands.check_file(actual))
4
- ret[:exit_code] == 0
3
+ backend.check_file(actual)
5
4
  end
6
5
  end
@@ -1,6 +1,5 @@
1
1
  RSpec::Matchers.define :be_group do
2
2
  match do |actual|
3
- ret = do_check(commands.check_group(actual))
4
- ret[:exit_code] == 0
3
+ backend.check_group(actual)
5
4
  end
6
5
  end
@@ -1,6 +1,5 @@
1
1
  RSpec::Matchers.define :be_grouped_into do |group|
2
2
  match do |file|
3
- ret = do_check(commands.check_grouped(file, group))
4
- ret[:exit_code] == 0
3
+ backend.check_grouped(file, group)
5
4
  end
6
5
  end
@@ -1,6 +1,5 @@
1
1
  RSpec::Matchers.define :be_installed do
2
2
  match do |actual|
3
- ret = do_check(commands.check_installed(actual))
4
- ret[:exit_code] == 0
3
+ backend.check_installed(actual)
5
4
  end
6
5
  end
@@ -1,11 +1,6 @@
1
1
  RSpec::Matchers.define :be_installed_by_gem do
2
2
  match do |name|
3
- ret = do_check(commands.check_installed_by_gem(name))
4
- res = ret[:exit_code] == 0
5
- if res && @version
6
- res = false if not ret[:stdout].match(/\(#{@version}\)/)
7
- end
8
- res
3
+ backend.check_installed_by_gem(name, @version)
9
4
  end
10
5
  chain :with_version do |version|
11
6
  @version = version
@@ -1,6 +1,5 @@
1
1
  RSpec::Matchers.define :be_linked_to do |target|
2
2
  match do |link|
3
- ret = do_check(commands.check_link(link, target))
4
- ret[:exit_code] == 0
3
+ backend.check_link(link, target)
5
4
  end
6
5
  end
@@ -1,7 +1,6 @@
1
1
  RSpec::Matchers.define :be_listening do
2
2
  match do |actual|
3
3
  port = actual.gsub(/port\s+/, '')
4
- ret = do_check(commands.check_listening(port))
5
- ret[:exit_code] == 0
4
+ backend.check_listening(port)
6
5
  end
7
6
  end
@@ -1,6 +1,5 @@
1
1
  RSpec::Matchers.define :be_mode do |mode|
2
2
  match do |file|
3
- ret = do_check(commands.check_mode(file, mode))
4
- ret[:exit_code] == 0
3
+ backend.check_mode(file, mode)
5
4
  end
6
5
  end
@@ -1,6 +1,5 @@
1
1
  RSpec::Matchers.define :be_owned_by do |owner|
2
2
  match do |file|
3
- ret = do_check(commands.check_owner(file, owner))
4
- ret[:exit_code] == 0
3
+ backend.check_owner(file, owner)
5
4
  end
6
5
  end
@@ -1,9 +1,5 @@
1
1
  RSpec::Matchers.define :be_running do
2
2
  match do |process|
3
- ret = do_check(commands.check_running(process))
4
- if ret[:exit_code] == 1 || ret[:stdout] =~ /stopped/
5
- ret = do_check(commands.check_process(process))
6
- end
7
- ret[:exit_code] == 0
3
+ backend.check_running(process)
8
4
  end
9
5
  end
@@ -1,6 +1,5 @@
1
1
  RSpec::Matchers.define :be_user do
2
2
  match do |actual|
3
- ret = do_check(commands.check_user(actual))
4
- ret[:exit_code] == 0
3
+ backend.check_user(actual)
5
4
  end
6
5
  end
@@ -1,6 +1,5 @@
1
1
  RSpec::Matchers.define :belong_to_group do |group|
2
2
  match do |user|
3
- ret = do_check(commands.check_belonging_group(user, group))
4
- ret[:exit_code] == 0
3
+ backend.check_belonging_group(user, group)
5
4
  end
6
5
  end
@@ -1,11 +1,11 @@
1
1
  RSpec::Matchers.define :contain do |pattern|
2
2
  match do |file|
3
3
  if (@from || @to).nil?
4
- cmd = commands.check_file_contain(file, pattern)
4
+ cmd = backend.commands.check_file_contain(file, pattern)
5
5
  else
6
- cmd = commands.check_file_contain_within(file, pattern, @from, @to)
6
+ cmd = backend.commands.check_file_contain_within(file, pattern, @from, @to)
7
7
  end
8
- ret = do_check(cmd)
8
+ ret = backend.do_check(cmd)
9
9
  ret[:exit_code] == 0
10
10
  end
11
11
  # for contain(pattern).from(/A/).to(/B/)
@@ -1,6 +1,6 @@
1
1
  RSpec::Matchers.define :get_stdout do |expected|
2
2
  match do |command|
3
- ret = do_check(command)
3
+ ret = backend.do_check(command)
4
4
  ret[:stdout] =~ /#{expected}/
5
5
  end
6
6
  end
@@ -1,8 +1,7 @@
1
1
  RSpec::Matchers.define :have_cron_entry do |entry|
2
2
  match do |actual|
3
3
  @user ||= 'root'
4
- ret = do_check(commands.check_cron_entry(@user, entry))
5
- ret[:exit_code] == 0
4
+ backend.check_cron_entry(@user, entry)
6
5
  end
7
6
  chain :with_user do |user|
8
7
  @user = user
@@ -1,7 +1,6 @@
1
1
  RSpec::Matchers.define :have_iptables_rule do |rule|
2
2
  match do |iptables|
3
- ret = do_check(commands.check_iptables_rule(rule, @table, @chain))
4
- ret[:exit_code] == 0
3
+ backend.check_iptables_rule(rule, @table, @chain)
5
4
  end
6
5
  chain :with_table do |table|
7
6
  @table = table
@@ -8,6 +8,7 @@ Select a backend type:
8
8
 
9
9
  1) SSH
10
10
  2) Exec (local)
11
+ 3) Puppet providers (local)
11
12
 
12
13
  Select number:
13
14
  EOF
@@ -15,7 +16,7 @@ EOF
15
16
  num = gets.to_i - 1
16
17
  puts
17
18
 
18
- @backend_type = [ 'Ssh', 'Exec' ][num]
19
+ @backend_type = [ 'Ssh', 'Exec', 'Puppet' ][num]
19
20
  if @backend_type == 'Ssh'
20
21
  print "Input target host name: "
21
22
  @hostname = gets.chomp
@@ -41,6 +42,7 @@ EOF
41
42
  puts
42
43
 
43
44
  @os_type = [ 'RedHat', 'Debian', 'Gentoo', 'Solaris', nil ][num]
45
+
44
46
  [ 'spec', "spec/#{@hostname}" ].each { |dir| safe_mkdir(dir) }
45
47
  safe_create_spec
46
48
  safe_create_spec_helper
@@ -96,7 +98,7 @@ EOF
96
98
  content = <<-EOF
97
99
  require 'serverspec'
98
100
  require 'pathname'
99
- require 'net/ssh'
101
+ ### include requirements ###
100
102
 
101
103
  RSpec.configure do |c|
102
104
  ### include backend helper ###
@@ -106,9 +108,11 @@ end
106
108
  EOF
107
109
 
108
110
  if not @backend_type.nil?
109
- content.gsub!(/### include backend helper ###/, "c.include(Serverspec::#{@backend_type}Helper)")
110
- if @backend_type == 'Ssh'
111
- content.gsub!(/### include backend conf ###/, "c.before do
111
+ content.gsub!(/### include backend helper ###/, "c.include(Serverspec::Helper::#{@backend_type})")
112
+ case @backend_type
113
+ when 'Ssh'
114
+ content.gsub!(/### include requirements ###/, "require 'net/ssh'")
115
+ content.gsub!(/### include backend conf ###/, "c.before do
112
116
  host = File.basename(Pathname.new(example.metadata[:location]).dirname)
113
117
  if c.host != host
114
118
  c.ssh.close if c.ssh
@@ -118,11 +122,14 @@ EOF
118
122
  c.ssh = Net::SSH.start(c.host, user, options)
119
123
  end
120
124
  end
125
+ ")
126
+ when 'Puppet'
127
+ content.gsub!(/### include requirements ###/, "require 'puppet'\nrequire 'serverspec/backend/puppet'
121
128
  ")
122
129
  end
123
130
  end
124
131
  if not @os_type.nil?
125
- content.gsub!(/### include os helper ###/, "c.include(Serverspec::#{@os_type}Helper)")
132
+ content.gsub!(/### include os helper ###/, "c.include(Serverspec::Helper::#{@os_type})")
126
133
  end
127
134
 
128
135
  if File.exists? 'spec/spec_helper.rb'
@@ -1,3 +1,3 @@
1
1
  module Serverspec
2
- VERSION = "0.1.7"
2
+ VERSION = "0.2.1"
3
3
  end
data/lib/serverspec.rb CHANGED
@@ -2,6 +2,7 @@ require 'rubygems'
2
2
  require 'rspec'
3
3
  require 'serverspec/version'
4
4
  require 'serverspec/matchers'
5
+ require 'serverspec/backend'
5
6
  require 'serverspec/helper'
6
7
  require 'serverspec/setup'
7
8
  require 'serverspec/commands/base'
@@ -11,11 +12,11 @@ require 'serverspec/commands/gentoo'
11
12
  require 'serverspec/commands/solaris'
12
13
 
13
14
  RSpec.configure do |c|
14
- c.include(Serverspec::SshHelper)
15
- c.include(Serverspec::RedHatHelper, :os => :redhat)
16
- c.include(Serverspec::DebianHelper, :os => :debian)
17
- c.include(Serverspec::GentooHelper, :os => :gentoo)
18
- c.include(Serverspec::SolarisHelper, :os => :solaris)
15
+ c.include(Serverspec::Helper::Ssh)
16
+ c.include(Serverspec::Helper::RedHat, :os => :redhat)
17
+ c.include(Serverspec::Helper::Debian, :os => :debian)
18
+ c.include(Serverspec::Helper::Gentoo, :os => :gentoo)
19
+ c.include(Serverspec::Helper::Solaris, :os => :solaris)
19
20
  c.add_setting :host, :default => nil
20
21
  c.add_setting :ssh, :default => nil
21
22
  end
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- include Serverspec::DebianHelper
3
+ include Serverspec::Helper::Debian
4
4
 
5
5
  describe commands.check_enabled('httpd') do
6
6
  it { should eq 'ls /etc/rc3.d/ | grep httpd' }
@@ -79,7 +79,7 @@ describe commands.check_link('/etc/system-release', '/etc/redhat-release') do
79
79
  end
80
80
 
81
81
  describe commands.check_installed_by_gem('jekyll') do
82
- it { should eq 'gem list --local | grep jekyll' }
82
+ it { should eq 'gem list --local | grep \'^jekyll \'' }
83
83
  end
84
84
 
85
85
  describe commands.check_belonging_group('root', 'wheel') do
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- include Serverspec::GentooHelper
3
+ include Serverspec::Helper::Gentoo
4
4
 
5
5
  describe commands.check_enabled('httpd') do
6
6
  it { should eq "/sbin/rc-update show | grep '^\\s*httpd\\s*|\\s*\\(boot\\|default\\)'" }
@@ -79,7 +79,7 @@ describe commands.check_link('/etc/system-release', '/etc/redhat-release') do
79
79
  end
80
80
 
81
81
  describe commands.check_installed_by_gem('jekyll') do
82
- it { should eq 'gem list --local | grep jekyll' }
82
+ it { should eq 'gem list --local | grep \'^jekyll \'' }
83
83
  end
84
84
 
85
85
  describe commands.check_belonging_group('root', 'wheel') do
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- include Serverspec::RedHatHelper
3
+ include Serverspec::Helper::RedHat
4
4
 
5
5
  describe commands.check_enabled('httpd') do
6
6
  it { should eq 'chkconfig --list httpd | grep 3:on' }
@@ -79,7 +79,7 @@ describe commands.check_link('/etc/system-release', '/etc/redhat-release') do
79
79
  end
80
80
 
81
81
  describe commands.check_installed_by_gem('jekyll') do
82
- it { should eq 'gem list --local | grep jekyll' }
82
+ it { should eq 'gem list --local | grep \'^jekyll \'' }
83
83
  end
84
84
 
85
85
  describe commands.check_belonging_group('root', 'wheel') do
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- include Serverspec::SolarisHelper
3
+ include Serverspec::Helper::Solaris
4
4
 
5
5
  describe commands.check_enabled('httpd') do
6
6
  it { should eq "svcs -l httpd 2> /dev/null | grep 'enabled true'" }
@@ -79,7 +79,7 @@ describe commands.check_link('/etc/system-release', '/etc/redhat-release') do
79
79
  end
80
80
 
81
81
  describe commands.check_installed_by_gem('jekyll') do
82
- it { should eq 'gem list --local | grep jekyll' }
82
+ it { should eq 'gem list --local | grep \'^jekyll \'' }
83
83
  end
84
84
 
85
85
  describe commands.check_belonging_group('root', 'wheel') do
data/spec/spec_helper.rb CHANGED
@@ -6,12 +6,14 @@ PROJECT_ROOT = (Pathname.new(File.dirname(__FILE__)) + '..').expand_path
6
6
  Dir[PROJECT_ROOT.join("spec/support/**/*.rb")].each { |file| require(file) }
7
7
 
8
8
  module Serverspec
9
- module SshHelper
10
- def do_check(cmd)
11
- if cmd =~ /invalid/
12
- { :stdout => '', :stderr => '', :exit_code => 1, :exit_signal => nil }
13
- else
14
- { :stdout => ::RSpec.configuration.stdout, :stderr => '', :exit_code => 0, :exit_signal => nil }
9
+ module Backend
10
+ class Ssh
11
+ def do_check(cmd)
12
+ if cmd =~ /invalid/
13
+ { :stdout => '', :stderr => '', :exit_code => 1, :exit_signal => nil }
14
+ else
15
+ { :stdout => ::RSpec.configuration.stdout, :stderr => '', :exit_code => 0, :exit_signal => nil }
16
+ end
15
17
  end
16
18
  end
17
19
  end
metadata CHANGED
@@ -1,89 +1,90 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: serverspec
3
- version: !ruby/object:Gem::Version
4
- version: 0.1.7
5
- prerelease:
3
+ version: !ruby/object:Gem::Version
4
+ hash: 21
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 2
9
+ - 1
10
+ version: 0.2.1
6
11
  platform: ruby
7
- authors:
12
+ authors:
8
13
  - Gosuke Miyashita
9
14
  autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
- date: 2013-04-05 00:00:00.000000000 Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
17
+
18
+ date: 2013-04-08 00:00:00 +09:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
15
22
  name: net-ssh
16
- requirement: !ruby/object:Gem::Requirement
17
- none: false
18
- requirements:
19
- - - ! '>='
20
- - !ruby/object:Gem::Version
21
- version: '0'
22
- type: :runtime
23
23
  prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
25
  none: false
26
- requirements:
27
- - - ! '>='
28
- - !ruby/object:Gem::Version
29
- version: '0'
30
- - !ruby/object:Gem::Dependency
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
31
36
  name: bundler
32
- requirement: !ruby/object:Gem::Requirement
33
- none: false
34
- requirements:
35
- - - ~>
36
- - !ruby/object:Gem::Version
37
- version: '1.3'
38
- type: :development
39
37
  prerelease: false
40
- version_requirements: !ruby/object:Gem::Requirement
38
+ requirement: &id002 !ruby/object:Gem::Requirement
41
39
  none: false
42
- requirements:
40
+ requirements:
43
41
  - - ~>
44
- - !ruby/object:Gem::Version
45
- version: '1.3'
46
- - !ruby/object:Gem::Dependency
47
- name: rspec
48
- requirement: !ruby/object:Gem::Requirement
49
- none: false
50
- requirements:
51
- - - ! '>='
52
- - !ruby/object:Gem::Version
53
- version: '0'
42
+ - !ruby/object:Gem::Version
43
+ hash: 9
44
+ segments:
45
+ - 1
46
+ - 3
47
+ version: "1.3"
54
48
  type: :development
49
+ version_requirements: *id002
50
+ - !ruby/object:Gem::Dependency
51
+ name: rspec
55
52
  prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
53
+ requirement: &id003 !ruby/object:Gem::Requirement
57
54
  none: false
58
- requirements:
59
- - - ! '>='
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- - !ruby/object:Gem::Dependency
63
- name: rake
64
- requirement: !ruby/object:Gem::Requirement
65
- none: false
66
- requirements:
67
- - - ! '>='
68
- - !ruby/object:Gem::Version
69
- version: '0'
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ hash: 3
59
+ segments:
60
+ - 0
61
+ version: "0"
70
62
  type: :development
63
+ version_requirements: *id003
64
+ - !ruby/object:Gem::Dependency
65
+ name: rake
71
66
  prerelease: false
72
- version_requirements: !ruby/object:Gem::Requirement
67
+ requirement: &id004 !ruby/object:Gem::Requirement
73
68
  none: false
74
- requirements:
75
- - - ! '>='
76
- - !ruby/object:Gem::Version
77
- version: '0'
78
- description: RSpec tests for your servers provisioned by Puppet, Chef or anything
79
- else
80
- email:
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ hash: 3
73
+ segments:
74
+ - 0
75
+ version: "0"
76
+ type: :development
77
+ version_requirements: *id004
78
+ description: RSpec tests for your servers provisioned by Puppet, Chef or anything else
79
+ email:
81
80
  - gosukenator@gmail.com
82
- executables:
81
+ executables:
83
82
  - serverspec-init
84
83
  extensions: []
84
+
85
85
  extra_rdoc_files: []
86
- files:
86
+
87
+ files:
87
88
  - .gitignore
88
89
  - .travis.yml
89
90
  - Gemfile
@@ -92,12 +93,24 @@ files:
92
93
  - Rakefile
93
94
  - bin/serverspec-init
94
95
  - lib/serverspec.rb
96
+ - lib/serverspec/backend.rb
97
+ - lib/serverspec/backend/exec.rb
98
+ - lib/serverspec/backend/puppet.rb
99
+ - lib/serverspec/backend/ssh.rb
95
100
  - lib/serverspec/commands/base.rb
96
101
  - lib/serverspec/commands/debian.rb
97
102
  - lib/serverspec/commands/gentoo.rb
98
103
  - lib/serverspec/commands/redhat.rb
99
104
  - lib/serverspec/commands/solaris.rb
100
105
  - lib/serverspec/helper.rb
106
+ - lib/serverspec/helper/debian.rb
107
+ - lib/serverspec/helper/exec.rb
108
+ - lib/serverspec/helper/gentoo.rb
109
+ - lib/serverspec/helper/obsoleted.rb
110
+ - lib/serverspec/helper/puppet.rb
111
+ - lib/serverspec/helper/redhat.rb
112
+ - lib/serverspec/helper/solaris.rb
113
+ - lib/serverspec/helper/ssh.rb
101
114
  - lib/serverspec/matchers.rb
102
115
  - lib/serverspec/matchers/be_directory.rb
103
116
  - lib/serverspec/matchers/be_enabled.rb
@@ -130,32 +143,41 @@ files:
130
143
  - spec/solaris/matchers_spec.rb
131
144
  - spec/spec_helper.rb
132
145
  - spec/support/shared_matcher_examples.rb
146
+ has_rdoc: true
133
147
  homepage: http://serverspec.org/
134
- licenses:
148
+ licenses:
135
149
  - MIT
136
150
  post_install_message:
137
151
  rdoc_options: []
138
- require_paths:
152
+
153
+ require_paths:
139
154
  - lib
140
- required_ruby_version: !ruby/object:Gem::Requirement
155
+ required_ruby_version: !ruby/object:Gem::Requirement
141
156
  none: false
142
- requirements:
143
- - - ! '>='
144
- - !ruby/object:Gem::Version
145
- version: '0'
146
- required_rubygems_version: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ hash: 3
161
+ segments:
162
+ - 0
163
+ version: "0"
164
+ required_rubygems_version: !ruby/object:Gem::Requirement
147
165
  none: false
148
- requirements:
149
- - - ! '>='
150
- - !ruby/object:Gem::Version
151
- version: '0'
166
+ requirements:
167
+ - - ">="
168
+ - !ruby/object:Gem::Version
169
+ hash: 3
170
+ segments:
171
+ - 0
172
+ version: "0"
152
173
  requirements: []
174
+
153
175
  rubyforge_project:
154
- rubygems_version: 1.8.23
176
+ rubygems_version: 1.3.7
155
177
  signing_key:
156
178
  specification_version: 3
157
179
  summary: RSpec tests for your servers provisioned by Puppet, Chef or anything else
158
- test_files:
180
+ test_files:
159
181
  - spec/debian/commands_spec.rb
160
182
  - spec/debian/matchers_spec.rb
161
183
  - spec/gentoo/commands_spec.rb