class PhusionPassenger::AbstractInstaller

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

Constants

PASSENGER_WEBSITE
PHUSION_WEBSITE

Public Class Methods

new(options = {}) click to toggle source

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

Public Instance Methods

start() click to toggle source

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

Private Instance Methods

after_install() click to toggle source
# File lib/phusion_passenger/abstract_installer.rb, line 79
def after_install
        # Reset terminal colors.
        STDOUT.write("\e[0m")
        STDOUT.flush
end
before_install() click to toggle source
# File lib/phusion_passenger/abstract_installer.rb, line 75
def before_install
        # Hook for subclasses.
end
check_dependencies(show_new_screen = true) click to toggle source
# 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
color_print(text) click to toggle source
# File lib/phusion_passenger/abstract_installer.rb, line 85
def color_print(text)
        STDOUT.write(ConsoleTextTemplate.new(:text => text).result)
        STDOUT.flush
end
color_puts(text) click to toggle source
# File lib/phusion_passenger/abstract_installer.rb, line 90
def color_puts(text)
        color_print("#{text}\n")
end
dependencies() click to toggle source
# File lib/phusion_passenger/abstract_installer.rb, line 157
def dependencies
        return []
end
download(url, output) click to toggle source
# 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
line() click to toggle source
# File lib/phusion_passenger/abstract_installer.rb, line 104
def line
        puts "--------------------------------------------"
end
new_screen() click to toggle source
# File lib/phusion_passenger/abstract_installer.rb, line 98
def new_screen
        puts
        line
        puts
end
print_dependency_installation_instructions(dep) click to toggle source
prompt(message) { |result| ... } click to toggle source
# 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
render_template(name, options = {}) click to toggle source
# File lib/phusion_passenger/abstract_installer.rb, line 94
def render_template(name, options = {})
        puts ConsoleTextTemplate.new({ :file => name }, options).result
end
sh(*args) click to toggle source
# 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
wait(timeout = nil) click to toggle source
# 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