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,58 @@
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/mixin/command'
20
+ require 'chef/log'
21
+ require 'chef/provider'
22
+
23
+ class Chef
24
+ class Provider
25
+ class Execute < Chef::Provider
26
+
27
+ include Chef::Mixin::Command
28
+
29
+ def load_current_resource
30
+ true
31
+ end
32
+
33
+ def action_run
34
+ command_args = {
35
+ :command => @new_resource.command,
36
+ :command_string => @new_resource.to_s,
37
+ }
38
+ command_args[:creates] = @new_resource.creates if @new_resource.creates
39
+ command_args[:only_if] = @new_resource.only_if if @new_resource.only_if
40
+ command_args[:not_if] = @new_resource.not_if if @new_resource.not_if
41
+ command_args[:timeout] = @new_resource.timeout if @new_resource.timeout
42
+ command_args[:returns] = @new_resource.returns if @new_resource.returns
43
+ command_args[:environment] = @new_resource.environment if @new_resource.environment
44
+ command_args[:user] = @new_resource.user if @new_resource.user
45
+ command_args[:group] = @new_resource.group if @new_resource.group
46
+ command_args[:cwd] = @new_resource.cwd if @new_resource.cwd
47
+ command_args[:umask] = @new_resource.umask if @new_resource.umask
48
+
49
+ status = run_command(command_args)
50
+ if status
51
+ @new_resource.updated = true
52
+ Chef::Log.info("Ran #{@new_resource} successfully")
53
+ end
54
+ end
55
+
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,191 @@
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/resource/file'
22
+ require 'chef/mixin/checksum'
23
+ require 'chef/mixin/generate_url'
24
+ require 'chef/provider'
25
+ require 'etc'
26
+ require 'fileutils'
27
+
28
+ class Chef
29
+ class Provider
30
+ class File < Chef::Provider
31
+ include Chef::Mixin::Checksum
32
+ include Chef::Mixin::GenerateURL
33
+
34
+ def negative_complement(big)
35
+ if big > 1073741823 # Fixnum max
36
+ big -= (2**32) # diminished radix wrap to negative
37
+ end
38
+ big
39
+ end
40
+
41
+ def octal_mode(mode)
42
+ ((mode.respond_to?(:oct) ? mode.oct : mode.to_i) & 007777)
43
+ end
44
+
45
+ private :negative_complement, :octal_mode
46
+
47
+ def load_current_resource
48
+ @current_resource = Chef::Resource::File.new(@new_resource.name)
49
+ @current_resource.path(@new_resource.path)
50
+ if ::File.exist?(@current_resource.path) && ::File.readable?(@current_resource.path)
51
+ cstats = ::File.stat(@current_resource.path)
52
+ @current_resource.owner(cstats.uid)
53
+ @current_resource.group(cstats.gid)
54
+ @current_resource.mode(octal_mode(cstats.mode))
55
+ @current_resource.checksum(checksum(@current_resource.path))
56
+ end
57
+ @current_resource
58
+ end
59
+
60
+ # Compare the ownership of a file. Returns true if they are the same, false if they are not.
61
+ def compare_owner
62
+ return false if @new_resource.owner.nil?
63
+
64
+ @set_user_id = case @new_resource.owner
65
+ when /^\d+$/, Integer
66
+ @new_resource.owner.to_i
67
+ else
68
+ # This raises an ArgumentError if you can't find the user
69
+ Etc.getpwnam(@new_resource.owner).uid
70
+ end
71
+
72
+ @set_user_id == @current_resource.owner
73
+ end
74
+
75
+ # Set the ownership on the file, assuming it is not set correctly already.
76
+ def set_owner
77
+ unless compare_owner
78
+ Chef::Log.info("Setting owner to #{@set_user_id} for #{@new_resource}")
79
+ @set_user_id = negative_complement(@set_user_id)
80
+ ::File.chown(@set_user_id, nil, @new_resource.path)
81
+ @new_resource.updated = true
82
+ end
83
+ end
84
+
85
+ # Compares the group of a file. Returns true if they are the same, false if they are not.
86
+ def compare_group
87
+ return false if @new_resource.group.nil?
88
+
89
+ @set_group_id = case @new_resource.group
90
+ when /^\d+$/, Integer
91
+ @new_resource.group.to_i
92
+ else
93
+ Etc.getgrnam(@new_resource.group).gid
94
+ end
95
+
96
+ @set_group_id == @current_resource.group
97
+ end
98
+
99
+ def set_group
100
+ unless compare_group
101
+ Chef::Log.info("Setting group to #{@set_group_id} for #{@new_resource}")
102
+ @set_group_id = negative_complement(@set_group_id)
103
+ ::File.chown(nil, @set_group_id, @new_resource.path)
104
+ @new_resource.updated = true
105
+ end
106
+ end
107
+
108
+ def compare_mode
109
+ case @new_resource.mode
110
+ when /^\d+$/, Integer
111
+ octal_mode(@new_resource.mode) == octal_mode(@current_resource.mode)
112
+ else
113
+ false
114
+ end
115
+ end
116
+
117
+ def set_mode
118
+ unless compare_mode && @new_resource.mode != nil
119
+ Chef::Log.info("Setting mode to #{sprintf("%o" % octal_mode(@new_resource.mode))} for #{@new_resource}")
120
+ # CHEF-174, bad mojo around treating integers as octal. If a string is passed, we try to do the "right" thing
121
+ ::File.chmod(octal_mode(@new_resource.mode), @new_resource.path)
122
+ @new_resource.updated = true
123
+ end
124
+ end
125
+
126
+ def action_create
127
+ unless ::File.exists?(@new_resource.path)
128
+ Chef::Log.info("Creating #{@new_resource} at #{@new_resource.path}")
129
+ ::File.open(@new_resource.path, "w+") { |f| }
130
+ @new_resource.updated = true
131
+ end
132
+ set_owner unless @new_resource.owner.nil?
133
+ set_group unless @new_resource.group.nil?
134
+ set_mode unless @new_resource.mode.nil?
135
+ end
136
+
137
+ def action_create_if_missing
138
+ action_create
139
+ end
140
+
141
+ def action_delete
142
+ if ::File.exists?(@new_resource.path)
143
+ if ::File.writable?(@new_resource.path)
144
+ backup unless ::File.symlink?(@new_resource.path)
145
+ Chef::Log.info("Deleting #{@new_resource} at #{@new_resource.path}")
146
+ ::File.delete(@new_resource.path)
147
+ @new_resource.updated = true
148
+ else
149
+ raise "Cannot delete #{@new_resource} at #{@new_resource_path}!"
150
+ end
151
+ end
152
+ end
153
+
154
+ def action_touch
155
+ action_create
156
+ time = Time.now
157
+ Chef::Log.info("Updating #{@new_resource} with new atime/mtime of #{time}")
158
+ ::File.utime(time, time, @new_resource.path)
159
+ @new_resource.updated = true
160
+ end
161
+
162
+ def backup(file=nil)
163
+ file ||= @new_resource.path
164
+ if @new_resource.backup != false && @new_resource.backup > 0 && ::File.exist?(file)
165
+ time = Time.now
166
+ savetime = time.strftime("%Y%m%d%H%M%S")
167
+ backup_filename = "#{@new_resource.path}.chef-#{savetime}"
168
+ Chef::Log.info("Backing up #{@new_resource} to #{backup_filename}")
169
+ FileUtils.cp(file, backup_filename)
170
+
171
+ # Clean up after the number of backups
172
+ slice_number = @new_resource.backup - 1
173
+ backup_files = Dir["#{@new_resource.path}.chef-*"].sort { |a,b| b <=> a }
174
+ if backup_files.length >= @new_resource.backup
175
+ remainder = backup_files.slice(slice_number..-1)
176
+ remainder.each do |backup_to_delete|
177
+ Chef::Log.info("Removing backup of #{@new_resource} at #{backup_to_delete}")
178
+ FileUtils.rm(backup_to_delete)
179
+ end
180
+ end
181
+ end
182
+ end
183
+
184
+ def generate_url(url, type, args=nil)
185
+ cookbook_name = (@new_resource.respond_to?(:cookbook) && @new_resource.cookbook) ? @new_resource.cookbook : @new_resource.cookbook_name
186
+ generate_cookbook_url(url, cookbook_name, type, @node, args)
187
+ end
188
+
189
+ end
190
+ end
191
+ end
@@ -0,0 +1,120 @@
1
+ #
2
+ # Author:: AJ Christensen (<aj@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/provider'
20
+ require 'chef/mixin/command'
21
+ require 'chef/resource/group'
22
+ require 'etc'
23
+
24
+ class Chef
25
+ class Provider
26
+ class Group < Chef::Provider
27
+ include Chef::Mixin::Command
28
+ attr_accessor :group_exists
29
+
30
+ def initialize(node, new_resource)
31
+ super(node, new_resource)
32
+ @group_exists = true
33
+ end
34
+
35
+ def load_current_resource
36
+ @current_resource = Chef::Resource::Group.new(@new_resource.name)
37
+ @current_resource.group_name(@new_resource.group_name)
38
+
39
+ group_info = nil
40
+ begin
41
+ group_info = Etc.getgrnam(@new_resource.group_name)
42
+ rescue ArgumentError => e
43
+ @group_exists = false
44
+ Chef::Log.debug("#{@new_resource}: group does not exist")
45
+ end
46
+
47
+ if group_info
48
+ @new_resource.gid(group_info.gid)
49
+ @current_resource.gid(group_info.gid)
50
+ @current_resource.members(group_info.mem)
51
+ end
52
+
53
+ @current_resource
54
+ end
55
+
56
+ # Check to see if a group needs any changes
57
+ #
58
+ # ==== Returns
59
+ # <true>:: If a change is required
60
+ # <false>:: If a change is not required
61
+ def compare_group
62
+ return true if @new_resource.gid != @current_resource.gid
63
+
64
+ if(@new_resource.append)
65
+ @new_resource.members.each do |member|
66
+ next if @current_resource.members.include?(member)
67
+ return true
68
+ end
69
+ else
70
+ return true if @new_resource.members != @current_resource.members
71
+ end
72
+
73
+ return false
74
+ end
75
+
76
+ def action_create
77
+ case @group_exists
78
+ when false
79
+ create_group
80
+ Chef::Log.info("Created #{@new_resource}")
81
+ @new_resource.updated = true
82
+ else
83
+ if compare_group
84
+ manage_group
85
+ Chef::Log.info("Altered #{@new_resource}")
86
+ @new_resource.updated = true
87
+ end
88
+ end
89
+ end
90
+
91
+ def action_remove
92
+ if @group_exists
93
+ remove_group
94
+ @new_resource.updated = true
95
+ Chef::Log.info("Removed #{@new_resource}")
96
+ end
97
+ end
98
+
99
+ def action_manage
100
+ if @group_exists && compare_group
101
+ manage_group
102
+ @new_resource.updated = true
103
+ Chef::Log.info("Managed #{@new_resource}")
104
+ end
105
+ end
106
+
107
+ def action_modify
108
+ if @group_exists
109
+ if compare_group
110
+ manage_group
111
+ @new_resource.updated = true
112
+ Chef::Log.info("Modified #{@new_resource}")
113
+ end
114
+ else
115
+ raise Chef::Exceptions::Group, "Cannot modify #{@new_resource} - group does not exist!"
116
+ end
117
+ end
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,92 @@
1
+ #
2
+ # Author:: AJ Christensen (<aj@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
+ class Chef
20
+ class Provider
21
+ class Group
22
+ class Groupadd < Chef::Provider::Group
23
+
24
+ def load_current_resource
25
+ super
26
+
27
+ [ "/usr/sbin/groupadd",
28
+ "/usr/sbin/groupmod",
29
+ "/usr/sbin/groupdel",
30
+ "/usr/bin/gpasswd" ].each do |required_binary|
31
+ raise Chef::Exceptions::Group, "Could not find binary #{required_binary} for #{@new_resource}" unless ::File.exists?(required_binary)
32
+ end
33
+ end
34
+
35
+ # Create the group
36
+ def create_group
37
+ command = "groupadd"
38
+ command << set_options
39
+ run_command(:command => command)
40
+ modify_group_members
41
+ end
42
+
43
+ # Manage the group when it already exists
44
+ def manage_group
45
+ command = "groupmod"
46
+ command << set_options
47
+ run_command(:command => command)
48
+ modify_group_members
49
+ end
50
+
51
+ # Remove the group
52
+ def remove_group
53
+ run_command(:command => "groupdel #{@new_resource.group_name}")
54
+ end
55
+
56
+ def modify_group_members
57
+ unless @new_resource.members.empty?
58
+ if(@new_resource.append)
59
+ @new_resource.members.each do |member|
60
+ Chef::Log.debug("#{@new_resource}: appending member #{member} to group #{@new_resource.group_name}")
61
+ run_command(:command => "gpasswd -a #{member} #{@new_resource.group_name}")
62
+ end
63
+ else
64
+ Chef::Log.debug("#{@new_resource}: setting group members to #{@new_resource.members.join(', ')}")
65
+ run_command(:command => "gpasswd -M #{@new_resource.members.join(',')} #{@new_resource.group_name}")
66
+ end
67
+ else
68
+ Chef::Log.debug("#{@new_resource}: not changing group members, the group has no members")
69
+ end
70
+ end
71
+
72
+ # Little bit of magic as per Adam's useradd provider to pull the assign the command line flags
73
+ #
74
+ # ==== Returns
75
+ # <string>:: A string containing the option and then the quoted value
76
+ def set_options
77
+ opts = ""
78
+ { :gid => "-g" }.sort { |a,b| a[0] <=> b[0] }.each do |field, option|
79
+ if @current_resource.send(field) != @new_resource.send(field)
80
+ if @new_resource.send(field)
81
+ Chef::Log.debug("#{@new_resource}: setting #{field.to_s} to #{@new_resource.send(field)}")
82
+ opts << " #{option} '#{@new_resource.send(field)}'"
83
+ end
84
+ end
85
+ end
86
+ opts << " #{@new_resource.group_name}"
87
+ end
88
+
89
+ end
90
+ end
91
+ end
92
+ end