Merge pull request #4271 from Scythril/winrm_mkdir_rm_filter

communicator/winrm: Fixed some WinRM command filters
This commit is contained in:
Mitchell Hashimoto 2014-08-05 17:22:24 -07:00
commit 7aff08f9a1
4 changed files with 68 additions and 8 deletions

View File

@ -11,6 +11,7 @@ module VagrantPlugins
"test",
"uname",
"which",
"mkdir",
]
# Filter the given Vagrant command to ensure compatibility with Windows

View File

@ -0,0 +1,25 @@
module VagrantPlugins
module CommunicatorWinRM
module CommandFilters
# Converts a *nix 'mkdir' command to a PowerShell equivalent
class Mkdir
def filter(command)
# mkdir -p /some/dir
# mkdir /some/dir
cmd_parts = command.strip.split(/\s+/)
dir = cmd_parts.pop
while !dir.nil? && dir.start_with?('-')
dir = cmd_parts.pop
end
# This will ignore any -p switches, which are redundant in PowerShell,
# and ambiguous in PowerShell 4+
return "mkdir #{dir} -force"
end
def accept?(command)
command.start_with?('mkdir ')
end
end
end
end
end

View File

@ -5,14 +5,35 @@ module VagrantPlugins
class Rm
def filter(command)
# rm -Rf /some/dir
# rm -R /some/dir
# rm -R -f /some/dir
# rm -f /some/dir
# rm /some/dir
cmd_parts = command.strip.split(/\s+/)
dir = cmd_parts[1]
if dir == '-Rf'
dir = cmd_parts[2]
return "rm '#{dir}' -recurse -force"
# Figure out if we need to do this recursively
recurse = false
cmd_parts.each do |k|
argument = k.downcase
if argument == '-r' || argument == '-rf' || argument == '-fr'
recurse = true
break
end
end
return "rm '#{dir}' -force"
# Figure out which argument is the path
dir = cmd_parts.pop
while !dir.nil? && dir.start_with?('-')
dir = cmd_parts.pop
end
ret_cmd = ''
if recurse
ret_cmd = "rm #{dir} -recurse -force"
else
ret_cmd = "rm #{dir} -force"
end
return ret_cmd
end
def accept?(command)

View File

@ -52,14 +52,27 @@ describe VagrantPlugins::CommunicatorWinRM::CommandFilter, unit: true do
"if (Test-Path $p) {")
end
it 'filters out rm -Rf commands' do
it 'filters out rm recurse commands' do
expect(subject.filter('rm -Rf /some/dir')).to eq(
"rm '/some/dir' -recurse -force")
"rm /some/dir -recurse -force")
expect(subject.filter('rm -fr /some/dir')).to eq(
"rm /some/dir -recurse -force")
expect(subject.filter('rm -r /some/dir')).to eq(
"rm /some/dir -recurse -force")
end
it 'filters out rm commands' do
expect(subject.filter('rm /some/dir')).to eq(
"rm '/some/dir' -force")
"rm /some/dir -force")
expect(subject.filter('rm -f /some/dir')).to eq(
"rm /some/dir -force")
end
it 'filters out mkdir commands' do
expect(subject.filter('mkdir /some/dir')).to eq(
"mkdir /some/dir -force")
expect(subject.filter('mkdir -p /some/dir')).to eq(
"mkdir /some/dir -force")
end
it 'filters out chown commands' do