#/*
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
# * contributor license agreements.  See the NOTICE file distributed with
# * this work for additional information regarding copyright ownership.
# * The OpenAirInterface Software Alliance licenses this file to You under
# * the OAI Public License, Version 1.1  (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.openairinterface.org/?page_id=698
# *
# * 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.
# *-------------------------------------------------------------------------------
# * For more information about the OpenAirInterface (OAI) Software Alliance:
# *      contact@openairinterface.org
# */

# file build_helper
# brief
# authors Laurent Thomas, Lionel GAUTHIER
#
#######################################
if [ ! -f /etc/os-release ]; then
  echo "No /etc/os-release file found. You're likely on an unsupported distro."
  exit -1
fi
OS_DISTRO=$(grep "^ID=" /etc/os-release | sed "s/ID=//" | sed "s/\"//g")
OS_RELEASE=$(grep "^VERSION_ID=" /etc/os-release | sed "s/VERSION_ID=//" | sed "s/\"//g")
case "$OS_DISTRO" in
  fedora) OS_BASEDISTRO="fedora"; INSTALLER="dnf"; CMAKE="cmake" ;;
  rhel)   OS_BASEDISTRO="fedora"; INSTALLER="dnf"; CMAKE="cmake3" ;;
  rocky)  OS_BASEDISTRO="fedora"; INSTALLER="dnf"; CMAKE="cmake" ;;
  centos) OS_BASEDISTRO="fedora"; INSTALLER="dnf"; CMAKE="cmake3" ;; # CentOS Stream
  debian) OS_BASEDISTRO="debian"; INSTALLER="apt-get"; CMAKE="cmake" ;;
  ubuntu) OS_BASEDISTRO="debian"; INSTALLER="apt-get"; CMAKE="cmake" ;;
esac
KERNEL_VERSION=$(uname -r | cut -d '.' -f1)
KERNEL_MAJOR=$(uname -r | cut -d '.' -f2)

#check if we run inside a container
IS_CONTAINER=`grep -E -c "docker|podman|kubepods|libpod|buildah" /proc/self/cgroup || true`
#sudo is not needed when we are root
if [ "$UID" = 0 ]
then
  SUDO=''
else
  SUDO='sudo -S -E'
fi

###############################
## echo and  family
###############################
# only emit color if connected to a terminal, and if it supports colors
if [ -t 1 ]; then
  num_colors=$(tput colors)
  if [ -n "$num_colors" ] && [ "$num_colors" -ge 8 ]; then
    red='\E[31m'
    green='\E[32m'
    yellow='\E[33m'
    blue='\E[1;34m'
    reset_color='\E[00m'
  fi
fi

cecho()  {
    # Color-echo
    # arg1 = message
    # arg2 = color
    local default_msg="No Message."
    message=${1:-$default_msg}
    color=${2:-$green}
    echo -e "$color$message$reset_color"
    return
}

echo_error()   { cecho "$*" $red          ;}
echo_fatal()   { cecho "$*" $red; exit -1 ;}
echo_warning() { cecho "$*" $yellow       ;}
echo_success() { cecho "$*" $green        ;}
echo_info()    { cecho "$*" $blue         ;}

########################
# distribution helpers #
########################

# This function return a string to identify the distribution we are running
# If we can't check the distribution, it returns "Unknown"
# This function return always true as exit code by design
# Examples:
#   debian8.5
get_distribution_release() {
    if [[ ! -z "$OS_DISTRO$OS_RELEASE" ]]; then
        echo "$OS_DISTRO$OS_RELEASE"
    else
        echo Unknown
    fi
}

check_supported_distribution() {
    local distribution=$(get_distribution_release)
    case "$distribution" in
        "ubuntu24.04") return 0 ;;
        "ubuntu22.04") return 0 ;;
        "ubuntu20.04") return 0 ;;
        "debian11")    return 0 ;;
        "fedora41")    return 0 ;;
        "fedora40")    return 0 ;;
        "rhel8.2")     return 0 ;;
        "rhel8.3")     return 0 ;;
        "rhel8.4")     return 0 ;;
        "rhel8.5")     return 0 ;;
        "rhel8.6")     return 0 ;;
        "rhel8.7")     return 0 ;;
        "rhel8.8")     return 0 ;;
        "rhel8.9")     return 0 ;;
        "rhel9.0")     return 0 ;;
        "rhel9.1")     return 0 ;;
        "rhel9.2")     return 0 ;;
        "rhel9.3")     return 0 ;;
        "rhel9.4")     return 0 ;;
        "rhel9.5")     return 0 ;;
        "rhel9.6")     return 0 ;;
        "rhel9.7")     return 0 ;;
        "centos9")     return 0 ;; # CentOS stream
        "rocky8.7")    return 0 ;;
        "rocky8.8")    return 0 ;;
        "rocky8.9")    return 0 ;;
        "rocky9.1")    return 0 ;;
        "rocky9.2")    return 0 ;;
        "rocky9.3")    return 0 ;;
        "rocky9.4")    return 0 ;;
        "rocky9.5")    return 0 ;;
        "rocky9.6")    return 0 ;;
        "rocky9.7")    return 0 ;;
    esac
    return 1
}

##################
# Error handlers #
##################

handler_EXIT() {
	local exit_code=$?
    [ "$exit_code" -eq 0 ] || echo_error "build have failed"
	exit $exit_code
}

trap handler_EXIT EXIT

###########################
# Cleaners
###########################

clean_kernel() {
    $SUDO modprobe ip_tables
    $SUDO modprobe x_tables
    $SUDO iptables -P INPUT ACCEPT
    $SUDO iptables -F INPUT
    $SUDO iptables -P OUTPUT ACCEPT
    $SUDO iptables -F OUTPUT
    $SUDO iptables -P FORWARD ACCEPT
    $SUDO iptables -F FORWARD
    $SUDO iptables -t nat -F
    $SUDO iptables -t mangle -F
    $SUDO iptables -t filter -F
    $SUDO iptables -t raw -F
    echo_info "Flushed iptables"
}

clean_all_files() {
 set_openair_env
 dir=$OPENAIR_DIR/cmake_targets
 rm -rf $dir/ran_build $dir/ran_build_noLOG
 rm -rf $dir/lte-simulators/build 
 rm -rf $dir/oaisim_build_oai/build $dir/oaisim_build_oai/CMakeLists.txt
 rm -rf $dir/autotests/bin $dir/autotests/log $dir/autotests/*/build
}

############################################
# External packages installers
############################################

install_usrp_uhd_driver_from_source(){
    echo_info "\nInstalling UHD driver from sources."
    pushd /tmp
    echo "Cloning UHD driver repository"
    rm -rf /tmp/uhd
    git clone https://github.com/EttusResearch/uhd.git
    cd uhd
    # For our legacy TDD eNB running with a B2xx RF board
    # the following patch has to be applied
    if [[ -v UHD_VERSION ]]; then
        git checkout tags/v${UHD_VERSION}
        # We recommend to use not older than 3.15.0.0
        if [[ "$UHD_VERSION" == "3.15.0.0" ]]; then
            # Tested that patch for the following versions:
            # - 3.15.0.0
            git apply $OPENAIR_DIR/cmake_targets/tools/uhd-3.15-tdd-patch.diff
            ret=$?;[[ $ret -ne 0 ]] && echo_fatal "Could not apply the TDD patch"
        elif [[ "$UHD_VERSION" == "4.8.0.0" || "$UHD_VERSION" == "4.7.0.0" || "$UHD_VERSION" == "4.6.0.0" || "$UHD_VERSION" == "4.5.0.0" ]]; then
            # Tested that patch for the following versions:
            # - 4.7.0.0
            cp $OPENAIR_DIR/cmake_targets/tools/uhd-4.x-tdd-patch.diff $OPENAIR_DIR/cmake_targets/tools/uhd-4.5plus-tdd-patch.diff
            sed -i '9,13 s/STATE_OFF/STATE_RX1_OFF/' $OPENAIR_DIR/cmake_targets/tools/uhd-4.5plus-tdd-patch.diff
            sed -i '24,28 s/STATE_OFF/STATE_RX2_OFF/' $OPENAIR_DIR/cmake_targets/tools/uhd-4.5plus-tdd-patch.diff
            git apply $OPENAIR_DIR/cmake_targets/tools/uhd-4.5plus-tdd-patch.diff
            ret=$?;[[ $ret -ne 0 ]] && echo_fatal "Could not apply the TDD patch"
        else
            # Tested that patch for the following versions:
            # - 4.0.0.0
            # - 4.1.0.0
            # - 4.1.0.5
            # - 4.2.0.0
            # - 4.2.0.1
            # - 4.3.0.0-rc1
            # - 4.4.0.0
            git apply $OPENAIR_DIR/cmake_targets/tools/uhd-4.x-tdd-patch.diff
            ret=$?;[[ $ret -ne 0 ]] && echo_fatal "Could not apply the TDD patch"
        fi
    else
        git checkout tags/v4.0.0.0
        git apply $OPENAIR_DIR/cmake_targets/tools/uhd-4.x-tdd-patch.diff
        ret=$?;[[ $ret -ne 0 ]] && echo_fatal "Could not apply the TDD patch"
    fi
    # Printing out the results of the patch to make sure it was properly applied
    git diff
    mkdir -p host/build
    cd host/build || true
    $CMAKE ../ -GNinja -DENABLE_TESTS=OFF -DENABLE_EXAMPLES=OFF -DENABLE_B100=OFF -DENABLE_DOXYGEN=OFF -DENABLE_MANUAL=OFF -DENABLE_MAN_PAGES=OFF -DENABLE_MAN_PAGE_COMPRESSION=OFF -DENABLE_OCTOCLOCK=ON -DENABLE_USRP1=OFF -DENABLE_USRP2=OFF
    echo "Compiling UHD"
    ninja
    $SUDO ninja install
    $SUDO ldconfig -v
    if [ $IS_CONTAINER -eq 0 ]; then
        if [[ "$OS_DISTRO" == "ubuntu" ]]; then
            $SUDO /usr/local/lib/uhd/utils/uhd_images_downloader.py
        fi
        if [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "rocky" ]]; then
            $SUDO /usr/local/lib64/uhd/utils/uhd_images_downloader.py
        fi
    fi
    popd
    rm -rf /tmp/uhd
}

check_install_usrp_uhd_driver(){
    if [[ "$OS_BASEDISTRO" == "debian" ]]; then
        boost_libs_ubuntu="libboost-chrono-dev libboost-date-time-dev libboost-filesystem-dev libboost-program-options-dev libboost-thread-dev libboost-test-dev libboost-regex-dev"
        #first we remove old installation
        $SUDO apt-get remove uhd* libuhd* -y || true
        v=$(lsb_release -cs)
        $SUDO apt-add-repository --remove "deb http://files.ettus.com/binaries/uhd/repo/uhd/ubuntu/$v $v main"
        if [[ -v BUILD_UHD_FROM_SOURCE ]] || [[ "$OS_DISTRO" == "debian" ]]; then
            $SUDO apt-get install -y $boost_libs_ubuntu libusb-1.0-0-dev doxygen python3-docutils python3-mako python3-numpy python3-requests python3-setuptools ninja-build
            install_usrp_uhd_driver_from_source
            return
        fi
        # The new USRP repository
        # Raphael Defosseux: Adding a loop on adding PPA because in CI the gpg key retrieve may
        # timeout due to proxy / network latencies in Eurecom on VM
        echo_info "\nAdding PPA repository ettusresearch/uhd\n"
        x=0
        while [ $x -le 5 ]
        do
            if $SUDO add-apt-repository ppa:ettusresearch/uhd -y
            then
                echo_info "add-apt-repository successful\n"
                break
            else
                echo_info "add-apt-repository failed, retrying...\n"
                sleep 30
            fi
            x=$((x + 1))
        done
        $SUDO apt-get update
        $SUDO apt-get -y install python-tk  $boost_libs_ubuntu libusb-1.0-0-dev
        case "$(get_distribution_release)" in
          "ubuntu20.04" | "ubuntu22.04")
            $SUDO apt-get -y install libuhd-dev libuhd4.5.0 uhd-host
            ;;
        esac
    elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then
        boost_libs_fedora="boost-chrono boost-date-time boost-filesystem boost-program-options boost-thread boost-test boost-regex boost-devel"
        if [ $IS_CONTAINER -eq 0 ]
        then
            $SUDO $INSTALLER -y install python3 $boost_libs_fedora libusb-devel libusbx-devel  python3-mako python3-docutils python3-pip $CMAKE
            $SUDO pip3 install requests
        else
            $SUDO $INSTALLER -y install $boost_libs_fedora $CMAKE
            $SUDO pip3 install mako requests
        fi
        if [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]] || [[ "$OS_DISTRO" == "rocky" ]]; then
            if [ $IS_CONTAINER -eq 0 ]
            then
                # until EPEL repo hasn't bumped UHD driver to >=3.10 in EPEL, build driver from source
                $SUDO $INSTALLER -y remove uhd uhd-devel uhd-firmware
            fi
            install_usrp_uhd_driver_from_source
        else
            $SUDO $INSTALLER -y install uhd uhd-devel uhd-firmware
        fi
    fi
}

install_usrp_uhd_driver() {
    if [[ "$OS_DISTRO" == "ubuntu" ]]; then
        # We move uhd-host apart because it depends on linux kernel version
        # On newer kernels, it fails to install
        $SUDO apt-get -y install uhd-host
    fi
    # quick workaround for below distributions
    local distribution=$(get_distribution_release)
    if [ -z $1 ]; then
      if [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "rocky" ]] || [[ "$OS_DISTRO" == "centos" ]]; then
          $SUDO /usr/local/bin/uhd_images_downloader
      else
          $SUDO uhd_images_downloader
      fi
    else
      if [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "rocky" ]] || [[ "$OS_DISTRO" == "centos" ]]; then
          $SUDO /usr/local/bin/uhd_images_downloader -i $1
      else
          $SUDO uhd_images_downloader -i $1
      fi
    fi
}

install_bladerf_driver_from_source(){
    echo_info "\nInstalling BladeRF driver from sources."
    cd /tmp
    echo "Downloading BladeRF driver"
    rm -rf /tmp/bladeRF
    git clone https://github.com/Nuand/bladeRF.git
    cd bladeRF
    git checkout tags/2016.06
    mkdir -p build
    cd build
    $CMAKE ../
    echo "Compiling BladeRF driver"
    make
    $SUDO make install
    $SUDO ldconfig
    echo "Downloading FPGA and firmware images"
    cd /tmp/bladeRF
    #wget has been removed from default dependencies, so we must be sure that's installed
    $SUDO $INSTALLER -y install wget
    wget --tries=3 --retry-connrefused https://www.nuand.com/fx3/bladeRF_fw_latest.img
    wget --tries=3 --retry-connrefused https://www.nuand.com/fpga/hostedx40-latest.rbf
    sudo mkdir -p /usr/share/Nuand/bladeRF
    sudo mv bladeRF_fw_latest.img /usr/share/Nuand/bladeRF/bladeRF_fw.img
    sudo mv hostedx40-latest.rbf /usr/share/Nuand/bladeRF/hostedx40.rbf
}

check_install_bladerf_driver(){
    if [[ "$OS_DISTRO" == "ubuntu" ]]; then
        $SUDO apt-get install -y  bladerf libbladerf-dev
        $SUDO apt-get install -y bladerf-firmware-fx3
        $SUDO apt-get install -y bladerf-fpga-hostedx40
   elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then
        install_bladerf_driver_from_source
   else
        echo_error "BladeRF Installer for OAI does not support automatic build. Install BladeRF compiling sources manually from BladeRF website"
   fi
}

flash_firmware_bladerf() {
	$SUDO bladeRF-cli --flash-firmware /usr/share/Nuand/bladeRF/bladeRF_fw.img
}

check_install_lmssdr_driver(){
	if ( [ -d "/usr/local/include/lime" ] &&
             [ -f "/usr/local/include/lime/LimeSuite.h" ] )
	then
  		echo_success "Found lmssdr drivers and tools installed from source"
        else
                echo_error "lmssdr support implies installing lmssdr drivers and tools" \
                           " from sources. check:"
                echo_info "https://wiki.myriadrf.org/Lime_Suite"
                echo_fatal "Cannot compile lmssdr device"
	fi


}

install_soapy_from_source(){
    echo_info "\nInstalling Soapy EcoSystem from source."
    cd /tmp
    echo "Downloading SoapySDR"
    rm -rf /tmp/SoapySDR
    git clone -b soapy-sdr-0.7.0 --single-branch https://github.com/pothosware/SoapySDR.git
    cd SoapySDR
    #git checkout tags/release_003_010_001_001
    mkdir -p build
    cd build
    $CMAKE ../
    echo "Compiling SoapySDR"
    make -j`nproc`
    $SUDO make install
    $SUDO ldconfig
    cd /tmp
    echo "Downloading SoapyRemote"
    rm -rf /tmp/SoapyRemote
    git clone -b soapy-remote-0.5.0 --single-branch https://github.com/pothosware/SoapyRemote.git
    cd SoapyRemote
    #git checkout tags/release_003_010_001_001
    mkdir -p build
    cd build
    $CMAKE ../
    echo "Compiling SoapyRemote"
    make -j`nproc`
    $SUDO make install
    $SUDO ldconfig
}

install_soapy_iris_from_source(){
    echo_info "\nInstalling Iris driver from source."
    cd /tmp
    echo "Downloading SoapyIris"
    rm -rf /tmp/sklk-soapyiris
    git clone -b soapy-iris-2018.08.0.1 --single-branch https://github.com/skylarkwireless/sklk-soapyiris.git
    cd sklk-soapyiris
    mkdir -p build
    cd build
    $CMAKE ../
    echo "Compiling SoapyIris"
    make -j`nproc`
    $SUDO make install
    $SUDO ldconfig
}

check_install_soapy () {
    #if [[ "$OS_DISTRO" == "ubuntu" ]]; then
        #first we remove old installation
    $SUDO apt-get remove -y soapysdr soapysdr-server libsoapysdr-dev python-soapysdr python3-soapysdr soapysdr-module-remote || true
        #$SUDO add-apt-repository -y ppa:myriadrf/drivers
        #$SUDO apt-get update
        #$SUDO apt-get install -y soapysdr soapysdr-server libsoapysdr-dev python-soapysdr python3-soapysdr soapysdr-module-remote

    #elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then
    #    $SUDO $INSTALLER -y install software-properties-common python3-software-properties python-software-properties subversion git python3 python-numpy python3-numpy cmake swig python-dev
    install_soapy_from_source
    #fi
    install_soapy_iris_from_source
}

check_install_additional_tools (){
  $SUDO $INSTALLER update -y
  local optional_packages=""
  if [[ "$OS_BASEDISTRO" == "debian" ]]; then
    case "$(get_distribution_release)" in
        "ubuntu20.04" | "ubuntu22.04" | "debian11" )
            optional_packages="python3 python3-pip python3-dev python3-scipy python3-matplotlib python3-pyroute2 universal-ctags"
            ;;
    esac
    PACKAGE_LIST="\
        doxygen \
        libgnutls28-dev \
        libpthread-stubs0-dev \
        tshark \
        uml-utilities \
        iperf3 \
        libforms-bin \
        libforms-dev \
        libxft-dev \
        libpcre3-dev \
        libssh-dev \
        libxml2-dev"
  elif [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]] || [[ "$OS_DISTRO" == "rocky" ]] ||  [[ "$OS_DISTRO" == "fedora" ]]; then
    PACKAGE_LIST="\
      doxygen \
      ctags \
      iperf3 \
      gnutls-devel \
      libXft-devel \
      xforms \
      xforms-devel \
      pcre-devel \
      libssh-devel \
      libxml2-devel"
  fi
    $SUDO $INSTALLER install -y $PACKAGE_LIST $optional_packages
}

check_install_oai_software() {
    local specific_packages=""
    if ! check_supported_distribution; then
        echo_error "Your distribution $(get_distribution_release) is not supported by oai !"
        exit 1
    fi
    $SUDO $INSTALLER update -y
  if [[ "$OS_BASEDISTRO" == "debian" ]]; then
    $SUDO apt install -y software-properties-common
    case "$(get_distribution_release)" in
         "debian11")
            specific_packages="libz-dev"
            ;;
    esac
    $SUDO apt-get install -y \
    $specific_packages \
	automake  \
	build-essential \
	$CMAKE \
        ninja-build \
	pkg-config \
	git \
	libblas-dev \
	liblapack-dev \
	liblapacke-dev \
	libreadline-dev \
	libconfig-dev \
	libsctp-dev  \
	libssl-dev  \
	libtool  \
	patch \
	openssl \
	zlib1g-dev \
	xxd \
	libyaml-cpp-dev

  elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then
    if [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]] || [[ "$OS_DISTRO" == "rocky" ]]; then
      if rpm -q epel-release > /dev/null; then
        echo "EPEL repos already present. Good."
      else
        echo "EPEL repos not present. Installing them."
        $SUDO $INSTALLER install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
      fi
    fi

    $SUDO $INSTALLER install -y \
      automake \
      $CMAKE \
      gcc \
      gcc-c++ \
      git \
      pkgconfig \
      libconfig-devel \
      lksctp-tools \
      lksctp-tools-devel \
      libtool \
      ninja-build \
      make \
      openssl-devel \
      patch \
      readline-devel \
      lapack \
      lapack-devel \
      blas \
      blas-devel \
      vim-common \
      zlib-devel \
      yaml-cpp-devel
  fi

    install_asn1c_from_source $1
    install_simde_from_source $1
}

install_asn1c_from_source(){
    echo_info "\nInstalling ASN1."
    $SUDO $INSTALLER -y install bison flex
    $SUDO rm -rf /tmp/asn1c
    # GIT_SSL_NO_VERIFY=true git clone https://gitlab.eurecom.fr/oai/asn1c.git /tmp/asn1c
    git clone https://github.com/mouse07410/asn1c /tmp/asn1c
    cd /tmp/asn1c
    #git checkout vlm_master
    # hotfix: current vlm_master (5fa129cf3161da9ff2d67341e6277e818c0f5d6a)
    # breaks F1, NG, so use the one before.
    git checkout 940dd5fa9f3917913fd487b13dfddfacd0ded06e
    # Showing which version is used
    git log -n1
    autoreconf -iv
    CFLAGS="-O2 -fno-strict-aliasing" ./configure --prefix /opt/asn1c/
    make -j`nproc`
    $SUDO make install
    cd -
    $SUDO ldconfig
    if [[ -v CI_ENV ]]; then
        $SUDO rm -rf /tmp/asn1c
    fi
}

install_simde_from_source(){
    echo_info "\nInstalling SIMDE from source without test cases (header files only)"
    cd /tmp
    $SUDO rm -rf /tmp/simde
    git clone https://github.com/simd-everywhere/simde-no-tests.git /tmp/simde
    cd /tmp/simde
    # we can specify a given version of SIMDE (sha-one or tag)
    if [[ -v SIMDE_VERSION ]]; then
      git checkout -f $SIMDE_VERSION
    else
      # At time of writing, last working commit for OAI: c7f26b7
      git checkout c7f26b73ba8e874b95c2cec2b497826ad2188f68
    fi
    # Showing which version is used
    git log -n1
    # brute force copy into /usr/include
    $SUDO \cp -rv ../simde /usr/include
}

install_lttng() {
    if [[ "$OS_DISTRO" != "ubuntu" ]]; then
      echo_info "LTTng is supported only for ubuntu at the moment."
      echo_info $distribution
      return
    fi

    set +e
    $SUDO apt-add-repository ppa:lttng/stable-2.13 -y && apt-get update
    $SUDO apt-get install -y lttng-tools lttng-modules-dkms liblttng-ust-dev
    if [[ $? > 0 ]]; then
      echo "Failed to install LTTng using apt. Installing from source"
      install_lttng_deps
      install_lttng_from_source
    fi
    set -e
}

install_lttng_deps() {
  echo "installing dependencies of LTTng"
  $SUDO apt-get install uuid-dev libxml2-dev -y
}

install_lttng_from_source() {
    echo "installing LTTng from source"
    install_popt_1_18_from_source
    install_userspace_rcu
    install_lttng_ust_2_13_from_source
    install_lttng_tools_2_13_from_source
}

install_popt_1_18_from_source() {
  $SUDO $INSTALLER -y install wget
  echo_info "\nInstalling popt_1_18."
  cd $(mktemp -d) &&
  wget http://ftp.rpm.org/popt/releases/popt-1.x/popt-1.18.tar.gz
  tar -xf popt-1.18.tar.gz && cd popt-1.18
  ./configure && make -j16 && $SUDO make install
}

install_userspace_rcu() {
    echo_info "\nInstalling U-RCU from source."
    cd /tmp
    $SUDO rm -rf /tmp/urcu
    git clone https://github.com/urcu/userspace-rcu.git /tmp/urcu
    cd /tmp/urcu
    git checkout stable-0.12
    ./bootstrap && ./configure && make
    $SUDO make install
    $SUDO ldconfig
}


install_lttng_modules_2_13_from_source() {
    $SUDO $INSTALLER -y install wget
    echo_info "\nInstalling LTTng Modules."
    cd $(mktemp -d) &&
    wget https://lttng.org/files/lttng-modules/lttng-modules-latest-2.13.tar.bz2 &&
    tar -xf lttng-modules-latest-2.13.tar.bz2 &&
    cd lttng-modules-2.13.* &&
    make &&
    $SUDO make modules_install &&
    $SUDO depmod -a
}

install_lttng_ust_2_13_from_source() {
    $SUDO $INSTALLER -y install wget
    echo_info "\nInstalling LTTng UST."
    cd $(mktemp -d) &&
    wget https://lttng.org/files/lttng-ust/lttng-ust-latest-2.13.tar.bz2 &&
    tar -xf lttng-ust-latest-2.13.tar.bz2 &&
    cd lttng-ust-2.13.* &&
    ./configure --disable-numa &&
    make &&
    $SUDO make install &&
    $SUDO ldconfig
}

install_lttng_tools_2_13_from_source() {
    $SUDO $INSTALLER -y install wget
    echo_info "\nInstalling LTTng Tools."
    cd $(mktemp -d) &&
    wget https://lttng.org/files/lttng-tools/lttng-tools-latest-2.13.tar.bz2 &&
    tar -xf lttng-tools-latest-2.13.tar.bz2 &&
    cd lttng-tools-2.13.* &&
    ./configure &&
    make &&
    $SUDO make install &&
    $SUDO ldconfig
}

#################################################
# 2. compile
################################################

install_nas_tools() {
  echo_success "generate .ue_emm.nvram .ue.nvram"
  ./nvram --gen -c $1 -o $2 > "$3"
  echo_success "generate .usim.nvram"
  ./usim --gen -c $1 -o $2 >> "$3"
}


################################
# set_openair_env
###############################
set_openair_env(){
    fullpath=`readlink -f $BASH_SOURCE`
    [ -f "/.$fullpath" ] || fullpath=`readlink -f $PWD/$fullpath`
    openair_path=${fullpath%/cmake_targets/*}
    openair_path=${openair_path%/targets/*}
    openair_path=${openair_path%/openair[123]/*}
    export OPENAIR_DIR=$openair_path
    export OPENAIR1_DIR=$openair_path/openair1
    export OPENAIR2_DIR=$openair_path/openair2
    export OPENAIR3_DIR=$openair_path/openair3
    export OPENAIR_TARGETS=$openair_path/targets
}
