startup.sh 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477
  1. #!/bin/bash -e
  2. set -o pipefail
  3. # set -x (bash debug) if log level is trace
  4. # https://github.com/osixia/docker-light-baseimage/blob/stable/image/tool/log-helper
  5. log-helper level eq trace && set -x
  6. # Reduce maximum number of number of open file descriptors to 1024
  7. # otherwise slapd consumes two orders of magnitude more of RAM
  8. # see https://github.com/docker/docker/issues/8231
  9. ulimit -n $LDAP_NOFILE
  10. # create dir if they not already exists
  11. [ -d /var/lib/ldap ] || mkdir -p /var/lib/ldap
  12. [ -d /etc/ldap/slapd.d ] || mkdir -p /etc/ldap/slapd.d
  13. # fix file permissions
  14. chown -R openldap:openldap /var/lib/ldap
  15. chown -R openldap:openldap /etc/ldap
  16. chown -R openldap:openldap ${CONTAINER_SERVICE_DIR}/slapd
  17. FIRST_START_DONE="${CONTAINER_STATE_DIR}/slapd-first-start-done"
  18. WAS_STARTED_WITH_TLS="/etc/ldap/slapd.d/docker-openldap-was-started-with-tls"
  19. WAS_STARTED_WITH_TLS_ENFORCE="/etc/ldap/slapd.d/docker-openldap-was-started-with-tls-enforce"
  20. WAS_STARTED_WITH_REPLICATION="/etc/ldap/slapd.d/docker-openldap-was-started-with-replication"
  21. WAS_ADMIN_PASSWORD_SET="/etc/ldap/slapd.d/docker-openldap-was-admin-password-set"
  22. LDAP_TLS_CA_CRT_PATH="${CONTAINER_SERVICE_DIR}/slapd/assets/certs/$LDAP_TLS_CA_CRT_FILENAME"
  23. LDAP_TLS_CRT_PATH="${CONTAINER_SERVICE_DIR}/slapd/assets/certs/$LDAP_TLS_CRT_FILENAME"
  24. LDAP_TLS_KEY_PATH="${CONTAINER_SERVICE_DIR}/slapd/assets/certs/$LDAP_TLS_KEY_FILENAME"
  25. LDAP_TLS_DH_PARAM_PATH="${CONTAINER_SERVICE_DIR}/slapd/assets/certs/$LDAP_TLS_DH_PARAM_FILENAME"
  26. # CONTAINER_SERVICE_DIR and CONTAINER_STATE_DIR variables are set by
  27. # the baseimage run tool more info : https://github.com/osixia/docker-light-baseimage
  28. # container first start
  29. if [ ! -e "$FIRST_START_DONE" ]; then
  30. #
  31. # Helpers
  32. #
  33. function get_ldap_base_dn() {
  34. # if LDAP_BASE_DN is empty set value from LDAP_DOMAIN
  35. if [ -z "$LDAP_BASE_DN" ]; then
  36. IFS='.' read -ra LDAP_BASE_DN_TABLE <<< "$LDAP_DOMAIN"
  37. for i in "${LDAP_BASE_DN_TABLE[@]}"; do
  38. EXT="dc=$i,"
  39. LDAP_BASE_DN=$LDAP_BASE_DN$EXT
  40. done
  41. LDAP_BASE_DN=${LDAP_BASE_DN::-1}
  42. fi
  43. # Check that LDAP_BASE_DN and LDAP_DOMAIN are in sync
  44. domain_from_base_dn=$(echo $LDAP_BASE_DN | tr ',' '\n' | sed -e 's/^.*=//' | tr '\n' '.' | sed -e 's/\.$//')
  45. set +e
  46. echo "$domain_from_base_dn" | egrep -q ".*$LDAP_DOMAIN\$"
  47. if [ $? -ne 0 ]; then
  48. log-helper error "Error: domain $domain_from_base_dn derived from LDAP_BASE_DN $LDAP_BASE_DN does not match LDAP_DOMAIN $LDAP_DOMAIN"
  49. exit 1
  50. fi
  51. set -e
  52. }
  53. function is_new_schema() {
  54. local COUNT=$(ldapsearch -Q -Y EXTERNAL -H ldapi:/// -b cn=schema,cn=config cn | grep -c "}$1,")
  55. if [ "$COUNT" -eq 0 ]; then
  56. echo 1
  57. else
  58. echo 0
  59. fi
  60. }
  61. function ldap_add_or_modify (){
  62. local LDIF_FILE=$1
  63. log-helper debug "Processing file ${LDIF_FILE}"
  64. sed -i "s|{{ LDAP_BASE_DN }}|${LDAP_BASE_DN}|g" $LDIF_FILE
  65. sed -i "s|{{ LDAP_BACKEND }}|${LDAP_BACKEND}|g" $LDIF_FILE
  66. sed -i "s|{{ LDAP_DOMAIN }}|${LDAP_DOMAIN}|g" $LDIF_FILE
  67. if [ "${LDAP_READONLY_USER,,}" == "true" ]; then
  68. sed -i "s|{{ LDAP_READONLY_USER_USERNAME }}|${LDAP_READONLY_USER_USERNAME}|g" $LDIF_FILE
  69. sed -i "s|{{ LDAP_READONLY_USER_PASSWORD_ENCRYPTED }}|${LDAP_READONLY_USER_PASSWORD_ENCRYPTED}|g" $LDIF_FILE
  70. fi
  71. if grep -iq changetype $LDIF_FILE ; then
  72. ldapmodify -Y EXTERNAL -Q -H ldapi:/// -f $LDIF_FILE 2>&1 | log-helper debug || ldapmodify -h localhost -p 389 -D cn=admin,$LDAP_BASE_DN -w "$LDAP_ADMIN_PASSWORD" -f $LDIF_FILE 2>&1 | log-helper debug
  73. else
  74. ldapadd -Y EXTERNAL -Q -H ldapi:/// -f $LDIF_FILE |& log-helper debug || ldapadd -h localhost -p 389 -D cn=admin,$LDAP_BASE_DN -w "$LDAP_ADMIN_PASSWORD" -f $LDIF_FILE 2>&1 | log-helper debug
  75. fi
  76. }
  77. #
  78. # Global variables
  79. #
  80. BOOTSTRAP=false
  81. #
  82. # database and config directory are empty
  83. # setup bootstrap config - Part 1
  84. #
  85. if [ -z "$(ls -A -I lost+found --ignore=.* /var/lib/ldap)" ] && \
  86. [ -z "$(ls -A -I lost+found --ignore=.* /etc/ldap/slapd.d)" ]; then
  87. BOOTSTRAP=true
  88. log-helper info "Database and config directory are empty..."
  89. log-helper info "Init new ldap server..."
  90. get_ldap_base_dn
  91. cat <<EOF | debconf-set-selections
  92. slapd slapd/internal/generated_adminpw password ${LDAP_ADMIN_PASSWORD}
  93. slapd slapd/internal/adminpw password ${LDAP_ADMIN_PASSWORD}
  94. slapd slapd/password2 password ${LDAP_ADMIN_PASSWORD}
  95. slapd slapd/password1 password ${LDAP_ADMIN_PASSWORD}
  96. slapd slapd/dump_database_destdir string /var/backups/slapd-VERSION
  97. slapd slapd/domain string ${LDAP_DOMAIN}
  98. slapd shared/organization string ${LDAP_ORGANISATION}
  99. slapd slapd/backend string ${LDAP_BACKEND^^}
  100. slapd slapd/purge_database boolean true
  101. slapd slapd/move_old_database boolean true
  102. slapd slapd/allow_ldap_v2 boolean false
  103. slapd slapd/no_configuration boolean false
  104. slapd slapd/dump_database select when needed
  105. EOF
  106. dpkg-reconfigure -f noninteractive slapd
  107. # RFC2307bis schema
  108. if [ "${LDAP_RFC2307BIS_SCHEMA,,}" == "true" ]; then
  109. log-helper info "Switching schema to RFC2307bis..."
  110. cp ${CONTAINER_SERVICE_DIR}/slapd/assets/config/bootstrap/schema/rfc2307bis.* /etc/ldap/schema/
  111. rm -f /etc/ldap/slapd.d/cn=config/cn=schema/*
  112. mkdir -p /tmp/schema
  113. slaptest -f ${CONTAINER_SERVICE_DIR}/slapd/assets/config/bootstrap/schema/rfc2307bis.conf -F /tmp/schema
  114. mv /tmp/schema/cn=config/cn=schema/* /etc/ldap/slapd.d/cn=config/cn=schema
  115. rm -r /tmp/schema
  116. chown -R openldap:openldap /etc/ldap/slapd.d/cn=config/cn=schema
  117. fi
  118. rm ${CONTAINER_SERVICE_DIR}/slapd/assets/config/bootstrap/schema/rfc2307bis.*
  119. #
  120. # Error: the database directory (/var/lib/ldap) is empty but not the config directory (/etc/ldap/slapd.d)
  121. #
  122. elif [ -z "$(ls -A -I lost+found --ignore=.* /var/lib/ldap)" ] && [ ! -z "$(ls -A -I lost+found --ignore=.* /etc/ldap/slapd.d)" ]; then
  123. log-helper error "Error: the database directory (/var/lib/ldap) is empty but not the config directory (/etc/ldap/slapd.d)"
  124. exit 1
  125. #
  126. # Error: the config directory (/etc/ldap/slapd.d) is empty but not the database directory (/var/lib/ldap)
  127. #
  128. elif [ ! -z "$(ls -A -I lost+found --ignore=.* /var/lib/ldap)" ] && [ -z "$(ls -A -I lost+found --ignore=.* /etc/ldap/slapd.d)" ]; then
  129. log-helper error "Error: the config directory (/etc/ldap/slapd.d) is empty but not the database directory (/var/lib/ldap)"
  130. exit 1
  131. #
  132. # We have a database and config directory
  133. #
  134. else
  135. # try to detect if ldap backend is hdb but LDAP_BACKEND environment variable is mdb
  136. # due to default switch from hdb to mdb in 1.2.x
  137. if [ "${LDAP_BACKEND}" = "mdb" ]; then
  138. if [ -e "/etc/ldap/slapd.d/cn=config/olcDatabase={1}hdb.ldif" ]; then
  139. log-helper warning -e "\n\n\nWarning: LDAP_BACKEND environment variable is set to mdb but hdb backend is detected."
  140. log-helper warning "Going to use hdb as LDAP_BACKEND. Set LDAP_BACKEND=hdb to discard this message."
  141. log-helper warning -e "https://github.com/osixia/docker-openldap#set-your-own-environment-variables\n\n\n"
  142. LDAP_BACKEND="hdb"
  143. fi
  144. fi
  145. fi
  146. if [ "${KEEP_EXISTING_CONFIG,,}" == "true" ]; then
  147. log-helper info "/!\ KEEP_EXISTING_CONFIG = true configration will not be updated"
  148. else
  149. #
  150. # start OpenLDAP
  151. #
  152. # get previous hostname if OpenLDAP was started with replication
  153. # to avoid configuration pbs
  154. PREVIOUS_HOSTNAME_PARAM=""
  155. if [ -e "$WAS_STARTED_WITH_REPLICATION" ]; then
  156. source $WAS_STARTED_WITH_REPLICATION
  157. # if previous hostname != current hostname
  158. # set previous hostname to a loopback ip in /etc/hosts
  159. if [ "$PREVIOUS_HOSTNAME" != "$HOSTNAME" ]; then
  160. echo "127.0.0.2 $PREVIOUS_HOSTNAME" >> /etc/hosts
  161. PREVIOUS_HOSTNAME_PARAM="ldap://$PREVIOUS_HOSTNAME"
  162. fi
  163. fi
  164. # if the config was bootstraped with TLS
  165. # to avoid error (#6) (#36) and (#44)
  166. # we create fake temporary certificates if they do not exists
  167. if [ -e "$WAS_STARTED_WITH_TLS" ]; then
  168. source $WAS_STARTED_WITH_TLS
  169. log-helper debug "Check previous TLS certificates..."
  170. # fix for #73
  171. # image started with an existing database/config created before 1.1.5
  172. [[ -z "$PREVIOUS_LDAP_TLS_CA_CRT_PATH" ]] && PREVIOUS_LDAP_TLS_CA_CRT_PATH="${CONTAINER_SERVICE_DIR}/slapd/assets/certs/$LDAP_TLS_CA_CRT_FILENAME"
  173. [[ -z "$PREVIOUS_LDAP_TLS_CRT_PATH" ]] && PREVIOUS_LDAP_TLS_CRT_PATH="${CONTAINER_SERVICE_DIR}/slapd/assets/certs/$LDAP_TLS_CRT_FILENAME"
  174. [[ -z "$PREVIOUS_LDAP_TLS_KEY_PATH" ]] && PREVIOUS_LDAP_TLS_KEY_PATH="${CONTAINER_SERVICE_DIR}/slapd/assets/certs/$LDAP_TLS_KEY_FILENAME"
  175. [[ -z "$PREVIOUS_LDAP_TLS_DH_PARAM_PATH" ]] && PREVIOUS_LDAP_TLS_DH_PARAM_PATH="${CONTAINER_SERVICE_DIR}/slapd/assets/certs/$LDAP_TLS_DH_PARAM_FILENAME"
  176. ssl-helper $LDAP_SSL_HELPER_PREFIX $PREVIOUS_LDAP_TLS_CRT_PATH $PREVIOUS_LDAP_TLS_KEY_PATH $PREVIOUS_LDAP_TLS_CA_CRT_PATH
  177. [ -f ${PREVIOUS_LDAP_TLS_DH_PARAM_PATH} ] || openssl dhparam -out ${LDAP_TLS_DH_PARAM_PATH} 2048
  178. chmod 600 ${PREVIOUS_LDAP_TLS_DH_PARAM_PATH}
  179. chown openldap:openldap $PREVIOUS_LDAP_TLS_CRT_PATH $PREVIOUS_LDAP_TLS_KEY_PATH $PREVIOUS_LDAP_TLS_CA_CRT_PATH $PREVIOUS_LDAP_TLS_DH_PARAM_PATH
  180. fi
  181. # start OpenLDAP
  182. log-helper info "Start OpenLDAP..."
  183. if log-helper level ge debug; then
  184. slapd -h "ldap://$HOSTNAME $PREVIOUS_HOSTNAME_PARAM ldap://localhost ldapi:///" -u openldap -g openldap -d $LDAP_LOG_LEVEL 2>&1 &
  185. else
  186. slapd -h "ldap://$HOSTNAME $PREVIOUS_HOSTNAME_PARAM ldap://localhost ldapi:///" -u openldap -g openldap
  187. fi
  188. log-helper info "Waiting for OpenLDAP to start..."
  189. while [ ! -e /run/slapd/slapd.pid ]; do sleep 0.1; done
  190. #
  191. # setup bootstrap config - Part 2
  192. #
  193. if $BOOTSTRAP; then
  194. log-helper info "Add bootstrap schemas..."
  195. # add ppolicy schema
  196. ldapadd -c -Y EXTERNAL -Q -H ldapi:/// -f /etc/ldap/schema/ppolicy.ldif 2>&1 | log-helper debug
  197. # convert schemas to ldif
  198. SCHEMAS=""
  199. for f in $(find ${CONTAINER_SERVICE_DIR}/slapd/assets/config/bootstrap/schema -name \*.schema -type f|sort); do
  200. SCHEMAS="$SCHEMAS ${f}"
  201. done
  202. ${CONTAINER_SERVICE_DIR}/slapd/assets/schema-to-ldif.sh "$SCHEMAS"
  203. # add converted schemas
  204. for f in $(find ${CONTAINER_SERVICE_DIR}/slapd/assets/config/bootstrap/schema -name \*.ldif -type f|sort); do
  205. log-helper debug "Processing file ${f}"
  206. # add schema if not already exists
  207. SCHEMA=$(basename "${f}" .ldif)
  208. ADD_SCHEMA=$(is_new_schema $SCHEMA)
  209. if [ "$ADD_SCHEMA" -eq 1 ]; then
  210. ldapadd -c -Y EXTERNAL -Q -H ldapi:/// -f $f 2>&1 | log-helper debug
  211. else
  212. log-helper info "schema ${f} already exists"
  213. fi
  214. done
  215. # set config password
  216. LDAP_CONFIG_PASSWORD_ENCRYPTED=$(slappasswd -s "$LDAP_CONFIG_PASSWORD")
  217. sed -i "s|{{ LDAP_CONFIG_PASSWORD_ENCRYPTED }}|${LDAP_CONFIG_PASSWORD_ENCRYPTED}|g" ${CONTAINER_SERVICE_DIR}/slapd/assets/config/bootstrap/ldif/01-config-password.ldif
  218. # adapt security config file
  219. get_ldap_base_dn
  220. sed -i "s|{{ LDAP_BASE_DN }}|${LDAP_BASE_DN}|g" ${CONTAINER_SERVICE_DIR}/slapd/assets/config/bootstrap/ldif/02-security.ldif
  221. # process config files (*.ldif) in bootstrap directory (do no process files in subdirectories)
  222. log-helper info "Add image bootstrap ldif..."
  223. for f in $(find ${CONTAINER_SERVICE_DIR}/slapd/assets/config/bootstrap/ldif -mindepth 1 -maxdepth 1 -type f -name \*.ldif | sort); do
  224. log-helper debug "Processing file ${f}"
  225. ldap_add_or_modify "$f"
  226. done
  227. # read only user
  228. if [ "${LDAP_READONLY_USER,,}" == "true" ]; then
  229. log-helper info "Add read only user..."
  230. LDAP_READONLY_USER_PASSWORD_ENCRYPTED=$(slappasswd -s $LDAP_READONLY_USER_PASSWORD)
  231. ldap_add_or_modify "${CONTAINER_SERVICE_DIR}/slapd/assets/config/bootstrap/ldif/readonly-user/readonly-user.ldif"
  232. ldap_add_or_modify "${CONTAINER_SERVICE_DIR}/slapd/assets/config/bootstrap/ldif/readonly-user/readonly-user-acl.ldif"
  233. fi
  234. log-helper info "Add custom bootstrap ldif..."
  235. for f in $(find ${CONTAINER_SERVICE_DIR}/slapd/assets/config/bootstrap/ldif/custom -type f -name \*.ldif | sort); do
  236. ldap_add_or_modify "$f"
  237. done
  238. fi
  239. #
  240. # TLS config
  241. #
  242. if [ -e "$WAS_STARTED_WITH_TLS" ] && [ "${LDAP_TLS,,}" != "true" ]; then
  243. log-helper error "/!\ WARNING: LDAP_TLS=false but the container was previously started with LDAP_TLS=true"
  244. log-helper error "TLS can't be disabled once added. Ignoring LDAP_TLS=false."
  245. LDAP_TLS=true
  246. fi
  247. if [ -e "$WAS_STARTED_WITH_TLS_ENFORCE" ] && [ "${LDAP_TLS_ENFORCE,,}" != "true" ]; then
  248. log-helper error "/!\ WARNING: LDAP_TLS_ENFORCE=false but the container was previously started with LDAP_TLS_ENFORCE=true"
  249. log-helper error "TLS enforcing can't be disabled once added. Ignoring LDAP_TLS_ENFORCE=false."
  250. LDAP_TLS_ENFORCE=true
  251. fi
  252. if [ "${LDAP_TLS,,}" == "true" ]; then
  253. log-helper info "Add TLS config..."
  254. # generate a certificate and key with ssl-helper tool if LDAP_CRT and LDAP_KEY files don't exists
  255. # https://github.com/osixia/docker-light-baseimage/blob/stable/image/service-available/:ssl-tools/assets/tool/ssl-helper
  256. ssl-helper $LDAP_SSL_HELPER_PREFIX $LDAP_TLS_CRT_PATH $LDAP_TLS_KEY_PATH $LDAP_TLS_CA_CRT_PATH
  257. # create DHParamFile if not found
  258. [ -f ${LDAP_TLS_DH_PARAM_PATH} ] || openssl dhparam -out ${LDAP_TLS_DH_PARAM_PATH} 2048
  259. chmod 600 ${LDAP_TLS_DH_PARAM_PATH}
  260. # fix file permissions
  261. chown -R openldap:openldap ${CONTAINER_SERVICE_DIR}/slapd
  262. # adapt tls ldif
  263. sed -i "s|{{ LDAP_TLS_CA_CRT_PATH }}|${LDAP_TLS_CA_CRT_PATH}|g" ${CONTAINER_SERVICE_DIR}/slapd/assets/config/tls/tls-enable.ldif
  264. sed -i "s|{{ LDAP_TLS_CRT_PATH }}|${LDAP_TLS_CRT_PATH}|g" ${CONTAINER_SERVICE_DIR}/slapd/assets/config/tls/tls-enable.ldif
  265. sed -i "s|{{ LDAP_TLS_KEY_PATH }}|${LDAP_TLS_KEY_PATH}|g" ${CONTAINER_SERVICE_DIR}/slapd/assets/config/tls/tls-enable.ldif
  266. sed -i "s|{{ LDAP_TLS_DH_PARAM_PATH }}|${LDAP_TLS_DH_PARAM_PATH}|g" ${CONTAINER_SERVICE_DIR}/slapd/assets/config/tls/tls-enable.ldif
  267. sed -i "s|{{ LDAP_TLS_CIPHER_SUITE }}|${LDAP_TLS_CIPHER_SUITE}|g" ${CONTAINER_SERVICE_DIR}/slapd/assets/config/tls/tls-enable.ldif
  268. sed -i "s|{{ LDAP_TLS_VERIFY_CLIENT }}|${LDAP_TLS_VERIFY_CLIENT}|g" ${CONTAINER_SERVICE_DIR}/slapd/assets/config/tls/tls-enable.ldif
  269. ldapmodify -Y EXTERNAL -Q -H ldapi:/// -f ${CONTAINER_SERVICE_DIR}/slapd/assets/config/tls/tls-enable.ldif 2>&1 | log-helper debug
  270. [[ -f "$WAS_STARTED_WITH_TLS" ]] && rm -f "$WAS_STARTED_WITH_TLS"
  271. echo "export PREVIOUS_LDAP_TLS_CA_CRT_PATH=${LDAP_TLS_CA_CRT_PATH}" > $WAS_STARTED_WITH_TLS
  272. echo "export PREVIOUS_LDAP_TLS_CRT_PATH=${LDAP_TLS_CRT_PATH}" >> $WAS_STARTED_WITH_TLS
  273. echo "export PREVIOUS_LDAP_TLS_KEY_PATH=${LDAP_TLS_KEY_PATH}" >> $WAS_STARTED_WITH_TLS
  274. echo "export PREVIOUS_LDAP_TLS_DH_PARAM_PATH=${LDAP_TLS_DH_PARAM_PATH}" >> $WAS_STARTED_WITH_TLS
  275. # enforce TLS
  276. if [ "${LDAP_TLS_ENFORCE,,}" == "true" ]; then
  277. log-helper info "Add enforce TLS..."
  278. ldapmodify -Y EXTERNAL -Q -H ldapi:/// -f ${CONTAINER_SERVICE_DIR}/slapd/assets/config/tls/tls-enforce-enable.ldif 2>&1 | log-helper debug
  279. touch $WAS_STARTED_WITH_TLS_ENFORCE
  280. # disable tls enforcing (not possible for now)
  281. #else
  282. #log-helper info "Disable enforce TLS..."
  283. #ldapmodify -Y EXTERNAL -Q -H ldapi:/// -f ${CONTAINER_SERVICE_DIR}/slapd/assets/config/tls/tls-enforce-disable.ldif 2>&1 | log-helper debug || true
  284. #[[ -f "$WAS_STARTED_WITH_TLS_ENFORCE" ]] && rm -f "$WAS_STARTED_WITH_TLS_ENFORCE"
  285. fi
  286. # disable tls (not possible for now)
  287. #else
  288. #log-helper info "Disable TLS config..."
  289. #ldapmodify -c -Y EXTERNAL -Q -H ldapi:/// -f ${CONTAINER_SERVICE_DIR}/slapd/assets/config/tls/tls-disable.ldif 2>&1 | log-helper debug || true
  290. #[[ -f "$WAS_STARTED_WITH_TLS" ]] && rm -f "$WAS_STARTED_WITH_TLS"
  291. fi
  292. #
  293. # Replication config
  294. #
  295. function disableReplication() {
  296. sed -i "s|{{ LDAP_BACKEND }}|${LDAP_BACKEND}|g" ${CONTAINER_SERVICE_DIR}/slapd/assets/config/replication/replication-disable.ldif
  297. ldapmodify -c -Y EXTERNAL -Q -H ldapi:/// -f ${CONTAINER_SERVICE_DIR}/slapd/assets/config/replication/replication-disable.ldif 2>&1 | log-helper debug || true
  298. [[ -f "$WAS_STARTED_WITH_REPLICATION" ]] && rm -f "$WAS_STARTED_WITH_REPLICATION"
  299. }
  300. if [ "${LDAP_REPLICATION,,}" == "true" ]; then
  301. log-helper info "Add replication config..."
  302. disableReplication || true
  303. i=1
  304. for host in $(complex-bash-env iterate LDAP_REPLICATION_HOSTS)
  305. do
  306. sed -i "s|{{ LDAP_REPLICATION_HOSTS }}|olcServerID: $i ${!host}\n{{ LDAP_REPLICATION_HOSTS }}|g" ${CONTAINER_SERVICE_DIR}/slapd/assets/config/replication/replication-enable.ldif
  307. sed -i "s|{{ LDAP_REPLICATION_HOSTS_CONFIG_SYNC_REPL }}|olcSyncRepl: rid=00$i provider=${!host} ${LDAP_REPLICATION_CONFIG_SYNCPROV}\n{{ LDAP_REPLICATION_HOSTS_CONFIG_SYNC_REPL }}|g" ${CONTAINER_SERVICE_DIR}/slapd/assets/config/replication/replication-enable.ldif
  308. sed -i "s|{{ LDAP_REPLICATION_HOSTS_DB_SYNC_REPL }}|olcSyncRepl: rid=10$i provider=${!host} ${LDAP_REPLICATION_DB_SYNCPROV}\n{{ LDAP_REPLICATION_HOSTS_DB_SYNC_REPL }}|g" ${CONTAINER_SERVICE_DIR}/slapd/assets/config/replication/replication-enable.ldif
  309. ((i++))
  310. done
  311. get_ldap_base_dn
  312. sed -i "s|\$LDAP_BASE_DN|$LDAP_BASE_DN|g" ${CONTAINER_SERVICE_DIR}/slapd/assets/config/replication/replication-enable.ldif
  313. sed -i "s|\$LDAP_ADMIN_PASSWORD|$LDAP_ADMIN_PASSWORD|g" ${CONTAINER_SERVICE_DIR}/slapd/assets/config/replication/replication-enable.ldif
  314. sed -i "s|\$LDAP_CONFIG_PASSWORD|$LDAP_CONFIG_PASSWORD|g" ${CONTAINER_SERVICE_DIR}/slapd/assets/config/replication/replication-enable.ldif
  315. sed -i "/{{ LDAP_REPLICATION_HOSTS }}/d" ${CONTAINER_SERVICE_DIR}/slapd/assets/config/replication/replication-enable.ldif
  316. sed -i "/{{ LDAP_REPLICATION_HOSTS_CONFIG_SYNC_REPL }}/d" ${CONTAINER_SERVICE_DIR}/slapd/assets/config/replication/replication-enable.ldif
  317. sed -i "/{{ LDAP_REPLICATION_HOSTS_DB_SYNC_REPL }}/d" ${CONTAINER_SERVICE_DIR}/slapd/assets/config/replication/replication-enable.ldif
  318. sed -i "s|{{ LDAP_BACKEND }}|${LDAP_BACKEND}|g" ${CONTAINER_SERVICE_DIR}/slapd/assets/config/replication/replication-enable.ldif
  319. ldapmodify -c -Y EXTERNAL -Q -H ldapi:/// -f ${CONTAINER_SERVICE_DIR}/slapd/assets/config/replication/replication-enable.ldif 2>&1 | log-helper debug || true
  320. [[ -f "$WAS_STARTED_WITH_REPLICATION" ]] && rm -f "$WAS_STARTED_WITH_REPLICATION"
  321. echo "export PREVIOUS_HOSTNAME=${HOSTNAME}" > $WAS_STARTED_WITH_REPLICATION
  322. else
  323. log-helper info "Disable replication config..."
  324. disableReplication || true
  325. fi
  326. if [[ -f "$WAS_ADMIN_PASSWORD_SET" ]]; then
  327. get_ldap_base_dn
  328. LDAP_CONFIG_PASSWORD_ENCRYPTED=$(slappasswd -s "$LDAP_CONFIG_PASSWORD")
  329. LDAP_ADMIN_PASSWORD_ENCRYPTED=$(slappasswd -s "$LDAP_ADMIN_PASSWORD")
  330. sed -i "s|{{ LDAP_CONFIG_PASSWORD_ENCRYPTED }}|${LDAP_CONFIG_PASSWORD_ENCRYPTED}|g" ${CONTAINER_SERVICE_DIR}/slapd/assets/config/admin-pw/ldif/06-root-pw-change.ldif
  331. sed -i "s|{{ LDAP_ADMIN_PASSWORD_ENCRYPTED }}|${LDAP_ADMIN_PASSWORD_ENCRYPTED}|g" ${CONTAINER_SERVICE_DIR}/slapd/assets/config/admin-pw/ldif/06-root-pw-change.ldif
  332. sed -i "s|{{ LDAP_BACKEND }}|${LDAP_BACKEND}|g" ${CONTAINER_SERVICE_DIR}/slapd/assets/config/admin-pw/ldif/06-root-pw-change.ldif
  333. sed -i "s|{{ LDAP_ADMIN_PASSWORD_ENCRYPTED }}|${LDAP_ADMIN_PASSWORD_ENCRYPTED}|g" ${CONTAINER_SERVICE_DIR}/slapd/assets/config/admin-pw/ldif/07-admin-pw-change.ldif
  334. sed -i "s|{{ LDAP_BASE_DN }}|${LDAP_BASE_DN}|g" ${CONTAINER_SERVICE_DIR}/slapd/assets/config/admin-pw/ldif/07-admin-pw-change.ldif
  335. for f in $(find ${CONTAINER_SERVICE_DIR}/slapd/assets/config/admin-pw/ldif -type f -name \*.ldif | sort); do
  336. ldap_add_or_modify "$f"
  337. done
  338. else
  339. touch "$WAS_ADMIN_PASSWORD_SET"
  340. fi
  341. #
  342. # stop OpenLDAP
  343. #
  344. log-helper info "Stop OpenLDAP..."
  345. SLAPD_PID=$(cat /run/slapd/slapd.pid)
  346. kill -15 $SLAPD_PID
  347. while [ -e /proc/$SLAPD_PID ]; do sleep 0.1; done # wait until slapd is terminated
  348. fi
  349. #
  350. # ldap client config
  351. #
  352. if [ "${LDAP_TLS,,}" == "true" ]; then
  353. log-helper info "Configure ldap client TLS configuration..."
  354. sed -i --follow-symlinks "s,TLS_CACERT.*,TLS_CACERT ${LDAP_TLS_CA_CRT_PATH},g" /etc/ldap/ldap.conf
  355. echo "TLS_REQCERT ${LDAP_TLS_VERIFY_CLIENT}" >> /etc/ldap/ldap.conf
  356. cp -f /etc/ldap/ldap.conf ${CONTAINER_SERVICE_DIR}/slapd/assets/ldap.conf
  357. [[ -f "$HOME/.ldaprc" ]] && rm -f $HOME/.ldaprc
  358. echo "TLS_CERT ${LDAP_TLS_CRT_PATH}" > $HOME/.ldaprc
  359. echo "TLS_KEY ${LDAP_TLS_KEY_PATH}" >> $HOME/.ldaprc
  360. cp -f $HOME/.ldaprc ${CONTAINER_SERVICE_DIR}/slapd/assets/.ldaprc
  361. fi
  362. #
  363. # remove container config files
  364. #
  365. if [ "${LDAP_REMOVE_CONFIG_AFTER_SETUP,,}" == "true" ]; then
  366. log-helper info "Remove config files..."
  367. rm -rf ${CONTAINER_SERVICE_DIR}/slapd/assets/config
  368. fi
  369. #
  370. # setup done :)
  371. #
  372. log-helper info "First start is done..."
  373. touch $FIRST_START_DONE
  374. fi
  375. ln -sf ${CONTAINER_SERVICE_DIR}/slapd/assets/.ldaprc $HOME/.ldaprc
  376. ln -sf ${CONTAINER_SERVICE_DIR}/slapd/assets/ldap.conf /etc/ldap/ldap.conf
  377. # force OpenLDAP to listen on all interfaces
  378. ETC_HOSTS=$(cat /etc/hosts | sed "/$HOSTNAME/d")
  379. echo "0.0.0.0 $HOSTNAME" > /etc/hosts
  380. echo "$ETC_HOSTS" >> /etc/hosts
  381. exit 0