class Chef::Provider::WindowsEnv

Attributes

key_exists[RW]

Public Class Methods

new(new_resource, run_context) click to toggle source
Calls superclass method Chef::Provider.new
# File lib/chef/provider/windows_env.rb, line 36
def initialize(new_resource, run_context)
  super
  @key_exists = true
end

Public Instance Methods

action_create() click to toggle source
# File lib/chef/provider/windows_env.rb, line 80
def action_create
  if @key_exists
    if requires_modify_or_create?
      modify_env
      logger.info("#{new_resource} altered")
      new_resource.updated_by_last_action(true)
    end
  else
    create_env
    logger.info("#{new_resource} created")
    new_resource.updated_by_last_action(true)
  end
end
action_delete() click to toggle source
# File lib/chef/provider/windows_env.rb, line 124
def action_delete
  if ( ENV[new_resource.key_name] || @key_exists ) && !delete_element
    delete_env
    logger.info("#{new_resource} deleted")
    new_resource.updated_by_last_action(true)
  end
end
action_modify() click to toggle source
# File lib/chef/provider/windows_env.rb, line 132
def action_modify
  if @key_exists
    if requires_modify_or_create?
      modify_env
      logger.info("#{new_resource} modified")
      new_resource.updated_by_last_action(true)
    end
  else
    raise Chef::Exceptions::WindowsEnv, "Cannot modify #{new_resource} - key does not exist!"
  end
end
compare_value()
create_env() click to toggle source
# File lib/chef/provider/windows_env.rb, line 144
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/provider/windows_env.rb, line 178
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/provider/windows_env.rb, line 100
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")
    return 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?
      return 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)
      return true #we removed the element and updated; do not delete the key
    end
  end
end
delete_env() click to toggle source
# File lib/chef/provider/windows_env.rb, line 159
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_key_exists(key_name) click to toggle source
# File lib/chef/provider/windows_env.rb, line 55
def env_key_exists(key_name)
  env_value(key_name) ? true : false
end
env_obj(key_name) click to toggle source
# File lib/chef/provider/windows_env.rb, line 192
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/provider/windows_env.rb, line 187
def env_value(key_name)
  obj = env_obj(key_name)
  obj.variablevalue if obj
end
load_current_resource() click to toggle source
# File lib/chef/provider/windows_env.rb, line 41
def load_current_resource
  @current_resource = Chef::Resource::WindowsEnv.new(new_resource.name)
  current_resource.key_name(new_resource.key_name)

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

  current_resource
end
modify_env() click to toggle source
# File lib/chef/provider/windows_env.rb, line 170
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/provider/windows_env.rb, line 183
def new_values
  @new_values ||= new_resource.value.split(new_resource.delim)
end
requires_modify_or_create?() click to toggle source

Check to see if value needs any changes

Returns

<true>

If a change is required

<false>

If a change is not required

# File lib/chef/provider/windows_env.rb, line 64
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
Also aliased as: compare_value
whyrun_supported?() click to toggle source
# File lib/chef/provider/windows_env.rb, line 32
def whyrun_supported?
  false
end