-
Notifications
You must be signed in to change notification settings - Fork 136
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add support for the Certbot Gandi plugin #295
base: master
Are you sure you want to change the base?
Changes from 2 commits
de30daa
bf81b49
863985a
471c64e
37200dc
f062f57
2d89536
b51de96
d62ea76
09ba2f7
e010968
9323fb2
0287c8b
b2fe5ce
6c82c1a
ed0cfca
f8457b7
17c1b61
47824f6
ef0d4f5
a513b57
1e65a10
3996f08
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3,3 +3,4 @@ letsencrypt::configure_epel: true | |
letsencrypt::plugin::dns_rfc2136::package_name: 'python3-certbot-dns-rfc2136' | ||
letsencrypt::plugin::dns_route53::package_name: 'python3-certbot-dns-route53' | ||
letsencrypt::plugin::dns_cloudflare::package_name: 'python3-certbot-dns-cloudflare' | ||
letsencrypt::plugin::dns_gandi::package_name: 'certbot-plugin-gandi' | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This doesn't look correct. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
--- | ||
letsencrypt::plugin::dns_gandi::package_provider: apt | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why do you need to set the package provider? That's rarely needed. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You're right, I will remove it |
||
letsencrypt::plugin::dns_gandi::package_name: python3-certbot-dns-gandi |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
--- | ||
letsencrypt::plugin::dns_gandi::package_name: python3-certbot-dns-gandi | ||
letsencrypt::plugin::dns_gandi::package_provider: apt |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,48 @@ | ||||||||||||||||||||||
# @summary Installs and configures the dns-gandi plugin | ||||||||||||||||||||||
# | ||||||||||||||||||||||
# This class installs and configures the Let's Encrypt dns-gandi plugin. | ||||||||||||||||||||||
# https://pypi.org/project/certbot-plugin-gandi/ | ||||||||||||||||||||||
# | ||||||||||||||||||||||
# @param api_key Gandi production api key secret. You can get it in you security tab of your account | ||||||||||||||||||||||
# @param package_name The name of the package to install when $manage_package is true. | ||||||||||||||||||||||
# @param config_file The path to the configuration file. | ||||||||||||||||||||||
# @param manage_package Manage the plugin package. | ||||||||||||||||||||||
# | ||||||||||||||||||||||
class letsencrypt::plugin::dns_gandi ( | ||||||||||||||||||||||
String[1] $api_key, | ||||||||||||||||||||||
String[1] $package_provider = 'pip', | ||||||||||||||||||||||
Optional[String[1]] $package_name = undef, | ||||||||||||||||||||||
Stdlib::Absolutepath $config_file = "${letsencrypt::config_dir}/dns-gandi.ini", | ||||||||||||||||||||||
Boolean $manage_package = true, | ||||||||||||||||||||||
) { | ||||||||||||||||||||||
require letsencrypt | ||||||||||||||||||||||
|
||||||||||||||||||||||
if $manage_package { | ||||||||||||||||||||||
if ! $package_name { | ||||||||||||||||||||||
fail('No package name provided for certbot dns gandi plugin.') | ||||||||||||||||||||||
} | ||||||||||||||||||||||
|
||||||||||||||||||||||
cible marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||
package { $package_name: | ||||||||||||||||||||||
ensure => installed, | ||||||||||||||||||||||
cible marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||
provider => $package_provider, | ||||||||||||||||||||||
} | ||||||||||||||||||||||
} | ||||||||||||||||||||||
|
||||||||||||||||||||||
if $api_key { | ||||||||||||||||||||||
$ini_vars = { | ||||||||||||||||||||||
'certbot_plugin_gandi:dns_api_key' => $api_key, | ||||||||||||||||||||||
} | ||||||||||||||||||||||
} else { | ||||||||||||||||||||||
fail('api_key not provided for certbot dns gandi plugin.') | ||||||||||||||||||||||
} | ||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The data type guarantees it's set
Suggested change
|
||||||||||||||||||||||
|
||||||||||||||||||||||
file { $config_file: | ||||||||||||||||||||||
ensure => file, | ||||||||||||||||||||||
owner => 'root', | ||||||||||||||||||||||
group => 'root', | ||||||||||||||||||||||
mode => '0400', | ||||||||||||||||||||||
content => epp('letsencrypt/ini.epp', { | ||||||||||||||||||||||
vars => { '' => $ini_vars }, | ||||||||||||||||||||||
}), | ||||||||||||||||||||||
} | ||||||||||||||||||||||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
# frozen_string_literal: true | ||
|
||
require 'spec_helper_acceptance' | ||
|
||
describe 'letsencrypt::plugin::dns_gandi' do | ||
it_behaves_like 'an idempotent resource' do | ||
let(:manifest) do | ||
<<-PUPPET | ||
include letsencrypt | ||
class { 'letsencrypt::plugin::dns_gandi': | ||
api_key => 'dummy-gandi-api-token', | ||
} | ||
PUPPET | ||
end | ||
end | ||
|
||
describe file('/etc/letsencrypt/dns-gandi.ini') do | ||
it { is_expected.to be_file } | ||
it { is_expected.to be_owned_by 'root' } | ||
it { is_expected.to be_grouped_into 'root' } | ||
it { is_expected.to be_mode 400 } | ||
end | ||
end |
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
@@ -0,0 +1,59 @@ | ||||||
# frozen_string_literal: true | ||||||
|
||||||
require 'spec_helper' | ||||||
|
||||||
describe 'letsencrypt::plugin::dns_gandi' do | ||||||
on_supported_os.each do |os, facts| | ||||||
context "on #{os} based operating systems" do | ||||||
let(:facts) { facts } | ||||||
let(:params) { { 'api_key' => 'dummy-gandi-api-token' } } | ||||||
let(:pre_condition) do | ||||||
<<-PUPPET | ||||||
class { 'letsencrypt': | ||||||
email => 'foo@example.com', | ||||||
} | ||||||
PUPPET | ||||||
end | ||||||
let(:package_name) do | ||||||
osname = facts[:os]['name'] | ||||||
osrelease = facts[:os]['release']['major'] | ||||||
osfull = "#{osname}-#{osrelease}" | ||||||
case osfull | ||||||
when 'Debian-10', 'AlmaLinux-8', 'RedHat-8', 'Ubuntu-18.04', 'Fedora-32', 'RedHat-7', 'CentOS-7', 'FreeBSD-12', 'FreeBSD-13' | ||||||
'certbot-plugin-gandi' | ||||||
when 'Debian-11', 'Ubuntu-20.04' | ||||||
'python3-certbot-dns-gandi' | ||||||
end | ||||||
end | ||||||
|
||||||
context 'with required parameters' do | ||||||
it do | ||||||
if package_name.nil? | ||||||
is_expected.not_to compile | ||||||
cible marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
else | ||||||
is_expected.to compile.with_all_deps | ||||||
end | ||||||
end | ||||||
|
||||||
describe 'with manage_package => true' do | ||||||
let(:params) { super().merge(manage_package: true) } | ||||||
|
||||||
it do | ||||||
if package_name.nil? | ||||||
is_expected.not_to compile | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. A better way is to test for the error:
Suggested change
|
||||||
else | ||||||
is_expected.to contain_class('letsencrypt::plugin::dns_gandi').with_package_name(package_name) | ||||||
is_expected.to contain_package(package_name).with_ensure('installed') | ||||||
end | ||||||
end | ||||||
end | ||||||
|
||||||
describe 'with manage_package => false' do | ||||||
let(:params) { super().merge(manage_package: false, package_name: 'dns-gandi-package') } | ||||||
|
||||||
it { is_expected.not_to contain_package('dns-gandi-package') } | ||||||
end | ||||||
end | ||||||
end | ||||||
end | ||||||
end |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -207,6 +207,45 @@ class { 'letsencrypt::plugin::dns_cloudflare': | |
it { is_expected.to contain_exec('letsencrypt certonly foo.example.com').with_command "letsencrypt --text --agree-tos --non-interactive certonly --rsa-key-size 4096 -a dns-cloudflare --cert-name 'foo.example.com' -d 'foo.example.com' --dns-cloudflare --dns-cloudflare-credentials /etc/letsencrypt/dns-cloudflare.ini --dns-cloudflare-propagation-seconds 10" } | ||
end | ||
|
||
context 'with dns-gandi plugin' do | ||
let(:title) { 'foo.example.com' } | ||
let(:params) { { plugin: 'dns-gandi', letsencrypt_command: 'letsencrypt' } } | ||
let(:pre_condition) do | ||
<<-PUPPET | ||
class { 'letsencrypt': | ||
email => 'foo@example.com', | ||
config_dir => '/etc/letsencrypt', | ||
} | ||
class { 'letsencrypt::plugin::dns_gandi': | ||
package_name => 'irrelevant', | ||
api_key => 'dummy-gandi-api-token', | ||
} | ||
PUPPET | ||
end | ||
|
||
it { is_expected.to compile.with_all_deps } | ||
it { is_expected.to contain_class('letsencrypt::plugin::dns_gandi') } | ||
it { is_expected.to contain_exec('letsencrypt certonly foo.example.com').with_command "letsencrypt --text --agree-tos --non-interactive certonly --rsa-key-size 4096 -a dns-gandi --cert-name 'foo.example.com' -d 'foo.example.com' -a certbot-plugin-gandi:dns --certbot-plugin-gandi:dns-credentials /etc/letsencrypt/dns-gandi.ini" } | ||
end | ||
|
||
context 'with dns-gandi plugin without apy_key' do | ||
let(:title) { 'foo.example.com' } | ||
let(:params) { { plugin: 'dns-gandi', letsencrypt_command: 'letsencrypt' } } | ||
let(:pre_condition) do | ||
<<-PUPPET | ||
class { 'letsencrypt': | ||
email => 'foo@example.com', | ||
config_dir => '/etc/letsencrypt', | ||
} | ||
class { 'letsencrypt::plugin::dns_gandi': | ||
package_name => 'irrelevant', | ||
} | ||
PUPPET | ||
end | ||
|
||
it { is_expected.not_to compile.with_all_deps } | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Here too it's better to compile and test for a specific error There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. For this one, the module won't work with an empty api_key and I don't know how to handle the error:
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The |
||
end | ||
|
||
context 'with custom plugin' do | ||
let(:title) { 'foo.example.com' } | ||
let(:params) { { plugin: 'apache' } } | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -8,4 +8,5 @@ | |
'dns-google', | ||
'dns-cloudflare', | ||
'dns-rfc2136', | ||
'dns-gandi', | ||
] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There are currently no FreeBSD port for this :-/
The name would probably be
py38-certbot-dns-gandi
if there was, and in factpy39-certbot-dns-gandi
because the default version of Python changed recently on FreeBSD.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I opened #296 to adjust the FreeBSD version.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do you think it's a good idea to install the package with pip? I'm not sure on how to install them on freebsd and centos. I will ask help to a colleague
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As a FreeBSD user, I would prefer to use a package rather installing using pip. Anybody can submit ports to FreeBSD, and they are ultimately available as packages. My guess is that if the port does not exist, nobody needed it so much they did a port for it, and maybe it is not worth it?
I would personally not set a
package_name
for FreeBSD in Hiera and make$letsencrypt::plugin::dns_gandi::package_name
mandatory so that it fails hard if someone attempt to use it on FreeBSD.