class PhusionPassenger::PlatformInfo::ApacheDetector

the terminal color to Utils::AnsiColors::DEFAULT_TERMINAL_COLOR.
If you use this class to log things to the terminal, then be sure to set
correct Apache installation. This tool helps them.
don’t know about that, or they don’t know how to compile against the
many people have multiple Apache installations on their system, but they
autodetection information to the user in a friendly way. It turns out too
Detects all possible Apache installations on the system, and presents the

def add_result

def add_result
  result = Result.new(self)
  @results << result if yield(result)
end

def detect_all

def detect_all
  log "<banner>Looking for possible Apache installations...</banner>"
  apxses = PlatformInfo.find_all_commands("apxs2") +
    PlatformInfo.find_all_commands("apxs")
  apxses = remove_symlink_duplications(apxses)
  log ""
  apxses.each do |apxs2|
    detect_one(apxs2)
  end
end

def detect_one(apxs2)

def detect_one(apxs2)
  log "<banner>Analyzing #{apxs2}...</banner>"
  add_result do |result|
    result.apxs2 = apxs2
    log "Detecting main Apache executable..."
    result.httpd = PlatformInfo.httpd(:apxs2 => apxs2)
    if result.httpd
      log "Detecting version..."
      if result.version = PlatformInfo.httpd_version(:httpd => result.httpd)
        log " --> #{result.version}"
      else
        log "<red> --> Cannot detect version!</red>"
        result.httpd = nil
      end
    end
    if result.httpd
      log "Detecting control command..."
      result.ctl = PlatformInfo.apache2ctl(:apxs2 => apxs2)
      result.httpd = nil if !result.ctl
    end
    if result.httpd
      log "Detecting configuration file location..."
      result.config_file = PlatformInfo.httpd_default_config_file(:httpd => result.httpd)
      if result.config_file
        log " --> #{result.config_file}"
      else
        log "<red> --> Cannot detect default config file location!</red>"
        result.httpd = nil
      end
    end
    if result.httpd
      log "Detecting error log file..."
      result.error_log = PlatformInfo.httpd_actual_error_log(:httpd => result.httpd)
      if result.error_log
        log " --> #{result.error_log}"
      else
        log "<red> --> Cannot detect error log file!</red>"
      end
    end
    if result.httpd
      log "Detecting a2enmod and a2dismod..."
      result.a2enmod = PlatformInfo.a2enmod(:apxs2 => apxs2)
      result.a2dismod = PlatformInfo.a2dismod(:apxs2 => apxs2)
    end
    if result.httpd
      log "<green>Found a usable Apache installation using #{apxs2}.</green>"
      true
    else
      log "<yellow>Cannot find a usable Apache installation using #{apxs2}.</yellow>"
      false
    end
  end
  log ""
end

def finish

def finish
  PlatformInfo.verbose = false
  PlatformInfo.log_implementation = nil
end

def initialize(output)

def initialize(output)
  @output  = output
  @results = []
  PlatformInfo.verbose = true
  PlatformInfo.log_implementation = lambda do |message|
    if message =~ /: found$/
      log("<green> --> #{message}</green>")
    else
      log(" --> #{message}")
    end
  end
end

def log(message)

def log(message)
  if @output.tty?
    @output.puts(Utils::AnsiColors.ansi_colorize(message))
  else
    @output.puts(Utils::AnsiColors.strip_color_tags(message))
  end
end

def remove_symlink_duplications(filenames)

resolve symlinks.
We're only supposed to detect one Apache in that case so we need to
/usr/bin and /usr/sbin.
On recent Arch Linux releases, /bin, /sbin etc are symlinks to
On Ubuntu, /usr/bin/apxs2 is a symlink to /usr/bin/apxs.
def remove_symlink_duplications(filenames)
  old_size = filenames.size
  filenames = filenames.map do |filename|
    Pathname.new(filename).realpath
  end
  filenames.uniq!
  if old_size != filenames.size
    log "#{old_size - filenames.size} symlink duplicate(s) detected; ignoring them."
  end
  return filenames
end

def report

def report
  log "<banner>Final autodetection results</banner>"
  @results.each do |result|
    result.report
  end
  if @results.empty?
    log "<red>Sorry, this program cannot find an Apache installation.</red>"
    log ""
    log "To install Apache, please run the following. It will tell you how to install Apache."
    log ""
    log "   <b>#{PhusionPassenger.bin_dir}/passenger-install-apache2-module</b>"
    log ""
    log "If you are sure that you have Apache installed, please read the documentation:"
    log "<b>#{APACHE2_DOC_URL}#forcing_location_of_command_line_tools_and_dependencies</b>"
  elsif @results.size > 1
    log "<yellow>WARNING: You have multiple Apache installations on your system!</yellow>"
    log "You are strongly recommended to read this section of the documentation:"
    log "<b>#{APACHE2_DOC_URL}#multiple_apache_installs</b>"
  end
end

def result_for(apxs2)

def result_for(apxs2)
  # All the results use realpaths, so the input must too.
  apxs2 = Pathname.new(apxs2).realpath
  return @results.find { |r| r.apxs2 == apxs2 }
end