#!/bin/sh

#######
### Asuswrt-Merlin.ng build script
### Expects you to have a copy of the sources at $SRC_LOC
### and model-specific copies as ~/amng.ac86, ~/amng.ac88, etc...
###
### Script will rsync between $SRC_LOC and the various ~/amng.XXX folders
######

### Start config

### Manual/hardcoded
# Append git revision
export BUILDREV=1

# Enable update server support (don't use if you build a fork!)
#export MERLINUPDATE=y

# rsync tree from central source tree before build.
# If set to "btrfs", then "cp --reflink" is used instead of rsync.
RSYNC_TREE=y

# Combined RT-AC68U image?
COMBINED=y

# Build ROG UI image for GT models in addition to regular image
BUILD_ROGUI=y

### Uncomment the models you wish to build.

#BAC68=y

#BAC88=y
#BAC3100=y
#BAC5300=y
#BAC86=y
#BGTAC2900=y
#BAC68V4=y

BAX88=y
BGTAX11000=y

#BAX56=y
BAX58=y

BAX86=y
BAX68=y
BGTAXE11000=y

BGTAX6000=y
BXT12=y
BGTAXE16000=y
BGTAX11000_PRO=y
BAX86_PRO=y
BAX88_PRO=y

BBE96=y
BGTBE98PRO=y
BBE88=y
BBE86=y


### Branches for each model
BRANCH_AC68=386_x

BRANCH_AC88=386_x
BRANCH_AC3100=386_x
BRANCH_AC5300=386_x

BRANCH_AC86=386_x
BRANCH_GTAC2900=386_x

BRANCH_AX88=3004.388
BRANCH_GTAX11000=3004.388

BRANCH_AX58=3004.388
BRANCH_AX56=3004.388

BRANCH_AX86=3004.388
BRANCH_AX68=3004.388
BRANCH_GTAXE11000=3004.388
BRANCH_AC68V4=386_x

BRANCH_GTAX6000=3006.102-wifi6
BRANCH_XT12=3006.102-wifi6
BRANCH_GTAXE16000=3006.102-wifi6
BRANCH_GTAX11000_PRO=3006.102-wifi6
BRANCH_AX86_PRO=3006.102-wifi6
BRANCH_AX88_PRO=3006.102-wifi6

BRANCH_BE96=3006.102
BRANCH_GTBE98_PRO=3006.102
BRANCH_BE88=3006.102
BRANCH_BE86=3006.102

### Paths
# Store built images there
STAGE_LOC="$HOME/images"

# Copy built images there
# Copy is done using scp, so it can be an ssh location
#FINAL_LOC=""
#FINAL_LOC=admin@router.asus.com:/mnt/sda1/Share
FINAL_LOC=/media/sf_Share

# Location of the original source code
SRC_LOC="$HOME/dev/amng"

### End config


build_fw()
{
	BRANCH="$4"
	FWMODEL="$3"
	SDKPATH="$2"
	FWPATH="$1"
	echo "*** $(date +%R) - Starting building $FWMODEL..."
	cd "$HOME/$FWPATH/$SDKPATH" || exit 1
	if make "$FWMODEL" > "output.txt" 2>&1; then
		cd image || exit
		if [ "$FWMODEL" = "rt-ac86u" ] || [ "$FWMODEL" = "gt-ac2900" ] || [ "$FWMODEL" = "rt-ax88u" ] || [ "$FWMODEL" = "gt-ax11000" ] ; then
			rm *_cferom_ubi.w
			FWNAME="$(find -- *_ubi.w | head -n 1)"
			ZIPNAME="$(echo "$FWNAME" | sed 's~_ubi.w~~g').zip"
		elif [ "$FWMODEL" = "rt-ax58u" ] || [ "$FWMODEL" = "rt-ac68u_v4" ]; then
			rm *_cferom_puresqubi.w
			FWNAME="$(find -- *_puresqubi.w | head -n 1)"
			ZIPNAME="$(echo "$FWNAME" | sed 's~_puresqubi.w~~g').zip"
		elif [ "$FWMODEL" = "rt-ax86u" ] || [ "$FWMODEL" = "rt-ax68u" ] ; then
			rm *_cferom_pureubi.w	# Broken cferom, do not use until fixed upstream
			FWNAME="$(find -- *_pureubi.w | head -n 1)"
			ZIPNAME="$(echo "$FWNAME" | sed 's~_pureubi.w~~g').zip"
		elif [ "$FWMODEL" = "rt-ax56u" ] || [ "$FWMODEL" = "gt-axe11000" ] ; then
			rm *_cferom_pureubi.w
			FWNAME="$(find -- *_pureubi.w | head -n 1)"
			ZIPNAME="$(echo "$FWNAME" | sed 's~_pureubi.w~~g').zip"
		elif [ "$FWMODEL" = "gt-ax6000" ] || [ "$FWMODEL" = "xt12" ] || [ "$FWMODEL" = "gt-axe16000" ] || [ "$FWMODEL" = "gt-ax11000_pro" ] || [ "$FWMODEL" = "rt-ax86u_pro" ] || [ "$FWMODEL" = "rt-ax88u_pro" ] ; then
			FWNAME="$(find -- *_nand_squashfs.pkgtb | head -n 1)"
			ZIPNAME="$(echo "$FWNAME" | sed 's~_nand_squashfs.pkgtb~~g').zip"
		elif [ "$FWMODEL" = "gt-be98_pro" ] || [ "$FWMODEL" = "gt-be98" ] || [ "$FWMODEL" = "rt-be96u" ] || [ "$FWMODEL" = "rt-be88u" ] || [ "$FWMODEL" = "rt-be86u" ] ; then
			FWNAME="$(find -- *_nand_squashfs.pkgtb | head -n 1)"
			ZIPNAME="$(echo "$FWNAME" | sed 's~_nand_squashfs.pkgtb~~g').zip"
		else
			FWNAME="$(find -- *.trx | head -n 1)"
			ZIPNAME="$(echo "$FWNAME" | sed 's~.trx~~g').zip"
		fi
		cp "$FWNAME" "$STAGE_LOC/"
		sha256sum "$FWNAME" > sha256sum.sha256

		if [[ "$FWNAME" == *"3004_388"* ]]; then
			CHANGELOG="Changelog-NG.txt"
		elif [[ "$FWNAME" == *"3006_102"* ]]; then
			CHANGELOG="Changelog-3006.txt"
		else
			CHANGELOG="Changelog-386.txt"
		fi
		cp $HOME/$FWPATH/$CHANGELOG $STAGE_LOC/

		zip -qj "$STAGE_LOC/$ZIPNAME" "$FWNAME" "$STAGE_LOC/README-merlin.txt" "$STAGE_LOC/$CHANGELOG" "sha256sum.sha256" 2>/dev/null
		echo "*** $(date +%R) - Done building $FWMODEL!"

		if [ "$BUILD_ROGUI" = "y" ] && ([ "$FWMODEL" = "gt-ac2900" ] || [ "$FWMODEL" = "gt-ax11000" ] || [ "$FWMODEL" = "gt-axe11000" ]) ; then
			echo "--- $(date +%R) - Building ROG UI for $FWMODEL"
			cd ..
			sed -i 's/ROG_UI=n/ROG_UI=y/' target.mak
			rm -rf image/*.pkgtb image/*.w .config
			if make "$FWMODEL" > "output.txt" 2>&1; then
				cd image
				if [ "$FWMODEL" = "gt-ax6000" ] || [ "$FWMODEL" = "gt-axe16000" ] || [ "$FWMODEL" = "gt-ax11000_pro" ] ; then
					FWNAME="$(find -- *rog*_nand_squashfs.pkgtb | head -n 1)"
				elif [ "$FWMODEL" = "gt-ac2900" ] || [ "$FWMODEL" = "gt-ax11000" ] ; then
					rm *_cferom_ubi.w
					FWNAME="$(find -- *rog*_ubi.w | head -n 1)"
				elif [ "$FWMODEL" = "gt-axe11000" ] ; then
					rm *_cferom_pureubi.w
					FWNAME="$(find -- *rog*_pureubi.w | head -n 1)"
				else
					echo "!!! $(date +%R) - $FWMODEL ROG build failed!"
					return
				fi
				cp "$FWNAME" "$STAGE_LOC/"
				sha256sum "$FWNAME" >> sha256sum.sha256
				zip -qj "$STAGE_LOC/$ZIPNAME" "$FWNAME" "sha256sum.sha256" 2>/dev/null
				echo "*** $(date +%R) - Done building ROG UI for $FWMODEL!"
			else
				echo "!!! $(date +%R) - $FWMODEL ROG build failed!"
				return
			fi
		fi
	else
		echo "!!! $(date +%R) - $FWMODEL build failed!"
	fi
}

clean_tree()
{
	FWPATH="$1"
	SDKPATH="$2"
	FWMODEL="$3"
	BRANCH="$4"
	echo "*** $(date +%R) - Cleaning up $FWMODEL..."
	if [ "$RSYNC_TREE" = "y" ]; then
		echo "*** $(date +%R) - Updating $FWMODEL tree..."
		rsync -a --del "$SRC_LOC/" "$HOME/$FWPATH"
	elif [ "$RSYNC_TREE" = "btrfs" ]; then
		echo "*** $(date +%R) - Copying $FWMODEL tree..."
		rm -rf "$HOME/$FWPATH"
		cp -ar --reflink=auto "$SRC_LOC" "$HOME/$FWPATH"
	fi

	cd "$HOME/$FWPATH" || exit 1

	CURRENT=$(git branch | grep "\*" | cut -d ' ' -f2)
	if [ "$CURRENT" != "$BRANCH" ] ; then
		git checkout "$BRANCH"
	fi

	echo "*** $(date +%R) - $FWMODEL code ready."
}

# Initial cleanup

echo "--- $(date +%R) - Global cleanup..."
mkdir -p "$STAGE_LOC/backup"
mv "$STAGE_LOC"/* "$STAGE_LOC/backup/" 2>/dev/null
cp "$SRC_LOC/README-merlin.txt" "$STAGE_LOC/"
cp "$SRC_LOC"/Changelog*.txt "$STAGE_LOC/"


# Update all model trees

echo "--- $(date +%R) - Preparing trees"
if [ "$BAC68" = "y" ]; then
	clean_tree amng.ac68 release/src-rt-6.x.4708 rt-ac68u $BRANCH_AC68
fi
if [ "$BAC3100" = "y" ]; then
	clean_tree amng.ac3100 release/src-rt-7.14.114.x/src rt-ac3100 $BRANCH_AC3100
fi
if [ "$BAC88" = "y" ]; then
	clean_tree amng.ac88 release/src-rt-7.14.114.x/src rt-ac88u $BRANCH_AC88
fi
if [ "$BAC5300" = "y" ]; then
	clean_tree amng.ac5300 release/src-rt-7.14.114.x/src rt-ac5300 $BRANCH_AC5300
fi
if [ "$BAC86" = "y" ]; then
	clean_tree amng.ac86 release/src-rt-5.02hnd rt-ac86u $BRANCH_AC86
fi
if [ "$BGTAC2900" = "y" ]; then
	clean_tree amng.gt2900 release/src-rt-5.02hnd gt-ac2900 $BRANCH_GTAC2900
fi
if [ "$BAX88" = "y" ]; then
	clean_tree amng.ax88 release/src-rt-5.02axhnd rt-ax88u $BRANCH_AX88
fi
if [ "$BGTAX11000" = "y" ]; then
	clean_tree amng.gtax11000 release/src-rt-5.02axhnd gt-ax11000 $BRANCH_GTAX11000
fi
if [ "$BAX58" = "y" ]; then
	clean_tree amng.ax58 release/src-rt-5.02axhnd.675x rt-ax58u $BRANCH_AX58
fi
if [ "$BAX56" = "y" ]; then
	clean_tree amng.ax56 release/src-rt-5.02axhnd.675x rt-ax56u $BRANCH_AX56
fi
if [ "$BAX86" = "y" ]; then
	clean_tree amng.ax86 release/src-rt-5.02L.07p2axhnd rt-ax86u $BRANCH_AX86
fi
if [ "$BAX68" = "y" ]; then
	clean_tree amng.ax68 release/src-rt-5.02L.07p2axhnd rt-ax68u $BRANCH_AX68
fi
if [ "$BGTAXE11000" = "y" ]; then
	clean_tree amng.gtaxe11000 release/src-rt-5.02L.07p2axhnd gt-axe11000 $BRANCH_GTAXE11000
fi
if [ "$BAC68V4" = "y" ]; then
	clean_tree amng.ac68v4 release/src-rt-5.02L.07p2axhnd rt-ac68u_v4 $BRANCH_AC68V4
fi
if [ "$BGTAX6000" = "y" ]; then
	clean_tree amng.gtax6000 release/src-rt-5.04axhnd.675x gt-ax6000 $BRANCH_GTAX6000
fi
if [ "$BXT12" = "y" ]; then
	clean_tree amng.xt12 release/src-rt-5.04axhnd.675x xt12 $BRANCH_XT12
fi
if [ "$BGTAXE16000" = "y" ]; then
	clean_tree amng.gtaxe16000 release/src-rt-5.04axhnd.675x gt-axe16000 $BRANCH_GTAXE16000
fi
if [ "$BGTAX11000_PRO" = "y" ]; then
	clean_tree amng.gtax11000pro release/src-rt-5.04axhnd.675x gt-ax11000_pro $BRANCH_GTAX11000_PRO
fi
if [ "$BAX86_PRO" = "y" ]; then
	clean_tree amng.ax86pro release/src-rt-5.04axhnd.675x rt-ax86u_pro $BRANCH_AX86_PRO
fi
if [ "$BAX88_PRO" = "y" ]; then
	clean_tree amng.ax88pro release/src-rt-5.04axhnd.675x rt-ax88u_pro $BRANCH_AX88_PRO
fi
if [ "$BGTBE98PRO" = "y" ]; then
	clean_tree amng.gtbe98pro amng.gtbe98pro/release/src-rt-5.04behnd.4916 gt-be98_pro $BRANCH_GTBE98_PRO
fi
if [ "$BBE96" = "y" ]; then
	clean_tree amng.be96 amng.be96/release/src-rt-5.04behnd.4916 rt-be96u $BRANCH_BE96
fi
if [ "$BBE88" = "y" ]; then
	clean_tree amng.be88 amng.be88/release/src-rt-5.04behnd.4916 rt-be88u $BRANCH_BE88
fi
if [ "$BBE86" = "y" ]; then
	clean_tree amng.be86 amng.be86/release/src-rt-5.04behnd.4916 rt-be86u $BRANCH_BE86
fi

echo "--- $(date +%R) - All trees ready!"

# Launch parallel builds

echo "--- $(date +%R) - Launching all builds"
if [ "$BBE88" = "y" ]; then
	build_fw amng.be88 release/src-rt-5.04behnd.4916 rt-be88u &
fi

if [ "$BBE86" = "y" ]; then
	build_fw amng.be86 release/src-rt-5.04behnd.4916 rt-be86u &
fi

if [ "$BGTBE98PRO" = "y" ]; then
	build_fw amng.gtbe98pro release/src-rt-5.04behnd.4916 gt-be98_pro &
fi

if [ "$BBE96" = "y" ]; then
        build_fw amng.be96 release/src-rt-5.04behnd.4916 rt-be96u &
fi

if [ "$BGTAX6000" = "y" ]; then
	build_fw amng.gtax6000 release/src-rt-5.04axhnd.675x gt-ax6000 &
fi

if [ "$BXT12" = "y" ]; then
	build_fw amng.xt12 release/src-rt-5.04axhnd.675x xt12 &
fi

if [ "$BAX86_PRO" = "y" ]; then
	build_fw amng.ax86pro release/src-rt-5.04axhnd.675x rt-ax86u_pro &
fi

if [ "$BAX88_PRO" = "y" ]; then
	build_fw amng.ax88pro release/src-rt-5.04axhnd.675x rt-ax88u_pro &
fi

if [ "$BGTAX11000_PRO" = "y" ]; then
	build_fw amng.gtax11000pro release/src-rt-5.04axhnd.675x gt-ax11000_pro &
fi

if [ "$BGTAXE16000" = "y" ]; then
	build_fw amng.gtaxe16000 release/src-rt-5.04axhnd.675x gt-axe16000 &
fi

if [ "$BAC86" = "y" ]; then
	build_fw amng.ac86 release/src-rt-5.02hnd rt-ac86u &
fi

if [ "$BGTAC2900" = "y" ]; then
	build_fw amng.gt2900 release/src-rt-5.02hnd gt-ac2900 &
fi

if [ "$BAX88" = "y" ]; then
	build_fw amng.ax88 release/src-rt-5.02axhnd rt-ax88u &
fi

if [ "$BGTAX11000" = "y" ]; then
	build_fw amng.gtax11000 release/src-rt-5.02axhnd gt-ax11000 &
fi

if [ "$BGTAXE11000" = "y" ]; then
	build_fw amng.gtaxe11000 release/src-rt-5.02L.07p2axhnd gt-axe11000 &
fi

if [ "$BAC68V4" = "y" ]; then
	build_fw amng.ac68v4 release/src-rt-5.02L.07p2axhnd rt-ac68u_v4 &
fi

if [ "$BAX58" = "y" ]; then
	build_fw amng.ax58 release/src-rt-5.02axhnd.675x rt-ax58u &
fi

if [ "$BAX56" = "y" ]; then
	build_fw amng.ax56 release/src-rt-5.02axhnd.675x rt-ax56u &
fi

if [ "$BAX86" = "y" ]; then
	build_fw amng.ax86 release/src-rt-5.02L.07p2axhnd rt-ax86u &
fi

if [ "$BAX68" = "y" ]; then
	build_fw amng.ax68 release/src-rt-5.02L.07p2axhnd rt-ax68u &
fi

if [ "$BAC68" = "y" ]; then
	build_fw amng.ac68 release/src-rt-6.x.4708 rt-ac68u &
fi

if [ "$BAC3100" = "y" ]; then
	build_fw amng.ac3100 release/src-rt-7.14.114.x/src rt-ac3100 &
fi

if [ "$BAC88" = "y" ]; then
	build_fw amng.ac88 release/src-rt-7.14.114.x/src rt-ac88u &
fi

if [ "$BAC5300" = "y" ]; then
	build_fw amng.ac5300 release/src-rt-7.14.114.x/src rt-ac5300 &
fi

sleep 5\

echo "--- $(date +%R) - All builds launched, please wait..."

wait

# Build combined image?
if [ "$BAC68" = "y" ] && [ "$BAC68V4" = "y" ] && [ $"$COMBINED" = "y" ]
then
        echo "--- $(date +%R) - Building combined RT-AC68U image..."
        cd "$HOME/amng.ac68/release/src-rt-6.x.4708"
        make rt-ac68u-combine_image BCM=y IMAGEDIR=$STAGE_LOC > "output.txt" 2>&1;

	cd "$STAGE_LOC"
        FWNAME="$(find -- RT-AC68U_*.trx | head -n 1)"
        ZIPNAME="$(echo "$FWNAME" | sed 's~.trx~~g').zip"
        sha256sum "$FWNAME" > sha256sum.sha256
        zip -qj "$ZIPNAME" "$FWNAME" README-merlin.txt Changelog*.txt sha256sum.sha256 2>/dev/null
	rm RT-AC68U_V4* sha256sum.sha256
fi


echo
cd "$STAGE_LOC" || exit 1
mv -n sha256sums-ng.txt sha256sums-ng-$(date +%Y%m%d).txt
sha256sum *.trx  | unix2dos >> sha256sums-ng.txt
sha256sum *.w  | unix2dos >> sha256sums-ng.txt
sha256sum *.pkgtb  | unix2dos >> sha256sums-ng.txt

# Copy everything to the host

if [ -z "$FINAL_LOC" ]; then
	scp -- *.zip *.trx *.txt *.w *.pkgtb "$FINAL_LOC/" 2>/dev/null
fi

echo "=== $(date +%R) - All done!"