container-start.sh 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. #!/bin/bash -e
  2. FIRST_START_DONE="/etc/docker-openldap-first-start-done"
  3. WAS_STARTED_WITH_TLS="/etc/ldap/slapd.d/docker-openldap-was-started-with-tls"
  4. # Reduce maximum number of number of open file descriptors to 1024
  5. # otherwise slapd consumes two orders of magnitude more of RAM
  6. # see https://github.com/docker/docker/issues/8231
  7. ulimit -n 1024
  8. #fix file permissions
  9. chown -R openldap:openldap /var/lib/ldap
  10. chown -R openldap:openldap /etc/ldap
  11. chown -R openldap:openldap /osixia/slapd
  12. # container first start
  13. if [ ! -e "$FIRST_START_DONE" ]; then
  14. function get_base_dn() {
  15. BASE_DN=""
  16. IFS='.' read -ra BASE_DN_TABLE <<< "$LDAP_DOMAIN"
  17. for i in "${BASE_DN_TABLE[@]}"; do
  18. EXT="dc=$i,"
  19. BASE_DN=$BASE_DN$EXT
  20. done
  21. BASE_DN=${BASE_DN::-1}
  22. }
  23. function is_new_schema() {
  24. local COUNT=$(ldapsearch -Q -Y EXTERNAL -H ldapi:/// -b cn=schema,cn=config cn | grep -c $1)
  25. if [ "$COUNT" -eq 0 ]; then
  26. echo 1
  27. else
  28. echo 0
  29. fi
  30. }
  31. function check_tls_files() {
  32. local CA_CRT=$1
  33. local LDAP_CRT=$2
  34. local LDAP_KEY=$3
  35. # check certificat and key or create it
  36. /sbin/ssl-kit "/osixia/slapd/ssl/$LDAP_CRT" "/osixia/slapd/ssl/$LDAP_KEY" --ca-crt=/osixia/slapd/ssl/$CA_CRT --gnutls
  37. # create DHParamFile if not found
  38. [ -f /osixia/slapd/ssl/dhparam.pem ] || openssl dhparam -out /osixia/slapd/ssl/dhparam.pem 2048
  39. # fix file permissions
  40. chown -R openldap:openldap /osixia/slapd
  41. }
  42. BOOTSTRAP=false
  43. # database and config directory are empty -> set bootstrap config
  44. if [ -z "$(ls -A /var/lib/ldap)" ] && [ -z "$(ls -A /etc/ldap/slapd.d)" ]; then
  45. BOOTSTRAP=true
  46. echo "database and config directory are empty"
  47. echo "-> set bootstrap config"
  48. cat <<EOF | debconf-set-selections
  49. slapd slapd/internal/generated_adminpw password ${LDAP_ADMIN_PASSWORD}
  50. slapd slapd/internal/adminpw password ${LDAP_ADMIN_PASSWORD}
  51. slapd slapd/password2 password ${LDAP_ADMIN_PASSWORD}
  52. slapd slapd/password1 password ${LDAP_ADMIN_PASSWORD}
  53. slapd slapd/dump_database_destdir string /var/backups/slapd-VERSION
  54. slapd slapd/domain string ${LDAP_DOMAIN}
  55. slapd shared/organization string ${LDAP_ORGANISATION}
  56. slapd slapd/backend string HDB
  57. slapd slapd/purge_database boolean true
  58. slapd slapd/move_old_database boolean true
  59. slapd slapd/allow_ldap_v2 boolean false
  60. slapd slapd/no_configuration boolean false
  61. slapd slapd/dump_database select when needed
  62. EOF
  63. dpkg-reconfigure -f noninteractive slapd
  64. elif [ -z "$(ls -A /var/lib/ldap)" ] && [ ! -z "$(ls -A /etc/ldap/slapd.d)" ]; then
  65. echo "Error: the database directory (/var/lib/ldap) is empty but not the config directory (/etc/ldap/slapd.d)"
  66. exit 1
  67. elif [ ! -z "$(ls -A /var/lib/ldap)" ] && [ -z "$(ls -A /etc/ldap/slapd.d)" ]; then
  68. echo "the config directory (/etc/ldap/slapd.d) is empty but not the database directory (/var/lib/ldap)"
  69. exit 1
  70. else
  71. # there is an existing database and config
  72. # if the config was bootstraped with TLS
  73. # to avoid error (#6) we check tls files
  74. if [ -e "$WAS_STARTED_WITH_TLS" ]; then
  75. . $WAS_STARTED_WITH_TLS
  76. check_tls_files $PREVIOUS_SSL_CA_CRT_FILENAME $PREVIOUS_SSL_CRT_FILENAME $PREVIOUS_SSL_KEY_FILENAME
  77. fi
  78. fi
  79. # start OpenLDAP
  80. echo "Starting openldap..."
  81. slapd -h "ldapi:///" -u openldap -g openldap
  82. echo "ok"
  83. # set bootstrap config part 2
  84. if $BOOTSTRAP; then
  85. # add ppolicy schema if not already exists
  86. ADD_PPOLICY=$(is_new_schema ppolicy)
  87. if [ "$ADD_PPOLICY" -eq 1 ]; then
  88. ldapadd -c -Y EXTERNAL -Q -H ldapi:/// -f /etc/ldap/schema/ppolicy.ldif
  89. fi
  90. # convert schemas to ldif
  91. SCHEMAS=""
  92. for f in $(find /osixia/slapd/config/bootstrap/schema -name \*.schema -type f); do
  93. SCHEMAS="$SCHEMAS ${f}"
  94. done
  95. /osixia/slapd/schema-to-ldif.sh "$SCHEMAS"
  96. # add schemas
  97. for f in $(find /osixia/slapd/config/bootstrap/schema -name \*.ldif -type f); do
  98. echo "Processing file ${f}"
  99. # add schema if not already exists
  100. SCHEMA=$(basename "${f}" .ldif)
  101. ADD_SCHEMA=$(is_new_schema $SCHEMA)
  102. if [ "$ADD_SCHEMA" -eq 1 ]; then
  103. echo "add schema ${SCHEMA}"
  104. ldapadd -c -Y EXTERNAL -Q -H ldapi:/// -f $f
  105. else
  106. echo "schema ${f} already exists"
  107. fi
  108. done
  109. # adapt security config file
  110. get_base_dn
  111. sed -i "s|dc=example,dc=org|$BASE_DN|g" /osixia/slapd/config/bootstrap/security.ldif
  112. # process config files
  113. for f in $(find /osixia/slapd/config/bootstrap -name \*.ldif -type f); do
  114. echo "Processing file ${f}"
  115. ldapmodify -Y EXTERNAL -Q -H ldapi:/// -f $f
  116. done
  117. fi
  118. # TLS config
  119. if [ "${USE_TLS,,}" == "true" ]; then
  120. check_tls_files $SSL_CA_CRT_FILENAME $SSL_CRT_FILENAME $SSL_KEY_FILENAME
  121. # adapt tls ldif
  122. sed -i "s,/osixia/slapd/ssl/ca.crt,/osixia/slapd/ssl/${SSL_CA_CRT_FILENAME},g" /osixia/slapd/config/tls/tls-enable.ldif
  123. sed -i "s,/osixia/slapd/ssl/ldap.crt,/osixia/slapd/ssl/${SSL_CRT_FILENAME},g" /osixia/slapd/config/tls/tls-enable.ldif
  124. sed -i "s,/osixia/slapd/ssl/ldap.key,/osixia/slapd/ssl/${SSL_KEY_FILENAME},g" /osixia/slapd/config/tls/tls-enable.ldif
  125. ldapmodify -Y EXTERNAL -Q -H ldapi:/// -f /osixia/slapd/config/tls/tls-enable.ldif
  126. [[ -f "$WAS_STARTED_WITH_TLS" ]] && rm -f "$WAS_STARTED_WITH_TLS"
  127. touch $WAS_STARTED_WITH_TLS
  128. echo "export PREVIOUS_SSL_CA_CRT_FILENAME=${SSL_CA_CRT_FILENAME}" >> $WAS_STARTED_WITH_TLS
  129. echo "export PREVIOUS_SSL_CRT_FILENAME=${SSL_CRT_FILENAME}" >> $WAS_STARTED_WITH_TLS
  130. echo "export PREVIOUS_SSL_KEY_FILENAME=${SSL_KEY_FILENAME}" >> $WAS_STARTED_WITH_TLS
  131. chmod +x $WAS_STARTED_WITH_TLS
  132. # add localhost route to certificate cn (need docker 1.5.0)
  133. cn=$(openssl x509 -in /osixia/slapd/ssl/$SSL_CRT_FILENAME -subject -noout | sed -n 's/.*CN=\(.*\)\/*\(.*\)/\1/p')
  134. echo "127.0.0.1 $cn" >> /etc/hosts
  135. # local ldap tls client config
  136. sed -i "s,TLS_CACERT.*,TLS_CACERT /osixia/slapd/ssl/${SSL_CA_CRT_FILENAME},g" /etc/ldap/ldap.conf
  137. else
  138. [[ -f "$WAS_STARTED_WITH_TLS" ]] && rm -f "$WAS_STARTED_WITH_TLS"
  139. ldapmodify -c -Y EXTERNAL -Q -H ldapi:/// -f /osixia/slapd/config/tls/tls-disable.ldif || true
  140. fi
  141. # replication config
  142. if [ "${USE_REPLICATION,,}" == "true" ]; then
  143. else
  144. # disable replication
  145. for f in $(find /osixia/slapd/config/replication -name \*-disable.ldif -type f); do
  146. echo "Processing file ${f}"
  147. ldapmodify -Y EXTERNAL -Q -H ldapi:/// -f $f
  148. done
  149. fi
  150. # stop OpenLDAP
  151. kill -INT `cat /run/slapd/slapd.pid`
  152. touch $FIRST_START_DONE
  153. fi
  154. exit 0