chef 0.7.10

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of chef might be problematic. Click here for more details.

Files changed (120) hide show
  1. data/LICENSE +201 -0
  2. data/README.rdoc +135 -0
  3. data/bin/chef-client +26 -0
  4. data/bin/chef-solo +26 -0
  5. data/lib/chef.rb +49 -0
  6. data/lib/chef/application.rb +98 -0
  7. data/lib/chef/application/agent.rb +18 -0
  8. data/lib/chef/application/client.rb +209 -0
  9. data/lib/chef/application/indexer.rb +141 -0
  10. data/lib/chef/application/server.rb +18 -0
  11. data/lib/chef/application/solo.rb +214 -0
  12. data/lib/chef/client.rb +396 -0
  13. data/lib/chef/compile.rb +138 -0
  14. data/lib/chef/config.rb +141 -0
  15. data/lib/chef/cookbook.rb +144 -0
  16. data/lib/chef/cookbook/metadata.rb +407 -0
  17. data/lib/chef/cookbook/metadata/version.rb +87 -0
  18. data/lib/chef/cookbook_loader.rb +168 -0
  19. data/lib/chef/couchdb.rb +172 -0
  20. data/lib/chef/daemon.rb +170 -0
  21. data/lib/chef/exceptions.rb +36 -0
  22. data/lib/chef/file_cache.rb +205 -0
  23. data/lib/chef/log.rb +39 -0
  24. data/lib/chef/mixin/check_helper.rb +31 -0
  25. data/lib/chef/mixin/checksum.rb +37 -0
  26. data/lib/chef/mixin/command.rb +351 -0
  27. data/lib/chef/mixin/create_path.rb +56 -0
  28. data/lib/chef/mixin/deep_merge.rb +36 -0
  29. data/lib/chef/mixin/find_preferred_file.rb +99 -0
  30. data/lib/chef/mixin/from_file.rb +36 -0
  31. data/lib/chef/mixin/generate_url.rb +48 -0
  32. data/lib/chef/mixin/language.rb +79 -0
  33. data/lib/chef/mixin/params_validate.rb +197 -0
  34. data/lib/chef/mixin/template.rb +84 -0
  35. data/lib/chef/node.rb +406 -0
  36. data/lib/chef/node/attribute.rb +412 -0
  37. data/lib/chef/openid_registration.rb +181 -0
  38. data/lib/chef/platform.rb +253 -0
  39. data/lib/chef/provider.rb +40 -0
  40. data/lib/chef/provider/cron.rb +137 -0
  41. data/lib/chef/provider/directory.rb +72 -0
  42. data/lib/chef/provider/execute.rb +58 -0
  43. data/lib/chef/provider/file.rb +191 -0
  44. data/lib/chef/provider/group.rb +120 -0
  45. data/lib/chef/provider/group/groupadd.rb +92 -0
  46. data/lib/chef/provider/group/pw.rb +88 -0
  47. data/lib/chef/provider/http_request.rb +102 -0
  48. data/lib/chef/provider/ifconfig.rb +131 -0
  49. data/lib/chef/provider/link.rb +157 -0
  50. data/lib/chef/provider/mount.rb +121 -0
  51. data/lib/chef/provider/mount/mount.rb +208 -0
  52. data/lib/chef/provider/package.rb +160 -0
  53. data/lib/chef/provider/package/apt.rb +110 -0
  54. data/lib/chef/provider/package/dpkg.rb +113 -0
  55. data/lib/chef/provider/package/freebsd.rb +153 -0
  56. data/lib/chef/provider/package/macports.rb +105 -0
  57. data/lib/chef/provider/package/portage.rb +124 -0
  58. data/lib/chef/provider/package/rpm.rb +99 -0
  59. data/lib/chef/provider/package/rubygems.rb +130 -0
  60. data/lib/chef/provider/package/yum-dump.py +104 -0
  61. data/lib/chef/provider/package/yum.rb +175 -0
  62. data/lib/chef/provider/remote_directory.rb +126 -0
  63. data/lib/chef/provider/remote_file.rb +134 -0
  64. data/lib/chef/provider/route.rb +118 -0
  65. data/lib/chef/provider/ruby_block.rb +15 -0
  66. data/lib/chef/provider/script.rb +42 -0
  67. data/lib/chef/provider/service.rb +129 -0
  68. data/lib/chef/provider/service/debian.rb +64 -0
  69. data/lib/chef/provider/service/freebsd.rb +157 -0
  70. data/lib/chef/provider/service/gentoo.rb +54 -0
  71. data/lib/chef/provider/service/init.rb +126 -0
  72. data/lib/chef/provider/service/redhat.rb +62 -0
  73. data/lib/chef/provider/template.rb +141 -0
  74. data/lib/chef/provider/user.rb +170 -0
  75. data/lib/chef/provider/user/pw.rb +113 -0
  76. data/lib/chef/provider/user/useradd.rb +107 -0
  77. data/lib/chef/queue.rb +145 -0
  78. data/lib/chef/recipe.rb +210 -0
  79. data/lib/chef/resource.rb +256 -0
  80. data/lib/chef/resource/apt_package.rb +34 -0
  81. data/lib/chef/resource/bash.rb +33 -0
  82. data/lib/chef/resource/cron.rb +143 -0
  83. data/lib/chef/resource/csh.rb +33 -0
  84. data/lib/chef/resource/directory.rb +76 -0
  85. data/lib/chef/resource/dpkg_package.rb +34 -0
  86. data/lib/chef/resource/execute.rb +127 -0
  87. data/lib/chef/resource/file.rb +84 -0
  88. data/lib/chef/resource/gem_package.rb +41 -0
  89. data/lib/chef/resource/group.rb +68 -0
  90. data/lib/chef/resource/http_request.rb +52 -0
  91. data/lib/chef/resource/ifconfig.rb +134 -0
  92. data/lib/chef/resource/link.rb +78 -0
  93. data/lib/chef/resource/macports_package.rb +29 -0
  94. data/lib/chef/resource/mount.rb +135 -0
  95. data/lib/chef/resource/package.rb +80 -0
  96. data/lib/chef/resource/perl.rb +33 -0
  97. data/lib/chef/resource/portage_package.rb +33 -0
  98. data/lib/chef/resource/python.rb +33 -0
  99. data/lib/chef/resource/remote_directory.rb +91 -0
  100. data/lib/chef/resource/remote_file.rb +60 -0
  101. data/lib/chef/resource/route.rb +135 -0
  102. data/lib/chef/resource/ruby.rb +33 -0
  103. data/lib/chef/resource/ruby_block.rb +20 -0
  104. data/lib/chef/resource/script.rb +51 -0
  105. data/lib/chef/resource/service.rb +134 -0
  106. data/lib/chef/resource/template.rb +60 -0
  107. data/lib/chef/resource/user.rb +98 -0
  108. data/lib/chef/resource_collection.rb +176 -0
  109. data/lib/chef/resource_definition.rb +67 -0
  110. data/lib/chef/rest.rb +238 -0
  111. data/lib/chef/role.rb +231 -0
  112. data/lib/chef/run_list.rb +156 -0
  113. data/lib/chef/runner.rb +123 -0
  114. data/lib/chef/search.rb +88 -0
  115. data/lib/chef/search/result.rb +64 -0
  116. data/lib/chef/search_index.rb +77 -0
  117. data/lib/chef/tasks/chef_repo.rake +345 -0
  118. data/lib/chef/util/file_edit.rb +125 -0
  119. data/lib/chef/util/fileedit.rb +121 -0
  120. metadata +262 -0
@@ -0,0 +1,88 @@
1
+ #
2
+ # Author:: Stephen Haynes (<sh@nomitor.com>)
3
+ # Copyright:: Copyright (c) 2009 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ class Chef
20
+ class Provider
21
+ class Group
22
+ class Pw < Chef::Provider::Group
23
+
24
+ def load_current_resource
25
+ super
26
+ raise Chef::Exceptions::Group, "Could not find binary /usr/sbin/pw for #{@new_resource}" unless ::File.exists?("/usr/sbin/pw")
27
+ end
28
+
29
+ # Create the group
30
+ def create_group
31
+ command = "pw groupadd"
32
+ command << set_options
33
+ command << set_members_option
34
+ run_command(:command => command)
35
+ end
36
+
37
+ # Manage the group when it already exists
38
+ def manage_group
39
+ command = "pw groupmod"
40
+ command << set_options
41
+ command << set_members_option
42
+ run_command(:command => command)
43
+ end
44
+
45
+ # Remove the group
46
+ def remove_group
47
+ run_command(:command => "pw groupdel #{@new_resource.group_name}")
48
+ end
49
+
50
+ # Little bit of magic as per Adam's useradd provider to pull and assign the command line flags
51
+ #
52
+ # ==== Returns
53
+ # <string>:: A string containing the option and then the quoted value
54
+ def set_options
55
+ opts = " #{@new_resource.group_name}"
56
+ { :gid => "-g" }.sort { |a,b| a[0] <=> b[0] }.each do |field, option|
57
+ if @current_resource.send(field) != @new_resource.send(field)
58
+ if @new_resource.send(field)
59
+ Chef::Log.debug("#{@new_resource}: setting #{field.to_s} to #{@new_resource.send(field)}")
60
+ opts << " #{option} '#{@new_resource.send(field)}'"
61
+ end
62
+ end
63
+ end
64
+ opts
65
+ end
66
+
67
+ # Set the membership option depending on the current resource states
68
+ def set_members_option
69
+ opt = ""
70
+ unless @new_resource.members.empty?
71
+ opt << " -M #{@new_resource.members.join(',')}"
72
+ Chef::Log.debug("#{@new_resource}: setting group members to #{@new_resource.members.join(', ')}")
73
+ else
74
+ # New member list is empty so we should delete any old group members
75
+ unless @current_resource.members.empty?
76
+ opt << " -d #{@current_resource.members.join(',')}"
77
+ Chef::Log.debug("#{@new_resource}: removing group members #{@current_resource.members.join(', ')}")
78
+ else
79
+ Chef::Log.debug("#{@new_resource}: not changing group members, the group has no members")
80
+ end
81
+ end
82
+ opt
83
+ end
84
+
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,102 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Copyright:: Copyright (c) 2008 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'tempfile'
20
+
21
+ class Chef
22
+ class Provider
23
+ class HttpRequest < Chef::Provider
24
+
25
+ attr_accessor :rest
26
+
27
+ def load_current_resource
28
+ @rest = Chef::REST.new(@new_resource.url)
29
+ end
30
+
31
+ # Send a GET request to @new_resource.url, with ?message=@new_resource.message
32
+ def action_get
33
+ message = check_message(@new_resource.message)
34
+ body = @rest.run_request(
35
+ :GET,
36
+ @rest.create_url("#{@new_resource.url}?message=#{message}"),
37
+ false,
38
+ 10,
39
+ false
40
+ )
41
+ @new_resource.updated = true
42
+ Chef::Log.info("#{@new_resource} GET to #{@new_resource.url} successful")
43
+ Chef::Log.debug("#{@new_resource} GET request response: #{body}")
44
+ end
45
+
46
+ # Send a PUT request to @new_resource.url, with the message as the payload
47
+ def action_put
48
+ message = check_message(@new_resource.message)
49
+ body = @rest.run_request(
50
+ :PUT,
51
+ @rest.create_url("#{@new_resource.url}"),
52
+ message,
53
+ 10,
54
+ false
55
+ )
56
+ @new_resource.updated = true
57
+ Chef::Log.info("#{@new_resource} PUT to #{@new_resource.url} successful")
58
+ Chef::Log.debug("#{@new_resource} PUT request response: #{body}")
59
+ end
60
+
61
+ # Send a POST request to @new_resource.url, with the message as the payload
62
+ def action_post
63
+ message = check_message(@new_resource.message)
64
+ body = @rest.run_request(
65
+ :POST,
66
+ @rest.create_url("#{@new_resource.url}"),
67
+ message,
68
+ 10,
69
+ false
70
+ )
71
+ @new_resource.updated = true
72
+ Chef::Log.info("#{@new_resource} POST to #{@new_resource.url} message: #{message.inspect} successful")
73
+ Chef::Log.debug("#{@new_resource} POST request response: #{body}")
74
+ end
75
+
76
+ # Send a DELETE request to @new_resource.url
77
+ def action_delete
78
+ body = @rest.run_request(
79
+ :DELETE,
80
+ @rest.create_url("#{@new_resource.url}"),
81
+ false,
82
+ 10,
83
+ false
84
+ )
85
+ @new_resource.updated = true
86
+ Chef::Log.info("#{@new_resource} DELETE to #{@new_resource.url} successful")
87
+ Chef::Log.debug("#{@new_resource} DELETE request response: #{body}")
88
+ end
89
+
90
+ private
91
+
92
+ def check_message(message)
93
+ if message.kind_of?(Proc)
94
+ message.call
95
+ else
96
+ message
97
+ end
98
+ end
99
+
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,131 @@
1
+ #
2
+ # Author:: Jason Jackson (jason.jackson@monster.com)
3
+ # Copyright:: Copyright (c) 2009 Jason Jackson
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'chef/log'
20
+ require 'chef/mixin/command'
21
+ require 'chef/provider'
22
+
23
+ class Chef
24
+ class Provider
25
+ class Ifconfig < Chef::Provider
26
+ include Chef::Mixin::Command
27
+
28
+ def load_current_resource
29
+ @current_resource = Chef::Resource::Ifconfig.new(@new_resource.name)
30
+
31
+ @interfaces = {}
32
+
33
+ status = popen4("ifconfig") do |pid, stdin, stdout, stderr|
34
+ stdout.each do |line|
35
+
36
+ if !line[0..9].strip.empty?
37
+ @int_name = line[0..9].strip
38
+ @interfaces[@int_name] = {"hwaddr" => (line =~ /(HWaddr)/ ? ($') : "nil").strip.chomp }
39
+ else
40
+ @interfaces[@int_name]["inet_addr"] = (line =~ /inet addr:(\S+)/ ? ($1) : "nil") if line =~ /inet addr:/
41
+ @interfaces[@int_name]["bcast"] = (line =~ /Bcast:(\S+)/ ? ($1) : "nil") if line =~ /Bcast:/
42
+ @interfaces[@int_name]["mask"] = (line =~ /Mask:(\S+)/ ? ($1) : "nil") if line =~ /Mask:/
43
+ @interfaces[@int_name]["mtu"] = (line =~ /MTU:(\S+)/ ? ($1) : "nil") if line =~ /MTU:/
44
+ @interfaces[@int_name]["metric"] = (line =~ /Metric:(\S+)/ ? ($1) : "nil") if line =~ /Metric:/
45
+ end
46
+
47
+ if @interfaces.has_key?(@new_resource.device)
48
+ @interface = @interfaces.fetch(@new_resource.device)
49
+
50
+ @current_resource.target(@new_resource.target)
51
+ @current_resource.device(@int_name)
52
+ @current_resource.inet_addr(@interface["inet_addr"])
53
+ @current_resource.hwaddr(@interface["hwaddr"])
54
+ @current_resource.bcast(@interface["bcast"])
55
+ @current_resource.mask(@interface["mask"])
56
+ @current_resource.mtu(@interface["mtu"])
57
+ @current_resource.metric(@interface["metric"])
58
+ end
59
+ end
60
+ end
61
+
62
+ unless status.exitstatus == 0
63
+ raise Chef::Exception::Ifconfig, "ifconfig failed - #{status.inspect}!"
64
+ end
65
+
66
+ @current_resource
67
+ end
68
+
69
+ def action_add
70
+ # check to see if load_current_resource found ifconfig
71
+ unless @current_resource.inet_addr
72
+ unless @new_resource.device == "lo"
73
+ command = "ifconfig #{@new_resource.device} #{@new_resource.name}"
74
+ command << " netmask #{@new_resource.mask}" if @new_resource.mask
75
+ command << " metric #{@new_resource.metric}" if @new_resource.metric
76
+ command << " mtu #{@new_resource.mtu}" if @new_resource.mtu
77
+ end
78
+
79
+ run_command(
80
+ :command => command
81
+ )
82
+ @new_resource.updated = true
83
+
84
+ end
85
+
86
+ # Write out the config files
87
+ generate_config
88
+ end
89
+
90
+ def action_delete
91
+ # check to see if load_current_resource found the interface
92
+ if @current_resource.device
93
+ command = "ifconfig #{@new_resource.device} down"
94
+
95
+ run_command(
96
+ :command => command
97
+ )
98
+ @new_resource.updated = true
99
+ else
100
+ Chef::Log.debug("Ifconfig #{@current_resource} does not exist")
101
+ end
102
+ end
103
+
104
+ # This is a little lame of me, as if any of these values aren't filled out it leaves blank lines
105
+ # in the file. Can refactor later to have this nice and tight.
106
+ def generate_config
107
+ b = binding
108
+ case node[:platform]
109
+ when ("centos" || "redhat" || "fedora")
110
+ content = %{
111
+ <% if @new_resource.device %>DEVICE=<%= @new_resource.device %><% end %>
112
+ <% if @new_resource.onboot %>ONBOOT=<%= @new_resource.onboot %><% end %>
113
+ <% if @new_resource.bootproto %>BOOTPROTO=<%= @new_resource.bootproto %><% end %>
114
+ <% if @new_resource.target %>IPADDR=<%= @new_resource.target %><% end %>
115
+ <% if @new_resource.mask %>NETMASK=<%= @new_resource.mask %><% end %>
116
+ <% if @new_resource.network %>NETWORK=<%= @new_resource.network %><% end %>
117
+ <% if @new_resource.bcast %>BROADCAST=<%= @new_resource.bcast %><% end %>
118
+ }
119
+ template = ::ERB.new(content)
120
+ network_file = ::File.new("/etc/sysconfig/network-scripts/ifcfg-#{@new_resource.device}", "w")
121
+ network_file.puts(template.result(b))
122
+ network_file.close
123
+ when ("debian" || "ubantu")
124
+ # template
125
+ when ("slackware")
126
+ # template
127
+ end
128
+ end
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,157 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Copyright:: Copyright (c) 2008 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'chef/config'
20
+ require 'chef/log'
21
+ require 'chef/mixin/command'
22
+ require 'chef/resource/link'
23
+ require 'chef/provider'
24
+
25
+ class Chef
26
+ class Provider
27
+ class Link < Chef::Provider
28
+ include Chef::Mixin::Command
29
+
30
+ def negative_complement(big)
31
+ if big > 1073741823 # Fixnum max
32
+ big -= (2**32) # diminished radix wrap to negative
33
+ end
34
+ big
35
+ end
36
+
37
+ private :negative_complement
38
+
39
+ def load_current_resource
40
+ @current_resource = Chef::Resource::Link.new(@new_resource.name)
41
+ @current_resource.target_file(@new_resource.target_file)
42
+ @current_resource.link_type(@new_resource.link_type)
43
+ if @new_resource.link_type == :symbolic
44
+ if ::File.exists?(@current_resource.target_file) && ::File.symlink?(@current_resource.target_file)
45
+ @current_resource.to(
46
+ ::File.expand_path(::File.readlink(@current_resource.target_file))
47
+ )
48
+ cstats = ::File.lstat(@current_resource.target_file)
49
+ @current_resource.owner(cstats.uid)
50
+ @current_resource.group(cstats.gid)
51
+ else
52
+ @current_resource.to("")
53
+ end
54
+ elsif @new_resource.link_type == :hard
55
+ if ::File.exists?(@current_resource.target_file) && ::File.exists?(@new_resource.to)
56
+ if ::File.stat(@current_resource.target_file).ino == ::File.stat(@new_resource.to).ino
57
+ @current_resource.to(@new_resource.to)
58
+ else
59
+ @current_resource.to("")
60
+ end
61
+ else
62
+ @current_resource.to("")
63
+ end
64
+ end
65
+ @current_resource
66
+ end
67
+
68
+ # Compare the ownership of a symlink. Returns true if they are the same, false if they are not.
69
+ def compare_owner
70
+ return false if @new_resource.owner.nil?
71
+
72
+ @set_user_id = case @new_resource.owner
73
+ when /^\d+$/, Integer
74
+ @new_resource.owner.to_i
75
+ else
76
+ # This raises an ArgumentError if you can't find the user
77
+ Etc.getpwnam(@new_resource.owner).uid
78
+ end
79
+
80
+ @set_user_id == @current_resource.owner
81
+ end
82
+
83
+ # Set the ownership on the symlink, assuming it is not set correctly already.
84
+ def set_owner
85
+ unless compare_owner
86
+ Chef::Log.info("Setting owner to #{@set_user_id} for #{@new_resource}")
87
+ @set_user_id = negative_complement(@set_user_id)
88
+ ::File.lchown(@set_user_id, nil, @new_resource.target_file)
89
+ @new_resource.updated = true
90
+ end
91
+ end
92
+
93
+ # Compares the group of a symlink. Returns true if they are the same, false if they are not.
94
+ def compare_group
95
+ return false if @new_resource.group.nil?
96
+
97
+ @set_group_id = case @new_resource.group
98
+ when /^\d+$/, Integer
99
+ @new_resource.group.to_i
100
+ else
101
+ Etc.getgrnam(@new_resource.group).gid
102
+ end
103
+
104
+ @set_group_id == @current_resource.group
105
+ end
106
+
107
+ def set_group
108
+ unless compare_group
109
+ Chef::Log.info("Setting group to #{@set_group_id} for #{@new_resource}")
110
+ @set_group_id = negative_complement(@set_group_id)
111
+ ::File.lchown(nil, @set_group_id, @new_resource.target_file)
112
+ @new_resource.updated = true
113
+ end
114
+ end
115
+
116
+ def action_create
117
+ if @current_resource.to != @new_resource.to
118
+ Chef::Log.info("Creating a #{@new_resource.link_type} link from #{@new_resource.to} -> #{@new_resource.target_file} for #{@new_resource}")
119
+ if @new_resource.link_type == :symbolic
120
+ run_command(
121
+ :command => "ln -nfs #{@new_resource.to} #{@new_resource.target_file}"
122
+ )
123
+ elsif @new_resource.link_type == :hard
124
+ ::File.link(@new_resource.to, @new_resource.target_file)
125
+ end
126
+ @new_resource.updated = true
127
+ end
128
+ if @new_resource.link_type == :symbolic
129
+ set_owner unless @new_resource.owner.nil?
130
+ set_group unless @new_resource.group.nil?
131
+ end
132
+ end
133
+
134
+ def action_delete
135
+ if @new_resource.link_type == :symbolic
136
+ if ::File.symlink?(@new_resource.target_file)
137
+ Chef::Log.info("Deleting #{@new_resource} at #{@new_resource.target_file}")
138
+ ::File.delete(@new_resource.target_file)
139
+ @new_resource.updated = true
140
+ elsif ::File.exists?(@new_resource.target_file)
141
+ raise Chef::Exceptions::Link, "Cannot delete #{@new_resource} at #{@new_resource.target_file}! Not a symbolic link."
142
+ end
143
+ elsif @new_resource.link_type == :hard
144
+ if ::File.exists?(@new_resource.target_file)
145
+ if ::File.exists?(@new_resource.to) && ::File.stat(@current_resource.target_file).ino == ::File.stat(@new_resource.to).ino
146
+ Chef::Log.info("Deleting #{@new_resource} at #{@new_resource.target_file}")
147
+ ::File.delete(@new_resource.target_file)
148
+ @new_resource.updated = true
149
+ else
150
+ raise Chef::Exceptions::Link, "Cannot delete #{@new_resource} at #{@new_resource.target_file}! Not a hard link."
151
+ end
152
+ end
153
+ end
154
+ end
155
+ end
156
+ end
157
+ end