Class: Chef::Provider::Link

Inherits:
Chef::Provider show all
Includes:
Mixin::FileClass, Mixin::ShellOut
Defined in:
lib/chef/provider/link.rb

Constant Summary

Constants included from Mixin::ShellOut

Mixin::ShellOut::DEPRECATED_OPTIONS

Instance Attribute Summary

Attributes inherited from Chef::Provider

#action, #current_resource, #new_resource, #run_context

Instance Method Summary collapse

Methods included from Mixin::FileClass

#file_class

Methods included from Mixin::ShellOut

#run_command_compatible_options, #shell_out, #shell_out!

Methods inherited from Chef::Provider

#action_nothing, build_from_file, #cleanup_after_converge, #converge, #cookbook_name, #events, #initialize, #node, #process_resource_requirements, #requirements, #resource_collection, #run_action, #whyrun_mode?

Methods included from Mixin::ConvertToClassName

#convert_to_class_name, #convert_to_snake_case, #filename_to_qualified_string, #snake_case_basename

Methods included from Mixin::EnforceOwnershipAndPermissions

#access_controls, #enforce_ownership_and_permissions

Methods included from Mixin::RecipeDefinitionDSLCore

#method_missing

Methods included from Mixin::Language

#data_bag, #data_bag_item, #platform?, #platform_family?, #search, #value_for_platform, #value_for_platform_family

Constructor Details

This class inherits a constructor from Chef::Provider

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class Chef::Mixin::RecipeDefinitionDSLCore

Instance Method Details

#action_createObject



89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/chef/provider/link.rb', line 89

def action_create
  if @current_resource.to != canonicalize(@new_resource.to) ||
     @current_resource.link_type != @new_resource.link_type
    if @current_resource.to # nil if target_file does not exist
      converge_by("unlink existing file at #{@new_resource.target_file}") do
        ::File.unlink(@new_resource.target_file)
      end
    end
    if @new_resource.link_type == :symbolic
      converge_by("create symlink at #{@new_resource.target_file} to #{@new_resource.to}") do
        file_class.symlink(canonicalize(@new_resource.to),@new_resource.target_file)
        Chef::Log.debug("#{@new_resource} created #{@new_resource.link_type} link from #{@new_resource.to} -> #{@new_resource.target_file}")
        Chef::Log.info("#{@new_resource} created")
      end
    elsif @new_resource.link_type == :hard
      converge_by("create hard link at #{@new_resource.target_file} to #{@new_resource.to}") do
        file_class.link(@new_resource.to, @new_resource.target_file)
        Chef::Log.debug("#{@new_resource} created #{@new_resource.link_type} link from #{@new_resource.to} -> #{@new_resource.target_file}")
        Chef::Log.info("#{@new_resource} created")
      end
    end
  end
  if @new_resource.link_type == :symbolic
    if access_controls.requires_changes?
      converge_by(access_controls.describe_changes) do 
        access_controls.set_all
      end
    end
 end
end

#action_deleteObject



120
121
122
123
124
125
126
127
# File 'lib/chef/provider/link.rb', line 120

def action_delete
  if @current_resource.to # Exists
    converge_by ("delete link at #{@new_resource.target_file}") do
      ::File.delete(@new_resource.target_file)
      Chef::Log.info("#{@new_resource} deleted")
    end
  end
end

#canonicalize(path) ⇒ Object



85
86
87
# File 'lib/chef/provider/link.rb', line 85

def canonicalize(path)
  Chef::Platform.windows? ? path.gsub('/', '\\') : path
end

#define_resource_requirementsObject



70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/chef/provider/link.rb', line 70

def define_resource_requirements
  requirements.assert(:delete) do |a|
    a.assertion do
      if @current_resource.to
        @current_resource.link_type == @new_resource.link_type and
        (@current_resource.link_type == :symbolic  or @current_resource.to != '')
      else
        true
      end
    end
    a.failure_message Chef::Exceptions::Link, "Cannot delete #{@new_resource} at #{@new_resource.target_file}! Not a #{@new_resource.link_type.to_s} link."
    a.whyrun("Would assume the link at #{@new_resource.target_file} was previously created")
  end
end

#load_current_resourceObject



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/chef/provider/link.rb', line 46

def load_current_resource
  @current_resource = Chef::Resource::Link.new(@new_resource.name)
  @current_resource.target_file(@new_resource.target_file)
  if file_class.symlink?(@current_resource.target_file)
    @current_resource.link_type(:symbolic)
    @current_resource.to(
      canonicalize(file_class.readlink(@current_resource.target_file))
    )
  else
    @current_resource.link_type(:hard)
    if ::File.exists?(@current_resource.target_file)
      if ::File.exists?(@new_resource.to) &&
         file_class.stat(@current_resource.target_file).ino ==
         file_class.stat(@new_resource.to).ino
        @current_resource.to(canonicalize(@new_resource.to))
      else
        @current_resource.to("")
      end
    end
  end
  ScanAccessControl.new(@new_resource, @current_resource).set_all!
  @current_resource
end

#whyrun_supported?Boolean

Returns:

  • (Boolean)


42
43
44
# File 'lib/chef/provider/link.rb', line 42

def whyrun_supported?
  true
end