From 482d0cd0d52cc2fa2cbaf856194657f8ad5f641e Mon Sep 17 00:00:00 2001 From: Benedikt Trefzer Date: Tue, 10 Mar 2026 08:47:02 +0100 Subject: [PATCH] add xmpp srv records --- REFERENCE.md | 275 ++++++++++++++++++++- manifests/records/defaults/mail.pp | 1 - manifests/records/defaults/xmpp.pp | 43 ++++ manifests/records/xmpp.pp | 149 +++++++++++ spec/classes/records/defaults/xmpp_spec.rb | 27 ++ spec/defines/records/xmpp_spec.rb | 86 +++++++ 6 files changed, 579 insertions(+), 2 deletions(-) create mode 100644 manifests/records/defaults/xmpp.pp create mode 100644 manifests/records/xmpp.pp create mode 100644 spec/classes/records/defaults/xmpp_spec.rb create mode 100644 spec/defines/records/xmpp_spec.rb diff --git a/REFERENCE.md b/REFERENCE.md index 7e4b9a1..35735a6 100644 --- a/REFERENCE.md +++ b/REFERENCE.md @@ -13,6 +13,7 @@ * [`knot::records::defaults::srv`](#knot--records--defaults--srv): defaults for srv records * [`knot::records::defaults::tlsa`](#knot--records--defaults--tlsa): defaults for tlsa records * [`knot::records::defaults::webserver`](#knot--records--defaults--webserver): default values for knot::records::webserver +* [`knot::records::defaults::xmpp`](#knot--records--defaults--xmpp): default settings for knot::records::xmpp * [`knot::records::sshfp::export`](#knot--records--sshfp--export): export sshfp keys for inclusion in dns * [`knot::records::sshfp::import`](#knot--records--sshfp--import): import exported sshfp records @@ -26,6 +27,7 @@ * [`knot::records::srv`](#knot--records--srv): add srv records * [`knot::records::tlsa`](#knot--records--tlsa): add tlsa records * [`knot::records::webserver`](#knot--records--webserver): add webserver dns records to the domain +* [`knot::records::xmpp`](#knot--records--xmpp): add srv records ### Resource types @@ -586,7 +588,6 @@ Example: 'target_port' => 443, 'target' => 'autodiscover.hostname.com' } -default from knot::records::defaults::mail Default value: `[]` @@ -858,6 +859,118 @@ tlsa service records to create (using define knot::records::tlsa) Default value: `[{ 'port' => 443, 'proto' => 'tcp' }]` +### `knot::records::defaults::xmpp` + +default settings for knot::records::xmpp + +#### Parameters + +The following parameters are available in the `knot::records::defaults::xmpp` class: + +* [`xmpp_client`](#-knot--records--defaults--xmpp--xmpp_client) +* [`xmpp_client_service`](#-knot--records--defaults--xmpp--xmpp_client_service) +* [`xmpps_client`](#-knot--records--defaults--xmpp--xmpps_client) +* [`xmpps_client_service`](#-knot--records--defaults--xmpp--xmpps_client_service) +* [`xmpp_server`](#-knot--records--defaults--xmpp--xmpp_server) +* [`xmpp_server_service`](#-knot--records--defaults--xmpp--xmpp_server_service) +* [`xmpps_server`](#-knot--records--defaults--xmpp--xmpps_server) +* [`xmpps_server_service`](#-knot--records--defaults--xmpp--xmpps_server_service) +* [`txt_records`](#-knot--records--defaults--xmpp--txt_records) +* [`tlsa`](#-knot--records--defaults--xmpp--tlsa) +* [`ttl`](#-knot--records--defaults--xmpp--ttl) + +##### `xmpp_client` + +Data type: `Array` + +srv setting for SRV record of xmpp_client +if not explicitly set { target => $dest_server } will be added. + +Default value: `[{ 'priority' => 0, 'weight' => 5, 'target_port' => 5222 }]` + +##### `xmpp_client_service` + +Data type: `Array[Knot::Record::Service]` + +Array of services for xmpp_client. + +Default value: `[{ 'port' => 'xmpp-client', 'proto' => 'tcp' }]` + +##### `xmpps_client` + +Data type: `Array` + +srv setting for SRV record of xmpps_client +if not explicitly set { target => $dest_server } will be added. + +Default value: `[{ 'priority' => 0, 'weight' => 5, 'target_port' => 5223 }]` + +##### `xmpps_client_service` + +Data type: `Array[Knot::Record::Service]` + +Array of services for xmpps_client. + +Default value: `[{ 'port' => 'xmpps-client', 'proto' => 'tcp' }]` + +##### `xmpp_server` + +Data type: `Array` + +srv setting for SRV record of xmpp_server +if not explicitly set { target => $dest_server } will be added. + +Default value: `[{ 'priority' => 0, 'weight' => 5, 'target_port' => 5269 }]` + +##### `xmpp_server_service` + +Data type: `Array[Knot::Record::Service]` + +Array of services for xmpp_server. + +Default value: `[{ 'port' => 'xmpp-server', 'proto' => 'tcp' }]` + +##### `xmpps_server` + +Data type: `Array` + +srv setting for SRV record of xmpps_server +if not explicitly set { target => $dest_server } will be added. + +Default value: `[{ 'priority' => 0, 'weight' => 5, 'target_port' => 5270 }]` + +##### `xmpps_server_service` + +Data type: `Array[Knot::Record::Service]` + +Array of services for xmpps_server. + +Default value: `[{ 'port' => 'xmpps-server', 'proto' => 'tcp' }]` + +##### `txt_records` + +Data type: `Array[String[1]]` + +add _xmppconnect txt records. + +Default value: `[]` + +##### `tlsa` + +Data type: `Array[Knot::Record::Tlsa]` + +tlsa records to create (using define knot::records::tlsa) + +Default value: `[]` + +##### `ttl` + +Data type: `Integer` + +the time to live (used for all records) + +Default value: `3600` + ### `knot::records::sshfp::export` export sshfp keys for inclusion in dns @@ -2484,6 +2597,166 @@ default from knot::records::defaults::webserver (port 443, tcp) Default value: `undef` +### `knot::records::xmpp` + +default values can be configured in the class +knot::records::defaults::srv which is included +here (eg in hiera). + +#### Parameters + +The following parameters are available in the `knot::records::xmpp` defined type: + +* [`dest_server`](#-knot--records--xmpp--dest_server) +* [`rname`](#-knot--records--xmpp--rname) +* [`target_zone`](#-knot--records--xmpp--target_zone) +* [`xmpp_client`](#-knot--records--xmpp--xmpp_client) +* [`xmpp_client_service`](#-knot--records--xmpp--xmpp_client_service) +* [`xmpps_client`](#-knot--records--xmpp--xmpps_client) +* [`xmpps_client_service`](#-knot--records--xmpp--xmpps_client_service) +* [`xmpp_server`](#-knot--records--xmpp--xmpp_server) +* [`xmpp_server_service`](#-knot--records--xmpp--xmpp_server_service) +* [`xmpps_server`](#-knot--records--xmpp--xmpps_server) +* [`xmpps_server_service`](#-knot--records--xmpp--xmpps_server_service) +* [`ttl`](#-knot--records--xmpp--ttl) +* [`txt_records`](#-knot--records--xmpp--txt_records) +* [`tlsa`](#-knot--records--xmpp--tlsa) +* [`tlsa_service`](#-knot--records--xmpp--tlsa_service) + +##### `dest_server` + +Data type: `String[1]` + +the destination xmpp server + +##### `rname` + +Data type: `Optional[String[1]]` + +the hostname to add + +Default value: `undef` + +##### `target_zone` + +Data type: `Optional[String[1]]` + +the target zone to add the records + +Default value: `undef` + +##### `xmpp_client` + +Data type: `Optional[Array]` + +srv setting for SRV record of xmpp_client +if not explicitly set { target => $dest_server } will be added. +default from knot::records::defaults::xmpp + +Default value: `undef` + +##### `xmpp_client_service` + +Data type: `Optional[Array[Knot::Record::Service]]` + +Array of services for xmpp_client. +default from knot::records::defaults::xmpp + +Default value: `undef` + +##### `xmpps_client` + +Data type: `Optional[Array]` + +srv setting for SRV record of xmpps_client +if not explicitly set { target => $dest_server } will be added. +default from knot::records::defaults::xmpp + +Default value: `undef` + +##### `xmpps_client_service` + +Data type: `Optional[Array[Knot::Record::Service]]` + +Array of services for xmpps_client. +default from knot::records::defaults::xmpp + +Default value: `undef` + +##### `xmpp_server` + +Data type: `Optional[Array]` + +srv setting for SRV record of xmpp_server +if not explicitly set { target => $dest_server } will be added. +default from knot::records::defaults::xmpp + +Default value: `undef` + +##### `xmpp_server_service` + +Data type: `Optional[Array[Knot::Record::Service]]` + +Array of services for xmpp_server. +default from knot::records::defaults::xmpp + +Default value: `undef` + +##### `xmpps_server` + +Data type: `Optional[Array]` + +srv setting for SRV record of xmpps_server +if not explicitly set { target => $dest_server } will be added. +default from knot::records::defaults::xmpp + +Default value: `undef` + +##### `xmpps_server_service` + +Data type: `Optional[Array[Knot::Record::Service]]` + +Array of services for xmpps_server. +default from knot::records::defaults::xmpp + +Default value: `undef` + +##### `ttl` + +Data type: `Optional[Integer]` + +the time to live (used for all records) +default from knot::records::defaults::xmpp + +Default value: `undef` + +##### `txt_records` + +Data type: `Optional[Array[String[1]]]` + +add _xmppconnect txt records. +remark: deprecated but ... + +Default value: `undef` + +##### `tlsa` + +Data type: `Optional[Array[Knot::Record::Tlsa]]` + +tlsa records to create (using define knot::records::tlsa) +default from knot::records::defaults::xmpp + +Default value: `undef` + +##### `tlsa_service` + +Data type: `Optional[Array[Knot::Record::Service]]` + +tlsa services to create tlsa records for (using define knot::records::tlsa) +defaults to the target ports of $xmpps_server + $xmpps_client + +Default value: `undef` + ## Resource types ### `knot_record` diff --git a/manifests/records/defaults/mail.pp b/manifests/records/defaults/mail.pp index ba2cb89..391bb5b 100644 --- a/manifests/records/defaults/mail.pp +++ b/manifests/records/defaults/mail.pp @@ -16,7 +16,6 @@ # 'target_port' => 443, # 'target' => 'autodiscover.hostname.com' # } -# default from knot::records::defaults::mail # @param autoconfig # target to config for autconfig (eg. Thunderbird) # a CNAME record is created diff --git a/manifests/records/defaults/xmpp.pp b/manifests/records/defaults/xmpp.pp new file mode 100644 index 0000000..016cd26 --- /dev/null +++ b/manifests/records/defaults/xmpp.pp @@ -0,0 +1,43 @@ +# @summary default settings for knot::records::xmpp +# +# @param xmpp_client +# srv setting for SRV record of xmpp_client +# if not explicitly set { target => $dest_server } will be added. +# @param xmpp_client_service +# Array of services for xmpp_client. +# @param xmpps_client +# srv setting for SRV record of xmpps_client +# if not explicitly set { target => $dest_server } will be added. +# @param xmpps_client_service +# Array of services for xmpps_client. +# @param xmpp_server +# srv setting for SRV record of xmpp_server +# if not explicitly set { target => $dest_server } will be added. +# @param xmpp_server_service +# Array of services for xmpp_server. +# @param xmpps_server +# srv setting for SRV record of xmpps_server +# if not explicitly set { target => $dest_server } will be added. +# @param xmpps_server_service +# Array of services for xmpps_server. +# @param txt_records +# add _xmppconnect txt records. +# @param tlsa +# tlsa records to create (using define knot::records::tlsa) +# @param ttl +# the time to live (used for all records) +# +class knot::records::defaults::xmpp ( + Array $xmpp_client = [{ 'priority' => 0, 'weight' => 5, 'target_port' => 5222 }], + Array[Knot::Record::Service] $xmpp_client_service = [{ 'port' => 'xmpp-client', 'proto' => 'tcp' }], + Array $xmpps_client = [{ 'priority' => 0, 'weight' => 5, 'target_port' => 5223 }], + Array[Knot::Record::Service] $xmpps_client_service = [{ 'port' => 'xmpps-client', 'proto' => 'tcp' }], + Array $xmpp_server = [{ 'priority' => 0, 'weight' => 5, 'target_port' => 5269 }], + Array[Knot::Record::Service] $xmpp_server_service = [{ 'port' => 'xmpp-server', 'proto' => 'tcp' }], + Array $xmpps_server = [{ 'priority' => 0, 'weight' => 5, 'target_port' => 5270 }], + Array[Knot::Record::Service] $xmpps_server_service = [{ 'port' => 'xmpps-server', 'proto' => 'tcp' }], + Array[Knot::Record::Tlsa] $tlsa = [], + Array[String[1]] $txt_records = [], + Integer $ttl = 3600, +) { +} diff --git a/manifests/records/xmpp.pp b/manifests/records/xmpp.pp new file mode 100644 index 0000000..8467e0a --- /dev/null +++ b/manifests/records/xmpp.pp @@ -0,0 +1,149 @@ +# @summary add srv records +# +# default values can be configured in the class +# knot::records::defaults::srv which is included +# here (eg in hiera). +# +# @param dest_server +# the destination xmpp server +# @param rname +# the hostname to add +# @param target_zone +# the target zone to add the records +# @param xmpp_client +# srv setting for SRV record of xmpp_client +# if not explicitly set { target => $dest_server } will be added. +# default from knot::records::defaults::xmpp +# @param xmpp_client_service +# Array of services for xmpp_client. +# default from knot::records::defaults::xmpp +# @param xmpps_client +# srv setting for SRV record of xmpps_client +# if not explicitly set { target => $dest_server } will be added. +# default from knot::records::defaults::xmpp +# @param xmpps_client_service +# Array of services for xmpps_client. +# default from knot::records::defaults::xmpp +# @param xmpp_server +# srv setting for SRV record of xmpp_server +# if not explicitly set { target => $dest_server } will be added. +# default from knot::records::defaults::xmpp +# @param xmpp_server_service +# Array of services for xmpp_server. +# default from knot::records::defaults::xmpp +# @param xmpps_server +# srv setting for SRV record of xmpps_server +# if not explicitly set { target => $dest_server } will be added. +# default from knot::records::defaults::xmpp +# @param xmpps_server_service +# Array of services for xmpps_server. +# default from knot::records::defaults::xmpp +# @param ttl +# the time to live (used for all records) +# default from knot::records::defaults::xmpp +# @param txt_records +# add _xmppconnect txt records. +# remark: deprecated but ... +# @param tlsa +# tlsa records to create (using define knot::records::tlsa) +# default from knot::records::defaults::xmpp +# @param tlsa_service +# tlsa services to create tlsa records for (using define knot::records::tlsa) +# defaults to the target ports of $xmpps_server + $xmpps_client +# +define knot::records::xmpp ( + String[1] $dest_server, + Optional[String[1]] $rname = undef, + Optional[String[1]] $target_zone = undef, + Optional[Array] $xmpp_client = undef, + Optional[Array[Knot::Record::Service]] $xmpp_client_service = undef, + Optional[Array] $xmpps_client = undef, + Optional[Array[Knot::Record::Service]] $xmpps_client_service = undef, + Optional[Array] $xmpp_server = undef, + Optional[Array[Knot::Record::Service]] $xmpp_server_service = undef, + Optional[Array] $xmpps_server = undef, + Optional[Array[Knot::Record::Service]] $xmpps_server_service = undef, + Optional[Integer] $ttl = undef, + Optional[Array[String[1]]] $txt_records = undef, + Optional[Array[Knot::Record::Tlsa]] $tlsa = undef, + Optional[Array[Knot::Record::Service]] $tlsa_service = undef, +) { + $_target_zone = pick($target_zone, knot::zone($title)) + $_rname = pick($rname, knot::hname($title)) + + include knot::records::defaults::xmpp + + $_xmpp_client = pick($xmpp_client, $knot::records::defaults::xmpp::xmpp_client) + $_xmpp_client_service = pick($xmpp_client_service, $knot::records::defaults::xmpp::xmpp_client_service) + $_xmpps_client = pick($xmpps_client, $knot::records::defaults::xmpp::xmpps_client) + $_xmpps_client_service = pick($xmpps_client_service, $knot::records::defaults::xmpp::xmpps_client_service) + $_xmpp_server = pick($xmpp_server, $knot::records::defaults::xmpp::xmpp_server) + $_xmpp_server_service = pick($xmpp_server_service, $knot::records::defaults::xmpp::xmpp_server_service) + $_xmpps_server = pick($xmpps_server, $knot::records::defaults::xmpp::xmpps_server) + $_xmpps_server_service = pick($xmpps_server_service, $knot::records::defaults::xmpp::xmpps_server_service) + $_ttl = pick($ttl, $knot::records::defaults::xmpp::ttl) + $_txt_records = pick($txt_records, $knot::records::defaults::xmpp::txt_records) + + $_tlsa = pick($tlsa, $knot::records::defaults::xmpp::tlsa) + + if $tlsa_service { + $_tlsa_service = $tlsa_service + } else { + $_tlsa_service = ($_xmpps_client + $_xmpps_server).map | $t | { + { 'port' => $t['target_port'], 'proto' => 'tcp' } + } + } + + knot::records::srv { "SRV xmpp-client ${title}": + target_zone => $_target_zone, + rname => $_rname, + srv => $_xmpp_client.map | $t | { { 'target' => $dest_server } + $t }, + service => $_xmpp_client_service, + ttl => $_ttl, + } + knot::records::srv { "SRV xmpps-client ${title}": + target_zone => $_target_zone, + rname => $_rname, + srv => $_xmpps_client.map | $t | { { 'target' => $dest_server } + $t }, + service => $_xmpps_client_service, + ttl => $_ttl, + } + + knot::records::srv { "SRV xmpp-server ${title}": + target_zone => $_target_zone, + rname => $_rname, + srv => $_xmpp_server.map | $t | { { 'target' => $dest_server } + $t }, + service => $_xmpp_server_service, + ttl => $_ttl, + } + knot::records::srv { "SRV xmpps-server ${title}": + target_zone => $_target_zone, + rname => $_rname, + srv => $_xmpps_server.map | $t | { { 'target' => $dest_server } + $t }, + service => $_xmpps_server_service, + ttl => $_ttl, + } + + knot::records::tlsa { "XMPPS TLSA ${title}": + target_zone => $_target_zone, + rname => $_rname, + tlsa => $_tlsa, + ttl => $_ttl, + service => $_tlsa_service, + } + + $_txt_records.each | String[1] $r | { + if $_rname == '.' { + $_txt_rname = '_xmppconnect' + } else { + $_txt_rname = "_xmppconnect.${_rname}" + } + knot_record { "TXT xmpp for ${title} (${r})": + target_zone => $_target_zone, + rname => $_txt_rname, + rtype => 'TXT', + rttl => $_ttl, + rcontent => "\"${r}\"", + } + } +} diff --git a/spec/classes/records/defaults/xmpp_spec.rb b/spec/classes/records/defaults/xmpp_spec.rb new file mode 100644 index 0000000..38d3060 --- /dev/null +++ b/spec/classes/records/defaults/xmpp_spec.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe 'knot::records::defaults::xmpp' do + let :default_params do + {} + end + + shared_examples 'knot::records::defaults::xmpp shared examples' do + it { is_expected.to compile.with_all_deps } + end + + on_supported_os.each do |os, os_facts| + context "on #{os}" do + let(:facts) { os_facts } + + context 'with defaults' do + let :params do + default_params + end + + it_behaves_like 'knot::records::defaults::xmpp shared examples' + end + end + end +end diff --git a/spec/defines/records/xmpp_spec.rb b/spec/defines/records/xmpp_spec.rb new file mode 100644 index 0000000..40be2a1 --- /dev/null +++ b/spec/defines/records/xmpp_spec.rb @@ -0,0 +1,86 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe 'knot::records::xmpp' do + let :default_params do + { + xmpp_client: [{ 'priority' => 0, 'weight' => 5, 'target_port' => 5222 }], + xmpp_client_service: [{ 'port' => 'xmpp-client', 'proto' => 'tcp' }], + xmpps_client: [{ 'priority' => 0, 'weight' => 5, 'target_port' => 5223 }], + xmpps_client_service: [{ 'port' => 'xmpps-client', 'proto' => 'tcp' }], + xmpp_server: [{ 'priority' => 0, 'weight' => 5, 'target_port' => 5269 }], + xmpp_server_service: [{ 'port' => 'xmpp-server', 'proto' => 'tcp' }], + xmpps_server: [{ 'priority' => 0, 'weight' => 5, 'target_port' => 5270 }], + xmpps_server_service: [{ 'port' => 'xmpps-server', 'proto' => 'tcp' }], + tlsa: [], + ttl: 3600, + } + end + + shared_examples 'knot::records::xmpp shared examples' do + it { is_expected.to compile.with_all_deps } + it { is_expected.to contain_class('knot::records::defaults::xmpp') } + + it { + is_expected.to contain_knot__records__srv("SRV xmpp-client #{title}") + .with_target_zone(params[:target_zone]) + .with_rname(params[:rname]) + .with_srv(params[:xmpp_client].map { |item| item.merge({ target: params[:dest_target] }) }) + .with_service(params[:xmpp_client_service]) + .with_ttl(params[:ttl]) + } + + it { + is_expected.to contain_knot__records__srv("SRV xmpps-client #{title}") + .with_target_zone(params[:target_zone]) + .with_rname(params[:rname]) + .with_srv(params[:xmpps_client].map { |item| item.merge({ target: params[:dest_target] }) }) + .with_service(params[:xmpps_client_service]) + .with_ttl(params[:ttl]) + } + + it { + is_expected.to contain_knot__records__srv("SRV xmpp-server #{title}") + .with_target_zone(params[:target_zone]) + .with_rname(params[:rname]) + .with_srv(params[:xmpp_server].map { |item| item.merge({ target: params[:dest_target] }) }) + .with_service(params[:xmpp_server_service]) + .with_ttl(params[:ttl]) + } + + it { + is_expected.to contain_knot__records__srv("SRV xmpps-server #{title}") + .with_target_zone(params[:target_zone]) + .with_rname(params[:rname]) + .with_srv(params[:xmpps_server].map { |item| item.merge({ target: params[:dest_target] }) }) + .with_service(params[:xmpps_server_service]) + .with_ttl(params[:ttl]) + } + + it { + is_expected.to contain_knot__records__tlsa("XMPPS TLSA #{title}") + .with_target_zone(params[:target_zone]) + .with_rname(params[:rname]) + .with_tlsa(params[:tlsa]) + .with_ttl(params[:ttl]) + } + end + + on_supported_os.each do |os, os_facts| + context "on #{os}" do + let(:facts) { os_facts } + + context 'with defaults' do + let(:title) { 'xmpp.example.org' } + let :params do + default_params.merge(dest_server: 'xmpp.example.org', + rname: 'xmpp', + target_zone: 'example.org') + end + + it_behaves_like 'knot::records::xmpp shared examples' + end + end + end +end