From ce5dd6a96d79dffec170b0061b291abd21113cc2 Mon Sep 17 00:00:00 2001 From: Ossi Salmi Date: Sun, 28 Jul 2013 20:44:41 +0300 Subject: [PATCH] smtpd: Initial server support Still missing are TLS and authentication support. --- smtpd/files/smtpd.conf | 5 ++ smtpd/manifests/init.pp | 116 +++++++++++++++++++++++++++++++- smtpd/templates/client.conf.erb | 8 +-- smtpd/templates/server.conf.erb | 21 ++++++ 4 files changed, 142 insertions(+), 8 deletions(-) create mode 100644 smtpd/files/smtpd.conf create mode 100644 smtpd/templates/server.conf.erb diff --git a/smtpd/files/smtpd.conf b/smtpd/files/smtpd.conf new file mode 100644 index 0000000..9202595 --- /dev/null +++ b/smtpd/files/smtpd.conf @@ -0,0 +1,5 @@ +listen on lo0 + +table aliases db:/etc/mail/aliases.db + +include "/etc/mail/smtpd.conf.local" diff --git a/smtpd/manifests/init.pp b/smtpd/manifests/init.pp index bde27da..5873de1 100644 --- a/smtpd/manifests/init.pp +++ b/smtpd/manifests/init.pp @@ -5,11 +5,15 @@ # $mail_domain: # Domain to masquerade as (envelope only). # -# $smtpd_relay: -# URI of mail relay server. +# $mail_server: +# Hostname of mail relay server. # class smtpd { + if $mail_server { + $relay = "smtp+tls://${mail_server}" + } + file { "/etc/mailer.conf": ensure => present, mode => "0644", @@ -20,6 +24,15 @@ class smtpd { } file { "/etc/mail/smtpd.conf": + ensure => present, + mode => "0644", + owner => "root", + group => "wheel", + source => "puppet:///modules/smtpd/smtpd.conf", + notify => Service["smtpd"], + } + + file { "/etc/mail/smtpd.conf.local": ensure => present, mode => "0644", owner => "root", @@ -41,3 +54,102 @@ class smtpd { } } + + +# Configure smtpd as mail server +# +# === Parameters +# +# $maildir: +# Directory in user home for INBOX. +# +# $domains: +# Primary domains to accept mail for. +# +# $virtual: +# Virtual domains to accept mail for. +# +class smtpd::server($maildir, $domains, $virtual=undef) inherits smtpd { + + include procmail + + procmail::rc { "00default.rc": + content => "MAILDIR=\$HOME/${maildir}\nDEFAULT=\$MAILDIR/INBOX\n", + } + + $mda = "/usr/local/bin/procmail -Y -t -f %{sender} rcpt=%{rcpt}" + + File["/etc/mail/smtpd.conf.local"] { + content => template("smtpd/server.conf.erb"), + } + + file { "/etc/mail/aliases": + ensure => present, + mode => "0644", + owner => "root", + group => "wheel", + source => [ + "puppet:///files/mail/aliases.${::homename}", + "puppet:///files/mail/aliases", + ], + } + exec { "makemap -t aliases /etc/mail/aliases": + refreshonly => true, + path => "/bin:/usr/bin:/sbin:/usr/sbin", + subscribe => File["/etc/mail/aliases"], + notify => Service["smtpd"], + } + + smtpd::aliases { $domains: } + + if $virtual { + smtpd::virtual { $virtual: } + } + +} + + +define smtpd::aliases() { + + file { "/etc/mail/aliases.${name}": + ensure => present, + mode => "0644", + owner => "root", + group => "wheel", + source => [ + "puppet:///files/mail/aliases.${name}", + "puppet:///files/mail/aliases.${::homename}", + "puppet:///files/mail/aliases", + ], + } + exec { "makemap -t aliases /etc/mail/aliases.${name}": + refreshonly => true, + path => "/bin:/usr/bin:/sbin:/usr/sbin", + subscribe => File["/etc/mail/aliases.${name}"], + notify => Service["smtpd"], + } + +} + + +define smtpd::virtual() { + + file { "/etc/mail/virtual.${name}": + ensure => present, + mode => "0644", + owner => "root", + group => "wheel", + source => [ + "puppet:///files/mail/virtual.${name}", + "puppet:///files/mail/virtual.${::homename}", + "puppet:///files/mail/virtual", + ], + } + exec { "makemap -t aliases /etc/mail/virtual.${name}": + refreshonly => true, + path => "/bin:/usr/bin:/sbin:/usr/sbin", + subscribe => File["/etc/mail/virtual.${name}"], + notify => Service["smtpd"], + } + +} diff --git a/smtpd/templates/client.conf.erb b/smtpd/templates/client.conf.erb index 0138f36..5bdfd8e 100644 --- a/smtpd/templates/client.conf.erb +++ b/smtpd/templates/client.conf.erb @@ -1,10 +1,6 @@ -listen on lo0 - -<% if @smtpd_relay -%> -accept from local for any relay via <%= @smtpd_relay %><% if @mail_domain %> as "@<%= @mail_domain %>"<% end %> +<% if @relay -%> +accept from local for any relay via <%= @relay %><% if @mail_domain %> as "@<%= @mail_domain %>"<% end %> <% else -%> -table aliases db:/etc/mail/aliases.db - accept from local for local alias deliver to mbox accept from local for any relay<% if @mail_domain %> as "@<%= @mail_domain %>"<% end %> <% end -%> diff --git a/smtpd/templates/server.conf.erb b/smtpd/templates/server.conf.erb new file mode 100644 index 0000000..6131907 --- /dev/null +++ b/smtpd/templates/server.conf.erb @@ -0,0 +1,21 @@ +listen on egress + +<% @domains.each do |domain| -%> +table aliases.<%= domain %> db:/etc/mail/aliases.<%= domain %>.db +<% end -%> +<% @virtual.each do |domain| -%> +table virtual.<%= domain %> db:/etc/mail/virtual.<%= domain %>.db +<% end if @virtual -%> + +<% @domains.each do |domain| -%> +accept from any for domain <%= domain %> alias > \ + deliver to mda "<%= @mda %>" +<% end -%> +<% @virtual.each do |domain| -%> +accept from any for domain <%= domain %> virtual > \ + deliver to mda "<%= @mda %>" +<% end if @virtual -%> + +accept from local for local alias \ + deliver to mda "<%= @mda %>" +accept from local for any relay<% if @mail_domain %> as "@<%= @mail_domain %>"<% end %>