diff --git a/Dockerfile b/Dockerfile index 68b573a..71ad336 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,9 +5,13 @@ MAINTAINER Bertrand Gouny # https://github.com/nickstenning/docker-slapd # Default configuration: can be overridden at the docker command line +ENV LDAP_DOMAIN example.com ENV LDAP_ADMIN_PWD toor ENV LDAP_ORGANISATION Example Inc. -ENV LDAP_DOMAIN example.com + +ENV WITH_MMC_AGENT false +ENV MMC_AGENT_LOGIN mmc-docker +ENV MMC_AGENT_PASSWORD passw0rd # /!\ To store the data outside the container, # mount /var/lib/ldap and /etc/ldap/slapd.d as a data volume add @@ -23,14 +27,17 @@ RUN /sbin/enable-service dnsmasq # Use baseimage-docker's init system. CMD ["/sbin/my_init"] +# Add Mandriva MDS repository +RUN echo "deb http://mds.mandriva.org/pub/mds/debian wheezy main" >> /etc/apt/sources.list + # Resynchronize the package index files from their sources RUN apt-get -y update # Install openldap (slapd) and ldap-utils -RUN LC_ALL=C DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends slapd ldap-utils +RUN LC_ALL=C DEBIAN_FRONTEND=noninteractive apt-get install -y --force-yes --no-install-recommends slapd ldap-utils mmc-agent python-mmc-mail -# Expose ldap default port -EXPOSE 389 +# Expose ldap and mmc-agent default ports +EXPOSE 389 7080 # Create TLS certificats directory RUN mkdir /etc/ldap/ssl @@ -39,9 +46,16 @@ RUN mkdir /etc/ldap/ssl RUN mkdir /etc/ldap/config ADD service/slapd/assets/config /etc/ldap/config +RUN mkdir -p /etc/mmc/agent/assets +ADD service/mmc-agent/assets /etc/mmc/agent/assets + # Add slapd deamon RUN mkdir /etc/service/slapd ADD service/slapd/slapd.sh /etc/service/slapd/run +# Add mmc-agent deamon +RUN mkdir /etc/service/mmc-agent +ADD service/mmc-agent/mmc-agent.sh /etc/service/mmc-agent/run + # Clear out the local repository of retrieved package files RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* diff --git a/service/mmc-agent/assets/append_to_mail.ini b/service/mmc-agent/assets/append_to_mail.ini new file mode 100644 index 0000000..f215055 --- /dev/null +++ b/service/mmc-agent/assets/append_to_mail.ini @@ -0,0 +1,3 @@ +[userdefault] +mailbox = /home/vmail/%uid%/ +mailuserquota = 204800 diff --git a/service/mmc-agent/assets/convert_to_ldif b/service/mmc-agent/assets/convert_to_ldif new file mode 100644 index 0000000..1eed02c --- /dev/null +++ b/service/mmc-agent/assets/convert_to_ldif @@ -0,0 +1,6 @@ +include /etc/ldap/schema/core.schema +include /etc/ldap/schema/cosine.schema +include /etc/ldap/schema/nis.schema +include /etc/ldap/schema/inetorgperson.schema +include /usr/share/doc/mmc/contrib/base/mmc.schema +include /usr/share/doc/mmc/contrib/mail/mail.schema diff --git a/service/mmc-agent/mmc-agent.sh b/service/mmc-agent/mmc-agent.sh new file mode 100755 index 0000000..db4dcbe --- /dev/null +++ b/service/mmc-agent/mmc-agent.sh @@ -0,0 +1,93 @@ +#!/bin/sh + +# -e Exit immediately if a command exits with a non-zero status +set -e + +WITH_MMC_AGENT=${WITH_MMC_AGENT} + +# Run mmc-agent +if [ "$WITH_MMC_AGENT" = true ]; then + + # Openldap is configured + if [ -e /etc/ldap/slapd.d/docker_bootstrapped ]; then + + # mmc-agent is not already configured + if [ ! -e /etc/mmc/agent/docker_bootstrapped ]; then + status "configuring mmc-agent for first run" + + status () { + echo "---> ${@}" >&2 + } + + getBaseDn () { + IFS="." + export IFS + + domain=$1 + init=1 + + for s in $domain; do + dc="dc=$s" + if [ "$init" -eq 1 ]; then + baseDn=$dc + init=0 + else + baseDn="$baseDn,$dc" + fi + done + } + + WITH_MMC_AGENT=${WITH_MMC_AGENT} + LDAP_DOMAIN=${LDAP_DOMAIN} + LDAP_ADMIN_PWD=${LDAP_ADMIN_PWD} + MMC_AGENT_LOGIN=${MMC_AGENT_LOGIN} + MMC_AGENT_PASSWORD=${MMC_AGENT_PASSWORD} + + # mmc-agent config + sed -i -e "s/127.0.0.1/0.0.0.0/" /etc/mmc/agent/config.ini + sed -i -e "s/login = mmc/login = $MMC_AGENT_LOGIN/" /etc/mmc/agent/config.ini + sed -i -e "s/password = s3cr3t/password = $MMC_AGENT_PASSWORD/" /etc/mmc/agent/config.ini + + # generate ssl certificate + rm /etc/mmc/agent/keys/cacert.pem /etc/mmc/agent/keys/localcert.pem + /sbin/create-ssl-cert $LDAP_DOMAIN /etc/mmc/agent/keys/cacert.pem /etc/mmc/agent/keys/localcert.pem + + # Get base dn from ldap domain + getBaseDn ${LDAP_DOMAIN} + + sed -i -e "s/dc=mandriva, dc=com/$baseDn/" /etc/mmc/plugins/base.ini + sed -i -e "s/password = secret/password = $LDAP_ADMIN_PWD/" /etc/mmc/plugins/base.ini + + mkdir /home/archives + + # Mail plugin + + sed -i -e 's/vDomainSupport = 0/vDomainSupport = 1/g' /etc/mmc/plugins/mail.ini + sed -i -e 's/vAliasesSupport = 0/vAliasesSupport = 1/g' /etc/mmc/plugins/mail.ini + cat /etc/mmc/agent/assets/append_to_mail.ini >> /etc/mmc/plugins/mail.ini + + touch /etc/mmc/agent/docker_bootstrapped + else + status "found already-configured mmc-agent" + fi + + # Run mmc-agent + exec /usr/sbin/mmc-agent -d + + # wait openldap config done + else + sleep 3s + fi + +# Do nothing but needed for runit +else + sleep 1d +fi + + + + + + + + diff --git a/service/slapd/assets/config/add/mail.ldif b/service/slapd/assets/config/add/mail.ldif deleted file mode 100644 index 095e9aa..0000000 --- a/service/slapd/assets/config/add/mail.ldif +++ /dev/null @@ -1,43 +0,0 @@ -# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify. -# CRC32 2e9a2075 -dn: cn=mail,cn=schema,cn=config -objectClass: olcSchemaConfig -cn: mail -olcAttributeTypes: {0}( 1.3.6.1.4.1.21103.1.1.13.1 NAME 'maildrop' DESC 'Mail - addresses where mails are forwarded -- ie forwards' EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{512} ) -olcAttributeTypes: {1}( 1.3.6.1.4.1.21103.1.1.13.2 NAME 'mailalias' DESC 'Mail - addresses accepted by this account -- ie aliases' EQUALITY caseIgnoreMatch S - UBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{512} ) -olcAttributeTypes: {2}( 1.3.6.1.4.1.21103.1.1.13.3 NAME 'mailenable' DESC 'Mai - l Account / Virtual alias validity' EQUALITY caseIgnoreMatch SUBSTR caseIgnor - eSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{8} ) -olcAttributeTypes: {3}( 1.3.6.1.4.1.21103.1.1.13.4 NAME 'mailbox' DESC 'Mailbo - x path where mails are delivered' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreS - ubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{512} ) -olcAttributeTypes: {4}( 1.3.6.1.4.1.21103.1.1.13.5 NAME 'virtualdomain' DESC ' - A mail domain name' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{512} ) -olcAttributeTypes: {5}( 1.3.6.1.4.1.21103.1.1.13.6 NAME 'virtualdomaindescript - ion' DESC 'Virtual domain description' EQUALITY caseIgnoreMatch SUBSTR caseIg - noreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{512} ) -olcAttributeTypes: {6}( 1.3.6.1.4.1.21103.1.1.13.7 NAME 'mailuserquota' DESC ' - Mailbox quota for a user in kilo-bytes' EQUALITY integerMatch SYNTAX 1.3.6.1. - 4.1.1466.115.121.1.27 SINGLE-VALUE ) -olcAttributeTypes: {7}( 1.3.6.1.4.1.21103.1.1.13.8 NAME 'mailhost' DESC 'The m - ail server IP address or FQDN for a user' EQUALITY caseIgnoreIA5Match SUBSTR - caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} SINGLE - -VALUE ) -olcAttributeTypes: {8}( 1.3.6.1.4.1.21103.1.1.13.9 NAME 'mailaliasmember' DESC - 'Member of a virtual alias' SUP distinguishedName ) -olcObjectClasses: {0}( 1.3.6.1.4.1.21103.1.2.13.1 NAME 'mailAccount' DESC 'Mai - l Account' SUP top AUXILIARY MUST mail MAY ( mailalias $ maildrop $ mailenabl - e $ mailbox $ mailuserquota $ mailhost ) ) -olcObjectClasses: {1}( 1.3.6.1.4.1.21103.1.2.13.2 NAME 'mailDomain' DESC 'Doma - in mail entry' SUP top STRUCTURAL MUST virtualdomain MAY ( virtualdomaindescr - iption $ mailuserquota ) ) -olcObjectClasses: {2}( 1.3.6.1.4.1.21103.1.2.13.3 NAME 'mailGroup' DESC 'Mail - Group' SUP top AUXILIARY MUST mail ) -olcObjectClasses: {3}( 1.3.6.1.4.1.21103.1.2.13.4 NAME 'mailAlias' DESC 'Mail - Alias' SUP top STRUCTURAL MUST mailalias MAY ( mail $ mailaliasmember $ maile - nable ) ) diff --git a/service/slapd/assets/config/add/mmc.ldif b/service/slapd/assets/config/add/mmc.ldif deleted file mode 100644 index 52b04bd..0000000 --- a/service/slapd/assets/config/add/mmc.ldif +++ /dev/null @@ -1,18 +0,0 @@ -# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify. -# CRC32 7a435a3b -dn: cn=mmc,cn=schema,cn=config -objectClass: olcSchemaConfig -cn: mmc -olcAttributeTypes: {0}( 1.3.6.1.4.1.40098.1.1.12.1 NAME 'lmcACL' DESC 'LMC acl - entry' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3. - 6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) -olcAttributeTypes: {1}( 1.3.6.1.4.1.40098.1.1.12.2 NAME 'lmcPrefMode' DESC 'LM - C user preferences' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) -olcAttributeTypes: {2}( 1.3.6.1.4.1.40098.1.1.12.3 NAME 'lmcPrinterAllowed' DE - SC 'LMC a printer where the user has the rights to print' EQUALITY caseIgnore - IA5Match SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.2 - 6 ) -olcObjectClasses: {0}( 1.3.6.1.4.1.40098.1.2.1.19.1 NAME 'lmcUserObject' DESC - 'Objectclass for LMC user settings ' AUXILIARY MAY ( lmcACL $ lmcPrefMode $ l - mcPrinterAllowed ) ) diff --git a/service/slapd/slapd.sh b/service/slapd/slapd.sh index 9a55a87..b188a19 100755 --- a/service/slapd/slapd.sh +++ b/service/slapd/slapd.sh @@ -49,6 +49,21 @@ if [ ! -e /etc/ldap/slapd.d/docker_bootstrapped ]; then slapd -h "ldapi:///" -u openldap -g openldap chown -R openldap:openldap /etc/ldap + if [ "$WITH_MMC_AGENT" = true ]; then + + # Convert needed mmc ldap schema to ldif + mkdir -p /etc/ldap/schema/converted + slaptest -f /etc/mmc/agent/assets/convert_to_ldif -F /etc/ldap/schema/converted + + sed -i -e 's/^dn:.*$/dn: cn=mmc,cn=schema,cn=config/; s/^cn:.*$/cn: mmc/; /^structuralObjectClass:.*$/d; /^entryUUID:.*$/d; /^creatorsName:.*$/d; /^createTimestamp:.*$/d; /^entryCSN:.*$/d; /^modifiersName:.*$/d; /^modifyTimestamp:.*$/d' /etc/ldap/schema/converted/cn\=config/cn\=schema/cn=\{4\}mmc.ldif + + sed -i -e 's/^dn:.*$/dn: cn=mail,cn=schema,cn=config/; s/^cn:.*$/cn: mail/; /^structuralObjectClass:.*$/d; /^entryUUID:.*$/d; /^creatorsName:.*$/d; /^createTimestamp:.*$/d; /^entryCSN:.*$/d; /^modifiersName:.*$/d; /^modifyTimestamp:.*$/d' /etc/ldap/schema/converted/cn\=config/cn\=schema/cn=\{5\}mail.ldif + + ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/converted/cn\=config/cn\=schema/cn=\{4\}mmc.ldif -Q + ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/converted/cn\=config/cn\=schema/cn=\{5\}mail.ldif -Q + + fi + # TLS if [ -e /etc/ldap/ssl/ldap.crt ] && [ -e /etc/ldap/ssl/ldap.key ] && [ -e /etc/ldap/ssl/ca.crt ]; then status "certificates found"