52 lines
1.5 KiB
Ruby
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
|