#   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-LOCAL-OUTPUT-DIR=/tmp/chukwa/dataSink/
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
TODO-DEMUX-IO-SORT-MB=64
TODO-DEMUX-FS-INMEMORY-SIZE_MB=64
TODO-DEMUX-IO-SORT-FACTOR=10