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

logsearch.solr.zk_connect_string={{zookeeper_quorum}}{{infra_solr_znode}}

# Service Logs
logsearch.solr.collection.service.logs={{logsearch_solr_collection_service_logs}}

logsearch.service.logs.split.interval.mins={{logsearch_service_logs_split_interval_mins}}
logsearch.collection.service.logs.numshards={{logsearch_collection_service_logs_numshards}}
logsearch.collection.service.logs.replication.factor={{logsearch_collection_service_logs_replication_factor}}

logsearch.service.logs.fields={{logsearch_service_logs_fields}}

# Audit logs
logsearch.solr.audit.logs.zk_connect_string={{logsearch_solr_audit_logs_zk_quorum}}{{logsearch_solr_audit_logs_zk_node}}
logsearch.solr.collection.audit.logs={{logsearch_solr_collection_audit_logs}}
logsearch.solr.audit.logs.url=

logsearch.audit.logs.split.interval.mins={{logsearch_audit_logs_split_interval_mins}}
logsearch.collection.audit.logs.numshards={{logsearch_collection_audit_logs_numshards}}
logsearch.collection.audit.logs.replication.factor={{logsearch_collection_audit_logs_replication_factor}}

# History logs
logsearch.solr.collection.history=history
logsearch.solr.history.config.name=history
logsearch.collection.history.replication.factor=1

# Metrics
logsearch.solr.metrics.collector.hosts={{logsearch_solr_metrics_collector_hosts}}
logsearch.solr.jmx.port={{infra_solr_jmx_port}}

# Logfeeder Settings

logsearch.logfeeder.include.default.level={{logsearch_logfeeder_include_default_level}}

# logsearch-admin.json
logsearch.auth.file.enable=true
logsearch.login.credentials.file={{logsearch_admin_credential_file}}

logsearch.auth.ldap.enable=false
logsearch.auth.simple.enable=false

logsearch.auth.external_auth.enable={{logsearch_auth_external_enabled}}
logsearch.auth.external_auth.host_url={{logsearch_auth_external_host_url}}
logsearch.auth.external_auth.login_url={{logsearch_auth_external_login_url}}
logsearch.roles.allowed=AMBARI.ADMINISTRATOR

logsearch.protocol={{logsearch_ui_protocol}}

# Custom properties
{% for key, value in logsearch_custom_properties.items() %}
{{key}}={{value}}
{% endfor %}

{% if security_enabled -%}
logsearch.solr.kerberos.enable=true
logsearch.solr.jaas.file={{logsearch_jaas_file}}
{% endif %}

