#!/bin/bash

set -e
trap '[ "$?" != "0" ] && echo "$CUR_ACTION failed"' EXIT

CUR_ACTION=""

function usage ()
{
    cat << EOF
Datadog Host Injection Installer
Usage :  $0 [options]

    Options:
    -h|--help             OPTIONAL Display this message
    --dry-run             OPTIONAL Do not make any changes. Print actions that would happen
    --uninstall           OPTIONAL Remove installation
    --no-config-change    OPTIONAL Do not alter datadog.yaml
    --no-agent-restart    OPTIONAL Do not restart the datadog agent
EOF

}

source /opt/datadog/apm/inject/common_functions.sh

if [ -z "$uninstall_flag" ]; then
  if id dd-agent &>/dev/null; then
    if [ ! -d /opt/datadog/apm/inject/run ] ; then
      $sudo_cmd sh -c "mkdir -p /opt/datadog/apm/inject/run"
      $sudo_cmd sh -c "chown -R root:root /opt/datadog/apm/inject/run"
      $sudo_cmd sh -c "chmod -R 777 /opt/datadog/apm/inject/run"
    elif [ "$($sudo_cmd_test sh -c 'stat -c %U:%G /opt/datadog/apm/inject/run')" != "root:root" ] ; then
      $sudo_cmd sh -c "chown -R root:root /opt/datadog/apm/inject/run"
      $sudo_cmd sh -c "chmod -R 777 /opt/datadog/apm/inject/run"
    fi
  else
    echo "Datadog agent installation not found. LD Preload injection only works with an installed agent. Aborting!"
    exit_error
  fi

  CUR_ACTION="checking if launcher.preload.so is already in /etc/ld.so.preload"
  if [ ! -f /etc/ld.so.preload ] || ! grep -q "$BINARY_INSTALL_PATH/launcher.preload.so" /etc/ld.so.preload; then
    # Add preload launcher
    CUR_ACTION="adding launcher.preload.so to /etc/ld.so.preload"
    # inserting a blank line
    $sudo_cmd sh -c "echo \"\" >> /etc/ld.so.preload"
    $sudo_cmd sh -c "echo \"$BINARY_INSTALL_PATH/launcher.preload.so\" >> /etc/ld.so.preload"
    $sudo_cmd sh -c "chmod a+r /etc/ld.so.preload"
    echo "Added preload config to /etc/ld.so.preload"
  fi

  # Add UDS config
  CUR_ACTION="checking if datadog.yaml has the single step configuration"
  if [ -z "$no_config_change" ] && [ -f /etc/datadog-agent/datadog.yaml ] && ! $sudo_cmd_test sh -c 'grep -q "# BEGIN LD PRELOAD CONFIG" /etc/datadog-agent/datadog.yaml' ; then
    CUR_ACTION="updating datadog.yaml"
    $sudo_cmd sh -c "exec cat >> /etc/datadog-agent/datadog.yaml"<<EOF
# BEGIN LD PRELOAD CONFIG
apm_config:
  receiver_socket: /opt/datadog/apm/inject/run/apm.socket
use_dogstatsd: true
dogstatsd_socket: /opt/datadog/apm/inject/run/dsd.socket
remote_configuration:
  enabled: true
# END LD PRELOAD CONFIG
EOF
    echo "Added UDS config to /etc/datadog-agent/datadog.yaml"
  fi
else
  # NOTE: sed -i does not work on macos

  # Remove launcher line from preload config
  CUR_ACTION="checking if launcher.preload.so is in /etc/ld.so.preload"
  if [ -f /etc/ld.so.preload ] && $sudo_cmd_test sh -c "grep -q '$BINARY_INSTALL_PATH/launcher.preload.so' /etc/ld.so.preload" ; then
    CUR_ACTION="removing launcher.preload.so from /etc/ld.so.preload"
    $sudo_cmd sh -c "sed -i '\#$BINARY_INSTALL_PATH/launcher.preload.so#d' /etc/ld.so.preload"

    echo "Removed preload config from /etc/ld.so.preload"

    # Remove file if empty
    CUR_ACTION="checking if /etc/ld.so.preload is empty"
    if [ "$(wc -w < /etc/ld.so.preload)" -eq 0 ]; then
      echo "deleting /etc/ld.so.preload"
      CUR_ACTION="deleting /etc/ld.so.preload"
      $sudo_cmd sh -c "rm /etc/ld.so.preload"
    fi
  fi

  CUR_ACTION="checking if datadog.yaml has the single step configuration"
  if [ -z "$no_config_change" ] && [ -f /etc/datadog-agent/datadog.yaml ] && $sudo_cmd_test sh -c 'grep -q "# BEGIN LD PRELOAD CONFIG" /etc/datadog-agent/datadog.yaml'; then
    # Remove config block from datadog.yaml
    CUR_ACTION="removing single step configuration from datadog.yaml"
    $sudo_cmd sh -c "sed -i '/# BEGIN LD PRELOAD CONFIG/,/# END LD PRELOAD CONFIG/d' /etc/datadog-agent/datadog.yaml"
    echo "Removed UDS config from /etc/datadog-agent/datadog.yaml"
  fi
fi

# Restart happens in both the install and uninstall case
if [ -z "$no_agent_restart" ]; then
  CUR_ACTION="restarting datadog-agent"
  service_control restart datadog-agent
fi

exit_success
