Parent

Class/Module Index [+]

Quicksearch

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 run_steps method which handles the installation itself.

Usage:

installer = ConcereteInstallerClass.new(options...)
installer.run

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 57
def initialize(options = {})
        @stdout = STDOUT
        @stderr = STDERR
        options.each_pair do |key, value|
                instance_variable_set(:"@#{key}", value)
        end
end

Public Instance Methods

run() click to toggle source

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

Protected Instance Methods

after_install() click to toggle source
# File lib/phusion_passenger/abstract_installer.rb, line 105
def after_install
        STDOUT.write(Utils::AnsiColors::RESET)
        STDOUT.flush
end
before_install() click to toggle source
# File lib/phusion_passenger/abstract_installer.rb, line 100
def before_install
        STDOUT.write(Utils::AnsiColors::DEFAULT_TERMINAL_COLOR)
        STDOUT.flush
end
check_dependencies(show_new_screen = true) click to toggle source
# 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
check_whether_os_is_broken() click to toggle source
# File lib/phusion_passenger/abstract_installer.rb, line 162
def check_whether_os_is_broken
        # No known broken OSes at the moment.
end
check_whether_system_has_enough_ram(required = 1024) click to toggle source
# 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
dependencies() click to toggle source
# File lib/phusion_passenger/abstract_installer.rb, line 110
def dependencies
        return [[], []]
end
download(url, output, options = {}) click to toggle source
# 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
interactive?() click to toggle source
# File lib/phusion_passenger/abstract_installer.rb, line 91
def interactive?
        return !@auto
end
line() click to toggle source
# File lib/phusion_passenger/abstract_installer.rb, line 234
def line
        puts "--------------------------------------------"
end
new_screen() click to toggle source
# File lib/phusion_passenger/abstract_installer.rb, line 228
def new_screen
        puts
        line
        puts
end
non_interactive?() click to toggle source
# File lib/phusion_passenger/abstract_installer.rb, line 95
def non_interactive?
        return !interactive?
end
prompt(message, default_value = nil) click to toggle source
# 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
prompt_confirmation(message) click to toggle source
# 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
puts(text = nil) click to toggle source
# 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
puts_error(text) click to toggle source
# 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
rake(*args) click to toggle source
# 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
rake!(*args) click to toggle source
# 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
render_template(name, options = {}) click to toggle source
# File lib/phusion_passenger/abstract_installer.rb, line 224
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 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
sh!(*args) click to toggle source
# 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
use_stderr() click to toggle source
# 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
wait(timeout = nil) click to toggle source
# 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

[Validate]

Generated with the Darkfish Rdoc Generator 2.