From eeb80701c20171f7c2c5a8a6ef8db4c3b56d9380 Mon Sep 17 00:00:00 2001 From: Thomas Bellman <bellman@nsc.liu.se> Date: Wed, 8 Apr 2015 10:49:39 +0200 Subject: [PATCH] Handle resolve_ipnets() returning multiple addresses. In a soon to be coming release of the nsc-puppet-utils module, the resolve_ipnets() function will be able to return multiple addresses even for a single host. Handle that (as well as the old version). Also some fixes for handling IPv6 addresses. --- templates/listen.erb | 27 ++++++++++++++++++--------- templates/named_vhost.conf.erb | 27 ++++++++++++++++++--------- 2 files changed, 36 insertions(+), 18 deletions(-) diff --git a/templates/listen.erb b/templates/listen.erb index a418737..8bc9b93 100644 --- a/templates/listen.erb +++ b/templates/listen.erb @@ -1,22 +1,25 @@ <% listen_on = [] - [@urls].flatten.sort.uniq.each { |u| + [@urls].flatten.sort.uniq.each do |u| u =~ /^([a-z]*):\/\/([^:\/]+|\[[^\[\]]+\])(:([0-9]+))?\/?$/ (schema,host,port) = $1,$2,$4 if host == '' host = @name end if host == '*' - addr = host - elsif host =~ /^\[[0-9a-f:]*:[0-9a-f:]*\]$/ - addr = host # IPv6 numeric address "[0000:1111::eeee:ffff]" + addrs = host + elsif host =~ /^\[[0-9A-Fa-f:]*:[0-9A-Fa-f:]*:[0-9A-Fa-f:]*\]$/ + # IPv6 numeric address "[0000:1111::eeee:ffff]" + # Note: keep brackets, as those are needed below + addrs = host elsif host =~ /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/ - addr = host # IPv4 numeric address "111.222.333.444" + # IPv4 numeric address "111.222.333.444" + addrs = host elsif host =~ /^\[(.+)\]$/ # Hostname within brackets "[www.example.com]", not to be resolved - host = addr = $1 + addrs = host = $1 else - addr = scope.function_resolve_ipnets([host, 'failerrors']) + addrs = scope.function_resolve_ipnets([host, 'failerrors']) end if port == nil if schema == 'http' @@ -29,8 +32,14 @@ raise(Puppet::Error, "Unknown URL schema and no port: #{u}") end end - listen_on << addr + ':' + port + ' ' + schema - } + [addrs].flatten.each do |a| + if a =~ /^[0-9A-Fa-f:]*:[0-9A-Fa-f:]*:[0-9A-Fa-f:]*$/ + # IPv6 addresses need to be enclosed within square brackets + a = '[' + a + ']' + end + listen_on << a + ':' + port + ' ' + schema + end + end listen_on.sort!.uniq! -%> <% listen_on.each do |listen_spec| -%> diff --git a/templates/named_vhost.conf.erb b/templates/named_vhost.conf.erb index add9d12..bf29790 100644 --- a/templates/named_vhost.conf.erb +++ b/templates/named_vhost.conf.erb @@ -1,23 +1,26 @@ <% server_names = [] server_addrs = [] - [@urls].flatten.sort.each { |u| + [@urls].flatten.sort.each do |u| u =~ /^([a-z]*):\/\/([^:\/]+|\[[^\[\]]+\])(:([0-9]+))?\/?$/ (schema,host,port) = $1,$2,$4 if host == '' host = @name end if host == '*' - addr = host - elsif host =~ /^\[[0-9a-f:]*:[0-9a-f:]*\]$/ - addr = host # IPv6 numeric address "[0000:1111::eeee:ffff]" + addrs = host + elsif host =~ /^\[[0-9A-Fa-f:]*:[0-9A-Fa-f:]*:[0-9A-Fa-f:]*\]$/ + # IPv6 numeric address "[0000:1111::eeee:ffff]" + # Note: keep brackets, as those are needed below + addrs = host elsif host =~ /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/ - addr = host # IPv4 numeric address "111.222.333.444" + # IPv4 numeric address "111.222.333.444" + addrs = host elsif host =~ /^\[(.+)\]$/ # Hostname within brackets "[www.example.com]", not to be resolved - host = addr = $1 + addrs = host = $1 else - addr = scope.function_resolve_ipnets([host, 'failerrors']) + addrs = scope.function_resolve_ipnets([host, 'failerrors']) end if port == nil if schema == 'http' @@ -31,8 +34,14 @@ end end server_names << host + ':' + port - server_addrs << addr + ':' + port - } + [addrs].flatten.each do |a| + if a =~ /^[0-9A-Fa-f:]*:[0-9A-Fa-f:]*:[0-9A-Fa-f:]*$/ + # IPv6 addresses need to be enclosed within square brackets + a = '[' + a + ']' + end + server_addrs << a + ':' + port + end + end if @servernames != [] server_names = @servernames end -- GitLab