require 'rubygems' require 'rake' require 'mkmf' desc "Building event log dll" def ensure_present(commands) commands.each do |c| unless find_executable c warn "Could not find #{c}. Windows Event Logging will not correctly function." end end end EVT_MC_FILE = 'chef-log.man' EVT_RC_FILE = 'chef-log.rc' EVT_RESOURCE_OBJECT = 'resource.o' EVT_SHARED_OBJECT = 'chef-log.dll' MC = 'windmc' RC = 'windres' CC = 'gcc' ensure_present [MC, RC, CC] task :build => [EVT_RESOURCE_OBJECT, EVT_SHARED_OBJECT] task :default => [:build, :register] file EVT_RC_FILE=> EVT_MC_FILE do sh "#{MC} #{EVT_MC_FILE}" end file EVT_RESOURCE_OBJECT => EVT_RC_FILE do sh "#{RC} -i #{EVT_RC_FILE} -o #{EVT_RESOURCE_OBJECT}" end file EVT_SHARED_OBJECT => EVT_RESOURCE_OBJECT do sh "#{CC} -o #{EVT_SHARED_OBJECT} -shared #{EVT_RESOURCE_OBJECT}" end task :register => EVT_SHARED_OBJECT do require 'win32/eventlog' dll_file = File.expand_path(EVT_SHARED_OBJECT) begin Win32::EventLog.add_event_source( :source => "Application", :key_name => "Chef", :event_message_file => dll_file, :category_message_file => dll_file ) rescue Errno::EIO => e puts "Skipping event log registration due to missing privileges: #{e}" end end