#!/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.

#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

if [ "$PUPMODE" = "5" ];then
 gxmessage "エラー。最初にシャットダウンして個人保存ファイルを作成して下さい。"
 exit
fi

if [ ! "$PUP_HOME" ];then #defined in PUPSTATE.
 EXTRASFSMNTPT='/'
 MSGx="注意2: これらのファイルは $PDEV1 パーティションの '/' にあります"
 MSGz='/'
else
 EXTRASFSMNTPT="/initrd${PUP_HOME}"
 MSGx="注意2: これらのファイルは'pup_save'と同じ /mnt/home にあります"
 MSGz='/mnt/home'
fi
#for multisession cd, extra sfs files have to be on the cd...
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="注意2: これらのファイルはパピー起動CDにあります"
 MSGz='/'
 if [ "$EXTRASFSMNTPT" = "" ];then
  EXTRASFSMNTPT='/'
  MSGx="注意2: すべてのSFSファイルはCDからRAMにロードされなければなりません"
 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
 ALLSFSLIST="`ls -1 *.sfs | grep -v '^z' | grep -v "^pup" | 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
  gxmessage "すみません、 $MSGz ディレクトリには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 \"ブートマネージャ: SFSファイル\" --left --stdout --separator \" \" --check \"上のユーザー選択を無視してファイル名が '_${PUPPYVERSION}' の全てのファイルをロードする\" $EXTRASFSAUTO --help \"
パピー用の追加SFSファイルがあります：フォーラムのアナウンスをご覧下さい。又は\n
http://distro.ibiblio.org/pub/linux/distributions/puppylinux/sfs_modules-2/ \n
\n
'$MSGz' をダウンロードして、ブートマネージャで使いたいSFSファイルを選択し、\n
その後パピーを再起動します。\n
\n
注意１： \n
ブートマネージャは「システム」メニューにあります。\n
注意２： \n
チェックボックスチェックをはずす事を忘れないで下さい。チェックしておくと\n
_${PUPPYVERSION} の名前のSFSファイルだけを、選択を無視してロードします。\n
注意３： \n
SFSファイルに名前をつける時、'_xxx' と名付けないで下さい（xxx は３桁の数字）。\n
パピーはこれをパピーバージョン番号と解釈します。\n
そして '_${PUPPYVERSION}' でなければそのファイルのロードを拒絶します。\n
注意４： \n
実際もし '_xxx' が '_${PUPPYVERSION}' でなければ、リストアップさえされません。\n
 -- 注意して下さい！\" --buildlist \"注意１: 右のペインには、たった３つの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: Module blacklist manager\" --left --stdout --separator \" \" --buildlist \"左ペインは現在ロードされているモジュールです。\n
右ペインは「blacklist」されたモジュールの全リストです。\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 "Please wait, processing..." &
 X1PID=$!
 . /etc/rc.d/MODULESCONFIG
 MODLIST=""
 LOADEDMODULES=" `lsmod | grep -v '^Module' | cut -f 1 -d ' ' | tr '\n' ' '`"
 ALLMODULES="`cat /lib/modules/modules.dep.$KERNVER | cut -f 1 -d ':' | grep -o '[a-zA-Z0-9_-]*\.ko$' | 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
  MODLIST="$MODLIST $NAMEONLY $NAMEONLY off"  
 done
 for ONEMOD in $ADDLIST
 do
  MODPATTERN=" $ONEMOD "
  #leave off list if already loaded...
  [ "`echo "$LOADEDMODULES" | grep "$MODPATTERN"`" != "" ] && continue
  MODLIST="$MODLIST $ONEMOD $ONEMOD on"
 done
 kill $X1PID
 EXECME="Xdialog --wmclass \"module16\" --title \"BootManager: Module add-list manager\" --left --stdout --separator \" \" --buildlist \"左ペインはパピーで使える（そして現在ロードされていない）モジュールの\n全リストです。\n右ペインは（デフォルトでは自動的にロードされず）起動時に明示的\nに選択したモジュールです。\nモジュールを強制的にロードしたい時は、そのモジュールを右ペインに移動して\n「OK」ボタンをクリック後、パピーを再起動sして下さい。\n注意：その他のモジュールについての詳細を調べたい時は、\n「システム」メニューにある PupScan を起動して下さい\" 0 0 8 $MODLIST >/tmp/yesrettags.txt"
 eval $EXECME
 RETVAL=$?
 [ ! $RETVAL -eq 0 ] && return 1
 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
 
if [ "$CLPARAM1" = "extrasfs" ];then
 extrasfs_func
 exit
fi

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

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

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

export MAIN_DIALOG="
<window title=\"ブートマネージャ\" icon-name=\"gtk-cdrom\">
<vbox>
 <text use-markup=\"true\">
 <label>\"<b>パピーブートの設定</b>\"</label></text>
 
 <frame SFSファイルのロード>
  <text><label>パピーは、常にロードされている 'pup_${PUPPYVERSION}.sfs' という名前のファイルを持っています。でも、起動時に別のSFSファイルをロードする事ができます。たとえば、'kde.sfs'はKDEアプリケーションを提供します。'devx_${PUPPYVERSION}.sfs'はC/C++ソースをコンパイルする全てを提供します。これらは、たくさんのパッケージを１つのファイルにまとめたコンボパック(combo packs)と言えるでしょう。</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>もしドライバモジュールがロードされなかったり、間違ったものがロードされたり、あるいはモジュールを「blacklist」したい時は、ここで行って下さい。共通したシナリオはドライバを自動ロードさせる事です。例えばワイアレスネットワークカードが使えない、あるいは使いたくない、そして他のモジュールが必要であったり、（ウィンドウズドライバを使うための）Ndiswrapper を使いたい時は、ここで行って下さい。</label></text>
  <hbox>
   <text><label>モジュールを「blacklist」するにはここをクリック：</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>
 </frame>

 <hbox>
  <button><input file stock=\"gtk-quit\"></input><label>終了</label></button>
 </hbox>
</vbox>
</window>
"

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



###END###
