- change enc_role and enc_env to read direct from cobbler - cleanup profiles::base::facts Reviewed-on: https://git.query.consul/unkinben/puppet-prod/pulls/219
75 lines
2.0 KiB
Ruby
75 lines
2.0 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'facter'
|
|
require 'yaml'
|
|
require 'net/http'
|
|
require 'uri'
|
|
require 'fileutils'
|
|
|
|
# CobblerENC module: Fetches ENC data from Cobbler, caches it, and provides structured facts.
|
|
module CobblerENC
|
|
CACHE_FILE = '/var/cache/puppet_enc.yaml'
|
|
CACHE_TTL = 7 * 24 * 60 * 60 # 7 days in seconds
|
|
@enc_data = nil # In-memory cache for the ENC response
|
|
|
|
def self.read_cache
|
|
return {} unless File.exist?(CACHE_FILE)
|
|
|
|
cache_data = YAML.safe_load(File.read(CACHE_FILE)) || {}
|
|
timestamp = cache_data.fetch('timestamp', 0)
|
|
|
|
return cache_data if Time.now.to_i - timestamp < CACHE_TTL
|
|
|
|
{}
|
|
end
|
|
|
|
def self.write_cache(enc_data)
|
|
FileUtils.mkdir_p(File.dirname(CACHE_FILE))
|
|
cache_data = enc_data.merge({ 'timestamp' => Time.now.to_i })
|
|
File.write(CACHE_FILE, cache_data.to_yaml)
|
|
end
|
|
|
|
def self.fetch_from_cobbler
|
|
uri = URI("http://cobbler.main.unkin.net/cblr/svc/op/puppet/hostname/#{Facter.value(:fqdn) || Facter.value(:hostname)}")
|
|
response = Net::HTTP.get_response(uri)
|
|
|
|
raise "Failed to fetch ENC data. HTTP #{response.code}" unless response.is_a?(Net::HTTPSuccess)
|
|
|
|
YAML.safe_load(response.body) || {}
|
|
end
|
|
|
|
def self.retrieve_enc_data
|
|
return @enc_data if @enc_data
|
|
|
|
@enc_data = fetch_from_cobbler
|
|
write_cache(@enc_data)
|
|
@enc_data
|
|
end
|
|
|
|
def self.fetch_enc_data
|
|
retrieve_enc_data
|
|
rescue StandardError => e
|
|
Facter.warn("Error retrieving Cobbler ENC data: #{e.message}")
|
|
@enc_data = read_cache
|
|
return @enc_data unless @enc_data.empty?
|
|
|
|
raise 'No cached ENC data available and Cobbler is down.'
|
|
end
|
|
|
|
def self.enc_role
|
|
fetch_enc_data.fetch('classes', {}).keys.first || raise('ENC Role not found in Cobbler ENC response')
|
|
end
|
|
|
|
def self.enc_env
|
|
fetch_enc_data.fetch('environment', nil) || raise('ENC Environment not found in Cobbler ENC response')
|
|
end
|
|
end
|
|
|
|
Facter.add('enc_role') do
|
|
setcode { CobblerENC.enc_role }
|
|
end
|
|
|
|
Facter.add('enc_env') do
|
|
setcode { CobblerENC.enc_env }
|
|
end
|