aboutsummaryrefslogtreecommitdiffstats
path: root/extras/vpp_stats_fs/install.sh
diff options
context:
space:
mode:
authorArthur de Kerhor <arthurdekerhor@gmail.com>2021-03-03 08:49:15 -0800
committerDave Barach <openvpp@barachs.net>2021-03-24 12:16:43 +0000
commit1f13f8fd8a5f5f68e6e03825115c64383f17a1b5 (patch)
tree966eb8209ed495c3a544aeaa32f223f5e67214ae /extras/vpp_stats_fs/install.sh
parent4d2726ece83f391a7cadb1314415ef23104f9ffe (diff)
misc: fuse fs for the stats segment
This extra allows to mount a FUSE filesystem reflecting the state of the stats segment. Type: feature Signed-off-by: Arthur de Kerhor <arthurdekerhor@gmail.com> Change-Id: I692f9ca5a65c1123b3cf28c761455eec36049791
Diffstat (limited to 'extras/vpp_stats_fs/install.sh')
-rwxr-xr-xextras/vpp_stats_fs/install.sh274
1 files changed, 274 insertions, 0 deletions
diff --git a/extras/vpp_stats_fs/install.sh b/extras/vpp_stats_fs/install.sh
new file mode 100755
index 00000000000..6249e63c6eb
--- /dev/null
+++ b/extras/vpp_stats_fs/install.sh
@@ -0,0 +1,274 @@
+# Copyright (c) 2021 Cisco Systems and/or its affiliates.
+# 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.
+
+#!/bin/bash
+
+# A simple script that installs stats_fs, a Fuse file system
+# for the stats segment
+
+set -eo pipefail
+
+OPT_ARG=${1:-}
+
+STATS_FS_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"/
+VPP_DIR=$(pwd)/
+BUILD_ROOT=${VPP_DIR}build-root/
+BINARY_DIR=${BUILD_ROOT}install-vpp-native/vpp/bin/
+DEBUG_DIR=${BUILD_ROOT}install-vpp_debug-native/vpp/bin/
+RUN_DIR=/run/vpp/
+
+GOROOT=${GOROOT:-}
+GOPATH=${GOPATH:-}
+
+[ -z "${GOROOT}" ] && GOROOT="${HOME}/.go" && PATH=$GOROOT/bin:$PATH
+[ -z "${GOPATH}" ] && GOPATH="${HOME}/go" && PATH=$GOPATH/bin:$PATH
+
+function install_tools() {
+ echo "Installing downloading tools"
+ apt-get update
+ apt-get install git wget curl -y
+}
+
+# Install latest GO version
+function install_go() {
+ local TMP="/tmp"
+
+ echo "Installing latest GO"
+ if [[ -x "$(command -v go)" ]]; then
+ local installed_ver installed_ver_fmt
+ installed_ver=$(go version)
+ installed_ver_fmt=${installed_ver#"go version go"}
+ echo "Found installed version ${installed_ver_fmt}"
+ return
+ fi
+
+ 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 path for current session to install vpp_stast_fs
+ export GOROOT=${GOROOT}
+ export PATH=$GOROOT/bin:$PATH
+ export GOPATH=$GOPATH
+ export PATH=$GOPATH/bin:$PATH
+
+ echo "Installed $(go version)"
+}
+
+function install_fuse() {
+ echo "Installing Fuse"
+ apt-get update
+ apt-get install fuse -y
+}
+
+function install_go_dep() {
+ echo "Installing Go dependencies"
+ if [[ ! -x "$(command -v go)" ]]; then
+ echo "GO is not installed"
+ exit 1
+ fi
+
+ if [ ! -e "go.mod" ]; then
+ go mod init stats_fs
+ fi
+ # master required
+ go get git.fd.io/govpp.git@master
+ go get git.fd.io/govpp.git/adapter/statsclient@master
+ go get github.com/hanwen/go-fuse/v2
+}
+
+# Resolve stats_fs dependencies and builds the binary
+function build_statfs() {
+ echo "Installing statfs"
+ go build
+ if [ -d "${BINARY_DIR}" ]; then
+ mv stats_fs "${BINARY_DIR}"/stats_fs
+ elif [ -d "${DEBUG_DIR}" ]; then
+ mv stats_fs "${DEBUG_DIR}"/stats_fs
+ else
+ echo "${BINARY_DIR} and ${DEBUG_DIR} directories does not exist, the binary is installed at ${STATS_FS_DIR}stats_fs instead"
+ fi
+}
+
+function install_statfs() {
+ if [[ ! -x "$(command -v go)" ]]; then
+ install_tools
+ install_go
+ fi
+
+ if [[ ! -x "$(command -v fusermount)" ]]; then
+ install_fuse
+ fi
+
+ if [ ! -d "${STATS_FS_DIR}" ]; then
+ echo "${STATS_FS_DIR} directory does not exist"
+ exit 1
+ fi
+ cd "${STATS_FS_DIR}"
+
+ if [[ ! -x "$(command -v ${STATS_FS_DIR}stats_fs)" ]]; then
+ install_go_dep
+ build_statfs
+ else
+ echo "stats_fs already installed at path ${STATS_FS_DIR}stats_fs"
+ fi
+}
+
+# Starts the statfs binary
+function start_statfs() {
+ EXE_DIR=$STATS_FS_DIR
+ if [ -d "${BINARY_DIR}" ]; then
+ EXE_DIR=$BINARY_DIR
+ elif [ -d "${DEBUG_DIR}" ]; then
+ EXE_DIR=$DEBUG_DIR
+ fi
+
+ mountpoint="${RUN_DIR}stats_fs_dir"
+
+ if [[ -x "$(command -v ${EXE_DIR}stats_fs)" ]] ; then
+ if [ ! -d "$mountpoint" ] ; then
+ mkdir "$mountpoint"
+ fi
+ nohup "${EXE_DIR}"stats_fs $mountpoint 0<&- &>/dev/null &
+ return
+ fi
+
+ echo "stats_fs is not installed, use 'make stats-fs-install' first"
+}
+
+function stop_statfs() {
+ EXE_DIR=$STATS_FS_DIR
+ if [ -d "${BINARY_DIR}" ]; then
+ EXE_DIR=$BINARY_DIR
+ elif [ -d "${DEBUG_DIR}" ]; then
+ EXE_DIR=$DEBUG_DIR
+ fi
+ if [[ ! $(pidof "${EXE_DIR}"stats_fs) ]]; then
+ echo "The service stats_fs is not running"
+ exit 1
+ fi
+
+ PID=$(pidof "${EXE_DIR}"stats_fs)
+ kill "$PID"
+ if [[ $(pidof "${EXE_DIR}"stats_fs) ]]; then
+ echo "Can't unmount the file system: Device or resource busy"
+ exit 1
+ fi
+
+ if [ -d "${RUN_DIR}stats_fs_dir" ] ; then
+ rm -df "${RUN_DIR}stats_fs_dir"
+ fi
+}
+
+function force_unmount() {
+ if (( $(mount | grep "${RUN_DIR}stats_fs_dir" | wc -l) == 1 )) ; then
+ fusermount -uz "${RUN_DIR}stats_fs_dir"
+ else
+ echo "The default directory ${RUN_DIR}stats_fs_dir is not mounted."
+ fi
+
+ if [ -d "${RUN_DIR}stats_fs_dir" ] ; then
+ rm -df "${RUN_DIR}stats_fs_dir"
+ fi
+}
+
+# Remove stats_fs Go module
+function cleanup() {
+ echo "Cleaning up stats_fs"
+ if [ ! -d "${STATS_FS_DIR}" ]; then
+ echo "${STATS_FS_DIR} directory does not exist"
+ exit 1
+ fi
+
+ cd "${STATS_FS_DIR}"
+
+ if [ -e "go.mod" ]; then
+ rm -f go.mod
+ fi
+ if [ -e "go.sum" ]; then
+ rm -f go.sum
+ fi
+ if [ -e "stats_fs" ]; then
+ rm -f stats_fs
+ fi
+
+ if [ -d "${BINARY_DIR}" ]; then
+ if [ -e "${BINARY_DIR}stats_fs" ]; then
+ rm -f ${BINARY_DIR}stats_fs
+ fi
+ elif [ -d "${DEBUG_DIR}" ]; then
+ if [ -e "${DEBUG_DIR}stats_fs" ]; then
+ rm -f ${DEBUG_DIR}stats_fs
+ fi
+ fi
+
+ if [ -d "${RUN_DIR}stats_fs_dir" ] ; then
+ rm -df "${RUN_DIR}stats_fs_dir"
+ fi
+}
+
+# Show available commands
+function help() {
+ cat <<__EOF__
+ Stats_fs installer
+
+ stats-fs-install - Installs requirements (Go, GoVPP, GoFUSE) and builds stats_fs
+ stats-fs-start - Launches the stats_fs binary and creates a mountpoint
+ stats-fs-cleanup - Removes stats_fs binary and deletes go module
+ stats-fs-stop - Stops the executable, unmounts the file system
+ and removes the mountpoint directory
+ stats-fs-force-unmount - Forces the unmount of the filesystem even if it is busy
+
+__EOF__
+}
+
+# Resolve chosen option and call appropriate functions
+function resolve_option() {
+ local option=$1
+ case ${option} in
+ "start")
+ start_statfs
+ ;;
+ "install")
+ install_statfs
+ ;;
+ "cleanup")
+ cleanup
+ ;;
+ "unmount")
+ force_unmount
+ ;;
+ "stop")
+ stop_statfs
+ ;;
+ "help")
+ help
+ ;;
+ *) echo invalid option ;;
+ esac
+}
+
+if [[ -n ${OPT_ARG} ]]; then
+ resolve_option "${OPT_ARG}"
+else
+ PS3="--> "
+ options=("install" "cleanup" "help" "start" "unmount")
+ select option in "${options[@]}"; do
+ resolve_option "${option}"
+ break
+ done
+fi