#   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.
rpm.prefix=/usr/local
rpm.conf.dir=/usr/local/chukwa/conf
hadoop.conf=/usr/local/hadoop
rpm.uid=chukwa
rpm.hdfsusage.uid=chukwa
rpm.gid=users
test.exclude=TestDatabase*
CHUKWA_LOG_DIR=/usr/local/chukwa/var/log

TODO-ALERT-EMAIL=user@example.com
TODO-CLUSTER-NAME=chukwa
TODO-COLLECTORS-NAMENODE=hdfs://localhost:9000/
TODO-COLLECTORS-ROTATEINTERVAL=300000
TODO-COLLECTORS-PORT=8080
TODO-JAVA-HOME=/usr/lib/j2sdk1.5-sun
TODO-HADOOP-HOME=/home/user/Development/hadoop-trunk
TODO-HADOOP-CONF-DIR=/home/user/Development/hadoop-conf
TODO-CHUKWA_PID_DIR=/tmp/chukwa/pidDir
TODO-CHUKWA_LOG_DIR=/tmp/chukwa/log
TODO-AGENTS-INSTANCE-NAME=chukwa
TODO_CHUKWA_JDBC_DRIVER=
TODO_CHUKWA_JDBC_URL_PREFIX=
TODO-NAGIOS-SERVER=localhost
