#!/bin/sh
# ***************************************************************************
# Copyright 2014-2024 VMware, Inc.  All rights reserved. VMware Confidential.
# ***************************************************************************
# $Id$
# $DateTime$
# $Change$
# $Author$
# ***************************************************************************
# Usage:  nsxcli  [-c|--cmd <CLI commands delimited by semicolons>]


INVOKEPATH=`readlink -f $0`
ROOTDIR=`echo $INVOKEPATH | sed -e "s/nsx-cli.*/nsx-cli/"`
COMMONLIB=/opt/vmware/nsx-common/python
PYTHONPATH=$ROOTDIR/bin/python

CLIBASEDIR=$ROOTDIR/bin/python/cli

RHEL_FILE="/etc/redhat-release"
LSB_RELEASE="/usr/bin/lsb_release"
NSX_ISSUE="/etc/nsx_issue"
SUSE_FILE="/etc/SuSE-release"
PHOTONOS_FILE="/etc/photon-release"

if [ -f $NSX_ISSUE ]; then
    NSX_ISSUE_NODE_TYPE=`grep node-type $NSX_ISSUE | cut -d\  -f 2`
else
    NSX_ISSUE_NODE_TYPE=""
fi

PYTHON="python"
IS_UBT18_APPLIANCE="False"
# Use python3 on appliance types
for i in nsx-manager nsx-controller nsx-policy-manager nsx-edge nsx-autonomous-edge nsxaas-dashboard global-manager; do
  if echo "$i" | grep -q $NSX_ISSUE_NODE_TYPE; then
    PYTHON="python3"
    IS_UBT18_APPLIANCE="True"
    break
  fi
done

# Use python3 on container types
for i in nsx-container-ncp nsx-container-node-agent nsx-container-kube-proxy; do
  if echo "$i" | grep -q $NSX_ISSUE_NODE_TYPE; then
    PYTHON="python3"
    break
  fi
done

VMW_ROOT_DIR=`echo $INVOKEPATH | sed -e "s/vmware.*/vmware/"`
NESTDB_API_DIR=$VMW_ROOT_DIR/nsx-nestdb/python
#NSX_COMMON_LIB is unique to ESX only
NSX_COMMON_LIB="/usr/lib/vmware/nsx-common/lib/python"
# Common lib linux64 path
NSX_COMMON_LIB_LIN64="/opt/vmware/nsx-common/lib/python/"
# NSX_PROTO2_LIB is unique to ESX only
NSX_PROTO2_LIB="/usr/lib/vmware/nsx-proto2/python"
NSX_DATAPATH_LIB="/usr/lib/vmware/nsx-esx-datapath/lib64/python/:/usr/lib/vmware/nsx-esx-datapath/lib64/python/lib-dynload"
NSX_RPC_PROTO_DIR=$VMW_ROOT_DIR/nsx-monitoring/python

if [ "$NSX_ISSUE_NODE_TYPE" = "nsx-manager" ]; then
    CNTLR_NSX_NODE_API_DIR=$VMW_ROOT_DIR/nsx-node-api/bin/python:/opt/vmware/ccp/bin/python
    PYTHONPATH=$PYTHONPATH:$CNTLR_NSX_NODE_API_DIR:$NSX_RPC_PROTO_DIR
elif [ "$NSX_ISSUE_NODE_TYPE" = "global-manager" ] ; then
    CNTLR_NSX_NODE_API_DIR=$VMW_ROOT_DIR/nsx-node-api/bin/python:/opt/vmware/ccp/bin/python
    PYTHONPATH=$PYTHONPATH:$CNTLR_NSX_NODE_API_DIR:$NSX_RPC_PROTO_DIR
elif [ "$NSX_ISSUE_NODE_TYPE" = "nsx-edge" ] ; then
    PYTHONPATH=$PYTHONPATH:$NESTDB_API_DIR
elif [ "$NODE_TYPE" = "nsx-autonomous-edge" ] ; then
    PYTHONPATH=$PYTHONPATH:$NESTDB_API_DIR
# CentOS Linux is used by public cloud use case
# for public cloud, RHEL, Oracle Enterprise Linux, CentOS are binary compatible
# and kvm based and treated as host-public-cloud node type
elif [ -f $RHEL_FILE ] && [ `grep 'Red Hat Enterprise Linux\|CentOS Linux' $RHEL_FILE | wc -l` -ne 0 ]; then
    PYTHONPATH=$PYTHONPATH:$PYTHONPATH/lib_kvm:$NESTDB_API_DIR:$NSX_COMMON_LIB_LIN64
    if [ `grep 'release 8' $RHEL_FILE | wc -l` -ne 0 ]; then
        # RHEL / CentOS 8.x
        PYTHON="python3"
    fi
# SUSE
elif [ -f $SUSE_FILE ] && [ `grep 'SUSE Linux Enterprise Server' $SUSE_FILE | wc -l` -ne 0 ]; then
    PYTHONPATH=$PYTHONPATH:$PYTHONPATH/lib_kvm:$NESTDB_API_DIR:$NSX_COMMON_LIB_LIN64
# for public cloud, Ubuntu treated as kvm based and host-public-cloud node type
elif [ -f $LSB_RELEASE ] && [ `lsb_release -si | grep -i Ubuntu | wc -l` -ne 0 ] ; then
    IS_U18=$(lsb_release -r | grep '18\.04' > /dev/null && echo yes)
    IS_U20=$(lsb_release -r | grep '20\.04' > /dev/null && echo yes)
    # If the host is Ubt18 transport node (not appliance)
    if [ "$IS_U18" = "yes" ] && [ "$IS_UBT18_APPLIANCE" = "False" ] ; then
        PYTHONPATH=$PYTHONPATH:$PYTHONPATH/lib_kvm:$NESTDB_API_DIR:$NSX_COMMON_LIB_LIN64
    elif [ "$IS_U20" = "yes" ] ; then
        PYTHONPATH=$PYTHONPATH:$PYTHONPATH/lib_kvm:$NESTDB_API_DIR:$NSX_COMMON_LIB_LIN64
        # Use python3 on Ubuntu 20.04 as it by default do not contain python
        PYTHON="python3"
    else
        # see 2296911#c52 for details
        PYTHONPATH=$PYTHONPATH:$PYTHONPATH/lib_kvm:$NESTDB_API_DIR
    fi
elif [ `uname -a | grep -i VMkernel | wc -l` -ne 0 ] ; then
    # On ESXi host if its found that NSX-CLI group id has available memory less than 100MB
    # then error out from CLI launch script notifying no more memory available in system
    ppid=$(ps -cPTgjstz | grep nsxcli.py | awk '$8 == "U" && $3 == "python" {print $2}')
    no_of_cli_processes=$(echo "$ppid" | wc -w)
    ppid=$(echo "$ppid" | awk '{print $1; exit}')
    if [ -n "$ppid" ]; then
        availMem=$(memstats -r group-stats -u mb -T -s gid:name:parGid:min:max:conResv:availResv:minLimit:memSize:consumed 2> /dev/null | sed -n '/^-\+/,/.*\n/p' | grep python.$ppid | awk  '{print $8}')
        if [ "$availMem" -lt 100 ]; then
            echo "${no_of_cli_processes} NSX-CLI sessions found to be active and there is insufficient memory,"
            echo "terminate existing sessions to launch a new session."
            exit 1
        fi
    fi
    export PYTHONPATH=$PYTHONPATH:$PYTHONPATH/lib_esx:$PYTHONPATH/lib_esx_python3:$NSX_COMMON_LIB:$NSX_COMMON_LIB_LIN64:$NSX_PROTO2_LIB:$NSX_DATAPATH_LIB:$NSX_RPC_PROTO_DIR:$NESTDB_API_DIR
elif [ -f $PHOTONOS_FILE  ] && [ `grep 'VMware Photon OS' $PHOTONOS_FILE | wc -l` -ne 0 ]; then
   PYTHONPATH=$PYTHONPATH:$PYTHONPATH/lib_kvm:$NESTDB_API_DIR:$NSX_COMMON_LIB_LIN64
else
    echo "nsx-cli: ERROR: Unrecognized platform"
    exit 1
fi


if [ -f $CLIBASEDIR/server/nsxcli.py ] ; then
    CLIPATH=$CLIBASEDIR/server/nsxcli.py
else
    echo "nsx-cli: ERROR: not found"
    exit 1
fi


if [ "$LC_ALL" = "" ] ; then
    export PYTHONIOENCODING=UTF-8
fi

PYTHONPATH=$PYTHONPATH:$COMMONLIB
export PYTHONPATH=$PYTHONPATH
(exec $PYTHON -OO $CLIPATH $*)
