container-start.sh 9.0 KB

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