#!/bin/sh
#BK 2007, original idea from sunburnt
#Lesser GPL licence v2 (http://www.fsf.org/licensing/licenses/lgpl.html). 2007 www.puppylinux.com
#written for Puppy 2.16.
#/etc/rc.d/BOOTCONFIG has variable EXTRASFSLIST='kde.sfs devx_216.sfs'
# ...space-delimited list of .sfs files to be loaded.
# ...must be located at same place as the pup_save file (in /mnt/home)
#    or at '/' for full hd installation.
#v2.17
#/etc/rc.d/MODULESCONFIG has variables PCI_OVERRIDES, SKIPLIST
#that are read and managed by the BootManager.
#v4.02 bugfix, modules now .ko.gz.
#v4.02 /lib/modules/modules.dep.<kernver> no more.
#v403 yeslist_func, parameters may be added to modules.
#v409 bugfix, list of sfs files was picking up non-sfs files.
#v411 bugfix, when choose to add more than one module.
#Translated for Russian by Valerij Kruvjalis (vkvkvk).

#reentrant.
#$1='' then run the main window.
#$1=extrasfs then run the extrasfs_func.
CLPARAM1="$1"
CLPARAM2="$2"

CURRDIR="`pwd`"
. /etc/rc.d/PUPSTATE
PUPPYVERSION="`cat /etc/puppyversion`"
KERNVER="`uname -r`"
EXTRASFSAUTO='off' #user choices.
if [ -f /etc/rc.d/BOOTCONFIG ];then
 . /etc/rc.d/BOOTCONFIG
 [ "`cat /etc/rc.d/BOOTCONFIG | grep 'EXTRASFSLIST'`" = "" ] && EXTRASFSAUTO='on'
else
 EXTRASFSAUTO='on'
fi

#v3.02
. /etc/rc.d/MODULESCONFIG
DEFAULT_SERIAL="false"
DEFAULT_FAST="false"
[ "$BYPASSSERIALPROBING" = "yes" ] && DEFAULT_SERIAL="true"
[ "$FASTBOOTMODULESLIST" != "" ] && DEFAULT_FAST="true"

if [ "$PUPMODE" = "5" ];then
 gxmessage -title "BootManager - ОШИБКА!" "ОШИБКА. Сначала необходимо создать персональный файл, перегрузив систему."
 exit
fi

if [ "$PUP_HOME" = "" ];then #defined in PUPSTATE.
 EXTRASFSMNTPT='/'
 MSGx="Примечание2: Эти файлы находятся в '/' (на разделе $PDEV1)"
 MSGz='/'
else
 EXTRASFSMNTPT="/initrd${PUP_HOME}"
 MSGx="Примечание2: Эти файлы находятся в /mnt/home (там же, где и файлы 'pup_save')"
 MSGz='/mnt/home'
fi
#for multisession cd, extra sfs files have to be on the cd...
#v3.97 sfs files are at '/', saved with a session...
if [ "$PUPMODE" = "77" ];then
# MPATTERN="/dev/${PDEV1} "
# EXTRASFSMNTPT="`mount | grep "$MPATTERN" | cut -f 3 -d ' '`"
# #...it may not be mounted, then gets mounted below.
# MSGx="Note2: These files are on the Puppy boot CD"
 MSGz='/'
# if [ "$EXTRASFSMNTPT" = "" ];then
  EXTRASFSMNTPT='/'
  MSGx="Примечание2: Все SFS файлы были загружены в оперативную память с CD"
# fi
fi

extrasfs_func() {

 UNMOUNTME=""
 #if [ "$PUPMODE" = "77" ];then
 # if [ "$EXTRASFSMNTPT" = "" ];then
 #  xmessage "Make sure Puppy CD inserted in drive /dev/$PDEV1 RIGHT NOW!"
 #  mkdir -p /mnt/$PDEV1
 #  mount -t $DEV1FS /dev/$PDEV1 /mnt/$PDEV1 #DEV1FS, PDEV1 are in PUPSTATE.
 #  [ ! $? -eq 0 ] && return 1
 #  EXTRASFSMNTPT="/mnt/$PDEV1"
 #  UNMOUNTME="/mnt/$PDEV1"
 # fi
 #fi
 	
 cd $EXTRASFSMNTPT
 #v409 lobster gets some non-sfs files in ALLSFSLIST ...i have no idea how, but
 #need an extra grep filter here...
 ALLSFSLIST="`ls -1 *.sfs | grep -v '^z' | grep -v "^pup" | grep '\.sfs$' | tr "\n" " "`"
 cd $CURRDIR
 sync
 [ "$UNMOUNTME" != "" ] && umount $UNMOUNTME
 
 #eliminate other versions from list...
 FIXEDSFSLIST=""
 for ONESFS in $ALLSFSLIST
 do
  [ "`echo "$ONESFS" | grep '_[0-9][0-9][0-9]' | grep -v "$PUPPYVERSION"`" != "" ] && continue
  FIXEDSFSLIST="$FIXEDSFSLIST $ONESFS"
 done
 ALLSFSLIST="$FIXEDSFSLIST"

 #compose list for xdialog listbox...
 for ONESFS in $ALLSFSLIST
 do
  if [ "$EXTRASFSLIST" = "" ];then
   DLGLIST="$DLGLIST $ONESFS $ONESFS off"
  else
   [ "`echo -n "$EXTRASFSLIST" | grep -v "$ONESFS"`" != "" ] && DLGLIST="$DLGLIST $ONESFS $ONESFS off"
  fi
 done
 for ONESFS in $EXTRASFSLIST
 do
  DLGLIST="$DLGLIST $ONESFS $ONESFS on"
 done
 
 if [ "$DLGLIST" = "" ];then
  [ "$CLPARAM2" = "quiet" ] && return 1
  xmessage -title "BootManager - ОШИБКА!" "К сожалению, в каталоге $MSGz нет SFS файлов.
(или они имеют неподходящий номер версии '*_nnn.sfs')
Сначала необходимо загрузить и поместить туда хотя бы один из них."
  return 1
 fi

 # --icon \"/usr/local/lib/X11/pixmaps/module24.xpm\"
 #note, jwm will use module16.xpm as the window icon...
 EXECME="Xdialog --wmclass \"module16\" --backtitle \"Выберите SFS файлы, которые должны загружаться при запуске системы.\n(расположение в списке соответствует порядку следования уровней Unionfs)\" --title \"BootManager: SFS файлы\" --left --stdout --separator \" \" --check \"Игнорировать выбранные пользователем файлы, загружать только с '_${PUPPYVERSION}' в названиях\" $EXTRASFSAUTO --help \"
Дополнительные файлы для Вашего Puppy можно найти: В сообщениях на Форуме или\n
по адресу: http://distro.ibiblio.org/pub/linux/distributions/puppylinux/sfs_modules-3/ \n
\n
Загрузите их в '$MSGz', выберите в Менеджере загрузки необходимые и,\n
затем, перезагрузите Puppy.\n
\n
Примечание1: \n
BootManager находится в меню 'Система'.\n\n
Примечание2: \n
Не забудьте снять галочку в переключателе, иначе Ваш выбор будет игнорирован и\n
грузиться будут только SFS файлы с '_${PUPPYVERSION}' названиях.\n\n
Примечание3: \n
При именовании SFS файлов не используйте в их названиях '_xxx', где xxx - три\n
цифровых символа, т.к. Puppy будет интерпретировать это в качестве номера версии\n
и откажется грузить файлы, в названиях которых данные числа отличаются от '_${PUPPYVERSION}'.\n\n
Примечание4: \n
а самом деле, файлы, в названиях которых '_xxx' не будут совпадать с '_${PUPPYVERSION}',\n
вообще не отобразятся в списке -- учтите, пожалуйста, это!\n\" --buildlist \"Примечание1: Не более 3-х SFS файлов может быть в правой панели!\n${MSGx}\" 0 0 8 $DLGLIST >/tmp/bmrettags.txt"

 while [ 1 ];do
  eval $EXECME
  RETVAL=$?
  #if [ $RETVAL -eq 3 ];then #help
  # #exits with 3 if --help has an empty string.
  # #so, could have detailed help box here.
  # continue
  #fi
  [ ! $RETVAL -eq 0 ] && return 1
  [ $RETVAL -eq 0 ] && break
 done
 
 RETTAGS="`cat /tmp/bmrettags.txt`"

 if [ "`echo "$RETTAGS" | grep 'unchecked'`" = "" ];then
  #auto mode, remove EXTRASFSLIST entry from BOOTCONFIG...
  if [ -f /etc/rc.d/BOOTCONFIG ];then
   grep -v 'EXTRASFSLIST' /etc/rc.d/BOOTCONFIG > /tmp/BOOTCONFIG
   cat /tmp/BOOTCONFIG > /etc/rc.d/BOOTCONFIG
  fi
  return 0
 fi
 
 RETTAGS="`echo -n "$RETTAGS" | sed -e 's/unchecked//g' | sed -e 's/checked//g' | sed -e 's/ $//g'`"

 [ ! -e /etc/rc.d/BOOTCONFIG ] && touch /etc/rc.d/BOOTCONFIG
 grep -v 'EXTRASFSLIST' /etc/rc.d/BOOTCONFIG > /tmp/BOOTCONFIG
 cat /tmp/BOOTCONFIG > /etc/rc.d/BOOTCONFIG
 echo "EXTRASFSLIST='$RETTAGS'" >> /etc/rc.d/BOOTCONFIG

} #end extrasfs_func

blacklist_func() {
 #blacklisting of modules at bootup.
 . /etc/rc.d/MODULESCONFIG
 MODLIST=""
 LOADEDMODULES="`lsmod | grep -v '^Module' | cut -f 1 -d ' ' | tr '\n' ' '`"
 for ONEMOD in $LOADEDMODULES
 do
  MODLIST="$MODLIST $ONEMOD $ONEMOD off"
 done
 for ONEMOD in $SKIPLIST
 do
  MODLIST="$MODLIST $ONEMOD $ONEMOD on"
 done
 EXECME="Xdialog --wmclass \"module16\" --title \"BootManager: 'Чёрный' список модулей\" --left --stdout --separator \" \" --buildlist \" На левой панели размещены модули, которые в настоящее время загружены.\n
На правой панели представлен полный перечень модулей, помещённых в 'черный список'.\n
Если Вы не хотите, чтобы модуль грузился, переместите его в правую панель, нажмите\n
кнопку OK и перезагрузите компьютер.\n
Примечание:  Если Вы хотите получить дополнительную информацию о конкретном модуле,\n
запустите утилиту PupScan (см. меню 'Система')\" 0 0 8 $MODLIST >/tmp/skiprettags.txt"
 eval $EXECME
 RETVAL=$?
 [ ! $RETVAL -eq 0 ] && return 1
 SKIPLIST=" `cat /tmp/skiprettags.txt | tr '\n' ' '`"
 #now update /etc/rc.d/MODULESCONFIG...
 grep -v '^SKIPLIST' /etc/rc.d/MODULESCONFIG > /tmp/MODULESCONFIG
 mv -f /tmp/MODULESCONFIG /etc/rc.d/MODULESCONFIG
 echo "SKIPLIST='${SKIPLIST}'" >> /etc/rc.d/MODULESCONFIG
} #end blacklist_func

yeslist_func() {
 #choose extra modules to load at bootup.
 yaf-splash -font "8x16" -outline 0 -margin 4 -bg orange -text "Пожалуйста, подождите, идёт анализ системы..." &
 X1PID=$!
 . /etc/rc.d/MODULESCONFIG
 MODLIST=""
 #note, lsmod will show all modules with '-' as '_'...
 LOADEDMODULES=" `lsmod | grep -v '^Module' | cut -f 1 -d ' ' | tr '\n' ' '`"
 #v403 handles both .ko and .ko.gz modules...
 ALLMODULES="`cat /lib/modules/$KERNVER/modules.dep | cut -f 1 -d ':' | grep -o '[a-zA-Z0-9_-]*\.ko' | tr '\-' '_' | sort - | tr '\n' ' '`"
 for ONEMOD in $ALLMODULES
 do
  NAMEONLY="`basename $ONEMOD .ko`"
  MODPATTERN=" $NAMEONLY "
  #leave off list if already loaded...
  [ "`echo "$LOADEDMODULES" | grep "$MODPATTERN"`" != "" ] && continue
  MODPATTERN=' '"$NAMEONLY"'[ :]'
  #leave off left pane if already on right pane...
  [ "`echo "$ADDLIST" | grep "$MODPATTERN"`" != "" ] && continue
  MODLIST="$MODLIST $NAMEONLY $NAMEONLY off"  
 done
 for ONEMOD in $ADDLIST
 do
  NAMEONLY="$ONEMOD"
  xONEMOD="$ONEMOD"
  if [ `echo -n "$ONEMOD" | tr ':' ' ' | wc -w` -gt 1 ];then
   MPARAMS="`echo -n "$ONEMOD" | cut -f 2-9 -d ':' | tr ':' ' '`"
   NAMEONLY="`echo -n "$ONEMOD" | cut -f 1 -d ':'`"
   xONEMOD="$NAMEONLY $MPARAMS"
  fi
  MODPATTERN=" $NAMEOLY "
  #leave off list if already loaded...
  [ "`echo "$LOADEDMODULES" | grep "$MODPATTERN"`" != "" ] && continue
  MODLIST="$MODLIST $ONEMOD \"$xONEMOD\" on"
 done
 kill $X1PID
 EXECME="Xdialog --wmclass \"module16\" --title \"BootManager: Загружаемые модули\" --left --stdout --separator \" \" --buildlist \"В левой панели представлен полный список модулей, которые могут использоваться\nв Puppy (и не загружены в настоящее время).\nВ правой панели - модули, которые Вы явно выбрали для загрузки при старте Puppy\n(по умолчанию автоматически не загружаются).\nЕсли Вы хотите, чтобы какой-либо модуль грузился при загрузке Puppy, переместите его\nв правую панель, нажмите кнопку OK и перезагрузите компьютер.\nПримечание:  Если Вы хотите получить дополнительную информацию о конкретном\nмодуле, запустите утилиту PupScan (см. меню 'Система')\" 0 0 8 $MODLIST >/tmp/yesrettags.txt"
 eval $EXECME
 RETVAL=$?
 [ ! $RETVAL -eq 0 ] && return 1
 cat /tmp/yesrettags.txt | tr ' ' '\n' | tr ':' ' ' > /tmp/modules_addlist_edit #v411
 Xdialog --backtitle "При желании можно добавить необходимые параметры к этим модулям\nНапример: mmc_block major=179\nЕсли Вы не уверены, к чему это приведёт, просто нажмите кнопку 'OK'"  --wmclass "module16" --title "BootManager: Добавление модуля" --left --stdout --no-cancel --editbox /tmp/modules_addlist_edit 0 0 > /tmp/modules_addlist_edit_out
 [ $? -ne 0 ] && return 1
 ADDLIST="`cat /tmp/modules_addlist_edit_out`"
 ADDLIST=' '"`echo "$ADDLIST" | tr ' ' ':' | tr '\n' ' ' | tr -s ' '`"
 #ADDLIST=" `cat /tmp/yesrettags.txt | tr '\n' ' '`"
 #now update /etc/rc.d/MODULESCONFIG...
 grep -v '^ADDLIST' /etc/rc.d/MODULESCONFIG > /tmp/MODULESCONFIG
 mv -f /tmp/MODULESCONFIG /etc/rc.d/MODULESCONFIG
 echo "ADDLIST='${ADDLIST}'" >> /etc/rc.d/MODULESCONFIG
} #end yeslist_func

#  \"Sometimes two modules are eligible for the same hardware, and you need to choose\none of them. An example is the rt2500usb and rt73usb wireless networking modules\n-- with some hardware these are both eligible however our experience has been that\nthe rt73usb works better. For such a situation, create a line here, of format\nmodule1:module2, where you want module2 to have preference over module1.\nNote: an alternative approach is to blacklist the rt2500usb module (see main menu)\nhowever that is gross as it always prevents rt2500usb from loading.\"

preflist_func() {
 xPREFLIST="`echo -n "$PREFLIST" | sed -e 's/^ //' | tr ' ' '\n'`"
 echo "$xPREFLIST" > /tmp/bootmanager_preflist
  xxPREFLIST="`Xdialog --backtitle \"При необходимости выбора для загрузки одного из двух\nмодулей, создайте шаблон формата:\nmodule1:module2\nи module2 будет иметь преимущество перед module1.\" --wmclass \"module16\" --title \"BootManager: Список предпочтений модулей\" --left --stdout --help \"Иногда два модуля могут использоваться с некоторым оборудованием, и Вам необходимо\n выбрать один из них. К примеру, модули беспроводной сети rt2500usb и rt73usb -- они оба\n работают с определённым оборудованием, однако из опыта Вы знаете, что rt73usb\n работает лучше. В этом случае создайте шаблон в формате rt2500usb:rt73usb, чтобы\n модуль rt73usb имел преимущество при загрузке перед rt2500usb.\nПримечание: в качестве альтернативы можно поместить модуль rt2500usb в 'чёрный' список\n(см. главное меню) и тогда он будет вообще исключен из загрузки.\" --editbox /tmp/bootmanager_preflist 0 0`"
 if [ $? -eq 0 ];then
  NEWPREFLIST="`echo "$xxPREFLIST" | tr '\n' ' ' | sed -e 's/^/ /' | tr -s ' '`"
  grep -v '^PREFLIST' /etc/rc.d/MODULESCONFIG > /tmp/MODULESCONFIG
  mv -f /tmp/MODULESCONFIG /etc/rc.d/MODULESCONFIG
  echo "PREFLIST='${NEWPREFLIST}'" >> /etc/rc.d/MODULESCONFIG
 fi
} #end preflist_func

if [ "$CLPARAM1" = "extrasfs" ];then
 extrasfs_func
 exit
fi

if [ "$CLPARAM1" = "blacklist" ];then
 blacklist_func
 exit
fi

if [ "$CLPARAM1" = "yeslist" ];then
 yeslist_func
 exit
fi

if [ "$CLPARAM1" = "preflist" ];then
 preflist_func
 exit
fi

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

export MAIN_DIALOG="
<window title=\"BootManager\" icon-name=\"gtk-cdrom\">
<vbox>
 <text use-markup=\"true\">
 <label>\"<b>Настройка загрузки PuppyRus</b>\"</label></text>
 
 <frame Загрузка SFS файлов>
  <text><label>В PuppyRus есть файл с названием 'pup_${PUPPYVERSION}.sfs', который загружается всегда. Тем не менее, при запуске системы могут подгружаться и другие, дополнительные, SFS файлы, к примеру, 'kde.sfs' - для поддержки работы приложений среды KDE или 'devx_${PUPPYVERSION}.sfs' - для обеспечения компиляции C/C++ исходников. Их можно рассматривать как некие 'комбинированные пакеты', содержащие в одном файле множество пакетов.</label></text>
  <hbox>
   <text><label>Нажмите кнопку, чтобы выбрать дополнительные SFS файлы для загрузки при старте:</label></text>
    <button>
     <input file>/usr/local/lib/X11/pixmaps/module24.xpm</input>
     <action>bootmanager extrasfs</action>
    </button>
  </hbox>
 </frame>
 
 <frame Загрузка модулей ядра>
  <text><label> Если модуль какого-либо драйвера не загружается, или грузится с ошибкой, или Вы хотите поместить его в так называемый 'чёрный' список - здесь это можно поправить. Обычно драйверы, к примеру, Вашей беспроводной сетевой карты, загружаются автоматически, однако, вдруг Вы не можете или не хотите использовать их и нужно загрузить какой-то другой модуль или вообще Ndiswrapper (для использования драйвера Windows).</label></text>
  <hbox>
   <text><label>Нажмите кнопку для помещения модуля в 'чёрный' список:</label></text>
    <button>
     <input file>/usr/local/lib/X11/pixmaps/module24.xpm</input>
     <action>bootmanager blacklist</action>
    </button>
  </hbox>
  <hbox>
   <text><label>Нажмите кнопку для для добавления нового модуля:</label></text>
    <button>
     <input file>/usr/local/lib/X11/pixmaps/module24.xpm</input>
     <action>bootmanager yeslist</action>
    </button>
  </hbox>
  <hbox>
   <text><label>Дать при загрузке преимущество одному модулю над другим:</label></text>
    <button>
     <input file>/usr/local/lib/X11/pixmaps/module24.xpm</input>
     <action>bootmanager preflist</action>
    </button>
  </hbox>
 </frame>


 
 <hbox>
  <button><input file stock=\"gtk-quit\"></input><label>ВЫХОД</label></button>
 </hbox>
</vbox>
</window>
"

RETSTRING="`gtkdialog3 --program=MAIN_DIALOG --center`"

eval "$RETSTRING"

[ "$EXIT" = "abort" ] && exit


###END###
