Class: Chef::Provider::RemoteFile

Inherits:
File show all
Includes:
Mixin::FindPreferredFile
Defined in:
lib/chef/provider/remote_file.rb

Instance Attribute Summary

Attributes inherited from Chef::Provider

#current_resource, #new_resource, #node

Instance Method Summary collapse

Methods included from Mixin::FindPreferredFile

#find_preferred_file, #load_cookbook_files

Methods inherited from File

#action_delete, #action_touch, #backup, #compare_content, #compare_group, #compare_mode, #compare_owner, #generate_url, #load_current_resource, #set_content, #set_group, #set_mode, #set_owner

Methods included from Mixin::GenerateURL

#generate_cookbook_url, #generate_cookbook_url_from_uri

Methods included from Mixin::Checksum

#checksum

Methods inherited from Chef::Provider

#action_nothing, build_from_file, #initialize, #load_current_resource

Methods included from Mixin::ConvertToClassName

#convert_to_class_name, #convert_to_snake_case, #filename_to_qualified_string, #snake_case_basename

Methods included from Mixin::RecipeDefinitionDSLCore

#method_missing

Methods included from Mixin::Language

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

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



32
33
34
35
# File 'lib/chef/provider/remote_file.rb', line 32

def action_create
  Chef::Log.debug("Checking #{@new_resource} for changes")
  do_remote_file(@new_resource.source, @current_resource.path)
end

#action_create_if_missingObject



37
38
39
40
41
42
43
# File 'lib/chef/provider/remote_file.rb', line 37

def action_create_if_missing
  if ::File.exists?(@new_resource.path)
    Chef::Log.debug("File #{@new_resource.path} exists, taking no action.")
  else
    action_create
  end
end

#backup_new_resourceObject



104
105
106
107
108
109
110
# File 'lib/chef/provider/remote_file.rb', line 104

def backup_new_resource
  if ::File.exists?(@new_resource.path)
    Chef::Log.debug "#{@new_resource}: checksum changed from #{@current_resource.checksum} to #{@new_resource.checksum}"
    Chef::Log.info "#{@new_resource}: Updating #{@new_resource.path}"
    backup @new_resource.path
  end
end

#current_resource_matches_target_checksum?Boolean

Returns:

  • (Boolean)


86
87
88
# File 'lib/chef/provider/remote_file.rb', line 86

def current_resource_matches_target_checksum?
  @new_resource.checksum && @current_resource.checksum && @current_resource.checksum =~ /^#{@new_resource.checksum}/
end

#do_remote_file(source, path) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/chef/provider/remote_file.rb', line 45

def do_remote_file(source, path)
  retval = true

  if current_resource_matches_target_checksum?
    Chef::Log.debug("File #{@new_resource} checksum matches target checksum (#{@new_resource.checksum}), not updating")
  else
    begin
      source_file(source, @current_resource.checksum) do |raw_file|
        if matches_current_checksum?(raw_file)
          Chef::Log.debug "#{@new_resource}: Target and Source checksums are the same, taking no action"
        else
          backup_new_resource
          Chef::Log.debug "copying remote file from origin #{raw_file.path} to destination #{@new_resource.path}"
          FileUtils.cp raw_file.path, @new_resource.path
          @new_resource.updated = true
        end
      end
    rescue Net::HTTPRetriableError => e
      if e.response.kind_of?(Net::HTTPNotModified)
        Chef::Log.debug("File #{path} is unchanged")
        retval = false
      else
        raise e
      end
    end

    Chef::Log.debug "#{@new_resource} completed"
    retval
  end
  enforce_ownership_and_permissions

  retval
end

#enforce_ownership_and_permissionsObject



79
80
81
82
83
84
# File 'lib/chef/provider/remote_file.rb', line 79

def enforce_ownership_and_permissions
  set_owner if @new_resource.owner
  set_group if @new_resource.group
  set_mode  if @new_resource.mode

end

#matches_current_checksum?(candidate_file) ⇒ Boolean

Returns:

  • (Boolean)


90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/chef/provider/remote_file.rb', line 90

def matches_current_checksum?(candidate_file)
  Chef::Log.debug "#{@new_resource}: Checking for file existence of #{@new_resource.path}"
  if ::File.exists?(@new_resource.path)
    Chef::Log.debug "#{@new_resource}: File exists at #{@new_resource.path}"
    @new_resource.checksum(checksum(candidate_file.path))
    Chef::Log.debug "#{@new_resource}: Target checksum: #{@current_resource.checksum}"
    Chef::Log.debug "#{@new_resource}: Source checksum: #{@new_resource.checksum}"
    @new_resource.checksum == @current_resource.checksum
  else
    Chef::Log.info "#{@new_resource}: Creating #{@new_resource.path}"
    false
  end
end

#source_file(source, current_checksum, &block) ⇒ Object



112
113
114
115
116
117
118
119
120
# File 'lib/chef/provider/remote_file.rb', line 112

def source_file(source, current_checksum, &block)
  if absolute_uri?(source)
    fetch_from_uri(source, &block)
  elsif !Chef::Config[:solo]
    fetch_from_chef_server(source, current_checksum, &block)
  else
    fetch_from_local_cookbook(source, &block)
  end
end