serverspec-clc 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (180) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +26 -0
  3. data/.gitmodules +3 -0
  4. data/.travis.yml +14 -0
  5. data/Gemfile +8 -0
  6. data/Guardfile +4 -0
  7. data/LICENSE.txt +22 -0
  8. data/README.md +15 -0
  9. data/Rakefile +30 -0
  10. data/WINDOWS_SUPPORT.md +116 -0
  11. data/bin/serverspec-init +7 -0
  12. data/lib/serverspec.rb +33 -0
  13. data/lib/serverspec/commands/base.rb +7 -0
  14. data/lib/serverspec/helper.rb +8 -0
  15. data/lib/serverspec/helper/type.rb +23 -0
  16. data/lib/serverspec/matcher.rb +35 -0
  17. data/lib/serverspec/matcher/be_enabled.rb +13 -0
  18. data/lib/serverspec/matcher/be_executable.rb +13 -0
  19. data/lib/serverspec/matcher/be_installed.rb +13 -0
  20. data/lib/serverspec/matcher/be_listening.rb +13 -0
  21. data/lib/serverspec/matcher/be_mounted.rb +15 -0
  22. data/lib/serverspec/matcher/be_reachable.rb +17 -0
  23. data/lib/serverspec/matcher/be_readable.rb +13 -0
  24. data/lib/serverspec/matcher/be_resolvable.rb +9 -0
  25. data/lib/serverspec/matcher/be_running.rb +13 -0
  26. data/lib/serverspec/matcher/be_writable.rb +13 -0
  27. data/lib/serverspec/matcher/belong_to_group.rb +5 -0
  28. data/lib/serverspec/matcher/belong_to_primary_group.rb +5 -0
  29. data/lib/serverspec/matcher/contain.rb +24 -0
  30. data/lib/serverspec/matcher/have_entry.rb +14 -0
  31. data/lib/serverspec/matcher/have_rule.rb +17 -0
  32. data/lib/serverspec/matcher/have_site_application.rb +18 -0
  33. data/lib/serverspec/matcher/have_site_bindings.rb +22 -0
  34. data/lib/serverspec/matcher/have_virtual_dir.rb +14 -0
  35. data/lib/serverspec/setup.rb +333 -0
  36. data/lib/serverspec/subject.rb +12 -0
  37. data/lib/serverspec/type/base.rb +21 -0
  38. data/lib/serverspec/type/cgroup.rb +17 -0
  39. data/lib/serverspec/type/command.rb +20 -0
  40. data/lib/serverspec/type/cron.rb +11 -0
  41. data/lib/serverspec/type/default_gateway.rb +15 -0
  42. data/lib/serverspec/type/file.rb +113 -0
  43. data/lib/serverspec/type/group.rb +11 -0
  44. data/lib/serverspec/type/host.rb +15 -0
  45. data/lib/serverspec/type/iis_app_pool.rb +43 -0
  46. data/lib/serverspec/type/iis_website.rb +40 -0
  47. data/lib/serverspec/type/interface.rb +18 -0
  48. data/lib/serverspec/type/ip6tables.rb +13 -0
  49. data/lib/serverspec/type/ipfilter.rb +11 -0
  50. data/lib/serverspec/type/ipnat.rb +11 -0
  51. data/lib/serverspec/type/iptables.rb +11 -0
  52. data/lib/serverspec/type/kernel_module.rb +7 -0
  53. data/lib/serverspec/type/linux_kernel_parameter.rb +10 -0
  54. data/lib/serverspec/type/lxc.rb +15 -0
  55. data/lib/serverspec/type/mail_alias.rb +7 -0
  56. data/lib/serverspec/type/package.rb +65 -0
  57. data/lib/serverspec/type/php_config.rb +10 -0
  58. data/lib/serverspec/type/port.rb +40 -0
  59. data/lib/serverspec/type/ppa.rb +11 -0
  60. data/lib/serverspec/type/process.rb +27 -0
  61. data/lib/serverspec/type/routing_table.rb +11 -0
  62. data/lib/serverspec/type/selinux.rb +19 -0
  63. data/lib/serverspec/type/selinux_module.rb +11 -0
  64. data/lib/serverspec/type/service.rb +33 -0
  65. data/lib/serverspec/type/user.rb +31 -0
  66. data/lib/serverspec/type/windows_feature.rb +7 -0
  67. data/lib/serverspec/type/windows_hot_fix.rb +7 -0
  68. data/lib/serverspec/type/windows_registry_key.rb +19 -0
  69. data/lib/serverspec/type/windows_scheduled_task.rb +7 -0
  70. data/lib/serverspec/type/yumrepo.rb +11 -0
  71. data/lib/serverspec/type/zfs.rb +15 -0
  72. data/lib/serverspec/version.rb +3 -0
  73. data/serverspec.gemspec +26 -0
  74. data/spec/helper/type_spec.rb +6 -0
  75. data/spec/spec_helper.rb +28 -0
  76. data/spec/type/aix/file_spec.rb +31 -0
  77. data/spec/type/aix/group_spec.rb +7 -0
  78. data/spec/type/aix/package_spec.rb +7 -0
  79. data/spec/type/aix/port_spec.rb +20 -0
  80. data/spec/type/aix/service_spec.rb +12 -0
  81. data/spec/type/aix/user_spec.rb +16 -0
  82. data/spec/type/arch/file_spec.rb +15 -0
  83. data/spec/type/arch/package_spec.rb +19 -0
  84. data/spec/type/arch/service_spec.rb +9 -0
  85. data/spec/type/base/command_spec.rb +62 -0
  86. data/spec/type/base/cron_spec.rb +11 -0
  87. data/spec/type/base/default_gateway_spec.rb +11 -0
  88. data/spec/type/base/file_spec.rb +336 -0
  89. data/spec/type/base/group_spec.rb +11 -0
  90. data/spec/type/base/host_spec.rb +36 -0
  91. data/spec/type/base/mail_alias_spec.rb +7 -0
  92. data/spec/type/base/package_spec.rb +43 -0
  93. data/spec/type/base/php_config_spec.rb +33 -0
  94. data/spec/type/base/port_spec.rb +34 -0
  95. data/spec/type/base/process_spec.rb +35 -0
  96. data/spec/type/base/routing_table_spec.rb +118 -0
  97. data/spec/type/base/service_spec.rb +45 -0
  98. data/spec/type/base/user_spec.rb +31 -0
  99. data/spec/type/darwin/file_spec.rb +41 -0
  100. data/spec/type/darwin/package_spec.rb +19 -0
  101. data/spec/type/darwin/port_spec.rb +27 -0
  102. data/spec/type/darwin/service_spec.rb +16 -0
  103. data/spec/type/debian/package_spec.rb +23 -0
  104. data/spec/type/debian/service_spec.rb +11 -0
  105. data/spec/type/fedora/service_spec.rb +15 -0
  106. data/spec/type/fedora15/service_spec.rb +15 -0
  107. data/spec/type/fedora20/service_spec.rb +15 -0
  108. data/spec/type/freebsd/file_spec.rb +29 -0
  109. data/spec/type/freebsd/package_spec.rb +19 -0
  110. data/spec/type/freebsd/port_spec.rb +27 -0
  111. data/spec/type/freebsd/service_spec.rb +8 -0
  112. data/spec/type/freebsd10/package_spec.rb +19 -0
  113. data/spec/type/gentoo/package_spec.rb +7 -0
  114. data/spec/type/gentoo/service_spec.rb +12 -0
  115. data/spec/type/linux/cgroup_spec.rb +13 -0
  116. data/spec/type/linux/file_spec.rb +21 -0
  117. data/spec/type/linux/interface_spec.rb +25 -0
  118. data/spec/type/linux/ip6tables_spec.rb +19 -0
  119. data/spec/type/linux/iptables_spec.rb +11 -0
  120. data/spec/type/linux/kernel_module_spec.rb +7 -0
  121. data/spec/type/linux/linux_kernel_parameter_spec.rb +33 -0
  122. data/spec/type/linux/lxc_container_spec.rb +12 -0
  123. data/spec/type/linux/selinux_module_spec.rb +11 -0
  124. data/spec/type/linux/selinux_spec.rb +15 -0
  125. data/spec/type/linux/zfs_spec.rb +15 -0
  126. data/spec/type/nixos/package_spec.rb +15 -0
  127. data/spec/type/nixos/service_spec.rb +9 -0
  128. data/spec/type/openbsd/file_spec.rb +134 -0
  129. data/spec/type/openbsd/interface_spec.rb +21 -0
  130. data/spec/type/openbsd/mail_alias_spec.rb +7 -0
  131. data/spec/type/openbsd/package_spec.rb +11 -0
  132. data/spec/type/openbsd/port_spec.rb +7 -0
  133. data/spec/type/openbsd/service_spec.rb +13 -0
  134. data/spec/type/openbsd/user_spec.rb +12 -0
  135. data/spec/type/opensuse/service_spec.rb +16 -0
  136. data/spec/type/plamo/package_spec.rb +8 -0
  137. data/spec/type/plamo/service_spec.rb +8 -0
  138. data/spec/type/redhat/file_spec.rb +19 -0
  139. data/spec/type/redhat/package_spec.rb +23 -0
  140. data/spec/type/redhat/service_spec.rb +11 -0
  141. data/spec/type/redhat/yumrepo_spec.rb +11 -0
  142. data/spec/type/redhat5/iptables_spec.rb +11 -0
  143. data/spec/type/redhat7/service_spec.rb +9 -0
  144. data/spec/type/smartos/package_spec.rb +19 -0
  145. data/spec/type/smartos/service_spec.rb +16 -0
  146. data/spec/type/solaris/cron_spec.rb +11 -0
  147. data/spec/type/solaris/file_spec.rb +15 -0
  148. data/spec/type/solaris/group_spec.rb +7 -0
  149. data/spec/type/solaris/host_spec.rb +19 -0
  150. data/spec/type/solaris/ipfilter_spec.rb +7 -0
  151. data/spec/type/solaris/ipnat_spec.rb +7 -0
  152. data/spec/type/solaris/package_spec.rb +7 -0
  153. data/spec/type/solaris/port_spec.rb +34 -0
  154. data/spec/type/solaris/service_spec.rb +16 -0
  155. data/spec/type/solaris/user_spec.rb +16 -0
  156. data/spec/type/solaris/zfs_spec.rb +15 -0
  157. data/spec/type/solaris10/file_spec.rb +313 -0
  158. data/spec/type/solaris10/group_spec.rb +8 -0
  159. data/spec/type/solaris10/host_spec.rb +16 -0
  160. data/spec/type/solaris10/package_spec.rb +8 -0
  161. data/spec/type/solaris10/user_spec.rb +8 -0
  162. data/spec/type/suse/package_spec.rb +23 -0
  163. data/spec/type/suse/service_spec.rb +11 -0
  164. data/spec/type/ubuntu/ppa_spec.rb +11 -0
  165. data/spec/type/ubuntu/service_spec.rb +7 -0
  166. data/spec/type/windows/command_spec.rb +64 -0
  167. data/spec/type/windows/feature_spec.rb +17 -0
  168. data/spec/type/windows/file_spec.rb +121 -0
  169. data/spec/type/windows/group_spec.rb +23 -0
  170. data/spec/type/windows/host_spec.rb +32 -0
  171. data/spec/type/windows/hot_fix_spec.rb +22 -0
  172. data/spec/type/windows/iis_app_pool_spec.rb +17 -0
  173. data/spec/type/windows/iis_webisite_spec.rb +16 -0
  174. data/spec/type/windows/package_spec.rb +10 -0
  175. data/spec/type/windows/port_spec.rb +25 -0
  176. data/spec/type/windows/registry_key_spec.rb +58 -0
  177. data/spec/type/windows/scheduled_task_spec.rb +9 -0
  178. data/spec/type/windows/service_spec.rb +30 -0
  179. data/spec/type/windows/user_spec.rb +33 -0
  180. metadata +400 -0
@@ -0,0 +1,17 @@
1
+ RSpec::Matchers.define :be_reachable do
2
+ match do |host|
3
+ proto = 'tcp'
4
+ timeout = 5
5
+ if @attr
6
+ port = @attr[:port]
7
+ proto = @attr[:proto] if @attr[:proto]
8
+ timeout = @attr[:timeout] if @attr[:timeout]
9
+ end
10
+
11
+ host.reachable?(port, proto, timeout)
12
+ end
13
+
14
+ chain :with do |attr|
15
+ @attr = attr
16
+ end
17
+ end
@@ -0,0 +1,13 @@
1
+ RSpec::Matchers.define :be_readable do
2
+ match do |file|
3
+ file.readable?(@by_whom, @by_user)
4
+ end
5
+
6
+ chain :by do |by_whom|
7
+ @by_whom = by_whom
8
+ end
9
+
10
+ chain :by_user do |by_user|
11
+ @by_user = by_user
12
+ end
13
+ end
@@ -0,0 +1,9 @@
1
+ RSpec::Matchers.define :be_resolvable do
2
+ match do |name|
3
+ name.resolvable?(@type)
4
+ end
5
+
6
+ chain :by do |type|
7
+ @type = type
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ RSpec::Matchers.define :be_running do
2
+ match do |subject|
3
+ if subject.class.name == 'Serverspec::Type::Service'
4
+ subject.running?(@under)
5
+ else
6
+ subject.running?
7
+ end
8
+ end
9
+
10
+ chain :under do |under|
11
+ @under = under
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ RSpec::Matchers.define :be_writable do
2
+ match do |file|
3
+ file.writable?(@by_whom, @by_user)
4
+ end
5
+
6
+ chain :by do |by_whom|
7
+ @by_whom = by_whom
8
+ end
9
+
10
+ chain :by_user do |by_user|
11
+ @by_user = by_user
12
+ end
13
+ end
@@ -0,0 +1,5 @@
1
+ RSpec::Matchers.define :belong_to_group do |group|
2
+ match do |user|
3
+ user.belongs_to_group?(group)
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ RSpec::Matchers.define :belong_to_primary_group do |group|
2
+ match do |user|
3
+ user.belongs_to_primary_group?(group)
4
+ end
5
+ end
@@ -0,0 +1,24 @@
1
+ RSpec::Matchers.define :contain do |pattern|
2
+ match do |file|
3
+ file.contain(pattern, @from, @to)
4
+ end
5
+
6
+ # for contain(pattern).from(/A/).to(/B/)
7
+ chain :from do |from|
8
+ @from = Regexp.new(from).inspect
9
+ end
10
+
11
+ chain :to do |to|
12
+ @to = Regexp.new(to).inspect
13
+ end
14
+
15
+ # for contain(pattern).after(/A/)
16
+ chain :after do |after|
17
+ @from = Regexp.new(after).inspect
18
+ end
19
+
20
+ # for contain(pattern).before(/B/)
21
+ chain :before do |before|
22
+ @to = Regexp.new(before).inspect
23
+ end
24
+ end
@@ -0,0 +1,14 @@
1
+ RSpec::Matchers.define :have_entry do |entry|
2
+ match do |subject|
3
+ if subject.class.name == 'Serverspec::Type::Cron'
4
+ subject.has_entry?(@user, entry)
5
+ elsif subject.respond_to?(:has_entry?)
6
+ subject.has_entry?(entry)
7
+ end
8
+ end
9
+
10
+ # For cron type
11
+ chain :with_user do |user|
12
+ @user = user
13
+ end
14
+ end
@@ -0,0 +1,17 @@
1
+ RSpec::Matchers.define :have_rule do |rule|
2
+ match do |subject|
3
+ if subject.class.name == 'Serverspec::Type::Iptables' || subject.class.name == 'Serverspec::Type::Ip6tables'
4
+ subject.has_rule?(rule, @table, @chain)
5
+ else
6
+ subject.has_rule?(rule)
7
+ end
8
+ end
9
+
10
+ chain :with_table do |table|
11
+ @table = table
12
+ end
13
+
14
+ chain :with_chain do |chain|
15
+ @chain = chain
16
+ end
17
+ end
@@ -0,0 +1,18 @@
1
+ RSpec::Matchers.define :have_site_application do |app|
2
+ match do |subject|
3
+ if subject.class.name == 'Serverspec::Type::IisWebsite'
4
+ subject.has_site_application?(app, @pool, @physical_path)
5
+ else
6
+ className = subject.class.name
7
+ raise "not supported class #{className}"
8
+ end
9
+ end
10
+
11
+ chain :with_pool do |pool|
12
+ @pool = pool
13
+ end
14
+
15
+ chain :with_physical_path do |physical_path|
16
+ @physical_path = physical_path
17
+ end
18
+ end
@@ -0,0 +1,22 @@
1
+ RSpec::Matchers.define :have_site_bindings do |port|
2
+ match do |subject|
3
+ if subject.class.name == 'Serverspec::Type::IisWebsite'
4
+ subject.has_site_bindings?(port, @protocol, @ipaddress, @host_header)
5
+ else
6
+ className = subject.class.name
7
+ raise "not supported class #{className}"
8
+ end
9
+ end
10
+
11
+ chain :with_protocol do |protocol|
12
+ @protocol = protocol
13
+ end
14
+
15
+ chain :with_ipaddress do |ipaddress|
16
+ @ipaddress = ipaddress
17
+ end
18
+
19
+ chain :with_host_header do |host_header|
20
+ @host_header = host_header
21
+ end
22
+ end
@@ -0,0 +1,14 @@
1
+ RSpec::Matchers.define :have_virtual_dir do |vdir|
2
+ match do |subject|
3
+ if subject.class.name == 'Serverspec::Type::IisWebsite'
4
+ subject.has_virtual_dir?(vdir, @path)
5
+ else
6
+ className = subject.class.name
7
+ raise "not supported class #{className}"
8
+ end
9
+ end
10
+
11
+ chain :with_path do |path|
12
+ @path = path
13
+ end
14
+ end
@@ -0,0 +1,333 @@
1
+ require 'fileutils'
2
+ require 'erb'
3
+
4
+ module Serverspec
5
+ class Setup
6
+ def self.run
7
+
8
+ ask_os_type
9
+
10
+ if @os_type == 'UN*X'
11
+ ask_unix_backend
12
+ else
13
+ ask_windows_backend
14
+ end
15
+
16
+ if @backend_type == 'ssh'
17
+ print 'Vagrant instance y/n: '
18
+ @vagrant = $stdin.gets.chomp
19
+ if @vagrant =~ (/(true|t|yes|y|1)$/i)
20
+ @vagrant = true
21
+ print 'Auto-configure Vagrant from Vagrantfile? y/n: '
22
+ auto_config = $stdin.gets.chomp
23
+ if auto_config =~ (/(true|t|yes|y|1)$/i)
24
+ auto_vagrant_configuration
25
+ else
26
+ print('Input vagrant instance name: ')
27
+ @hostname = $stdin.gets.chomp
28
+ end
29
+ else
30
+ @vagrant = false
31
+ print('Input target host name: ')
32
+ @hostname = $stdin.gets.chomp
33
+ end
34
+ elsif @backend_type == 'winrm'
35
+ print('Input target host name: ')
36
+ @hostname = $stdin.gets.chomp
37
+ else
38
+ @hostname = 'localhost'
39
+ end
40
+
41
+ ['spec', "spec/#{@hostname}"].each { |dir| safe_mkdir(dir) }
42
+ safe_create_spec
43
+ safe_create_spec_helper
44
+ safe_create_rakefile
45
+ safe_create_dotrspec
46
+ end
47
+
48
+ def self.ask_os_type
49
+ prompt = <<-EOF
50
+ Select OS type:
51
+
52
+ 1) UN*X
53
+ 2) Windows
54
+
55
+ Select number:
56
+ EOF
57
+
58
+ print prompt.chop
59
+ num = $stdin.gets.to_i - 1
60
+ puts
61
+
62
+ @os_type = ['UN*X', 'Windows'][num] || 'UN*X'
63
+ end
64
+
65
+ def self.ask_unix_backend
66
+ prompt = <<-EOF
67
+ Select a backend type:
68
+
69
+ 1) SSH
70
+ 2) Exec (local)
71
+
72
+ Select number:
73
+ EOF
74
+ print prompt.chop
75
+ num = $stdin.gets.to_i - 1
76
+ puts
77
+
78
+ @backend_type = ['ssh', 'exec'][num] || 'exec'
79
+ end
80
+
81
+ def self.ask_windows_backend
82
+ prompt = <<-EOF
83
+ Select a backend type:
84
+
85
+ 1) WinRM
86
+ 2) Cmd (local)
87
+
88
+ Select number:
89
+ EOF
90
+ print prompt.chop
91
+ num = $stdin.gets.to_i - 1
92
+ puts
93
+
94
+ @backend_type = ['winrm', 'cmd'][num] || 'exec'
95
+ end
96
+
97
+ def self.safe_create_spec
98
+ content = <<-EOF
99
+ require 'spec_helper'
100
+
101
+ describe package('httpd'), :if => os[:family] == 'redhat' do
102
+ it { should be_installed }
103
+ end
104
+
105
+ describe package('apache2'), :if => os[:family] == 'ubuntu' do
106
+ it { should be_installed }
107
+ end
108
+
109
+ describe service('httpd'), :if => os[:family] == 'redhat' do
110
+ it { should be_enabled }
111
+ it { should be_running }
112
+ end
113
+
114
+ describe service('apache2'), :if => os[:family] == 'ubuntu' do
115
+ it { should be_enabled }
116
+ it { should be_running }
117
+ end
118
+
119
+ describe service('org.apache.httpd'), :if => os[:family] == 'darwin' do
120
+ it { should be_enabled }
121
+ it { should be_running }
122
+ end
123
+
124
+ describe port(80) do
125
+ it { should be_listening }
126
+ end
127
+ EOF
128
+
129
+ if File.exists? "spec/#{@hostname}/sample_spec.rb"
130
+ old_content = File.read("spec/#{@hostname}/sample_spec.rb")
131
+ if old_content != content
132
+ $stderr.puts "!! spec/#{@hostname}/sample_spec.rb already exists and differs from template"
133
+ end
134
+ else
135
+ File.open("spec/#{@hostname}/sample_spec.rb", 'w') do |f|
136
+ f.puts content
137
+ end
138
+ puts " + spec/#{@hostname}/sample_spec.rb"
139
+ end
140
+ end
141
+
142
+ def self.safe_mkdir(dir)
143
+ if File.exists? dir
144
+ unless File.directory? dir
145
+ $stderr.puts "!! #{dir} already exists and is not a directory"
146
+ end
147
+ else
148
+ FileUtils.mkdir dir
149
+ puts " + #{dir}/"
150
+ end
151
+ end
152
+
153
+ def self.safe_create_spec_helper
154
+ content = ERB.new(spec_helper_template, nil, '-').result(binding)
155
+ if File.exists? 'spec/spec_helper.rb'
156
+ old_content = File.read('spec/spec_helper.rb')
157
+ if old_content != content
158
+ $stderr.puts "!! spec/spec_helper.rb already exists and differs from template"
159
+ end
160
+ else
161
+ File.open('spec/spec_helper.rb', 'w') do |f|
162
+ f.puts content
163
+ end
164
+ puts ' + spec/spec_helper.rb'
165
+ end
166
+ end
167
+
168
+ def self.safe_create_rakefile
169
+ content = <<-'EOF'
170
+ require 'rake'
171
+ require 'rspec/core/rake_task'
172
+
173
+ task :spec => 'spec:all'
174
+ task :default => :spec
175
+
176
+ namespace :spec do
177
+ targets = []
178
+ Dir.glob('./spec/*').each do |dir|
179
+ next unless File.directory?(dir)
180
+ targets << File.basename(dir)
181
+ end
182
+
183
+ task :all => targets
184
+ task :default => :all
185
+
186
+ targets.each do |target|
187
+ desc "Run serverspec tests to #{target}"
188
+ RSpec::Core::RakeTask.new(target.to_sym) do |t|
189
+ ENV['TARGET_HOST'] = target
190
+ t.pattern = "spec/#{target}/*_spec.rb"
191
+ end
192
+ end
193
+ end
194
+ EOF
195
+ if File.exists? 'Rakefile'
196
+ old_content = File.read('Rakefile')
197
+ if old_content != content
198
+ $stderr.puts '!! Rakefile already exists and differs from template'
199
+ end
200
+ else
201
+ File.open('Rakefile', 'w') do |f|
202
+ f.puts content
203
+ end
204
+ puts ' + Rakefile'
205
+ end
206
+ end
207
+
208
+ def self.find_vagrantfile
209
+ Pathname.new(Dir.pwd).ascend do |dir|
210
+ path = File.expand_path('Vagrantfile', dir)
211
+ return path if File.exists?(path)
212
+ end
213
+ nil
214
+ end
215
+
216
+ def self.auto_vagrant_configuration
217
+ if find_vagrantfile
218
+ vagrant_list = `vagrant status`
219
+ list_of_vms = []
220
+ if vagrant_list != ''
221
+ vagrant_list.each_line do |line|
222
+ if match = /([\w-]+[\s]+)(created|aborted|not created|poweroff|running|saved)[\s](\(virtualbox\)|\(vmware\)|\(vmware_fusion\))/.match(line)
223
+ list_of_vms << match[1].strip!
224
+ end
225
+ end
226
+ if list_of_vms.length == 1
227
+ @hostname = list_of_vms[0]
228
+ else
229
+ list_of_vms.each_with_index { |vm, index | puts "#{index}) #{vm}\n" }
230
+ print 'Choose a VM from the Vagrantfile: '
231
+ chosen_vm = $stdin.gets.chomp
232
+ @hostname = list_of_vms[chosen_vm.to_i]
233
+ end
234
+ else
235
+ $stderr.puts 'Vagrant status error - Check your Vagrantfile or .vagrant'
236
+ exit 1
237
+ end
238
+ else
239
+ $stderr.puts 'Vagrantfile not found in directory!'
240
+ exit 1
241
+ end
242
+ end
243
+
244
+ def self.spec_helper_template
245
+ template = <<-'EOF'
246
+ require 'serverspec'
247
+ <% if @backend_type == 'ssh' -%>
248
+ require 'net/ssh'
249
+ <% end -%>
250
+ <%- if @vagrant -%>
251
+ require 'tempfile'
252
+ <% end -%>
253
+ <% if @backend_type == 'winrm' -%>
254
+ require 'winrm'
255
+ <% end -%>
256
+
257
+ set :backend, :<%= @backend_type %>
258
+
259
+ <% if @os_type == 'UN*X' && @backend_type == 'ssh' -%>
260
+ if ENV['ASK_SUDO_PASSWORD']
261
+ begin
262
+ require 'highline/import'
263
+ rescue LoadError
264
+ fail "highline is not available. Try installing it."
265
+ end
266
+ set :sudo_password, ask("Enter sudo password: ") { |q| q.echo = false }
267
+ else
268
+ set :sudo_password, ENV['SUDO_PASSWORD']
269
+ end
270
+
271
+ <%- if @backend_type == 'ssh' -%>
272
+ host = ENV['TARGET_HOST']
273
+
274
+ <%- if @vagrant -%>
275
+ `vagrant up #{host}`
276
+
277
+ config = Tempfile.new('', Dir.tmpdir)
278
+ `vagrant ssh-config #{host} > #{config.path}`
279
+
280
+ options = Net::SSH::Config.for(host, [config.path])
281
+ <%- else -%>
282
+ options = Net::SSH::Config.for(host)
283
+ <%- end -%>
284
+
285
+ options[:user] ||= Etc.getlogin
286
+
287
+ set :host, options[:host_name] || host
288
+ set :ssh_options, options
289
+
290
+ # Disable sudo
291
+ # set :disable_sudo, true
292
+ <%- end -%>
293
+
294
+
295
+ # Set environment variables
296
+ # set :env, :LANG => 'C', :LC_MESSAGES => 'C'
297
+
298
+ # Set PATH
299
+ # set :path, '/sbin:/usr/local/sbin:$PATH'
300
+ <%- end -%>
301
+ <% if @backend_type == 'winrm'-%>
302
+ user = <username>
303
+ pass = <password>
304
+ endpoint = "http://#{ENV['TARGET_HOST']}:5985/wsman"
305
+
306
+ winrm = ::WinRM::WinRMWebService.new(endpoint, :ssl, :user => user, :pass => pass, :basic_auth_only => true)
307
+ winrm.set_timeout 300 # 5 minutes max timeout for any operation
308
+ Specinfra.configuration.winrm = winrm
309
+ <% end -%>
310
+ EOF
311
+ template
312
+ end
313
+
314
+ def self.safe_create_dotrspec
315
+ content = <<-'EOF'
316
+ --color
317
+ --format documentation
318
+ EOF
319
+ if File.exists? '.rspec'
320
+ old_content = File.read('.rspec')
321
+ if old_content != content
322
+ $stderr.puts '!! .rspec already exists and differs from template'
323
+ end
324
+ else
325
+ File.open('.rspec', 'w') do |f|
326
+ f.puts content
327
+ end
328
+ puts ' + .rspec'
329
+ end
330
+ end
331
+
332
+ end
333
+ end