lib/instance_agent/platform/windows_util.rb
require 'archive/tar/minitar'
require 'zlib'
include Archive::Tar
module InstanceAgent
class WindowsUtil
def self.supported_versions()
[0.0]
end
def self.supported_oses()
['windows']
end
def self.prepare_script_command(script, absolute_path)
script_command = absolute_path
if (absolute_path.downcase.end_with?('.ps1'))
script_command = 'powershell.exe -ExecutionPolicy Bypass -File ' + absolute_path
end
script_command
end
def self.quit(exit_status = 1)
exit(exit_status)
end
# end_with?() gives false for powershell scripts and ignores PATHEXT env variable
def self.script_executable?(path)
File.executable?(path) || path.downcase.end_with?('.ps1')
end
def self.extract_tar(bundle_file, dst)
log(:warn, "Bundle format 'tar' not supported on Windows platforms. Bundle unpack may fail.")
Minitar.unpack(bundle_file, dst)
end
def self.extract_tgz(bundle_file, dst)
log(:warn, "Bundle format 'tgz' not supported on Windows platforms. Bundle unpack may fail.")
compressed = Zlib::GzipReader.open(bundle_file)
Minitar.unpack(compressed, dst)
end
def self.extract_zip(bundle_file, dst)
log(:debug, "extract_zip - dst : #{dst}")
FileUtils.mkdir_p(dst)
working_dir = FileUtils.pwd()
absolute_bundle_path = File.expand_path(bundle_file)
execute_zip_command("powershell [System.Reflection.Assembly]::LoadWithPartialName(‘System.IO.Compression.FileSystem’); [System.IO.Compression.ZipFile]::ExtractToDirectory(‘#{absolute_bundle_path}’, ‘#{dst}’)")
end
def self.supports_process_groups?()
false
end
def self.codedeploy_version_file
ProcessManager::Config.config[:root_dir]
end
def self.fallback_version_file
File.join(ENV['PROGRAMDATA'], "Amazon/CodeDeploy")
end
# shelling out the rm folder command to native os in this case Window.
def self.delete_dirs_command(dirs_to_delete)
log(:debug,"Dirs to delete: #{dirs_to_delete}");
for dir in dirs_to_delete do
log(:debug,"Deleting dir: #{dir}");
delete_folder(dir);
end
end
private
def self.delete_folder (dir)
if dir != nil && dir != "/"
output = `rd /s /q "#{dir}" 2>&1`
exit_status = $?.exitstatus
log(:debug, "Command status: #{$?}")
log(:debug, "Command output: #{output}")
unless exit_status == 0
msg = "Error deleting directories: #{exit_status}"
log(:error, msg)
raise msg
end
else
log(:debug, "Empty directory or a wrong directory passed,#{dir}");
end
end
private
def self.execute_zip_command(cmd)
log(:debug, "Executing #{cmd}")
output = `#{cmd} 2>&1`
exit_status = $?.exitstatus
log(:debug, "Command status: #{$?}")
log(:debug, "Command output: #{output}")
if exit_status != 0
msg = "Error extracting zip archive: #{exit_status}"
log(:error, msg)
raise msg
end
end
private
def self.log(severity, message)
raise ArgumentError, "Unknown severity #{severity.inspect}" unless InstanceAgent::Log::SEVERITIES.include?(severity.to_s)
InstanceAgent::Log.send(severity.to_sym, "#{self.to_s}: #{message}")
end
end
end