itchef/cookbooks/cpe_hosts/resources/cpe_hosts.rb (63 lines of code) (raw):
# 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_hosts
# Resource:: cpe_hosts
resource_name :cpe_hosts
provides :cpe_hosts
default_action :run
action :run do
HOSTS_FILE = value_for_platform_family(
'windows' =>
::File.join(
(ENV['WINDIR'] || 'C:\\Windows'), 'System32', 'drivers', 'etc', 'hosts'
),
'default' => '/etc/hosts'.freeze,
)
lines = ::File.readlines(HOSTS_FILE)
chef_managed = lines.select { |x| x.include?('# Chef Managed') }
if chef_managed && node['cpe_hosts']['manage_by_line']
require 'English'
LINE_MARKER = ' # Chef Managed' + $RS
host_entries = node['cpe_hosts']['extra_entries'].reject do |_k, v|
v.nil? || v.empty?
end
lines = get_user_added_entries(lines)
unless host_entries.empty?
host_entries.each do |ip, names|
entry = ip + ' ' + names.join(' ')
lines.push(entry + LINE_MARKER)
end
end
# Write out the new `/etc/hosts` file using the normal chef machinery.
# The defaults for `file` will only write the file if the contents has
# changed, and will do so atomically.
file HOSTS_FILE do
retries 2
ignore_failure true
unless node.windows?
owner node.root_user
group node.root_group
mode '0644'
end
content lines.join
end
else
template HOSTS_FILE do # ~FB031
retries 2
ignore_failure true
source 'hosts.erb'
unless node.windows?
owner node.root_user
group node.root_group
mode '0644'
end
end
end
end
def get_user_added_entries(lines)
excluded_lines = [
'Generated by Chef',
'Local modifications will be overwritten',
'Chef Managed',
]
user_added_entries = []
lines.each do |line|
unless excluded_lines.any? { |l| line.include?(l) }
user_added_entries << line
end
end
user_added_entries
end