#!/bin/bash

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

# This script automates setup of distcc servers on Ubuntu and CentOS. It has been tested
# on Ubuntu 14.04 and 16.04 and CentOS 6 and 7. See bin/distcc/README.md for manual setup
# instructions and background.
#
# Usage:
# ------
# This script assumes that the Impala repository is checked out and that the
# toolchain has been bootstrapped in the toolchain subdirectory of the impala
# repository.
#
# The script expects to be run as root and requires that the user specify a range of
# IPs that it should accept connections from. E.g. To configure a distcc server that
# accepts connections from the 172.* private IP address block. The IP address argument
# is forwarded to the --allow flag of distccd.
#
#   sudo ./bin/distcc/distcc_server_setup.sh 172.16.0.0/12
#
# Multiple networks can be allowed by providing a space-separated list:
#
#   sudo ./bin/distcc/distcc_server_setup.sh "172.16.0.0/12 10.16.0.0/8"
#
# Environment overrides:
# ---------------------
# CCACHE_DIR: directory to use for distccd's ccache.
# CCACHE_SIZE: size of ccache, passed to ccache's -M option
set -eu -o pipefail

# Find the absolute path to repo root.
export IMPALA_HOME=$(cd "$(dirname "$0")/../.."; pwd)

. $IMPALA_HOME/bin/report_build_error.sh
setup_report_build_error

if [[ $# != 1 ]]; then
  echo "Usage: $0 <allowed IP address range>"
  exit 1
fi
set -x
ALLOWED_NETS=$1

LSB_ID=$(lsb_release -is)
LSB_VERSION=$(lsb_release -rs)
if [[ "$LSB_ID" == Ubuntu ]]; then
  if ! [[ $LSB_VERSION == 14.04 || $LSB_VERSION == 16.04 ]]; then
    echo "This script only supports Ubuntu 14.04 and 16.04" >&2
    exit 1
  fi
  LINUX_FLAVOUR=ubuntu
  DISTCCD_USER=distccd
  DISTCCD_SERVICE=distcc
elif [[ "$LSB_ID" == CentOS ]]; then
  if ! [[ $LSB_VERSION == 6.* || $LSB_VERSION = 7.* ]]; then
    echo "This script only supports CentOS 6 and 7" >&2
    exit 1
  fi
  LINUX_FLAVOUR=redhat
  DISTCCD_USER=nobody
  DISTCCD_SERVICE=distccd
else
  echo "This script only supports Ubuntu and CentOS" >&2
  exit 1
fi

echo "Installing required packages"
if [[ $LINUX_FLAVOUR = ubuntu ]]; then
  apt-get install --yes distcc ccache
else
  yum install -y distcc-server ccache
fi

echo "Configuring ccache for distccd user"
export CCACHE_DIR=${CCACHE_DIR-/opt/ccache}
CCACHE_SIZE=${CCACHE_SIZE:-25G}
mkdir -p "${CCACHE_DIR}"
chown ${DISTCCD_USER} "${CCACHE_DIR}"
HOME=${CCACHE_DIR} sudo -E -u ${DISTCCD_USER} ccache -M "${CCACHE_SIZE}"

echo "Configuring distcc"
if [[ $LINUX_FLAVOUR = ubuntu ]]; then
  cat << EOF >> /etc/default/distcc
# BEGIN: Settings automatically generated by distcc_server_setup.sh
STARTDISTCC="true"
ALLOWEDNETS="${ALLOWED_NETS}"
LISTENER="0.0.0.0"
JOBS=$(nproc)
# CCACHE_DIR is picked up by ccache from environment.
export CCACHE_DIR=${CCACHE_DIR}
# END: Settings automatically generated by distcc_server_setup.sh
EOF
else
  ALLOWED_NETS_ARGS=
  for allowed_net in $ALLOWED_NETS; do
    ALLOWED_NETS_ARGS+=" --allow ${allowed_net}"
  done
  cat << EOF >> /etc/sysconfig/distccd
# BEGIN: Settings automatically generated by distcc_server_setup.sh
OPTIONS="--jobs $(($(nproc) * 2)) ${ALLOWED_NETS_ARGS} --log-level=warn --nice=-15"
# CCACHE_DIR is picked up by ccache from environment. CentOS 6 requires CCACHE_DIR to
# be exported while CentOS 7 seems to ignore the "export VAR=val" syntax.
CCACHE_DIR=${CCACHE_DIR}
export CCACHE_DIR
# END: Settings automatically generated by distcc_server_setup.sh
EOF
fi
service ${DISTCCD_SERVICE} restart

echo "Symlinking /opt/Impala-Toolchain to default toolchain location"
ln -f -s -T "${IMPALA_HOME}/toolchain" /opt/Impala-Toolchain
