#!/bin/bash
#idea jcoder24 20080412
#modified 20090222
#DdShurick modified 20100924 for PuppyRus-2
#dim-kut added strings 37-55 edition 2
#DdShurick modified 20120826 for Richy-217
#121021 sfslinux@gmail.com -u

FLP() {
loop-tst
for n in `seq 3 $current_loops`
do
   aloop="/dev/loop$n"
   sfs_loaded=`$losetup $aloop 2>/dev/null`
   status=$?
   sfs_loaded=`echo $sfs_loaded| sed 's/\(.*\/\)\(.*\)\(\.sfs)\)/\2/g'`
	
   if [ "$sfs_loaded" = "$sfs_module" ]; then
    if [ -d /mnt/."$sfs_module" ];then
      echo "Модуль с таким названием уже подключен! Завершение..."
      Xdialog --title "$self" --msgbox "$sfs_module.sfs уже подключен.\n"  6 0
      exit 0
    fi
   fi
done

}
#FLP;exit

a="`echo $@`"
Cmdline () {
	for _PARAMETER in $a
	do
	echo ${_PARAMETER}
		case "${_PARAMETER}" in
			-u)
				up=1
				;;

			-r)
				ram=1
				;;

			*.sfs)
				s="${_PARAMETER}"
				;;

#			mountall=*)
#				mountall="${_PARAMETER#mountall=}"
#				;;

		esac
	done
}
Cmdline
#echo up=$up ram=$ram s=$s 
#exit
#xxx sfs_module=$(basename "$s" .sfs); LOOP ;echo $free_loop ;exit
#sfs_module=$(basename "$s" .sfs); FLP ;echo $free_loop ;exit

RAM() {
#RAMSIZE=`free | grep 'Mem:' | tr -s ' ' | cut -f 3 -d ' '` #total physical ram (less shared video).
RAMSIZE=`free | grep 'Mem:' | tr -s ' ' | cut -f 4 -d ' '` #total physical ram (less shared video).
# SIZESFSK=`du -k ${PUPSFSDEVMNTPT}${PUPSFSFILE} | cut -f 1`
 SIZESFSK=`du -k $s | cut -f 1`
 SIZESFSK=$(($SIZESFSK + 1000)) #some slack.
 MINRAM2CPY=$(($SIZESFSK * 2)) #100222 technosaurus: in case of very big puppies.
#[ "`echo -n "$FASTPARTS0" | grep "$PUPSFSDEV"`" != "" ] && [ $RAMSIZE -gt 280000 ] && [ $RAMSIZE -gt $MINRAM2CPY ] && COPY2RAM="yes"
  sfs_module=$(basename "$s" .sfs)
[ $RAMSIZE -gt 280000 ] && [ $RAMSIZE -gt $MINRAM2CPY ] && COPY2RAM="yes" && COPYMSG="$sfs_module copying to ram"
#[ "$PNOCOPY" = "yes" ] && COPY2RAM="" &&  COPYMSG='NO copying to ram' #note, only checking physical ram.
 if [ "$COPY2RAM" = "yes" ];then
  FLP
  st=/mnt/..tmpfs.$sfs_module
  [ -d $st ] || `which sudo` mkdir -p $st
  
  #mount -t tmpfs -o size=${SIZESFSK}k tmpfs /mnt/tmpfs
#loop-tst
  `which sudo` mount -t tmpfs -o size=${SIZESFSK}k tmpfs $st
#  if [ "${PUPSFSDEVMNTPT}" = "" ];then #v403 humongous initrd.
#    mv -f ${PUPSFSDEVMNTPT}${PUPSFSFILE} /mnt/tmpfs/
#  else
#   echo -e -n " \\033[1;35m${COPYMSG}\\033[0;39m" > /dev/console #purple.
   #cp -af ${PUPSFSDEVMNTPT}${PUPSFSFILE} /mnt/tmpfs/
   `which sudo` cp -af $s $st && s="$st/`basename $s`"
#  fi
  `which sudo` sync
#  SFSBASENAME="`basename $PUPSFSFILE`"
#  losetup /dev/loop0 /mnt/tmpfs/${SFSBASENAME}
#  [ "$UMOUNTME" != "" ] && umntfunc $UMOUNTME
# else
#  losetup /dev/loop0 ${PUPSFSDEVMNTPT}${PUPSFSFILE}
 fi

}

[ "$ram" = "1" ] && RAM
#echo $s;exit

#[ "$1" = "-u" ] && shift && up=1
if [ -f /etc/rc.d/PUPSTATE ] ;then
	losetup="losetup-FULL" 
	mount="busybox mount"
    else
losetup="/usr/bin/sudo losetup"

if [ "`grep debian /etc/apt/sources.list`" = "" ];then
	mount="/usr/bin/sudo mount"
    else
	mount="/usr/bin/sudo busybox mount"
fi
#echo $mount;exit
fi

self="Подключить SFS"
if [ "$s" = "" ]; then echo "Не указан sfs.
Usage: $0 [-u] [-r] модуль.sfs
    -u	Загрузка модуля в верхний слой aufs
    -r	Предварительное копирование модуля на создаваемый для него RAM диск.
	При копировании всех (и базовых) модулей в RAM позволяет отключить
	носитель с модулями, ускоряет работу системы, но увеличивает расход RAM
	Количество свободной памяти показывает утилита free
"
exit 1
fi
sfs_path=$(dirname "$s") #may need to check
sfs_module=$(basename "$s" .sfs)
if [ "`grep LASTUNIONRECORD  /etc/rc.d/BOOTCONFIG | grep "$sfs_module"`" != "" ]; then
xpupsay " $sfs_module уже подключен постоянно.
 Смотрите BootManager." &

exit 1
fi 
#--- Check args and requirements ---
if [ "$(file "$s" | grep "Squashfs filesystem")" = "" ] ; then
   echo "$s не squashfs."
   exit 1
else
   if [ `echo $s | grep -ice ".\.sfs$"` -ne 1 ]; then
      echo "Используйте: $self file.sfs"
      exit 1
   elif [ ! -f "$s" ]; then
      if [ -L "$s" ]; then
      	echo "Неправильная символическая ссылка!"
      else
      	echo "Файл не найден!"
      fi
      exit 1
   fi
fi

FLP

# dim-kut ------ проверка расположения sfs-модуля
parent_dir=${sfs_path:0:4}
parent_dir2=${sfs_path:0:1}
FULL_PATH="$s"

if [ $parent_dir2 == '.' ] # если путь начинается с ./
then
pwd_path="`pwd`"
parent_dir=${pwd_path:0:4}
sfs_name=`basename "$s"`
FULL_PATH="${pwd_path}/${sfs_name}"
fi

TST() {
#if [ "$(mount | grep "/dev/[s,h]d" | grep "$parent_dir")" = "" ]
if [ "$($mount | grep "/dev/[s,h][d,r]" | grep "$parent_dir")" = "" ]
then
  xpupsay "Файл не может быть подключен, поскольку находится в главной файловой системе.
  Переместите файл на один из носителей." &
 exit 1
fi 
}
# dim-kut -------

#--- Load sfs module ---

CD() {
#- If module on removable media (cd) then advise user
for cdrom in `$mount | grep iso9660 | cut -d " " -f3`
do
   if [ `echo "$sfs_path" | grep -ic $cdrom` -gt 0 ]; then
      msg="\nsfs модуль расположен на компакт-диске. При его загрузке\nвы не сможете использовать привод для других целей до перезапуска ПК. \nВы действительно хотите загрузить его?\n"
      Xdialog --title "$self" --yesno "$msg"  6 0
      [ $? -ne 0 ] && exit 0
      break
   fi
done
}
[ "$ram" = "1" ] || CD

xpupsay "Идет подключение модуля $sfs_module..." &

status=0
mount_point="/mnt/.$sfs_module"

[ ! -d "$mount_point" ] && `which sudo` mkdir "$mount_point" 
#echo "Загрузка $sfs_module..."
echo "Load: $sfs_module..."
#echo "$mount_point" $s ;exit
#loop-tst
#echo $s.111
#$mount -o loop "$s" "$mount_point"  
mount -o loop "$s" "$mount_point"  
 status=$?
	
if [ $status -eq 0 ]; then
#loop-tst
#   mount -o remount,append:"$mount_point"=ro / 
        if [ "$up" = "1" ] ;then
        	$mount -o remount,add:1:"$mount_point"=ro / 
    	    else
        	#echo "$mount -o remount,append:"$mount_point"=ro / "
        	$mount -o remount,append:"$mount_point"=ro / 
	fi
   status=$?

   if [ $status -gt 0 ]; then
xpupsay "Ошибка! Не union формат файла $sfs_module.sfs." &
	`which sudo` rmdir "$mount_point"
	exit 1
   fi
else

xpupsay "Ошибка! Невозможно подключить $sfs_module.sfs." &
	`which sudo` rmdir "$mount_point"
	exit 1
fi

#--- Post-load processes ---

XRESTART=""

if [ -x "$mount_point/.$sfs_module" ]; then
	bash "$mount_point/.$sfs_module"
else
	#- update ld.conf.so (libraries)
	if [ ! -z "`which ldconfig`" ]; then
	 	if [ -d  "$mount_point/usr/lib" -o -d "$mount_point/usr/local/lib" ]; then
	 		#echo "Обновление library cache /etc/ld.so.cache..."
	 		echo "Update library cache /etc/ld.so.cache..."
	 		`which sudo` ldconfig
	 	fi
	fi
	
	#- update/refesh menus 	
	if [ `find "$mount_point" | grep -ic "desktop$"` -gt 0 ];then
		fixmenus
		icewm 
	fi
	if [ -f "$mount_point"/start.sh ];then 
		"$mount_point"/start.sh 
	fi	 	

	#- make new kernel modules available, must still be loaded when needed
	kernel_version="`uname -r`"
	if [  `find "$mount_point/lib/modules/$kernel_version" 2>/dev/null | grep -ic "ko$"` -gt 0 ]; then
		#echo "Запуск depmod...."
		echo "Run depmod...."
		`which sudo` depmod
	fi

	#make new fonts available
	for font_dir in "/usr/X11R6/lib/X11/fonts/TTF" "/usr/share/fonts/default/TTF"
	do
		if [ -d "$mount_point/$font_dir" ]; then
			cd "$font_dir"
			`which sudo` `which mkfontscale` .
			`which sudo` `which mkfontdir` .
		fi		
	done
fi

[ -x /usr/local/bin/refreshDesktopIcons ] && /usr/local/bin/refreshDesktopIcons

EV() {
if [ "$(ls /usr/local/sfs_event/sfs_scripts | grep ${sfs_module}.sfs)" = "" ]; then 
/usr/local/sfs_event/sfs_add "$FULL_PATH"
else
/usr/local/sfs_event/sfs_scripts/sfs_reload-${sfs_module}.sfs
fi
}
[ "$up" = "1" ] || EV
#[ "$up" = "1" ] || ([ "$ram" = "1" ] || EV)

xpupsay "Успешно! Модуль $sfs_module подключен." &
