#!/bin/sh
#Idea from :
#(c) Copyright 2007 Barry Kauler, www.puppylinux.com
#2007 Lesser GPL licence v2 (http://www.fsf.org/licensing/licenses/lgpl.html)
#
#puppyrus2 tuxonice section add Pro
#DdShurick переписал всё нафиг с 35 строки

check_status()
{
  /bin/echo -en "\\033[72G" >/dev/console #move to column 72.
  if [ $1 -eq 0 ]; then
    /bin/echo -en "\\033[1;32mготово" >/dev/console
    /bin/echo -e "\\033[0;39m" >/dev/console
  elif [ $1 -eq 1 ]; then
    /bin/echo -en "\\033[1;31mошибка" >/dev/console
    /bin/echo -e "\\033[0;39m" >/dev/console
    echo -en "\\033[1;35m" >/dev/console #35=purple
    echo -n "Последние 6 строк /tmp/bootinit.log..." >/dev/console
    /bin/echo -e "\\033[0;39m" >/dev/console
    echo -en "\\033[1;31m" >/dev/console #31=red
    cat /tmp/bootinit.log | tail -n 6 >/dev/console
    /bin/echo -en "\\033[0;39m" >/dev/console
    echo -en "\\033[1;35m" >/dev/console #35=purple
    echo -n "Последние 6 строк kernel log..." >/dev/console
    /bin/echo -e "\\033[0;39m" >/dev/console
    echo -en "\\033[1;31m" >/dev/console #31=red
    dmesg | tail -n 6 >/dev/console
    /bin/echo -en "\\033[0;39m" >/dev/console
    exec /bin/sh >/dev/console 2>&1
  else
    /bin/echo -e "\\033[1;31m" >/dev/console #31=red
    /bin/echo "$1" >/dev/console
    /bin/echo -e "\\033[0;39m" >/dev/console
  fi
}

module_add () {
	if [ "$copy2ram" = "yes" ]; then
	 cp $NAME /tmpfs/
	 mount -o loop /tmpfs/$(basename $NAME) /$1
	 check_status $?
	else
	 mount -o loop $NAME /$1 
	 check_status $?
	fi
}

zcat /lib/consolefonts/ter-u16n.psf.gz | loadfont
export LANG=C #w004

PATH="/bin:/sbin"
KERNELVER="`uname -r`"
[ $dir ] || dir="*" 	#directory for puppy files. ex: puppy220
[ $noload ] && NOLOAD=$(echo "$noload" | tr ',' '|')

mount -t proc proc /proc -o nosuid,noexec,nodev
mount -t sysfs sys /sys -o nosuid,noexec,nodev
mount -t devtmpfs dev /dev -o mode=0755,nosuid
mount -t rootfs -o remount,rw rootfs /
ln -s /proc/mounts /etc/mtab
#ls /dev > /tmp/devices

clear #got this out of embutils, compiled in t2 (as not currently in busybox)
[ ! "$LOGLEVEL" ] && exec 1>/tmp/bootinit.log 2>&1 #remove o/p from console. v2.22 loglevel added.

#puppyrus2 tuxonice section 
###########  Tuxonice wake up ##############

[ $resume ] && RESUME=$resume || RESUME=$(fdisk -l | grep -m 1 ' 82 ' | cut -f1 -d' ') # swap
echo $RESUME > /sys/power/tuxonice/resume
sleep 0.1
echo 1 > /sys/power/tuxonice/do_resume

swapon $RESUME && SWAPON=$RESUME

############################################

#######################FINDING AND LOADING PUPPY FILES###########################
[ "$rdsh" = "0" ] && exec /bin/sh >/dev/console 2>&1
echo -n "Поиск системных файлов" > /dev/console

blkid > /tmp/uuid.lst
if [ $dev ]; then
	if [ "$(grep $dev /tmp/uuid.lst)" = "" ]; then
		echo -n " ждём 5 секунд" > /dev/console
		sleep 5
		blkid > /tmp/uuid.lst
	fi
	dev1=$(grep $dev /tmp/uuid.lst | cut -b6-10 | tr -d ':')
else
	dev1=$(egrep -v 'loop|swap' /tmp/uuid.lst | cut -b6-10 | tr -d ':')
fi
for DEV in $dev1
 do
  mkdir /mnt/$DEV
  N=0
 	until mount /dev/$DEV /mnt/$DEV 2>/dev/null
	 do
	  sleep 1
	  echo -n . >/dev/console
	  N=$(expr $N + 1)
	  [ $N = 10 ] && check_status 1
	 done
 DIR=$(ls /mnt/$DEV/$dir/base/*kernel-${KERNELVER}.xzm 2>/dev/null | cut -d'/' -f4- | sed 's|/base/kernel.*||')
	if [ ! $DIR ]; then
	 umount /mnt/$DEV
	 rmdir /mnt/$DEV
 	 continue
 	elif [ "$(echo $DIR | wc -w)" -gt 1 ]; then
 	 echo "Выберите загрузочный каталог и напечатайте его имя:" > /dev/console
 	 echo $DIR > /dev/console
 	 read DIR
 	fi
  dev=$DEV
  dir=$DIR
  check_status 0
  break
 done
 
[ "$copy2ram" = "no" -a "$(cat /sys/block/${dev:0:3}/removable)" = 1  ] && check_status "Не отключайте съёмный диск!"
[ ! "$copy2ram" ] && [ "$(cat /sys/block/${dev:0:3}/removable)" = 1  ] && copy2ram="yes"
if [ "$copy2ram" = "yes" ]; then
 mkdir /tmpfs
 mount -t tmpfs tmpfs /tmpfs
fi
NAME=$(ls /mnt/$dev/$dir/base/*-base.xzm) || check_status 1
echo -n "Загружается базовый файл" > /dev/console
module_add base
if [ -d /mnt/$dev/$dir/changes -a "$RO" != "-r" ]; then
 echo -n "Подключается каталог сохранения" > /dev/console
 ln -s /mnt/$dev/$dir/changes /changes 
 check_status $?
elif NAME=$(ls /mnt/$dev/$dir/base/*-save.xzm); then
 echo -n "Подключается модуль сохранения" > /dev/console
 mkdir /save
module_add save
 SAVEXZM='/save=ro+wh:'
 MKRAM="yes"
else
 MKRAM="yes"
fi
if NAME=$(ls /mnt/$dev/$dir/base/*kernel-${KERNELVER}.xzm); then
	echo -n "Загружается модуль ядра" > /dev/console
 module_add kernel
 KERNEL='/kernel=ro:'
fi
if NAME=$(ls /mnt/$dev/$dir/base/Xorg-*.xzm); then
 echo -n "Загружается Xorg" > /dev/console
 mkdir /Xorg
 module_add Xorg
 UMNTRO='/Xorg=ro:'
fi
if [ "$MKRAM" = "yes" ]; then
 echo -n "Подключается tmpfs." > /dev/console
 mkdir /changes
 mount -t tmpfs tmpfs /changes -o size=0k
 check_status $?
fi

########################END FINDING AND LOADING PUPPY FILES############################

##########################FINDING AND LOADING PUPPY MODULES###########################

if [ -d /mnt/$dev/$dir/modules/ ];then
 MODULES="$(ls -1 /mnt/$dev/$dir/modules/*\.xzm)"
 [ $NOLOAD ] && MODULES=$(echo "$MODULES" | egrep -v "$NOLOAD")
	if [ "$MODULES" != "" ];then
	 echo "Загружаются модули программ:" > /dev/console
	 : > /tmp/modules.lst
	 CNTLOOP=$(losetup -f | tr -d [a-z/])
		for NAME in $MODULES
		do
		 [ -f "$NAME" ] || continue
		 MNTPT=$(basename $NAME)
		 [ "$(grep $MNTPT /proc/mounts)" = "" ] || continue
		 echo -n $MNTPT > /dev/console
		 mkdir -p /$MNTPT
		 echo $MNTPT >> /tmp/modules.lst
		 module_add $MNTPT
		 [ $? -eq 0 ] && UMNTRO="${UMNTRO}/${MNTPT}=ro:"
		 CNTLOOP=`expr $CNTLOOP + 1`
		 [ $CNTLOOP -eq 128 ] && break
		done
	else
	 echo -n "Модули не найдены, уточните параметр psubdir
Загрузка без модулей" > /dev/console
	 check_status 0
	fi
else
 echo -n "Загрузка без модулей" > /dev/console
 check_status 0
fi
if [ ! -d /mnt/$dev/$dir/changes -a "$copy2ram" = "yes" ]; then
 umount /mnt/$dev
fi

#####################END FINDING AND LOADING PUPPY MODULES#################

[ "$dev" ] && echo "PDEV='$dev'" >> /etc/initvars
[ "$dir" ] && echo "PDIR='$dir'" >> /etc/initvars
[ "$SWAPON" ] && echo "SWAPON='$SWAPON'" >> /etc/initvars
[ "$rdsh" = "1" ] && exec /bin/sh >/dev/console 2>&1 #w091027

#######################SETUP UNIONFS LAYERED FILESYSTEM###################
#create the unionfs layered f.s.... ***THE BIG EVENT***
echo -n "Настройка слоёв файловой системы aufs..." > /dev/console
mount -t aufs -o udba=reval,diropq=w,dirs=/changes=rw:${SAVEXZM}${UMNTRO}${KERNEL}/base=ro unionfs /pup_new
check_status $? #END STEP FIVE
#######################END SETUP UNIONFS LAYERED FILESYSTEM###################

#######################SETUP SWITCH TO MAIN FILESYSTEM#######################

echo -n "Замещение корневой файловой системы на многослойную..." > /dev/console

#prepare everything for doing a switch_root...
for ONEMNT in `awk '/loop/ {print $2}' /proc/mounts`
	do
	 mkdir -p /pup_new/mnt/bundles${ONEMNT}
	 mount -o move $ONEMNT /pup_new/mnt/bundles${ONEMNT}
	done

mkdir -p /pup_new/mnt/$dev
mount -o move /mnt/$dev /pup_new/mnt/$dev
mkdir -p /pup_new/mnt/changes
mount -o move /changes /pup_new/mnt/changes
if [ "$copy2ram" = "yes" ]; then
 mkdir -p /pup_new/mnt/copy2ram
 mount -o move /tmpfs /pup_new/mnt/copy2ram
fi
cp /tmp/* /pup_new/tmp
check_status 0

#mount home partition.
mkdir -p /pup_new/home
#if [ $CRYPTHOME ]; then
# mount $CRYPTHOME /pup_new/home
if [ $home ]; then
 echo -n "Пользовательский каталог /home/live на разделе "  > /dev/console
 TYPE=$(grep $home /tmp/uuid.lst | sed 's/.*TYPE="//;s/"$//')
 HDEV=$(grep $home /tmp/uuid.lst | cut -f1 -d':')
 echo "DEVHOME='$HDEV'" >> /etc/initvars
 echo -n ${HDEV:5} > /dev/console
 case $TYPE in
	vfat)
	 mount -t $TYPE $HDEV /pup_new/home -o uid=1000,gid=1000,dmask=022,fmask=033
	 check_status $?
	;;
	ntfs)
	 mount -t $TYPE $HDEV /pup_new/home -o uid=1000,gid=1000,dmask=022,fmask=033
	 check_status $?
	;;
	ext?)
	 mount -t $TYPE $HDEV /pup_new/home
	 check_status $?
	;;
 esac
fi

#PNOX is a boot param. /etc/profile prevents X from starting if this file exists...
[ "$nox" ] && touch /pup_new/tmp/bootcnt.txt
cp /etc/initvars /pup_new/etc/
cp -af /tmp/* /pup_new/initrd/tmp/ #keep any log files.

#rdsh is a boot param. exit to initial ramdisk shell...
if [ "$rdsh" = "2" ];then
 echo > /dev/console
 echo "Выходим в оболочку рамдиска. Наберите 'exec switch_root /pup_new /sbin/init' для продолжения загрузки PuppyRus." > /dev/console 
 exec /bin/sh >/dev/console 2>&1
fi

sync
umount /sys
umount /proc
umount /dev
echo "Старт основной системы......" > /dev/console
exec switch_root /pup_new /sbin/init

###END###
