Your IP : 13.58.211.135
# encoding: utf-8
#
# Phusion Passenger - https://www.phusionpassenger.com/
# Copyright (c) 2010-2018 Phusion Holding B.V.
#
# "Passenger", "Phusion Passenger" and "Union Station" are registered
# trademarks of Phusion Holding B.V.
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
require 'fileutils'
require 'logger'
PhusionPassenger.require_passenger_lib 'constants'
PhusionPassenger.require_passenger_lib 'abstract_installer'
PhusionPassenger.require_passenger_lib 'config/installation_utils'
PhusionPassenger.require_passenger_lib 'platform_info'
PhusionPassenger.require_passenger_lib 'utils/shellwords'
PhusionPassenger.require_passenger_lib 'utils/progress_bar'
PhusionPassenger.require_passenger_lib 'utils/tmpio'
module PhusionPassenger
module Config
class AgentCompiler < AbstractInstaller
protected
def dependencies
specs = [
'depcheck_specs/compiler_toolchain',
'depcheck_specs/ruby',
'depcheck_specs/gems',
'depcheck_specs/libs',
'depcheck_specs/utilities'
]
ids = [
'cc',
'c++',
'rake',
'libcurl-dev',
'openssl-dev',
'zlib-dev'
].compact
return [specs, ids]
end
def install_doc_url
"https://www.phusionpassenger.com/library/install/standalone/"
end
def troubleshooting_doc_url
"https://www.phusionpassenger.com/library/admin/standalone/troubleshooting/"
end
def run_steps
check_source_code_available!
if !@force
check_whether_os_is_broken
check_whether_system_has_enough_ram
InstallationUtils.check_for_download_tool!
end
check_dependencies(false) || abort
puts
@destdir = InstallationUtils.find_or_create_writable_support_binaries_dir!
confirm_enable_optimizations
compile_agent
end
def before_install
super
if !@working_dir
@working_dir = PhusionPassenger::Utils.mktmpdir("passenger-install.", PlatformInfo.tmpexedir)
@owns_working_dir = true
end
end
def after_install
super
FileUtils.remove_entry_secure(@working_dir) if @owns_working_dir
end
private
def check_source_code_available!
if PhusionPassenger.build_system_dir.nil?
puts "<red>Cannot compile agent binary</red>"
puts
puts "This #{PROGRAM_NAME} installation does not " +
"come with any source code, so the agent binary cannot " +
"be compiled. So instead, please try to download a " +
"precompiled agent binary from the #{PROGRAM_NAME} website, " +
"by running:\n\n" +
" <b>passenger-config download-agent</b>"
abort
end
end
def confirm_enable_optimizations
if @auto
if @optimize
puts "Compiling with optimizations."
else
puts "Not compiling with optimizations."
end
else
if @optimize
puts "Compiling with optimizations."
else
new_screen
render_template 'config/agent_compiler/confirm_enable_optimizations',
:total_ram => total_ram_gb
puts
@optimize = prompt_confirmation('Compile with optimizations?')
puts
end
end
end
def compile_agent
puts "<banner>Compiling #{PROGRAM_NAME} agent...</banner>"
progress_bar = ProgressBar.new
e_working_dir = Shellwords.escape(@working_dir)
args = "#{e_working_dir}/support-binaries/#{AGENT_EXE}" \
" CACHING=false" \
" OUTPUT_DIR=#{e_working_dir} " \
" OPTIMIZE=#{!!@optimize}"
begin
progress_bar.set(0)
Dir.chdir(PhusionPassenger.build_system_dir) do
InstallationUtils.run_rake_task!(args) do |progress, total|
progress_bar.set(0.05 + (progress / total.to_f) * 0.95)
end
end
progress_bar.set(1)
ensure
progress_bar.finish
end
FileUtils.cp("#{@working_dir}/support-binaries/#{AGENT_EXE}",
"#{@destdir}/#{AGENT_EXE}")
puts "<green>Compilation finished!</green>"
end
def total_ram_gb
begin
meminfo = File.read("/proc/meminfo")
if meminfo =~ /^MemTotal: *(\d+) kB$/
return sprintf("%.1f", $1.to_i / 1024 / 1024)
end
rescue Errno::ENOENT, Errno::EACCES
# Don't do anything on systems without memory information.
return nil
end
end
end
end # module Standalone
end # module PhusionPassenger