#!/usr/bin/env 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 shell script detects the OS we're on, and sets a number
# of environment variables the calling script can use.

# It uses the systemd standard of variables, and attempts to
# populate some of the variables manually if systemd is not
# present on the underlying OS.

# Example systemd /etc/os-release file:
# NAME="Ubuntu"
# VERSION="16.04.4 LTS (Xenial Xerus)"
# ID=ubuntu
# ID_LIKE=debian
# PRETTY_NAME="Ubuntu 16.04.4 LTS"
# VERSION_ID="16.04"
# HOME_URL="http://www.ubuntu.com/"
# SUPPORT_URL="http://help.ubuntu.com/"
# BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
# VERSION_CODENAME=xenial
# UBUNTU_CODENAME=xenial

# While these scripts are primarily written to support building CI
# Docker images, they can be used on any workstation to install a
# suitable build environment.

# stop on error
set -e

case "${OSTYPE}" in
  linux*)
    echo "Detected OS: Linux"
    # Try the new, systemd-based way first
    . /etc/os-release 2>/dev/null || true
    # then try lsb_release, which might be installed
    # os-release doesn't actually give us everything we want...
    lsb_plat=$(lsb_release -d 2>/dev/null | awk -F"\t" '{print $2}' 2>/dev/null)
    if [[ ${lsb_plat} ]]; then
      if [[ ${lsb_plat} =~ "^Debian" ]]; then
        ID=${ID:-debian}
        VERSION_ID=${VERSION_ID:-$(echo ${lsb_plat} | awk '{print $3}' | awk -F'.' '{print $1}')}
        VERSION_CODENAME=${VERSION_CODENAME:-$(echo ${lsb_plat} | awk '{print $4}' | sed 's/[\(\)]//g')}
        DISTRIB_CODENAME=${DISTRIB_CODENAME:-${VERSION_CODENAME}}
      elif  [[ ${lsb_plat} =~ "^Ubuntu" ]]; then
        ID=${ID:-ubuntu}
        VERSION_ID=${VERSION_ID:-$(echo ${lsb_plat} | awk '{print $2}' | awk -F'.' '{print $1}')}
        VERSION_CODENAME=${VERSION_CODENAME:-$(lsb_release -cs)}
        DISTRIB_CODENAME=${DISTRIB_CODENAME:-${VERSION_CODENAME}}
      fi
    fi
    # and finally some rough heuristics
    if [[ -f /etc/redhat-release ]]; then
      # /etc/redhat-release is so inconsistent, we use rpm instead
      rhelish=$(rpm -qa '(redhat|sl|slf|centos|oraclelinux)-release(|-server|-workstation|-client|-computenode)' 2>/dev/null | head -1)
      if [[ $rhelish ]]; then
        ID=${ID:-$(echo ${rhelish} | awk -F'-' '{print tolower($1)}')}
        VERSION_ID=${VERSION_ID:-$(echo ${rhelish} | sed -E 's/([^[:digit:]]+)([[:digit:]]+)(.*)/\2/' )}
        VERSION_CODENAME=${VERSION_CODENAME:-${VERSION_ID}}
        DISTRIB_CODENAME=${VERSION_CODENAME:-${VERSION_ID}}
      fi
    elif [[ -f /etc/debian_version ]]; then
      # Ubuntu keeps changing the format of /etc/os-release's VERSION, and
      # it's numeric, not the codename. Boo.
      # Also, Debian doesn't supply VERSION_CODENAME. Double Boo.
      if [[ ${PRETTY_NAME} =~ "Ubuntu" ]]; then
        # Ubuntu keeps changing the format of /etc/os-release's VERSION, and
        # the codename is buried. Boo. Let's use a fancy regex.
        VERSION_CODENAME=${VERSION_CODENAME:-$(echo ${VERSION} | sed -E 's/([0-9.]+)\W+([A-Za-z\,]+)\W+\(?(\w+)(.*)/\L\3/')}
        DISTRIB_CODENAME=${DISTRIB_CODENAME:-${VERSION_CODENAME}}
      elif [[ ${PRETTY_NAME} =~ "Debian" ]]; then
        VERSION_CODENAME=${VERSION_CODENAME:-$(echo ${VERSION} | sed -E 's/(.*)\(([^\]+)\)/\2/')}
        DISTRIB_CODENAME=${DISTRIB_CODENAME:-${VERSION_CODENAME}}
      else
        echo "Unknown Debian-like OS ${PRETTY_NAME}, aborting..."
        exit 1
      fi
    fi
    if [[ ${ID} && ${VERSION_ID} && ${VERSION_CODENAME} ]]; then
      echo "Detected distribution: ${ID}, version ${VERSION_ID} (${VERSION_CODENAME})"
    else
      echo "Unable to determine Linux distribution! Aborting."
      exit 1
    fi
    ;;

  freebsd*)
    echo "Detected OS: FreeBSD"
    # use userland version
    VERSION=$(freebsd-version -u | cut -d '-' -f1)
    ;;
  *bsd*)
    # TODO: detect netbsd vs. freebsd vs. openbsd?
    echo "Detected OS: BSD - UNSUPPORTED"
    exit 1
    ;;
  darwin*)
    # TODO
    echo "Detected OS: macOS (OSX) - UNSUPPORTED"
    exit 1
    ;;
  solaris*)
    # TODO
    echo "Detected OS: Solaris-like"
    exit 1
    ;;
  msys*)
    # TODO
    echo "Detected OS: Windows (msys)"
    exit 1
    ;;
  cygwin*)
    # TODO
    echo "Detected OS: Windows (cygwin)"
    exit 1
    ;;
  *)
    echo "Unknown OS detected: ${OSTYPE}"
    exit 1
    ;;
esac
