#!/bin/sh

src=/opt
TITLE="Установка системы"
dstroot=/mnt
dstboot=$dstroot/boot
blk=
partboot=
partroot=

setup_loader() {
    (
	echo "Создание файлов..."
	cp $src/initrd.gz $dstboot/
	tar xJf $src/efi.tar.xz -C $dstboot
	echo "Запись UUID..."
	PARTUUID=`blkid $partroot -s PARTUUID -o value`
	sed -i "s/REPLACE_PARTUUID/$PARTUUID/g" $dstboot/EFI/BOOT/refind.conf
	sleep 1
	echo "Размонтирование разделов..."
	umount $partboot
	umount $partroot
	sleep 1
    ) | dialog --backtitle "$TITLE" --title "Установка загрузчика" --progressbox "$blk" 10 60
}

setup_efi() {
    (
	echo "Создание файлов..."
	cp $src/initrd.gz $dstboot/
	sleep 1
	echo "Удаление старых записей..."
	for br in `efibootmgr | grep REECOM | grep -oE "[0-9]{4}"`; do
	    efibootmgr -B -b $br > /dev/null
	done
	sleep 1
	echo "Создание загрузочной записи..."
	PARTUUID=`blkid $partroot -s PARTUUID -o value`
	efibootmgr -c -d $blk -p 1 -L "REECOM" -l "\bzImage" -u "ro quiet root=PARTUUID=$PARTUUID initrd=\initrd.gz" > /dev/null
	sleep 1
	echo "Размонтирование разделов..."
	umount $partboot
	umount $partroot
	sleep 1
    ) | dialog --backtitle "$TITLE" --title "Настройка загрузки" --progressbox "$blk" 10 60
}

setup_image() {
    errstr=
    (
	echo "Создание таблицы разделов..."
	errstr="$errstr`parted -a optimal -s $blk mklabel gpt 2>&1`"
	echo "Создание разделов..."
	sleep 1
	errstr="$errstr`parted -a optimal -s $blk mkpart BOOT fat32 0% 64MiB mkpart REECOM ext4 64MiB 100% set 1 boot on 2>&1`"
	echo "Форматирование разделов..."
	sleep 1
	mkfs.vfat -F 32 -n "BOOT" $partboot  2>/dev/null > /dev/null
	mkfs.f2fs -f -l "REECOM" $partroot 2>/dev/null > /dev/null
	sleep 1
	echo "Монтирование разделов..."
	errstr="$errstr`mount $partroot $dstroot`"
	[ -d $dstboot ] || mkdir -p $dstboot
	errstr="$errstr`mount $partboot $dstboot`"
	sleep 1
    ) | dialog --backtitle "$TITLE" --title "Подготовка установки образа" --progressbox "$blk\n$1" 10 60
    if [ "$errstr" ]; then
	dialog --backtitle "$TITLE" --title "Возникли ошибки, продолжить?" --yesno "$errstr" 20 50 2>&1 1>&3
	if [ $? -ne 0 ]; then
	    exit
	fi
    fi
    (pv -n $src/$1 | tar xJf - -C $dstroot) 2>&1 | dialog --backtitle "$TITLE" --title "Установка образа" --gauge "$blk\n$1" 8 70 0
    sleep 1
}


devs=
sds=`ls /dev/sd?`
nms=`ls /dev/nvme?n?`
for dev in $sds $nms; do
    cur=`mount | grep $dev`
    if [ -z "$cur" ]; then
	blk=${dev:5}
	sysblk="/sys/class/block/$blk/device"
	size=$((`blockdev --getsize64 $dev`/1048576))
	if [ $size -gt 1024 ]; then
	    size="$((size/1024))Gb"
	else
	    size="$size"Mb
	fi
	if [ -f $sysblk/vendor ]; then
	    vendor="`cat $sysblk/vendor | cut -d ' ' -f 1`"
	    model="`cat $sysblk/model | cut -d ' ' -f 1`"
	else
	    vendor="`cat $sysblk/model | cut -d ' ' -f 2`"
	    model="`cat $sysblk/model | cut -d ' ' -f 3`"
	fi
	size="$vendor/$model:$size"
	devs="$devs $blk $size"
    fi
done

if [ -z "$devs" ]; then
    dialog --msgbox "Ошибка!\n\nНе найдены устройства хранения!" 8 40
    exit
fi

exec 3>&1
dev=`dialog --backtitle "$TITLE" --title "Выберите устройство" --menu " " 15 50 10 $devs 2>&1 1>&3`
if [ $? -ne 0 ]; then
    exit
fi
type=`dialog --backtitle "$TITLE" --title "Выберите тип образа" --menu "$dev" 20 50 15 \
	core "Базовый" \
	bts "OpenBTS" \
	live "Установочная флешка" \
	2>&1 1>&3`
if [ $? -ne 0 ]; then
    exit
fi

imgtype=$type
if [ "$type" = "live" ]; then
    imgtype="core"
fi
images=
for k in `ls $src/$imgtype-*.tar.xz 2>/dev/null`; do
    imgver=`echo $k | cut -d '-' -f 2,3`
    imgsize=$((`wc -c < $k`/1024))
    images=$images" $imgver $imgsize"Kb
done
if [ -z "$images" ]; then
    dialog --msgbox "Ошибка!\n\nНе найдены файлы образов!" 8 40
    exit
fi
imgver=`dialog --backtitle "$TITLE" --title "Выберите версию образа" --menu "$dev" 20 50 15 $images 2>&1 1>&3`
if [ $? -ne 0 ]; then
    exit
fi

if [ "$type" = "live" ]; then
    soft="Загрузочная флешка"
else
    soft=`dialog --backtitle "$TITLE" --title "Выберите необходимое ПО" --checklist "$dev, $type" 20 50 15 \
	digital3 "Цифра 3" off \
	digital4 "Цифра 4" off \
	digital4l "Цифра 4 (без UHD)" off \
	eureka4 "Эврика 4" off \
	eureka5 "Эврика 5" off \
	2>&1 1>&3`
    if [ $? -ne 0 ]; then
	exit
    fi
fi
conf="\nУстройство: $dev\n\nОбраз: $imgtype-$imgver\n\nПО: $soft\n"
dialog --backtitle "$TITLE" --title "Подтвердите конфигурацию" --yesno "$conf" 20 50 2>&1 1>&3
if [ $? -ne 0 ]; then
    exit
fi

blk=/dev/$dev
if [ "${dev::4}" = "nvme" ]; then
    partboot="$blk"p1
    partroot="$blk"p2
else
    partboot="$blk"1
    partroot="$blk"2
fi
setup_image $imgtype-$imgver
if [ "$type" = "live" ]; then
    echo -e "[Match]\nName=e*\n\n[Network]\nDHCP=yes" > $dstroot/etc/systemd/network/50-dhcp.network
    setup_loader
else
    for s in $soft; do
	(pv -n $src/$s.tar.xz | tar xJf - -C $dstroot ) 2>&1 | dialog --backtitle "$TITLE" --title "Установка ПО" --gauge "$s" 8 70 0
    done
    sleep 1
    setup-network $dstroot
    sleep 1
    setup_efi
fi

dialog --backtitle "$TITLE" --title "Установка завершена" --yesno "Выключить систему?" 20 50 2>&1 1>&3
if [ $? -ne 0 ]; then
    exit
fi

exec 3>&-
poweroff
