aboutsummaryrefslogtreecommitdiffstats
path: root/modules/opendkim
diff options
context:
space:
mode:
Diffstat (limited to 'modules/opendkim')
-rw-r--r--modules/opendkim/Gemfile19
-rw-r--r--modules/opendkim/LICENSE202
-rw-r--r--modules/opendkim/Modulefile8
-rw-r--r--modules/opendkim/Puppetfile7
-rw-r--r--modules/opendkim/README.md98
-rw-r--r--modules/opendkim/Rakefile12
-rw-r--r--modules/opendkim/manifests/domain.pp46
-rw-r--r--modules/opendkim/manifests/init.pp105
-rw-r--r--modules/opendkim/manifests/trusted.pp13
-rw-r--r--modules/opendkim/metadata.json60
-rw-r--r--modules/opendkim/spec/classes/init_spec.rb7
-rw-r--r--modules/opendkim/spec/classes/opendkim_spec.rb13
-rw-r--r--modules/opendkim/spec/spec_helper.rb1
-rw-r--r--modules/opendkim/templates/opendkim.conf52
-rw-r--r--modules/opendkim/tests/init.pp15
15 files changed, 658 insertions, 0 deletions
diff --git a/modules/opendkim/Gemfile b/modules/opendkim/Gemfile
new file mode 100644
index 00000000..68ba397d
--- /dev/null
+++ b/modules/opendkim/Gemfile
@@ -0,0 +1,19 @@
+source 'https://rubygems.org'
+
+puppetversion = ENV.key?('PUPPET_VERSION') ? "= #{ENV['PUPPET_VERSION']}" : ['>= 3.3']
+gem 'puppet', puppetversion
+gem 'puppetlabs_spec_helper', '>= 0.1.0'
+gem 'facter', '>= 1.7.0'
+
+gem 'puppet-lint', '>= 0.3.2'
+gem 'rspec-puppet'
+gem "metadata-json-lint"
+gem 'beaker-rspec'
+gem "travis"
+gem "travis-lint"
+gem "puppet-blacksmith"
+gem "guard-rake"
+
+gem 'test-kitchen', '>= 1.4.0'
+gem 'kitchen-docker', '>= 2.1.0'
+gem 'kitchen-puppet', '>= 0.0.27'
diff --git a/modules/opendkim/LICENSE b/modules/opendkim/LICENSE
new file mode 100644
index 00000000..8f71f43f
--- /dev/null
+++ b/modules/opendkim/LICENSE
@@ -0,0 +1,202 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "{}"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright {yyyy} {name of copyright owner}
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
diff --git a/modules/opendkim/Modulefile b/modules/opendkim/Modulefile
new file mode 100644
index 00000000..7790c510
--- /dev/null
+++ b/modules/opendkim/Modulefile
@@ -0,0 +1,8 @@
+ name "bi4o4ek-opendkim"
+ version "0.0.7"
+ author "Vladimir Bykanov"
+ summary "Configures OpenDKIM"
+ license "Apache-2.0"
+ source "https://github.com/bi4o4ek/puppet-opendkim"
+ project_page "https://github.com/bi4o4ek/puppet-opendkim"
+
diff --git a/modules/opendkim/Puppetfile b/modules/opendkim/Puppetfile
new file mode 100644
index 00000000..177adf16
--- /dev/null
+++ b/modules/opendkim/Puppetfile
@@ -0,0 +1,7 @@
+#!/usr/bin/env ruby
+#^syntax detection
+
+forge "https://forgeapi.puppetlabs.com"
+
+# use dependencies defined in metadata.json
+metadata
diff --git a/modules/opendkim/README.md b/modules/opendkim/README.md
new file mode 100644
index 00000000..13c40bde
--- /dev/null
+++ b/modules/opendkim/README.md
@@ -0,0 +1,98 @@
+[![Build Status](https://travis-ci.org/bi4o4ek/puppet-opendkim.svg?branch=master)](https://travis-ci.org/bi4o4ek/puppet-opendkim)
+
+# opendkim
+
+#### Table of Contents
+
+1. [Overview](#overview)
+2. [Module Description](#module-description)
+3. [Setup - The basics of getting started with opendkim](#setup)
+ * [Beginning with opendkim](#beginning-with-opendkim)
+ * [Add domains for signing](#add-domains-for-signing)
+ * [Add allowed hosts](#add-allowed-hosts)
+4. [Usage - Configuration options and additional functionality](#usage)
+5. [Reference - An under-the-hood peek at what the module is doing and how](#reference)
+5. [Limitations - OS compatibility, etc.](#limitations)
+6. [Development - Guide for contributing to the module](#development)
+
+## Overview
+
+The opendkim module allows you to set up mail signing and manage DKIM services with minimal effort.
+
+## Module Description
+
+OpenDKIM is a widely-used DKIM service, and this module provides a simplified way of creating configurations to manage your infrastructure.
+This includes the ability to configure and manage a range of different domain, as well as a streamlined way to install and configure OpenDKIM service.
+
+## Setup
+
+### What opendkim affects
+
+* configuration files and directories (created and written to)
+* package/service/configuration files for OpenDKIM
+* signing domains list
+* trusted hosts list
+
+### Beginning with opendkim
+
+To install OpenDKIM with the default parameters
+
+ include opendkim
+
+### Add domains for signing
+
+ opendkim::domain{['example.com', 'example.org']:}
+
+
+### Add allowed hosts
+
+ opendkim::trusted{['10.0.0.0/8', '203.0.113.0/24']:}
+
+## Usage
+
+For example.
+There is internal ip 10.3.3.80 and external ip 203.0.113.100 on our mail-relay host with OpenDKIM.
+This host signs all mails for domains example.com and example.org.
+
+ # Postfix-relay
+ class{ 'postfix::server':
+ inet_interfaces => '10.3.3.80, localhost',
+ mynetworks => '10.0.0.0/8, 203.0.113.0/24',
+ smtpd_recipient_restrictions => 'permit_mynetworks, reject_unauth_destination',
+ smtpd_client_restrictions => 'permit_mynetworks, reject',
+ mydestination => '$myhostname',
+ myhostname => 'relay-site.example.com',
+ smtpd_banner => 'Hello',
+ extra_main_parameters => {
+ smtp_bind_address => '203.0.113.100',
+ smtpd_milters => 'inet:127.0.0.1:8891',
+ non_smtpd_milters => '$smtpd_milters',
+ milter_default_action => 'accept',
+ milter_protocol => '2',
+ },
+ }
+
+ # OpenDKIM
+ include opendkim
+ opendkim::domain{['example.com', 'example.org']:}
+ opendkim::trusted{['10.0.0.0/8', '203.0.113.0/24']:}
+
+After puppet-run you need to copy contents of /etc/opendkim/keys/example.com/relay-site.txt and paste into corresponding DNS-zone as TXT.
+Then repeat this action for example.org
+
+Puppet module for postfix in this example is [thias/postfix](https://forge.puppetlabs.com/thias/postfix) v0.3.3
+## Reference
+
+Puppetlabs are working on automating this section.
+
+## Limitations
+
+This module is tested on:
+* CentOS 6
+* Ubuntu 12.04
+* Ubuntu 14.04
+
+## Development
+
+Fork me on github and make pull request.
+
diff --git a/modules/opendkim/Rakefile b/modules/opendkim/Rakefile
new file mode 100644
index 00000000..312b2952
--- /dev/null
+++ b/modules/opendkim/Rakefile
@@ -0,0 +1,12 @@
+require 'rubygems'
+require 'puppetlabs_spec_helper/rake_tasks'
+require 'puppet-lint/tasks/puppet-lint'
+
+PuppetLint.configuration.fail_on_warnings = true
+PuppetLint.configuration.send('relative')
+PuppetLint.configuration.send('disable_80chars')
+PuppetLint.configuration.send('disable_class_inherits_from_params_class')
+PuppetLint.configuration.send('disable_documentation')
+PuppetLint.configuration.send('disable_single_quote_string_with_variables')
+PuppetLint.configuration.send('disable_only_variable_string')
+PuppetLint.configuration.ignore_paths = ["spec/**/*.pp", "pkg/**/*.pp"]
diff --git a/modules/opendkim/manifests/domain.pp b/modules/opendkim/manifests/domain.pp
new file mode 100644
index 00000000..c708ad08
--- /dev/null
+++ b/modules/opendkim/manifests/domain.pp
@@ -0,0 +1,46 @@
+define opendkim::domain (
+ $domain = $name,
+ $selector = $hostname,
+ $pathkeys = '/etc/opendkim/keys',
+ $keytable = 'KeyTable',
+ $signing_table = 'SigningTable',
+) {
+ # $pathConf and $pathKeys must be without trailing '/'.
+ # For example, '/etc/opendkim/keys'
+
+ Exec { path => [ '/bin/', '/sbin/' , '/usr/bin/', '/usr/sbin/' ] }
+
+ # Create directory for domain
+ file { "${pathkeys}/${domain}":
+ ensure => directory,
+ owner => $opendkim::owner,
+ group => $opendkim::group,
+ mode => '0755',
+ notify => Service[$opendkim::service_name],
+ require => Package[$opendkim::package_name],
+ }
+
+ # Generate dkim-keys
+ exec { "opendkim-genkey -D ${pathkeys}/${domain}/ -d ${domain} -s ${selector}":
+ unless => "/usr/bin/test -f ${pathkeys}/${domain}/${selector}.private && /usr/bin/test -f ${pathkeys}/${domain}/${selector}.txt",
+ user => $opendkim::owner,
+ notify => Service[$opendkim::service_name],
+ require => [ Package[$opendkim::package_name], File["${pathkeys}/${domain}"], ],
+ }
+
+ # Add line into KeyTable
+ file_line { "${opendkim::pathconf}/${keytable}_${domain}":
+ path => "${opendkim::pathconf}/${keytable}",
+ line => "${selector}._domainkey.${domain} ${domain}:${selector}:${pathkeys}/${domain}/${selector}.private",
+ notify => Service[$opendkim::service_name],
+ require => Package[$opendkim::package_name],
+ }
+
+ # Add line into SigningTable
+ file_line { "${opendkim::pathconf}/${signing_table}_${domain}":
+ path => "${opendkim::pathconf}/${signing_table}",
+ line => "*@${domain} ${selector}._domainkey.${domain}",
+ notify => Service[$opendkim::service_name],
+ require => Package[$opendkim::package_name],
+ }
+}
diff --git a/modules/opendkim/manifests/init.pp b/modules/opendkim/manifests/init.pp
new file mode 100644
index 00000000..6e45345a
--- /dev/null
+++ b/modules/opendkim/manifests/init.pp
@@ -0,0 +1,105 @@
+# == Class: opendkim
+#
+# === Examples
+#
+# class { 'opendkim':}
+#
+# === Authors
+#
+# Vladimir Bykanov <vladimir@bykanov.ru>
+#
+# === Copyright
+#
+# Copyright 2015 Vladimir Bykanov
+#
+class opendkim (
+ $autorestart = 'Yes',
+ $autorestart_rate = '10/1h',
+ $log_why = 'Yes',
+ $syslog = 'Yes',
+ $syslog_success = 'Yes',
+ $mode = 's',
+ $canonicalization = 'relaxed/simple',
+ $external_ignore_list = 'refile:/etc/opendkim/TrustedHosts',
+ $internal_hosts = 'refile:/etc/opendkim/TrustedHosts',
+ $keytable = 'refile:/etc/opendkim/KeyTable',
+ $signing_table = 'refile:/etc/opendkim/SigningTable',
+ $signature_algorithm = 'rsa-sha256',
+ $socket = 'inet:8891@localhost',
+ $pidfile = '/var/run/opendkim/opendkim.pid',
+ $umask = '022',
+ $userid = 'opendkim:opendkim',
+ $temporary_directory = '/var/tmp',
+ $package_name = 'opendkim',
+ $service_name = 'opendkim',
+ $pathconf = '/etc/opendkim',
+ $owner = 'opendkim',
+ $group = 'opendkim',
+) {
+
+ package { $package_name:
+ ensure => present,
+ }
+
+ case $::operatingsystem {
+ /^(Debian|Ubuntu)$/: {
+ package { 'opendkim-tools':
+ ensure => present,
+ }
+ # Debian/Ubuntu doesn't ship this directory in its package
+ file { $pathconf:
+ ensure => directory,
+ owner => 'root',
+ group => 'opendkim',
+ mode => '0755',
+ require => Package[$package_name],
+ }
+ file { "${pathconf}/keys":
+ ensure => directory,
+ owner => 'opendkim',
+ group => 'opendkim',
+ mode => '0750',
+ require => Package[$package_name],
+ }
+ file { "${pathconf}/KeyTable":
+ ensure => present,
+ owner => 'opendkim',
+ group => 'opendkim',
+ mode => '0640',
+ require => Package[$package_name],
+ }
+ file { "${pathconf}/SigningTable":
+ ensure => present,
+ owner => 'opendkim',
+ group => 'opendkim',
+ mode => '0640',
+ require => Package[$package_name],
+ }
+ file { "${pathconf}/TrustedHosts":
+ ensure => present,
+ owner => 'opendkim',
+ group => 'opendkim',
+ mode => '0644',
+ require => Package[$package_name],
+ }
+ }
+ default: {}
+ }
+
+ file {'/etc/opendkim.conf':
+ ensure => file,
+ owner => 'root',
+ group => 'root',
+ mode => '0644',
+ content => template('opendkim/opendkim.conf'),
+ notify => Service[$service_name],
+ require => Package[$package_name],
+ }
+
+ service { $service_name:
+ ensure => running,
+ enable => true,
+ require => Package[$package_name],
+ }
+}
+
diff --git a/modules/opendkim/manifests/trusted.pp b/modules/opendkim/manifests/trusted.pp
new file mode 100644
index 00000000..dcf0f8b8
--- /dev/null
+++ b/modules/opendkim/manifests/trusted.pp
@@ -0,0 +1,13 @@
+define opendkim::trusted (
+ $host = $name,
+ $trusted_hosts = 'TrustedHosts',
+
+) {
+ # Add line into KeyTable
+ file_line { "${opendkim::pathconf}/${trusted_hosts}_${host}":
+ path => "${opendkim::pathconf}/${trusted_hosts}",
+ line => $host,
+ notify => Service[$opendkim::service_name],
+ require => Package[$opendkim::package_name],
+ }
+}
diff --git a/modules/opendkim/metadata.json b/modules/opendkim/metadata.json
new file mode 100644
index 00000000..81b2f70d
--- /dev/null
+++ b/modules/opendkim/metadata.json
@@ -0,0 +1,60 @@
+{
+ "name": "bi4o4ek-opendkim",
+ "version": "0.0.7",
+ "author": "Vladimir Bykanov",
+ "summary": "Configures OpenDKIM",
+ "license": "Apache-2.0",
+ "source": "https://github.com/bi4o4ek/puppet-opendkim",
+ "project_page": "https://github.com/bi4o4ek/puppet-opendkim",
+ "issues_url": "https://github.com/bi4o4ek/puppet-opendkim/issues",
+ "operatingsystem_support": [
+ {
+ "operatingsystem": "RedHat",
+ "operatingsystemrelease": [
+ "5",
+ "6",
+ "7"
+ ]
+ },
+ {
+ "operatingsystem": "CentOS",
+ "operatingsystemrelease": [
+ "5",
+ "6",
+ "7"
+ ]
+ },
+ {
+ "operatingsystem": "Mageia",
+ "operatingsystemrelease": [
+ "7",
+ "8",
+ "9"
+ ]
+ }
+ ],
+ "dependencies": [
+ {
+ }
+ ],
+ "description": "UNKNOWN",
+ "types": [
+
+ ],
+ "checksums": {
+ "Gemfile": "19456e851851a3bd7aa6729108429dde",
+ "LICENSE": "fa818a259cbed7ce8bc2a22d35a464fc",
+ "Modulefile": "9a3b46c73c1ae7309fe2d35c5e6fa549",
+ "Puppetfile": "607001b25e4f9d020b2ce4444174a654",
+ "README.md": "0764cc9bb9de221c97bce2664ba99657",
+ "Rakefile": "a162d9397ed53fa8fa49c57609feedcb",
+ "manifests/domain.pp": "61f78cbd4376e58a7b26f1298f38804b",
+ "manifests/init.pp": "4987dcd9ebc88e7ea0de3b74c9af6d9c",
+ "manifests/trusted.pp": "bcc132622e2c2e39bcbc3116c7788c8b",
+ "spec/classes/init_spec.rb": "0451831b29191c21b2cdc045c94a2243",
+ "spec/classes/opendkim_spec.rb": "9f06a3f005344875a0fb5753ab43cb34",
+ "spec/spec_helper.rb": "0db89c9a486df193c0e40095422e19dc",
+ "templates/opendkim.conf": "047e76e4c2a0a15754101f2da32ab2fe",
+ "tests/init.pp": "8c9ab8c85cd89dae1ad97cbe949a7e6e"
+ }
+}
diff --git a/modules/opendkim/spec/classes/init_spec.rb b/modules/opendkim/spec/classes/init_spec.rb
new file mode 100644
index 00000000..5ce0a75d
--- /dev/null
+++ b/modules/opendkim/spec/classes/init_spec.rb
@@ -0,0 +1,7 @@
+require 'spec_helper'
+describe 'opendkim' do
+
+ context 'with defaults for all parameters' do
+ it { should contain_class('opendkim') }
+ end
+end
diff --git a/modules/opendkim/spec/classes/opendkim_spec.rb b/modules/opendkim/spec/classes/opendkim_spec.rb
new file mode 100644
index 00000000..1901c1c0
--- /dev/null
+++ b/modules/opendkim/spec/classes/opendkim_spec.rb
@@ -0,0 +1,13 @@
+require 'spec_helper'
+
+describe 'opendkim', :type => :class do
+
+ describe "Opendkim class with no parameters, basic test" do
+ let(:params) { { } }
+
+ it {
+ should contain_package('opendkim')
+ should contain_service('opendkim')
+ }
+ end
+end
diff --git a/modules/opendkim/spec/spec_helper.rb b/modules/opendkim/spec/spec_helper.rb
new file mode 100644
index 00000000..2c6f5664
--- /dev/null
+++ b/modules/opendkim/spec/spec_helper.rb
@@ -0,0 +1 @@
+require 'puppetlabs_spec_helper/module_spec_helper'
diff --git a/modules/opendkim/templates/opendkim.conf b/modules/opendkim/templates/opendkim.conf
new file mode 100644
index 00000000..5dc61aa6
--- /dev/null
+++ b/modules/opendkim/templates/opendkim.conf
@@ -0,0 +1,52 @@
+<%- if @autorestart -%>
+AutoRestart <%= @autorestart %>
+<%- end -%>
+<%- if @autorestart_rate -%>
+AutoRestartRate <%= @autorestart_rate %>
+<%- end -%>
+<%- if @log_why -%>
+LogWhy <%= @log_why %>
+<%- end -%>
+<%- if @syslog -%>
+Syslog <%= @syslog %>
+<%- end -%>
+<%- if @syslog_success -%>
+SyslogSuccess <%= @syslog_success %>
+<%- end -%>
+<%- if @mode -%>
+Mode <%= @mode %>
+<%- end -%>
+<%- if @canonicalization -%>
+Canonicalization <%= @canonicalization %>
+<%- end -%>
+<%- if @external_ignore_list -%>
+ExternalIgnoreList <%= @external_ignore_list %>
+<%- end -%>
+<%- if @internal_hosts -%>
+InternalHosts <%= @internal_hosts %>
+<%- end -%>
+<%- if @keytable -%>
+KeyTable <%= @keytable %>
+<%- end -%>
+<%- if @signing_table -%>
+SigningTable <%= @signing_table %>
+<%- end -%>
+<%- if @signature_algorithm -%>
+SignatureAlgorithm <%= @signature_algorithm %>
+<%- end -%>
+<%- if @socket -%>
+Socket <%= @socket %>
+<%- end -%>
+<%- if @pidfile -%>
+PidFile <%= @pidfile %>
+<%- end -%>
+<%- if @umask -%>
+UMask <%= @umask %>
+<%- end -%>
+<%- if @userid -%>
+UserID <%= @userid %>
+<%- end -%>
+<%- if @temporary_directory -%>
+TemporaryDirectory <%= @temporary_directory %>
+<%- end -%>
+
diff --git a/modules/opendkim/tests/init.pp b/modules/opendkim/tests/init.pp
new file mode 100644
index 00000000..ff3d3b06
--- /dev/null
+++ b/modules/opendkim/tests/init.pp
@@ -0,0 +1,15 @@
+# The baseline for module testing used by Puppet Labs is that each manifest
+# should have a corresponding test manifest that declares that class or defined
+# type.
+#
+# Tests are then run by using puppet apply --noop (to check for compilation
+# errors and view a log of events) or by fully applying the test in a virtual
+# environment (to compare the resulting system state to the desired state).
+#
+# Learn more about module testing here:
+# http://docs.puppetlabs.com/guides/tests_smoke.html
+#
+Class['epel'] -> Class['opendkim']
+
+include epel
+include opendkim