#!/bin/bash
#
# Copyright 2016 Google Inc.
#
# Licensed 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.
#
# Author: cheesy@google.com (Steve Hill)
#
# Install packages required for building mod_pagespeed.

if [ "$UID" -ne 0 ]; then
  echo Root is required to run this. Re-execing with sudo
  exec sudo $0 "$@"
  exit 1  # NOTREACHED
fi

additional_dev_packages=false
if [ "${1:-}" = "--additional_dev_packages" ]; then
  additional_dev_packages=true
  shift
fi

if [ $# -ne 0 ]; then
  echo "Usage: $(basename $0) [--additional_dev_packages]" >&2
  exit 1
fi

binary_packages=(subversion httpd gcc-c++ gperf make rpm-build
  glibc-devel at curl-devel expat-devel gettext-devel openssl-devel zlib-devel
  libevent-devel rsync redhat-lsb)
src_packages=()

if "$additional_dev_packages"; then
  binary_packages+=(php php-mbstring autoconf libtool valgrind pcre-devel libuuid-devel)
  src_packages+=(redis-server)
fi

# Which distribution of Scientific Linux gcc to install (5 or 6).
install_sl_gcc=

if version_compare "$(lsb_release -rs)" -ge 7; then
  binary_packages+=(python wget git)
  if "$additional_dev_packages"; then
    binary_packages+=(memcached)
  fi
elif version_compare "$(lsb_release -rs)" -ge 6; then
  install_sl_gcc=6
  binary_packages+=(python wget)
  # gyp runs "git rev-list --all --count" which the CentOS 6 package is too old
  # for.
  src_packages+=(git)
  if "$additional_dev_packages"; then
    binary_packages+=(memcached)
  fi
else
  install_sl_gcc=5
  # Note that wget of git doesn't work on CentOS 5 due to it having an ancient
  # OpenSSL. You need to manually scp up the contents of $GIT_SRC_URL from
  # shell_utils.sh.
  src_packages+=(python2.7 wget git)
  if "$additional_dev_packages"; then
    src_packages+=(memcached)
  fi
fi

# Are we installing gcc from Scientific Linux?
if [ -n "$install_sl_gcc" ]; then
  # The signing cert is the same for all versions.
  curl -o /etc/pki/rpm-gpg/RPM-GPG-KEY-cern \
    https://linux.web.cern.ch/linux/scientific6/docs/repository/cern/slc6X/i386/RPM-GPG-KEY-cern
  rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-cern
  # We have to use curl; wget can't parse their SAN.
  curl -o /etc/yum.repos.d/slc${install_sl_gcc}-devtoolset.repo \
    https://linux.web.cern.ch/linux/scientific${install_sl_gcc}/docs/repository/cern/devtoolset/slc${install_sl_gcc}-devtoolset.repo
  binary_packages+=(devtoolset-2-gcc-c++ devtoolset-2-binutils)
fi

yum -y install "${binary_packages[@]}"

# Make sure atd started after installation.
/etc/init.d/atd start || true

# To build on Centos 5/6 we need gcc 4.8 from Scientific Linux.  We can't
# export CC and CXX because some steps still use a literal "g++", but #$%^
# devtoolset includes its own sudo, and we don't want that because it doesn't
# support -E, so rename it if it exists.
DEVTOOLSET_BIN=/opt/rh/devtoolset-2/root/usr/bin/
if [ -e "$DEVTOOLSET_BIN/sudo" ]; then
  mv "$DEVTOOLSET_BIN/sudo" "$DEVTOOLSET_BIN/sudo.ignored"
fi

# At least CentOS 5 puts the Include directives before it sets the LogLevel,
# but we set LogLevel in pagespeed.conf because some of our tests depend on it.
# If httpd.conf sets LogLevel after any includes, move the LogLevel before the
# first Include.
httpd_conf=/etc/httpd/conf/httpd.conf
include_line_number="$(grep -En '^Include[[:space:]]' $httpd_conf | cut -d: -f 1 | head -n 1)"
loglevel_plus_line_number="$(grep -En '^LogLevel[[:space:]]' $httpd_conf | tail -n 1)"
loglevel_line_number="${loglevel_plus_line_number%%:*}"

if [ -n "$include_line_number" -a -n "$loglevel_line_number" ] && \
   [ "$include_line_number" -lt "$loglevel_line_number" ]; then
  loglevel_line="${loglevel_plus_line_number#*:}"
  # Comment out all LoglLevel lines but insert the last one found before the first Include.
  sed -i.pagespeed_bak "s/^LogLevel[[:space:]]/#&/; 0,/^Include/s//$loglevel_line\\n&/" $httpd_conf
fi

# src_packages might be empty. The below placates set -u, see:
# http://stackoverflow.com/questions/7577052/bash-empty-array-expansion-with-set-u
install_from_src ${src_packages[@]+"${src_packages[@]}"}

# Start memcached if it was installed from source
# TODO(cheesy): This should probably happen as part of the test setup, though
# the tests expect it to have been started by initscripts.
if [ -e /usr/local/bin/memcached ]; then
  /usr/local/bin/memcached -d -u nobody -m 512 -p 11211 127.0.0.1
fi
