lib/chef/provisioning/machine/windows_machine.rb in chef-provisioning-2.0.1 vs lib/chef/provisioning/machine/windows_machine.rb in chef-provisioning-2.0.2

- old
+ new

@@ -1,108 +1,108 @@ -require 'chef/provisioning/machine/basic_machine' - -class Chef -module Provisioning - class Machine - class WindowsMachine < BasicMachine - def initialize(machine_spec, transport, convergence_strategy) - super - end - - # Options include: - # - # command_prefix - prefix to put in front of any command, e.g. sudo - attr_reader :options - - # Delete file - def delete_file(action_handler, path) - if file_exists?(path) - action_handler.perform_action "delete file #{escape(path)} on #{machine_spec.name}" do - transport.execute("Remove-Item #{escape(path)}").error! - end - end - end - - def is_directory?(path) - parse_boolean(transport.execute("Test-Path #{escape(path)} -pathtype container", :read_only => true).stdout) - end - - # Return true or false depending on whether file exists - def file_exists?(path) - parse_boolean(transport.execute("Test-Path #{escape(path)}", :read_only => true).stdout) - end - - def files_different?(path, local_path, content=nil) - if !file_exists?(path) || (local_path && !File.exists?(local_path)) - return true - end - - # Get remote checksum of file (from http://stackoverflow.com/a/13926809) - result = transport.execute(<<-EOM, :read_only => true) -$md5 = [System.Security.Cryptography.MD5]::Create("MD5") -$fd = [System.IO.File]::OpenRead(#{path.inspect}) -$buf = new-object byte[] (1024*1024*8) # 8mb buffer -while (($read_len = $fd.Read($buf,0,$buf.length)) -eq $buf.length){ - $total += $buf.length - $md5.TransformBlock($buf,$offset,$buf.length,$buf,$offset) -} -# finalize the last read -$md5.TransformFinalBlock($buf,0,$read_len) -$hash = $md5.Hash -# convert hash bytes to hex formatted string -$hash | foreach { $hash_txt += $_.ToString("x2") } -$hash_txt -EOM - result.error! - remote_sum = result.stdout.split(' ')[0] - digest = Digest::SHA256.new - if content - digest.update(content) - else - File.open(local_path, 'rb') do |io| - while (buf = io.read(4096)) && buf.length > 0 - digest.update(buf) - end - end - end - remote_sum != digest.hexdigest - end - - def create_dir(action_handler, path) - if !file_exists?(path) - action_handler.perform_action "create directory #{path} on #{machine_spec.name}" do - transport.execute("New-Item #{escape(path)} -Type directory") - end - end - end - - def system_drive - transport.execute('$env:SystemDrive').stdout.strip - end - - # Set file attributes { :owner, :group, :rights } -# def set_attributes(action_handler, path, attributes) -# end - - # Get file attributes { :owner, :group, :rights } -# def get_attributes(path) -# end - - def dirname_on_machine(path) - path.split(/[\\\/]/)[0..-2].join('\\') - end - - def escape(string) - transport.escape(string) - end - - def parse_boolean(string) - if string =~ /^\s*true\s*$/mi - true - else - false - end - end - end - end -end -end +require 'chef/provisioning/machine/basic_machine' + +class Chef +module Provisioning + class Machine + class WindowsMachine < BasicMachine + def initialize(machine_spec, transport, convergence_strategy) + super + end + + # Options include: + # + # command_prefix - prefix to put in front of any command, e.g. sudo + attr_reader :options + + # Delete file + def delete_file(action_handler, path) + if file_exists?(path) + action_handler.perform_action "delete file #{escape(path)} on #{machine_spec.name}" do + transport.execute("Remove-Item #{escape(path)}").error! + end + end + end + + def is_directory?(path) + parse_boolean(transport.execute("Test-Path #{escape(path)} -pathtype container", :read_only => true).stdout) + end + + # Return true or false depending on whether file exists + def file_exists?(path) + parse_boolean(transport.execute("Test-Path #{escape(path)}", :read_only => true).stdout) + end + + def files_different?(path, local_path, content=nil) + if !file_exists?(path) || (local_path && !File.exists?(local_path)) + return true + end + + # Get remote checksum of file (from http://stackoverflow.com/a/13926809) + result = transport.execute(<<-EOM, :read_only => true) +$md5 = [System.Security.Cryptography.MD5]::Create("MD5") +$fd = [System.IO.File]::OpenRead(#{path.inspect}) +$buf = new-object byte[] (1024*1024*8) # 8mb buffer +while (($read_len = $fd.Read($buf,0,$buf.length)) -eq $buf.length){ + $total += $buf.length + $md5.TransformBlock($buf,$offset,$buf.length,$buf,$offset) +} +# finalize the last read +$md5.TransformFinalBlock($buf,0,$read_len) +$hash = $md5.Hash +# convert hash bytes to hex formatted string +$hash | foreach { $hash_txt += $_.ToString("x2") } +$hash_txt +EOM + result.error! + remote_sum = result.stdout.split(' ')[0] + digest = Digest::SHA256.new + if content + digest.update(content) + else + File.open(local_path, 'rb') do |io| + while (buf = io.read(4096)) && buf.length > 0 + digest.update(buf) + end + end + end + remote_sum != digest.hexdigest + end + + def create_dir(action_handler, path) + if !file_exists?(path) + action_handler.perform_action "create directory #{path} on #{machine_spec.name}" do + transport.execute("New-Item #{escape(path)} -Type directory") + end + end + end + + def system_drive + transport.execute('$env:SystemDrive').stdout.strip + end + + # Set file attributes { :owner, :group, :rights } +# def set_attributes(action_handler, path, attributes) +# end + + # Get file attributes { :owner, :group, :rights } +# def get_attributes(path) +# end + + def dirname_on_machine(path) + path.split(/[\\\/]/)[0..-2].join('\\') + end + + def escape(string) + transport.escape(string) + end + + def parse_boolean(string) + if string =~ /^\s*true\s*$/mi + true + else + false + end + end + end + end +end +end