summaryrefslogtreecommitdiff
path: root/puppet/modules/postfix/manifests/init.pp
blob: 45c8e0c9a47a5f2552574ad70c0db9a381fcec7a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
#
# == Class: postfix
#
# This class provides a basic setup of postfix with local and remote
# delivery and an SMTP server listening on the loopback interface.
#
# Parameters:
# - *$smtp_listen*: address on which the smtp service will listen to. defaults to 127.0.0.1
# - *$root_mail_recipient*: who will recieve root's emails. defaults to "nobody"
# - *$anon_sasl*: set $anon_sasl="yes" to hide the originating IP in email
# - *$manage_header_checks*: manage header checks
# - *$manage_tls_policy*: manage tls policy
# - *$manage_transport_regexp*: manage transport regexps
# - *$manage_virtual_regexp*: manage virtual regexps
# - *$tls_fingerprint_digest*: fingerprint digest for tls policy class
# - *$use_amavisd*: set to "yes" to configure amavis
# - *$use_dovecot_lda*: include dovecot declaration at master.cf
# - *$use_schleuder*: whether to include schleuder portion at master.cf
# - *$use_sympa*: whether to include sympa portion at master.cf
# - *$use_firma*: whether to include firma portion at master.cf
# - *$use_mlmmj*: whether to include mlmmj portion at master.cf
# - *$use_submission*: set to "yes" to enable submission section at master.cf
# - *$use_smtps*: set to "yes" to enable smtps section at master.cf
# - *$mastercf_tail*: set this for additional content to be added at the end of master.cf
# - *$inet_interfaces*: which inet interface postfix should listen on
# - *$myorigin*: sets postfix $myorigin configuration
#
# Example usage:
#
#   node "toto.example.com" {
#     class { 'postfix':
#       smtp_listen => "192.168.1.10"
#     }
#   }
#
class postfix(
  $smtp_listen             = '127.0.0.1',
  $root_mail_recipient     = 'nobody',
  $anon_sasl               = 'no',
  $manage_header_checks    = 'no',
  $manage_tls_policy       = 'no',
  $manage_transport_regexp = 'no',
  $manage_virtual_regexp   = 'no',
  $tls_fingerprint_digest  = 'sha1',
  $use_amavisd             = 'no',
  $use_dovecot_lda         = 'no',
  $use_schleuder           = 'no',
  $use_sympa               = 'no',
  $use_firma               = 'no',
  $use_mlmmj               = 'no',
  $use_postscreen          = 'no',
  $use_submission          = 'no',
  $use_smtps               = 'no',
  $mastercf_tail           = '',
  $inet_interfaces         = 'all',
  $myorigin                = $::fqdn,
  $mailname                = $::fqdn,
  $preseed                 = false,
  $default_alias_maps      = true
) {

  case $::operatingsystem {

    'RedHat', 'CentOS': {
      $master_cf_template = 'postfix/master.cf.redhat5.erb'

      # selinux labels differ from one distribution to another
      case $::operatingsystemmajrelease {
        '4':     { $postfix_seltype = 'etc_t' }
        '5':     { $postfix_seltype = 'postfix_etc_t' }
        default: { $postfix_seltype = undef }
      }

      postfix::config {
        'sendmail_path': value => '/usr/sbin/sendmail.postfix';
        'newaliases_path': value => '/usr/bin/newaliases.postfix';
        'mailq_path': value => '/usr/bin/mailq.postfix';
      }
    }

    'Debian': {
      case $::operatingsystemrelease {
        /^5.*/: {
          $master_cf_template = 'postfix/master.cf.debian-5.erb'
        }
        /^6.*/: {
          $master_cf_template = 'postfix/master.cf.debian-6.erb'
        }
        /^7.*/: {
          $master_cf_template = 'postfix/master.cf.debian-7.erb'
        }
        default:  {
          $master_cf_template = "postfix/master.cf.debian-${::operatingsystemmajrelease}.erb"
        }
      }
    }

    'Ubuntu': {
      $master_cf_template = 'postfix/master.cf.debian-sid.erb'
    }

    default: {
      $postfix_seltype    = undef
      $master_cf_template = undef
    }
  }


  # Bootstrap moduledir
  include common::moduledir
  common::module_dir{'postfix': }

  # Include optional classes
  if $anon_sasl == 'yes' {
    include postfix::anonsasl
  }
  # this global variable needs to get parameterized as well
  if $::header_checks == 'yes' {
    include postfix::header_checks
  }
  if $manage_tls_policy == 'yes' {
    class { 'postfix::tlspolicy':
      fingerprint_digest => $tls_fingerprint_digest,
    }
  }
  if $use_amavisd == 'yes' {
    include postfix::amavis
  }
  if $manage_transport_regexp == 'yes' {
    include postfix::transport_regexp
  }
  if $manage_virtual_regexp == 'yes' {
    include postfix::virtual_regexp
  }

  package { 'mailx':
    ensure => installed
  }

  if ( $preseed ) {
    apt::preseeded_package { 'postfix':
      ensure  => installed,
    }
  } else {
    package { 'postfix':
      ensure => installed
    }
  }

  if $::operatingsystem == 'debian' {
    Package[mailx] { name => 'bsd-mailx' }
  }

  service { 'postfix':
    ensure  => running,
    require => Package['postfix'],
  }

  file { '/etc/mailname':
    ensure  => present,
    content => "${::fqdn}\n",
    seltype => $postfix_seltype,
  }

  # Aliases
  file { '/etc/aliases':
    ensure  => present,
    content => "# file managed by puppet\n",
    replace => false,
    seltype => $postfix_seltype,
    notify  => Exec['newaliases'],
  }

  # Aliases
  exec { 'newaliases':
    command     => '/usr/bin/newaliases',
    refreshonly => true,
    require     => Package['postfix'],
    subscribe   => File['/etc/aliases'],
  }

  # Config files
  file { '/etc/postfix/master.cf':
    ensure  => present,
    owner   => 'root',
    group   => 'root',
    mode    => '0644',
    content => template($master_cf_template),
    seltype => $postfix_seltype,
    notify  => Service['postfix'],
    require => Package['postfix'],
  }

  # Config files
  file { '/etc/postfix/main.cf':
    ensure  => present,
    owner   => 'root',
    group   => 'root',
    mode    => '0644',
    source  => 'puppet:///modules/postfix/main.cf',
    replace => false,
    seltype => $postfix_seltype,
    notify  => Service['postfix'],
    require => Package['postfix'],
  }

  # Default configuration parameters
  if $default_alias_maps {
    postfix::config {
      'alias_maps': value => 'hash:/etc/aliases';
    }
  }
  postfix::config {
    'myorigin':        value => $myorigin;
    'inet_interfaces': value => $inet_interfaces;
  }

  postfix::mailalias {'root':
    recipient => $root_mail_recipient,
  }
}