# -*- coding: binary -*- # # Provides some sanity checks against the ruby build and version # # Check for the broken pack/unpack in OS X 10.4.x if ([1].pack('n') == "\x01\x00") $stderr.puts "*** This ruby build has a broken pack/unpack implementation! " if (RUBY_PLATFORM =~ /darwin/) $stderr.puts " Apple shipped a broken version of ruby with the 10.4.x " $stderr.puts " release. Please install ruby from source, or use one of " $stderr.puts " the free package managers to obtain a working ruby build." end exit(0) end # Check for ruby 1.8.2 as the minimal supported version if (RUBY_VERSION =~ /^1\.[0-7]\./ or RUBY_VERSION =~ /^1\.8\.[0-1]$/) $stderr.puts "*** This version of ruby is not supported, please upgrade to 1.8.7+" exit(0) end # Check for ruby 1.9.0 and throw a big nasty warning if (RUBY_VERSION =~ /^1\.9\.0/) $stderr.puts "*** Ruby 1.9.0 is not supported, please upgrade to Ruby 1.9.3 or newer." exit(0) end # Check for ruby 1.9.1 and throw a warning if (RUBY_VERSION =~ /^1\.9\.1/) $stderr.puts "*** Ruby 1.9.1 is not supported, please upgrade to Ruby 1.9.3 or newer." end if(RUBY_VERSION =~ /^(1\.9|2\.0)\./) # Load rubygems before changing default_internal, otherwise we may get # Encoding::UndefinedConversionError as the gemspec files are loaded require 'rubygems' Gem::Version # trigger Rubygems to fully load # Force binary encoding for Ruby versions that support it if(Object.const_defined?('Encoding') and Encoding.respond_to?('default_external=')) Encoding.default_external = Encoding.default_internal = "binary" end end if(RUBY_PLATFORM == 'java') require 'socket' s = Socket.new(::Socket::AF_INET, ::Socket::SOCK_STREAM, ::Socket::IPPROTO_TCP) if(not s.respond_to?('bind')) $stderr.puts "*** JRuby 1.5.0+ is required to use Metasploit with jRuby" exit(0) end $stderr.puts "*** Warning: JRuby support is still incomplete, few things will work properly!" trap Signal::list['INT'] do Thread.main.raise Interrupt.new end s.close end # Check for OpenSSL and print a warning if it is not installed begin require 'openssl' rescue ::LoadError $stderr.puts "*** The ruby-openssl library is not installed, many features will be disabled!" $stderr.puts "*** Examples: Meterpreter, SSL Sockets, SMB/NTLM Authentication, and more" end # # Check for the ugly 1.8.7 short-named constants bug # class ConstBugTestA Const = 'A' def test Const == 'A' end end ConstBugTestC = ConstBugTestA.dup class ConstBugTestB < ConstBugTestC Const = 'B' end def ruby_187_const_bug bugged = false begin ConstBugTestA.new.test() ConstBugTestB.new.test() rescue ::NameError bugged = true end bugged end if(ruby_187_const_bug()) $stderr.puts "" $stderr.puts "***********************************************************************" $stderr.puts "*** *" $stderr.puts "*** This version of the Ruby interpreter contains a serious bug *" $stderr.puts "*** related to short-named constants, we strongly recommend that you *" $stderr.puts "*** switch to a fixed version. Unfortunately, some Linux distros have *" $stderr.puts "*** backported the buggy patch into 1.8.6, so you may need to contact *" $stderr.puts "*** your vendor and ask them to review the URL below. *" $stderr.puts "*** *" $stderr.puts "*** Alternatively, you can download, build, and install the latest *" $stderr.puts "*** stable snapshot of Ruby from the following URL: *" $stderr.puts "*** - http://www.ruby-lang.org/ *" $stderr.puts "*** *" $stderr.puts "*** For more information, please see the following URL: *" $stderr.puts "*** - https://bugs.launchpad.net/bugs/282302 *" $stderr.puts "*** *" $stderr.puts "***********************************************************************" $stderr.puts "" end