#!/bin/sh

machine="osmio4kplus"
url="https://tuxbox-images.de/images/$machine"
image="neutrino-image_ofgwrite.zip"
imagesource="$url/$image"
hdd_mount="/media/usb"
$(cat /proc/mounts | grep -q "/media/hdd") && hdd_mount="/media/hdd"
imagebase="$hdd_mount/service/image"
imageversion_online="$url/imageversion"
picture_source="/usr/share/tuxbox/neutrino/icons"
rootfs="/rootfs.tar.bz2"
kernel_bin="/kernel.bin"
rootbase="/rootfs"
kernelbase="/kernel"
devbase="/dev/disk/by-partlabel"
dev_display=" "
root="$(sed -e 's/^.*rootsubdir=//' -e 's/ .*$//' < /proc/cmdline | grep -o '[1-4]')"
rootdevice="$(sed -e 's/^.*root=//' -e 's/ .*$//' < /proc/cmdline)"
res_setting="$(cat /etc/neutrino/config/neutrino.conf | grep osd_resolution | grep -o '[0-1]')"
resolution="1920x1080"
[ "$res_setting" = '0' ] && resolution="1280x720"

pidof neutrino >> /dev/null && systemctl stop neutrino
echo encoder > /proc/stb/avs/0/input

clear
which convert >> /dev/null && convert -resize "$resolution" -gravity center -extent "$resolution" "$picture_source"/update_download.jpg bgra:/dev/fb0

exit_done() {
which convert >> /dev/null && convert -resize "$resolution" -gravity center -extent "$resolution" "$picture_source"/update_done.jpg bgra:/dev/fb0
	if [[ "$no_update_available" = '1' ]];then
		printf '\n\033[32m%s\n\033[0m' "No update available"
		pidof neutrino >> /dev/null || systemctl start neutrino
		exit 0;
	elif [ "$root" = "$part" ];then
		#clear
		which git >> /dev/null && cd /etc && git reset --hard >> /dev/null
		echo "...Reboot"
		echo "...Reboot" > "$dev_display" && systemctl reboot
		exit 0;
	else
		sleep 3
		#clear
		pidof neutrino >> /dev/null || systemctl start neutrino
		exit 0;
	fi
}

[[ "$*" = '-h' ]] || [[ "$*" = '--help' ]] &&  { printf '\n\033[31m%s\n' "Give the destination partition number [1 - 4] as first argument.
As second argument you can specify the path where the image is stored.
If no second argument is given the image will be downloaded from
"$imagesource"
" && exit 0;}

if [ "$1" -lt 1 ] || [ "$1" -gt 4 ]; then
	{ printf '\n\033[31m%s\n' "Choose a valid partition [1-4]" ; exit 1;}
fi

if [ "$1" = 1 ]; then
	part=1;
elif [ "$1" = 2 ]; then
	part=2;
elif [ "$1" = 3 ]; then
	part=3;
elif [ "$1" = 4 ]; then
	part=4;
fi

imageversion_local="$imagebase/imageversion_partition_$part"

[ -z "$2" ] ||  echo "$2" | grep "/" >> /dev/null || [ "$2" = 'restore' ] || [ "$2" = 'force' ] || { printf '\n\033[31m%s\n' "Please choose a valid path" && exit 9; }

function write_image () {
	which convert >> /dev/null && convert -resize "$resolution" -gravity center -extent "$resolution" "$picture_source"/update_kernel.jpg bgra:/dev/fb0
	printf '\n\n\033[1m%s\n\033[0m' "Writing image into partition $part"
	echo "Writing image into partition $part" > "$dev_display"

	printf '\n\033[33m%s\033[37m%s\n' "Writing kernel into " "$devbase$kernelbase$part"
	pv -w 100 < "$imagedir$kernel_bin" > $(readlink -f "$devbase$kernelbase$part")
	which convert >> /dev/null && convert -resize "$resolution" -gravity center -extent "$resolution" "$picture_source"/update_rootfs.jpg bgra:/dev/fb0
	printf '\n\033[33m%s\033[37m%s\n' "Writing rootfs into" " $devbase$rootbase$part"
	[ $(readlink -f "$devbase$rootbase$part") = "$rootdevice" ] || rm -rf /mnt"$rootbase$part"/*
	pv "$imagedir$rootfs" -w 100 | tar -xjf - -C "/mnt$rootbase$part"
	printf '\n\033[1m\033[32m%s\033[0m\n' "Flash successful"; printf '\033[1m\033[0m'
	echo "Flash succeeded" > "$dev_display"
	exit_done
}

case "$2" in
	restore)
		imagebase="$imagebase/backup/partition_$part"
		;;
	/*)
		imagebase="$2"
		;;
esac

imagedir="$imagebase/$machine"
imagefile="$imagebase/$image"
imageversion="$imagedir/imageversion"
[ ! -d "$imagebase" ] && mkdir -p "$imagebase"
space_available="$(df -Pk $imagebase | awk 'NR==2 {print $4}')"
[ "$space_available" -lt 1048576 ] && printf '\n\033[31m%s\n' "You need at least 1G of free space on $hdd_mount" && exit_done
if [ -z "$2" ]; then
	[ ! -f "$imageversion_local" ] && touch "$imageversion_local"
	md5_imageversion_online=$(curl -s "$imageversion_online" | md5sum | awk '{print $1}')
	md5_imageversion_local=$(md5sum "$imageversion_local" | awk '{print $1}')
	if [ "$md5_imageversion_online" = "$md5_imageversion_local" ]; then
		echo "No update available" > "$dev_display"
		no_update_available="1"
		exit_done;
	fi
fi
if [ "$2" = 'force' ]; then
	printf '\033[31m'
fi
if [ -z "$2" ] || [ "$2" = 'force' ]; then
	echo "Downloading $image" > "$dev_display"
	printf '\n\033[1m%s\n\033[0m' "Downloading $imagesource"
	unpack="unzip -x $imagefile -d $imagebase"
	curl "$imagesource" -o "$imagefile" || exit_done
	[ -d "$imagedir" ] && rm -r "$imagedir"
	echo "Decompressing $image" > "$dev_display"
	which convert >> /dev/null && convert -resize "$resolution" -gravity center -extent "$resolution" "$picture_source"/update_decompress.jpg bgra:/dev/fb0
	printf '\n\033[1m%s\n\033[0m' "Decompressing  $image"
	$unpack || exit_done;
	[ -f "$imageversion" ] && [ -d "$imagebase" ] && cp -rf "$imageversion" "$imageversion_local"
	[ -f "$imagefile" ] && rm "$imagefile"
fi
write_image
