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.
- data/LICENSE +201 -0
- data/README.rdoc +135 -0
- data/bin/chef-client +26 -0
- data/bin/chef-solo +26 -0
- data/lib/chef.rb +49 -0
- data/lib/chef/application.rb +98 -0
- data/lib/chef/application/agent.rb +18 -0
- data/lib/chef/application/client.rb +209 -0
- data/lib/chef/application/indexer.rb +141 -0
- data/lib/chef/application/server.rb +18 -0
- data/lib/chef/application/solo.rb +214 -0
- data/lib/chef/client.rb +396 -0
- data/lib/chef/compile.rb +138 -0
- data/lib/chef/config.rb +141 -0
- data/lib/chef/cookbook.rb +144 -0
- data/lib/chef/cookbook/metadata.rb +407 -0
- data/lib/chef/cookbook/metadata/version.rb +87 -0
- data/lib/chef/cookbook_loader.rb +168 -0
- data/lib/chef/couchdb.rb +172 -0
- data/lib/chef/daemon.rb +170 -0
- data/lib/chef/exceptions.rb +36 -0
- data/lib/chef/file_cache.rb +205 -0
- data/lib/chef/log.rb +39 -0
- data/lib/chef/mixin/check_helper.rb +31 -0
- data/lib/chef/mixin/checksum.rb +37 -0
- data/lib/chef/mixin/command.rb +351 -0
- data/lib/chef/mixin/create_path.rb +56 -0
- data/lib/chef/mixin/deep_merge.rb +36 -0
- data/lib/chef/mixin/find_preferred_file.rb +99 -0
- data/lib/chef/mixin/from_file.rb +36 -0
- data/lib/chef/mixin/generate_url.rb +48 -0
- data/lib/chef/mixin/language.rb +79 -0
- data/lib/chef/mixin/params_validate.rb +197 -0
- data/lib/chef/mixin/template.rb +84 -0
- data/lib/chef/node.rb +406 -0
- data/lib/chef/node/attribute.rb +412 -0
- data/lib/chef/openid_registration.rb +181 -0
- data/lib/chef/platform.rb +253 -0
- data/lib/chef/provider.rb +40 -0
- data/lib/chef/provider/cron.rb +137 -0
- data/lib/chef/provider/directory.rb +72 -0
- data/lib/chef/provider/execute.rb +58 -0
- data/lib/chef/provider/file.rb +191 -0
- data/lib/chef/provider/group.rb +120 -0
- data/lib/chef/provider/group/groupadd.rb +92 -0
- data/lib/chef/provider/group/pw.rb +88 -0
- data/lib/chef/provider/http_request.rb +102 -0
- data/lib/chef/provider/ifconfig.rb +131 -0
- data/lib/chef/provider/link.rb +157 -0
- data/lib/chef/provider/mount.rb +121 -0
- data/lib/chef/provider/mount/mount.rb +208 -0
- data/lib/chef/provider/package.rb +160 -0
- data/lib/chef/provider/package/apt.rb +110 -0
- data/lib/chef/provider/package/dpkg.rb +113 -0
- data/lib/chef/provider/package/freebsd.rb +153 -0
- data/lib/chef/provider/package/macports.rb +105 -0
- data/lib/chef/provider/package/portage.rb +124 -0
- data/lib/chef/provider/package/rpm.rb +99 -0
- data/lib/chef/provider/package/rubygems.rb +130 -0
- data/lib/chef/provider/package/yum-dump.py +104 -0
- data/lib/chef/provider/package/yum.rb +175 -0
- data/lib/chef/provider/remote_directory.rb +126 -0
- data/lib/chef/provider/remote_file.rb +134 -0
- data/lib/chef/provider/route.rb +118 -0
- data/lib/chef/provider/ruby_block.rb +15 -0
- data/lib/chef/provider/script.rb +42 -0
- data/lib/chef/provider/service.rb +129 -0
- data/lib/chef/provider/service/debian.rb +64 -0
- data/lib/chef/provider/service/freebsd.rb +157 -0
- data/lib/chef/provider/service/gentoo.rb +54 -0
- data/lib/chef/provider/service/init.rb +126 -0
- data/lib/chef/provider/service/redhat.rb +62 -0
- data/lib/chef/provider/template.rb +141 -0
- data/lib/chef/provider/user.rb +170 -0
- data/lib/chef/provider/user/pw.rb +113 -0
- data/lib/chef/provider/user/useradd.rb +107 -0
- data/lib/chef/queue.rb +145 -0
- data/lib/chef/recipe.rb +210 -0
- data/lib/chef/resource.rb +256 -0
- data/lib/chef/resource/apt_package.rb +34 -0
- data/lib/chef/resource/bash.rb +33 -0
- data/lib/chef/resource/cron.rb +143 -0
- data/lib/chef/resource/csh.rb +33 -0
- data/lib/chef/resource/directory.rb +76 -0
- data/lib/chef/resource/dpkg_package.rb +34 -0
- data/lib/chef/resource/execute.rb +127 -0
- data/lib/chef/resource/file.rb +84 -0
- data/lib/chef/resource/gem_package.rb +41 -0
- data/lib/chef/resource/group.rb +68 -0
- data/lib/chef/resource/http_request.rb +52 -0
- data/lib/chef/resource/ifconfig.rb +134 -0
- data/lib/chef/resource/link.rb +78 -0
- data/lib/chef/resource/macports_package.rb +29 -0
- data/lib/chef/resource/mount.rb +135 -0
- data/lib/chef/resource/package.rb +80 -0
- data/lib/chef/resource/perl.rb +33 -0
- data/lib/chef/resource/portage_package.rb +33 -0
- data/lib/chef/resource/python.rb +33 -0
- data/lib/chef/resource/remote_directory.rb +91 -0
- data/lib/chef/resource/remote_file.rb +60 -0
- data/lib/chef/resource/route.rb +135 -0
- data/lib/chef/resource/ruby.rb +33 -0
- data/lib/chef/resource/ruby_block.rb +20 -0
- data/lib/chef/resource/script.rb +51 -0
- data/lib/chef/resource/service.rb +134 -0
- data/lib/chef/resource/template.rb +60 -0
- data/lib/chef/resource/user.rb +98 -0
- data/lib/chef/resource_collection.rb +176 -0
- data/lib/chef/resource_definition.rb +67 -0
- data/lib/chef/rest.rb +238 -0
- data/lib/chef/role.rb +231 -0
- data/lib/chef/run_list.rb +156 -0
- data/lib/chef/runner.rb +123 -0
- data/lib/chef/search.rb +88 -0
- data/lib/chef/search/result.rb +64 -0
- data/lib/chef/search_index.rb +77 -0
- data/lib/chef/tasks/chef_repo.rake +345 -0
- data/lib/chef/util/file_edit.rb +125 -0
- data/lib/chef/util/fileedit.rb +121 -0
- 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
|