#
#   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
