specinfra 1.27.5 → 2.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
+