-
Notifications
You must be signed in to change notification settings - Fork 118
/
cpe_symlinks.rb
74 lines (67 loc) · 2.1 KB
/
cpe_symlinks.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# Copyright (c) Facebook, Inc. and its affiliates.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Cookbook Name:: cpe_symlinks
# Resource:: default
resource_name :cpe_symlinks
provides :cpe_symlinks
default_action :create
# rubocop:disable Metrics/BlockLength
action :create do
return if node['cpe_symlinks'].empty?
cached_path =
::File.join(Chef::Config[:file_cache_path], '.chef-symlinks.json')
cached_list = cached_on_disk(cached_path)
symlink_list = []
# Create symlinks on disk
node['cpe_symlinks'].to_h.map.each do |target_dir, symlinks|
symlinks.each do |target, source|
next unless ::File.exist?(source)
link ::File.join(target_dir, target) do
to source
end
symlink_list << ::File.join(target_dir, target)
end
end
# Cache list of symlinks to disk
file cached_path do
content Chef::JSONCompat.to_json_pretty(symlink_list.uniq)
action :create
owner root_owner
group root_group
mode '755'
end
# Remove any symlinks on disk that have been unmanaged
removal_list = cached_list.uniq - symlink_list.uniq
unless removal_list.empty?
removal_list.each do |symlink|
link symlink do
only_if { ::File.symlink?(symlink) }
# TODO(dmk): Hack needed to rollout chefctl. Will delete after.
not_if { symlink.eql?('/usr/local/bin/chefctl') }
action :delete
end
end
end
end
action_class do
def cached_on_disk(cached_path)
begin
cached_list = Chef::JSONCompat.from_json(::File.read(cached_path))
rescue
cached_list = []
end
cached_list
end
end
# rubocop:enable Metrics/BlockLength