#!/bin/bash # A simple script that installs VPPTop utility including # all requirements. The binary API is built from the local # vpp data. 'make install-dep' is recommended to call first. set -eo pipefail OPT_ARG=${1:-} SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "${SCRIPT_DIR}"/../../ VPP_DIR=$(pwd) BUILD_DIR=${VPP_DIR}/extras/vpptop/build GOROOT=${GOROOT:-} GOPATH=${GOPATH:-} [ -z "${GOROOT}" ] && GOROOT="${HOME}/.go" [ -z "${GOPATH}" ] && GOPATH="${HOME}/go" function dep_install() { echo "Installing VPPTop dependencies" apt-get update apt-get install git wget curl -y } # Install latest GO version function go_install() { local TMP="/tmp" # Search for existing golang installation echo "Looking for pre-installed GO.." local installed_ver installed_ver_fmt if [[ -f "${GOROOT}/bin/go" ]]; then installed_ver=$(cd ${GOROOT}/bin && ./go version) installed_ver_fmt=${installed_ver#"go version go"} export PATH=$GOROOT/bin:$PATH export PATH=$GOPATH/bin:$PATH echo "Found installed version ${installed_ver_fmt}" return fi # install golang when missing echo ".. none was found. Installing the latest one" mkdir -p "${GOROOT}" mkdir -p "${GOPATH}/"{src,pkg,bin} wget "https://dl.google.com/go/$(curl https://golang.org/VERSION?m=text).linux-amd64.tar.gz" -O "${TMP}/go.tar.gz" tar -C "$GOROOT" --strip-components=1 -xzf "${TMP}/go.tar.gz" rm -f "${TMP}/go.tar.gz" # export for current session so the VPPTop can be installed export GOROOT=${GOROOT} export GOPATH=$GOPATH export PATH=$GOROOT/bin:$PATH export PATH=$GOPATH/bin:$PATH cat << EOF Installed $(go version) Note: following variables were exported for the current session: GOROOT=${GOROOT} GOPATH=${GOPATH} Both were added to PATH EOF } # Install GoVPP binary API generator. GoLang required # to be installed in version 1.13 or higher function install_binapi_gen() { echo "Installing GoVPP binary API generator" export GO111MODULE=on # master required for latest VPPTop if [[ ! -f "${GOROOT}/bin/go" ]]; then echo "GO is not installed" exit 1 fi cd ${GOROOT}/bin && ./go get git.fd.io/govpp.git/cmd/binapi-generator@master local installed_ver installed_ver_fmt installed_ver=$(cd ${GOPATH}/bin && ./binapi-generator -version) installed_ver_fmt=${installed_ver#"govpp "} echo "Binary API generator ${installed_ver_fmt} installed" } # Generate binary API files in the VPPTop directory using # the local VPP sources function generate_binary_api() { # note: build-root dir is planned to be removed, update the path by then local api_dir=${VPP_DIR}/build-root/install-vpp-native/vpp/share/vpp/api local out_dir=${BUILD_DIR}/vpptop/stats/local/binapi if [[ ! -f "${GOPATH}/bin/binapi-generator" ]]; then install_binapi_gen fi if [ ! -d "${BUILD_DIR}" ]; then echo "VPPTop directory does not exist" exit 1 elif [ ! -d "${out_dir}" ]; then mkdir -p "${out_dir}" fi if [ ! -d "${api_dir}" ]; then echo "JSON API files missing, call 'make json-api-files' first" exit 1 fi echo "Generating API" cd ${GOPATH}/bin && ./binapi-generator --output-dir="${out_dir}" -input-dir="${api_dir}" \ "${api_dir}"/plugins/dhcp.api.json \ "${api_dir}"/core/interface.api.json \ "${api_dir}"/core/ip.api.json \ "${api_dir}"/core/vpe.api.json } # Retrieve VPPTop repository function get_vpptop() { echo "Fetching VPPTop" if [ ! -d "${BUILD_DIR}/vpptop" ]; then mkdir "${BUILD_DIR}" cd "${BUILD_DIR}" && git clone https://github.com/PANTHEONtech/vpptop.git else echo "VPPTop directory already exists" fi } # Resolve VPPTop dependencies and install the binary function vpptop_install() { get_vpptop generate_binary_api echo "Installing VPPTop" if [ ! -d "${BUILD_DIR}" ]; then echo "VPPTop directory does not exist" exit 1 fi gopath=${GOROOT}/bin/go cd "${BUILD_DIR}"/vpptop && go mod download cd "${BUILD_DIR}"/vpptop && make install if [[ ! -x "$(command -v vpptop)" ]] && [[ ! -f "${GOPATH}/bin/vpptop" ]] ; then echo "VPPTop was not successfully installed" exit 1 fi if [[ ! -x "$(command -v vpptop)" ]] ; then echo "VPPTop was installed to ${GOPATH}/bin/vpptop" fi cat << EOF ----- $(vpptop --help) ----- Following binaries were installed: ${GOPATH}/bin/binapi-generator ${GOPATH}/bin/vpptop EOF } # Starts the vpptop binary function vpptop_start() { if [[ -f "${GOPATH}/bin/vpptop" ]] ; then cd ${GOPATH}/bin && ./vpptop return fi echo "VPPTop is not installed, use 'make vpptop-install' first" } # Remove VPPTop repository from extras function cleanup() { echo "Cleaning up VPPTop" rm -rf "${BUILD_DIR}" } # Show available commands function help() { cat <<__EOF__ VPPTop installer Run 'make install-dep' before the installation : Installs VPPTop requirements (latest GO, GoVPP binary API generator), retrieves VPPTop repository, generates binary API and installs the VPPTop binary. : Removes VPPTop repository : Runs vpptop binary __EOF__ } # Resolve chosen option and call appropriate functions function resolve_option() { local option=$1 case ${option} in "start") vpptop_start ;; "install") dep_install go_install vpptop_install ;; "cleanup") cleanup ;; "help") help ;; *) echo invalid option ;; esac } if [[ -n ${OPT_ARG} ]]; then resolve_option "${OPT_ARG}" else PS3="--> " options=("install" "cleanup" "help") select option in "${options[@]}"; do resolve_option "${option}" break done fi