#!/bin/sh
#
# UIRD Init script
# Author: Anton Goroshkin <http://magos-linux.ru>
#

. /livekitlib

#. /lib/magos-lib.sh

#Messages
HEADER_START=$($GETTEXT "Starting UIRD init <http://magos-linux.ru>")
HEADER_END=$($GETTEXT "UIRD init is finished, starting")
RC_PREINIT=$($GETTEXT "Running rc.preinit scripts")
MNT_REFRESH=$($GETTEXT "Updating directory /mnt")
HELP_SYSTEM=$($GETTEXT "UIRD help system")


#transfer_initramfs

UNION=$NEWROOT

MEMORY=/memory
BUNDLES=$MEMORY/bundles
CHANGES=$MEMORY/changes
MACHINES=$MEMORY/machines
DATAMNT=$MEMORY/data
COPY2RAM=$MEMORY/copy2ram
LAYER_BASE=$MEMORY/layer-base
LAYER_CACHE=$MEMORY/layer-cache
LAYER_HOMES=$MEMORY/layer-homes
LAYER_MOUNTS=$MEMORY/layer-mounts
#MOUNTDIR=$DATAMNT
MOUNTDIR=$LAYER_BASE

LIVEKITNAME="MagOS"

echo "0" >/proc/sys/kernel/printk

#loadfont < /usr/lib/consolefonts/UniCyr_8x14.psf
loadfont < /usr/lib/consolefonts/ter-u16n.psf >/dev/null
loadkeys /usr/lib/kbd/ru.map >/dev/null

#echo $LANG
header $HEADER_START 
header "[ $(cat /uird_version) $LANG]"


debug_start
debug_shell


[ -d /lib/modules/"$(uname -r)" ] || [ -d /lib64/modules/"$(uname -r)" ] || ( echolog "!!! Ядро и модули ядра не совпадают !!!" && exit 1)

debug_shell

init_devs
debug_shell

mkdir -p $MEMORY

getcmdline >/memory/cmdline
eval echo $(cat /proc/cmdline /memory/cmdline 2>/dev/null | tr -s ";" "," ) >/memory/cmdline


# print help
if cat /memory/cmdline |grep -q help ; then
    echo ""
    header "$HELP_SYSTEM" 
    echo ""
    param_list=$( eval echo "$UIRD_BASECFG $UIRD_CONFIG $UIRD_SGNFILES $UIRD_RO $UIRD_RW $UIRD_CP $UIRD_COPY2RAM \
        $UIRD_COPY2CACHE $UIRD_RAMSIZE $UIRD_IP  $UIRD_NETFSOPT  $UIRD_LOAD $UIRD_NOLOAD  \
        $UIRD_FROM  $UIRD_CACHE $UIRD_HOMES $UIRD_HOME $UIRD_CHANGES $UIRD_MACHINES $UIRD_FIND_PARAMS $UIRD_MOUNTS $UIRD_BREAK" )
    help_dir=/usr/share/uird.help
    [ -d /usr/share/uird.help/${LANG} ] &&  help_dir=/usr/share/uird.help/${LANG} 
    for par in $param_list ;do
        if [ "help" == "$(cmdline_value $par)" ] ; then 
            header "-=-=-=- $par -=-=-=-"
            echo "default is:  $(for a in $(cat /etc/cmdline.d/01-default.conf) ;do echo $a ;done |grep "$par" )"
            cat ${help_dir}/${par}.help 
            echo "ENTER --> next page"
            read qqq 
        fi
    done 
    if [ "$(cmdline_parameter $UIRD_HELP)" ] ;then
        for file in $(ls -1 ${help_dir}/*.help) ;do
            echo "-=-=-=- $file -=-=-=-" # header do not work with less command
            cat $file
        done | less 
    fi
    shell_cmd "help"
fi


debug_shell


# start quickshell
start_quickshell
debug_shell


# Resume from swsuspend
resume_from_suspend
debug_shell


BASECFG=$(cmdline_value $UIRD_BASECFG)
[ -z "$BASECFG" ] && BASECFG=/uird_configs/basecfg.ini
#cat "$BASECFG" >/memory/basecfg.ini 2>/dev/null

eval echo $(cat /memory/cmdline $BASECFG 2>/dev/null | tr -s ";" "," ) >/memory/cmdline

RAMSIZE=$(cmdline_value $UIRD_RAMSIZE)
if [ "$RAMSIZE" = "" ]; then RAMSIZE="70%"; fi
mount -t tmpfs -o "size=$RAMSIZE" tmpfs $MEMORY

mkdir -p $MOUNTDIR $CHANGES

getcmdline >/memory/cmdline

BASECFG=$(cmdline_value $UIRD_BASECFG)
[ -z "$BASECFG" ] && BASECFG=/uird_configs/basecfg.ini
#cat "$BASECFG" >/memory/basecfg.ini 2>/dev/null

eval echo $(cat /proc/cmdline /memory/cmdline $BASECFG 2>/dev/null | tr -s ";" "," ) >/memory/cmdline

#init BASE layer
[ "$(cmdline_value $UIRD_BREAK)" = "init_base" ] && shell_cmd "break"
[ "$(cmdline_value $UIRD_FROM)" ] && init_layer $DATAMNT/from $LAYER_BASE $UIRD_FROM "check_SGN"
debug_shell
# init CACHE layer
[ "$(cmdline_value $UIRD_BREAK)" = "init_cache" ] && shell_cmd "break"
[ "$(cmdline_value $UIRD_CACHE)" ] && init_layer $DATAMNT/cache $LAYER_CACHE $UIRD_CACHE
debug_shell
# init HOMES layer
[ "$(cmdline_value $UIRD_BREAK)" = "init_home" ] && shell_cmd "break"
[ "$(cmdline_value $UIRD_HOMES)" ] && init_layer $DATAMNT/homes $LAYER_HOMES $UIRD_HOMES
[ "$(cmdline_value $UIRD_HOME)" ] && init_layer $DATAMNT/homes $LAYER_HOMES $UIRD_HOME
debug_shell

#setting up config
[ "$(cmdline_value $UIRD_BREAK)" = "config" ] && shell_cmd "break"
setup_config
debug_shell

#setting up source for changes
[ "$(cmdline_value $UIRD_BREAK)" = "changes" ] && shell_cmd "break"
setup_changes $DATAMNT/changes $CHANGES
debug_shell
#setting up machines
[ "$(cmdline_value $UIRD_BREAK)" = "machines" ] && shell_cmd "break"
setup_machines $MACHINES $DATAMNT/machines $CHANGES $DATAMNT/changes
debug_shell

# sync data from BASE layer to CACHE layer
[ "$(cmdline_value $UIRD_BREAK)" = "sync_to_cache" ] && shell_cmd "break"
[ "$(cmdline_value $UIRD_FROM)" ] && copy_to_cache $LAYER_BASE "$LAYER_CACHE"
debug_shell

# sync data from BASE,CACHE layers to RAM
[ "$(cmdline_value $UIRD_BREAK)" = "sync_to_ram" ] && shell_cmd "break"
[ "$(cmdline_value $UIRD_FROM)" ] && copy_to_ram $LAYER_BASE "$COPY2RAM"
debug_shell
[ "$(cmdline_value $UIRD_CACHE)" ] && copy_to_ram $LAYER_CACHE "$COPY2RAM"
debug_shell

# setup persistent changes, if possible
#persistent_changes "$DATA" "$CHANGES"


# init aufs filesystem
init_aufs

# init aufs union
[ "$(cmdline_value $UIRD_BREAK)" = "init_aufs" ] && shell_cmd "break"
init_union "$CHANGES" "$UNION"
debug_shell
# init MOUNTS layer
[ "$(cmdline_value $UIRD_BREAK)" = "mounts" ] && shell_cmd "break"
[ "$(cmdline_value $UIRD_MOUNTS)" ] && init_layer $DATAMNT/mounts $LAYER_MOUNTS $UIRD_MOUNTS
debug_shell

# add data to union
#[ "$(cmdline_value $UIRD_BREAK)" = "append_copy2ram" ] && shell_cmd "break"
#[ "$(cmdline_value $UIRD_COPY2RAM)$(cmdline_parameter $UIRD_COPY2RAM)" ] && union_append_bundles $COPY2RAM "$BUNDLES" "$UNION"
#debug_shell
#[ "$(cmdline_value $UIRD_BREAK)" = "append_cache" ] && shell_cmd "break"
#[ "$(cmdline_value $UIRD_CACHE)" ] && union_append_bundles $LAYER_CACHE "$BUNDLES" "$UNION"
#debug_shell
[ "$(cmdline_value $UIRD_BREAK)" = "append_bundles" ] && shell_cmd "break"
[ "$(cmdline_value $UIRD_FROM)" ] && union_append_bundles $LAYER_BASE "$BUNDLES" "$UNION" "$COPY2RAM" "$LAYER_CACHE"
debug_shell

#setup homes by using aufs
[ "$(cmdline_value $UIRD_BREAK)" = "set_homes" ] && shell_cmd "break"
setup_homes "$LAYER_HOMES" "$UNION/home"                                                                                                                                                      debug_shell
debug_shell

# rootcopy
#copy_rootcopy_content "$DATA" "$UNION"

#echo_green_star
#echolog "Обновление файла /etc/fstab"
#touch $UNION/etc/fstab >/dev/null
#fstab_update $UNION
echo_green_star
echolog $MNT_REFRESH
rmdir $UNION/mnt/* 2>/dev/null
debug_shell

# old compatibility to linuxlive init
mkdir -p $UNION/mnt/live/memory 
#mkdir -p $UNION/mnt/live/etc
cp liblinuxlive $UNION/mnt/live/liblinuxlive
#cp /etc/resolv.conf $UNION/mnt/live/etc/ 2>/dev/null
[ -d "/memory/data/from/0" ] && ln -sf /memory/data/from/0 $UNION/mnt/livemedia
[ -d "/memory/data/from/1" ] && ln -sf /memory/data/from/1 $UNION/mnt/livedata
[ -d "/memory/bundles" ] && ln -sf /memory/bundles $UNION/mnt/live/memory/images
[ -d "/memory/changes" ] && ln -sf /memory/changes $UNION/mnt/live/memory/changes
debug_shell

[ "$(cmdline_value $UIRD_BREAK)" = "rc.preinit" ] && shell_cmd "break"
cd $UNION
echo_green_star
echolog $RC_PREINIT
[ -x "etc/rc.d/rc.preinit" ] && /bin/bash etc/rc.d/rc.preinit
debug_shell
mv /var/log/magos $UNION/var/log/ 2>/dev/null

#need for usable_root of dracut
mkdir -p $UNION/proc $UNION/sys $UNION/dev $UNION/$MEMORY 
#mkdir -p $UNION/initramfs

#need TODO
mount --move $MEMORY $UNION/$MEMORY
#mount --move / $UNION/initramfs

header "$HEADER_END $LIVEKITNAME"
debug_shell

[ "$(cmdline_parameter qse)" ] && shell_cmd "shell"
