#!/bin/bash 

# Define all BAL apps to be upgraded here
FILELIST=('bcm.user' 'linux-kernel-bde.ko' 'linux-user-bde.ko' 'bcm88470_board.soc' 'combo28_dram.soc' 'config.bcm' 'init.sh' 'qax.soc' 'rc.soc')
#JENKINSSERVER='jenkins-tlva-06.il.broadcom.com'
JENKINSSERVER='10.187.130.172'
ING_SDK_VER='6.5.6'

mkdir -p old

JENKINSPATH1="http://${JENKINSSERVER}/job/Bal.Synced.bcm-sdk-${ING_SDK_VER}/lastSuccessfulBuild/artifact/bal/cur/"
JENKINSFILE1=(
		'3rdparty/bcm-sdk/build/sdk-all-'${ING_SDK_VER}'/build/linux/user/wrx-3_7/bcm.user'
        	'3rdparty/bcm-sdk/build/sdk-all-'${ING_SDK_VER}'/build/linux/user/wrx-3_7/linux-kernel-bde.ko'
        	'3rdparty/bcm-sdk/build/sdk-all-'${ING_SDK_VER}'/build/linux/user/wrx-3_7/linux-user-bde.ko'
        	'3rdparty/bcm-sdk/rc/qax/bcm88470_board.soc'
		'3rdparty/bcm-sdk/rc/qax/combo28_dram.soc'
		'3rdparty/bcm-sdk/rc/qax/config.bcm'
		'3rdparty/bcm-sdk/rc/qax/init.sh'
		'3rdparty/bcm-sdk/rc/qax/qax.soc'
		'3rdparty/bcm-sdk/rc/qax/rc.soc'
)


function coloredEcho(){
    local exp=$1;
    local color=$2;
    if ! [[ $color =~ '^[0-9]$' ]] ; then
       case $(echo $color | tr '[:upper:]' '[:lower:]') in
        black) color=0 ;;
        red) color=1 ;;
        green) color=2 ;;
        yellow) color=3 ;;
        blue) color=4 ;;
        magenta) color=5 ;;
        cyan) color=6 ;;
        white|*) color=7 ;; # white or invalid color
       esac
    fi
    tput setaf $color;
    echo $exp;
    tput sgr0;
}

function check_return(){
	echo -n "$1...	"
	$($2)
	if [ $? -eq 0 ]; then
		coloredEcho '[ OK ]' green
	else
		coloredEcho '[ ERROR ]' red
	fi
}

# Checking connectivity to Jenkins Server
echo -n "Verifing Connectivity to Jenkins...	"
ping -c 1 ${JENKINSSERVER} &> /dev/null
if [ $? -eq 0 ]; then
		coloredEcho '[ OK ]' green
	else
		coloredEcho '[ ERROR ]' red
		echo 'Aborting Upgrade!'
		exit 0
	fi

# delete any old versions
echo 'Deleting older versions...'
for FILE in ${FILELIST[@]}
	do
		check_return "Deleting ${FILE}.old" "rm -f old/${FILE}.old"
	done

# rename the existing versions
echo 'Renaming last version x.old ...'
for FILE in ${FILELIST[@]}
	do
		check_return "Moving ${FILE} to ${FILE}.old" "mv ${FILE} old/${FILE}.old"
	done

# Get the new versions
echo 'Downloading ING version '${ING_SDK_VER}'...'
for FILE in ${JENKINSFILE1[@]}
	do
		COMMAND="wget -q ${JENKINSPATH1}${FILE}"
		SHORTFILE=$(echo ${FILE} | sed 's:.*/::')
		check_return "Getting Latest ${SHORTFILE}" "${COMMAND}"
	done

# Changing permissions to executable
echo 'Changing permissions to executable...'
for FILE in ${FILELIST[@]}
	do
		check_return "Makiing ${FILE} executable" "chmod 755 ${FILE}"
	done

echo 'Upgrade Complete'
