
# Install custom config to Dovecot
#
# === Parameters
#
#   $name:
#       Config name.
#
#   $idx:
#       Config load order. Defaults to 99.
#
# === Sample usage
#
# dovecot::server::config { "passdb-pam": idx => 09 }
#
define dovecot::server::config($idx = 90) {

    include dovecot::server::v2

    file { "${name}.conf":
        ensure  => present,
        path    => "/etc/dovecot/conf.d/${idx}-${name}.conf",
        source  => [ "puppet:///files/dovecot/${name}.conf",
                     "puppet:///modules/dovecot/${name}.conf", ],
        mode    => "0644",
        owner   => "root",
        group   => $::operatingsystem ? {
            "openbsd" => "wheel",
            default   => "root",
        },
        notify  => Service["dovecot"],
        require => Package["dovecot"],
    }
}


class dovecot::server::v2 {
    case $operatingsystem {
        centos,fedora: {
            $dovecot_ssl_dir = "/etc/pki/tls"
        }
        default: {
            fail("Dovecot module not supported in ${operatingsystem}.")
        }
    }

    service { "dovecot":
        ensure  => running,
        enable  => true,
        require => File["/etc/dovecot/conf.d/98-puppet.conf",
                        "/etc/dovecot/conf.d/99-local.conf"],
    }

    file { "/etc/dovecot/conf.d/98-puppet.conf":
        ensure  => present,
        content => template("dovecot/puppet.conf.erb"),
        mode    => "0644",
        owner   => "root",
        group   => "root",
        notify  => Service["dovecot"],
        require => Package["dovecot"],
    }

    file { "/etc/dovecot/conf.d/99-local.conf":
        ensure => present,
        source => [
                   "puppet:///files/dovecot/local.conf",
                   "puppet:///modules/dovecot/empty",
                   ],
        mode   => "0644",
        owner  => "root",
        group  => "root",
        notify  => Service["dovecot"],
        require => Package["dovecot"],
    }
             
    if $dovecot_ssl_csr {
        file { "$dovecot_ssl_dir/private/dovecot.csr":
            ensure => present,
            source => $dovecot_ssl_csr,
            mode   => "0640",
            owner  => "root",
            group  => "root",
            notify => Service["dovecot"],
        }
    }

    if $dovecot_ssl_ca {
        file { "$dovecot_ssl_dir/certs/dovecot.ca.crt":
            ensure => present,
            source => $dovecot_ssl_ca,
            mode   => "0644",
            owner  => "root",
            group  => "root",
            notify => Service["dovecot"],
        }
    }

    if $dovecot_ssl_cert {
        file { "$dovecot_ssl_dir/certs/dovecot.crt":
            ensure => present,
            source => $dovecot_ssl_cert,
            mode   => "0644",
            owner  => "root",
            group  => "root",
            notify => Service["dovecot"],
        }
    } else {
        fail("You need to define an ssl_cert in your node manifest.")
    }

    if $dovecot_ssl_key {
        file { "$dovecot_ssl_dir/private/dovecot.key":
            ensure => present,
            source => $dovecot_ssl_key,
            mode   => "0600",
            owner  => "root",
            group  => "root",
            notify => Service["dovecot"],
        }
    } else {
        fail("You need to define an ssl_key in your node manifest.")
    }
}
