#
#   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
#
#     http://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