specinfra 1.27.5 → 2.0.0.beta1

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.
@@ -28,7 +28,7 @@ module SpecInfra
28
28
  end
29
29
 
30
30
  def check_cron_entry(user, entry)
31
- entry_escaped = entry.gsub(/\*/, '\\*').gsub(/\[/, '\\[').gsub(/\]/, '\\]')
31
+ entry_escaped = entry.gsub(/\*/, '\\*')
32
32
  if user.nil?
33
33
  "crontab -l | grep -- #{escape(entry_escaped)}"
34
34
  else
@@ -76,10 +76,9 @@ module SpecInfra
76
76
  from ||= '1'
77
77
  to ||= '$'
78
78
  sed = "sed -n #{escape(from)},#{escape(to)}p #{escape(file)}"
79
- sed_end = "sed -n 1,#{escape(to)}p"
80
79
  checker_with_regexp = check_file_contain_with_regexp("/dev/stdin", expected_pattern)
81
80
  checker_with_fixed = check_file_contain_with_fixed_strings("/dev/stdin", expected_pattern)
82
- "#{sed} | #{sed_end} | #{checker_with_regexp}|| #{sed} | #{sed_end} | #{checker_with_fixed}"
81
+ "#{sed} | #{checker_with_regexp} || #{sed} | #{checker_with_fixed}"
83
82
  end
84
83
 
85
84
  def check_belonging_group(user, group)
@@ -4,20 +4,6 @@ module SpecInfra
4
4
  def check_running(service)
5
5
  "service #{escape(service)} status && service #{escape(service)} status | grep 'running'"
6
6
  end
7
-
8
- def check_ppa(package)
9
- %Q{find /etc/apt/ -name \*.list | xargs grep -o "deb +http://ppa.launchpad.net/#{to_apt_line_uri(package)}"}
10
- end
11
-
12
- def check_ppa_enabled(package)
13
- %Q{find /etc/apt/ -name \*.list | xargs grep -o "^deb +http://ppa.launchpad.net/#{to_apt_line_uri(package)}"}
14
- end
15
-
16
- private
17
-
18
- def to_apt_line_uri(repo)
19
- escape(repo.gsub(/^ppa:/,''))
20
- end
21
7
  end
22
8
  end
23
9
  end
@@ -53,7 +53,7 @@ module SpecInfra
53
53
 
54
54
  def check_file_contain(file, pattern)
55
55
  Backend::PowerShell::Command.new do
56
- exec %Q![[Io.File]::ReadAllText("#{file}") -match '#{convert_regexp(pattern)}'!
56
+ exec "[Io.File]::ReadAllText('#{file}') -match '#{convert_regexp(pattern)}'"
57
57
  end
58
58
  end
59
59
 
@@ -62,12 +62,12 @@ module SpecInfra
62
62
  to ||= '$'
63
63
  Backend::PowerShell::Command.new do
64
64
  using 'crop_text.ps1'
65
- exec %Q!(CropText -text ([Io.File]::ReadAllText("#{file}")) -fromPattern '#{convert_regexp(from)}' -toPattern '#{convert_regexp(to)}') -match '#{pattern}'!
65
+ exec %Q[(CropText -text ([Io.File]::ReadAllText('#{file}')) -fromPattern '#{convert_regexp(from)}' -toPattern '#{convert_regexp(to)}') -match '#{pattern}']
66
66
  end
67
67
  end
68
68
 
69
69
  def get_file_content(file)
70
- %Q![Io.File]::ReadAllText("#{file}")!
70
+ "[Io.File]::ReadAllText('#{file}')"
71
71
  end
72
72
 
73
73
  def check_access_by_user(file, user, access)
@@ -290,27 +290,6 @@ module SpecInfra
290
290
  exec "[System.Environment]::ExpandEnvironmentVariables( ( FindIISWebsite -name '#{name}' ).physicalPath ).replace('\\', '/' ) -eq ('#{path}'.trimEnd('/').replace('\\', '/'))"
291
291
  end
292
292
  end
293
-
294
- def check_iis_website_binding(name, port, protocol, ipAddress, hostHeader)
295
- Backend::PowerShell::Command.new do
296
- using 'find_iis_component.ps1'
297
- exec "(FindSiteBindings -name '#{name}' -protocol '#{protocol}' -hostHeader '#{hostHeader}' -port #{port} -ipAddress '#{ipAddress}').count -gt 0"
298
- end
299
- end
300
-
301
- def check_iis_website_virtual_dir(name, vdir, path)
302
- Backend::PowerShell::Command.new do
303
- using 'find_iis_component.ps1'
304
- exec "(FindSiteVirtualDir -name '#{name}' -vdir '#{vdir}' -path '#{path}') -eq $true"
305
- end
306
- end
307
-
308
- def check_iis_website_application(name, app, pool, physicalPath)
309
- Backend::PowerShell::Command.new do
310
- using 'find_iis_component.ps1'
311
- exec "(FindSiteApplication -name '#{name}' -app '#{app}' -pool '#{pool}' -physicalPath '#{physicalPath}') -eq $true"
312
- end
313
- end
314
293
 
315
294
  def check_iis_app_pool(name)
316
295
  Backend::PowerShell::Command.new do
@@ -326,66 +305,10 @@ module SpecInfra
326
305
  end
327
306
  end
328
307
 
329
- def check_32bit_enabled(name)
330
- Backend::PowerShell::Command.new do
331
- using 'find_iis_component.ps1'
332
- exec "(FindIISAppPool -name '#{name}').enable32BitAppOnWin64 -eq $true"
333
- end
334
- end
335
-
336
- def check_managed_pipeline_mode(name, mode)
337
- Backend::PowerShell::Command.new do
338
- using 'find_iis_component.ps1'
339
- exec "(FindIISAppPool -name '#{name}').managedPipelineMode -eq '#{mode}'"
340
- end
341
- end
342
-
343
- def check_idle_timeout(name, minutes)
344
- Backend::PowerShell::Command.new do
345
- using 'find_iis_component.ps1'
346
- exec "(FindIISAppPool -name '#{name}').processModel.idleTimeout.Minutes -eq #{minutes}"
347
- end
348
- end
349
-
350
- def check_identity_type(name, type)
351
- Backend::PowerShell::Command.new do
352
- using 'find_iis_component.ps1'
353
- exec "(FindIISAppPool -name '#{name}').processModel.identityType -eq '#{type}'"
354
- end
355
- end
356
-
357
- def check_user_profile(name)
358
- Backend::PowerShell::Command.new do
359
- using 'find_iis_component.ps1'
360
- exec "(FindIISAppPool -name '#{name}').processModel.loadUserProfile -eq $true"
361
- end
362
- end
363
-
364
- def check_username(name, username)
365
- Backend::PowerShell::Command.new do
366
- using 'find_iis_component.ps1'
367
- exec "(FindIISAppPool -name '#{name}').processModel.username -eq '#{username}'"
368
- end
369
- end
370
-
371
- def check_periodic_restart(name, minutes)
372
- Backend::PowerShell::Command.new do
373
- using 'find_iis_component.ps1'
374
- exec "(FindIISAppPool -name '#{name}').recycling.periodicRestart.time.TotalMinutes -eq #{minutes}"
375
- end
376
- end
377
-
378
- def check_scheduled_task(name)
379
- Backend::PowerShell::Command.new do
380
- using 'find_scheduled_task.ps1'
381
- exec "(FindScheduledTask -name '#{name}').TaskName -eq '\\#{name}'"
382
- end
383
- end
384
-
385
308
  private
386
309
 
387
310
  def item_has_attribute item, attribute
388
- %Q!((Get-Item -Path "#{item}" -Force).attributes.ToString() -Split ', ') -contains '#{attribute}'!
311
+ "((Get-Item -Path '#{item}' -Force).attributes.ToString() -Split ', ') -contains '#{attribute}'"
389
312
  end
390
313
 
391
314
  def convert_key_property_value property
@@ -8,11 +8,7 @@ require "specinfra/command/ubuntu"
8
8
  require "specinfra/command/gentoo"
9
9
  require "specinfra/command/plamo"
10
10
  require "specinfra/command/redhat"
11
- require "specinfra/command/redhat7"
12
11
  require "specinfra/command/suse"
13
- require "specinfra/command/opensuse"
14
- require "specinfra/command/fedora"
15
- require "specinfra/command/nixos"
16
12
 
17
13
  # Solaris
18
14
  require "specinfra/command/solaris"
@@ -3,6 +3,7 @@ module SpecInfra
3
3
  class << self
4
4
  VALID_OPTIONS_KEYS = [
5
5
  :path,
6
+ :shell,
6
7
  :pre_command,
7
8
  :stdout,
8
9
  :stderr,
@@ -19,15 +20,6 @@ module SpecInfra
19
20
  VALID_OPTIONS_KEYS.inject({}) { |o, k| o.merge!(k => send(k)) }
20
21
  end
21
22
 
22
- # Define os method explicitly to avoid stack level
23
- # too deep caused by Helpet::DetectOS#os
24
- def os
25
- if @os.nil? && defined?(RSpec) && RSpec.configuration.respond_to?(:os)
26
- @os = RSpec.configuration.os
27
- end
28
- @os
29
- end
30
-
31
23
  def method_missing(meth, val=nil)
32
24
  key = meth.to_s
33
25
  key.gsub!(/=$/, '')
@@ -2,34 +2,18 @@ module SpecInfra
2
2
  module Helper
3
3
  module DetectOS
4
4
  def commands
5
- self.class.const_get('SpecInfra').const_get('Command').const_get(os[:family]).new
6
- end
7
-
8
- def os
9
5
  property[:os_by_host] = {} if ! property[:os_by_host]
10
- host_port = current_host_and_port
6
+ host = SpecInfra.configuration.ssh ? SpecInfra.configuration.ssh.host : 'localhost'
11
7
 
12
- if property[:os_by_host][host_port]
13
- os_by_host = property[:os_by_host][host_port]
8
+ if property[:os_by_host][host]
9
+ os = property[:os_by_host][host]
14
10
  else
15
11
  # Set command object explicitly to avoid `stack too deep`
16
- os_by_host = backend(SpecInfra::Command::Base.new).check_os
17
- property[:os_by_host][host_port] = os_by_host
18
- end
19
-
20
- os_by_host
21
- end
22
-
23
- private
24
-
25
- # put this in a module for better reuse
26
- def current_host_and_port
27
- if SpecInfra.configuration.ssh
28
- [SpecInfra.configuration.ssh.host, SpecInfra.configuration.ssh.options[:port]]
29
- else
30
- ['localhost', nil]
12
+ os = backend(SpecInfra::Command::Base.new).check_os
13
+ property[:os_by_host][host] = os
31
14
  end
15
+ self.class.const_get('SpecInfra').const_get('Command').const_get(os[:family]).new
32
16
  end
33
17
  end
34
18
  end
35
- end
19
+ end
@@ -6,17 +6,13 @@ module SpecInfra
6
6
  'Arch',
7
7
  'Darwin',
8
8
  'Debian',
9
- 'Fedora',
10
9
  'FreeBSD',
11
10
  'FreeBSD10',
12
11
  'Gentoo',
13
- 'NixOS',
14
12
  'OpenBSD',
15
13
  'Plamo',
16
14
  'RedHat',
17
- 'RedHat7',
18
15
  'SuSE',
19
- 'OpenSUSE',
20
16
  'SmartOS',
21
17
  'Solaris',
22
18
  'Solaris10',
@@ -1,3 +1,3 @@
1
1
  module SpecInfra
2
- VERSION = "1.27.5"
2
+ VERSION = "2.0.0.beta1"
3
3
  end
@@ -2,31 +2,74 @@ require 'spec_helper'
2
2
 
3
3
  include SpecInfra::Helper::Exec
4
4
 
5
- describe 'build command with path' do
6
- before :each do
7
- RSpec.configure do |c|
8
- c.path = '/sbin:/usr/sbin'
5
+ describe SpecInfra::Backend::Exec do
6
+ describe '#build_command' do
7
+ context 'with simple command' do
8
+ it 'should escape spaces' do
9
+ expect(backend.build_command('test -f /etc/passwd')).to eq '/bin/sh -c test\ -f\ /etc/passwd'
10
+ end
9
11
  end
10
- end
11
12
 
12
- context 'command pattern 1' do
13
- subject { backend.build_command('test -f /etc/passwd') }
14
- it { should eq 'env PATH=/sbin:/usr/sbin:$PATH test -f /etc/passwd' }
15
- end
13
+ context 'with complex command' do
14
+ it 'should escape special chars' do
15
+ expect(backend.build_command('test ! -f /etc/selinux/config || (getenforce | grep -i -- disabled && grep -i -- ^SELINUX=disabled$ /etc/selinux/config)')).to eq '/bin/sh -c test\ \!\ -f\ /etc/selinux/config\ \|\|\ \(getenforce\ \|\ grep\ -i\ --\ disabled\ \&\&\ grep\ -i\ --\ \^SELINUX\=disabled\$\ /etc/selinux/config\)'
16
+ end
17
+ end
16
18
 
17
- context 'command pattern 2' do
18
- subject { backend.build_command('test ! -f /etc/selinux/config || (getenforce | grep -i -- disabled && grep -i -- ^SELINUX=disabled$ /etc/selinux/config)') }
19
- it { should eq 'env PATH=/sbin:/usr/sbin:$PATH test ! -f /etc/selinux/config || (env PATH=/sbin:/usr/sbin:$PATH getenforce | grep -i -- disabled && env PATH=/sbin:/usr/sbin:$PATH grep -i -- ^SELINUX=disabled$ /etc/selinux/config)' }
20
- end
19
+ context 'with custom shell' do
20
+ before do
21
+ RSpec.configure {|c| c.shell = '/usr/local/bin/tcsh' }
22
+ end
21
23
 
22
- context 'command pattern 3' do
23
- subject { backend.build_command("dpkg -s apache2 && ! dpkg -s apache2 | grep -E '^Status: .+ not-installed$'") }
24
- it { should eq "env PATH=/sbin:/usr/sbin:$PATH dpkg -s apache2 && ! env PATH=/sbin:/usr/sbin:$PATH dpkg -s apache2 | grep -E '^Status: .+ not-installed$'" }
25
- end
24
+ after do
25
+ RSpec.configure {|c| c.shell = nil }
26
+ end
27
+
28
+ it 'should use custom shell' do
29
+ expect(backend.build_command('test -f /etc/passwd')).to eq '/usr/local/bin/tcsh -c test\ -f\ /etc/passwd'
30
+ end
31
+ end
32
+
33
+ context 'with custom shell that needs escaping' do
34
+ before do
35
+ RSpec.configure {|c| c.shell = '/usr/test & spec/bin/sh' }
36
+ end
37
+
38
+ after do
39
+ RSpec.configure {|c| c.shell = nil }
40
+ end
41
+
42
+ it 'should use custom shell' do
43
+ expect(backend.build_command('test -f /etc/passwd')).to eq '/usr/test\ \&\ spec/bin/sh -c test\ -f\ /etc/passwd'
44
+ end
45
+ end
26
46
 
27
- after :each do
28
- RSpec.configure do |c|
29
- c.path = nil
47
+ context 'with custom path' do
48
+ before do
49
+ RSpec.configure {|c| c.path = '/opt/bin:/opt/foo/bin' }
50
+ end
51
+
52
+ after do
53
+ RSpec.configure {|c| c.path = nil }
54
+ end
55
+
56
+ it 'should use custom path' do
57
+ expect(backend.build_command('test -f /etc/passwd')).to eq 'env PATH=/opt/bin:/opt/foo/bin:"$PATH" /bin/sh -c test\ -f\ /etc/passwd'
58
+ end
59
+ end
60
+
61
+ context 'with custom path that needs escaping' do
62
+ before do
63
+ RSpec.configure {|c| c.path = '/opt/bin:/opt/test & spec/bin' }
64
+ end
65
+
66
+ after do
67
+ RSpec.configure {|c| c.path = nil }
68
+ end
69
+
70
+ it 'should use custom path' do
71
+ expect(backend.build_command('test -f /etc/passwd')).to eq 'env PATH=/opt/bin:/opt/test\ \&\ spec/bin:"$PATH" /bin/sh -c test\ -f\ /etc/passwd'
72
+ end
30
73
  end
31
74
  end
32
75
  end
@@ -35,61 +78,57 @@ describe 'check_os' do
35
78
  context 'test ubuntu with lsb_release command' do
36
79
  subject { backend.check_os }
37
80
  it do
81
+ mock_success_response = double(
82
+ :run_command_response,
83
+ :success? => true,
84
+ :stdout => "Distributor ID:\tUbuntu\nRelease:\t12.04\n"
85
+ )
86
+ mock_failure_response = double :run_command_response, :success? => false
38
87
  backend.should_receive(:run_command).at_least(1).times do |args|
39
88
  if ['ls /etc/debian_version', 'lsb_release -ir'].include? args
40
- double(
41
- :run_command_response,
42
- :success? => true,
43
- :stdout => "Distributor ID:\tUbuntu\nRelease:\t12.04\n"
44
- )
45
- elsif args == 'uname -m'
46
- double :run_command_response, :success? => true, :stdout => "x86_64\n"
89
+ mock_success_response
47
90
  else
48
- double :run_command_response, :success? => false
91
+ mock_failure_response
49
92
  end
50
93
  end
51
- should eq({:family => 'Ubuntu', :release => '12.04', :arch => 'x86_64' })
94
+ should eq({:family => 'Ubuntu', :release => '12.04'})
52
95
  end
53
96
  end
54
97
 
55
98
  context 'test ubuntu with /etc/lsb-release' do
56
99
  subject { backend.check_os }
57
100
  it do
58
- backend.should_receive(:run_command).at_least(1).times do |args|
59
- if ['ls /etc/debian_version', 'cat /etc/lsb-release'].include? args
60
- double(
61
- :run_command_response,
62
- :success? => true,
63
- :stdout => <<-EOF
64
- DISTRIB_ID=Ubuntu
101
+ mock_success_response = double(
102
+ :run_command_response,
103
+ :success? => true,
104
+ :stdout => %Q(DISTRIB_ID=Ubuntu
65
105
  DISTRIB_RELEASE=12.04
66
106
  DISTRIB_CODENAME=precise
67
107
  DISTRIB_DESCRIPTION="Ubuntu 12.04.2 LTS"
68
- EOF
69
- )
70
- elsif args == 'uname -m'
71
- double :run_command_response, :success? => true, :stdout => "x86_64\n"
108
+ )
109
+ )
110
+ mock_failure_response = double :run_command_response, :success? => false
111
+ backend.should_receive(:run_command).at_least(1).times do |args|
112
+ if ['ls /etc/debian_version', 'cat /etc/lsb-release'].include? args
113
+ mock_success_response
72
114
  else
73
- double :run_command_response, :success? => false
115
+ mock_failure_response
74
116
  end
75
117
  end
76
- should eq({:family => 'Ubuntu', :release => '12.04', :arch => 'x86_64' })
118
+ should eq({:family => 'Ubuntu', :release => '12.04'})
77
119
  end
78
120
  end
79
121
 
80
122
  context 'test debian (no lsb_release or lsb-release)' do
81
123
  subject { backend.check_os }
82
124
  it do
125
+ mock_success_response = double :run_command_response, :success? => true
126
+ mock_failure_response = double :run_command_response, :success? => false
83
127
  backend.should_receive(:run_command).at_least(1).times do |args|
84
- if args == 'ls /etc/debian_version'
85
- double :run_command_response, :success? => true
86
- elsif args == 'uname -m'
87
- double :run_command_response, :success? => true, :stdout => "x86_64\n"
88
- else
89
- double :run_command_response, :success? => false
90
- end
128
+ args == 'ls /etc/debian_version' ? mock_success_response : mock_failure_response
91
129
  end
92
- should eq({:family => 'Debian', :release => nil, :arch => 'x86_64' })
130
+ should eq({:family => 'Debian', :release => nil})
93
131
  end
94
132
  end
95
133
  end
134
+