class Chef::Resource::WindowsEnv

Public Instance Methods

create_env() click to toggle source
# File lib/chef/resource/windows_env.rb, line 131
def create_env
  obj = env_obj(@new_resource.key_name)
  unless obj
    obj = WIN32OLE.connect("winmgmts://").get("Win32_Environment").spawninstance_
    obj.name = @new_resource.key_name
    obj.username = new_resource.user
  end
  obj.variablevalue = @new_resource.value
  obj.put_
  value = @new_resource.value
  value = expand_path(value) if @new_resource.key_name.casecmp("PATH") == 0
  ENV[@new_resource.key_name] = value
  broadcast_env_change
end
current_values() click to toggle source

Returns the current values to split by delimiter

# File lib/chef/resource/windows_env.rb, line 165
def current_values
  @current_values ||= current_resource.value.split(new_resource.delim)
end
delete_element() click to toggle source

e.g. delete a PATH element

Returns

<true>

If we handled the element case and caller should not delete the key

<false>

Caller should delete the key, either no :delim was specific or value was empty after we removed the element.

# File lib/chef/resource/windows_env.rb, line 106
def delete_element
  return false unless new_resource.delim # no delim: delete the key

  needs_delete = new_values.any? { |v| current_values.include?(v) }
  if !needs_delete
    logger.trace("#{new_resource} element '#{new_resource.value}' does not exist")
    true # do not delete the key
  else
    new_value =
      current_values.select do |item|
        not new_values.include?(item)
      end.join(new_resource.delim)

    if new_value.empty?
      false # nothing left here, delete the key
    else
      old_value = new_resource.value(new_value)
      create_env
      logger.trace("#{new_resource} deleted #{old_value} element")
      new_resource.updated_by_last_action(true)
      true # we removed the element and updated; do not delete the key
    end
  end
end
delete_env() click to toggle source
# File lib/chef/resource/windows_env.rb, line 146
def delete_env
  obj = env_obj(@new_resource.key_name)
  if obj
    obj.delete_
    broadcast_env_change
  end
  if ENV[@new_resource.key_name]
    ENV.delete(@new_resource.key_name)
  end
end
env_obj(key_name) click to toggle source
# File lib/chef/resource/windows_env.rb, line 179
def env_obj(key_name)
  return @env_obj if @env_obj

  wmi = WmiLite::Wmi.new
  # Note that by design this query is case insensitive with regard to key_name
  environment_variables = wmi.query("select * from Win32_Environment where name = '#{key_name}'")
  if environment_variables && environment_variables.length > 0
    environment_variables.each do |env|
      @env_obj = env.wmi_ole_object
      return @env_obj if @env_obj.username.split("\\").last.casecmp(new_resource.user) == 0
    end
  end
  @env_obj = nil
end
env_value(key_name) click to toggle source
# File lib/chef/resource/windows_env.rb, line 174
def env_value(key_name)
  obj = env_obj(key_name)
  obj.variablevalue if obj
end
key_exists?() click to toggle source
# File lib/chef/resource/windows_env.rb, line 79
def key_exists?
  @key_exists ||= !!env_value(new_resource.key_name)
end
load_current_resource() click to toggle source
# File lib/chef/resource/windows_env.rb, line 66
def load_current_resource
  @current_resource = Chef::Resource::WindowsEnv.new(new_resource.name)
  current_resource.key_name(new_resource.key_name)

  if key_exists?
    current_resource.value(env_value(new_resource.key_name))
  else
    logger.trace("#{new_resource} key does not exist")
  end

  current_resource
end
modify_env() click to toggle source
# File lib/chef/resource/windows_env.rb, line 157
def modify_env
  if new_resource.delim
    new_resource.value((new_values + current_values).uniq.join(new_resource.delim))
  end
  create_env
end
new_values() click to toggle source

Returns the new values to split by delimiter

# File lib/chef/resource/windows_env.rb, line 170
def new_values
  @new_values ||= new_resource.value.split(new_resource.delim)
end
requires_modify_or_create?() click to toggle source
# File lib/chef/resource/windows_env.rb, line 83
def requires_modify_or_create?
  if new_resource.delim
    # e.g. check for existing value within PATH
    new_values.inject(0) do |index, val|
      next_index = current_values.find_index val
      return true if next_index.nil? || next_index < index

      next_index
    end
    false
  else
    new_resource.value != current_resource.value
  end
end
whyrun_supported?() click to toggle source
# File lib/chef/resource/windows_env.rb, line 62
def whyrun_supported?
  false
end