#!/bin/sh
#Badly hacked by Barry Kauler 2005,2006,2007 for Puppy Linux, www.puppylinux.com
#Translated for Russian by Valerij Kruvjalis (vkvkvk).

#BK...
export XDIALOG_HIGH_DIALOG_COMPAT=true
#all incidents of 'dialog' replaced by 'Xdialog' below...
BKPASSED_DEVICE="$1"

#BK 1.0.6... needs C locale to work...
export LANG=C

# Copyright 2004 Kent Robotti <robotti@godmail.com> 8-31-2004
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
# permitted provided that the following conditions are met:
#
# 1. Redistributions of this script must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#
#  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
#  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
#  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO
#  EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
#  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
#  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
#  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
#  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
#  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
#  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# grubconfig is based on liloconfig by Patrick Volkerding fron the
# Slackware Linux distribution.
#
# Copyright 1994, 1998, 1999  Patrick Volkerding, Moorhead, Minnesota USA
# Copyright 2002, 2003, 2004  Slackware Linux, Inc, Concord, CA
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
# permitted provided that the following conditions are met:
#
# 1. Redistributions of this script must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#
#  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
#  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
#  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO
#  EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
#  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
#  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
#  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
#  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
#  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
#  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#

TMP=/tmp/grubconfig
BOOT_TMP=/tmp/boot
CONSOLETYPE=standard
CONSOLENUM=normal

rm -rf $TMP $BOOT_TMP
mkdir -p $TMP $BOOT_TMP

PATH=$PATH:/bin:/usr/bin:/sbin:/usr/sbin

# Menu to check if we want to use VESA framebuffer support:
use_framebuffer() {
CONSOLETYPE=standard
CONSOLENUM=normal
if grep -q "29 fb" /proc/devices ; then
  Xdialog --title "ИСПОЛЬЗОВАТЬ FRAME BUFFER В КОНСОЛИ?" \
  --menu "Судя по набору устройств в /proc/, Ваше ядро, возможно, \
поддерживает использование режима frame buffer (линейный \
кадровый буфер) в консоли. Если мы включим его, это позволит \
отображать большее количество текстовых строк и столбцов на \
экране и даст возможность наблюдать логотип пингвина во время \
загрузки. Однако, данный режим медленнее стандартного. Кроме \
того, не каждая видеокарта и монитор поддерживают все эти \
видео режимы. Хотите ли Вы использовать кадровый буфер консоли, \
или стандартную Linux консоль?" 0 0 0 \
  "standard" "Использовать стандартную Linux консоль (безопасный выбор)" \
  "640x480x256" "Frame buffer консоль, 640x480x256" \
  "800x600x256" "Frame buffer консоль, 800x600x256" \
  "1024x768x256" "Frame buffer консоль, 1024x768x256" \
  "640x480x32k" "Frame buffer консоль, 640x480x32k" \
  "800x600x32k" "Frame buffer консоль, 800x600x32k" \
  "1024x768x32k" "Frame buffer консоль, 1024x768x32k" \
  "640x480x64k" "Frame buffer консоль, 640x480x64k" \
  "800x600x64k" "Frame buffer консоль, 800x600x64k" \
  "1024x768x64k" "Frame buffer консоль, 1024x768x64k" \
  2> $TMP/reply
  if [ ! $? = 0 ]; then
    chroot_umount
    exit
  fi
# Frame buffer modes above 1024x768 look terrible except
# on LCD panels, and 32 bit color is slow.  Since we don't
# even need to run a framebuffer console to run framebuffer
# X anymore, these modes aren't of much real use.
#  "1280x1024x256" "Frame buffer console, 1280x1024x256" \
#  "1600x1200x256" "Frame buffer console, 1600x1200x256" \
#  "1280x1024x32k" "Frame buffer console, 1280x1024x32k" \
#  "1600x1200x32k" "Frame buffer console, 1600x1200x32k" \
#  "1280x1024x64k" "Frame buffer console, 1280x1024x64k" \
#  "1600x1200x64k" "Frame buffer console, 1600x1200x64k" \
#  "640x480x16m" "Frame buffer console, 640x480x16.8m" \
#  "800x600x16m" "Frame buffer console, 800x600x16.8m" \
#  "1024x768x16m" "Frame buffer console, 1024x768x16.8m" \
#  "1280x1024x16m" "Frame buffer console, 1280x1024x16.8m" \
#  "1600x1200x16m" "Frame buffer console, 1600x1200x16.8m"
  CONSOLETYPE="`cat $TMP/reply`"
  if [ "$CONSOLETYPE" = "standard" ]; then
    CONSOLENUM=normal
  elif [ "$CONSOLETYPE" = "1600x1200x16m" ]; then
    CONSOLENUM=799
  elif [ "$CONSOLETYPE" = "1600x1200x64k" ]; then
    CONSOLENUM=798
  elif [ "$CONSOLETYPE" = "1600x1200x32k" ]; then
    CONSOLENUM=797
  elif [ "$CONSOLETYPE" = "1600x1200x256" ]; then
    CONSOLENUM=796
  elif [ "$CONSOLETYPE" = "1280x1024x16m" ]; then
    CONSOLENUM=795
  elif [ "$CONSOLETYPE" = "1280x1024x64k" ]; then
    CONSOLENUM=794
  elif [ "$CONSOLETYPE" = "1280x1024x32k" ]; then
    CONSOLENUM=793
  elif [ "$CONSOLETYPE" = "1280x1024x256" ]; then
    CONSOLENUM=775
  elif [ "$CONSOLETYPE" = "1024x768x16m" ]; then
    CONSOLENUM=792
  elif [ "$CONSOLETYPE" = "1024x768x64k" ]; then
    CONSOLENUM=791
  elif [ "$CONSOLETYPE" = "1024x768x32k" ]; then
    CONSOLENUM=790
  elif [ "$CONSOLETYPE" = "1024x768x256" ]; then
    CONSOLENUM=773
  elif [ "$CONSOLETYPE" = "800x600x16m" ]; then
    CONSOLENUM=789
  elif [ "$CONSOLETYPE" = "800x600x64k" ]; then
    CONSOLENUM=788
  elif [ "$CONSOLETYPE" = "800x600x32k" ]; then
    CONSOLENUM=787
  elif [ "$CONSOLETYPE" = "800x600x256" ]; then
    CONSOLENUM=771
  elif [ "$CONSOLETYPE" = "640x480x16m" ]; then
    CONSOLENUM=786
  elif [ "$CONSOLETYPE" = "640x480x64k" ]; then
    CONSOLENUM=785
  elif [ "$CONSOLETYPE" = "640x480x32k" ]; then
    CONSOLENUM=784
  elif [ "$CONSOLETYPE" = "640x480x256" ]; then
    CONSOLENUM=769
  fi
fi
}

chroot_umount() {
if [ "$CHROOT" = "YES" ]; then
  umount /proc
fi
}

create_devices() {
      fdisk -l >$TMP/DEV 2>$TMP/null
}

hd_mbr() {
 mbr_dev="`grep "^Disk /dev/" $TMP/DEV | head -n 1 | cut -d ' ' -f 2 | cut -b 1-8`"
 mbr_dev2="`grep "^Disk /dev/" $TMP/DEV | tail -n 1 | cut -d ' ' -f 2 | cut -b 1-8`"
 if [ -z $mbr_dev ]; then
  kill $INFOPID 2>/dev/null
  $DIALOG --title "Grubconfig: ОШИБКА" --msgbox \
  "Не найден раздел для установки GRUB!" 0 0 #5 60
  umount $BOOT_TMP 2>$TMP/null && rmdir $BOOT_TMP
  rm -rf $TMP
  chroot_umount
  exit
 elif [ $mbr_dev2 = $mbr_dev ]; then
  mbr_grub_dev=hd0
  #BK if ! probe $mbr_dev; then
  if [ "`probepart | grep "$mbr_dev"`" = "" ];then
   kill $INFOPID 2>/dev/null
   $DIALOG --title "Grubconfig: ОШИБКА" --msgbox \
   "Не найден диск '$mbr_dev', поэтому невозможно установить GRUB!" 0 0 #5 68
   umount $BOOT_TMP 2>$TMP/null && rmdir $BOOT_TMP
   rm -rf $TMP
   chroot_umount
   exit
  fi
 else
  while :
  do
   cat << EOF >$TMP/tmpmsg
Пользователям Puppy: если программа запущена из Универсального инсталлятора,\n
             оставьте поле пустым и просто нажмите кнопку OK.\n\n

Обычно GRUB устанавливается в MBR первого жёсткого диска, в Вашем случае в 
'$mbr_dev'.\n\n

Если у Вас более одного жёсткого диска и Вы хотите установить GRUB в MBR 
какого-либо другого диска, укажите в поле, расположенном ниже, его название 
или впишите туда '$mbr_dev'.
EOF
 
   #    $DIALOG --title "HARD DRIVE MBR" --inputbox "`cat $TMP/tmpmsg`" 0 68 2> $TMP/mbr_dev
   kill $INFOPID 2>/dev/null
   $DIALOG --title "Grubconfig: MBR на жёстком диске" --inputbox "`cat $TMP/tmpmsg`" 0 0 2> $TMP/mbr_dev
   if [ ! $? = 0 ]; then
    umount $BOOT_TMP 2>$TMP/null && rmdir $BOOT_TMP
    rm -rf $TMP
    chroot_umount
    echo
    echo "Отменено!"
    exit
   fi 
   MBR_DEV="`cat $TMP/mbr_dev`"
   ombr_dev="$mbr_dev" #BK
   if [ -n $MBR_DEV ]; then
    mbr_dev="$MBR_DEV"
   fi
   
   #BK bug above, dunno why...
   [ "$mbr_dev" = "" ] && mbr_dev="$ombr_dev"
      
   #BK if probe $mbr_dev; then
   if [ ! "`probepart | grep "$mbr_dev"`" = "" ];then
    break
   else
    kill $INFOPID 2>/dev/null
    $DIALOG --title "Grubconfgi: ОШИБКА" --msgbox \
    "Не найдено устройство '$mbr_dev'." 0 0 #5 45
    continue
   fi
  done
  NUM=0
  grep "^Disk /dev/" $TMP/DEV | cut -d ' ' -f 2 | cut -b 1-8 | while read dev; do
   echo "hd$NUM" >$TMP/mbr_grub_dev
   if [ "$dev" = "$mbr_dev" ]; then
    break
   fi
   NUM=$(( $NUM + 1 ))
  done
  mbr_grub_dev="`cat $TMP/mbr_grub_dev`"
 fi
}

initrd() {
if [ "$ROOT_DEVICE" = "$1" ]; then
if ls $BOOT/initrd* 1>$TMP/null 2>$TMP/null ; then
initrd=`ls -1 -t $BOOT/initrd* | head -n 1`
if [ ! "$3" = "no" ]; then
  kill $INFOPID 2>/dev/null
  $DIALOG --title "Grubconfig: НАЙДЕН INITRD" --yesno "Хотите ли Вы включить данные \
initrd '$initrd' в файл настройки GRUB?" 0 0 #7 66
return=$?
else
return=0
fi
if [ $return = 0 ]; then
    XDIALOG_HIGH_DIALOG_COMPAT=false $DIALOG --title "Grubconfig" --no-buttons --infobox \
    "Создание /boot/grub/$grub_config файла в $ROOT_DEVICE.\nПожалуйста, ждите..." 0 0 25000 & #3 60
    INFOPID=$!
     sleep 3
size=`gzip -l $initrd 2>$TMP/null | grep -v uncompressed_name | awk '{print $2}'`
if [ ! "$size" = "" ]; then
size=$(( $size / 1024 ))
else
size=$(( `ls -l $initrd | awk '{print $5}'` / 1024 ))
fi
  KERNEL="`echo $KERNEL | awk '{print $1,$2,$3}'` ramdisk_size=$size root=/dev/ram0 rw"
  cat << EOF > $2
# Linux bootable initrd config begins
  title Linux initrd $initrd (on $1)
  root ($hd,$p2)
  $KERNEL
  initrd $initrd
# Linux bootable initrd config ends
EOF
fi
fi
fi
}

get_root_dev() {
NUM=0
grep "^Disk /dev/" $TMP/DEV | cut -d ' ' -f 2 | cut -b 1-8 | while read dev; do
echo "hd$NUM" >$TMP/hd_grub
dev2="`echo $1 | cut -b 1-8`"
if [ "$dev" = "$dev2" ]; then
break
fi
NUM=$(( $NUM + 1 ))
done
hd="`cat $TMP/hd_grub`"
}

other() {
 D=`echo "$@" | cut -d ' ' -f 1`
 get_root_dev $D
 
if echo "$@" | grep -q HURD ; then
grub --no-floppy --batch << EOF 1>$TMP/find_file 2>$TMP/null
find ($hd,$p2)/boot/gnumach.gz
quit
EOF
if grep -q "($hd,$p2)" $TMP/find_file ; then
OTHER="root ($hd,$p2)
  kernel /boot/gnumach.gz root=device:$hd"s"$p1
  module /hurd/ext2fs.static --multiboot-command-line=\${kernel-command-line} --host-priv-port=\${host-port} --device-master-port=\${device-port} --exec-server-task=\${exec-task} -T typed \${root} \$(task-create) \$(task-resume)
  module /lib/ld.so.1 /hurd/exec \$(exec-task=task-create)"
echo "GNU/Hurd (on $DOSP)" > $TMP/label
else
OTHER="rootnoverify ($hd,$p2)
  makeactive
  chainloader --force +1"
echo "SCO Unixware (on $DOSP)" > $TMP/label
fi
elif echo "$@" | grep -q BSD ; then
if echo "$@" | grep -q FreeBSD ; then
OTHER="root ($hd,$p2,a)
  kernel /boot/loader"
else  
OTHER="rootnoverify ($hd,$p2)
  chainloader +1"
fi
elif echo "$@" | grep -q QNX ; then
OTHER="map (hd0) ($hd)
  map ($hd) (hd0)
  rootnoverify ($hd,$p2)
  chainloader +4"
elif echo "$@" | grep -q -E "Plan 9|BeOS|Minix" ; then
OTHER="rootnoverify ($hd,$p2)
  chainloader +1"
elif [ ! "$hd" = "hd0" ]; then
if [ "$p2" = "0" ]; then
OTHER="map (hd0) ($hd)
  map ($hd) (hd0)
  rootnoverify ($hd,$p2)
  makeactive
  chainloader +1"
else
OTHER="map (hd0) ($hd)
  map ($hd) (hd0)
  map (hd0,0) ($hd,$p2)
  map ($hd,$p2) (hd0,0)
  rootnoverify ($hd,$p2)
  makeactive
  chainloader +1"
fi
else
if [ "$p2" = "0" ]; then
OTHER="rootnoverify (hd0,$p2)
  makeactive
  chainloader +1"
else
OTHER="map (hd0,0) (hd0,$p2)
  map (hd0,$p2) (hd0,0)
  rootnoverify (hd0,$p2)
  makeactive
  chainloader +1"
fi
fi
}

# This function scans for bootable partitions (making some assumptions along
# the way which may or may not be correct, but usually work), and sets up
# GRUB in either the superblock, or the MBR.
simplegrub()
{
 LOOPBRK="yes" #BK v2.02
 if grep -q "OS/2 Boot Manager" $TMP/DEV 2> $TMP/null ; then
  kill $INFOPID 2>/dev/null
  $DIALOG --title "Grubconfig: Найден загрузчик OS/2" --yesno \
  "У Вас установлен Менеджер загрузки и в загрузочном меню предусмотрены \
запуск OS/2 и Partition Magic.  Если Вы хотите, можно просто установить \
загрузочный блок GRUB в начало Вашего Linux раздела.  Далее, Вы сможете \
добавить раздел в меню Менеджера загрузки и использовать существующий \
Менеджер для загрузки Linux.  Хотите ли Вы использовать GRUB совместно с \
существующим Менеджером загрузки?" 0 0 #11 65
  if [ $? = 0 ]; then
    TG=Root
    skip=yes
  fi
fi

#while [ 1 ];do #BIGWHILELOOP BK v2.02

if [ ! "$skip" = "yes" ]; then
 kill $INFOPID 2>/dev/null
 $DIALOG --title "Grubconfig: РАЗМЕЩЕНИЕ GRUB" --menu \
"Пользователям Pupply Linux: если выбрать здесь загрузочную дискету\n\
данный скрипт дополнительно перезапустится и снова покажет это окно,\n\
так что Вы сможете установить GRUB в MBR (как правило, выбор MBR на жестком диске предпочтительнее).\n\
CLARIFY: Сначала можно сделать загрузочную дискету, затем установить\n\
в MBR на жёстком диске.\n\
\n\
GRUB может быть установлен различными способами:\n\
\n\
  1. В системный блок (superblock) Linux раздела на '$ROOT_DEVICE',\n\
     (который позволяет сделать раздел загрузочным с помощью программы\n\
     fdisk для DOS или Linux , или загружаться с помощью Менеджера\n\
     загрузки OS/2 и т.д.)\n\
  2. На форматированную дискету.\n\
  3. В MBR (Master Boot Record) на жёстком диске.\n\
\n\
Пункты  1 и 2 наиболее безопасны, но пункт 1 требует небольшой дополнительной\n\
работы позже (назначения раздела загрузочным с помощью программы fdisk).\n\
Какой способ Вам больше подходит? (Кнопка Cancel прекращает работу скрипта)" \
 0 0 4 \
 "Root" "Установить в superblock Linux раздела" \
 "Floppy" "Установить на дискету в /dev/fd0 (A:)" \
 "MBR" "Установить в MBR (возможно, небезопасно)" \
 2> $TMP/reply
 if [ ! $? = 0 ]; then
   chroot_umount
   exit
 fi
 TG="`cat $TMP/reply`"
fi
 
 if [ "$TG" = "MBR" ]; then
  hd_mbr
  MBR=YES
 elif [ "$TG" = "Root" ]; then
  MBR=NO
 elif [ "$TG" = "Floppy" ]; then
  GRUB_TARGET="/dev/fd0"
  MBR=NO
  LOOPBRK="no"
 fi

    XDIALOG_HIGH_DIALOG_COMPAT=false $DIALOG --title "Grubconfig" --no-buttons --infobox \
    "Создание файла /boot/grub/$grub_config на $ROOT_DEVICE.\nПожалуйста, ждите..." 0 0 25000 & #3 60
    INFOPID=$!
     sleep 3

 # Search for Linux partitions:
 grep "83  Linux" $TMP/DEV | while read PART ; do 
 if [ ! "$PART" = "" ]; then
  LNXP="`echo $PART | cut -f 1 -d ' '`"
  p1=`echo $LNXP | cut -b9-`
  p2=$(( $p1 - 1 ))

  get_root_dev $LNXP

  KERNEL="kernel /boot/vmlinuz root=$LNXP ro vga=$CONSOLENUM"

  title="Linux (on $LNXP)"

  num="`echo $LNXP | cut -b8-`" 

  cat << EOF > $TMP/part.$num.sort
# Linux bootable partition config begins
  title $title
  root ($hd,$p2)
  $KERNEL
# Linux bootable partition config ends
EOF
initrd $LNXP $TMP/initrd.conf no
 fi
done

 # OK, now let's look for DOS/WIN/OS2/BSD/HURD partitions:
grep "^/dev/" $TMP/DEV | grep -E "DOS|Win95|W95|FAT|BSD|NTFS|HURD|QNX|Minix|Plan|BeOS" | \
grep -v "Ext'd" | grep -v "Extend" | grep -v -i "swap" | while read PART ; do
  if [ ! "$PART" = "" ]; then
  DOSP="`echo $PART | cut -f 1 -d ' '`"
  p1=`echo $DOSP | cut -b9-`
  p2=$(( $p1 - 1 ))
  if echo $PART | grep -q -E "Win95|W95|NTFS" ; then
  LABEL="Windows (on $DOSP)"
  elif echo $PART | grep -q -E "DOS|FAT" ; then
  LABEL="DOS (on $DOSP)"
  elif echo $PART | grep -q "FreeBSD" ; then
  LABEL="FreeBSD (on $DOSP)"
  elif echo $PART | grep -q "OpenBSD" ; then
  LABEL="OpenBSD (on $DOSP)"
  elif echo $PART | grep -q "NetBSD" ; then
  LABEL="NetBSD (on $DOSP)"
  elif echo $PART | grep -q "BSD" ; then
  LABEL="BSD (on $DOSP)"
  elif echo $PART | grep -q "Minix" ; then
  LABEL="Minix (on $DOSP)"
  elif echo $PART | grep -q "QNX" ; then
  LABEL="QNX (on $DOSP)"
  elif echo $PART | grep -q "BeOS" ; then
  LABEL="BeOS (on $DOSP)"
  elif echo $PART | grep -q "Plan 9" ; then
  LABEL="Plan 9 (on $DOSP)"
  fi

  other $PART

  if echo $PART | grep -q "HURD" ; then
  LABEL="`cat $TMP/label`"
  fi

  num="`echo $DOSP | cut -b8-`" 

  cat << EOF > $TMP/part.$num.sort
# Other bootable partition config begins
  title $LABEL
  $OTHER
# Other bootable partition config ends
EOF
fi
done
 # Done, now we must install GRUB:
 chmod 644 $BOOT/grub/$grub_config
 message=yes
 installcolor;
 
#  # BK v2.02...
#  if [ "$LOOPBRK" = "yes" ];then
   umount $BOOT_TMP 2>$TMP/null && rmdir $BOOT_TMP
   rm -rf $TMP
#   break 
#  fi
# done #BIGWHILELOOP BK
 #something wrong with trying to have a while loop here.
 #instead, a flag to rerun grubconfig...
 echo -n "$LOOPBRK" > /tmp/loopbrk.txt
 
} #end simplegrub func.

find_kernel() {
cat << EOF > $TMP/tmpmsg
`echo "   Загрузочный раздел  Начальный  Конечный блоки    Id  System"`
`grep "^$PART" $TMP/fdisk.list`

Где на указанном выше Linux разделе разместить ядро
для загрузки его загрузчиком GRUB?

По умолчанию - '/boot/vmlinuz'. Просто нажмите клавишу ENTER
для подтверждения этого.
EOF

    kill $INFOPID 2>/dev/null
    $DIALOG --title "Grubconfig: Расположение ядра" --cr-wrap --inputbox "`cat $TMP/tmpmsg`" 0 0 2> $TMP/kernel
    if [ $? = 1 -o $? = 255 ]; then
      umount $BOOT_TMP 2>$TMP/null && rmdir $BOOT_TMP
      rm -rf $TMP
      chroot_umount
      echo
      echo "Cancelled!"
      exit
    else
      kernel="`cat $TMP/kernel`"
    if [ "$kernel" = "" ]; then
      KERNEL="kernel /boot/vmlinuz root=$PART ro vga=$CONSOLENUM"
    else
      KERNEL="kernel $kernel root=$PART ro vga=$CONSOLENUM"
    fi
   fi

cat << EOF > $TMP/tmpmsg
`echo "   Загрузочный раздел  Начальный  Конечный блоки    Id  System"`
`grep "^$PART" $TMP/fdisk.list`

`echo $KERNEL | cut -d ' ' -f 2-`

Хотите ли Вы передать вышеуказанному ядру какие-либо дополнительные параметры?
К примеру: hdd=scsi foo=boo

Укажите их в одну строку один за другим или оставьте окно пустым.
EOF

    kill $INFOPID 2>/dev/null
    $DIALOG --title "Параметры ядра" --cr-wrap --inputbox "`cat $TMP/tmpmsg`" 0 0 2> $TMP/reply
    APPEND="`cat $TMP/reply`"
}

install_grub()
{
NUM=0
grep "^Disk /dev/" $TMP/DEV | cut -d ' ' -f 2 | cut -b 1-8 | while read dev; do
echo "hd$NUM" >$TMP/root_dev
dev2="`echo $ROOT_DEVICE | cut -b 1-8`"
if [ "$dev" = "$dev2" ]; then
break
fi
NUM=$(( $NUM + 1 ))
done
root_dev="`cat $TMP/root_dev`"

     p1=`echo $ROOT_DEVICE | cut -b 9-`
     p2=$(( $p1 - 1 ))

rm -f $TMP/grub.conf
for f in `ls $TMP/part.*.sort`
do
cat $f >> $TMP/grub.conf
done

if [ -f $TMP/initrd.conf ]; then
  cat $TMP/initrd.conf >> $TMP/grub.conf
fi

cat << EOF >> $TMP/grub.conf
title Install GRUB to floppy disk (on /dev/fd0)
pause Insert a formatted floppy disk and press enter.
root ($root_dev,$p2)
setup (fd0)
pause Press enter to continue.
title Install GRUB to Linux partition (on $ROOT_DEVICE)
root ($root_dev,$p2)
setup ($root_dev,$p2)
pause Press enter to continue.
EOF

cat << EOF >> $TMP/grub.conf
title -     For help press 'c', then type: 'help'
root (hd0)
title -     For usage examples, type: 'cat /boot/grub/usage.txt'
root (hd0)
EOF

cat << EOF > $BOOT/grub/usage.txt
=======================================================================
This is an example of how to use the GRUB edit function.

Highlight the menu entry you want to edit, then press 'e', then
highlight the line you want to edit and press 'e'. Add what
you want to the line 'hdd=scsi' etc. and press enter, then
'b' to boot.

Examples of the difference between Linux and GRUB device names.

Linux IDE:	GRUB IDE:	Linux SCSI:	GRUB SCSI:
/dev/hda1       (hd0,0)		/dev/sda1       (hd0,0)
/dev/hda2       (hd0,1)		/dev/sda2       (hd0,1)
/dev/hda3       (hd0,2)		/dev/sda1       (hd0,2)
/dev/hda4       (hd0,3)		/dev/sda2       (hd0,3)
/dev/hdb1       (hd1,0)		/dev/sdb1       (hd1,0)
/dev/hdb2       (hd1,1)		/dev/sdb2       (hd1,1)
/dev/hdb3       (hd1,2)		/dev/sdb1       (hd1,2)
/dev/hdb4       (hd1,3)		/dev/sdb2       (hd1,3)

These are some examples of how to use GRUB from the command prompt.

Press the 'c' key for the command prompt.

If you want to boot a Linux system on a partition, using it's kernel
/boot/vmlinuz etc., do this.

grub> root (hd0,1)
grub> kernel /boot/vmlinuz root=/dev/hda2 ro
grub> boot

You could do this to find what partition the kernel is on.
For example, show me what partitions have a /boot/vmlinuz.

grub> find /boot/vmlinuz
(hd0,1)
(hd0,2)

If you want to boot a Dos/Win partition, do this.

For example, boot partition on /dev/hda1.

grub> rootnoverify (hd0,0)
grub> makeactive
grub> chainloader +1
grub> boot

If you want to boot a FreeBSD partition using /boot/loader.

For example, boot freebsd partition on /dev/hda4.

grub> root (hd0,3,a)
grub> kernel /boot/loader
grub> boot

If that doesn't work, try this instead.

grub> rootnoverify (hd0,3,a)
grub> chainloader +1
grub> boot
==============================================================

Press the [Esc] key to return to the GRUB menu.
EOF

if [ "$MBR" = "NO" ]; then
if [ "$GRUB_TARGET" = "/dev/fd0" ]; then
rm -f $BOOT/grub/device.map
grub --device-map=$BOOT/grub/device.map --batch << EOF 1>$TMP/null 2>$TMP/null
root ($root_dev,$p2)
setup (fd0)
quit
EOF
SUCCESS=$?
installed="установлен на дискету"
else
rm -f $BOOT/grub/device.map
grub --device-map=$BOOT/grub/device.map --no-floppy --batch << EOF 1>$TMP/null 2>$TMP/null
root ($root_dev,$p2)
setup ($root_dev,$p2)
quit
EOF
SUCCESS=$?
installed="установлен в Linux раздел $ROOT_DEVICE"
fi
else
dd if=$mbr_dev of=$BOOT/grub/mbr.`echo $mbr_dev | cut -b 6-8`.$$ bs=512 count=1 >$TMP/null 2>&1 && \
backup_mbr=$BOOT/grub/mbr.`echo $mbr_dev | cut -b 6-8`.$$
rm -f $BOOT/grub/device.map
grub --device-map=$BOOT/grub/device.map --no-floppy --batch << EOF 1>$TMP/null 2>$TMP/null
root ($root_dev,$p2)
setup ($mbr_grub_dev)
quit
EOF
SUCCESS=$?
installed="установлен в MBR на $mbr_dev"
fi  

      if [ -r $BOOT/grub/$grub_config ]; then
       mv $BOOT/grub/$grub_config $BOOT/grub/$grub_config.old.$$
      fi

if [ ! "$backup_mbr" = "" ]; then
mbr_backup=`basename $backup_mbr` 
 cat << EOF > $BOOT/grub/$grub_config
# GRUB configuration file '/boot/grub/$grub_config'.
# generated by 'grubconfig'.  `date +%c 2>$TMP/null`
#
# The backup copy of the MBR for drive '$mbr_dev' is
# here '/boot/grub/$mbr_backup'.  You can restore it like this.
# dd if=/boot/grub/$mbr_backup of=$mbr_dev bs=512 count=1
#
# Start GRUB global section
#timeout 30
color light-gray/blue black/light-gray
# End GRUB global section
EOF
else
 cat << EOF > $BOOT/grub/$grub_config
# GRUB configuration file '/boot/grub/$grub_config'.
# generated by 'grubconfig'.  `date +%c 2>$TMP/null`
#
# Start GRUB global section
#timeout 30
color light-gray/blue black/light-gray
# End GRUB global section
EOF
fi
cat $TMP/grub.conf >> $BOOT/grub/$grub_config
chmod 644 $BOOT/grub/$grub_config
}

installcolor()
{
if [ "$GRUB_TARGET" = "/dev/fd0" ]; then
while :
do
     kill $INFOPID 2>/dev/null
     $DIALOG --title "Grubconfig: ДИСКЕТА" --menu \
"Дискета должна быть отформатирована. \n\
Вставьте дискету в привод и нажмите клавишу ENTER." 0 0 3 \
 "Ready" "Дискета уже отформатирована" \
 "Format" "Сначала форматировать дискету" 2> $TMP/reply
      if [ ! $? = 0 ]; then
        chroot_umount
        exit
      elif ! (dd if=/dev/fd0 of=$TMP/null bs=1 count=1 1>$TMP/null 2>$TMP/null) ; then
        continue
      fi
      REPLY="`cat $TMP/reply`"
      if [ "$REPLY" = "Format" ]; then
      [ -b /dev/fd0h1440 ] && fd=/dev/fd0h1440
      [ -b /dev/fd0H1440 ] && fd=/dev/fd0H1440
      [ -b /dev/fd0u1440 ] && fd=/dev/fd0u1440
      #BK...
      #if [ -x "`type -path fdformat`" ]; then
        XDIALOG_HIGH_DIALOG_COMPAT=false $DIALOG --title "Grubconfig" --no-buttons --infobox \
        "Форматирование дискеты:\nfdformat -n $fd \nПожалуйста, ждите..." 0 0 25000 & #3 35
        INFOPID=$!
        fdformat -n $fd || continue
      #elif [ -x "`type -path superformat`" ]; then
      #  $DIALOG --title "Formatting floppy..." --infobox \
      #  "superformat -f $fd" 3 35
      #  superformat -f $fd || continue
      #else
      #   $DIALOG --title "ERROR" --msgbox \
      #  "Can't find 'fdformat' or 'superformat' to format floppy." 5 65
      #   continue
      #fi
      fi
        break
done
fi

   kill $INFOPID 2>/dev/null
   XDIALOG_HIGH_DIALOG_COMPAT=false $DIALOG --title "Grubconfig" --no-buttons --infobox "Установка Менеджера загрузки GRUB..." 0 0 25000 & #5 40
   INFOPID=$!
   sleep 2 
 
   if [ ! "$KILL" = "NO" ]; then
   killall klogd 2>$TMP/null
   sleep 1
   klogd -c 3 2>$TMP/null
   fi
   
   install_grub
 
 if [ ! "$SUCCESS" = "0" ]; then # some GRUB error occured
  if [ ! "$backup_mbr" = "" -a ! "$mbr_dev" = "" ]; then
  if [ -s "$backup_mbr" ]; then
  if dd if=$mbr_dev bs=512 count=1 | grep -q GRUB ; then
    dd if=$backup_mbr of=$mbr_dev bs=512 count=1 >$TMP/null 2>&1
  fi
  fi
  fi
  kill $INFOPID 2>/dev/null
  $DIALOG --title "ОШИБКА УСТАНОВКИ GRUB # $SUCCESS" --msgbox \
  "К сожалению, в процессе установки GRUB произошла ошибка и он \
  установлен неправильно.  Вам необходимо использовать \
  загрузочный диск для запуска компьютера. \
  Исправить установку возможно редактированием файла \
  /boot/grub/$grub_config и переустановкой GRUB вручную. \
  Для получения более подробных сведений см. страницу man и \
  документацию в формате info на программу GRUB в /usr/info." 0 0 #11 60
 else
  if [ "$message" = "yes" ]; then
cat << EOF >$TMP/tmpmsg

GRUB успешно $installed.\n\n

Если необходимо, Вы можете проверить и отредактировать файл
'/boot/grub/$grub_config' на '$ROOT_DEVICE'.\n Вы можете также
изменить размещение ядра '/boot/vmlinuz' и/или передать ядру
дополнительные параметры при загрузке.

EOF
   kill $INFOPID 2>/dev/null
   $DIALOG --title "УСТАНОВКА GRUB УСПЕШНА" --msgbox "`cat $TMP/tmpmsg`" 0 0 #12 70
  else
   kill $INFOPID 2>/dev/null
   $DIALOG --title "УСТАНОВКА GRUB УСПЕШНА" --msgbox \
   "GRUB успешно $installed." 0 0 #5 70
  fi
 fi
}

#BK not using this, had trouble with it...
## 'probe()' borrowed from GRUB QuickInst.
#probe()
#{
# [ ! -z "`dd if=$1 bs=1 count=1 2>$TMP/null | tr '\0' x`" ]
# return
#}

   #BK...
   DIALOG="`which Xdialog`"
   #DIALOG=`type -path dialog`
   #if [ ! -x "$DIALOG" ]; then
   #  echo "This script requires the 'dialog' program to run."
   #  chroot_umount
   #  exit 1
   #fi

 if [ ! `whoami` = "root" ]; then
     $DIALOG --title "НЕДОСТАТОЧНО ПРАВ" --msgbox \
     "Для работы данного скрипта Вы должны обладать правами администратора ('root')." 0 0 #5 50
     chroot_umount
     exit
 fi

 #BK...
 if [ ! -x "`which grub`" ]; then
 #if [ ! -x "`type -path grub`" ]; then
     $DIALOG --title "НЕ НАЙДЕН GRUB" --msgbox \
     "Невозможно найти 'grub' в системе." 0 0 #5 40
     chroot_umount
     exit
 fi

 BOOT=/boot
 #BK...
 if grep -q $BOOT/grub/grub.conf 2>$TMP/null `which grub` ; then
 #if grep -q $BOOT/grub/grub.conf 2>$TMP/null `type -path grub` ; then
   grub_config=grub.conf
 else
   grub_config=menu.lst
 fi

root_device() {
# Determine the root partition (such as /dev/hda2)
    ROOT_DEVICE="`mount 2>$TMP/null | grep " on / " | awk '{print $1}'`"

  if [ -z "$ROOT_DEVICE" -a -s /etc/fstab ]; then
    ROOT_DEVICE="`grep -v "^#" /etc/fstab 2>$TMP/null | grep " / " | awk '{print $1}'`"
  fi
  
  if [ -n "$ROOT_DEVICE" ]; then
  if echo $ROOT_DEVICE | grep -q -E "/dev/ram|/dev/root|tmpfs|rootfs|/dev/loop"; then
    unset ROOT_DEVICE
  fi
  fi

  #BK quick hack for puppy2...
  [ "$ROOT_DEVICE" = "none" ] && ROOT_DEVICE=""
  #BK quick hack for v2.16...
  [ "$ROOT_DEVICE" = "unionfs" ] && ROOT_DEVICE=""
  
    if [ -n "$ROOT_DEVICE" ]; then
cat << EOF > $TMP/tmpmsg
Где GRUB должен разместить свои файлы?

По умолчанию он разместит их в /boot/grub текущего раздела 
'$ROOT_DEVICE'.  Чтобы согласиться с этим, оставьте без 
изменений строку ниже и просто нажмите клавишу ENTER (подходит 
для большинства пользователей).  Если по каким-либо причинам 
Вы хотите использовать другой раздел, укажите это в строке ниже 
и нажмите клавишу ENTER.
EOF
else
cat << EOF > $TMP/tmpmsg
Пользователям Puppy: если программа запущена из Универсального инсталлятора,\n
                   выберите параметры по умолчанию и нажмите кнопку OK.\n
\n
Где Вы хотите разместить файлы GRUB?\n
\n
Обычно они размещаются вместе с ядром в каталоге /boot.\n
Какой раздел для размещения каталога /boot Вы хотите использовать?\n
Укажите раздел (например, /dev/hda2) в окне ниже:
EOF
    fi

while :
do
 if [ "$ROOT_DEVICE" ];then #BK initialise text box...
  BKINITIAL_DEVICE="$ROOT_DEVICE"
 else
  BKINITIAL_DEVICE="$BKPASSED_DEVICE"
 fi

#BK    $DIALOG --title "SELECT GRUB PARTITION" --inputbox "`cat $TMP/tmpmsg`" 0 0 "$ROOT_DEVICE" 2> $TMP/root_device
    kill $INFOPID 2>/dev/null
    $DIALOG --title "Grubconfig: МЕСТО РАЗМЕЩЕНИЯ ФАЙЛОВ GRUB" --no-collapse --inputbox "`cat $TMP/tmpmsg`" 0 0 "$BKINITIAL_DEVICE" 2> $TMP/root_device
    if [ ! $? = 0 ]; then
      umount $BOOT_TMP 2>$TMP/null && rmdir $BOOT_TMP
      rm -rf $TMP
      chroot_umount
      exit
    fi    
      ROOT_DEV=`cat $TMP/root_device`

     if [ "$ROOT_DEVICE" = "" -a "$ROOT_DEV" = "" ]; then
       continue
     fi

     if [ "$ROOT_DEVICE" = "$ROOT_DEV" ]; then
       break
     fi
    
       if [ ! "$ROOT_DEV" = "" ]; then
         ROOT_DEVICE=`cat $TMP/root_device`
       fi
    
        if ! grep "^$ROOT_DEVICE" $TMP/DEV | grep -q "83  Linux" ; then
         kill $INFOPID 2>/dev/null
	     $DIALOG --title "Grubconfig: ОШИБКА" --msgbox \
          "Раздел '$ROOT_DEVICE' не содержит файловой системы Linux." 0 0 #5 55
	  continue
        fi
       
       if mount 2>$TMP/null | grep -q "^$ROOT_DEVICE" 2>$TMP/null ; then
           BOOT="`mount 2>$TMP/null | grep $ROOT_DEVICE | cut -d ' ' -f 3`/boot"
         if echo "fooboo" > $BOOT/fooboo 2>$TMP/null ; then
 	      rm -f $BOOT/fooboo
         else
          kill $INFOPID 2>/dev/null
 	      $DIALOG --title "Grubconfig: ОШИБКА" --msgbox \
           "Раздел '$ROOT_DEVICE' смонтирован в режиме 'только чтение' (read-only), \
           необходимо либо размонтировать его, либо монтировать в режиме 'чтение-запись' (read-write)." 0 0 #6 55
           rm -rf $TMP
           chroot_umount
	   exit
	 fi
           break
       else
       umount $BOOT_TMP 2>$TMP/null
       mkdir -p $BOOT_TMP
       mount -o rw $ROOT_DEVICE $BOOT_TMP 1>$TMP/null 2>$TMP/error
       if [ ! $? = 0 ]; then
       echo "" >> $TMP/error
       echo "I couldn't mount '$ROOT_DEVICE' read-write!" >> $TMP/error
       kill $INFOPID 2>/dev/null
       $DIALOG --title "Grubconfig: ОШИБКА МОНТИРОВАНИЯ" --textbox "$TMP/error" 0 0
       umount $BOOT_TMP 2>$TMP/null && rmdir $BOOT_TMP
       rm -rf $TMP
       chroot_umount
       exit
       fi
       BOOT=$BOOT_TMP/boot
       break
       fi
 done

    XDIALOG_HIGH_DIALOG_COMPAT=false $DIALOG --title "Grubconfig" --no-buttons --infobox "Выполняется обработка, пожалуйста, ждите..." 0 0 25000 & #3 20
    INFOPID=$!
    sleep 1
    
 fs=`mount | grep "^$ROOT_DEVICE" | awk '{print $5}'`
 [ "$fs" = "ext2" -o "$fs" = "ext3" ] && fs=e2fs
 [ "$fs" = "msdos" ] && fs=fat
 [ "$fs" = "vfat" ] && fs=fat
 
 if [ -d /usr/share/grub -o -d /usr/lib/grub -o -d /usr/local/share/grub ]; then
 mkdir -p $BOOT/grub
 if [ -d /usr/share/grub ]; then
 cp-FULL -p /usr/share/grub/*/*stage* $BOOT/grub 2>$TMP/null
 elif [ -d /usr/local/share/grub ]; then
 cp-FULL -p /usr/local/share/grub/*/*stage* $BOOT/grub 2>$TMP/null
 elif [ -d /usr/lib/grub ]; then
 cp-FULL -p /usr/lib/grub/*/*stage* $BOOT/grub 2>$TMP/null
 fi
 
 for f in stage1 stage2 $fs"_stage1_5"
 do
 if [ ! -f $BOOT/grub/$f ]; then
 echo "ОШИБКА: Не найден  '$f' в пакете GRUB."
 echo "Если у Вас установлен пакет GRUB, Вы должны иметь"
 echo "/usr/lib/grub, /usr/share/grub, или /usr/local/share/grub"
 echo "каталог, содержащий необходимые файлы."
 chroot_umount
 exit 1
 fi 
 done
 else
 echo "ОШИБКА: Не найдены требуемые файлы  в пакете GRUB."
 echo "Если у Вас установлен пакет GRUB, Вы должны иметь"
 echo "/usr/lib/grub, /usr/share/grub, или /usr/local/share/grub"
 echo "каталог, содержащий необходимые файлы."
 chroot_umount
 exit 1
 fi
}

HDR="no" # this means the header section of /boot/grub/menu.lst has not yet
         # been configured
LNX="no" # this means no Linux partition has been defined as bootable
         # through GRUB. Both of these must change to "yes" before GRUB will
         # install from this script.
 
 # OK, now let's see if we should automate things:
  $DIALOG --title "GRUBCONFIG Kent Robotti (изменён для PuppyRus Linux)" --no-collapse --menu \
 "Пользователям Puppy: если программа запущена из Универсального инсталлятора,\n\
                          выберите, пожалуйста, режим 'simple'!\n\
 \n\
 GRUB - настраиваемый загрузчик операционных систем. Есть режим его установки 'simple', при котором предпринимается попытка автоматически настроить GRUB для загрузки Linux (а также DOS, Windows, BSD, HURD, QNX,\n PLAN9, BEOS, Minix и OS/2 в случае их обнаружения).\n\
 Для более опытных пользователей режим 'expert' предоставляет больше возможностей по контролю за процессом установки." 0 0 3 \
 "simple" "Попытаться установить GRUB автоматически" \
 "expert" "Использовать расширенные возможности меню установки GRUB" 2> $TMP/reply
 if [ ! $? = 0 ]; then
  rm -rf $TMP
  chroot_umount
  echo
  exit
 fi

  REPLY="`cat $TMP/reply`"

  if [ ! -f /proc/partitions ]; then
    CHROOT=YES
    mkdir -p /proc
    mount -t proc proc /proc
  fi

 if [ "$REPLY" = "simple" ]; then
  # Do simple GRUB setup
   use_framebuffer
   XDIALOG_HIGH_DIALOG_COMPAT=false $DIALOG --title "Grubconfig" --no-buttons --infobox "Выполняется обработка, пожалуйста, ждите..." 0 0 25000 & #BK 3 20
   INFOPID=$!
   sleep 1
   create_devices
   root_device
   killall klogd 2>$TMP/null
   sleep 1
   klogd -c 3 2>$TMP/null
   KILL=NO
   simplegrub
   umount $BOOT_TMP 2>$TMP/null
   rm -rf $TMP $BOOT_TMP
   chroot_umount
   exit
 fi
 # drop through to last option: (use the expert menus)
 while [ 0 ]; do
  $DIALOG --title "ЭКСПЕРТНАЯ УСТАНОВКА GRUB" --menu "Это меню поможет Вам создать конфигурационный файл GRUB.\n Для установки Вы должны создать конфигурационный файл с новым меню запуска и затем добавить один или более загрузочных разделов в него. Если Вы уже проделали это, можно выбирать параметр 'Install'. Если Вы допустите ошибку, всегда можно повторить процесс, выбрав 'Begin'. \n\
Какой параметр Вы выбираете?" 0 0 9 \
"Begin" "Начать установку GRUB с новым меню запуска" \
"Linux" "Добавить Linux раздел в конфигурационный файл GRUB" \
"Other" "Добавить DOS/WIN/BSD/OS2/HURD раздел в конфигурационный файл GRUB" \
"Install" "Установить GRUB" \
"Skip" "Пропустить установку GRUB или выйти из этого меню" \
"View" "Просмотреть текущий файл /boot/grub/$grub_config" \
"Help" "Прочитать файл справки по Менеджеру загрузки GRUB" 2> $TMP/reply
  if [ ! $? = 0 ]; then
   REPLY="Skip"
  else
   REPLY="`cat $TMP/reply`"
  fi
  if [ "$REPLY" = "Begin" ]; then
    use_framebuffer

    XDIALOG_HIGH_DIALOG_COMPAT=false $DIALOG --title "Grubconfig" --no-buttons --infobox "Выполняется обработка, пожалуйста, ждите..." 0 0 25000 & #3 20
    INFOPID=$!
    sleep 1

    create_devices

   kill $INFOPID 2>/dev/null
   $DIALOG --title "КУДА УСТАНОВИТЬ ЗАГРУЗЧИК GRUB" --menu "GRUB может быть установлен различными способами: в главную загрузочную запись (MBR) жёсткого диска, в системный блок (superblock) Linux раздела (который необходимо сделать активным с помощью fdisk или грузить другим менеджером загрузки) или на 1.44MB форматированную дискету.\n
Если Вы используете другой загрузчик, например Менеджер загрузки OS/2, необходимо выбрать параметр 'Root'.\n Куда будем устанавливать загрузчик?" 0 0 4 \
"Root" "Установить в superblock раздела Linux" \
"Floppy" "Установить на форматированную дискету" \
"MBR" "Установить в MBR (возможно, небезопасно)" \
2> $TMP/reply
   if [ $? = 1 -o $? = 255 ]; then
    HDR="no"
    continue;
   else
    LNX="no"
    TG="`cat $TMP/reply`"
   fi
   if [ "$TG" = "MBR" ]; then
    hd_mbr
    MBR=YES
   elif [ "$TG" = "Root" ]; then
    MBR=NO
   elif [ "$TG" = "Floppy" ]; then
    GRUB_TARGET="/dev/fd0"    
    MBR=NO
   else
    HDR="no"
    continue;
   fi
    HDR="yes"
    root_device
  elif [ "$REPLY" = "Linux" ]; then
   if [ "$HDR" = "yes" ]; then
echo "Нажмите клавишу [Space], чтобы снять пометки с тех разделов, которые Вы не хотите включать в список." > $TMP/tmpmsg1
echo "Загр. раздел - Начальный и Конечный блоки - Индекс и Название файловой системы" >> $TMP/tmpmsg1
grep "^/dev/" $TMP/DEV | grep "83  Linux" | grep -v "Ext'd" | grep -v "Extend" > $TMP/tmpmsg2

if [ -s $TMP/tmpmsg2 ]; then
echo '$DIALOG --title "СУЩЕСТВУЮЩИЕ LINUX РАЗДЕЛЫ" --cr-wrap --checklist "`cat $TMP/tmpmsg1`" 0 0 0 \' > $TMP/tmpmsg3
cat $TMP/tmpmsg2 | sed "/^$/d" | while read device ; do
device_name="`echo "$device" | awk '{print $1}'`"
device_info="`echo "$device" | awk '{print $2,$3,$4,$5,$6,$7}'`"
echo "$device_name" | sed "/^$/d" | sed -e 's/.*/"&" '"'$device_info'"' on \\/' >> $TMP/tmpmsg3
done
echo "2> $TMP/parts" >> $TMP/tmpmsg3

    . $TMP/tmpmsg3
    if [ $? = 1 -o $? = 255 ]; then
     rm -f $TMP/tmpmsg*
     continue
    else
     cat $TMP/tmpmsg2 > $TMP/fdisk.list
     rm -f $TMP/tmpmsg*
    fi
else
      $DIALOG --title "Grubconfig" --msgbox \
     "Linux разделы не найдены!" 0 0 #5 35
      continue
fi
    
    if [ -s $TMP/parts ]; then
      cat $TMP/parts | sed "s/\"//g" | sed "/^$/d" > $TMP/parts.a
    else
      $DIALOG --title "Grubconfig" --msgbox \
     "Linux разделы не выбраны!" 0 0 #5 35
      continue
    fi
        
    for PART in `cat $TMP/parts.a` ; do

cat << EOF > $TMP/tmpmsg
`echo "   Загр. раздел  Начальный  Конечный блоки    Id  System"`
`grep "^$PART" $TMP/fdisk.list`

Теперь необходимо указать название раздела, указанного выше.
Вы будете использовать его для выбора раздела в меню
загрузки GRUB.  Что-нибудь типа 'PuppyRus Linux' будет
неплохим выбором.

По умолчанию - 'Linux (on $PART)'.  Просто нажмите клавишу ENTER.
(в меню будет добавлен пункт '(on $PART)' автоматически)
EOF
    kill $INFOPID 2>/dev/null
    $DIALOG --title "Grubconfig: ВЫБЕРИТЕ НАЗВАНИЕ РАЗДЕЛА" --cr-wrap --inputbox "`cat $TMP/tmpmsg`" 0 0 2> $TMP/reply
    if [ ! $? = 0 ]; then
     break;
    fi
     LABEL="`cat $TMP/reply`"
    if [ "$LABEL" = "" ]; then
     LABEL="Linux"
    fi    
    
  p1=`echo $PART | cut -b 9-`
  p2=$(( $p1 - 1 ))

  find_kernel
  get_root_dev $PART

  num="`echo $PART | cut -b8-`" 

  cat << EOF > $TMP/part.$num.sort
# Linux bootable partition config begins
  title $LABEL (on $PART)
  root ($hd,$p2)
  $KERNEL $APPEND
# Linux bootable partition config ends
EOF
initrd $PART $TMP/initrd.conf
done
   else
    kill $INFOPID 2>/dev/null
    $DIALOG --title "Grubconfig: НЕЛЬЗЯ ДОБАВИТЬ LINUX РАЗДЕЛ" --msgbox "Вы не можете \
добавлять разделы, пока не загрузитесь с новым меню GRUB." 0 0 #6 60
    continue
   fi
   LNX="yes"
  elif [ "$REPLY" = "Other" ]; then
   if [ "$HDR" = "yes" ]; then
   rm -f $TMP/parts
echo "Нажмите клавишу [Space], чтобы снять пометки с тех разделов, которые Вы не хотите включать в список." > $TMP/tmpmsg1
echo "Раздел - Начальный и Конечный блоки - Индекс и Название файловой системы" >> $TMP/tmpmsg1
grep "^/dev/" $TMP/DEV | grep -E "DOS|Win95|W95|FAT|NTFS|BSD|HURD|QNX|BeOS|Minix|Plan" | \
grep -v "Ext'd" | grep -v "Extend" | grep -v -i "swap" > $TMP/tmpmsg2

if [ -s $TMP/tmpmsg2 ]; then
echo '$DIALOG --title "СУЩЕСТВУЮЩИЕ РАЗДЕЛЫ DOS/WIN/OS2/BSD и т.д." --cr-wrap --checklist "`cat $TMP/tmpmsg1`" 0 0 0 \' > $TMP/tmpmsg3
cat $TMP/tmpmsg2 | sed "/^$/d" | while read device ; do
device_name="`echo "$device" | awk '{print $1}'`"
device_info="`echo "$device" | awk '{print $2,$3,$4,$5,$6,$7}'`"
echo "$device_name" | sed "/^$/d" | sed -e 's/.*/"&" '"'$device_info'"' on \\/' >> $TMP/tmpmsg3
done
echo "2> $TMP/parts" >> $TMP/tmpmsg3

    . $TMP/tmpmsg3
    if [ ! $? = 0 ]; then
     rm -f $TMP/tmpmsg*
     continue
    else
     cat $TMP/tmpmsg2 > $TMP/fdisk.list
    fi
fi

    if [ ! -s $TMP/tmpmsg2 ]; then
      $DIALOG --title "Grubconfig" --msgbox \
     "Других разделов не найдено!" 0 0 #5 35
      rm -f $TMP/tmpmsg*
      continue
    elif [ -s $TMP/parts ]; then
      cat $TMP/parts | sed "s/\"//g" | sed "/^$/d" > $TMP/parts.a
    else
      $DIALOG --title "Grubconfig" --msgbox \
     "Другие разделы не выбраны!" 0 0 #5 35
      rm -f $TMP/tmpmsg*
      continue
    fi
      rm -f $TMP/tmpmsg*
    
    for PART in `cat $TMP/parts.a` ; do
cat << EOF > $TMP/tmpmsg
`echo "   Загрузочный раздел  Начальный  Конечный блоки    Id  System"`
`grep "^$PART" $TMP/fdisk.list`

Теперь необходимо указать название раздела, указанного выше.
Вы будете использовать его для выбора раздела в меню
загрузки GRUB. 'DOS, Win2k, WinXP, FreeBSD, GNU/Hurd' и
т.д. могут быть неплохим выбором.
EOF

    kill $INFOPID 2>/dev/null
    $DIALOG --title "Grubconfig: ВЫБЕРИТЕ НАЗВАНИЕ РАЗДЕЛА" --cr-wrap --inputbox "`cat $TMP/tmpmsg`" 0 0 2> $TMP/reply
    if [ ! $? = 0 ]; then
     break;
    fi
     LABEL="`cat $TMP/reply`"
    if [ "$LABEL" = "" ]; then
     LABEL=Unknown
    fi    
    p1=`echo $PART | cut -b 9-`
    p2=$(( $p1 - 1 ))

    part=`grep "^$PART" $TMP/fdisk.list`

    other $part

    num="`echo $PART | cut -b8-`" 

  cat << EOF > $TMP/part.$num.sort
# Other bootable partition config begins
  title $LABEL (on $PART)
  $OTHER
# Other bootable partition config ends
EOF
done
   else
    kill $INFOPID 2>/dev/null
    $DIALOG --title "Grubconfig: НЕЛЬЗЯ ДОБАВИТЬ ДРУГОЙ РАЗДЕЛ" --msgbox "Вы не можете \
добавить раздел, пока не загрузитесь с новым меню GRUB." 0 0 #6 60
    continue
   fi
  elif [ "$REPLY" = "Install" ]; then
   if [ "$LNX" = "no" ]; then
    kill $INFOPID 2>/dev/null
    $DIALOG --title "Grubconfig: НЕВОЗМОЖНО УСТАНОВИТЬ GRUB" --msgbox "GRUB не может быть \
установлен. Если у Вас нет нового конфигурационного файла GRUB с новым меню запуска и не \
менее, чем одним внесённым в него загрузочным разделом Linux, перед началом установки GRUB \
его необходимо создать." 0 0
    continue
   else
       installcolor;
       umount $BOOT_TMP 2>$TMP/null && rmdir $BOOT_TMP
       rm -rf $TMP
   fi
   rm -f $TMP/tmpmsg
   break
  elif [ "$REPLY" = "Skip" ]; then
   umount $BOOT_TMP 2>$TMP/null && rmdir $BOOT_TMP
   rm -rf $TMP
   chroot_umount
   break
  elif [ "$REPLY" = "View" ]; then
  
  rm -f $TMP/view.conf
  if ls $TMP/part.*.sort 2>$TMP/null ; then
  for f in `ls $TMP/part.*.sort`
  do
    cat $f >> $TMP/view.conf
  done
  fi
  
  if [ -f $TMP/initrd.conf ]; then
    cat $TMP/initrd.conf >> $TMP/view.conf
    rm -f $TMP/initrd.conf
  fi
   
   if [ -r $TMP/view.conf ]; then
    kill $INFOPID 2>/dev/null
    $DIALOG --title "ВАШ НОВЫЙ /boot/grub/$grub_config" --textbox "$TMP/view.conf" 22 70
   else
    if [ -r $BOOT/grub/$grub_config ]; then
     kill $INFOPID 2>/dev/null
     $DIALOG --title "ВАШ ТЕКУЩИЙ /boot/grub/$grub_config" --textbox "$BOOT/grub/$grub_config" 22 70
    else
     kill $INFOPID 2>/dev/null
     $DIALOG --title "ФАЙЛ КОНФИГУРАЦИИ НЕ НАЙДЕН" --msgbox "К сожалению, у Вас нет \
конфигурационного файла GRUB, который Вы могли бы просмотреть." 0 0 #6 60
    fi
   fi
  elif [ "$REPLY" = "Help" ]; then
cat << EOF > $TMP/tmpmsg

Скрипт 'grubconfig' поможет Вам установить Менеджер загрузки
GRUB в Вашу систему.

Он работает с накопителями IDE и SCSI интерфейсов и не
поддерживает устройства RAID.

Ниже перечислены варианты, которые Вы можете использовать в
меню экспертной установки GRUB:
 
1. Начать установку GRUB с новым меню запуска.
   
   Это первый шаг в создании нового конфигурационного файла
   /boot/grub/$grub_config без указания в нём загружаемых
   операционных систем (пока).
   
   Вам будет задан вопрос о месте размещения GRUB. Его можно
   установить в главную загрузочную запись диска (MBR - Master
   Boot Record), в системный блок (superblock) Linux раздела
   (для загрузки с помощью загрузчика OS/2 и т.д.) или на
   1.44MB форматированную дискету.
   
   Попытайтесь установить его сначала на дискету. Если всё
   будет правильно работать с дискеты, вероятно, не будет
   проблем и при загрузке из MBR или superblock'а.
   
   После создания нового файла /boot/grub/$grub_config Вы
   должны добавить в него по крайней мере один раздел для
   загрузки прежде, чем сможете установить сам GRUB.
   
   Далее необходимо  указать раздел, на котором в каталоге
   /boot/grub будут храниться файлы GRUB.
   
   Затем Вы можете добавить другие разделы, если они у Вас есть.

2. Добавить Linux или DOS/WIN/BSD/OS2/HURD/QNX/PLAN9/BEOS/Minix
   раздел в файл /boot/grub/$grub_config.
   
   Порядок действий одинаков как для разделов Linux, так и для других
   операционных систем. Вам будет предложен список разделов, из
   которого нужно выбратьте разделы, которые надо включить в меню
   GRUB, и присвоить им соответствующие названия. Названия могут
   быть любого типа, например 'Slackware Linux' или 'WinXP' и т.д.
  
3. Установить GRUB
   
   После того, как Вы проверите содержимое Вашего нового
   файла конфигурации и убедитесь, что в нём всё записано
   правильно, установите GRUB и покиньте программу установки.
  
Другие параметры:
  
  -- Просмотреть текущий файл /boot/grub/$grub_config
   
   Если Вы не хотите создавать новый файл $grub_config, выбрав
   этот пункт, Вы можете просмотреть уже существующий в каталоге
   /boot/grub на разделе Linux с установленным GRUB.
   
   Если Вы захотите вручную сконструировать новый файл $grub_config -
   этот параметр может оказать помощь в достижении желаемого.
  
 -- Пропустить установку GRUB или выйти из этого меню
  
  Этот параметр пропускает установку GRUB. Выберите его, если Вы не
  хотите устанавливать GRUB или уже установили его и хотите закрыть
  программу.
  
 -- Help - Читать этот справочный файл для Менеджера загрузки GRUB
  
-----------
 
Другая информация о GRUB:
  
  Из главной загрузочной записи (MBR) GRUB очень легко удалить.
  В fdisk для DOS/Win9x есть параметр mbr, который восстанавливает
  первоначальную MBR (например, командой 'C:\ fdisk /mbr'). Также её
  можно восстановить из резервной копии, которую создаёт 'grubconfig'
  в файле /boot/grub/mbr.device.number.
  
  И это, вероятно, самый лучший способ восстановления.
  # dd if=/boot/grub/mbr.device.number of=/dev/device bs=512 count=1
  
  Если Вы хотите внести какие-либо изменения в конфигурационный
  файл, нет необходимости запускать grubconfig снова, можно просто
  изменить файл /boot/grub/$grub_config вручную.

--- конец справки о GRUB

grubconfig is based on liloconfig by Patrick Volkerding fron the
Slackware Linux distribution.
EOF
   $DIALOG --title "СПРАВКА ПО УСТАНОВКЕ GRUB" --textbox "$TMP/tmpmsg" 30 74 #22 74
  fi
 done
 
###the end###
