Class: Chef::Provider::Link

Inherits:
Chef::Provider show all
Includes:
Mixin::EnforceOwnershipAndPermissions, 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 included from Mixin::EnforceOwnershipAndPermissions

#access_controls, #enforce_ownership_and_permissions

Methods inherited from Chef::Provider

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

Methods included from DSL::Recipe

#method_missing

Methods included from Mixin::ConvertToClassName

#convert_to_class_name, #convert_to_snake_case, #filename_to_qualified_string, #snake_case_basename

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::DSL::Recipe

Instance Method Details

#action_createObject



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
119
120
# File 'lib/chef/provider/link.rb', line 91

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



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

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



87
88
89
# File 'lib/chef/provider/link.rb', line 87

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

#define_resource_requirementsObject



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

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



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

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)


44
45
46
# File 'lib/chef/provider/link.rb', line 44

def whyrun_supported?
  true
end