fuel-library/deployment/puppet/osnailyfacter/lib/puppet/parser/functions/generate_plugins_pins.rb

52 lines
1.5 KiB
Ruby

require 'net/http'
require 'uri'
module Puppet::Parser::Functions
newfunction(
:generate_plugins_pins,
:type => :rvalue,
:arity => -1,
:doc => <<-EOS
Takes an array of repositories (in form used in astute.yaml) as argument.
Returns a hash compatible with the apt::pin type provided by puppetlabs/apt
module. It requires working connectivity to given repositories - the function
parses repositories' Release files to obtain fields like Origin, Label, Suite
and Codename. Repositories with no or empty priority are skipped.
EOS
) do |args|
repositories = args[0]
raise Puppet::ParseError, "generate_plugins_pins(): Requires hash to work with" unless repositories.is_a? Hash
result = {}
repositories.each do |name, repo|
next unless repo['priority']
uri = URI.parse "#{repo['location']}/#{repo['suite']}/Release"
response = Net::HTTP.get_response uri
unless response.kind_of? Net::HTTPSuccess
fail "GET HTTP request to: '#{uri.to_s}' have failed! (#{response.code} #{response.message})"
end
value_map = {
'originator' => /^Origin: (.*)/,
'label' => /^Label: (.*)/,
'release' => /^Suite: (.*)/,
'codename' => /^Codename: (.*)/,
}
repo_data = {
'priority' => repo['priority'],
}
value_map.each do |key, regexp|
repo_data[key] = $1 if response.body =~ regexp
end
result.store name, repo_data
end
p result
result
end
end