class OpenShift::Runtime::Utils::Environ

Class represents the OpenShift/Ruby analogy of C environ(7)

Public Class Methods

for_gear(gear_dir, *dirs) click to toggle source

Load the combined cartridge environments for a gear @param [String] gear_dir Home directory of the gear @param [Array<String>] cartridge_dirs Home directories of cartridges,

loaded last to override other settings.

@return [Hash<String,String>] hash[Environment Variable] = Value

# File lib/openshift-origin-node/utils/environ.rb, line 30
def self.for_gear(gear_dir, *dirs)
  env         = load('/etc/openshift/env')
  system_path = env['PATH']

  env.merge!(load(
                 PathUtils.join(gear_dir, '.env'),
                 PathUtils.join(gear_dir, '*', 'env')))

  # Load environment variables under subdirectories in ~/.env
  Dir[PathUtils.join(gear_dir, '.env', '*')].each do |entry|
    next if entry.end_with?('user_vars')

    env.merge!(load(entry)) if File.directory?(entry)
  end


  # If we have a primary cartridge make sure it's the last loaded in the environment
  primary = if env.has_key? 'OPENSHIFT_PRIMARY_CARTRIDGE_DIR'
              dirs.delete env['OPENSHIFT_PRIMARY_CARTRIDGE_DIR']
              dirs << env['OPENSHIFT_PRIMARY_CARTRIDGE_DIR']

              File.basename(env['OPENSHIFT_PRIMARY_CARTRIDGE_DIR']).upcase
            end

  dirs.each_with_object(env) { |d, e| e.merge!(load(PathUtils.join(d, 'env'))) }

  primary_path = "OPENSHIFT_#{primary}_PATH_ELEMENT"
  path_elements = env.keys.find_all { |k| /^OPENSHIFT_.*_PATH_ELEMENT/ =~ k }

  # If we have a primary cartridge path make sure it's the first searched
  path_elements.delete primary_path if path_elements.include? primary_path
  elements = path_elements.each_with_object([]) { |s, p| p << env[s] }

  elements.unshift env[primary_path] if env[primary_path]
  elements << system_path if system_path

  env['PATH'] = elements.join(':')

  user_vars = PathUtils.join(gear_dir, '.env', 'user_vars')
  env.merge!(load(user_vars)) if File.exist?(user_vars)
  env
end
load(*dirs) click to toggle source

Read a Gear's + n number cartridge environment variables into a environ(7) hash @param [String] env_dir of gear to be read @return [Hash<String,String>] environment variable name: value

# File lib/openshift-origin-node/utils/environ.rb, line 76
def self.load(*dirs)
  dirs.each_with_object({}) do |env_dir, env|
    # add wildcard for globbing if needed
    env_dir += '/*' if not env_dir.end_with? '*'

    # Find, read and load environment variables into a hash
    Dir[env_dir].each do |file|
      next if file.end_with? '.erb'
      next unless File.file? file

      begin
        contents = IO.read(file).chomp

        if contents.start_with? 'export '
          index           = contents.index('=')
          parsed_contents = contents[(index + 1)..-1]
          parsed_contents.gsub!(/\A["']|["']\Z/, '')
          env[File.basename(file)] = parsed_contents
        else
          env[File.basename(file)] = contents
        end
      rescue => e
        msg = "Failed to process: #{file}"
        unless contents.nil?
          msg << " [#{contents}]"
        end
        msg << ': '
        msg << (
        case e
          when SystemCallError
            # This catches filesystem level errors
            # We split the message because it contains the filename
            e.message.split(' - ').first
          else
            e.message
        end
        )
        NodeLogger.logger.info(msg)
      end
    end
  end
end