cookbooks/fb_yum_repos/libraries/yum_repos_helpers.rb (91 lines of code) (raw):
# Copyright (c) 2021-present, Facebook, Inc.
# All rights reserved.
#
# 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.
#
module FB
class YumRepos
# By convention, some keys in the config use numbers instead of strings to
# represent booleans; track these accordingly to minimize confusion.
NUMBER_BOOLEAN_KEYS = [
'gpgcheck',
'enabled',
'countme',
'repo_gpgcheck',
].freeze
def self.get_default_gpg_key(_node)
value_for_platform(
:centos => {
:default => 'file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial',
},
:fedora => {
:default =>
'file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch',
},
)
end
def self.gen_repo_config(node, name, config = {})
unless node.centos? || node.fedora?
fail "fb_yum_repos[gen_repo_config]: unsupported platform #{platform}"
end
unless config['name']
config['name'] = name
end
if !config['mirrorlist'] && !config['metalink'] && !config['baseurl']
fail 'fb_yum_repos[gen_repo_config]: one of mirrorlist, metalink or ' +
'baseurl must be specified!'
end
if config['gpgcheck'].nil?
config['gpgcheck'] = true
end
if config['enabled'].nil?
config['enabled'] = true
end
if (
config['gpgcheck'] == true ||
config['gpgcheck'] == '1'
) && !config['gpgkey']
config['gpgkey'] = self.get_default_gpg_key(node)
end
config
end
def self.gen_repo_entry(node, name, config = {})
out = "\n[#{name}]\n"
self.gen_repo_config(node, name, config).each do |key, val|
v = self.gen_config_value(key, val)
out += "#{key}=#{v}\n"
end
out
end
def self.gen_group_config(_node, name, config = {})
unless config['repos']
fail 'fb_yum_repos[self.gen_group_config]: no repos defined for ' +
"group #{name}"
end
unless config['description']
config['description'] = name
end
config
end
def self.gen_group_entry(node, name, config = {})
config = self.gen_group_config(node, name, config)
out = "\n# #{config['description']}\n"
config['repos'].each do |repo, repo_config|
out += self.gen_repo_entry(node, repo, repo_config)
end
out
end
def self.gen_config_value(key, value)
if value.is_a?(TrueClass) || value.to_s.strip == '1'
if NUMBER_BOOLEAN_KEYS.include?(key)
'1'
else
'True'
end
elsif value.is_a?(FalseClass) || value.to_s.strip == '0'
if NUMBER_BOOLEAN_KEYS.include?(key)
'0'
else
'False'
end
elsif value.is_a?(Array)
value.join(' ')
else
value.to_s.strip
end
end
end
end