microwave 0.1004.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +201 -0
- data/README.rdoc +102 -0
- data/bin/chef-solo +25 -0
- data/lib/chef.rb +41 -0
- data/lib/chef/application.rb +147 -0
- data/lib/chef/application/solo.rb +181 -0
- data/lib/chef/applications.rb +1 -0
- data/lib/chef/checksum.rb +83 -0
- data/lib/chef/checksum_cache.rb +189 -0
- data/lib/chef/client.rb +325 -0
- data/lib/chef/config.rb +152 -0
- data/lib/chef/cookbook/chefignore.rb +66 -0
- data/lib/chef/cookbook/cookbook_collection.rb +45 -0
- data/lib/chef/cookbook/cookbook_version_loader.rb +173 -0
- data/lib/chef/cookbook/file_system_file_vendor.rb +56 -0
- data/lib/chef/cookbook/file_vendor.rb +48 -0
- data/lib/chef/cookbook/metadata.rb +629 -0
- data/lib/chef/cookbook/syntax_check.rb +136 -0
- data/lib/chef/cookbook_loader.rb +121 -0
- data/lib/chef/cookbook_version.rb +786 -0
- data/lib/chef/cookbook_version_selector.rb +151 -0
- data/lib/chef/environment.rb +267 -0
- data/lib/chef/exceptions.rb +150 -0
- data/lib/chef/file_access_control.rb +144 -0
- data/lib/chef/file_cache.rb +218 -0
- data/lib/chef/handler.rb +206 -0
- data/lib/chef/handler/error_report.rb +33 -0
- data/lib/chef/handler/json_file.rb +58 -0
- data/lib/chef/json_compat.rb +52 -0
- data/lib/chef/log.rb +39 -0
- data/lib/chef/mash.rb +211 -0
- data/lib/chef/mixin/check_helper.rb +31 -0
- data/lib/chef/mixin/checksum.rb +32 -0
- data/lib/chef/mixin/command.rb +221 -0
- data/lib/chef/mixin/command/unix.rb +215 -0
- data/lib/chef/mixin/command/windows.rb +76 -0
- data/lib/chef/mixin/convert_to_class_name.rb +63 -0
- data/lib/chef/mixin/create_path.rb +57 -0
- data/lib/chef/mixin/deep_merge.rb +225 -0
- data/lib/chef/mixin/deprecation.rb +65 -0
- data/lib/chef/mixin/from_file.rb +50 -0
- data/lib/chef/mixin/get_source_from_package.rb +42 -0
- data/lib/chef/mixin/language.rb +125 -0
- data/lib/chef/mixin/language_include_attribute.rb +61 -0
- data/lib/chef/mixin/language_include_recipe.rb +52 -0
- data/lib/chef/mixin/params_validate.rb +225 -0
- data/lib/chef/mixin/recipe_definition_dsl_core.rb +78 -0
- data/lib/chef/mixin/shell_out.rb +41 -0
- data/lib/chef/mixin/template.rb +95 -0
- data/lib/chef/mixin/xml_escape.rb +140 -0
- data/lib/chef/mixins.rb +15 -0
- data/lib/chef/monkey_patches/dir.rb +36 -0
- data/lib/chef/monkey_patches/numeric.rb +15 -0
- data/lib/chef/monkey_patches/object.rb +9 -0
- data/lib/chef/monkey_patches/regexp.rb +34 -0
- data/lib/chef/monkey_patches/string.rb +49 -0
- data/lib/chef/monkey_patches/tempfile.rb +64 -0
- data/lib/chef/nil_argument.rb +3 -0
- data/lib/chef/node.rb +469 -0
- data/lib/chef/node/attribute.rb +487 -0
- data/lib/chef/platform.rb +409 -0
- data/lib/chef/provider.rb +124 -0
- data/lib/chef/provider/breakpoint.rb +31 -0
- data/lib/chef/provider/cookbook_file.rb +100 -0
- data/lib/chef/provider/cron.rb +186 -0
- data/lib/chef/provider/cron/solaris.rb +195 -0
- data/lib/chef/provider/deploy.rb +343 -0
- data/lib/chef/provider/deploy/revision.rb +80 -0
- data/lib/chef/provider/deploy/timestamped.rb +33 -0
- data/lib/chef/provider/directory.rb +72 -0
- data/lib/chef/provider/env.rb +152 -0
- data/lib/chef/provider/env/windows.rb +75 -0
- data/lib/chef/provider/erl_call.rb +101 -0
- data/lib/chef/provider/execute.rb +66 -0
- data/lib/chef/provider/file.rb +222 -0
- data/lib/chef/provider/git.rb +243 -0
- data/lib/chef/provider/group.rb +133 -0
- data/lib/chef/provider/group/aix.rb +70 -0
- data/lib/chef/provider/group/dscl.rb +121 -0
- data/lib/chef/provider/group/gpasswd.rb +53 -0
- data/lib/chef/provider/group/groupadd.rb +81 -0
- data/lib/chef/provider/group/pw.rb +84 -0
- data/lib/chef/provider/group/suse.rb +53 -0
- data/lib/chef/provider/group/usermod.rb +57 -0
- data/lib/chef/provider/group/windows.rb +79 -0
- data/lib/chef/provider/ifconfig.rb +134 -0
- data/lib/chef/provider/link.rb +164 -0
- data/lib/chef/provider/log.rb +54 -0
- data/lib/chef/provider/mdadm.rb +91 -0
- data/lib/chef/provider/mount.rb +114 -0
- data/lib/chef/provider/mount/mount.rb +240 -0
- data/lib/chef/provider/mount/windows.rb +81 -0
- data/lib/chef/provider/ohai.rb +42 -0
- data/lib/chef/provider/package.rb +163 -0
- data/lib/chef/provider/package/apt.rb +135 -0
- data/lib/chef/provider/package/dpkg.rb +115 -0
- data/lib/chef/provider/package/easy_install.rb +136 -0
- data/lib/chef/provider/package/freebsd.rb +125 -0
- data/lib/chef/provider/package/macports.rb +105 -0
- data/lib/chef/provider/package/pacman.rb +101 -0
- data/lib/chef/provider/package/portage.rb +135 -0
- data/lib/chef/provider/package/rpm.rb +104 -0
- data/lib/chef/provider/package/rubygems.rb +465 -0
- data/lib/chef/provider/package/solaris.rb +130 -0
- data/lib/chef/provider/package/yum-dump.py +286 -0
- data/lib/chef/provider/package/yum.rb +1128 -0
- data/lib/chef/provider/package/zypper.rb +144 -0
- data/lib/chef/provider/remote_directory.rb +137 -0
- data/lib/chef/provider/route.rb +193 -0
- data/lib/chef/provider/ruby_block.rb +34 -0
- data/lib/chef/provider/script.rb +55 -0
- data/lib/chef/provider/service.rb +122 -0
- data/lib/chef/provider/service/arch.rb +116 -0
- data/lib/chef/provider/service/debian.rb +130 -0
- data/lib/chef/provider/service/freebsd.rb +154 -0
- data/lib/chef/provider/service/gentoo.rb +53 -0
- data/lib/chef/provider/service/init.rb +71 -0
- data/lib/chef/provider/service/insserv.rb +52 -0
- data/lib/chef/provider/service/redhat.rb +60 -0
- data/lib/chef/provider/service/simple.rb +120 -0
- data/lib/chef/provider/service/solaris.rb +85 -0
- data/lib/chef/provider/service/systemd.rb +102 -0
- data/lib/chef/provider/service/upstart.rb +198 -0
- data/lib/chef/provider/service/windows.rb +146 -0
- data/lib/chef/provider/subversion.rb +197 -0
- data/lib/chef/provider/template.rb +104 -0
- data/lib/chef/provider/user.rb +186 -0
- data/lib/chef/provider/user/dscl.rb +280 -0
- data/lib/chef/provider/user/pw.rb +113 -0
- data/lib/chef/provider/user/useradd.rb +137 -0
- data/lib/chef/provider/user/windows.rb +124 -0
- data/lib/chef/providers.rb +93 -0
- data/lib/chef/recipe.rb +129 -0
- data/lib/chef/resource.rb +584 -0
- data/lib/chef/resource/apt_package.rb +34 -0
- data/lib/chef/resource/bash.rb +33 -0
- data/lib/chef/resource/breakpoint.rb +35 -0
- data/lib/chef/resource/cookbook_file.rb +45 -0
- data/lib/chef/resource/cron.rb +188 -0
- data/lib/chef/resource/csh.rb +33 -0
- data/lib/chef/resource/deploy.rb +380 -0
- data/lib/chef/resource/deploy_revision.rb +40 -0
- data/lib/chef/resource/directory.rb +89 -0
- data/lib/chef/resource/dpkg_package.rb +34 -0
- data/lib/chef/resource/easy_install_package.rb +57 -0
- data/lib/chef/resource/env.rb +58 -0
- data/lib/chef/resource/erl_call.rb +83 -0
- data/lib/chef/resource/execute.rb +127 -0
- data/lib/chef/resource/file.rb +112 -0
- data/lib/chef/resource/freebsd_package.rb +35 -0
- data/lib/chef/resource/gem_package.rb +53 -0
- data/lib/chef/resource/git.rb +46 -0
- data/lib/chef/resource/group.rb +70 -0
- data/lib/chef/resource/ifconfig.rb +134 -0
- data/lib/chef/resource/link.rb +105 -0
- data/lib/chef/resource/log.rb +62 -0
- data/lib/chef/resource/macports_package.rb +29 -0
- data/lib/chef/resource/mdadm.rb +82 -0
- data/lib/chef/resource/mount.rb +134 -0
- data/lib/chef/resource/ohai.rb +40 -0
- data/lib/chef/resource/package.rb +80 -0
- data/lib/chef/resource/pacman_package.rb +33 -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 +109 -0
- data/lib/chef/resource/route.rb +135 -0
- data/lib/chef/resource/rpm_package.rb +34 -0
- data/lib/chef/resource/ruby.rb +33 -0
- data/lib/chef/resource/ruby_block.rb +40 -0
- data/lib/chef/resource/scm.rb +147 -0
- data/lib/chef/resource/script.rb +60 -0
- data/lib/chef/resource/service.rb +160 -0
- data/lib/chef/resource/solaris_package.rb +36 -0
- data/lib/chef/resource/subversion.rb +36 -0
- data/lib/chef/resource/template.rb +69 -0
- data/lib/chef/resource/timestamped_deploy.rb +31 -0
- data/lib/chef/resource/user.rb +130 -0
- data/lib/chef/resource/yum_package.rb +63 -0
- data/lib/chef/resource_collection.rb +217 -0
- data/lib/chef/resource_collection/stepable_iterator.rb +124 -0
- data/lib/chef/resource_definition.rb +67 -0
- data/lib/chef/resource_definition_list.rb +38 -0
- data/lib/chef/resources.rb +62 -0
- data/lib/chef/role.rb +225 -0
- data/lib/chef/run_context.rb +126 -0
- data/lib/chef/run_list.rb +161 -0
- data/lib/chef/run_list/run_list_expansion.rb +159 -0
- data/lib/chef/run_list/run_list_item.rb +92 -0
- data/lib/chef/run_list/versioned_recipe_list.rb +68 -0
- data/lib/chef/run_status.rb +121 -0
- data/lib/chef/runner.rb +105 -0
- data/lib/chef/shell_out.rb +250 -0
- data/lib/chef/shell_out/unix.rb +223 -0
- data/lib/chef/shell_out/windows.rb +98 -0
- data/lib/chef/tasks/chef_repo.rake +330 -0
- data/lib/chef/util/file_edit.rb +122 -0
- data/lib/chef/util/windows.rb +56 -0
- data/lib/chef/util/windows/net_group.rb +101 -0
- data/lib/chef/util/windows/net_use.rb +121 -0
- data/lib/chef/util/windows/net_user.rb +198 -0
- data/lib/chef/util/windows/volume.rb +59 -0
- data/lib/chef/version.rb +23 -0
- data/lib/chef/version_class.rb +70 -0
- data/lib/chef/version_constraint.rb +116 -0
- metadata +493 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Daniel DeLeo (<dan@kallistec.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 Breakpoint < Chef::Provider
|
|
22
|
+
|
|
23
|
+
def load_current_resource
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def action_break
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Daniel DeLeo (<dan@opscode.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 2010 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/file_access_control'
|
|
20
|
+
require 'chef/provider/file'
|
|
21
|
+
require 'tempfile'
|
|
22
|
+
|
|
23
|
+
class Chef
|
|
24
|
+
class Provider
|
|
25
|
+
class CookbookFile < Chef::Provider::File
|
|
26
|
+
|
|
27
|
+
def load_current_resource
|
|
28
|
+
@current_resource = Chef::Resource::CookbookFile.new(@new_resource.name)
|
|
29
|
+
@new_resource.path.gsub!(/\\/, "/") # for Windows
|
|
30
|
+
@current_resource.path(@new_resource.path)
|
|
31
|
+
@current_resource
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def action_create
|
|
35
|
+
assert_enclosing_directory_exists!
|
|
36
|
+
if file_cache_location && content_stale?
|
|
37
|
+
Chef::Log.debug("#{@new_resource} has new contents")
|
|
38
|
+
backup_new_resource
|
|
39
|
+
Tempfile.open(::File.basename(@new_resource.name)) do |staging_file|
|
|
40
|
+
Chef::Log.debug("#{@new_resource} staging #{file_cache_location} to #{staging_file.path}")
|
|
41
|
+
staging_file.close
|
|
42
|
+
stage_file_to_tmpdir(staging_file.path)
|
|
43
|
+
FileUtils.mv(staging_file.path, @new_resource.path)
|
|
44
|
+
end
|
|
45
|
+
Chef::Log.info("#{@new_resource} created file #{@new_resource.path}")
|
|
46
|
+
@new_resource.updated_by_last_action(true)
|
|
47
|
+
else
|
|
48
|
+
set_all_access_controls(@new_resource.path)
|
|
49
|
+
end
|
|
50
|
+
@new_resource.updated_by_last_action?
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def action_create_if_missing
|
|
54
|
+
if ::File.exists?(@new_resource.path)
|
|
55
|
+
Chef::Log.debug("#{@new_resource} exists at #{@new_resource.path} taking no action.")
|
|
56
|
+
else
|
|
57
|
+
action_create
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def file_cache_location
|
|
62
|
+
@file_cache_location ||= begin
|
|
63
|
+
cookbook = run_context.cookbook_collection[resource_cookbook]
|
|
64
|
+
cookbook.preferred_filename_on_disk_location(node, :files, @new_resource.source, @new_resource.path)
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Determine the cookbook to get the file from. If new resource sets an
|
|
69
|
+
# explicit cookbook, use it, otherwise fall back to the implicit cookbook
|
|
70
|
+
# i.e., the cookbook the resource was declared in.
|
|
71
|
+
def resource_cookbook
|
|
72
|
+
@new_resource.cookbook || @new_resource.cookbook_name
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Copy the file from the cookbook cache to a temporary location and then
|
|
76
|
+
# set its file access control settings.
|
|
77
|
+
def stage_file_to_tmpdir(staging_file_location)
|
|
78
|
+
FileUtils.cp(file_cache_location, staging_file_location)
|
|
79
|
+
set_all_access_controls(staging_file_location)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def set_all_access_controls(file)
|
|
83
|
+
access_controls = Chef::FileAccessControl.new(@new_resource, file)
|
|
84
|
+
access_controls.set_all
|
|
85
|
+
@new_resource.updated_by_last_action(access_controls.modified?)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def backup_new_resource
|
|
89
|
+
if ::File.exists?(@new_resource.path)
|
|
90
|
+
backup @new_resource.path
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def content_stale?
|
|
95
|
+
( ! ::File.exist?(@new_resource.path)) || ( ! compare_content)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Bryan McLellan (btm@loftninjas.org)
|
|
3
|
+
# Copyright:: Copyright (c) 2009 Bryan McLellan
|
|
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 Cron < Chef::Provider
|
|
26
|
+
include Chef::Mixin::Command
|
|
27
|
+
|
|
28
|
+
CRON_PATTERN = /([-0-9*,\/]+)\s([-0-9*,\/]+)\s([-0-9*,\/]+)\s([-0-9*,\/]+)\s([-0-9*,\/]+)\s(.*)/
|
|
29
|
+
|
|
30
|
+
def initialize(new_resource, run_context)
|
|
31
|
+
super(new_resource, run_context)
|
|
32
|
+
@cron_exists = false
|
|
33
|
+
@cron_empty = false
|
|
34
|
+
end
|
|
35
|
+
attr_accessor :cron_exists, :cron_empty
|
|
36
|
+
|
|
37
|
+
def load_current_resource
|
|
38
|
+
crontab_lines = []
|
|
39
|
+
@current_resource = Chef::Resource::Cron.new(@new_resource.name)
|
|
40
|
+
@current_resource.user(@new_resource.user)
|
|
41
|
+
status = popen4("crontab -l -u #{@new_resource.user}") do |pid, stdin, stdout, stderr|
|
|
42
|
+
stdout.each_line { |line| crontab_lines << line }
|
|
43
|
+
end
|
|
44
|
+
if status.exitstatus > 1
|
|
45
|
+
raise Chef::Exceptions::Cron, "Error determining state of #{@new_resource.name}, exit: #{status.exitstatus}"
|
|
46
|
+
elsif status.exitstatus == 0
|
|
47
|
+
cron_found = false
|
|
48
|
+
crontab_lines.each do |line|
|
|
49
|
+
case line.chomp
|
|
50
|
+
when "# Chef Name: #{@new_resource.name}"
|
|
51
|
+
Chef::Log.debug("Found cron '#{@new_resource.name}'")
|
|
52
|
+
cron_found = true
|
|
53
|
+
@cron_exists = true
|
|
54
|
+
next
|
|
55
|
+
when /^MAILTO=(\S*)/
|
|
56
|
+
@current_resource.mailto($1) if cron_found
|
|
57
|
+
next
|
|
58
|
+
when /^PATH=(\S*)/
|
|
59
|
+
@current_resource.path($1) if cron_found
|
|
60
|
+
next
|
|
61
|
+
when /^SHELL=(\S*)/
|
|
62
|
+
@current_resource.shell($1) if cron_found
|
|
63
|
+
next
|
|
64
|
+
when /^HOME=(\S*)/
|
|
65
|
+
@current_resource.home($1) if cron_found
|
|
66
|
+
next
|
|
67
|
+
when CRON_PATTERN
|
|
68
|
+
if cron_found
|
|
69
|
+
@current_resource.minute($1)
|
|
70
|
+
@current_resource.hour($2)
|
|
71
|
+
@current_resource.day($3)
|
|
72
|
+
@current_resource.month($4)
|
|
73
|
+
@current_resource.weekday($5)
|
|
74
|
+
@current_resource.command($6)
|
|
75
|
+
cron_found=false
|
|
76
|
+
end
|
|
77
|
+
next
|
|
78
|
+
else
|
|
79
|
+
next
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
Chef::Log.debug("Cron '#{@new_resource.name}' not found") unless @cron_exists
|
|
83
|
+
elsif status.exitstatus == 1
|
|
84
|
+
Chef::Log.debug("Cron empty for '#{@new_resource.user}'")
|
|
85
|
+
@cron_empty = true
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
@current_resource
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def compare_cron
|
|
92
|
+
[ :minute, :hour, :day, :month, :weekday, :command, :mailto, :path, :shell, :home ].any? do |cron_var|
|
|
93
|
+
!@new_resource.send(cron_var).nil? && @new_resource.send(cron_var) != @current_resource.send(cron_var)
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def action_create
|
|
98
|
+
crontab = String.new
|
|
99
|
+
newcron = String.new
|
|
100
|
+
cron_found = false
|
|
101
|
+
|
|
102
|
+
newcron << "# Chef Name: #{new_resource.name}\n"
|
|
103
|
+
[ :mailto, :path, :shell, :home ].each do |v|
|
|
104
|
+
newcron << "#{v.to_s.upcase}=#{@new_resource.send(v)}\n" if @new_resource.send(v)
|
|
105
|
+
end
|
|
106
|
+
newcron << "#{@new_resource.minute} #{@new_resource.hour} #{@new_resource.day} #{@new_resource.month} #{@new_resource.weekday} #{@new_resource.command}\n"
|
|
107
|
+
|
|
108
|
+
if @cron_exists
|
|
109
|
+
unless compare_cron
|
|
110
|
+
Chef::Log.debug("Skipping existing cron entry '#{@new_resource.name}'")
|
|
111
|
+
return
|
|
112
|
+
end
|
|
113
|
+
status = popen4("crontab -l -u #{@new_resource.user}") do |pid, stdin, stdout, stderr|
|
|
114
|
+
stdout.each_line do |line|
|
|
115
|
+
case line.chomp
|
|
116
|
+
when "# Chef Name: #{@new_resource.name}"
|
|
117
|
+
cron_found = true
|
|
118
|
+
next
|
|
119
|
+
when CRON_PATTERN
|
|
120
|
+
if cron_found
|
|
121
|
+
cron_found = false
|
|
122
|
+
crontab << newcron
|
|
123
|
+
next
|
|
124
|
+
end
|
|
125
|
+
else
|
|
126
|
+
next if cron_found
|
|
127
|
+
end
|
|
128
|
+
crontab << line
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
status = $testrun || popen4("crontab -u #{@new_resource.user} -", :waitlast => true) do |pid, stdin, stdout, stderr|
|
|
133
|
+
crontab.each_line { |line| stdin.puts "#{line}" }
|
|
134
|
+
end
|
|
135
|
+
Chef::Log.info("#{@new_resource} updated crontab entry")
|
|
136
|
+
@new_resource.updated_by_last_action(true)
|
|
137
|
+
else
|
|
138
|
+
unless @cron_empty
|
|
139
|
+
status = popen4("crontab -l -u #{@new_resource.user}") do |pid, stdin, stdout, stderr|
|
|
140
|
+
stdout.each { |line| crontab << line }
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
crontab << newcron
|
|
145
|
+
|
|
146
|
+
status = $testrun || popen4("crontab -u #{@new_resource.user} -", :waitlast => true) do |pid, stdin, stdout, stderr|
|
|
147
|
+
crontab.each_line { |line| stdin.puts "#{line}" }
|
|
148
|
+
end
|
|
149
|
+
Chef::Log.info("#{@new_resource} added crontab entry")
|
|
150
|
+
@new_resource.updated_by_last_action(true)
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def action_delete
|
|
155
|
+
if @cron_exists
|
|
156
|
+
crontab = String.new
|
|
157
|
+
cron_found = false
|
|
158
|
+
status = popen4("crontab -l -u #{@new_resource.user}") do |pid, stdin, stdout, stderr|
|
|
159
|
+
stdout.each_line do |line|
|
|
160
|
+
case line.chomp
|
|
161
|
+
when "# Chef Name: #{@new_resource.name}"
|
|
162
|
+
cron_found = true
|
|
163
|
+
next
|
|
164
|
+
when CRON_PATTERN
|
|
165
|
+
if cron_found
|
|
166
|
+
cron_found = false
|
|
167
|
+
next
|
|
168
|
+
end
|
|
169
|
+
else
|
|
170
|
+
next if cron_found
|
|
171
|
+
end
|
|
172
|
+
crontab << line
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
status = $testrun || popen4("crontab -u #{@new_resource.user} -", :waitlast => true) do |pid, stdin, stdout, stderr|
|
|
177
|
+
crontab.each_line { |line| stdin.puts "#{line}" }
|
|
178
|
+
end
|
|
179
|
+
Chef::Log.info("#{@new_resource} deleted crontab entry")
|
|
180
|
+
@new_resource.updated_by_last_action(true)
|
|
181
|
+
end
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
end
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Bryan McLellan (btm@loftninjas.org)
|
|
3
|
+
# Author:: Toomas Pelberg (toomasp@gmx.net)
|
|
4
|
+
# Copyright:: Copyright (c) 2009 Bryan McLellan
|
|
5
|
+
# Copyright:: Copyright (c) 2010 Toomas Pelberg
|
|
6
|
+
# License:: Apache License, Version 2.0
|
|
7
|
+
#
|
|
8
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
9
|
+
# you may not use this file except in compliance with the License.
|
|
10
|
+
# You may obtain a copy of the License at
|
|
11
|
+
#
|
|
12
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
13
|
+
#
|
|
14
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
15
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
16
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
17
|
+
# See the License for the specific language governing permissions and
|
|
18
|
+
# limitations under the License.
|
|
19
|
+
#
|
|
20
|
+
|
|
21
|
+
require 'chef/log'
|
|
22
|
+
require 'chef/mixin/command'
|
|
23
|
+
require 'chef/provider'
|
|
24
|
+
|
|
25
|
+
class Chef
|
|
26
|
+
class Provider
|
|
27
|
+
class Cron
|
|
28
|
+
class Solaris < Chef::Provider::Cron
|
|
29
|
+
include Chef::Mixin::Command
|
|
30
|
+
|
|
31
|
+
CRON_PATTERN = /([-0-9*,\/]+)\s([-0-9*,\/]+)\s([-0-9*,\/]+)\s([-0-9*,\/]+)\s([-0-9*,\/]+)\s(.*)/
|
|
32
|
+
|
|
33
|
+
def initialize(new_resource, run_context)
|
|
34
|
+
super(new_resource, run_context)
|
|
35
|
+
@cron_exists = false
|
|
36
|
+
@cron_empty = false
|
|
37
|
+
end
|
|
38
|
+
attr_accessor :cron_exists, :cron_empty
|
|
39
|
+
|
|
40
|
+
def load_current_resource
|
|
41
|
+
crontab_lines = []
|
|
42
|
+
@current_resource = Chef::Resource::Cron.new(@new_resource.name)
|
|
43
|
+
@current_resource.user(@new_resource.user)
|
|
44
|
+
status = popen4("crontab -l #{@new_resource.user}") do |pid, stdin, stdout, stderr|
|
|
45
|
+
stdout.each_line { |line| crontab_lines << line }
|
|
46
|
+
end
|
|
47
|
+
if status.exitstatus > 1
|
|
48
|
+
raise Chef::Exceptions::Cron, "Error determining state of #{@new_resource.name}, exit: #{status.exitstatus}"
|
|
49
|
+
elsif status.exitstatus == 0
|
|
50
|
+
cron_found = false
|
|
51
|
+
crontab_lines.each do |line|
|
|
52
|
+
case line.chomp
|
|
53
|
+
when "# Chef Name: #{@new_resource.name}"
|
|
54
|
+
Chef::Log.debug("#{@new_resource} found cron '#{@new_resource.name}'")
|
|
55
|
+
cron_found = true
|
|
56
|
+
@cron_exists = true
|
|
57
|
+
next
|
|
58
|
+
when /^MAILTO=(\S*)/
|
|
59
|
+
@current_resource.mailto($1) if cron_found
|
|
60
|
+
next
|
|
61
|
+
when /^PATH=(\S*)/
|
|
62
|
+
@current_resource.path($1) if cron_found
|
|
63
|
+
next
|
|
64
|
+
when /^SHELL=(\S*)/
|
|
65
|
+
@current_resource.shell($1) if cron_found
|
|
66
|
+
next
|
|
67
|
+
when /^HOME=(\S*)/
|
|
68
|
+
@current_resource.home($1) if cron_found
|
|
69
|
+
next
|
|
70
|
+
when CRON_PATTERN
|
|
71
|
+
if cron_found
|
|
72
|
+
@current_resource.minute($1)
|
|
73
|
+
@current_resource.hour($2)
|
|
74
|
+
@current_resource.day($3)
|
|
75
|
+
@current_resource.month($4)
|
|
76
|
+
@current_resource.weekday($5)
|
|
77
|
+
@current_resource.command($6)
|
|
78
|
+
cron_found=false
|
|
79
|
+
end
|
|
80
|
+
next
|
|
81
|
+
else
|
|
82
|
+
next
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
Chef::Log.debug("#{@new_resource} cron '#{@new_resource.name}' not found") unless @cron_exists
|
|
86
|
+
elsif status.exitstatus == 1
|
|
87
|
+
Chef::Log.debug("#{@new_resource} cron empty for '#{@new_resource.user}'")
|
|
88
|
+
@cron_empty = true
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
@current_resource
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def compare_cron
|
|
95
|
+
[ :minute, :hour, :day, :month, :weekday, :command, :mailto, :path, :shell, :home ].any? do |cron_var|
|
|
96
|
+
!@new_resource.send(cron_var).nil? && @new_resource.send(cron_var) != @current_resource.send(cron_var)
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def write_crontab(crontab)
|
|
101
|
+
tempcron = Tempfile.new("chef-cron")
|
|
102
|
+
tempcron << crontab
|
|
103
|
+
tempcron.flush
|
|
104
|
+
tempcron.chmod(0644)
|
|
105
|
+
status = run_command(:command => "/usr/bin/crontab #{tempcron.path}",:user => @new_resource.user)
|
|
106
|
+
if(status == 0)
|
|
107
|
+
@new_resource.updated_by_last_action(true)
|
|
108
|
+
else
|
|
109
|
+
@new_resource.updated_by_last_action(false)
|
|
110
|
+
end
|
|
111
|
+
tempcron.close!
|
|
112
|
+
return status
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def action_create
|
|
116
|
+
crontab = String.new
|
|
117
|
+
newcron = String.new
|
|
118
|
+
cron_found = false
|
|
119
|
+
|
|
120
|
+
newcron << "# Chef Name: #{new_resource.name}\n"
|
|
121
|
+
[ :mailto, :path, :shell, :home ].each do |v|
|
|
122
|
+
newcron << "#{v.to_s.upcase}=#{@new_resource.send(v)}\n" if @new_resource.send(v)
|
|
123
|
+
end
|
|
124
|
+
newcron << "#{@new_resource.minute} #{@new_resource.hour} #{@new_resource.day} #{@new_resource.month} #{@new_resource.weekday} #{@new_resource.command}\n"
|
|
125
|
+
|
|
126
|
+
if @cron_exists
|
|
127
|
+
unless compare_cron
|
|
128
|
+
Chef::Log.debug("#{@new_resource} skipping existing cron entry '#{@new_resource.name}'")
|
|
129
|
+
return
|
|
130
|
+
end
|
|
131
|
+
status = popen4("crontab -l #{@new_resource.user}") do |pid, stdin, stdout, stderr|
|
|
132
|
+
stdout.each_line do |line|
|
|
133
|
+
case line.chomp
|
|
134
|
+
when "# Chef Name: #{@new_resource.name}"
|
|
135
|
+
cron_found = true
|
|
136
|
+
next
|
|
137
|
+
when CRON_PATTERN
|
|
138
|
+
if cron_found
|
|
139
|
+
cron_found = false
|
|
140
|
+
crontab << newcron
|
|
141
|
+
next
|
|
142
|
+
end
|
|
143
|
+
else
|
|
144
|
+
next if cron_found
|
|
145
|
+
end
|
|
146
|
+
crontab << line
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
status = write_crontab(crontab)
|
|
151
|
+
Chef::Log.info("#{@new_resource} updated crontab entry")
|
|
152
|
+
else
|
|
153
|
+
unless @cron_empty
|
|
154
|
+
status = popen4("crontab -l #{@new_resource.user}") do |pid, stdin, stdout, stderr|
|
|
155
|
+
stdout.each { |line| crontab << line }
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
crontab << newcron
|
|
160
|
+
status = write_crontab(crontab)
|
|
161
|
+
Chef::Log.info("#{@new_resource} added crontab entry")
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
def action_delete
|
|
166
|
+
if @cron_exists
|
|
167
|
+
crontab = String.new
|
|
168
|
+
cron_found = false
|
|
169
|
+
status = popen4("crontab -l #{@new_resource.user}") do |pid, stdin, stdout, stderr|
|
|
170
|
+
stdout.each_line do |line|
|
|
171
|
+
case line.chomp
|
|
172
|
+
when "# Chef Name: #{@new_resource.name}"
|
|
173
|
+
cron_found = true
|
|
174
|
+
next
|
|
175
|
+
when CRON_PATTERN
|
|
176
|
+
if cron_found
|
|
177
|
+
cron_found = false
|
|
178
|
+
next
|
|
179
|
+
end
|
|
180
|
+
else
|
|
181
|
+
next if cron_found
|
|
182
|
+
end
|
|
183
|
+
crontab << line
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
status = write_crontab(crontab)
|
|
188
|
+
Chef::Log.info("#{@new_resource} deleted crontab entry")
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
end
|