#
#   Licensed to the Apache Software Foundation (ASF) under one
#   or more contributor license agreements.  See the NOTICE file
#   distributed with this work for additional information
#   regarding copyright ownership.  The ASF licenses this file
#   to you under the Apache License, Version 2.0 (the
#   "License"); you may not use this file except in compliance
#   with the License.  You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
#   Unless required by applicable law or agreed to in writing,
#   software distributed under the License is distributed on an
#   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
#   KIND, either express or implied.  See the License for the
#   specific language governing permissions and limitations
#   under the License.
#
#
# This file contains configuration information for Symas OpenLDAP.
# Refer to the comments just before each variable to determine proper
# settings.
#
# 
# RUN_SLAPD - Control the ldap server daemon.
# A value of Y will cause the ldap server daemon to be started.
# Any other value will prevent it from being started.
RUN_SLAPD=Y

# SLAPD_USER, SLAPD_GROUP - Set the user group id of the ldap
# server daemon. Generally these are best left set to root,but
# some folks like to change the ID for security reasons. If you
# do this, make sure the various directories and files used by
# slapd have the appropriate access permissions.
SLAPD_USER=root
SLAPD_GROUP=root

#
# HOST_LIST - The list of listeners the ldap demon should start.
# The value needs to be a quoted, space-separated list of ldap
# URIs. For example:
#      HOST_LIST="ldap:/// ldaps:/// ldapi:///"
# will cause the ldap daemon to start a standard ldap listener
# on port 389, an SSL listener on port 636, and a listener on
# a UNIX domain socket.
HOST_LIST="@LDAP_URIS@"

# EXTRA_SLAPD_ARGS - Extra arguments for slapd. Use this variable
# to hold extra flags and parameters for the slapd command line.
# For example, to specify the location of the dynamic config
# directory:
# EXTRA_SLAPD_ARGS="-F /opt/symas/etc/openldap/slapd.d"
EXTRA_SLAPD_ARGS=

#
# SOL_PRELOAD - Pre-load a library when starting slapd. Use this
# variable to specify a library to be pre-loaded when starting
# slapd. The most common use for this is to use alternate memory
# allocation libraries, such as libtcmalloc.
# For example, use the following statement to use the libtcmalloc
# allocator:
# SOL_PRELOAD=/opt/symas/lib64/libtcmalloc.so
#SOL_PRELOAD=

#
# SLAPD_TIMEOUT - How long to wait for slapd to exit when stopping, in
# seconds.
SLAPD_TIMEOUT=60

#
# BIN and LIB - select which binaries and libraries to use,
# for architectures where several possible ABIs may be available.
BIN=/opt/symas/bin
LIB=/opt/symas/lib64
