Abstract base class for text mode installers. Used by passenger-install-apache2-module and passenger-install-nginx-module.
Subclasses must at least implement the run_steps method which handles the installation itself.
Usage:
installer = ConcereteInstallerClass.new(options...) installer.run
Create an AbstractInstaller. All options will be stored as instance variables, for example:
installer = AbstractInstaller.new(:foo => "bar") installer.instance_variable_get(:"@foo") # => "bar"
# File lib/phusion_passenger/abstract_installer.rb, line 57 def initialize(options = {}) @stdout = STDOUT @stderr = STDERR options.each_pair do |key, value| instance_variable_set(:"@#{key}", value) end end
Start the installation by calling the install! method.
# File lib/phusion_passenger/abstract_installer.rb, line 66 def run before_install run_steps return true rescue Abort puts return false rescue PlatformInfo::RuntimeError => e new_screen puts "<red>An error occurred</red>" puts puts e.message exit 1 ensure after_install end
# File lib/phusion_passenger/abstract_installer.rb, line 105 def after_install STDOUT.write(Utils::AnsiColors::RESET) STDOUT.flush end
# File lib/phusion_passenger/abstract_installer.rb, line 100 def before_install STDOUT.write(Utils::AnsiColors::DEFAULT_TERMINAL_COLOR) STDOUT.flush end
# File lib/phusion_passenger/abstract_installer.rb, line 114 def check_dependencies(show_new_screen = true) new_screen if show_new_screen puts "<banner>Checking for required software...</banner>" puts require 'phusion_passenger/platform_info/depcheck' specs, ids = dependencies runner = PlatformInfo::Depcheck::ConsoleRunner.new specs.each do |spec| PlatformInfo::Depcheck.load(spec) end ids.each do |id| runner.add(id) end if runner.check_all return true else puts puts "<red>Some required software is not installed.</red>" puts "But don't worry, this installer will tell you how to install them.\n" puts "<b>Press Enter to continue, or Ctrl-C to abort.</b>" if PhusionPassenger.originally_packaged? wait else wait(10) end line puts puts "<banner>Installation instructions for required software</banner>" puts runner.missing_dependencies.each do |dep| puts " * To install <yellow>#{dep.name}</yellow>:" puts " #{dep.install_instructions}" puts end if respond_to?(:users_guide) puts "If the aforementioned instructions didn't solve your problem, then please take" puts "a look at the Users Guide:" puts puts " <yellow>#{users_guide}</yellow>" end return false end end
# File lib/phusion_passenger/abstract_installer.rb, line 162 def check_whether_os_is_broken # No known broken OSes at the moment. end
# File lib/phusion_passenger/abstract_installer.rb, line 166 def check_whether_system_has_enough_ram(required = 1024) begin meminfo = File.read("/proc/meminfo") if meminfo =~ /^MemTotal: *(\d+) kB$/ ram_mb = $1.to_i / 1024 if meminfo =~ /^SwapTotal: *(\d+) kB$/ swap_mb = $1.to_i / 1024 else swap_mb = 0 end end rescue Errno::ENOENT, Errno::EACCES # Don't do anything on systems without memory information. ram_mb = nil swap_mb = nil end if ram_mb && swap_mb && ram_mb + swap_mb < required new_screen render_template 'installer_common/low_amount_of_memory_warning', :required => required, :current => ram_mb + swap_mb, :ram => ram_mb, :swap => swap_mb, :doc => users_guide wait end end
# File lib/phusion_passenger/abstract_installer.rb, line 110 def dependencies return [[], []] end
# File lib/phusion_passenger/abstract_installer.rb, line 341 def download(url, output, options = {}) if options[:use_cache] && cache_dir = PhusionPassenger.download_cache_dir basename = url.sub(/.*\//, '') if File.exist?("#{cache_dir}/#{basename}") puts "Copying #{basename} from #{cache_dir}..." FileUtils.cp("#{cache_dir}/#{basename}", output) return true end end args = [] if PlatformInfo.find_command("wget") if options[:cacert] args << "--ca-certificate=#{options[:cacert]}" end return sh("wget", "--tries=3", "-O", output, url, *args) else if options[:cacert] args << "--cacert" args << options[:cacert] end return sh("curl", url, "-f", "-L", "-o", output, *args) end end
# File lib/phusion_passenger/abstract_installer.rb, line 91 def interactive? return !@auto end
# File lib/phusion_passenger/abstract_installer.rb, line 234 def line puts "--------------------------------------------" end
# File lib/phusion_passenger/abstract_installer.rb, line 228 def new_screen puts line puts end
# File lib/phusion_passenger/abstract_installer.rb, line 95 def non_interactive? return !interactive? end
# File lib/phusion_passenger/abstract_installer.rb, line 205 def print(text) @stdout.write(Utils::AnsiColors.ansi_colorize(text)) @stdout.flush end
# File lib/phusion_passenger/abstract_installer.rb, line 238 def prompt(message, default_value = nil) done = false while !done print "#{message}: " if non_interactive? && default_value puts default_value return default_value end begin result = STDIN.readline rescue EOFError exit 2 end result.strip! if result.empty? if default_value result = default_value done = true else done = !block_given? || yield(result) end else done = !block_given? || yield(result) end end return result rescue Interrupt raise Abort end
# File lib/phusion_passenger/abstract_installer.rb, line 270 def prompt_confirmation(message) result = prompt("#{message} [y/n]") do |value| if value.downcase == 'y' || value.downcase == 'n' true else puts_error "Invalid input '#{value}'; please enter either 'y' or 'n'." false end end return result.downcase == 'y' rescue Interrupt raise Abort end
# File lib/phusion_passenger/abstract_installer.rb, line 210 def puts(text = nil) if text @stdout.puts(Utils::AnsiColors.ansi_colorize(text)) else @stdout.puts end @stdout.flush end
# File lib/phusion_passenger/abstract_installer.rb, line 219 def puts_error(text) @stderr.puts(Utils::AnsiColors.ansi_colorize("<red>#{text}</red>")) @stderr.flush end
# File lib/phusion_passenger/abstract_installer.rb, line 323 def rake(*args) require 'phusion_passenger/platform_info/ruby' if !PlatformInfo.rake_command puts_error 'Cannot find Rake.' raise Abort end sh("#{PlatformInfo.rake_command} #{args.join(' ')}") end
# File lib/phusion_passenger/abstract_installer.rb, line 332 def rake!(*args) require 'phusion_passenger/platform_info/ruby' if !PlatformInfo.rake_command puts_error 'Cannot find Rake.' raise Abort end sh!("#{PlatformInfo.rake_command} #{args.join(' ')}") end
# File lib/phusion_passenger/abstract_installer.rb, line 224 def render_template(name, options = {}) puts ConsoleTextTemplate.new({ :file => name }, options).result end
# File lib/phusion_passenger/abstract_installer.rb, line 304 def sh(*args) puts "# #{args.join(' ')}" result = system(*args) if result return true elsif $?.signaled? && $?.termsig == Signal.list["INT"] raise Interrupt else return false end end
# File lib/phusion_passenger/abstract_installer.rb, line 316 def sh!(*args) if !sh(*args) puts_error "*** Command failed: #{args.join(' ')}" raise CommandError end end
# File lib/phusion_passenger/abstract_installer.rb, line 195 def use_stderr old_stdout = @stdout begin @stdout = STDERR yield ensure @stdout = old_stdout end end
# File lib/phusion_passenger/abstract_installer.rb, line 284 def wait(timeout = nil) if interactive? if timeout require 'timeout' unless defined?(Timeout) begin Timeout.timeout(timeout) do STDIN.readline end rescue Timeout::Error # Do nothing. end else STDIN.readline end end rescue Interrupt raise Abort end
Generated with the Darkfish Rdoc Generator 2.