From ea98e318080a9cf117492bd723be3b709cd82df0 Mon Sep 17 00:00:00 2001 From: Bertrand Gouny Date: Thu, 21 Aug 2014 14:48:48 +0200 Subject: [PATCH 01/22] [twgit] Init feature 'feature-postfix-link'. From f689d387352f08c64df1d6b7d798c44e6adc4ea4 Mon Sep 17 00:00:00 2001 From: Bertrand Gouny Date: Thu, 21 Aug 2014 17:45:48 +0200 Subject: [PATCH 02/22] mmc --- Dockerfile | 4 +++- service/install.sh | 7 +++++++ service/slapd/slapd.sh | 11 +++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 service/install.sh diff --git a/Dockerfile b/Dockerfile index e02136d..5bd4d80 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,6 +9,8 @@ ENV LDAP_ADMIN_PWD toor ENV LDAP_ORGANISATION Example Inc. ENV LDAP_DOMAIN example.com +ENV WITH_MMC_AGENT false + # /!\ To store the data outside the container, # mount /var/lib/ldap and /etc/ldap/slapd.d as a data volume add # -v /some/host/directory:/var/lib/ldap and -v /some/other/host/directory:/etc/ldap/slapd.d @@ -27,7 +29,7 @@ CMD ["/sbin/my_init"] 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 openssl +RUN LC_ALL=C DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends mmc-agent slapd ldap-utils # Expose ldap default port EXPOSE 389 diff --git a/service/install.sh b/service/install.sh new file mode 100644 index 0000000..39b1e6c --- /dev/null +++ b/service/install.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +# copy mds ldap schema +cp /usr/share/doc/python-mmc-base/contrib/ldap/mmc.schema /etc/ldap/schema/ +cp /usr/share/doc/python-mmc-base/contrib/ldap/mail.schema /etc/ldap/schema/ + + diff --git a/service/slapd/slapd.sh b/service/slapd/slapd.sh index 70c1599..7e8fb6e 100755 --- a/service/slapd/slapd.sh +++ b/service/slapd/slapd.sh @@ -49,6 +49,17 @@ if [ ! -e /etc/ldap/config/docker_bootstrapped ]; then slapd -h "ldapi:///" -u openldap -g openldap chown -R openldap:openldap /etc/ldap + # Add mds ldap schema + cp /usr/share/doc/mmc/contrib/base/mmc.schema /etc/ldap/schema/ + cp /usr/share/doc/mmc/contrib/mail/mail.schema /etc/ldap/schema/ + + echo "include /etc/ldap/schema/mmc.schema" >> convert_schemas + echo "include /etc/ldap/schema/mail.schema" >> convert_schemas + + slaptest -f convert_schemas + ldapadd -Y EXTERNAL -H ldapi:/// -f cn\=config/cn\=schema/cn\=\{0\}mmc.ldif + ldapadd -Y EXTERNAL -H ldapi:/// -f cn\=config/cn\=schema/cn\=\{0\}mail.ldif + # TLS if [ -e /etc/ldap/ssl/ldap.crt ] && [ -e /etc/ldap/ssl/ldap.key ] && [ -e /etc/ldap/ssl/ca.crt ]; then status "certificates found" From 234448a2f6321b67e90824f4b567bcde0eba91dd Mon Sep 17 00:00:00 2001 From: Bertrand Gouny Date: Fri, 22 Aug 2014 16:44:54 +0200 Subject: [PATCH 03/22] mmc-agent --- Dockerfile | 20 ++++++-- service/install.sh | 7 --- service/mmc-agent/assets/append_to_mail.ini | 3 ++ service/mmc-agent/assets/convert_to_ldif | 6 +++ service/mmc-agent/install.sh | 51 +++++++++++++++++++++ service/mmc-agent/mmc-agent.sh | 17 +++++++ service/slapd/slapd.sh | 15 +++--- 7 files changed, 99 insertions(+), 20 deletions(-) delete mode 100644 service/install.sh create mode 100644 service/mmc-agent/assets/append_to_mail.ini create mode 100644 service/mmc-agent/assets/convert_to_ldif create mode 100755 service/mmc-agent/install.sh create mode 100755 service/mmc-agent/mmc-agent.sh diff --git a/Dockerfile b/Dockerfile index 5bd4d80..f4e709e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -25,14 +25,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 mmc-agent slapd ldap-utils +# Install openldap (slapd),ldap-utils and mmc tools +RUN LC_ALL=C DEBIAN_FRONTEND=noninteractive apt-get install -y --force-yes --no-install-recommends mmc-agent python-mmc-mail slapd ldap-utils -# 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 @@ -40,6 +43,15 @@ RUN mkdir /etc/ldap/ssl # Add config directory RUN mkdir /etc/ldap/config ADD service/slapd/config /etc/ldap/config +ADD service/mmc-agent/assets /etc/ldap/config + +# mmc-agent config on container start +RUN mkdir -p /etc/my_init.d +ADD service/mmc-agent/install.sh /etc/my_init.d/mmc-agent.sh + +# Add mmc-agent deamon +RUN mkdir /etc/service/mmc-agent +ADD service/mmc-agent/mmc-agent.sh /etc/service/mmc-agent/run # Add slapd deamon RUN mkdir /etc/service/slapd diff --git a/service/install.sh b/service/install.sh deleted file mode 100644 index 39b1e6c..0000000 --- a/service/install.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh - -# copy mds ldap schema -cp /usr/share/doc/python-mmc-base/contrib/ldap/mmc.schema /etc/ldap/schema/ -cp /usr/share/doc/python-mmc-base/contrib/ldap/mail.schema /etc/ldap/schema/ - - 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/install.sh b/service/mmc-agent/install.sh new file mode 100755 index 0000000..e8288cf --- /dev/null +++ b/service/mmc-agent/install.sh @@ -0,0 +1,51 @@ +#!/bin/sh + +# -e Exit immediately if a command exits with a non-zero status +set -e + +WITH_MMC_AGENT=${WITH_MMC_AGENT} +LDAP_DOMAIN=${LDAP_DOMAIN} +LDAP_ADMIN_PWD=${LDAP_ADMIN_PWD} + +if [ "$WITH_MMC_AGENT" = true ]; then + + mkdir -p /etc/ldap/schema/converted + slaptest -f /etc/ldap/config/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 + + # Base config + 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 + } + + # 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/ldap/config/append_to_mail.ini >> /etc/mmc/plugins/mail.ini + +fi diff --git a/service/mmc-agent/mmc-agent.sh b/service/mmc-agent/mmc-agent.sh new file mode 100755 index 0000000..52e4c6c --- /dev/null +++ b/service/mmc-agent/mmc-agent.sh @@ -0,0 +1,17 @@ +#!/bin/sh + +# -e Exit immediately if a command exits with a non-zero status +set -e + +WITH_MMC_AGENT=${WITH_MMC_AGENT} + +if [ "$WITH_MMC_AGENT" = true ]; then + + if [ -e /etc/ldap/config/docker_bootstrapped ]; then + exec /usr/sbin/mmc-agent -d + else + sleep 3s + fi +else + sleep 1d +fi diff --git a/service/slapd/slapd.sh b/service/slapd/slapd.sh index 7e8fb6e..c017741 100755 --- a/service/slapd/slapd.sh +++ b/service/slapd/slapd.sh @@ -49,16 +49,13 @@ if [ ! -e /etc/ldap/config/docker_bootstrapped ]; then slapd -h "ldapi:///" -u openldap -g openldap chown -R openldap:openldap /etc/ldap - # Add mds ldap schema - cp /usr/share/doc/mmc/contrib/base/mmc.schema /etc/ldap/schema/ - cp /usr/share/doc/mmc/contrib/mail/mail.schema /etc/ldap/schema/ + if [ "$WITH_MMC_AGENT" = true ]; then - echo "include /etc/ldap/schema/mmc.schema" >> convert_schemas - echo "include /etc/ldap/schema/mail.schema" >> convert_schemas + 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 - slaptest -f convert_schemas - ldapadd -Y EXTERNAL -H ldapi:/// -f cn\=config/cn\=schema/cn\=\{0\}mmc.ldif - ldapadd -Y EXTERNAL -H ldapi:/// -f cn\=config/cn\=schema/cn\=\{0\}mail.ldif # TLS if [ -e /etc/ldap/ssl/ldap.crt ] && [ -e /etc/ldap/ssl/ldap.key ] && [ -e /etc/ldap/ssl/ca.crt ]; then @@ -98,4 +95,4 @@ status "starting slapd on default port 389" set -x #with debug: #exec /usr/sbin/slapd -h "ldap:///" -u openldap -g openldap -d -1 -exec /usr/sbin/slapd -h "ldap:///" -u openldap -g openldap +exec /usr/sbin/slapd -h "ldap:///" -u openldap -g openldap -d -0 From e893fff3c83fd5daef31ec9cfc345a0c57517906 Mon Sep 17 00:00:00 2001 From: osixia Date: Mon, 25 Aug 2014 22:03:17 +0200 Subject: [PATCH 04/22] mmc ldif --- service/slapd/config/add/mail.ldif | 43 ++++++++++++++++++++++++++++++ service/slapd/config/add/mmc.ldif | 18 +++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 service/slapd/config/add/mail.ldif create mode 100644 service/slapd/config/add/mmc.ldif diff --git a/service/slapd/config/add/mail.ldif b/service/slapd/config/add/mail.ldif new file mode 100644 index 0000000..095e9aa --- /dev/null +++ b/service/slapd/config/add/mail.ldif @@ -0,0 +1,43 @@ +# 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/config/add/mmc.ldif b/service/slapd/config/add/mmc.ldif new file mode 100644 index 0000000..52b04bd --- /dev/null +++ b/service/slapd/config/add/mmc.ldif @@ -0,0 +1,18 @@ +# 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 ) ) From 09b8595d625401e2184a74cad0a76c1eaa8ad10c Mon Sep 17 00:00:00 2001 From: Bertrand Gouny Date: Tue, 26 Aug 2014 11:45:41 +0200 Subject: [PATCH 05/22] new ldif schema --- Dockerfile | 26 +++------- service/mmc-agent/assets/append_to_mail.ini | 3 -- service/mmc-agent/assets/convert_to_ldif | 6 --- service/mmc-agent/install.sh | 51 ------------------- service/mmc-agent/mmc-agent.sh | 17 ------- .../slapd/{ => assets}/config/add/mail.ldif | 0 .../slapd/{ => assets}/config/add/mmc.ldif | 0 .../config/modify}/auto/tls.ldif | 0 .../config/modify}/logging.ldif | 0 service/slapd/slapd.sh | 24 ++++----- 10 files changed, 17 insertions(+), 110 deletions(-) delete mode 100644 service/mmc-agent/assets/append_to_mail.ini delete mode 100644 service/mmc-agent/assets/convert_to_ldif delete mode 100755 service/mmc-agent/install.sh delete mode 100755 service/mmc-agent/mmc-agent.sh rename service/slapd/{ => assets}/config/add/mail.ldif (100%) rename service/slapd/{ => assets}/config/add/mmc.ldif (100%) rename service/slapd/{config => assets/config/modify}/auto/tls.ldif (100%) rename service/slapd/{config => assets/config/modify}/logging.ldif (100%) diff --git a/Dockerfile b/Dockerfile index f4e709e..8647287 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM osixia/baseimage:0.6.0 +FROM osixia/baseimage:0.8.2 MAINTAINER Bertrand Gouny # From Nick Stenning's work @@ -9,8 +9,6 @@ ENV LDAP_ADMIN_PWD toor ENV LDAP_ORGANISATION Example Inc. ENV LDAP_DOMAIN example.com -ENV WITH_MMC_AGENT false - # /!\ To store the data outside the container, # mount /var/lib/ldap and /etc/ldap/slapd.d as a data volume add # -v /some/host/directory:/var/lib/ldap and -v /some/other/host/directory:/etc/ldap/slapd.d @@ -25,33 +23,21 @@ 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),ldap-utils and mmc tools -RUN LC_ALL=C DEBIAN_FRONTEND=noninteractive apt-get install -y --force-yes --no-install-recommends mmc-agent python-mmc-mail slapd ldap-utils +# Install openldap (slapd) and ldap-utils +RUN LC_ALL=C DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends slapd ldap-utils -# Expose ldap and mmc-agent default ports -EXPOSE 389 7080 +# Expose ldap default port +EXPOSE 389 # Create TLS certificats directory RUN mkdir /etc/ldap/ssl # Add config directory RUN mkdir /etc/ldap/config -ADD service/slapd/config /etc/ldap/config -ADD service/mmc-agent/assets /etc/ldap/config - -# mmc-agent config on container start -RUN mkdir -p /etc/my_init.d -ADD service/mmc-agent/install.sh /etc/my_init.d/mmc-agent.sh - -# Add mmc-agent deamon -RUN mkdir /etc/service/mmc-agent -ADD service/mmc-agent/mmc-agent.sh /etc/service/mmc-agent/run +ADD service/slapd/assets/config /etc/ldap/config # Add slapd deamon RUN mkdir /etc/service/slapd diff --git a/service/mmc-agent/assets/append_to_mail.ini b/service/mmc-agent/assets/append_to_mail.ini deleted file mode 100644 index f215055..0000000 --- a/service/mmc-agent/assets/append_to_mail.ini +++ /dev/null @@ -1,3 +0,0 @@ -[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 deleted file mode 100644 index 1eed02c..0000000 --- a/service/mmc-agent/assets/convert_to_ldif +++ /dev/null @@ -1,6 +0,0 @@ -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/install.sh b/service/mmc-agent/install.sh deleted file mode 100755 index e8288cf..0000000 --- a/service/mmc-agent/install.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/sh - -# -e Exit immediately if a command exits with a non-zero status -set -e - -WITH_MMC_AGENT=${WITH_MMC_AGENT} -LDAP_DOMAIN=${LDAP_DOMAIN} -LDAP_ADMIN_PWD=${LDAP_ADMIN_PWD} - -if [ "$WITH_MMC_AGENT" = true ]; then - - mkdir -p /etc/ldap/schema/converted - slaptest -f /etc/ldap/config/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 - - # Base config - 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 - } - - # 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/ldap/config/append_to_mail.ini >> /etc/mmc/plugins/mail.ini - -fi diff --git a/service/mmc-agent/mmc-agent.sh b/service/mmc-agent/mmc-agent.sh deleted file mode 100755 index 52e4c6c..0000000 --- a/service/mmc-agent/mmc-agent.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/sh - -# -e Exit immediately if a command exits with a non-zero status -set -e - -WITH_MMC_AGENT=${WITH_MMC_AGENT} - -if [ "$WITH_MMC_AGENT" = true ]; then - - if [ -e /etc/ldap/config/docker_bootstrapped ]; then - exec /usr/sbin/mmc-agent -d - else - sleep 3s - fi -else - sleep 1d -fi diff --git a/service/slapd/config/add/mail.ldif b/service/slapd/assets/config/add/mail.ldif similarity index 100% rename from service/slapd/config/add/mail.ldif rename to service/slapd/assets/config/add/mail.ldif diff --git a/service/slapd/config/add/mmc.ldif b/service/slapd/assets/config/add/mmc.ldif similarity index 100% rename from service/slapd/config/add/mmc.ldif rename to service/slapd/assets/config/add/mmc.ldif diff --git a/service/slapd/config/auto/tls.ldif b/service/slapd/assets/config/modify/auto/tls.ldif similarity index 100% rename from service/slapd/config/auto/tls.ldif rename to service/slapd/assets/config/modify/auto/tls.ldif diff --git a/service/slapd/config/logging.ldif b/service/slapd/assets/config/modify/logging.ldif similarity index 100% rename from service/slapd/config/logging.ldif rename to service/slapd/assets/config/modify/logging.ldif diff --git a/service/slapd/slapd.sh b/service/slapd/slapd.sh index c017741..9a55a87 100755 --- a/service/slapd/slapd.sh +++ b/service/slapd/slapd.sh @@ -43,20 +43,12 @@ fi ############ Custom config ############ -if [ ! -e /etc/ldap/config/docker_bootstrapped ]; then +if [ ! -e /etc/ldap/slapd.d/docker_bootstrapped ]; then status "Custom config" slapd -h "ldapi:///" -u openldap -g openldap chown -R openldap:openldap /etc/ldap - if [ "$WITH_MMC_AGENT" = true ]; then - - 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" @@ -66,7 +58,7 @@ if [ ! -e /etc/ldap/config/docker_bootstrapped ]; then # create DHParamFile if not found [ -f /etc/ldap/ssl/dhparam.pem ] || openssl dhparam -out /etc/ldap/ssl/dhparam.pem 2048 - ldapmodify -Y EXTERNAL -H ldapi:/// -f /etc/ldap/config/auto/tls.ldif -Q + ldapmodify -Y EXTERNAL -H ldapi:/// -f /etc/ldap/config/modify/auto/tls.ldif -Q # add fake dnsmasq route to certificate cn cn=$(openssl x509 -in /etc/ldap/ssl/ldap.crt -subject -noout | sed -n 's/.*CN=\(.*\)\/*\(.*\)/\1/p') @@ -77,15 +69,21 @@ if [ ! -e /etc/ldap/config/docker_bootstrapped ]; then # Replication # todo :) - # Other config files - for f in $(find /etc/ldap/config -maxdepth 1 -name \*.ldif -type f); do + # Add config + for f in $(find /etc/ldap/config/add -maxdepth 1 -name \*.ldif -type f); do + status "Processing file ${f}" + ldapadd -Y EXTERNAL -H ldapi:/// -f $f -Q + done + + # Modify config + for f in $(find /etc/ldap/config/modify -maxdepth 1 -name \*.ldif -type f); do status "Processing file ${f}" ldapmodify -Y EXTERNAL -H ldapi:/// -f $f -Q done kill -INT `cat /run/slapd/slapd.pid` - touch /etc/ldap/config/docker_bootstrapped + touch /etc/ldap/slapd.d/docker_bootstrapped else status "found already-configured slapd" From 731d92cb2e51c59c87b98a1c89164bab46e1efc4 Mon Sep 17 00:00:00 2001 From: Bertrand Gouny Date: Tue, 26 Aug 2014 15:23:47 +0200 Subject: [PATCH 06/22] new baseimage --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 8647287..68b573a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ FROM osixia/baseimage:0.8.2 -MAINTAINER Bertrand Gouny +MAINTAINER Bertrand Gouny # From Nick Stenning's work # https://github.com/nickstenning/docker-slapd From c788c2024530bba2ebf68c7278d2b3d2da714414 Mon Sep 17 00:00:00 2001 From: Bertrand Gouny Date: Wed, 27 Aug 2014 17:55:45 +0200 Subject: [PATCH 07/22] mmc-agent is back --- Dockerfile | 22 ++++- service/mmc-agent/assets/append_to_mail.ini | 3 + service/mmc-agent/assets/convert_to_ldif | 6 ++ service/mmc-agent/mmc-agent.sh | 93 +++++++++++++++++++++ service/slapd/assets/config/add/mail.ldif | 43 ---------- service/slapd/assets/config/add/mmc.ldif | 18 ---- service/slapd/slapd.sh | 15 ++++ 7 files changed, 135 insertions(+), 65 deletions(-) create mode 100644 service/mmc-agent/assets/append_to_mail.ini create mode 100644 service/mmc-agent/assets/convert_to_ldif create mode 100755 service/mmc-agent/mmc-agent.sh delete mode 100644 service/slapd/assets/config/add/mail.ldif delete mode 100644 service/slapd/assets/config/add/mmc.ldif 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" From f5d4c7b5c59e35c2c71903b72eaad56e2e03bd57 Mon Sep 17 00:00:00 2001 From: Bertrand Gouny Date: Fri, 29 Aug 2014 17:41:13 +0200 Subject: [PATCH 08/22] docker.io to docker --- Makefile | 8 ++++---- test/tools/build-container.sh | 4 ++-- test/tools/delete-container.sh | 6 +++--- test/tools/delete-image.sh | 4 ++-- test/tools/run-container.sh | 6 +++--- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Makefile b/Makefile index efa44fb..12d1b20 100644 --- a/Makefile +++ b/Makefile @@ -6,16 +6,16 @@ VERSION = 0.9.1 all: build build: - docker.io build -t $(NAME):$(VERSION) --rm . + docker build -t $(NAME):$(VERSION) --rm . test: env NAME=$(NAME) VERSION=$(VERSION) ./test.sh debug tag_latest: - docker.io tag $(NAME):$(VERSION) $(NAME):latest + docker tag $(NAME):$(VERSION) $(NAME):latest release: build test tag_latest - @if ! docker.io images $(NAME) | awk '{ print $$2 }' | grep -q -F $(VERSION); then echo "$(NAME) version $(VERSION) is not yet built. Please run 'make build'"; false; fi - docker.io push $(NAME) + @if ! docker images $(NAME) | awk '{ print $$2 }' | grep -q -F $(VERSION); then echo "$(NAME) version $(VERSION) is not yet built. Please run 'make build'"; false; fi + docker push $(NAME) @echo "*** Don't forget to run 'twgit release finish' :)" diff --git a/test/tools/build-container.sh b/test/tools/build-container.sh index 7103b87..2be4907 100755 --- a/test/tools/build-container.sh +++ b/test/tools/build-container.sh @@ -1,5 +1,5 @@ #!/bin/sh -docker.io build -t $testImage . -#docker.io build --no-cache=true -t $testImage . +docker build -t $testImage . +#docker build --no-cache=true -t $testImage . diff --git a/test/tools/delete-container.sh b/test/tools/delete-container.sh index dc33aae..e7a6abe 100755 --- a/test/tools/delete-container.sh +++ b/test/tools/delete-container.sh @@ -1,9 +1,9 @@ #!/bin/sh # remove test container -res=$(docker.io ps -a | grep -c "$testContainer") +res=$(docker ps -a | grep -c "$testContainer") if [ $res -ne 0 ]; then - docker.io stop $testContainer - docker.io rm $testContainer + docker stop $testContainer + docker rm $testContainer fi diff --git a/test/tools/delete-image.sh b/test/tools/delete-image.sh index 9704547..28cd3d2 100755 --- a/test/tools/delete-image.sh +++ b/test/tools/delete-image.sh @@ -1,8 +1,8 @@ #!/bin/sh # remove test image -res=$(docker.io images | grep -c "$testImage") +res=$(docker images | grep -c "$testImage") if [ $res -ne 0 ]; then - docker.io rmi $testImage + docker rmi $testImage fi diff --git a/test/tools/run-container.sh b/test/tools/run-container.sh index 2c0e1d7..d6825ae 100755 --- a/test/tools/run-container.sh +++ b/test/tools/run-container.sh @@ -1,11 +1,11 @@ #!/bin/sh -echo "docker.io run --name $testContainer $runOptions -d $testImage $runCommand" -ID=`docker.io run --name $testContainer $runOptions -d $testImage $runCommand` +echo "docker run --name $testContainer $runOptions -d $testImage $runCommand" +ID=`docker run --name $testContainer $runOptions -d $testImage $runCommand` sleep 10 echo " --> Obtaining IP" -IP=`docker.io inspect -f "{{ .NetworkSettings.IPAddress }}" $ID` +IP=`docker inspect -f "{{ .NetworkSettings.IPAddress }}" $ID` if [ "$IP" = "" ]; then abort "Unable to obtain container IP" exit 1 From 69b7e8fdfe939a87fb628870550d3cf422462acc Mon Sep 17 00:00:00 2001 From: Bertrand Gouny Date: Fri, 29 Aug 2014 17:45:55 +0200 Subject: [PATCH 09/22] changelog --- Changelog.md | 0 Makefile | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 Changelog.md diff --git a/Changelog.md b/Changelog.md new file mode 100644 index 0000000..e69de29 diff --git a/Makefile b/Makefile index 12d1b20..306c037 100644 --- a/Makefile +++ b/Makefile @@ -16,6 +16,7 @@ tag_latest: release: build test tag_latest @if ! docker images $(NAME) | awk '{ print $$2 }' | grep -q -F $(VERSION); then echo "$(NAME) version $(VERSION) is not yet built. Please run 'make build'"; false; fi + @if ! head -n 1 Changelog.md | grep -q 'release date'; then echo 'Please note the release date in Changelog.md.' && false; fi docker push $(NAME) - @echo "*** Don't forget to run 'twgit release finish' :)" + @echo "*** Don't forget to run 'twgit release/hotfix finish' :)" From f1a9dd1b786eea516f5254ecadfc4d29e27dbbb8 Mon Sep 17 00:00:00 2001 From: Bertrand Gouny Date: Fri, 29 Aug 2014 17:55:55 +0200 Subject: [PATCH 10/22] rename Changelog to CHANGELOG --- Changelog.md => CHANGELOG.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Changelog.md => CHANGELOG.md (100%) diff --git a/Changelog.md b/CHANGELOG.md similarity index 100% rename from Changelog.md rename to CHANGELOG.md From 680bfa91f7502e8ed05eef99d3cd381cf710ab80 Mon Sep 17 00:00:00 2001 From: Bertrand Gouny Date: Fri, 29 Aug 2014 17:57:19 +0200 Subject: [PATCH 11/22] rename Changelog to CHANGELOG --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 306c037..f95592b 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ tag_latest: release: build test tag_latest @if ! docker images $(NAME) | awk '{ print $$2 }' | grep -q -F $(VERSION); then echo "$(NAME) version $(VERSION) is not yet built. Please run 'make build'"; false; fi - @if ! head -n 1 Changelog.md | grep -q 'release date'; then echo 'Please note the release date in Changelog.md.' && false; fi + @if ! head -n 1 CHANGELOG.md | grep -q 'release date'; then echo 'Please note the release date in Changelog.md.' && false; fi docker push $(NAME) @echo "*** Don't forget to run 'twgit release/hotfix finish' :)" From a659aba3ce627a070569d3a47c246361ad93da48 Mon Sep 17 00:00:00 2001 From: Bertrand Gouny Date: Wed, 15 Oct 2014 17:56:17 +0200 Subject: [PATCH 12/22] new base image version --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 71ad336..b694cd2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM osixia/baseimage:0.8.2 +FROM osixia/baseimage:0.9.0 MAINTAINER Bertrand Gouny # From Nick Stenning's work From 9a3d2479038836db1775ce4cfac78240995f06ed Mon Sep 17 00:00:00 2001 From: osixia Date: Thu, 16 Oct 2014 21:20:50 +0200 Subject: [PATCH 13/22] dockerfile --- Dockerfile | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index b694cd2..b8ff77b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,6 +18,8 @@ ENV MMC_AGENT_PASSWORD passw0rd # -v /some/host/directory:/var/lib/ldap and -v /some/other/host/directory:/etc/ldap/slapd.d # to the run command +VOLUME ["/var/lib/ldap", "/etc/ldap/slapd.d"] + # Disable SSH # RUN rm -rf /etc/service/sshd /etc/my_init.d/00_regen_ssh_host_keys.sh @@ -43,18 +45,13 @@ EXPOSE 389 7080 RUN mkdir /etc/ldap/ssl # Add config directory -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 From 79387d1f4e5d02e8454320b187da34a7cb0d4144 Mon Sep 17 00:00:00 2001 From: Bertrand Gouny Date: Tue, 21 Oct 2014 16:58:49 +0200 Subject: [PATCH 14/22] add TLS by default --- Dockerfile | 1 + service/mmc-agent/mmc-agent.sh | 5 +-- .../slapd/assets/config/modify/auto/tls.ldif | 3 ++ service/slapd/slapd.sh | 32 +++++++++++++++---- test/db.sh | 2 ++ test/simple.sh | 1 + test/tls.sh | 1 + 7 files changed, 36 insertions(+), 9 deletions(-) diff --git a/Dockerfile b/Dockerfile index b8ff77b..01dccb7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,6 +5,7 @@ MAINTAINER Bertrand Gouny # https://github.com/nickstenning/docker-slapd # Default configuration: can be overridden at the docker command line +ENV DOMAIN_NAME ldap.example.com ENV LDAP_DOMAIN example.com ENV LDAP_ADMIN_PWD toor ENV LDAP_ORGANISATION Example Inc. diff --git a/service/mmc-agent/mmc-agent.sh b/service/mmc-agent/mmc-agent.sh index db4dcbe..c630403 100755 --- a/service/mmc-agent/mmc-agent.sh +++ b/service/mmc-agent/mmc-agent.sh @@ -37,6 +37,7 @@ if [ "$WITH_MMC_AGENT" = true ]; then done } + DOMAIN_NAME=${DOMAIN_NAME} WITH_MMC_AGENT=${WITH_MMC_AGENT} LDAP_DOMAIN=${LDAP_DOMAIN} LDAP_ADMIN_PWD=${LDAP_ADMIN_PWD} @@ -44,13 +45,13 @@ if [ "$WITH_MMC_AGENT" = true ]; then 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/127.0.0.1/172.17.0.0/" /etc/mmc/agent/config.ini #listen on docker default network 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 + /sbin/create-ssl-cert $DOMAIN_NAME /etc/mmc/agent/keys/cacert.pem /etc/mmc/agent/keys/localcert.pem # Get base dn from ldap domain getBaseDn ${LDAP_DOMAIN} diff --git a/service/slapd/assets/config/modify/auto/tls.ldif b/service/slapd/assets/config/modify/auto/tls.ldif index 55fb4ef..63b9b8a 100644 --- a/service/slapd/assets/config/modify/auto/tls.ldif +++ b/service/slapd/assets/config/modify/auto/tls.ldif @@ -1,5 +1,8 @@ dn: cn=config changetype: modify +add: olcTLSCipherSuite +olcTLSCipherSuite: SECURE256:-VERS-SSL3.0 +- replace: olcTLSCACertificateFile olcTLSCACertificateFile: /etc/ldap/ssl/ca.crt - diff --git a/service/slapd/slapd.sh b/service/slapd/slapd.sh index b188a19..7ed8e06 100755 --- a/service/slapd/slapd.sh +++ b/service/slapd/slapd.sh @@ -11,6 +11,7 @@ set -x : LDAP_ADMIN_PWD=${LDAP_ADMIN_PWD} : LDAP_DOMAIN=${LDAP_DOMAIN} : LDAP_ORGANISATION=${LDAP_ORGANISATION} +: DOMAIN_NAME=${DOMAIN_NAME} ############ Base config ############ @@ -35,6 +36,10 @@ EOF dpkg-reconfigure -f noninteractive slapd + # Enable access only from docker default network and localhost + echo "slapd: 172.17.0.0/255.255.0.0 127.0.0.1 : ALLOW" >> /etc/hosts.allow + echo "slapd: ALL : DENY" >> /etc/hosts.allow + touch /var/lib/ldap/docker_bootstrapped else @@ -69,18 +74,31 @@ if [ ! -e /etc/ldap/slapd.d/docker_bootstrapped ]; then status "certificates found" chmod 600 /etc/ldap/ssl/ldap.key + else - # create DHParamFile if not found - [ -f /etc/ldap/ssl/dhparam.pem ] || openssl dhparam -out /etc/ldap/ssl/dhparam.pem 2048 + #generate default tls certificates / set domain name + DOMAIN_ESC=`echo $DOMAIN_NAME | sed 's/\./_/g'` + DOMAIN_ESC_UPPER=`echo $DOMAIN_ESC | tr '[a-z]' '[A-Z]'` + export SSL_${DOMAIN_ESC_UPPER}_COMMON_NAME=${DOMAIN_NAME} + export SSL_${DOMAIN_ESC_UPPER}_ORGANIZATION="${LDAP_ORGANISATION}" - ldapmodify -Y EXTERNAL -H ldapi:/// -f /etc/ldap/config/modify/auto/tls.ldif -Q - - # add fake dnsmasq route to certificate cn - cn=$(openssl x509 -in /etc/ldap/ssl/ldap.crt -subject -noout | sed -n 's/.*CN=\(.*\)\/*\(.*\)/\1/p') - echo "127.0.0.1 " $cn >> /etc/dhosts + /sbin/create-ssl-cert $DOMAIN_NAME /etc/ldap/ssl/ldap.crt /etc/ldap/ssl/ldap.key + cp /etc/ldap/ssl/ldap.crt /etc/ldap/ssl/ca.crt fi + # Fix permission on certificates + chown openldap:openldap -R /etc/ldap/ssl + + # create DHParamFile if not found + [ -f /etc/ldap/ssl/dhparam.pem ] || openssl dhparam -out /etc/ldap/ssl/dhparam.pem 2048 + + ldapmodify -Y EXTERNAL -H ldapi:/// -f /etc/ldap/config/modify/auto/tls.ldif -Q + + # add fake dnsmasq route to certificate cn + cn=$(openssl x509 -in /etc/ldap/ssl/ldap.crt -subject -noout | sed -n 's/.*CN=\(.*\)\/*\(.*\)/\1/p') + echo "127.0.0.1 " $cn >> /etc/dhosts + # Replication # todo :) diff --git a/test/db.sh b/test/db.sh index 79b1f59..00e99cb 100755 --- a/test/db.sh +++ b/test/db.sh @@ -12,10 +12,12 @@ mkdir $testDir/config runOptions="-e LDAP_DOMAIN=otherdomain.com -v $testDir/db:/var/lib/ldap -v $testDir/config:/etc/ldap/slapd.d" . $dir/tools/run-container.sh +sleep 30 $dir/tools/delete-container.sh runOptions="-v $testDir/db:/var/lib/ldap -v $testDir/config:/etc/ldap/slapd.d" . $dir/tools/run-container.sh +sleep 30 echo "ldapsearch -x -h $IP -b dc=otherdomain,dc=com" ldapsearch -x -h $IP -b dc=otherdomain,dc=com diff --git a/test/simple.sh b/test/simple.sh index 4186276..3fa5842 100755 --- a/test/simple.sh +++ b/test/simple.sh @@ -4,6 +4,7 @@ dir=$(dirname $0) . $dir/tools/run-container.sh echo "ldapsearch -x -h $IP -b dc=example,dc=com" +sleep 30 ldapsearch -x -h $IP -b dc=example,dc=com $dir/tools/delete-container.sh diff --git a/test/tls.sh b/test/tls.sh index 0ee296d..5b2b842 100755 --- a/test/tls.sh +++ b/test/tls.sh @@ -4,6 +4,7 @@ dir=$(dirname $0) . $dir/tls/run.sh echo "ldapsearch -x -h $certCN -b dc=example,dc=com -ZZ" +sleep 30 ldapsearch -x -h $certCN -b dc=example,dc=com -ZZ . $dir/tls/end.sh From 41dd9c581e2b7d045a43422d2cae31f8404b3639 Mon Sep 17 00:00:00 2001 From: Bertrand Gouny Date: Tue, 21 Oct 2014 17:51:54 +0200 Subject: [PATCH 15/22] pioup --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 01dccb7..26fbd97 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM osixia/baseimage:0.9.0 +FROM osixia/baseimage:0.9.1 MAINTAINER Bertrand Gouny # From Nick Stenning's work From ad1de4a196c42cf8c9fcb995a297fe4a41d61668 Mon Sep 17 00:00:00 2001 From: Bertrand Gouny Date: Thu, 6 Nov 2014 18:22:18 +0100 Subject: [PATCH 16/22] files --- Dockerfile | 2 +- service/slapd/slapd.sh | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Dockerfile b/Dockerfile index 26fbd97..14266e1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -25,7 +25,7 @@ VOLUME ["/var/lib/ldap", "/etc/ldap/slapd.d"] # RUN rm -rf /etc/service/sshd /etc/my_init.d/00_regen_ssh_host_keys.sh # Enable dnsmasq -RUN /sbin/enable-service dnsmasq +RUN /sbin/enable-service dnsmasq ca-authority # Use baseimage-docker's init system. CMD ["/sbin/my_init"] diff --git a/service/slapd/slapd.sh b/service/slapd/slapd.sh index 7ed8e06..8a4eda5 100755 --- a/service/slapd/slapd.sh +++ b/service/slapd/slapd.sh @@ -77,16 +77,16 @@ if [ ! -e /etc/ldap/slapd.d/docker_bootstrapped ]; then else #generate default tls certificates / set domain name - DOMAIN_ESC=`echo $DOMAIN_NAME | sed 's/\./_/g'` - DOMAIN_ESC_UPPER=`echo $DOMAIN_ESC | tr '[a-z]' '[A-Z]'` - export SSL_${DOMAIN_ESC_UPPER}_COMMON_NAME=${DOMAIN_NAME} - export SSL_${DOMAIN_ESC_UPPER}_ORGANIZATION="${LDAP_ORGANISATION}" + export SSL_SLAPD_COMMON_NAME="$DOMAIN_NAME" + export SSL_SLAPD_ORGANIZATION="${LDAP_ORGANISATION}" - /sbin/create-ssl-cert $DOMAIN_NAME /etc/ldap/ssl/ldap.crt /etc/ldap/ssl/ldap.key - cp /etc/ldap/ssl/ldap.crt /etc/ldap/ssl/ca.crt + /sbin/ssl-create-cert slapd /etc/ldap/ssl/ldap.crt /etc/ldap/ssl/ldap.key + ln -s /etc/ssl/certs/docker_baseimage_cacert.pem /etc/ldap/ssl/ca.crt fi + sed -i 's,TLS_CACERT.*,TLS_CACERT ./etc/ldap/ssl/ca.crt,g' /etc/ldap/ldap.conf + # Fix permission on certificates chown openldap:openldap -R /etc/ldap/ssl From dc2ec09f220f3e47d00c0314136714c3139c0e92 Mon Sep 17 00:00:00 2001 From: Bertrand Gouny Date: Fri, 7 Nov 2014 15:30:41 +0100 Subject: [PATCH 17/22] gnutls --- service/slapd/slapd.sh | 15 ++++++++------- test/test.out | 33 +++++++++++++++++++++++++++++++++ test/tools/run-container.sh | 4 ++-- 3 files changed, 43 insertions(+), 9 deletions(-) create mode 100644 test/test.out diff --git a/service/slapd/slapd.sh b/service/slapd/slapd.sh index 8a4eda5..bbd42b8 100755 --- a/service/slapd/slapd.sh +++ b/service/slapd/slapd.sh @@ -73,23 +73,24 @@ if [ ! -e /etc/ldap/slapd.d/docker_bootstrapped ]; then if [ -e /etc/ldap/ssl/ldap.crt ] && [ -e /etc/ldap/ssl/ldap.key ] && [ -e /etc/ldap/ssl/ca.crt ]; then status "certificates found" - chmod 600 /etc/ldap/ssl/ldap.key else - #generate default tls certificates / set domain name + # generate default tls certificate export SSL_SLAPD_COMMON_NAME="$DOMAIN_NAME" export SSL_SLAPD_ORGANIZATION="${LDAP_ORGANISATION}" - /sbin/ssl-create-cert slapd /etc/ldap/ssl/ldap.crt /etc/ldap/ssl/ldap.key - ln -s /etc/ssl/certs/docker_baseimage_cacert.pem /etc/ldap/ssl/ca.crt + /sbin/ssl-gnutls-create-signed-cert slapd /etc/ldap/ssl/ldap.crt /etc/ldap/ssl/ldap.key + ln -s /etc/ssl/certs/docker_baseimage_gnutls_cacert.pem /etc/ldap/ssl/ca.crt fi - sed -i 's,TLS_CACERT.*,TLS_CACERT ./etc/ldap/ssl/ca.crt,g' /etc/ldap/ldap.conf - # Fix permission on certificates chown openldap:openldap -R /etc/ldap/ssl + chmod 600 /etc/ldap/ssl/ldap.key + # ldap client config + sed -i 's,TLS_CACERT.*,TLS_CACERT /etc/ldap/ssl/ca.crt,g' /etc/ldap/ldap.conf + # create DHParamFile if not found [ -f /etc/ldap/ssl/dhparam.pem ] || openssl dhparam -out /etc/ldap/ssl/dhparam.pem 2048 @@ -97,7 +98,7 @@ if [ ! -e /etc/ldap/slapd.d/docker_bootstrapped ]; then # add fake dnsmasq route to certificate cn cn=$(openssl x509 -in /etc/ldap/ssl/ldap.crt -subject -noout | sed -n 's/.*CN=\(.*\)\/*\(.*\)/\1/p') - echo "127.0.0.1 " $cn >> /etc/dhosts + /sbin/dns-add-host 127.0.0.1 $cn # Replication # todo :) diff --git a/test/test.out b/test/test.out new file mode 100644 index 0000000..2966139 --- /dev/null +++ b/test/test.out @@ -0,0 +1,33 @@ +docker run --name openldap-repository-test-container --dns=127.0.0.1 -v /home/bgouny/Bureau/pop/docker-openldap/test/tls/ssl:/etc/ldap/ssl -d osixia/openldap:latest /sbin/my_init --enable-insecure-key + --> Obtaining IP + --> 172.17.0.37 +ldapsearch -x -h ldap-test.example.com -b dc=example,dc=com -ZZ +# extended LDIF +# +# LDAPv3 +# base with scope subtree +# filter: (objectclass=*) +# requesting: ALL +# + +# example.com +dn: dc=example,dc=com +objectClass: top +objectClass: dcObject +objectClass: organization +o: Example Inc. +dc: example + +# admin, example.com +dn: cn=admin,dc=example,dc=com +objectClass: simpleSecurityObject +objectClass: organizationalRole +cn: admin +description: LDAP administrator + +# search result +search: 3 +result: 0 Success + +# numResponses: 3 +# numEntries: 2 diff --git a/test/tools/run-container.sh b/test/tools/run-container.sh index d6825ae..8e24fac 100755 --- a/test/tools/run-container.sh +++ b/test/tools/run-container.sh @@ -1,7 +1,7 @@ #!/bin/sh -echo "docker run --name $testContainer $runOptions -d $testImage $runCommand" -ID=`docker run --name $testContainer $runOptions -d $testImage $runCommand` +echo "docker run --name $testContainer $runOptions -d $testImage $runCommand /sbin/my_init --enable-insecure-key" +ID=`docker run --name $testContainer $runOptions -d $testImage $runCommand /sbin/my_init --enable-insecure-key` sleep 10 echo " --> Obtaining IP" From 01f8d8ddcf8229d72e05ee462dcda9677403550c Mon Sep 17 00:00:00 2001 From: Bertrand Gouny Date: Fri, 7 Nov 2014 15:50:43 +0100 Subject: [PATCH 18/22] baseimage version --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 14266e1..df0bf55 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM osixia/baseimage:0.9.1 +FROM osixia/baseimage:0.10.0 MAINTAINER Bertrand Gouny # From Nick Stenning's work From 78e3ae88e2d5c5b1ac4d335fa219909b18113eb6 Mon Sep 17 00:00:00 2001 From: Bertrand Gouny Date: Mon, 24 Nov 2014 14:05:01 +0100 Subject: [PATCH 19/22] pb mmc agent --- service/mmc-agent/mmc-agent.sh | 4 ++-- test/test.out | 33 --------------------------------- 2 files changed, 2 insertions(+), 35 deletions(-) delete mode 100644 test/test.out diff --git a/service/mmc-agent/mmc-agent.sh b/service/mmc-agent/mmc-agent.sh index c630403..e57df3f 100755 --- a/service/mmc-agent/mmc-agent.sh +++ b/service/mmc-agent/mmc-agent.sh @@ -45,13 +45,13 @@ if [ "$WITH_MMC_AGENT" = true ]; then MMC_AGENT_PASSWORD=${MMC_AGENT_PASSWORD} # mmc-agent config - sed -i -e "s/127.0.0.1/172.17.0.0/" /etc/mmc/agent/config.ini #listen on docker default network + sed -i -e "s/127.0.0.1/0.0.0.0/" /etc/mmc/agent/config.ini #listen on docker default network 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 $DOMAIN_NAME /etc/mmc/agent/keys/cacert.pem /etc/mmc/agent/keys/localcert.pem + /sbin/ssl-create-cert mmc /etc/mmc/agent/keys/cacert.pem /etc/mmc/agent/keys/localcert.pem # Get base dn from ldap domain getBaseDn ${LDAP_DOMAIN} diff --git a/test/test.out b/test/test.out deleted file mode 100644 index 2966139..0000000 --- a/test/test.out +++ /dev/null @@ -1,33 +0,0 @@ -docker run --name openldap-repository-test-container --dns=127.0.0.1 -v /home/bgouny/Bureau/pop/docker-openldap/test/tls/ssl:/etc/ldap/ssl -d osixia/openldap:latest /sbin/my_init --enable-insecure-key - --> Obtaining IP - --> 172.17.0.37 -ldapsearch -x -h ldap-test.example.com -b dc=example,dc=com -ZZ -# extended LDIF -# -# LDAPv3 -# base with scope subtree -# filter: (objectclass=*) -# requesting: ALL -# - -# example.com -dn: dc=example,dc=com -objectClass: top -objectClass: dcObject -objectClass: organization -o: Example Inc. -dc: example - -# admin, example.com -dn: cn=admin,dc=example,dc=com -objectClass: simpleSecurityObject -objectClass: organizationalRole -cn: admin -description: LDAP administrator - -# search result -search: 3 -result: 0 Success - -# numResponses: 3 -# numEntries: 2 From 75edf5a6fa644a689d804696f55f1d26b1730b3f Mon Sep 17 00:00:00 2001 From: Bertrand Gouny Date: Tue, 24 Feb 2015 18:01:44 +0100 Subject: [PATCH 20/22] refacto --- image/Dockerfile | 74 ++++++++++++++++++ image/env.yml | 15 ++++ image/service/install.sh | 6 ++ .../mmc-agent/assets/append_to_mail.ini | 0 .../service}/mmc-agent/assets/convert_to_ldif | 0 .../service/mmc-agent/container-start.sh | 10 +-- image/service/mmc-agent/daemon.sh | 0 .../slapd/assets/config/modify/auto/tls.ldif | 0 .../slapd/assets/config/modify/logging.ldif | 0 .../service/slapd/container-start.sh | 78 ++++++++++++++----- image/service/slapd/daemon.sh | 2 + test-repository.sh | 15 ---- test.sh | 16 ---- 13 files changed, 156 insertions(+), 60 deletions(-) create mode 100644 image/Dockerfile create mode 100644 image/env.yml create mode 100755 image/service/install.sh rename {service => image/service}/mmc-agent/assets/append_to_mail.ini (100%) rename {service => image/service}/mmc-agent/assets/convert_to_ldif (100%) rename service/mmc-agent/mmc-agent.sh => image/service/mmc-agent/container-start.sh (99%) create mode 100644 image/service/mmc-agent/daemon.sh rename {service => image/service}/slapd/assets/config/modify/auto/tls.ldif (100%) rename {service => image/service}/slapd/assets/config/modify/logging.ldif (100%) rename service/slapd/slapd.sh => image/service/slapd/container-start.sh (77%) create mode 100644 image/service/slapd/daemon.sh delete mode 100755 test-repository.sh delete mode 100755 test.sh diff --git a/image/Dockerfile b/image/Dockerfile new file mode 100644 index 0000000..6c9ac8c --- /dev/null +++ b/image/Dockerfile @@ -0,0 +1,74 @@ +FROM osixia/baseimage:0.10.2 +MAINTAINER Bertrand Gouny + +# Set correct environment variables. +ENV HOME /root + +# Use baseimage-docker's init system. +CMD ["/sbin/my_init"] + +# Add openldap user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added +RUN groupadd -r openldap && useradd -r -g openldap openldap + +# Install OpenLDAP and ldap-utils (with ssl-kit from baseimage), remove default db +RUN apt-get -y update && /sbin/enable-service ssl-kit + && LC_ALL=C DEBIAN_FRONTEND=noninteractive apt-get install -y --force-yes --no-install-recommends slapd ldap-utils + && rm -rf /var/lib/ldap + +# Add install script and OpenLDAP assets +ADD service/install.sh /tmp/install.sh +ADD service/slapd/assets /osixia/slapd + +# Run install script and clean all +RUN ./tmp/install.sh && rm /tmp/install.sh \ + && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + +# Add default env variables +ADD env.yml /etc/env.yml + +# Add OpenLDAP container start config & daemon +ADD service/slapd/container-start.sh /etc/my_init.d/1-slapd +ADD service/slapd/daemon.sh /etc/service/slapd/run + +# Set OpenLDAP data and config directories in a data volume +VOLUME ["/var/lib/ldap", "/etc/ldap/slapd.d"] + +# Expose ldap default port +EXPOSE 389 + +# Disable SSH +# RUN rm -rf /etc/service/sshd /etc/my_init.d/00_regen_ssh_host_keys.sh + +# Enable dnsmasq +RUN /sbin/enable-service dnsmasq ca-authority + +# 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 --force-yes --no-install-recommends slapd ldap-utils mmc-agent python-mmc-mail + +# Expose ldap and mmc-agent default ports +EXPOSE 389 7080 + +# Create TLS certificats directory +RUN mkdir /etc/ldap/ssl + +# Add config directory +ADD service/slapd/assets/config /etc/ldap/config +ADD service/mmc-agent/assets /etc/mmc/agent/assets + +# Add slapd deamon +ADD service/slapd/slapd.sh /etc/service/slapd/run + +# Add mmc-agent deamon +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/image/env.yml b/image/env.yml new file mode 100644 index 0000000..7070255 --- /dev/null +++ b/image/env.yml @@ -0,0 +1,15 @@ +LDAP_ORGANISATION: Example Inc. +LDAP_DOMAIN: example.org +LDAP_ADMIN_PASSWORD: toor + +SERVER_NAME: ldap.example.com + +USE_TLS: true +SSL_CRT_FILENAME: wordpress.crt +SSL_KEY_FILENAME: wordpress.key +SSL_CA_CRT_FILENAME: ca.crt + + +WITH_MMC_AGENT: false +MMC_AGENT_USER: mmc-docker +MMC_AGENT_PASSWORD: passw0rd \ No newline at end of file diff --git a/image/service/install.sh b/image/service/install.sh new file mode 100755 index 0000000..ec56539 --- /dev/null +++ b/image/service/install.sh @@ -0,0 +1,6 @@ +#!/bin/bash -e +# this script is run during the image build + +# Enable access only from docker default network and localhost +echo "slapd: 172.17.0.0/255.255.0.0 127.0.0.1 : ALLOW" >> /etc/hosts.allow +echo "slapd: ALL : DENY" >> /etc/hosts.allow \ No newline at end of file diff --git a/service/mmc-agent/assets/append_to_mail.ini b/image/service/mmc-agent/assets/append_to_mail.ini similarity index 100% rename from service/mmc-agent/assets/append_to_mail.ini rename to image/service/mmc-agent/assets/append_to_mail.ini diff --git a/service/mmc-agent/assets/convert_to_ldif b/image/service/mmc-agent/assets/convert_to_ldif similarity index 100% rename from service/mmc-agent/assets/convert_to_ldif rename to image/service/mmc-agent/assets/convert_to_ldif diff --git a/service/mmc-agent/mmc-agent.sh b/image/service/mmc-agent/container-start.sh similarity index 99% rename from service/mmc-agent/mmc-agent.sh rename to image/service/mmc-agent/container-start.sh index e57df3f..fcee9de 100755 --- a/service/mmc-agent/mmc-agent.sh +++ b/image/service/mmc-agent/container-start.sh @@ -83,12 +83,4 @@ if [ "$WITH_MMC_AGENT" = true ]; then # Do nothing but needed for runit else sleep 1d -fi - - - - - - - - +fi \ No newline at end of file diff --git a/image/service/mmc-agent/daemon.sh b/image/service/mmc-agent/daemon.sh new file mode 100644 index 0000000..e69de29 diff --git a/service/slapd/assets/config/modify/auto/tls.ldif b/image/service/slapd/assets/config/modify/auto/tls.ldif similarity index 100% rename from service/slapd/assets/config/modify/auto/tls.ldif rename to image/service/slapd/assets/config/modify/auto/tls.ldif diff --git a/service/slapd/assets/config/modify/logging.ldif b/image/service/slapd/assets/config/modify/logging.ldif similarity index 100% rename from service/slapd/assets/config/modify/logging.ldif rename to image/service/slapd/assets/config/modify/logging.ldif diff --git a/service/slapd/slapd.sh b/image/service/slapd/container-start.sh similarity index 77% rename from service/slapd/slapd.sh rename to image/service/slapd/container-start.sh index dc1fbe2..02981a6 100755 --- a/service/slapd/slapd.sh +++ b/image/service/slapd/container-start.sh @@ -1,3 +1,60 @@ +#!/bin/bash -e + +FIRST_START_DONE="/etc/docker-openldap-first-start-done" + +# container first start +if [ ! -e "$FIRST_START_DONE" ]; then + + # database is uninitialized + if [ -z "$(ls -A /var/lib/ldap)" ]; then + + cat <> /etc/hosts.allow - echo "slapd: ALL : DENY" >> /etc/hosts.allow + touch /var/lib/ldap/docker_bootstrapped @@ -126,4 +165,3 @@ fi status "starting slapd on default port 389" set -x -exec /usr/sbin/slapd -h "ldap:///" -u openldap -g openldap -d -1 diff --git a/image/service/slapd/daemon.sh b/image/service/slapd/daemon.sh new file mode 100644 index 0000000..bb08237 --- /dev/null +++ b/image/service/slapd/daemon.sh @@ -0,0 +1,2 @@ +#!/bin/bash -e +exec /usr/sbin/slapd -h "ldap:///" -u openldap -g openldap -d -1 \ No newline at end of file diff --git a/test-repository.sh b/test-repository.sh deleted file mode 100755 index 5d31116..0000000 --- a/test-repository.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh - -# Usage -# sudo ./test.sh -# add -v for verbose mode (or type whatever you like !) :p - -. test/config-repository -. test/tools/run.sh - -run_test simple.sh "dn: dc=example,dc=com" -run_test tls.sh "dn: dc=example,dc=com" -run_test db.sh "dn: dc=otherdomain,dc=com" - -. test/tools/end.sh - diff --git a/test.sh b/test.sh deleted file mode 100755 index 4daa2d3..0000000 --- a/test.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh - -# Usage -# sudo ./test.sh -# add -v for verbose mode (or type whatever you like !) :p - -. test/config -. test/tools/run.sh - -run_test tools/build-container.sh "Successfully built" -run_test simple.sh "dn: dc=example,dc=com" -run_test tls.sh "dn: dc=example,dc=com" -run_test db.sh "dn: dc=otherdomain,dc=com" - -. test/tools/end.sh - From 85948d05ce2e6b8c8b759477b9174bf8810dbaff Mon Sep 17 00:00:00 2001 From: Bertrand Gouny Date: Wed, 25 Feb 2015 17:58:36 +0100 Subject: [PATCH 21/22] tests --- Dockerfile | 59 ------- Makefile | 6 +- README.md | 27 +--- image/Dockerfile | 49 +----- image/env.yml | 13 +- .../mmc-agent/assets/append_to_mail.ini | 3 - .../service/mmc-agent/assets/convert_to_ldif | 6 - image/service/mmc-agent/container-start.sh | 86 ---------- image/service/mmc-agent/daemon.sh | 0 image/service/slapd/assets/config/README.md | 1 + .../assets/config/{modify => }/logging.ldif | 2 +- image/service/slapd/assets/ssl/README.md | 2 + .../assets/{config/modify/auto => }/tls.ldif | 11 +- image/service/slapd/container-start.sh | 149 ++++-------------- image/service/slapd/daemon.sh | 0 test/database/DB_CONFIG | 4 + test/database/__db.001 | Bin 0 -> 548863 bytes test/database/__db.002 | Bin 0 -> 147455 bytes test/database/__db.003 | Bin 0 -> 57343 bytes test/database/alock | Bin 0 -> 4096 bytes test/database/dn2id.bdb | Bin 0 -> 8192 bytes test/database/id2entry.bdb | Bin 0 -> 32768 bytes test/database/log.0000000001 | Bin 0 -> 10485759 bytes test/database/objectClass.bdb | Bin 0 -> 8192 bytes test/{ => old}/config | 0 test/{ => old}/config-repository | 0 test/{ => old}/db.sh | 0 test/{ => old}/simple.sh | 0 test/{ => old}/tls.sh | 0 test/{ => old}/tls/end.sh | 0 test/{ => old}/tls/run.sh | 0 test/{ => old}/tls/ssl/ca.crt | 0 test/{ => old}/tls/ssl/dhparam.pem | 0 test/{ => old}/tls/ssl/ldap.crt | 0 test/{ => old}/tls/ssl/ldap.key | 0 test/{ => old}/tools/build-container.sh | 0 test/{ => old}/tools/delete-container.sh | 0 test/{ => old}/tools/delete-image.sh | 0 test/{ => old}/tools/end.sh | 0 test/{ => old}/tools/prepare.sh | 0 test/{ => old}/tools/run-container.sh | 0 test/{ => old}/tools/run.sh | 0 test/ssl/dhparam.pem | 8 + test/ssl/test-ca.crt | 21 +++ test/ssl/test-ldap.crt | 19 +++ test/ssl/test-ldap.key | 15 ++ test/test.bats | 58 +++++++ test/test_helper.bash | 101 ++++++++++++ 48 files changed, 279 insertions(+), 361 deletions(-) delete mode 100644 Dockerfile delete mode 100644 image/service/mmc-agent/assets/append_to_mail.ini delete mode 100644 image/service/mmc-agent/assets/convert_to_ldif delete mode 100755 image/service/mmc-agent/container-start.sh delete mode 100644 image/service/mmc-agent/daemon.sh create mode 100644 image/service/slapd/assets/config/README.md rename image/service/slapd/assets/config/{modify => }/logging.ldif (73%) create mode 100644 image/service/slapd/assets/ssl/README.md rename image/service/slapd/assets/{config/modify/auto => }/tls.ldif (53%) mode change 100644 => 100755 image/service/slapd/daemon.sh create mode 100644 test/database/DB_CONFIG create mode 100644 test/database/__db.001 create mode 100644 test/database/__db.002 create mode 100644 test/database/__db.003 create mode 100644 test/database/alock create mode 100644 test/database/dn2id.bdb create mode 100644 test/database/id2entry.bdb create mode 100644 test/database/log.0000000001 create mode 100644 test/database/objectClass.bdb rename test/{ => old}/config (100%) rename test/{ => old}/config-repository (100%) rename test/{ => old}/db.sh (100%) rename test/{ => old}/simple.sh (100%) rename test/{ => old}/tls.sh (100%) rename test/{ => old}/tls/end.sh (100%) rename test/{ => old}/tls/run.sh (100%) rename test/{ => old}/tls/ssl/ca.crt (100%) rename test/{ => old}/tls/ssl/dhparam.pem (100%) rename test/{ => old}/tls/ssl/ldap.crt (100%) rename test/{ => old}/tls/ssl/ldap.key (100%) rename test/{ => old}/tools/build-container.sh (100%) rename test/{ => old}/tools/delete-container.sh (100%) rename test/{ => old}/tools/delete-image.sh (100%) rename test/{ => old}/tools/end.sh (100%) rename test/{ => old}/tools/prepare.sh (100%) rename test/{ => old}/tools/run-container.sh (100%) rename test/{ => old}/tools/run.sh (100%) create mode 100644 test/ssl/dhparam.pem create mode 100644 test/ssl/test-ca.crt create mode 100644 test/ssl/test-ldap.crt create mode 100644 test/ssl/test-ldap.key create mode 100644 test/test.bats create mode 100644 test/test_helper.bash diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index df0bf55..0000000 --- a/Dockerfile +++ /dev/null @@ -1,59 +0,0 @@ -FROM osixia/baseimage:0.10.0 -MAINTAINER Bertrand Gouny - -# From Nick Stenning's work -# https://github.com/nickstenning/docker-slapd - -# Default configuration: can be overridden at the docker command line -ENV DOMAIN_NAME ldap.example.com -ENV LDAP_DOMAIN example.com -ENV LDAP_ADMIN_PWD toor -ENV LDAP_ORGANISATION Example Inc. - -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 -# -v /some/host/directory:/var/lib/ldap and -v /some/other/host/directory:/etc/ldap/slapd.d -# to the run command - -VOLUME ["/var/lib/ldap", "/etc/ldap/slapd.d"] - -# Disable SSH -# RUN rm -rf /etc/service/sshd /etc/my_init.d/00_regen_ssh_host_keys.sh - -# Enable dnsmasq -RUN /sbin/enable-service dnsmasq ca-authority - -# 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 --force-yes --no-install-recommends slapd ldap-utils mmc-agent python-mmc-mail - -# Expose ldap and mmc-agent default ports -EXPOSE 389 7080 - -# Create TLS certificats directory -RUN mkdir /etc/ldap/ssl - -# Add config directory -ADD service/slapd/assets/config /etc/ldap/config -ADD service/mmc-agent/assets /etc/mmc/agent/assets - -# Add slapd deamon -ADD service/slapd/slapd.sh /etc/service/slapd/run - -# Add mmc-agent deamon -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/Makefile b/Makefile index 6afac5f..ec4d0f0 100644 --- a/Makefile +++ b/Makefile @@ -6,13 +6,13 @@ VERSION = 0.9.2 all: build build: - docker build -t $(NAME):$(VERSION) --rm . + docker build -t $(NAME):$(VERSION) --rm image test: - env NAME=$(NAME) VERSION=$(VERSION) ./test.sh debug + env NAME=$(NAME) VERSION=$(VERSION) bats test/test.bats tag_latest: - docker tag $(NAME):$(VERSION) $(NAME):latest + docker tag -f $(NAME):$(VERSION) $(NAME):latest release: build test tag_latest @if ! docker images $(NAME) | awk '{ print $$2 }' | grep -q -F $(VERSION); then echo "$(NAME) version $(VERSION) is not yet built. Please run 'make build'"; false; fi diff --git a/README.md b/README.md index 4210377..5d7a5a0 100644 --- a/README.md +++ b/README.md @@ -5,29 +5,4 @@ https://github.com/nickstenning/docker-slapd Add support of tls. -### How to use tls - -Add `-v some/host/dir:/etc/ldap/ssl` and `--dns=127.0.0.1` to the run command. - -`some/host/dir` must contain a least 3 files : -- `ca.crt` certificate authority certificate -- `ldap.crt` ldap server certificate -- `ldap.key` ldap server certificate private key - -and optionaly `dhparam.pem` this file is genereted automaticaly if not present. - -`--dns=127.0.0.1` allow to use the certificate cn correctly. - - -### Example - - docker run --dns=127.0.0.1 \ - -v /data/ldap/db:/var/lib/ldap \ - -v /data/ldap/config:/etc/ldap/slapd.d \ - -v /data/ldap/ssl/:/etc/ldap/ssl \ - -v /data/ldap/log/:/var/log \ - -e LDAP_DOMAIN=example.com \ - -e LDAP_ORGANISATION="Example Corp." \ - -e LDAP_ROOTPASS=toor \ - -p 389:389 -d osixia/openldap - +Use docker 1.5.0 \ No newline at end of file diff --git a/image/Dockerfile b/image/Dockerfile index 6c9ac8c..f78f618 100644 --- a/image/Dockerfile +++ b/image/Dockerfile @@ -1,4 +1,4 @@ -FROM osixia/baseimage:0.10.2 +FROM osixia/baseimage:0.10.3 MAINTAINER Bertrand Gouny # Set correct environment variables. @@ -10,9 +10,9 @@ CMD ["/sbin/my_init"] # Add openldap user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added RUN groupadd -r openldap && useradd -r -g openldap openldap -# Install OpenLDAP and ldap-utils (with ssl-kit from baseimage), remove default db -RUN apt-get -y update && /sbin/enable-service ssl-kit - && LC_ALL=C DEBIAN_FRONTEND=noninteractive apt-get install -y --force-yes --no-install-recommends slapd ldap-utils +# Install OpenLDAP and ldap-utils (and ssl-kit from baseimage), remove default ldap db +RUN apt-get -y update && /sbin/enable-service ssl-kit \ + && LC_ALL=C DEBIAN_FRONTEND=noninteractive apt-get install -y --force-yes --no-install-recommends slapd ldap-utils \ && rm -rf /var/lib/ldap # Add install script and OpenLDAP assets @@ -27,48 +27,11 @@ RUN ./tmp/install.sh && rm /tmp/install.sh \ ADD env.yml /etc/env.yml # Add OpenLDAP container start config & daemon -ADD service/slapd/container-start.sh /etc/my_init.d/1-slapd +ADD service/slapd/container-start.sh /etc/my_init.d/slapd ADD service/slapd/daemon.sh /etc/service/slapd/run # Set OpenLDAP data and config directories in a data volume VOLUME ["/var/lib/ldap", "/etc/ldap/slapd.d"] # Expose ldap default port -EXPOSE 389 - -# Disable SSH -# RUN rm -rf /etc/service/sshd /etc/my_init.d/00_regen_ssh_host_keys.sh - -# Enable dnsmasq -RUN /sbin/enable-service dnsmasq ca-authority - -# 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 --force-yes --no-install-recommends slapd ldap-utils mmc-agent python-mmc-mail - -# Expose ldap and mmc-agent default ports -EXPOSE 389 7080 - -# Create TLS certificats directory -RUN mkdir /etc/ldap/ssl - -# Add config directory -ADD service/slapd/assets/config /etc/ldap/config -ADD service/mmc-agent/assets /etc/mmc/agent/assets - -# Add slapd deamon -ADD service/slapd/slapd.sh /etc/service/slapd/run - -# Add mmc-agent deamon -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/* +EXPOSE 389 \ No newline at end of file diff --git a/image/env.yml b/image/env.yml index 7070255..7e60c9f 100644 --- a/image/env.yml +++ b/image/env.yml @@ -2,14 +2,9 @@ LDAP_ORGANISATION: Example Inc. LDAP_DOMAIN: example.org LDAP_ADMIN_PASSWORD: toor -SERVER_NAME: ldap.example.com +SERVER_NAME: ldap.example.org USE_TLS: true -SSL_CRT_FILENAME: wordpress.crt -SSL_KEY_FILENAME: wordpress.key -SSL_CA_CRT_FILENAME: ca.crt - - -WITH_MMC_AGENT: false -MMC_AGENT_USER: mmc-docker -MMC_AGENT_PASSWORD: passw0rd \ No newline at end of file +SSL_CRT_FILENAME: ldap.crt +SSL_KEY_FILENAME: ldap.key +SSL_CA_CRT_FILENAME: ca.crt \ No newline at end of file diff --git a/image/service/mmc-agent/assets/append_to_mail.ini b/image/service/mmc-agent/assets/append_to_mail.ini deleted file mode 100644 index f215055..0000000 --- a/image/service/mmc-agent/assets/append_to_mail.ini +++ /dev/null @@ -1,3 +0,0 @@ -[userdefault] -mailbox = /home/vmail/%uid%/ -mailuserquota = 204800 diff --git a/image/service/mmc-agent/assets/convert_to_ldif b/image/service/mmc-agent/assets/convert_to_ldif deleted file mode 100644 index 1eed02c..0000000 --- a/image/service/mmc-agent/assets/convert_to_ldif +++ /dev/null @@ -1,6 +0,0 @@ -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/image/service/mmc-agent/container-start.sh b/image/service/mmc-agent/container-start.sh deleted file mode 100755 index fcee9de..0000000 --- a/image/service/mmc-agent/container-start.sh +++ /dev/null @@ -1,86 +0,0 @@ -#!/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 - } - - DOMAIN_NAME=${DOMAIN_NAME} - 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 #listen on docker default network - 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/ssl-create-cert mmc /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 \ No newline at end of file diff --git a/image/service/mmc-agent/daemon.sh b/image/service/mmc-agent/daemon.sh deleted file mode 100644 index e69de29..0000000 diff --git a/image/service/slapd/assets/config/README.md b/image/service/slapd/assets/config/README.md new file mode 100644 index 0000000..ada1fb3 --- /dev/null +++ b/image/service/slapd/assets/config/README.md @@ -0,0 +1 @@ +Add your ldif config file here diff --git a/image/service/slapd/assets/config/modify/logging.ldif b/image/service/slapd/assets/config/logging.ldif similarity index 73% rename from image/service/slapd/assets/config/modify/logging.ldif rename to image/service/slapd/assets/config/logging.ldif index 5494c10..b50f137 100644 --- a/image/service/slapd/assets/config/modify/logging.ldif +++ b/image/service/slapd/assets/config/logging.ldif @@ -1,4 +1,4 @@ dn: cn=config changetype: modify replace: olcLogLevel -olcLogLevel: stats +olcLogLevel: stats \ No newline at end of file diff --git a/image/service/slapd/assets/ssl/README.md b/image/service/slapd/assets/ssl/README.md new file mode 100644 index 0000000..f63ac90 --- /dev/null +++ b/image/service/slapd/assets/ssl/README.md @@ -0,0 +1,2 @@ +Add your ssl crt, key and ca crt here +or during docker run mount a data volume with thoses files to /osixia/slapd/ssl diff --git a/image/service/slapd/assets/config/modify/auto/tls.ldif b/image/service/slapd/assets/tls.ldif similarity index 53% rename from image/service/slapd/assets/config/modify/auto/tls.ldif rename to image/service/slapd/assets/tls.ldif index 63b9b8a..1da352d 100644 --- a/image/service/slapd/assets/config/modify/auto/tls.ldif +++ b/image/service/slapd/assets/tls.ldif @@ -4,17 +4,16 @@ add: olcTLSCipherSuite olcTLSCipherSuite: SECURE256:-VERS-SSL3.0 - replace: olcTLSCACertificateFile -olcTLSCACertificateFile: /etc/ldap/ssl/ca.crt +olcTLSCACertificateFile: /osixia/slapd/ssl/ca.crt - replace: olcTLSCertificateFile -olcTLSCertificateFile: /etc/ldap/ssl/ldap.crt +olcTLSCertificateFile: /osixia/slapd/ssl/ldap.crt - replace: olcTLSCertificateKeyFile -olcTLSCertificateKeyFile: /etc/ldap/ssl/ldap.key +olcTLSCertificateKeyFile: /osixia/slapd/ssl/ldap.key - replace: olcTLSDHParamFile -olcTLSDHParamFile: /etc/ldap/ssl/dhparam.pem +olcTLSDHParamFile: /osixia/slapd/ssl/dhparam.pem - replace: olcTLSVerifyClient -olcTLSVerifyClient: never - +olcTLSVerifyClient: never \ No newline at end of file diff --git a/image/service/slapd/container-start.sh b/image/service/slapd/container-start.sh index 02981a6..94ae1eb 100755 --- a/image/service/slapd/container-start.sh +++ b/image/service/slapd/container-start.sh @@ -2,6 +2,10 @@ FIRST_START_DONE="/etc/docker-openldap-first-start-done" +#fix file permissions +chown -R openldap:openldap /var/lib/ldap +chown -R openldap:openldap /etc/ldap + # container first start if [ ! -e "$FIRST_START_DONE" ]; then @@ -27,9 +31,6 @@ EOF dpkg-reconfigure -f noninteractive slapd fi - #fix file permissions - chown -R openldap:openldap /var/lib/ldap - chown -R openldap:openldap /etc/ldap # start OpenLDAP slapd -h "ldapi:///" -u openldap -g openldap @@ -38,130 +39,40 @@ EOF if [ "${USE_TLS,,}" == "true" ]; then # check certificat and key or create it - /sbin/ssl-kit "/osixia/slapd/$SSL_CRT_FILENAME" "/osixia/slapd/$SSL_KEY_FILENAME" --ca-crt=/osixia/slapd/$SSL_CA_CRT_FILENAME --gnutls - chown openldap:openldap -R /osixia/slapd + /sbin/ssl-kit "/osixia/slapd/ssl/$SSL_CRT_FILENAME" "/osixia/slapd/ssl/$SSL_KEY_FILENAME" --ca-crt=/osixia/slapd/ssl/$SSL_CA_CRT_FILENAME --gnutls + # create DHParamFile if not found + [ -f /osixia/slapd/ssl/dhparam.pem ] || openssl dhparam -out /osixia/slapd/ssl/dhparam.pem 2048 + # adapt tls ldif + sed -i "s,/osixia/slapd/ssl/ca.crt,/osixia/slapd/ssl/${SSL_CA_CRT_FILENAME},g" /osixia/slapd/tls.ldif + sed -i "s,/osixia/slapd/ssl/ldap.crt,/osixia/slapd/ssl/${SSL_CRT_FILENAME},g" /osixia/slapd/tls.ldif + sed -i "s,/osixia/slapd/ssl/ldap.key,/osixia/slapd/ssl/${SSL_KEY_FILENAME},g" /osixia/slapd/tls.ldif + + # set tls config + ldapmodify -Y EXTERNAL -H ldapi:/// -f /osixia/slapd/tls.ldif -Q + + # add localhost route to certificate cn (need docker 1.5.0) + cn=$(openssl x509 -in /osixia/slapd/ssl/$SSL_CRT_FILENAME -subject -noout | sed -n 's/.*CN=\(.*\)\/*\(.*\)/\1/p') + echo "127.0.0.1 $cn" >> /etc/hosts + + # local ldap tls client config + sed -i "s,TLS_CACERT.*,TLS_CACERT /osixia/slapd/ssl/${SSL_CA_CRT_FILENAME},g" /etc/ldap/ldap.conf fi + # OpenLDAP config + for f in $(find /osixia/slapd/config -name \*.ldif -type f); do + status "Processing file ${f}" + ldapmodify -r -Y EXTERNAL -H ldapi:/// -f $f -Q + done + # stop OpenLDAP kill -INT `cat /run/slapd/slapd.pid` touch $FIRST_START_DONE fi -exit 0 - - - - -#!/bin/sh - -set -eu - -status () { - echo "---> ${@}" >&2 -} - - -set -x -: LDAP_ADMIN_PWD=${LDAP_ADMIN_PWD} -: LDAP_DOMAIN=${LDAP_DOMAIN} -: LDAP_ORGANISATION=${LDAP_ORGANISATION} -: DOMAIN_NAME=${DOMAIN_NAME} - - -############ Base config ############ -if [ ! -e /var/lib/ldap/docker_bootstrapped ]; then - status "configuring slapd database" - - - - - - touch /var/lib/ldap/docker_bootstrapped - -else - status "slapd database found" -fi - - -############ Custom config ############ -if [ ! -e /etc/ldap/slapd.d/docker_bootstrapped ]; then - status "Custom config" - - 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" - - else - - # generate default tls certificate - export SSL_SLAPD_COMMON_NAME="$DOMAIN_NAME" - export SSL_SLAPD_ORGANIZATION="${LDAP_ORGANISATION}" - - /sbin/ssl-gnutls-create-signed-cert slapd /etc/ldap/ssl/ldap.crt /etc/ldap/ssl/ldap.key - ln -s /etc/ssl/certs/docker_baseimage_gnutls_cacert.pem /etc/ldap/ssl/ca.crt - - fi - - # Fix permission on certificates - chown openldap:openldap -R /etc/ldap/ssl - chmod 600 /etc/ldap/ssl/ldap.key - - # ldap client config - sed -i 's,TLS_CACERT.*,TLS_CACERT /etc/ldap/ssl/ca.crt,g' /etc/ldap/ldap.conf - - # create DHParamFile if not found - [ -f /etc/ldap/ssl/dhparam.pem ] || openssl dhparam -out /etc/ldap/ssl/dhparam.pem 2048 - - ldapmodify -Y EXTERNAL -H ldapi:/// -f /etc/ldap/config/modify/auto/tls.ldif -Q - - # add fake dnsmasq route to certificate cn - cn=$(openssl x509 -in /etc/ldap/ssl/ldap.crt -subject -noout | sed -n 's/.*CN=\(.*\)\/*\(.*\)/\1/p') - /sbin/dns-add-host 127.0.0.1 $cn - - # Replication - # todo :) - - # Add config - for f in $(find /etc/ldap/config/add -maxdepth 1 -name \*.ldif -type f); do - status "Processing file ${f}" - ldapadd -Y EXTERNAL -H ldapi:/// -f $f -Q - done - - # Modify config - for f in $(find /etc/ldap/config/modify -maxdepth 1 -name \*.ldif -type f); do - status "Processing file ${f}" - ldapmodify -Y EXTERNAL -H ldapi:/// -f $f -Q - done - - kill -INT `cat /run/slapd/slapd.pid` - - touch /etc/ldap/slapd.d/docker_bootstrapped - -else - status "found already-configured slapd" -fi - -status "starting slapd on default port 389" -set -x +# fix file permissions +chown openldap:openldap -R /osixia/slapd +exit 0 \ No newline at end of file diff --git a/image/service/slapd/daemon.sh b/image/service/slapd/daemon.sh old mode 100644 new mode 100755 diff --git a/test/database/DB_CONFIG b/test/database/DB_CONFIG new file mode 100644 index 0000000..d3d6ab6 --- /dev/null +++ b/test/database/DB_CONFIG @@ -0,0 +1,4 @@ +set_cachesize 0 2097152 0 +set_lk_max_objects 1500 +set_lk_max_locks 1500 +set_lk_max_lockers 1500 diff --git a/test/database/__db.001 b/test/database/__db.001 new file mode 100644 index 0000000000000000000000000000000000000000..5e822744d1156e646fbbbe91c5f55bfa5cab8623 GIT binary patch literal 548863 zcmeI*3v^{ySpeWW(`iX5rGdVJQzX1oUJd1yg4TdMvP3i}mVjNXbR00HQU)vzi03xX@G@xQYga8W(vV@2{A{GqLVqj6sDhQ$Nbi613-ZOVjb59PX!xip# zS-Jb1z0dj2x!>OR&);w}c~j4w8^z<;=GQUJuQQro4?Xpz-1y z=NC`S$IfUrpO0%kuk479`OBjnD1tN}GdqfiKmMa9#UJU3cnc}+>~XPwFg@~>j`se- z?c%yisom~+uT3|WUdHBLv7H@T``?s~9cs3%{YCd^>e#qBUoqObw42BK^NHg<5pAk( zv(0A}!}*ZSfqdL>x}(J-U5nnLXDFRC(Vvc6-8{R|=pWeJ$nlHm-_`ue$1i+29rypN z8A~r?zT`QU_Vf5aIxaPh-N|A4_+5>YTV7Ls{ViQvZWgCcUmJ69#n%rXQuGz`UVfa> zGFkcD@-gl9i+esN4Zi-Q*hs75&?zUTt#bdN14mw$#|soU!-z-0_03 zd~~yIeIdo-dO)-9q7VP??%OxpB5*NY^cU?yGqD$mzPZ`>ZnN*aW_!wSUvo)u6Q`GM zqBwu=#b;l*_s|`jk?!EkXK!4v@v^vX@f=&tjppNS*Tfxs@y#Ts* zsd#C{c+nQKdqWF!KB^dd!58D0Vzu6Li(~S!S^@+J5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5;&ZW8EAf0ujt@+1FV`r@UrpU2mVKbhTpwEh|I)D;8i`SGdq38~Fd^Fb3k z;t#_2|M9NPuGyDHTRtuye{A#5tQTJcsblFSu`&A6XcsR@l{;CXs>SGR{k1j?ibgr^N72zbL3CgG1KXG*AC>FiFWSA(dO|d z-|}VcX#VN-&HwF)$KfM(Y|c^f9Fx^Ns->qmr#Vt|#%6Ki)Ku}@XiOe?8wdN-edO`c zsm;TRIp2K5-sT#x-xT0seG~%m?yw%bAG{yDALIl1Fa+d7`A|NT59LGoun_S5!1n{+ z4}3rH{lNDF-w%90R1c^J)C1}P^?-UnJ)j;?52y#!1L^_wfOH+nD zdO$s(9#9Xc2h;=V0rh}-Ks}%yP!FgF)C1}P^?-UnJ)j;?52y#!1L^_wfOH+nDdO$s(9#9Xc2h;=V0rh}-Ks}%yP!FgF)C1}P^?-UnJ)j;?52y#!1L^_w zfOH+nDdO$s(9#9Xc2h;=V0rh}-Ks}%yP!FgF)C1}P^?-UnJ)j<_ zTMw*#Was9gQ-e|Tv({^rKhHkN0=a^fZ zq=Ntf0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZ;Ac)C|Nd%j^9%fOe~&evpW7U_wcU|+a@#sq-mY^@`5gNM2oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oU&b5LiDk?y~RP0|#3l3+LRlxtqrq({Vq)BaWYYb+l7|679xoq8;2H?ZA1v zHaFIu8g2Bpf4*CaJM+3YX5VY0U3){c{jX2`Pmg$m=hutdpW;rxDb62%W3(%O8g1`P zvTQBZCQrw9@kMoD$679lUqg_w^ zBflH*dM>ON_ns;4*xMt{;M<~|dq=dZsek`P5pVQ4_2S+u#T|KP#OeRbXlJg9b~*L0 zJU8OaJg;8dd#AWV?}|9Re--WYyQ5u9{r#6jyww-fi+i6Gci?X#PUEkmoqSKU^QnJg zGU5%q=y2S0Y9qHP!e(>d)YcxFniaYeJh|~McXs5p&?PBVmU5I$&A2=L$XB^VVZQ9*z9-iV3 zd?)o@7wzPFwDYNd?Sm0-?n8&;rZcu|9+BeqT_3~iDc;2QVt+RE4}K)#t$(y$+@Tb= z=lc<7HN_j-i2ePkfAZrIZ|D>C;+~V@Zu~IfET?!QH^u(c4bd)sGU82rs$SejrnqYd z()lUgQ2MU5@8;<5`E4 zW>dVro)qu6XlK3<@y1r_#r?$;cj5Th*q`F{+#&XdZy)XImm=Qm)%D_@o8r!$7#mY5 z-o{C>KX}Jz2mUMKt*zFJ`%5YA%$;ImUvIQ)Cr8_V=hXl8h&Om`y|}}1T4Vau*cd-0 z+LhCz?L95ph5wFtlixfXH@|;#8!IQCA04MPChrm(qkYjX?M?$fm)dVfyv6Gd$4w(! z)=`g1gA;d+jo~w*T}c0du%7xy)+1ie^@roO-d}n9ms8xaRJafJN5@<$j8{|t{_jP+ z(eKxb``8qBBo(avsUV(71>th)U)hLwGdI+W`?wT$C>3hGsSun_h0tQ^?>`XnR&TBs zcWNqRdarN&uf2l@m+l|`y_d&F({cHz>}fv)c!YrUU_BH9-Vfdng@Ak@AIJytq3;L2 zANYRY`=NS3J)j;?52y#!1L^_wfOH+nDdO$s(9#9Xc2h;=V0rh}- zKs}%yP!FgF)C1}P^?-UnJ)j;?52y#!1L^_wfOH+nDdO$s(9#9Xc z2h;=V0rh}-Ks}%yP!FgF)C1}P^?-UnJ)j;?52y#!1L^_wfOH+nD zdO$s(9#9Xc2h;=V0rh}-Ks}%yP!FgF)C1}P^?-UnJ)j;?52y#!1L^_wfOH+nDdf-Q^2Nrik-k7>9%SAi#t{XQu^7#IAT+XxQHlICF9;nzqrebV91?;wX zWBcNTSI`_9D*UE*#_sUVc?P1LzAEM~kB_C}4xL=u$Y<{_^&jos>2zV&J-X7_x#!{l zzpby9^TgzVypqy&-YJiCB+va`{dum+Bg5~IN2=Z{`F+)G`K#~Q_19OGUwN!u9$9#s zJkp6gGC5Iyo~!c6+N?ZMUhA#<-I_-Ro>hN+wR&y0-7b%ezeOJDL>`&mTYsLb^2qF! z@<`R%@76prw5R_1s`4w3waX)YSI8rs$Rji3_2;=NkBrU8BjvT;y5FsNWaJt3*H^38 zcH8ap$nqQHkxt~1x%2DKb5$PceZ4$Vwf4I;kBmLN{`#u&E049yBh#;uM>>&57RKt& zb5$N$dbK=KUhA#<-I_-x&a1z^TD`X0ZkI=fUnP%pB9AORrT#ou<&mjZ$|F^4zgzRj z*Rh*Z(VHeDe_m!~H0C)!j}ONI#m9GwkARG)&w}nj482?)3AwGGe^&EIu`Y@=wJW{s(bVSGJN;{0=aIbLvQ~M2n~#q*+U1e?m&hYW zGmqr?%5BagYrnenJm=$D+p0XWez`o-YE|CO@2hV6{K(9&)L&m^v#R}ed1PWr9_d6L z*%+xm&sBM3?oxTAYTb8h9+`W5{q<+a|r z->rFM;W72sSF6`{+wJnm${)%joya47kFGz@Re7ZE59E=mwco9IWa-@c>#NGIJk~Cc z?Eigvq!W2$;1}!9b5$N$ex5v1UhA#<-I_;M9$9~VwR&y0-7b%eJXap+L>?JBr~W)w z<&o*<$Rky2zgzRj+QaLwuPVRtSi3yZxJVx9L>?J=Sp9jf$|J)U$|L2q-n!qdd1T}4 z`s=IJYrE}sd1T>P@<=E0$k>DH&vR8C+1M+ORIUAP%_BW$)n8v#e&w-td1T)nd88A0 zWa5GK=ea76%#X_><+a|r->rG1@Ba1ISF6`{+wJnmz%%5LPUMlvGwaWDRUVl*UmmGi z``wyH2JTybeO39D$J*tQ)u+iLoya58_pU$BRe7X;Odct(_167v%_BqitiQfmy|&wK zmq%uPOCIS&9+|m&{dum+BP+itk5sMwZp|YjcdNg?s{G1h?efUzljV_4%e&w-td1P@!9%;=Z`S<*L5@7!Q-28Vj^6zJ_JTVR^e$Tr28cM(Ce|qzu322Qs zb6otp0p)m0r^YAO zb@ROEyDsk+{b!uE)Y#Dse&(|`F4%Zk{6>FXTiacC^5lq^*jw?pj{rB ze5^c@=O$aXw>1I@WHxPP~;nZ9UIh#Vq2r%OeYqkw>;N%YECupYw6Ib=&FdPM=hN zef=n}y|oyQZ*-?em{5W-#wW*q5k@+@+*(E z%Oh)#l1J*i?{DiovT=OI*~{EcGjQgsys6DV0omx)?4?x zHIFPEj6Ve3YH?d^x632FXUQX-$Rh(c*PrLAJTm$~d8F$7(XDx8<;ME!tIDrD)-I1M z-A^9rL>?Ksq5eEq<&mB<<&pAQZ{6?KJhJwK`s=IJYrE}sd1UH7@<=E0$jJBW&vR8C zS-h7#QnmKGHIHn3xBmL7@+*(E%OgYgkViU^N5-zNKhITpWU^l#DX;a`{cg=8J?r(? zSF6`{+wJnm`d#IbPUMk^@6?~?sys4yhCEWW_PaHY^nJVj`l|9PkG0Dqb9a$PTJuQV z&&4mM4?>qe7yr@H=i>X)-_t8TJ6$~T=VK?o74sbbug$@OGrMCv$IG9K&+*!Qo^|bX zc_ievem>fHq?n&#ZjZ+2;&-Rd#lN@bju(ujmzUS-cGn$P+d7Zr^_I2D`$hj&*WK=O z@#Ck;BYAGJZEKs~_qX+(pk{{S?mPW{?$qzsj9p!SeO39D$J*tQ=^lBc6M1CeOZDfuDvvB3Cy$iZdh33-=8=h& z`s=IJYrE}sd1QE(Jkp6gvh;=e^IVljrgq9BRcpUn^T_1q>aVXVzw+2%>X7VgAbb1l5`J=(F=#P`uWAG`FW- ze)cC{aaoR9-R^1*FCEkTfm!pBubd#s(O;D(^Z7sNcK&wp zy4ziMB@Il)+abTKgChsRKabC)<4$X~+xhQpcd=%FzCihqe4W)xBVXs^)=T^4^S0VA z<|oG+$bnM3@20I^S6}m-qw%`t()!+fgEsFW-%sDIcwNP7T`r!Qj~pk*U%e?_U>=X7 z4tr0f`7B;zCMj-h-xlj*tDpboc)2ak-P!yaP96Jl(9{m3*PX}HVT}v-p8d>=FM0k8 zAGBxho}w?$(_rcRr5m=Mr_-C~6tAJ`{eNrLUv`{N?}Mq7zZXmIi{hTQdlc(0&qJQ4 z{PHGJygZ&`9pTbEcz+sL%qOOHBUlcN=kxng+?gBWfWj!BT1-XX@wdzaTmAc8IbLq_ zJhz*t{vU2VPtEt!wt4#2%u{|%d7kFex?g(Hk$EHE|8{MTSDvSl1l{-4BeVM6i_gAr zZ(h93;Q9RWJoTjWSI#@~{O#_?H~|6#2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly sK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly&@}@82b)kTwg3PC literal 0 HcmV?d00001 diff --git a/test/database/__db.002 b/test/database/__db.002 new file mode 100644 index 0000000000000000000000000000000000000000..a03f425be0b869f99cdf3ccbf697f0eb53898d6b GIT binary patch literal 147455 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 literal 0 HcmV?d00001 diff --git a/test/database/__db.003 b/test/database/__db.003 new file mode 100644 index 0000000000000000000000000000000000000000..9c0011d730aae020908c51b62ac9b9a4988f5777 GIT binary patch literal 57343 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 literal 0 HcmV?d00001 diff --git a/test/database/id2entry.bdb b/test/database/id2entry.bdb new file mode 100644 index 0000000000000000000000000000000000000000..e013588350eb0263979acc622e9734275447a83a GIT binary patch literal 32768 zcmeI*&uSAv9Ki9})Iw^bEk!-pOGFU`)9xmlno@$6);|@gsY$WsHrbu%YO))4H`r8s z5)YodcvBF3gdPMhzJb1hK7hO1^iLWsUW5wYfo1+?_BWsWuEPo;gcdz2upcOAGNKeOhkp4n}pV-_Az$?w+37aLc7#3ngv;GlyXI*SjriC!OYD!3_a@38Ae0OMsdC=w8{5B z-hNu!m^5EcuF2_lAK!?K<*WD{!K!SlC{oKUC+E9nTjfv%VJ<#h-0=cu(~)t@RpH++ zoJjUpHK!eICfgmMP2_c>sOR%hWTvj0bs^HpL6)kkLc20JIa4y{^pak`s3#?^`b{BD zwLRNuI_lqrp1h!UWav@wdtY2niSsG#WOgVAM@B-gBht3jPrl5-! PN_w$)oKxjMu4v*H;Y4y> literal 0 HcmV?d00001 diff --git a/test/database/log.0000000001 b/test/database/log.0000000001 new file mode 100644 index 0000000000000000000000000000000000000000..7eeebb7b15e1a5ce3fe6b392612f7b7071b6ab08 GIT binary patch literal 10485759 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 zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fdks10}=oL002S%U$-OB2^uh9z<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5VBk6spo}^) literal 0 HcmV?d00001 diff --git a/test/database/objectClass.bdb b/test/database/objectClass.bdb new file mode 100644 index 0000000000000000000000000000000000000000..4e7eacf65657639f434012b0d68f6931edab603d GIT binary patch literal 8192 zcmeI%p$fuK6b9h`P6rc|BL=}BxJNJ=eFx3L9>C^%EQ!HnvWR9eF4#0EXc2=^`-rP3Q&Lo6rcbFC_sT61 /dev/null +} + +run_image() { + CONTAINER_ID=$(docker run $@ -d $IMAGE_NAME) + CONTAINER_IP=$(get_container_ip_by_cid $CONTAINER_ID) +} + +start_container() { + start_containers_by_cid $CONTAINER_ID +} + +stop_container() { + stop_containers_by_cid $CONTAINER_ID +} + +remove_container() { + remove_containers_by_cid $CONTAINER_ID +} + +clear_container() { + stop_containers_by_cid $CONTAINER_ID + remove_containers_by_cid $CONTAINER_ID +} + +is_service_running() { + is_service_running_by_cid $CONTAINER_ID $1 +} + +wait_service() { + wait_service_by_cid $CONTAINER_ID $@ +} + + +# generic functions +get_container_ip_by_cid() { + local IP=$(docker inspect -f "{{ .NetworkSettings.IPAddress }}" $1) + echo "$IP" +} + +start_containers_by_cid() { + for cid in "$@" + do + #disable outputs + docker start $cid &> /dev/null + done +} + +stop_containers_by_cid() { + for cid in "$@" + do + #disable outputs + docker stop $cid &> /dev/null + done +} + +remove_containers_by_cid() { + for cid in "$@" + do + #disable outputs + docker rm $cid &> /dev/null + done +} + +clear_containers_by_cid() { + stop_containers_by_cid $@ + remove_containers_by_cid $@ +} + +is_service_running_by_cid() { + docker exec $1 ps cax | grep $2 > /dev/null +} + +wait_service_by_cid() { + + cid=$1 + + # first wait image init end + while ! is_service_running_by_cid $cid syslog-ng + do + sleep 1 + done + + for service in "${@:2}" + do + # wait service + while ! is_service_running_by_cid $cid $service + do + sleep 1 + done + done + + sleep 5 +} \ No newline at end of file From 0e43417d07762a2aa38f43c157a3b955ba98dab6 Mon Sep 17 00:00:00 2001 From: Bertrand Gouny Date: Thu, 26 Feb 2015 10:19:41 +0100 Subject: [PATCH 22/22] tests --- test/config/cn=config.ldif | 16 ++ test/config/cn=config/cn=module{0}.ldif | 14 + test/config/cn=config/cn=schema.ldif | 12 + .../cn=config/cn=schema/cn={0}core.ldif | 243 ++++++++++++++++++ .../cn=config/cn=schema/cn={1}cosine.ldif | 177 +++++++++++++ .../config/cn=config/cn=schema/cn={2}nis.ldif | 106 ++++++++ .../cn=schema/cn={3}inetorgperson.ldif | 48 ++++ test/config/cn=config/olcBackend={0}hdb.ldif | 12 + .../cn=config/olcDatabase={-1}frontend.ldif | 18 ++ .../cn=config/olcDatabase={0}config.ldif | 14 + test/config/cn=config/olcDatabase={1}hdb.ldif | 29 +++ test/database/__db.001 | Bin 548863 -> 548863 bytes test/database/__db.002 | Bin 147455 -> 147455 bytes test/database/__db.003 | Bin 57343 -> 114687 bytes test/database/alock | Bin 4096 -> 4096 bytes test/database/dn2id.bdb | Bin 8192 -> 8192 bytes test/database/id2entry.bdb | Bin 32768 -> 32768 bytes test/database/log.0000000001 | Bin 10485759 -> 10485759 bytes test/database/objectClass.bdb | Bin 8192 -> 8192 bytes test/old/config | 8 - test/old/config-repository | 7 - test/old/db.sh | 25 -- test/old/simple.sh | 10 - test/old/tls.sh | 10 - test/old/tls/end.sh | 7 - test/old/tls/run.sh | 16 -- test/old/tls/ssl/ca.crt | 21 -- test/old/tls/ssl/dhparam.pem | 8 - test/old/tls/ssl/ldap.crt | 19 -- test/old/tls/ssl/ldap.key | 15 -- test/old/tools/build-container.sh | 5 - test/old/tools/delete-container.sh | 9 - test/old/tools/delete-image.sh | 8 - test/old/tools/end.sh | 15 -- test/old/tools/prepare.sh | 7 - test/old/tools/run-container.sh | 14 - test/old/tools/run.sh | 46 ---- test/test.bats | 11 +- 38 files changed, 694 insertions(+), 256 deletions(-) create mode 100644 test/config/cn=config.ldif create mode 100644 test/config/cn=config/cn=module{0}.ldif create mode 100644 test/config/cn=config/cn=schema.ldif create mode 100644 test/config/cn=config/cn=schema/cn={0}core.ldif create mode 100644 test/config/cn=config/cn=schema/cn={1}cosine.ldif create mode 100644 test/config/cn=config/cn=schema/cn={2}nis.ldif create mode 100644 test/config/cn=config/cn=schema/cn={3}inetorgperson.ldif create mode 100644 test/config/cn=config/olcBackend={0}hdb.ldif create mode 100644 test/config/cn=config/olcDatabase={-1}frontend.ldif create mode 100644 test/config/cn=config/olcDatabase={0}config.ldif create mode 100644 test/config/cn=config/olcDatabase={1}hdb.ldif delete mode 100755 test/old/config delete mode 100755 test/old/config-repository delete mode 100755 test/old/db.sh delete mode 100755 test/old/simple.sh delete mode 100755 test/old/tls.sh delete mode 100755 test/old/tls/end.sh delete mode 100755 test/old/tls/run.sh delete mode 100644 test/old/tls/ssl/ca.crt delete mode 100644 test/old/tls/ssl/dhparam.pem delete mode 100644 test/old/tls/ssl/ldap.crt delete mode 100644 test/old/tls/ssl/ldap.key delete mode 100755 test/old/tools/build-container.sh delete mode 100755 test/old/tools/delete-container.sh delete mode 100755 test/old/tools/delete-image.sh delete mode 100755 test/old/tools/end.sh delete mode 100755 test/old/tools/prepare.sh delete mode 100755 test/old/tools/run-container.sh delete mode 100755 test/old/tools/run.sh diff --git a/test/config/cn=config.ldif b/test/config/cn=config.ldif new file mode 100644 index 0000000..63db3d8 --- /dev/null +++ b/test/config/cn=config.ldif @@ -0,0 +1,16 @@ +# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify. +# CRC32 0235c2b8 +dn: cn=config +objectClass: olcGlobal +cn: config +olcArgsFile: /var/run/slapd/slapd.args +olcPidFile: /var/run/slapd/slapd.pid +olcToolThreads: 1 +structuralObjectClass: olcGlobal +entryUUID: db089696-51e1-1034-95ec-9d03bc6be361 +creatorsName: cn=config +createTimestamp: 20150226090154Z +olcLogLevel: stats +entryCSN: 20150226091749.468238Z#000000#000#000000 +modifiersName: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth +modifyTimestamp: 20150226091749Z diff --git a/test/config/cn=config/cn=module{0}.ldif b/test/config/cn=config/cn=module{0}.ldif new file mode 100644 index 0000000..febc9a0 --- /dev/null +++ b/test/config/cn=config/cn=module{0}.ldif @@ -0,0 +1,14 @@ +# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify. +# CRC32 d5bd456a +dn: cn=module{0} +objectClass: olcModuleList +cn: module{0} +olcModulePath: /usr/lib/ldap +olcModuleLoad: {0}back_hdb +structuralObjectClass: olcModuleList +entryUUID: db093e98-51e1-1034-95f4-9d03bc6be361 +creatorsName: cn=config +createTimestamp: 20150226090154Z +entryCSN: 20150226090154.826169Z#000000#000#000000 +modifiersName: cn=config +modifyTimestamp: 20150226090154Z diff --git a/test/config/cn=config/cn=schema.ldif b/test/config/cn=config/cn=schema.ldif new file mode 100644 index 0000000..e82c3bd --- /dev/null +++ b/test/config/cn=config/cn=schema.ldif @@ -0,0 +1,12 @@ +# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify. +# CRC32 deed6c98 +dn: cn=schema +objectClass: olcSchemaConfig +cn: schema +structuralObjectClass: olcSchemaConfig +entryUUID: db08b2b6-51e1-1034-95ef-9d03bc6be361 +creatorsName: cn=config +createTimestamp: 20150226090154Z +entryCSN: 20150226090154.822586Z#000000#000#000000 +modifiersName: cn=config +modifyTimestamp: 20150226090154Z diff --git a/test/config/cn=config/cn=schema/cn={0}core.ldif b/test/config/cn=config/cn=schema/cn={0}core.ldif new file mode 100644 index 0000000..cc52c0f --- /dev/null +++ b/test/config/cn=config/cn=schema/cn={0}core.ldif @@ -0,0 +1,243 @@ +# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify. +# CRC32 f54534bb +dn: cn={0}core +objectClass: olcSchemaConfig +cn: {0}core +olcAttributeTypes: {0}( 2.5.4.2 NAME 'knowledgeInformation' DESC 'RFC2256: kno + wledge information' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121. + 1.15{32768} ) +olcAttributeTypes: {1}( 2.5.4.4 NAME ( 'sn' 'surname' ) DESC 'RFC2256: last (f + amily) name(s) for which the entity is known by' SUP name ) +olcAttributeTypes: {2}( 2.5.4.5 NAME 'serialNumber' DESC 'RFC2256: serial numb + er of the entity' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch S + YNTAX 1.3.6.1.4.1.1466.115.121.1.44{64} ) +olcAttributeTypes: {3}( 2.5.4.6 NAME ( 'c' 'countryName' ) DESC 'RFC2256: ISO- + 3166 country 2-letter code' SUP name SINGLE-VALUE ) +olcAttributeTypes: {4}( 2.5.4.7 NAME ( 'l' 'localityName' ) DESC 'RFC2256: loc + ality which this object resides in' SUP name ) +olcAttributeTypes: {5}( 2.5.4.8 NAME ( 'st' 'stateOrProvinceName' ) DESC 'RFC2 + 256: state or province which this object resides in' SUP name ) +olcAttributeTypes: {6}( 2.5.4.9 NAME ( 'street' 'streetAddress' ) DESC 'RFC225 + 6: street address of this object' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreS + ubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} ) +olcAttributeTypes: {7}( 2.5.4.10 NAME ( 'o' 'organizationName' ) DESC 'RFC2256 + : organization this object belongs to' SUP name ) +olcAttributeTypes: {8}( 2.5.4.11 NAME ( 'ou' 'organizationalUnitName' ) DESC ' + RFC2256: organizational unit this object belongs to' SUP name ) +olcAttributeTypes: {9}( 2.5.4.12 NAME 'title' DESC 'RFC2256: title associated + with the entity' SUP name ) +olcAttributeTypes: {10}( 2.5.4.14 NAME 'searchGuide' DESC 'RFC2256: search gui + de, deprecated by enhancedSearchGuide' SYNTAX 1.3.6.1.4.1.1466.115.121.1.25 ) +olcAttributeTypes: {11}( 2.5.4.15 NAME 'businessCategory' DESC 'RFC2256: busin + ess category' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTA + X 1.3.6.1.4.1.1466.115.121.1.15{128} ) +olcAttributeTypes: {12}( 2.5.4.16 NAME 'postalAddress' DESC 'RFC2256: postal a + ddress' EQUALITY caseIgnoreListMatch SUBSTR caseIgnoreListSubstringsMatch SYN + TAX 1.3.6.1.4.1.1466.115.121.1.41 ) +olcAttributeTypes: {13}( 2.5.4.17 NAME 'postalCode' DESC 'RFC2256: postal code + ' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4. + 1.1466.115.121.1.15{40} ) +olcAttributeTypes: {14}( 2.5.4.18 NAME 'postOfficeBox' DESC 'RFC2256: Post Off + ice Box' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3 + .6.1.4.1.1466.115.121.1.15{40} ) +olcAttributeTypes: {15}( 2.5.4.19 NAME 'physicalDeliveryOfficeName' DESC 'RFC2 + 256: Physical Delivery Office Name' EQUALITY caseIgnoreMatch SUBSTR caseIgnor + eSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} ) +olcAttributeTypes: {16}( 2.5.4.20 NAME 'telephoneNumber' DESC 'RFC2256: Teleph + one Number' EQUALITY telephoneNumberMatch SUBSTR telephoneNumberSubstringsMat + ch SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{32} ) +olcAttributeTypes: {17}( 2.5.4.21 NAME 'telexNumber' DESC 'RFC2256: Telex Numb + er' SYNTAX 1.3.6.1.4.1.1466.115.121.1.52 ) +olcAttributeTypes: {18}( 2.5.4.22 NAME 'teletexTerminalIdentifier' DESC 'RFC22 + 56: Teletex Terminal Identifier' SYNTAX 1.3.6.1.4.1.1466.115.121.1.51 ) +olcAttributeTypes: {19}( 2.5.4.23 NAME ( 'facsimileTelephoneNumber' 'fax' ) DE + SC 'RFC2256: Facsimile (Fax) Telephone Number' SYNTAX 1.3.6.1.4.1.1466.115.12 + 1.1.22 ) +olcAttributeTypes: {20}( 2.5.4.24 NAME 'x121Address' DESC 'RFC2256: X.121 Addr + ess' EQUALITY numericStringMatch SUBSTR numericStringSubstringsMatch SYNTAX 1 + .3.6.1.4.1.1466.115.121.1.36{15} ) +olcAttributeTypes: {21}( 2.5.4.25 NAME 'internationaliSDNNumber' DESC 'RFC2256 + : international ISDN number' EQUALITY numericStringMatch SUBSTR numericString + SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.36{16} ) +olcAttributeTypes: {22}( 2.5.4.26 NAME 'registeredAddress' DESC 'RFC2256: regi + stered postal address' SUP postalAddress SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 + ) +olcAttributeTypes: {23}( 2.5.4.27 NAME 'destinationIndicator' DESC 'RFC2256: d + estination indicator' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMat + ch SYNTAX 1.3.6.1.4.1.1466.115.121.1.44{128} ) +olcAttributeTypes: {24}( 2.5.4.28 NAME 'preferredDeliveryMethod' DESC 'RFC2256 + : preferred delivery method' SYNTAX 1.3.6.1.4.1.1466.115.121.1.14 SINGLE-VALU + E ) +olcAttributeTypes: {25}( 2.5.4.29 NAME 'presentationAddress' DESC 'RFC2256: pr + esentation address' EQUALITY presentationAddressMatch SYNTAX 1.3.6.1.4.1.1466 + .115.121.1.43 SINGLE-VALUE ) +olcAttributeTypes: {26}( 2.5.4.30 NAME 'supportedApplicationContext' DESC 'RFC + 2256: supported application context' EQUALITY objectIdentifierMatch SYNTAX 1. + 3.6.1.4.1.1466.115.121.1.38 ) +olcAttributeTypes: {27}( 2.5.4.31 NAME 'member' DESC 'RFC2256: member of a gro + up' SUP distinguishedName ) +olcAttributeTypes: {28}( 2.5.4.32 NAME 'owner' DESC 'RFC2256: owner (of the ob + ject)' SUP distinguishedName ) +olcAttributeTypes: {29}( 2.5.4.33 NAME 'roleOccupant' DESC 'RFC2256: occupant + of role' SUP distinguishedName ) +olcAttributeTypes: {30}( 2.5.4.36 NAME 'userCertificate' DESC 'RFC2256: X.509 + user certificate, use ;binary' EQUALITY certificateExactMatch SYNTAX 1.3.6.1. + 4.1.1466.115.121.1.8 ) +olcAttributeTypes: {31}( 2.5.4.37 NAME 'cACertificate' DESC 'RFC2256: X.509 CA + certificate, use ;binary' EQUALITY certificateExactMatch SYNTAX 1.3.6.1.4.1. + 1466.115.121.1.8 ) +olcAttributeTypes: {32}( 2.5.4.38 NAME 'authorityRevocationList' DESC 'RFC2256 + : X.509 authority revocation list, use ;binary' SYNTAX 1.3.6.1.4.1.1466.115.1 + 21.1.9 ) +olcAttributeTypes: {33}( 2.5.4.39 NAME 'certificateRevocationList' DESC 'RFC22 + 56: X.509 certificate revocation list, use ;binary' SYNTAX 1.3.6.1.4.1.1466.1 + 15.121.1.9 ) +olcAttributeTypes: {34}( 2.5.4.40 NAME 'crossCertificatePair' DESC 'RFC2256: X + .509 cross certificate pair, use ;binary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.1 + 0 ) +olcAttributeTypes: {35}( 2.5.4.42 NAME ( 'givenName' 'gn' ) DESC 'RFC2256: fir + st name(s) for which the entity is known by' SUP name ) +olcAttributeTypes: {36}( 2.5.4.43 NAME 'initials' DESC 'RFC2256: initials of s + ome or all of names, but not the surname(s).' SUP name ) +olcAttributeTypes: {37}( 2.5.4.44 NAME 'generationQualifier' DESC 'RFC2256: na + me qualifier indicating a generation' SUP name ) +olcAttributeTypes: {38}( 2.5.4.45 NAME 'x500UniqueIdentifier' DESC 'RFC2256: X + .500 unique identifier' EQUALITY bitStringMatch SYNTAX 1.3.6.1.4.1.1466.115.1 + 21.1.6 ) +olcAttributeTypes: {39}( 2.5.4.46 NAME 'dnQualifier' DESC 'RFC2256: DN qualifi + er' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgno + reSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.44 ) +olcAttributeTypes: {40}( 2.5.4.47 NAME 'enhancedSearchGuide' DESC 'RFC2256: en + hanced search guide' SYNTAX 1.3.6.1.4.1.1466.115.121.1.21 ) +olcAttributeTypes: {41}( 2.5.4.48 NAME 'protocolInformation' DESC 'RFC2256: pr + otocol information' EQUALITY protocolInformationMatch SYNTAX 1.3.6.1.4.1.1466 + .115.121.1.42 ) +olcAttributeTypes: {42}( 2.5.4.50 NAME 'uniqueMember' DESC 'RFC2256: unique me + mber of a group' EQUALITY uniqueMemberMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1 + .34 ) +olcAttributeTypes: {43}( 2.5.4.51 NAME 'houseIdentifier' DESC 'RFC2256: house + identifier' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX + 1.3.6.1.4.1.1466.115.121.1.15{32768} ) +olcAttributeTypes: {44}( 2.5.4.52 NAME 'supportedAlgorithms' DESC 'RFC2256: su + pported algorithms' SYNTAX 1.3.6.1.4.1.1466.115.121.1.49 ) +olcAttributeTypes: {45}( 2.5.4.53 NAME 'deltaRevocationList' DESC 'RFC2256: de + lta revocation list; use ;binary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.9 ) +olcAttributeTypes: {46}( 2.5.4.54 NAME 'dmdName' DESC 'RFC2256: name of DMD' S + UP name ) +olcAttributeTypes: {47}( 2.5.4.65 NAME 'pseudonym' DESC 'X.520(4th): pseudonym + for the object' SUP name ) +olcAttributeTypes: {48}( 0.9.2342.19200300.100.1.3 NAME ( 'mail' 'rfc822Mailbo + x' ) DESC 'RFC1274: RFC822 Mailbox' EQUALITY caseIgnoreIA5Match SUBSTR ca + seIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} ) +olcAttributeTypes: {49}( 0.9.2342.19200300.100.1.25 NAME ( 'dc' 'domainCompone + nt' ) DESC 'RFC1274/2247: domain component' EQUALITY caseIgnoreIA5Match SUBST + R caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VA + LUE ) +olcAttributeTypes: {50}( 0.9.2342.19200300.100.1.37 NAME 'associatedDomain' DE + SC 'RFC1274: domain associated with object' EQUALITY caseIgnoreIA5Match SUBST + R caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) +olcAttributeTypes: {51}( 1.2.840.113549.1.9.1 NAME ( 'email' 'emailAddress' 'p + kcs9email' ) DESC 'RFC3280: legacy attribute for email addresses in DNs' EQUA + LITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4. + 1.1466.115.121.1.26{128} ) +olcObjectClasses: {0}( 2.5.6.2 NAME 'country' DESC 'RFC2256: a country' SUP to + p STRUCTURAL MUST c MAY ( searchGuide $ description ) ) +olcObjectClasses: {1}( 2.5.6.3 NAME 'locality' DESC 'RFC2256: a locality' SUP + top STRUCTURAL MAY ( street $ seeAlso $ searchGuide $ st $ l $ description ) + ) +olcObjectClasses: {2}( 2.5.6.4 NAME 'organization' DESC 'RFC2256: an organizat + ion' SUP top STRUCTURAL MUST o MAY ( userPassword $ searchGuide $ seeAlso $ b + usinessCategory $ x121Address $ registeredAddress $ destinationIndicator $ pr + eferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNu + mber $ internationaliSDNNumber $ facsimileTelephoneNumber $ street $ postOff + iceBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ st $ l $ d + escription ) ) +olcObjectClasses: {3}( 2.5.6.5 NAME 'organizationalUnit' DESC 'RFC2256: an org + anizational unit' SUP top STRUCTURAL MUST ou MAY ( userPassword $ searchGuide + $ seeAlso $ businessCategory $ x121Address $ registeredAddress $ destination + Indicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier + $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ str + eet $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName + $ st $ l $ description ) ) +olcObjectClasses: {4}( 2.5.6.6 NAME 'person' DESC 'RFC2256: a person' SUP top + STRUCTURAL MUST ( sn $ cn ) MAY ( userPassword $ telephoneNumber $ seeAlso $ + description ) ) +olcObjectClasses: {5}( 2.5.6.7 NAME 'organizationalPerson' DESC 'RFC2256: an o + rganizational person' SUP person STRUCTURAL MAY ( title $ x121Address $ regis + teredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ + teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ fac + simileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ + physicalDeliveryOfficeName $ ou $ st $ l ) ) +olcObjectClasses: {6}( 2.5.6.8 NAME 'organizationalRole' DESC 'RFC2256: an org + anizational role' SUP top STRUCTURAL MUST cn MAY ( x121Address $ registeredAd + dress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ telete + xTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTe + lephoneNumber $ seeAlso $ roleOccupant $ preferredDeliveryMethod $ street $ p + ostOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ ou $ + st $ l $ description ) ) +olcObjectClasses: {7}( 2.5.6.9 NAME 'groupOfNames' DESC 'RFC2256: a group of n + ames (DNs)' SUP top STRUCTURAL MUST ( member $ cn ) MAY ( businessCategory $ + seeAlso $ owner $ ou $ o $ description ) ) +olcObjectClasses: {8}( 2.5.6.10 NAME 'residentialPerson' DESC 'RFC2256: an res + idential person' SUP person STRUCTURAL MUST l MAY ( businessCategory $ x121Ad + dress $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ + telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDN + Number $ facsimileTelephoneNumber $ preferredDeliveryMethod $ street $ postOf + ficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ st $ l ) + ) +olcObjectClasses: {9}( 2.5.6.11 NAME 'applicationProcess' DESC 'RFC2256: an ap + plication process' SUP top STRUCTURAL MUST cn MAY ( seeAlso $ ou $ l $ descri + ption ) ) +olcObjectClasses: {10}( 2.5.6.12 NAME 'applicationEntity' DESC 'RFC2256: an ap + plication entity' SUP top STRUCTURAL MUST ( presentationAddress $ cn ) MAY ( + supportedApplicationContext $ seeAlso $ ou $ o $ l $ description ) ) +olcObjectClasses: {11}( 2.5.6.13 NAME 'dSA' DESC 'RFC2256: a directory system + agent (a server)' SUP applicationEntity STRUCTURAL MAY knowledgeInformation ) +olcObjectClasses: {12}( 2.5.6.14 NAME 'device' DESC 'RFC2256: a device' SUP to + p STRUCTURAL MUST cn MAY ( serialNumber $ seeAlso $ owner $ ou $ o $ l $ desc + ription ) ) +olcObjectClasses: {13}( 2.5.6.15 NAME 'strongAuthenticationUser' DESC 'RFC2256 + : a strong authentication user' SUP top AUXILIARY MUST userCertificate ) +olcObjectClasses: {14}( 2.5.6.16 NAME 'certificationAuthority' DESC 'RFC2256: + a certificate authority' SUP top AUXILIARY MUST ( authorityRevocationList $ c + ertificateRevocationList $ cACertificate ) MAY crossCertificatePair ) +olcObjectClasses: {15}( 2.5.6.17 NAME 'groupOfUniqueNames' DESC 'RFC2256: a gr + oup of unique names (DN and Unique Identifier)' SUP top STRUCTURAL MUST ( uni + queMember $ cn ) MAY ( businessCategory $ seeAlso $ owner $ ou $ o $ descript + ion ) ) +olcObjectClasses: {16}( 2.5.6.18 NAME 'userSecurityInformation' DESC 'RFC2256: + a user security information' SUP top AUXILIARY MAY ( supportedAlgorithms ) ) +olcObjectClasses: {17}( 2.5.6.16.2 NAME 'certificationAuthority-V2' SUP certif + icationAuthority AUXILIARY MAY ( deltaRevocationList ) ) +olcObjectClasses: {18}( 2.5.6.19 NAME 'cRLDistributionPoint' SUP top STRUCTURA + L MUST ( cn ) MAY ( certificateRevocationList $ authorityRevocationList $ del + taRevocationList ) ) +olcObjectClasses: {19}( 2.5.6.20 NAME 'dmd' SUP top STRUCTURAL MUST ( dmdName + ) MAY ( userPassword $ searchGuide $ seeAlso $ businessCategory $ x121Address + $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telex + Number $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumbe + r $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAd + dress $ physicalDeliveryOfficeName $ st $ l $ description ) ) +olcObjectClasses: {20}( 2.5.6.21 NAME 'pkiUser' DESC 'RFC2587: a PKI user' SUP + top AUXILIARY MAY userCertificate ) +olcObjectClasses: {21}( 2.5.6.22 NAME 'pkiCA' DESC 'RFC2587: PKI certificate a + uthority' SUP top AUXILIARY MAY ( authorityRevocationList $ certificateRevoca + tionList $ cACertificate $ crossCertificatePair ) ) +olcObjectClasses: {22}( 2.5.6.23 NAME 'deltaCRL' DESC 'RFC2587: PKI user' SUP + top AUXILIARY MAY deltaRevocationList ) +olcObjectClasses: {23}( 1.3.6.1.4.1.250.3.15 NAME 'labeledURIObject' DESC 'RFC + 2079: object that contains the URI attribute type' MAY ( labeledURI ) SUP top + AUXILIARY ) +olcObjectClasses: {24}( 0.9.2342.19200300.100.4.19 NAME 'simpleSecurityObject' + DESC 'RFC1274: simple security object' SUP top AUXILIARY MUST userPassword ) +olcObjectClasses: {25}( 1.3.6.1.4.1.1466.344 NAME 'dcObject' DESC 'RFC2247: do + main component object' SUP top AUXILIARY MUST dc ) +olcObjectClasses: {26}( 1.3.6.1.1.3.1 NAME 'uidObject' DESC 'RFC2377: uid obje + ct' SUP top AUXILIARY MUST uid ) +structuralObjectClass: olcSchemaConfig +entryUUID: db08c7ba-51e1-1034-95f0-9d03bc6be361 +creatorsName: cn=config +createTimestamp: 20150226090154Z +entryCSN: 20150226090154.823123Z#000000#000#000000 +modifiersName: cn=config +modifyTimestamp: 20150226090154Z diff --git a/test/config/cn=config/cn=schema/cn={1}cosine.ldif b/test/config/cn=config/cn=schema/cn={1}cosine.ldif new file mode 100644 index 0000000..b32305e --- /dev/null +++ b/test/config/cn=config/cn=schema/cn={1}cosine.ldif @@ -0,0 +1,177 @@ +# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify. +# CRC32 798d0f53 +dn: cn={1}cosine +objectClass: olcSchemaConfig +cn: {1}cosine +olcAttributeTypes: {0}( 0.9.2342.19200300.100.1.2 NAME 'textEncodedORAddress' + EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1. + 1466.115.121.1.15{256} ) +olcAttributeTypes: {1}( 0.9.2342.19200300.100.1.4 NAME 'info' DESC 'RFC1274: g + eneral information' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{2048} ) +olcAttributeTypes: {2}( 0.9.2342.19200300.100.1.5 NAME ( 'drink' 'favouriteDri + nk' ) DESC 'RFC1274: favorite drink' EQUALITY caseIgnoreMatch SUBSTR caseIgno + reSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) +olcAttributeTypes: {3}( 0.9.2342.19200300.100.1.6 NAME 'roomNumber' DESC 'RFC1 + 274: room number' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch S + YNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) +olcAttributeTypes: {4}( 0.9.2342.19200300.100.1.7 NAME 'photo' DESC 'RFC1274: + photo (G3 fax)' SYNTAX 1.3.6.1.4.1.1466.115.121.1.23{25000} ) +olcAttributeTypes: {5}( 0.9.2342.19200300.100.1.8 NAME 'userClass' DESC 'RFC12 + 74: category of user' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMat + ch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) +olcAttributeTypes: {6}( 0.9.2342.19200300.100.1.9 NAME 'host' DESC 'RFC1274: h + ost computer' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTA + X 1.3.6.1.4.1.1466.115.121.1.15{256} ) +olcAttributeTypes: {7}( 0.9.2342.19200300.100.1.10 NAME 'manager' DESC 'RFC127 + 4: DN of manager' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115 + .121.1.12 ) +olcAttributeTypes: {8}( 0.9.2342.19200300.100.1.11 NAME 'documentIdentifier' D + ESC 'RFC1274: unique identifier of document' EQUALITY caseIgnoreMatch SUBSTR + caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) +olcAttributeTypes: {9}( 0.9.2342.19200300.100.1.12 NAME 'documentTitle' DESC ' + RFC1274: title of document' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstri + ngsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) +olcAttributeTypes: {10}( 0.9.2342.19200300.100.1.13 NAME 'documentVersion' DES + C 'RFC1274: version of document' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSu + bstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) +olcAttributeTypes: {11}( 0.9.2342.19200300.100.1.14 NAME 'documentAuthor' DESC + 'RFC1274: DN of author of document' EQUALITY distinguishedNameMatch SYNTAX 1 + .3.6.1.4.1.1466.115.121.1.12 ) +olcAttributeTypes: {12}( 0.9.2342.19200300.100.1.15 NAME 'documentLocation' DE + SC 'RFC1274: location of document original' EQUALITY caseIgnoreMatch SUBSTR c + aseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) +olcAttributeTypes: {13}( 0.9.2342.19200300.100.1.20 NAME ( 'homePhone' 'homeTe + lephoneNumber' ) DESC 'RFC1274: home telephone number' EQUALITY telephoneNumb + erMatch SUBSTR telephoneNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121 + .1.50 ) +olcAttributeTypes: {14}( 0.9.2342.19200300.100.1.21 NAME 'secretary' DESC 'RFC + 1274: DN of secretary' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.146 + 6.115.121.1.12 ) +olcAttributeTypes: {15}( 0.9.2342.19200300.100.1.22 NAME 'otherMailbox' SYNTAX + 1.3.6.1.4.1.1466.115.121.1.39 ) +olcAttributeTypes: {16}( 0.9.2342.19200300.100.1.26 NAME 'aRecord' EQUALITY ca + seIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) +olcAttributeTypes: {17}( 0.9.2342.19200300.100.1.27 NAME 'mDRecord' EQUALITY c + aseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) +olcAttributeTypes: {18}( 0.9.2342.19200300.100.1.28 NAME 'mXRecord' EQUALITY c + aseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) +olcAttributeTypes: {19}( 0.9.2342.19200300.100.1.29 NAME 'nSRecord' EQUALITY c + aseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) +olcAttributeTypes: {20}( 0.9.2342.19200300.100.1.30 NAME 'sOARecord' EQUALITY + caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) +olcAttributeTypes: {21}( 0.9.2342.19200300.100.1.31 NAME 'cNAMERecord' EQUALIT + Y caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) +olcAttributeTypes: {22}( 0.9.2342.19200300.100.1.38 NAME 'associatedName' DESC + 'RFC1274: DN of entry associated with domain' EQUALITY distinguishedNameMatc + h SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 ) +olcAttributeTypes: {23}( 0.9.2342.19200300.100.1.39 NAME 'homePostalAddress' D + ESC 'RFC1274: home postal address' EQUALITY caseIgnoreListMatch SUBSTR caseIg + noreListSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 ) +olcAttributeTypes: {24}( 0.9.2342.19200300.100.1.40 NAME 'personalTitle' DESC + 'RFC1274: personal title' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstring + sMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) +olcAttributeTypes: {25}( 0.9.2342.19200300.100.1.41 NAME ( 'mobile' 'mobileTel + ephoneNumber' ) DESC 'RFC1274: mobile telephone number' EQUALITY telephoneNum + berMatch SUBSTR telephoneNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.12 + 1.1.50 ) +olcAttributeTypes: {26}( 0.9.2342.19200300.100.1.42 NAME ( 'pager' 'pagerTelep + honeNumber' ) DESC 'RFC1274: pager telephone number' EQUALITY telephoneNumber + Match SUBSTR telephoneNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1 + .50 ) +olcAttributeTypes: {27}( 0.9.2342.19200300.100.1.43 NAME ( 'co' 'friendlyCount + ryName' ) DESC 'RFC1274: friendly country name' EQUALITY caseIgnoreMatch SUBS + TR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) +olcAttributeTypes: {28}( 0.9.2342.19200300.100.1.44 NAME 'uniqueIdentifier' DE + SC 'RFC1274: unique identifer' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.14 + 66.115.121.1.15{256} ) +olcAttributeTypes: {29}( 0.9.2342.19200300.100.1.45 NAME 'organizationalStatus + ' DESC 'RFC1274: organizational status' EQUALITY caseIgnoreMatch SUBSTR caseI + gnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) +olcAttributeTypes: {30}( 0.9.2342.19200300.100.1.46 NAME 'janetMailbox' DESC ' + RFC1274: Janet mailbox' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5Subst + ringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} ) +olcAttributeTypes: {31}( 0.9.2342.19200300.100.1.47 NAME 'mailPreferenceOption + ' DESC 'RFC1274: mail preference option' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 + ) +olcAttributeTypes: {32}( 0.9.2342.19200300.100.1.48 NAME 'buildingName' DESC ' + RFC1274: name of building' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstrin + gsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) +olcAttributeTypes: {33}( 0.9.2342.19200300.100.1.49 NAME 'dSAQuality' DESC 'RF + C1274: DSA Quality' SYNTAX 1.3.6.1.4.1.1466.115.121.1.19 SINGLE-VALUE ) +olcAttributeTypes: {34}( 0.9.2342.19200300.100.1.50 NAME 'singleLevelQuality' + DESC 'RFC1274: Single Level Quality' SYNTAX 1.3.6.1.4.1.1466.115.121.1.13 SIN + GLE-VALUE ) +olcAttributeTypes: {35}( 0.9.2342.19200300.100.1.51 NAME 'subtreeMinimumQualit + y' DESC 'RFC1274: Subtree Mininum Quality' SYNTAX 1.3.6.1.4.1.1466.115.121.1. + 13 SINGLE-VALUE ) +olcAttributeTypes: {36}( 0.9.2342.19200300.100.1.52 NAME 'subtreeMaximumQualit + y' DESC 'RFC1274: Subtree Maximun Quality' SYNTAX 1.3.6.1.4.1.1466.115.121.1. + 13 SINGLE-VALUE ) +olcAttributeTypes: {37}( 0.9.2342.19200300.100.1.53 NAME 'personalSignature' D + ESC 'RFC1274: Personal Signature (G3 fax)' SYNTAX 1.3.6.1.4.1.1466.115.121.1. + 23 ) +olcAttributeTypes: {38}( 0.9.2342.19200300.100.1.54 NAME 'dITRedirect' DESC 'R + FC1274: DIT Redirect' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466 + .115.121.1.12 ) +olcAttributeTypes: {39}( 0.9.2342.19200300.100.1.55 NAME 'audio' DESC 'RFC1274 + : audio (u-law)' SYNTAX 1.3.6.1.4.1.1466.115.121.1.4{25000} ) +olcAttributeTypes: {40}( 0.9.2342.19200300.100.1.56 NAME 'documentPublisher' D + ESC 'RFC1274: publisher of document' EQUALITY caseIgnoreMatch SUBSTR caseIgno + reSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) +olcObjectClasses: {0}( 0.9.2342.19200300.100.4.4 NAME ( 'pilotPerson' 'newPilo + tPerson' ) SUP person STRUCTURAL MAY ( userid $ textEncodedORAddress $ rfc822 + Mailbox $ favouriteDrink $ roomNumber $ userClass $ homeTelephoneNumber $ hom + ePostalAddress $ secretary $ personalTitle $ preferredDeliveryMethod $ busine + ssCategory $ janetMailbox $ otherMailbox $ mobileTelephoneNumber $ pagerTelep + honeNumber $ organizationalStatus $ mailPreferenceOption $ personalSignature + ) ) +olcObjectClasses: {1}( 0.9.2342.19200300.100.4.5 NAME 'account' SUP top STRUCT + URAL MUST userid MAY ( description $ seeAlso $ localityName $ organizationNam + e $ organizationalUnitName $ host ) ) +olcObjectClasses: {2}( 0.9.2342.19200300.100.4.6 NAME 'document' SUP top STRUC + TURAL MUST documentIdentifier MAY ( commonName $ description $ seeAlso $ loca + lityName $ organizationName $ organizationalUnitName $ documentTitle $ docume + ntVersion $ documentAuthor $ documentLocation $ documentPublisher ) ) +olcObjectClasses: {3}( 0.9.2342.19200300.100.4.7 NAME 'room' SUP top STRUCTURA + L MUST commonName MAY ( roomNumber $ description $ seeAlso $ telephoneNumber + ) ) +olcObjectClasses: {4}( 0.9.2342.19200300.100.4.9 NAME 'documentSeries' SUP top + STRUCTURAL MUST commonName MAY ( description $ seeAlso $ telephonenumber $ l + ocalityName $ organizationName $ organizationalUnitName ) ) +olcObjectClasses: {5}( 0.9.2342.19200300.100.4.13 NAME 'domain' SUP top STRUCT + URAL MUST domainComponent MAY ( associatedName $ organizationName $ descripti + on $ businessCategory $ seeAlso $ searchGuide $ userPassword $ localityName $ + stateOrProvinceName $ streetAddress $ physicalDeliveryOfficeName $ postalAdd + ress $ postalCode $ postOfficeBox $ streetAddress $ facsimileTelephoneNumber + $ internationalISDNNumber $ telephoneNumber $ teletexTerminalIdentifier $ tel + exNumber $ preferredDeliveryMethod $ destinationIndicator $ registeredAddress + $ x121Address ) ) +olcObjectClasses: {6}( 0.9.2342.19200300.100.4.14 NAME 'RFC822localPart' SUP d + omain STRUCTURAL MAY ( commonName $ surname $ description $ seeAlso $ telepho + neNumber $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOffi + ceBox $ streetAddress $ facsimileTelephoneNumber $ internationalISDNNumber $ + telephoneNumber $ teletexTerminalIdentifier $ telexNumber $ preferredDelivery + Method $ destinationIndicator $ registeredAddress $ x121Address ) ) +olcObjectClasses: {7}( 0.9.2342.19200300.100.4.15 NAME 'dNSDomain' SUP domain + STRUCTURAL MAY ( ARecord $ MDRecord $ MXRecord $ NSRecord $ SOARecord $ CNAME + Record ) ) +olcObjectClasses: {8}( 0.9.2342.19200300.100.4.17 NAME 'domainRelatedObject' D + ESC 'RFC1274: an object related to an domain' SUP top AUXILIARY MUST associat + edDomain ) +olcObjectClasses: {9}( 0.9.2342.19200300.100.4.18 NAME 'friendlyCountry' SUP c + ountry STRUCTURAL MUST friendlyCountryName ) +olcObjectClasses: {10}( 0.9.2342.19200300.100.4.20 NAME 'pilotOrganization' SU + P ( organization $ organizationalUnit ) STRUCTURAL MAY buildingName ) +olcObjectClasses: {11}( 0.9.2342.19200300.100.4.21 NAME 'pilotDSA' SUP dsa STR + UCTURAL MAY dSAQuality ) +olcObjectClasses: {12}( 0.9.2342.19200300.100.4.22 NAME 'qualityLabelledData' + SUP top AUXILIARY MUST dsaQuality MAY ( subtreeMinimumQuality $ subtreeMaximu + mQuality ) ) +structuralObjectClass: olcSchemaConfig +entryUUID: db090c34-51e1-1034-95f1-9d03bc6be361 +creatorsName: cn=config +createTimestamp: 20150226090154Z +entryCSN: 20150226090154.824875Z#000000#000#000000 +modifiersName: cn=config +modifyTimestamp: 20150226090154Z diff --git a/test/config/cn=config/cn=schema/cn={2}nis.ldif b/test/config/cn=config/cn=schema/cn={2}nis.ldif new file mode 100644 index 0000000..9bf36b8 --- /dev/null +++ b/test/config/cn=config/cn=schema/cn={2}nis.ldif @@ -0,0 +1,106 @@ +# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify. +# CRC32 b5000483 +dn: cn={2}nis +objectClass: olcSchemaConfig +cn: {2}nis +olcAttributeTypes: {0}( 1.3.6.1.1.1.1.2 NAME 'gecos' DESC 'The GECOS field; th + e common name' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatc + h SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE ) +olcAttributeTypes: {1}( 1.3.6.1.1.1.1.3 NAME 'homeDirectory' DESC 'The absolut + e path to the home directory' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1 + 466.115.121.1.26 SINGLE-VALUE ) +olcAttributeTypes: {2}( 1.3.6.1.1.1.1.4 NAME 'loginShell' DESC 'The path to th + e login shell' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.2 + 6 SINGLE-VALUE ) +olcAttributeTypes: {3}( 1.3.6.1.1.1.1.5 NAME 'shadowLastChange' EQUALITY integ + erMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) +olcAttributeTypes: {4}( 1.3.6.1.1.1.1.6 NAME 'shadowMin' EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) +olcAttributeTypes: {5}( 1.3.6.1.1.1.1.7 NAME 'shadowMax' EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) +olcAttributeTypes: {6}( 1.3.6.1.1.1.1.8 NAME 'shadowWarning' EQUALITY integerM + atch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) +olcAttributeTypes: {7}( 1.3.6.1.1.1.1.9 NAME 'shadowInactive' EQUALITY integer + Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) +olcAttributeTypes: {8}( 1.3.6.1.1.1.1.10 NAME 'shadowExpire' EQUALITY integerM + atch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) +olcAttributeTypes: {9}( 1.3.6.1.1.1.1.11 NAME 'shadowFlag' EQUALITY integerMat + ch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) +olcAttributeTypes: {10}( 1.3.6.1.1.1.1.12 NAME 'memberUid' EQUALITY caseExactI + A5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1. + 26 ) +olcAttributeTypes: {11}( 1.3.6.1.1.1.1.13 NAME 'memberNisNetgroup' EQUALITY ca + seExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.11 + 5.121.1.26 ) +olcAttributeTypes: {12}( 1.3.6.1.1.1.1.14 NAME 'nisNetgroupTriple' DESC 'Netgr + oup triple' SYNTAX 1.3.6.1.1.1.0.0 ) +olcAttributeTypes: {13}( 1.3.6.1.1.1.1.15 NAME 'ipServicePort' EQUALITY intege + rMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) +olcAttributeTypes: {14}( 1.3.6.1.1.1.1.16 NAME 'ipServiceProtocol' SUP name ) +olcAttributeTypes: {15}( 1.3.6.1.1.1.1.17 NAME 'ipProtocolNumber' EQUALITY int + egerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) +olcAttributeTypes: {16}( 1.3.6.1.1.1.1.18 NAME 'oncRpcNumber' EQUALITY integer + Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) +olcAttributeTypes: {17}( 1.3.6.1.1.1.1.19 NAME 'ipHostNumber' DESC 'IP address + ' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{128} ) +olcAttributeTypes: {18}( 1.3.6.1.1.1.1.20 NAME 'ipNetworkNumber' DESC 'IP netw + ork' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{128} SI + NGLE-VALUE ) +olcAttributeTypes: {19}( 1.3.6.1.1.1.1.21 NAME 'ipNetmaskNumber' DESC 'IP netm + ask' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{128} SI + NGLE-VALUE ) +olcAttributeTypes: {20}( 1.3.6.1.1.1.1.22 NAME 'macAddress' DESC 'MAC address' + EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{128} ) +olcAttributeTypes: {21}( 1.3.6.1.1.1.1.23 NAME 'bootParameter' DESC 'rpc.bootp + aramd parameter' SYNTAX 1.3.6.1.1.1.0.1 ) +olcAttributeTypes: {22}( 1.3.6.1.1.1.1.24 NAME 'bootFile' DESC 'Boot image nam + e' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) +olcAttributeTypes: {23}( 1.3.6.1.1.1.1.26 NAME 'nisMapName' SUP name ) +olcAttributeTypes: {24}( 1.3.6.1.1.1.1.27 NAME 'nisMapEntry' EQUALITY caseExac + tIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121. + 1.26{1024} SINGLE-VALUE ) +olcObjectClasses: {0}( 1.3.6.1.1.1.2.0 NAME 'posixAccount' DESC 'Abstraction o + f an account with POSIX attributes' SUP top AUXILIARY MUST ( cn $ uid $ uidNu + mber $ gidNumber $ homeDirectory ) MAY ( userPassword $ loginShell $ gecos $ + description ) ) +olcObjectClasses: {1}( 1.3.6.1.1.1.2.1 NAME 'shadowAccount' DESC 'Additional a + ttributes for shadow passwords' SUP top AUXILIARY MUST uid MAY ( userPassword + $ shadowLastChange $ shadowMin $ shadowMax $ shadowWarning $ shadowInactive + $ shadowExpire $ shadowFlag $ description ) ) +olcObjectClasses: {2}( 1.3.6.1.1.1.2.2 NAME 'posixGroup' DESC 'Abstraction of + a group of accounts' SUP top STRUCTURAL MUST ( cn $ gidNumber ) MAY ( userPas + sword $ memberUid $ description ) ) +olcObjectClasses: {3}( 1.3.6.1.1.1.2.3 NAME 'ipService' DESC 'Abstraction an I + nternet Protocol service' SUP top STRUCTURAL MUST ( cn $ ipServicePort $ ipSe + rviceProtocol ) MAY description ) +olcObjectClasses: {4}( 1.3.6.1.1.1.2.4 NAME 'ipProtocol' DESC 'Abstraction of + an IP protocol' SUP top STRUCTURAL MUST ( cn $ ipProtocolNumber $ description + ) MAY description ) +olcObjectClasses: {5}( 1.3.6.1.1.1.2.5 NAME 'oncRpc' DESC 'Abstraction of an O + NC/RPC binding' SUP top STRUCTURAL MUST ( cn $ oncRpcNumber $ description ) M + AY description ) +olcObjectClasses: {6}( 1.3.6.1.1.1.2.6 NAME 'ipHost' DESC 'Abstraction of a ho + st, an IP device' SUP top AUXILIARY MUST ( cn $ ipHostNumber ) MAY ( l $ desc + ription $ manager ) ) +olcObjectClasses: {7}( 1.3.6.1.1.1.2.7 NAME 'ipNetwork' DESC 'Abstraction of a + n IP network' SUP top STRUCTURAL MUST ( cn $ ipNetworkNumber ) MAY ( ipNetmas + kNumber $ l $ description $ manager ) ) +olcObjectClasses: {8}( 1.3.6.1.1.1.2.8 NAME 'nisNetgroup' DESC 'Abstraction of + a netgroup' SUP top STRUCTURAL MUST cn MAY ( nisNetgroupTriple $ memberNisNe + tgroup $ description ) ) +olcObjectClasses: {9}( 1.3.6.1.1.1.2.9 NAME 'nisMap' DESC 'A generic abstracti + on of a NIS map' SUP top STRUCTURAL MUST nisMapName MAY description ) +olcObjectClasses: {10}( 1.3.6.1.1.1.2.10 NAME 'nisObject' DESC 'An entry in a + NIS map' SUP top STRUCTURAL MUST ( cn $ nisMapEntry $ nisMapName ) MAY descri + ption ) +olcObjectClasses: {11}( 1.3.6.1.1.1.2.11 NAME 'ieee802Device' DESC 'A device w + ith a MAC address' SUP top AUXILIARY MAY macAddress ) +olcObjectClasses: {12}( 1.3.6.1.1.1.2.12 NAME 'bootableDevice' DESC 'A device + with boot parameters' SUP top AUXILIARY MAY ( bootFile $ bootParameter ) ) +structuralObjectClass: olcSchemaConfig +entryUUID: db09273c-51e1-1034-95f2-9d03bc6be361 +creatorsName: cn=config +createTimestamp: 20150226090154Z +entryCSN: 20150226090154.825570Z#000000#000#000000 +modifiersName: cn=config +modifyTimestamp: 20150226090154Z diff --git a/test/config/cn=config/cn=schema/cn={3}inetorgperson.ldif b/test/config/cn=config/cn=schema/cn={3}inetorgperson.ldif new file mode 100644 index 0000000..f8e4904 --- /dev/null +++ b/test/config/cn=config/cn=schema/cn={3}inetorgperson.ldif @@ -0,0 +1,48 @@ +# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify. +# CRC32 bf5eae1c +dn: cn={3}inetorgperson +objectClass: olcSchemaConfig +cn: {3}inetorgperson +olcAttributeTypes: {0}( 2.16.840.1.113730.3.1.1 NAME 'carLicense' DESC 'RFC279 + 8: vehicle license or registration plate' EQUALITY caseIgnoreMatch SUBSTR cas + eIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) +olcAttributeTypes: {1}( 2.16.840.1.113730.3.1.2 NAME 'departmentNumber' DESC ' + RFC2798: identifies a department within an organization' EQUALITY caseIgnoreM + atch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) +olcAttributeTypes: {2}( 2.16.840.1.113730.3.1.241 NAME 'displayName' DESC 'RFC + 2798: preferred name to be used when displaying entries' EQUALITY caseIgnoreM + atch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SI + NGLE-VALUE ) +olcAttributeTypes: {3}( 2.16.840.1.113730.3.1.3 NAME 'employeeNumber' DESC 'RF + C2798: numerically identifies an employee within an organization' EQUALITY ca + seIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.12 + 1.1.15 SINGLE-VALUE ) +olcAttributeTypes: {4}( 2.16.840.1.113730.3.1.4 NAME 'employeeType' DESC 'RFC2 + 798: type of employment for a person' EQUALITY caseIgnoreMatch SUBSTR caseIgn + oreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) +olcAttributeTypes: {5}( 0.9.2342.19200300.100.1.60 NAME 'jpegPhoto' DESC 'RFC2 + 798: a JPEG image' SYNTAX 1.3.6.1.4.1.1466.115.121.1.28 ) +olcAttributeTypes: {6}( 2.16.840.1.113730.3.1.39 NAME 'preferredLanguage' DESC + 'RFC2798: preferred written or spoken language for a person' EQUALITY caseIg + noreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1. + 15 SINGLE-VALUE ) +olcAttributeTypes: {7}( 2.16.840.1.113730.3.1.40 NAME 'userSMIMECertificate' D + ESC 'RFC2798: PKCS#7 SignedData used to support S/MIME' SYNTAX 1.3.6.1.4.1.14 + 66.115.121.1.5 ) +olcAttributeTypes: {8}( 2.16.840.1.113730.3.1.216 NAME 'userPKCS12' DESC 'RFC2 + 798: personal identity information, a PKCS #12 PFX' SYNTAX 1.3.6.1.4.1.1466.1 + 15.121.1.5 ) +olcObjectClasses: {0}( 2.16.840.1.113730.3.2.2 NAME 'inetOrgPerson' DESC 'RFC2 + 798: Internet Organizational Person' SUP organizationalPerson STRUCTURAL MAY + ( audio $ businessCategory $ carLicense $ departmentNumber $ displayName $ em + ployeeNumber $ employeeType $ givenName $ homePhone $ homePostalAddress $ ini + tials $ jpegPhoto $ labeledURI $ mail $ manager $ mobile $ o $ pager $ photo + $ roomNumber $ secretary $ uid $ userCertificate $ x500uniqueIdentifier $ pre + ferredLanguage $ userSMIMECertificate $ userPKCS12 ) ) +structuralObjectClass: olcSchemaConfig +entryUUID: db093722-51e1-1034-95f3-9d03bc6be361 +creatorsName: cn=config +createTimestamp: 20150226090154Z +entryCSN: 20150226090154.825977Z#000000#000#000000 +modifiersName: cn=config +modifyTimestamp: 20150226090154Z diff --git a/test/config/cn=config/olcBackend={0}hdb.ldif b/test/config/cn=config/olcBackend={0}hdb.ldif new file mode 100644 index 0000000..6b49af8 --- /dev/null +++ b/test/config/cn=config/olcBackend={0}hdb.ldif @@ -0,0 +1,12 @@ +# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify. +# CRC32 40b20094 +dn: olcBackend={0}hdb +objectClass: olcBackendConfig +olcBackend: {0}hdb +structuralObjectClass: olcBackendConfig +entryUUID: db094f96-51e1-1034-95f5-9d03bc6be361 +creatorsName: cn=config +createTimestamp: 20150226090154Z +entryCSN: 20150226090154.826604Z#000000#000#000000 +modifiersName: cn=config +modifyTimestamp: 20150226090154Z diff --git a/test/config/cn=config/olcDatabase={-1}frontend.ldif b/test/config/cn=config/olcDatabase={-1}frontend.ldif new file mode 100644 index 0000000..673109e --- /dev/null +++ b/test/config/cn=config/olcDatabase={-1}frontend.ldif @@ -0,0 +1,18 @@ +# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify. +# CRC32 1f64c20c +dn: olcDatabase={-1}frontend +objectClass: olcDatabaseConfig +objectClass: olcFrontendConfig +olcDatabase: {-1}frontend +olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external + ,cn=auth manage by * break +olcAccess: {1}to dn.exact="" by * read +olcAccess: {2}to dn.base="cn=Subschema" by * read +olcSizeLimit: 500 +structuralObjectClass: olcDatabaseConfig +entryUUID: db089fec-51e1-1034-95ed-9d03bc6be361 +creatorsName: cn=config +createTimestamp: 20150226090154Z +entryCSN: 20150226090154.822104Z#000000#000#000000 +modifiersName: cn=config +modifyTimestamp: 20150226090154Z diff --git a/test/config/cn=config/olcDatabase={0}config.ldif b/test/config/cn=config/olcDatabase={0}config.ldif new file mode 100644 index 0000000..7c2b9ca --- /dev/null +++ b/test/config/cn=config/olcDatabase={0}config.ldif @@ -0,0 +1,14 @@ +# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify. +# CRC32 dcde46c0 +dn: olcDatabase={0}config +objectClass: olcDatabaseConfig +olcDatabase: {0}config +olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external + ,cn=auth manage by * break +structuralObjectClass: olcDatabaseConfig +entryUUID: db08ac08-51e1-1034-95ee-9d03bc6be361 +creatorsName: cn=config +createTimestamp: 20150226090154Z +entryCSN: 20150226090154.822414Z#000000#000#000000 +modifiersName: cn=config +modifyTimestamp: 20150226090154Z diff --git a/test/config/cn=config/olcDatabase={1}hdb.ldif b/test/config/cn=config/olcDatabase={1}hdb.ldif new file mode 100644 index 0000000..bd2fa7b --- /dev/null +++ b/test/config/cn=config/olcDatabase={1}hdb.ldif @@ -0,0 +1,29 @@ +# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify. +# CRC32 8b1aead3 +dn: olcDatabase={1}hdb +objectClass: olcDatabaseConfig +objectClass: olcHdbConfig +olcDatabase: {1}hdb +olcDbDirectory: /var/lib/ldap +olcSuffix: dc=test,dc=osixia,dc=net +olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by anonymou + s auth by dn="cn=admin,dc=test,dc=osixia,dc=net" write by * none +olcAccess: {1}to dn.base="" by * read +olcAccess: {2}to * by self write by dn="cn=admin,dc=test,dc=osixia,dc=net" wri + te by * read +olcLastMod: TRUE +olcRootDN: cn=admin,dc=test,dc=osixia,dc=net +olcRootPW:: e1NTSEF9bU9FWlh4OUpPNmlhK1dkeFV4S0FKam43R3dmNVJrby8= +olcDbCheckpoint: 512 30 +olcDbConfig: {0}set_cachesize 0 2097152 0 +olcDbConfig: {1}set_lk_max_objects 1500 +olcDbConfig: {2}set_lk_max_locks 1500 +olcDbConfig: {3}set_lk_max_lockers 1500 +olcDbIndex: objectClass eq +structuralObjectClass: olcHdbConfig +entryUUID: db09539c-51e1-1034-95f6-9d03bc6be361 +creatorsName: cn=config +createTimestamp: 20150226090154Z +entryCSN: 20150226090154.826706Z#000000#000#000000 +modifiersName: cn=config +modifyTimestamp: 20150226090154Z diff --git a/test/database/__db.001 b/test/database/__db.001 index 5e822744d1156e646fbbbe91c5f55bfa5cab8623..6fadae0e7214bd4ff52d07865a32e51547d42977 100644 GIT binary patch delta 2517 zcma)8du$X%7~h%w=DK&K^h#;3NJ$^O8X@5zM9)~ECKww2u|X&W5$+5zl}BjQNHGU2 zErCm8Lf5rS6M?jm02)Zphyz&QNC1nev4W{Bf+>mrAVE$Ac?786?Ch3aX^fM!-|YAN zeUF*Bfzu@er%Rg0=523j8Fl>Dj5QjrlfV73NYdq;oTs@~`Px8#fJufHF|02)2ddn! zXuvu#g{-z?WSW1yBiFQSPKcgsA0*BCv6IApkxr&{pYUr-posS~vcbMb66*{zLGb#xIT}D^R7PLE^SnPYUg}vC0A4w z{kzh383pUqI`;$GUxfn{;pM)k9>Jg=bUvP z^&+VER>Om3nRZOijYy8fA**(FNXE!=mXu|pOwxsYYDQ#L1UBHW4{Wo+G$IKs9WLHa zS%F>L7$H7;Y2#GF?5&M+36rh*xv_PdXx&D_+1Op9<&a*;i(jDze>jg$_bY2`0Hz$` z!SfWvm2>paWINetkS9!z%-K(rt=M?Shd>`4robU<^DB#|B~^K8VWr8~_j$)MoT~S# zL19r$k@!~cA}#w6VBH11Ty8|?1$`gox98D9p6GIU{ayM)YOO95_kPfC6GteFi~4SY zJf6IymrGf}PkPzM{K!Ty2<7d^p=e8Zk5eh9nzEu1IZU`lA=TB^`CkC)+__@y$bed{ zQFr4KW4AJrzT{tYn7@SkUGdm4;MvQ;FH*H&5+*}Z{{1(wWOCZsP!0#tIBLi%?COAF=ZT-W0aHc&8VC}9uX{-lC*zsjdzC{Ep_g$Mh98=-XU6!owGb-t(lm#e zdkHS)FJFfu5m_fwk-msb(`i?Oh>wtkgQ)p{u46>%sY=T=J7yi39>glJz6 zp#TAXd?OUm-f`mcMwmqjh^#nd<__jddC5))m3qJ{;^}#N!1oZbY$xPX{~oM}jOiA( z*-}6z<&AXSb#cvt86<6%qVJ?f@G83(9S^N+t8e64ioD=qRrJ`q>Ha*#p1%=iDQU|F zNELUMMntb1YmVBJlzUs$ERC2k;agW=gDZDI)kJPqL+!2;U|6w9{Nd|RC@N22SgWpp zM>oJ$9_zr#Yt<`1?+=k1q@p833najsBiG( zEu~*0!YPR7kPLp9u#mA3A4Pc?%P1+rj2y3@8Ez#9Z^bfaczG?}yi=MHzFej}YeN>Y z%`kqO2R3b*zQu}7!D|vkH)WM%w7h$V%JO+Ru&+i-PwDIqA1mioj3r2z_c1mx{c*8k zAztib^`qser5Oq|1cF9qGSDb(I{2R%>{S^m4V{Bvw$bXIN8V2TlO;(6_(jSV*vSS6 zRJhiud;D3Q?bkaQvtoI?4w&(rd#`$d1`_`$NWE@^gDxE&NhQfEs=*kOe5A~4T^g?E sO~7VZb>PT(%3#6FBX^WzbCJFS-&1^j>A;*F_~_xoM^kg;^S7?&UtApCPXGV_ delta 2048 zcma)6YiJx*6rMYCW;2^L$!<5<-I^`UJFyj-289hqnja}Fh?tqIQ#pO|hfM0Lw$&V^B{}#rHe(9zB z@jUBmI!~XhA?FO0?02JiE(j4^H;CW(hzv=>ieNk1ZWYS|~#8bNytAaq7 z_1jl%7bdtaqN{#mO!A6}RbAbOy~6~2jkd{fk+o5bbty;`U9C0h!3#W3{FVpql|bBB z(AE3RU2?%#gin0O7(yp={OR(u)gqGtLzk-xN(0jZQ3TWZ5Ja1fkNlq3jBNd(qI&Xv)|tV4C8J zD2I%)!3YT%orARmjMIaMFg-yOTxk)Dc{d~nM_;B)UVoFnTN~V73q|niYAKc-78SbH zA||!nclGwUBNY6?AP4kbg|c4Js(F-5@qb(M&Qjd00nEjE>2I+6MtG3EdYbrJnk9O7 z7<*@=CMN0hjP!xX6^U6(u`(-di8yVLFwJ};ZE$0%d?%eJrVdl{QWI{ph+!J~UaA|$ z)Ti)VUToW3x>|)>M<7hoU7!)YH-za9&`^m(2+KC0llI4PzS$HeVB z3mFGj!6BWU^Ej8!ftTRW63eu4N2VzwJJaR2Y!4b8f!0cF?gE8ftlk5A4=z7u@ydIJ zKN0?uuoYw@L$bE!d(>sk5CzvKAXs7HZEx2ut(#Th}@Z$OMV1-Gqb-B(@c-icn3=^JYh5alaoIwnNwCWA;H zhpLhs2q!1%OT#-p62i~eEi0|7)(qm!pC+>6bADJGQ1GJfuy}~yX&H90VN(;mbKB(3 z9Nl(ME|`N>!KC(D!_4agx?01>5YRbMj*>z)>V@pX05*aAc_9bMRVQ6?6Sm57f>huS zvRs)vP<1tkWiGj|kPY=*N6H+5FsCo`m{V@^t>?*4aHyR00=SjWpvDwAike3bd7>Gs luF%sGdff7!N~cp&&c>FCZMfVn@rk@?&Q)u={@eRu=`T?DSZV+O diff --git a/test/database/__db.002 b/test/database/__db.002 index a03f425be0b869f99cdf3ccbf697f0eb53898d6b..09c03578f08630b33b0745cb63924b952bf74fdc 100644 GIT binary patch delta 1945 zcmezWpX2|3jtvQns*;QhV88+-PXO_EW(Woeu4Q6i@B+$5O%~jxymcr$4O006Q^m8{aaK7a&g{KCaD;^RBbQ?ZYr^vfxJH%{}u>*a-Sh1+RU|$iWA<4(2K!X!)lE zF8^ev$6(mz4OIb)bW>ntn@=50n8X1q}OPp~5$rkxhMaf>6Tb z7uyOz36B*d<2Cu>R(+tT2U@D#y9J!!r|Dz0EeL2^IXLm2*;+%KjTpX;K=ZZK3o7XDD0b@D_U?vBI=KUkuOp3Jz@8km)AG+~(xCIdB;0cH!ZUIhbY WU~!;4*4NC0Bqs~b(4XAE>>-3MBf&Vi zYr5X#0wxcfMvFj=)|%YNnvT<%f|Ct5tAorLa1|d}@(0`vgC#8J;|@Y0-oCkkZv_vp zC^R88T;IaMv-xl9YJtrUY&tw9FW`~boFMx`09C={zpd4%B0w#l1>jK&HH<+Dn2kU{ zVd6pI$p>bMfRZ_*(&UfR+TluJSqhi|!GLA5;70sum22`rX5q;_tT8xq1vk_zE>MQ! zMafp1m(HBc1oG9U`5a6*4d8$pps;!4!t3k=m1zK#ZD%E{43tR;suBPi#?MSpSqfgm zl%XCF0EGZXSbIUEMQQTFmBN$PY>dGul)NW1?sNwRlL1@?Y9NEp5VpZmMd0LxoAf6?u<<}mZIkzIk)ABkCNcTI zMi00PVS0jKZU?5cgIn7%+zImu%mtEA7ZhNGQv}RM;Bcy85y9z_1Wl9-gj7ZFL#=}) mDaOeYr|Dz$Yb4mO2X;p=MgeP{cE)HB**s&{_8Gev(^~;MDO3*t diff --git a/test/database/__db.003 b/test/database/__db.003 index 9c0011d730aae020908c51b62ac9b9a4988f5777..bac320e48de67d10cb0965844904910eed49d04f 100644 GIT binary patch delta 1410 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 A%K!iX diff --git a/test/database/objectClass.bdb b/test/database/objectClass.bdb index 4e7eacf65657639f434012b0d68f6931edab603d..51e54795dc2328a6b16e42420addcd5fac03848c 100644 GIT binary patch delta 49 tcmZp0XmFTd!rLHrf`O5PfgyT9SNFV)j)(afl_s+a=%b2nb`;pp4*+#s4;cUe delta 49 tcmZp0XmFTd!YeCwf`O5PfnnF8QpFh?9S`#}hD>G^&_@;D>?p9G9{^vZ4m|(> diff --git a/test/old/config b/test/old/config deleted file mode 100755 index 9199745..0000000 --- a/test/old/config +++ /dev/null @@ -1,8 +0,0 @@ -testImage=openldap-test -testContainer=openldap-test-container -testDir=/osixia-test-docker-openldap - -export testImage -export testContainer -export testDir - diff --git a/test/old/config-repository b/test/old/config-repository deleted file mode 100755 index c54c31a..0000000 --- a/test/old/config-repository +++ /dev/null @@ -1,7 +0,0 @@ -testImage=osixia/openldap:latest -testContainer=openldap-repository-test-container -testDir=/osixia-repository-test-docker-openldap - -export testImage -export testContainer -export testDir diff --git a/test/old/db.sh b/test/old/db.sh deleted file mode 100755 index 00e99cb..0000000 --- a/test/old/db.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/sh - -dir=$(dirname $0) - -if [ -d "$testDir" ]; then - rm -r $testDir -fi - -mkdir $testDir -mkdir $testDir/db -mkdir $testDir/config - -runOptions="-e LDAP_DOMAIN=otherdomain.com -v $testDir/db:/var/lib/ldap -v $testDir/config:/etc/ldap/slapd.d" -. $dir/tools/run-container.sh -sleep 30 -$dir/tools/delete-container.sh - -runOptions="-v $testDir/db:/var/lib/ldap -v $testDir/config:/etc/ldap/slapd.d" -. $dir/tools/run-container.sh -sleep 30 -echo "ldapsearch -x -h $IP -b dc=otherdomain,dc=com" -ldapsearch -x -h $IP -b dc=otherdomain,dc=com - -rm -r $testDir -$dir/tools/delete-container.sh diff --git a/test/old/simple.sh b/test/old/simple.sh deleted file mode 100755 index 3fa5842..0000000 --- a/test/old/simple.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - -dir=$(dirname $0) -. $dir/tools/run-container.sh - -echo "ldapsearch -x -h $IP -b dc=example,dc=com" -sleep 30 -ldapsearch -x -h $IP -b dc=example,dc=com - -$dir/tools/delete-container.sh diff --git a/test/old/tls.sh b/test/old/tls.sh deleted file mode 100755 index 5b2b842..0000000 --- a/test/old/tls.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - -dir=$(dirname $0) -. $dir/tls/run.sh - -echo "ldapsearch -x -h $certCN -b dc=example,dc=com -ZZ" -sleep 30 -ldapsearch -x -h $certCN -b dc=example,dc=com -ZZ - -. $dir/tls/end.sh diff --git a/test/old/tls/end.sh b/test/old/tls/end.sh deleted file mode 100755 index 05d4bb0..0000000 --- a/test/old/tls/end.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh - -sed -i '/'"$addLine"'/d' /etc/hosts -cp /etc/ldap/ldap.conf.old /etc/ldap/ldap.conf -rm /etc/ldap/ldap.conf.old - -$dir/tools/delete-container.sh diff --git a/test/old/tls/run.sh b/test/old/tls/run.sh deleted file mode 100755 index 5cb892c..0000000 --- a/test/old/tls/run.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh - - -runOptions="--dns=127.0.0.1 -v `pwd`/test/tls/ssl:/etc/ldap/ssl" -. $dir/tools/run-container.sh - -cert=$(echo $dir/tls/ssl/ldap.crt) -certCN=$(openssl x509 -in $cert -subject -noout | sed -n 's/.*CN=\(.*\)\/*\(.*\)/\1/p') -addLine=$(echo $IP $certCN) - -echo $addLine >> /etc/hosts -cp /etc/ldap/ldap.conf /etc/ldap/ldap.conf.old -sed -i 's,TLS_CACERT.*,TLS_CACERT '"$cert"',g' /etc/ldap/ldap.conf - -sleep 5 - diff --git a/test/old/tls/ssl/ca.crt b/test/old/tls/ssl/ca.crt deleted file mode 100644 index 0953710..0000000 --- a/test/old/tls/ssl/ca.crt +++ /dev/null @@ -1,21 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDZzCCAh+gAwIBAgIEU2ehnzANBgkqhkiG9w0BAQsFADAjMSEwHwYDVQQDExhU -ZXN0IENBIENvbXBhbnkgLSBPc2l4aWEwHhcNMTQwNTA1MTQzNTExWhcNMTUwNTA1 -MTQzNTExWjAjMSEwHwYDVQQDExhUZXN0IENBIENvbXBhbnkgLSBPc2l4aWEwggFS -MA0GCSqGSIb3DQEBAQUAA4IBPwAwggE6AoIBMQDdf+DVT4rPGxNB1SwL6git8Lw1 -AsEvd+rHAMKyCSRxbJywvtN/OKxVz4qWCkoRvcffG0uyoWRE+1w6DnT8ON+8uvuI -2wbrLydFxuZdouZZJiX0QbXWra9lQpDWO2EAiPFchbN/K9+fXwV4SpsI3B7bGwM/ -sVtn6khbxvtzn+9yUmjIpA7q8i9NLVoX8UwagANtFIVE/Dc/MwaX7ayu6yYiNLXx -GHzWXzQcTS6vWcVaf+pkq6/zZdXn0jVNfqnwAu3ooTWO3BeuQvGaQeRpRVlM0lPh -oM7YFhR8b13Y5EmkZtSjoM+7ZOKF5mqBvluj65gIcQxnx4l4YCZ4MUVAlZBYc87h -2JSYrAlq6eBhJzkNDi21jqtqSr1i08XICZrz4Vk8lrexWbRGzyz537La1LYNAgMB -AAGjQzBBMA8GA1UdEwEB/wQFMAMBAf8wDwYDVR0PAQH/BAUDAwcEADAdBgNVHQ4E -FgQUnod7FQfSDLyWVeBSTTdCriQoEHYwDQYJKoZIhvcNAQELBQADggExAGtv/8Ot -3Acs+KlR+0OBtnWe6sfzfQ2fRJvol7szp0Nto+zTZLbtCEvNGIVkd8eLrm9a9soa -pY/pC6dAPPZHho/G46quSjtSARU/tlbabkRsCfHiWIvtjqKIyzqk+YjOc767pd0G -iWKxF98sI4fKdlZ+Aqw+9vO2KwQMYEtrIiCbPUYMff/BzxkrwUBnYcTjISPwEd3Z -JylfG78qsB8N6UOf89jRX2O7HCy6CGJvcuxbkwaCd5iqgLhBXj9bU7xgy/A2udav -JV/uV+vWDcy8cI22Xz1jfPpimAZjv+Qb3NjDX5nxjTciAEsNges0QdxZ71dfEqo+ -DGSImtM8ORivPw7oXADztCC+11KcV4THa6wmu+Sblsxe46ldAwb6MLvMN04zALUN -mW4ojToqYgz9Jgc= ------END CERTIFICATE----- diff --git a/test/old/tls/ssl/dhparam.pem b/test/old/tls/ssl/dhparam.pem deleted file mode 100644 index a3e1a7e..0000000 --- a/test/old/tls/ssl/dhparam.pem +++ /dev/null @@ -1,8 +0,0 @@ ------BEGIN DH PARAMETERS----- -MIIBCAKCAQEAwC8hQ6nZ2kNNmZAGGYN8++rUvNlDjKqdwWubUnqY08ng6FfGcouL -VSvgsF3LeERW/h4hrkgN983QjwrbBOrNp+7B59lhCs6Acvi87dXf3iaGNy4Gca43 -ERVkAJ7IWdXydyb9COANRtmBb1JvvYMAeVeMdofk8EcOW/kUV2adAQKluAcVhgRQ -Pesp5i6Lv1kN5zVHDGkrJz5h0Mzi35aYia0gSnVCqEzmU7Omnz/gXY3Jdx91ym5Y -2dTZuUZgIhco2bfPbhDl/1g0a1PWz7rxw24KJloNZC3nEt3JqIto83GsgaUtYxFT -EWINSpghTjl4Z0CGCamJ6HXsNJGaVUXuGwIBAg== ------END DH PARAMETERS----- diff --git a/test/old/tls/ssl/ldap.crt b/test/old/tls/ssl/ldap.crt deleted file mode 100644 index 377feb3..0000000 --- a/test/old/tls/ssl/ldap.crt +++ /dev/null @@ -1,19 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDAzCCAbugAwIBAgIEU2eiHTANBgkqhkiG9w0BAQsFADAjMSEwHwYDVQQDExhU -ZXN0IENBIENvbXBhbnkgLSBPc2l4aWEwHhcNMTQwNTA1MTQzNzE3WhcNMjQwNTAy -MTQzNzE3WjBAMR4wHAYDVQQKExVUZXN0IENvbXBhbnkgLSBPc2l4aWExHjAcBgNV -BAMTFWxkYXAtdGVzdC5leGFtcGxlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw -gYkCgYEA0/9/VYQARBLg7TrEiO4DAjcBAt3u3IQNNo8YdsL9iGwmRTPOspxOBVuQ -2AVEIuT+4KLnm01q1NA+tEvXdfXI9eIN5zjCVTdt6VqwrF9E3zWxYEkuSJ4FWOhN -dc0837hWBg+mBl/d6fSTkmeRc9fpwwr1jK7t10/BIzMr/pCzf10CAwEAAaN2MHQw -DAYDVR0TAQH/BAIwADATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHQ8BAf8EBQMD -B6AAMB0GA1UdDgQWBBThLwuObrBzlp4qsKs0NHFMrCgn8jAfBgNVHSMEGDAWgBSe -h3sVB9IMvJZV4FJNN0KuJCgQdjANBgkqhkiG9w0BAQsFAAOCATEAiAl9RGibKsfQ -5Vbz2ZjsykzYj9Dhkxp7fc7RdrK0SEHGXn8Qeg5jf+j9DtfhTrZPVF7Jn4WOvuqh -okQPrwRaDox6rtFPjsIR9JIO3/N2OvA3ozQyWqzB1ksU7CHJ5jGRskHBftSH2xwF -kdGvSMIAmr9VpZ/sp4ykmADWC/bfz8BXYJDOsCBzJMtss/12hBqiJQhSsuBAsOT7 -40hG0t2S7mjGHWDF9PoARmNQ7X3Xc8j7V+dXLpNfZfc+htgI27WcOv7al4kxd//p -22a77U/q+9B1CV8T2q1UTRnQqPHxtgoRLd+5qzEtzBW37ecAs2eAs9Z7D3O/fScu -v0RxHSpnZDtL/JZcf3KO96l4sqCp6Ue5Ldg3tOvD4O46hjrlvUYnHcDdJjNYZ7rD -f5kGXs20Mg== ------END CERTIFICATE----- diff --git a/test/old/tls/ssl/ldap.key b/test/old/tls/ssl/ldap.key deleted file mode 100644 index 2db7c38..0000000 --- a/test/old/tls/ssl/ldap.key +++ /dev/null @@ -1,15 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIICWwIBAAKBgQDT/39VhABEEuDtOsSI7gMCNwEC3e7chA02jxh2wv2IbCZFM86y -nE4FW5DYBUQi5P7gouebTWrU0D60S9d19cj14g3nOMJVN23pWrCsX0TfNbFgSS5I -ngVY6E11zTzfuFYGD6YGX93p9JOSZ5Fz1+nDCvWMru3XT8EjMyv+kLN/XQIDAQAB -AoGAHY7OgKxWYydkr/7VHyhcSAdGP1GVN667ruM1rH1UXxyBG331MEcFw853+/6D -+P+Hn+dmtmsNXZ2pWHcIk/xQZ+MEsAdm+OZ1qpBJjHA0izJ6sqZaNxSToKCR4SHM -/ACPAKqM9r2g1jqXzLKzgHBVc25Fonb1vUilTpC3YfaN+sECQQDmQGEcEK9Lvyi9 -RV1fONDP3Z9cPRaSzpjUjlQAWNbhvcoUYV4AOy+tVClDErRIs/Oo+wCOL+bHlMom -zghcmxThAkEA67SPV0pNFR32gXvRZT4uKvCJcAjmNY4LMpet5DJ41Spq6+lbqXwY -1e87zEei1UvdmEXOjVsa1wXcg8Ks+/59/QJAHh+CFOfh5ykFLW3rv09xkiBOfwTG -9UHuILDWMI1u322zCGOMpr8Xh7ehBlNmHrTcRdlAw1lk+etvXxBJa8QmQQJABbNT -OCg63wTfflgxQ0KSuUUh/cypTKhHywxyDy/NTlJ9TYFSTzIKI7pqdtFQtdnk3Rbr -HO4UIxkoMSOXLW0FPQJARScXqZd7Lmwlw+ovAubfdOZdxjWGFZLRRZifiYZqtnQ1 -aw8PjdkaIPxLjCwSOelV9SsMue6a7nvkxKEn6QbT0w== ------END RSA PRIVATE KEY----- diff --git a/test/old/tools/build-container.sh b/test/old/tools/build-container.sh deleted file mode 100755 index 2be4907..0000000 --- a/test/old/tools/build-container.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh - -docker build -t $testImage . -#docker build --no-cache=true -t $testImage . - diff --git a/test/old/tools/delete-container.sh b/test/old/tools/delete-container.sh deleted file mode 100755 index e7a6abe..0000000 --- a/test/old/tools/delete-container.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh - -# remove test container -res=$(docker ps -a | grep -c "$testContainer") - -if [ $res -ne 0 ]; then - docker stop $testContainer - docker rm $testContainer -fi diff --git a/test/old/tools/delete-image.sh b/test/old/tools/delete-image.sh deleted file mode 100755 index 28cd3d2..0000000 --- a/test/old/tools/delete-image.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh - -# remove test image -res=$(docker images | grep -c "$testImage") - -if [ $res -ne 0 ]; then - docker rmi $testImage -fi diff --git a/test/old/tools/end.sh b/test/old/tools/end.sh deleted file mode 100755 index 9373623..0000000 --- a/test/old/tools/end.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh - - -rm -rf $testDir -./test/tools/delete-container.sh -./test/tools/delete-image.sh > /dev/null 2>&1 - -echo "------- End -------" -echo $error " failed " $ok " succeeded" - -if [ "$error" -eq 0 ]; then - exit 0 -else - exit 1 -fi diff --git a/test/old/tools/prepare.sh b/test/old/tools/prepare.sh deleted file mode 100755 index 6840d94..0000000 --- a/test/old/tools/prepare.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh - -mkdir -p $testDir - -dir=$(dirname $0) -$dir/delete-container.sh -$dir/delete-image.sh diff --git a/test/old/tools/run-container.sh b/test/old/tools/run-container.sh deleted file mode 100755 index 8e24fac..0000000 --- a/test/old/tools/run-container.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh - -echo "docker run --name $testContainer $runOptions -d $testImage $runCommand /sbin/my_init --enable-insecure-key" -ID=`docker run --name $testContainer $runOptions -d $testImage $runCommand /sbin/my_init --enable-insecure-key` -sleep 10 - -echo " --> Obtaining IP" -IP=`docker inspect -f "{{ .NetworkSettings.IPAddress }}" $ID` -if [ "$IP" = "" ]; then - abort "Unable to obtain container IP" - exit 1 -else - echo " -->" $IP -fi diff --git a/test/old/tools/run.sh b/test/old/tools/run.sh deleted file mode 100755 index 2618eeb..0000000 --- a/test/old/tools/run.sh +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/sh - -# Usage -# sudo ./test.sh -# add -v for verbose mode (or type whatever you like !) :p - -verbose=$1 -error=0 -ok=0 - -echo_start () { - echo "------- Test: $* -------" -} - -echo_error () { - echo "\n$(tput setaf 1)/!\ $* failed$(tput sgr0)\n" - error=`expr $error + 1` -} - -echo_ok () { - echo "\n--> $* ok\n" - ok=`expr $ok + 1` -} - -run_test () { - test=$1 - out=test/test.out - - echo_start $test - - if [ -z ${verbose} ]; then - ./test/$test > $out 2>&1 - else - ./test/$test | tee $out 2>&1 - fi - - if [ "$(grep -c "$2" $out)" -eq 0 ]; then - echo_error $test - else - echo_ok $test - fi - - rm $out -} - -./test/tools/prepare.sh > /dev/null 2>&1 diff --git a/test/test.bats b/test/test.bats index e13290c..de5689e 100644 --- a/test/test.bats +++ b/test/test.bats @@ -37,21 +37,20 @@ load test_helper run docker exec $CONTAINER_ID ldapsearch -x -h ldap-test.example.com -b dc=example,dc=org -ZZ clear_container - chown -R $UNAME:$UNAME $BATS_TEST_DIRNAME/ssl || true + chown -R $UNAME:$UNAME $BATS_TEST_DIRNAME || true [ "$status" -eq 0 ] } @test "ldapsearch existing database and config" { - skip - run_image -e USE_TLS=false -v $BATS_TEST_DIRNAME/database:/var/lib/ldap + + run_image -e USE_TLS=false -v $BATS_TEST_DIRNAME/database:/var/lib/ldap -v $BATS_TEST_DIRNAME/config:/etc/ldap/slapd.d wait_service slapd - sleep 60 - run docker exec $CONTAINER_ID ldapsearch -x -h 127.0.0.1 -b dc=test-ldap,dc=osixia,dc=net + run docker exec $CONTAINER_ID ldapsearch -x -h 127.0.0.1 -b dc=test,dc=osixia,dc=net clear_container - chown -R $UNAME:$UNAME $BATS_TEST_DIRNAME/database || true + chown -R $UNAME:$UNAME $BATS_TEST_DIRNAME || true [ "$status" -eq 0 ]