Abstract base class for text mode installers. Used by passenger-install-apache2-module and passenger-install-nginx-module.
Subclasses must at least implement the install! method which handles the installation itself.
Usage:
installer = ConcereteInstallerClass.new(options...) installer.start
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 54 def initialize(options = {}) 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 61 def start before_install install! rescue PlatformInfo::RuntimeError => e new_screen color_puts "<red>An error occurred</red>" puts puts e.message exit 1 ensure after_install end
# File lib/phusion_passenger/abstract_installer.rb, line 79 def after_install # Reset terminal colors. STDOUT.write("\e[0m") STDOUT.flush end
# File lib/phusion_passenger/abstract_installer.rb, line 75 def before_install # Hook for subclasses. end
# File lib/phusion_passenger/abstract_installer.rb, line 161 def check_dependencies(show_new_screen = true) new_screen if show_new_screen missing_dependencies = [] color_puts "<banner>Checking for required software...</banner>" puts dependencies.each do |dep| color_print " * #{dep.name}... " result = dep.check if result.found? if result.found_at color_puts "<green>found at #{result.found_at}</green>" else color_puts "<green>found</green>" end else color_puts "<red>not found</red>" missing_dependencies << dep end end if missing_dependencies.empty? return true else puts color_puts "<red>Some required software is not installed.</red>" color_puts "But don't worry, this installer will tell you how to install them.\n" color_puts "<b>Press Enter to continue, or Ctrl-C to abort.</b>" if PhusionPassenger.natively_packaged? wait(10) else wait end line puts color_puts "<banner>Installation instructions for required software</banner>" puts missing_dependencies.each do |dep| print_dependency_installation_instructions(dep) puts end if respond_to?(:users_guide) color_puts "If the aforementioned instructions didn't solve your problem, then please take" color_puts "a look at the Users Guide:" puts color_puts " <yellow>#{users_guide}</yellow>" end return false end end
# File lib/phusion_passenger/abstract_installer.rb, line 85 def color_print(text) STDOUT.write(ConsoleTextTemplate.new(:text => text).result) STDOUT.flush end
# File lib/phusion_passenger/abstract_installer.rb, line 90 def color_puts(text) color_print("#{text}\n") end
# File lib/phusion_passenger/abstract_installer.rb, line 157 def dependencies return [] end
# File lib/phusion_passenger/abstract_installer.rb, line 231 def download(url, output) if PlatformInfo.find_command("wget") return sh("wget", "-O", output, url) else return sh("curl", url, "-f", "-L", "-o", output) end end
# File lib/phusion_passenger/abstract_installer.rb, line 104 def line puts "--------------------------------------------" end
# File lib/phusion_passenger/abstract_installer.rb, line 98 def new_screen puts line puts end
# File lib/phusion_passenger/abstract_installer.rb, line 212 def print_dependency_installation_instructions(dep) color_puts " * To install <yellow>#{dep.name}</yellow>:" if dep.install_comments color_puts " " << dep.install_comments end if !dep.install_command.nil? color_puts " Please run <b>#{dep.install_command}</b> as root." elsif !dep.install_instructions.nil? color_puts " " << dep.install_instructions elsif !dep.website.nil? color_puts " Please download it from <b>#{dep.website}</b>" if !dep.website_comments.nil? color_puts " (#{dep.website_comments})" end else color_puts " Search Google." end end
# File lib/phusion_passenger/abstract_installer.rb, line 108 def prompt(message) done = false while !done color_print "#{message}: " begin result = STDIN.readline rescue EOFError exit 2 end result.strip! done = !block_given? || yield(result) end return result rescue Interrupt exit 2 end
# File lib/phusion_passenger/abstract_installer.rb, line 94 def render_template(name, options = {}) puts ConsoleTextTemplate.new({ :file => name }, options).result end
# File lib/phusion_passenger/abstract_installer.rb, line 145 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 125 def wait(timeout = nil) return if @auto begin 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 rescue Interrupt exit 2 end end