#!/usr/bin/bash

BOOTIMG_LOCATION=/lib/firmware/mellanox/boot/default.bfb

get_version()
{
	if [ -e /etc/debian_version ]; then
		dpkg --list $1 | grep -w "$1" | awk '{print $2,$3}'
	else
		if (rpm -q --quiet $1); then
			rpm -q --queryformat="[%{NAME}-%{VERSION}-%{RELEASE}]" $1
		fi
	fi
}

if [ -e "$BOOTIMG_LOCATION" ]; then
	BUILD_ATF=$(strings $BOOTIMG_LOCATION | grep -m 1 "(\(release\|debug\))")
	BUILD_UEFI=$(strings -e l $BOOTIMG_LOCATION | grep "BlueField" |\
                    cut -d':' -f 2)
	BOOTIMAGE_VER=$(get_version mlxbf-bootimages)
	BUILD_BSP=$(echo "$BOOTIMAGE_VER" | sed -e 's/mlxbf-bootimages-//')

	if [ -x "$(command -v bfver)" ]; then
		BFVER_VAL=$(bfver)
	fi
	if [ -n "$BFVER_VAL" ]; then
		BUILD_ATF=$(echo "$BFVER_VAL" | grep ATF | awk '{ print $NF }' | head -n 1)
                BUILD_UEFI=$(echo "$BFVER_VAL" | grep UEFI | awk '{ print $NF }' | head -n 1)
                BUILD_BSP=$(echo "$BFVER_VAL" | grep BSP | awk '{ print $NF }' | head -n 1)
        fi

fi


OFED=`ofed_info -s 2> /dev/null | tr -d ':' | cut -d '-' -f2-`
if [ ! -n "$OFED" ]; then
	OFED="in-box"
fi

BF1_FW=`/opt/mellanox/mlnx-fw-updater/firmware/mlxfwmanager_sriov_dis_aarch64_41682 --list 2> /dev/null | head -3 | tail -1 | awk '{print $4}'`
BF2_FW=`/opt/mellanox/mlnx-fw-updater/firmware/mlxfwmanager_sriov_dis_aarch64_41686 --list 2> /dev/null | head -3 | tail -1 | awk '{print $4}'`
BF3_FW=`/opt/mellanox/mlnx-fw-updater/firmware/mlxfwmanager_sriov_dis_aarch64_41692 --list 2> /dev/null | head -3 | tail -1 | awk '{print $4}'`


get_version_and_release()
{
	if [ -e /etc/debian_version ]; then
		dpkg --list $1 | grep -w "$1" | awk '{print $3}'
	else
		if (rpm -q --quiet $1); then
			rpm -q --queryformat="[%{VERSION}-%{RELEASE}]" $1
		fi
	fi
}

print_ofed()
{
	if [ -e /etc/debian_version ]; then
		ofed_info | sed -n '/^-------------------$/ { :a; n; p; ba; }' | awk '{print $2, $3}'
	else
		ofed_info | sed -n '/^-------------------$/ { :a; n; p; ba; }' | xargs rpm -q --queryformat="[- %{NAME} %{VERSION}-%{RELEASE}]\n"
	fi
}

cat << EOF
Versions:
ATF: $BUILD_ATF
UEFI: $BUILD_UEFI
BSP: $BUILD_BSP
Kernel: $(uname -r)
DOCA Base (OFED): ${OFED}
MFT: `get_version_and_release mft`
DOCA Prime: `get_version_and_release doca-prime-runtime`

Firmware:
EOF

if [ -n "$BF1_FW" ]; then
cat << EOF
BF1 FW: $BF1_FW
EOF
fi

if [ -n "$BF2_FW" ]; then
cat << EOF
BF2 FW: $BF2_FW
EOF
fi

if [ -n "$BF3_FW" ]; then
cat << EOF
BF3 FW: $BF3_FW
EOF
fi

cat << EOF

mlnx-dpdk: `/opt/mellanox/dpdk/bin/dpdk-testpmd -v 2>&1 | grep "RTE Version:" | cut -d ':' -f 3`
`get_version mlx-regex`
`get_version virtio-net-controller`
`get_version collectx-clxapi`
`get_version libvma`
EOF

if ( grep -q "DISTRIB_ID=Ubuntu" /etc/lsb-release > /dev/null 2>&1 ); then
cat << EOF
`get_version libxlio`
`get_version dpcp`
EOF
fi

cat << EOF

SNAP3:
- `get_version mlnx-libsnap`
- `get_version mlnx-snap`
- `get_version spdk`
EOF

if [ -e /etc/debian_version ]; then

cat << EOF

DOCA:
$(for doca in `dpkg --list | grep -E 'doca|rxp|dpacc|flexio|dpa-compiler' | awk '{print $2}' | sort -n`; do echo "- `get_version $doca`";done)
EOF
else
cat << EOF

DOCA:
$(for doca in $(rpm -qa | grep -E 'doca|rxp|dpacc|flexio|dpa-compiler' | sort -n); do echo "- `get_version $doca`";done)
EOF
fi

if [ "$OFED" != "in-box" ]; then
cat << EOF

OFED:
`print_ofed`
EOF
fi
