#!/bin/sh

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

cd `dirname ${0}`;

# Get access to Ganglia-wide constants, utilities etc.
source ./gangliaLib.sh

function usage()
{
  cat << END_USAGE
Usage: ${0} [-c <gmondClusterName> [-m]] [-t]

Options:
  -c <gmondClusterName>   The name of the Ganglia Cluster whose gmond configuration we're here to generate.

  -m                      Whether this gmond (if -t is not specified) is the master for its Ganglia 
                          Cluster. Without this, we generate slave gmond configuration.

  -t                      Whether this is a call to generate gmetad configuration (as opposed to the
                          gmond configuration that is generated without this).
END_USAGE
}

function instantiateGmetadConf()
{
  # gmetad utility library.
  source ./gmetadLib.sh;

  generateGmetadConf > ${GMETAD_CONF_FILE};
}

function instantiateGmondConf()
{
  # gmond utility library.
  source ./gmondLib.sh;
 
  gmondClusterName=${1};

  if [ "x" != "x${gmondClusterName}" ]
  then

    createDirectory "${GANGLIA_RUNTIME_DIR}/${gmondClusterName}";
    createDirectory "${GANGLIA_CONF_DIR}/${gmondClusterName}/conf.d";
    
    # Always blindly generate the core gmond config - that goes on every box running gmond. 
    generateGmondCoreConf ${gmondClusterName} > `getGmondCoreConfFileName ${gmondClusterName}`;

    isMasterGmond=${2};

    # Decide whether we want to add on the master or slave gmond config.
    if [ "0" -eq "${isMasterGmond}" ]
    then
      generateGmondSlaveConf ${gmondClusterName} > `getGmondSlaveConfFileName ${gmondClusterName}`;
    else
      generateGmondMasterConf ${gmondClusterName} > `getGmondMasterConfFileName ${gmondClusterName}`;
    fi

  else
    echo "No gmondClusterName passed in, nothing to instantiate";
  fi
}

# main()

gmondClusterName=;
isMasterGmond=0;
configureGmetad=0;

while getopts ":c:mt" OPTION
do
  case ${OPTION} in
    c) 
      gmondClusterName=${OPTARG};
      ;;
    m)
      isMasterGmond=1;
      ;;
    t)
      configureGmetad=1;
      ;;
    ?)
      usage;
      exit 1;
  esac
done

# Initialization.
createDirectory ${GANGLIA_CONF_DIR};
createDirectory ${GANGLIA_RUNTIME_DIR};
# So rrdcached can drop its PID files in here.
chmod a+w ${GANGLIA_RUNTIME_DIR};

if [ -n "${gmondClusterName}" ]
then

  # Be forgiving of users who pass in -c along with -t (which always takes precedence).
  if [ "1" -eq "${configureGmetad}" ]
  then
    instantiateGmetadConf;
  else
    instantiateGmondConf ${gmondClusterName} ${isMasterGmond};
  fi

elif [ "1" -eq "${configureGmetad}" ]
then
  instantiateGmetadConf;
else
  usage;
  exit 2;
fi
