#!/bin/bash

CONFFILE="/etc/ipfixprobe/$1.conf"

if [ -e "$CONFFILE" ]; then
   source "$CONFFILE"
   input=""
   dpdkinput=""
   if [ "$USE_DPDK" = "1" ]; then
      # check
      if [ -z "$DPDK_QUEUES_COUNT" ]; then
         echo "Missing DPDK_QUEUES_COUNT in configuration of DPDK mode."
         exit 1
      fi

      if [ ! -z "$DPDK_LCORES" ]; then
         DPDK_LCORES="--lcores $DPDK_LCORES"
      fi

      if [ -n "$DPDK_OPTS" -a "${DPDK_OPTS:0:1}" != ";" ]; then
         DPDK_OPTS=";$DPDK_OPTS"
      fi

      # create array with input workers affinities
      if [ ! -z "$DPDK_INPUT_WORKER_CPUS" ]; then
         if `declare -p DPDK_INPUT_WORKER_CPUS > /dev/null 2>/dev/null`; then
            if [ "${#DPDK_INPUT_WORKER_CPUS[@]}" -ne "$DPDK_QUEUES_COUNT" ]; then
               echo "DPDK_INPUT_WORKER_CPUS length must be the same as queues count."
               exit 1
            fi
         fi
      fi
      for ((i = 0; i < DPDK_QUEUES_COUNT; i++)); do
         if [ ! -z "$DPDK_INPUT_WORKER_CPUS" ]; then
            affinities[i]="@${DPDK_INPUT_WORKER_CPUS[$i]}"
         else
            affinities[i]=""
         fi
      done

      # set up DPDK interface(s)
      if [ "$DPDK_RING" = "1" ]; then
         # checks
         if [ -z "$DPDK_RING_PATTERN" ]; then
            echo "Missing DPDK_RING_PATTERN in configuration of DPDK_RING mode."
            exit 1
         fi
         if [ -z "$DPDK_RING_STARTIDX" ]; then
            echo "Missing DPDK_RING_STARTIDX in configuration of DPDK_RING mode, using 0."
            DPDK_RING_STARTIDX=0
         fi
         
         # mring interfaces
         dpdkinput=("-i" "dpdk-ring${affinities[0]};r=$(printf "$DPDK_RING_PATTERN" "$DPDK_RING_STARTIDX")${DPDK_OPTS};e=$DPDK_LCORES $DPDK_EXTRA_EAL")
         plugin_idx=1
         for ((ifc=($DPDK_RING_STARTIDX+1); ifc<($DPDK_RING_STARTIDX + $DPDK_QUEUES_COUNT);ifc++)); do
            dpdkinput+=("-i" "dpdk-ring${affinities[$plugin_idx]};r=$(printf "$DPDK_RING_PATTERN" "$ifc")")
            ((plugin_idx++))
         done
      else
         # DPDK port interface
         dpdkinput=("-i" "dpdk${affinities[0]};p=${DPDK_PORT}${DPDK_OPTS};q=$DPDK_QUEUES_COUNT;e=$DPDK_LCORES $DPDK_EXTRA_EAL -a $DPDK_DEVICE")
         for ((ifc=1; ifc<$DPDK_QUEUES_COUNT;ifc++)); do
            dpdkinput+=("-i" "dpdk${affinities[$ifc]}")
         done
      fi
   fi
   if `declare -p INPUT > /dev/null 2>/dev/null`; then
      # list of input plugins
      for ifc in "${!INPUT[@]}"; do
         input="$input -i ${INPUT[ifc]}"
      done
   fi
   CACHE_SIZE_PARAM=""
   if [ ! -z ${CACHE_SIZE+x} ]; then
      CACHE_SIZE_PARAM="size=${CACHE_SIZE}"
   fi
   CACHE_ACTIVET_PARAM=""
   if [ ! -z ${ACTIVE_TIMEOUT+x} ]; then
      CACHE_ACTIVET_PARAM=";active=${ACTIVE_TIMEOUT}"
   fi
   CACHE_INACTIVE_PARAM=""
   if [ ! -z ${INACTIVE_TIMEOUT+x} ]; then
      CACHE_INACTIVE_PARAM=";inactive=${INACTIVE_TIMEOUT}"
   fi
   CACHE_FRAG_ENABLE_PARAM=""
   if [ ! -z ${FRAG_CACHE_ENABLE+x} ]; then
      CACHE_FRAG_ENABLE_PARAM=";frag-enable=${FRAG_CACHE_ENABLE}"
   fi
   CACHE_FRAG_SIZE=""
   if [ ! -z ${FRAG_CACHE_SIZE+x} ]; then
      CACHE_FRAG_SIZE=";frag-size=${FRAG_CACHE_SIZE}"
   fi
   CACHE_FRAG_TIMEOUT=""
   if [ ! -z ${FRAG_CACHE_TIMEOUT+x} ]; then
      CACHE_FRAG_TIMEOUT=";frag-timeout=${FRAG_CACHE_TIMEOUT}"
   fi
   storage="-s cache;${CACHE_SIZE_PARAM}${CACHE_ACTIVET_PARAM}${CACHE_INACTIVE_PARAM}${CACHE_FRAG_ENABLE_PARAM}${CACHE_FRAG_SIZE}${CACHE_FRAG_TIMEOUT}"
   process=""
   if `declare -p PROCESS > /dev/null 2>/dev/null`; then
      # list of input plugins
      for ifc in "${!PROCESS[@]}"; do
         process="$process -p ${PROCESS[ifc]}"
      done
   fi
   UDP_PARAM=""
   if [[ $UDP == "yes" ]]; then
        UDP_PARAM="udp";
   fi

   NON_BLOCKING_TCP_PARAM=""
   if [[ $NON_BLOCKING_TCP == "yes" ]]; then
        NON_BLOCKING_TCP_PARAM="non-blocking-tcp";
   fi

   output_affinity=""
   if [ ! -z "$OUTPUT_WORKER_CPU" ]; then
      output_affinity="@$OUTPUT_WORKER_CPU"
   fi

   LZ4_COMPRESSION_PARAM=""
   if [[ $LZ4_COMPRESSION == "yes" ]]; then
        LZ4_COMPRESSION_PARAM="lz4-compression";
   fi

   output="-o ipfix$output_affinity;host=${HOST:-127.0.0.1};port=${PORT:-4739};id=${LINK:-0};dir=${DIR:-0};${UDP_PARAM};${NON_BLOCKING_TCP_PARAM};${LZ4_COMPRESSION_PARAM};template=${TEMPLATE_REFRESH_RATE:-300}"

   telemetry=""
   if [ "$USE_FUSE" = "1" ]; then
      telemetry="-t ${FUSE_MOUNT_POINT}"
   fi

   exec /usr/bin/ipfixprobe "${dpdkinput[@]}" $input $storage $process $output $telemetry $EXTRA_ARGS
else
   echo "Configuration file '$CONFFILE' does not exist, exitting." >&2
   exit 1
fi
