#!/bin/sh
#(c) Copyright Barry Kauler 2006 www.puppylinux.com
#2007 Lesser GPL licence v2 (http://www.fsf.org/licensing/licenses/lgpl.html)
# BK july 2007:
#/usr/sbin/puppyinstaller-217 is heavily modified by Dougal (based on
# puppyinstaller from v2.14). Was used in 216 and 217.
#/usr/sbin/puppyinstaller-bk is the v2.14 one with minimal mods. for 2.17.1+
#aug 2007 updated for 2.20: 'root=/dev/ram0' removed as using initramfs.
#v3.94 BK dec 2007: no longer any hd* drives.
#v3.95 BK jan 2008: handle Classmate laptop.
#v3.96 BK jan 2008: improvements for full hd install, warning about drive nums.
#v3.97 BK feb 2008: fully support /dev/hd* notation for ide drives.
#v3.97 BK feb 2008: fix mbr recognition error in flash pen drive.
#v3.97 BK feb 2008: new ComboFormat installation for Flash drives.
#v3.98 BK mar 2008: bugfix for install to idehd or satahd.
#v4.02 /lib/modules/firmware.dep.<kern>,DOTconfig-K<kern> moved to /etc/modules. ...um, no mods this script.
#v404 usb install, now have 'pfix=copy'. bugfix extlinux now needs '-i'.
#v3.xx translated for Russian by Viktor Melechin (melviX) and Aleksej Klionov (AlFox).

NEWVER="`cat /etc/puppyversion`"
#mount > /etc/mtab   #v2.10 remove.
KERNVER="`uname -r`"

#v2.10
. /etc/rc.d/PUPSTATE
#v3.97 [ "$ATADRIVES" = "" ] && ATADRIVES="$SATADRIVES"

fsfunc() #f.s. type param passed in
{
 FSTYPE="$1"
 [ "$FSTYPE" = "Ext2" ] && FSTYPE="ext2"
 [ "$FSTYPE" = "ReiserFS" ] && FSTYPE="reiserfs"
 [ "$FSTYPE" = "Ext3" ] && FSTYPE="ext3"
 [ "$FSTYPE" = "FAT16" ] && FSTYPE="vfat"
 [ "$FSTYPE" = "FAT32" ] && FSTYPE="vfat"
 [ "$FSTYPE" = "NTFS" ] && FSTYPE="ntfs"
 [ "$FSTYPE" = "ISO9660" ] && FSTYPE="iso9660"
}


ispupfunc() #fstype partition
{
 PUPSFS=""
 PUPVEROLD=0
 [ ! $2 ] && return 0
 mkdir /mnt/$2 2> /dev/null
 #cannot test for /dev/$2 as mount reports ntfs device is /dev/fuse...
 #v2.12 latest ntfs-3g driver works with mount properly, so special handling
 #no longer necessary, but still here...
 ISPUPMNTPT="`mount | grep "/dev/$2" | tr -s " " | cut -f 3 -d " "`"
 #v2.02...
 #[ "$ISPUPMNTPT" = "" ] && ISPUPMNTPT="`ps -e | grep -o ntfs\-3g.* | grep "/dev/$2" | sed -e 's/[^a-zA-Z0-9/._\-]/ /g' | tr -s ' ' | tr ' ' "\n" | grep '^/mnt/'`"
 [ "$ISPUPMNTPT" = "" ] && ISPUPMNTPT="`ps -e | grep -o 'ntfs\-3g.*' | grep "/dev/$2" | tr '\t' ' ' | tr -s ' ' | tr ' ' '\n' | grep '^/mnt/'`"
 
 if [ "$ISPUPMNTPT" = "" ];then
  ISPUPMNTPT="/mnt/$2"
  mount -t $1 /dev/$2 /mnt/$2
 fi
  if [ $? -eq 0 ];then
   ISFILE="`ls -1 $ISPUPMNTPT/pup_[0-9][0-9][0-9].sfs | head -n 1`"
   [ ! "$ISFILE" = "" ] && PUPVEROLD=`basename $ISFILE | cut -f 2 -d '_' | cut -f 1 -d '.'`
   if [ -f $ISPUPMNTPT/etc/puppyversion ];then
    PUPVEROLD=`cat $ISPUPMNTPT/etc/puppyversion`
    #there is a bug in prev installer, put 0 into puppyversion...
    PREVVER=`expr $NEWVER \- 1`
    [ $PUPVEROLD -eq 0 ] && PUPVEROLD=$PREVVER
   fi
   [ -f $ISPUPMNTPT/usr_cram.fs ] && PUPVEROLD=108
   umount /dev/$2
  fi
 return $PUPVEROLD
}

gpartedfixusbfunc() { #params: $DESTPART $DESTFS
 GPDRV="`echo -n "$1" | sed -e 's/[0-9]//g'`"
 gparted /dev/$GPDRV &
 sleep 2
 gxmessage -bg '#ba55d3' -center -title "Puppy Универсальный инсталлятор" "GParted - менеджнр пакетов, доступный в Puppy, хотя в 'чистой'
редакции Puppy он, возможно, отсутствует. В этом случае используйте 
Менеджер пакетов PETget для его установки. GParted - очень 
простой инструмент для удаления, создания и переопределения разделов.

Если Ваше устройство USB Flash с установленным на него Puppy не 
загружается, вполне возможно, что BIOS ПК или загрузчик Syslinux 
неправильно определяет существующие  на нём раздел(ы). В этом 
случае лучше всего удалить их и с помощью GParted создать снова.
Сделать это очень просто: Запустив GParted,
 1. удалите все разделы на Вашем устройстве USB. 
 2. Создайте новый первичный раздел FAT16 размером во весь диск.
 3. Нажмите кнопку 'Применить', чтобы сохранить изменения.
 4. Установите флаг 'boot' (загрузочный), для чего нажмите правой 
    кнопкой мыши на раздел и выберите 'manage flags'). 

Если GParted установлен, можно запустить его сейчас и проделать 
вышеперечисленное. По завершении работы GParted Вы снова попадёте 
в Универсальный установщик..." &
 MSGID=$!
 while [ 1 ];do
  [ "`pidof gparted | tr "\n" '|'`" = "|" ] && break
  sleep 1
 done
 [ ! "`which gparted`" = "" ] && kill $MSGID 2>/dev/null
}

fixusbfunc() { #params: $DESTPART $DESTFS
 echo '#!/bin/sh
DESTPART="$1" #partition being installed to
DESTFS="$2"   #filesystem of destination partition
echo "Этот небольшой раздел Универсального инсталлятора предназначен для"
echo "исправления USB Flash или CF-карты в адапторе в случае, если после"
echo "выполнения всех предыдущих шагов загрузиться с них не удаётся."
echo
echo "Вы пытаетесь установить на $DESTPART, но устройство не поддерживает загрузку..."
echo "Возможно, BIOS Вашего ПК не поддерживает загрузку с USB."
echo "-- карты CF-IDE распознаются как обычный жесткий диск и должны работать"
echo "   с любым BIOS."
echo
echo "Это первая редакция скрипта и она имеет некоторые ограничения..."
echo "так, поддерживаются только разделы с файловой системой msdos/vfat."
if [ "$DESTFS" = "vfat" ];then
 echo "...хорошо, $DESTPART имеет $DESTFS файловую систему."
 echo "   Но, сейчас мы её удалим и создадим заново."
else
 echo "...сейчас на $DESTPART файловая система $DESTFS."
 echo "   Этот скрипт не может работать с ней и будет остановлен."
 echo
 echo -n "Нажмите клавишу ENTER для выхода: "
 read nogo
 exit
fi
echo
echo "Убедитесь, пожалуйста, что Вы стираете правильный раздел!!!"
echo "Всё на $DESTPART будет удалено. Если Вы не хотите этого,"
echo "нажмите любую клавишу на клавиатуре и затем ENTER, или"
echo -n "нажмите одну клавишу ENTER для продолжения работы: "
read querygo
echo
echo "Обновление файловой системы msdos на $DESTPART..."
mkdosfs /dev/$DESTPART
sync
echo "Запись Master Boot Record (MBR)..."
DESTDRV="`echo -n "$DESTPART" | cut -b 1-3`"
dd if=/usr/lib/syslinux/mbrfat.bin of=/dev/$DESTDRV
sync
echo "...done"
echo
echo "Хорошо, теперь мы можем вернуться к основной части Универсального"
echo "Инсталлятора Puppy и заняться установкой системы в раздел $DESTPART."
echo -n "Нажмите клавишу ENTER для продолжения: "
read yesgo
' > /tmp/fixusb.sh
 chmod 755 /tmp/fixusb.sh
 urxvt -bg "pink" -title "Puppy - Универсальный инсталлятор" -geometry 80x25 -e /tmp/fixusb.sh
}

unmountcdfunc() {
 if [ ! "$CDDRIVE" = "" ];then
  if [ ! "`mount | grep "/dev/$CDDRIVE"`" = "" ];then
   rox -D "`mount | grep "/dev/$CDDRIVE" | tr -s " " | cut -f 3 -d " "`"
   #do not kill any processes
   sync
   umount /dev/$CDDRIVE 2> /dev/null
   #mount > /etc/mtab  #v2.10 remove.
   [ "`mount | grep "/dev/$CDDRIVE"`" = "" ] && eject /dev/$CDDRIVE
  fi
 fi
}

locate_puppy_src_files() {
SRCPATH=""
CDDRIVE=""
rm -f /tmp/srcpath.txt
mount | tr -s " " | cut -f 3 -d " " |
while read ONEDIR
do
 INCYES=0
 [ -f ${ONEDIR}/pup_${NEWVER}*.sfs ] && INCYES=`expr $INCYES + 1` #v3.01
 [ -f $ONEDIR/vmlinuz ] && INCYES=`expr $INCYES + 1`
 [ -f $ONEDIR/initrd.gz ] && INCYES=`expr $INCYES + 1`
 if [ $INCYES -eq 3 ];then
  echo -n "$ONEDIR" > /tmp/srcpath.txt
  break
 fi
done
[ -f /tmp/srcpath.txt ] && SRCPATH="`cat /tmp/srcpath.txt`"
if [ "$SRCPATH" = "" ];then
 Xdialog --wmclass "gtkdialog2" --left --buttons-style text --title "Puppy - Универсальный инсталлятор" --ok-label "CD" --cancel-label "КАТАЛОГ" --yesno "Puppy содержит от 2 до 4 файлов:\nvmlinuz      Ядро Linux\ninitrd.gz     Начальный виртуальный диск.\npup_$NEWVER.sfs   Содержит все файлы Puppy (иногда бывают внутри initrd.gz).\n             (если собраны внутри initrd.gz, значит необходим только initrd.gz)\nzdrv_$NEWVER.sfs  Содержит комплект драйверов ядра и микропрограмм (необязателен).\n             (некоторые сборки содержат рабочий набор драйверов в pup_$NEWVER.sfs)\n\nЕсли Вы загружаете Puppy с live-CD, эти файлы должны быть на нём.\nИли же, они могут быть в файле образа .iso и могут быть из него извлечены -- в этом\nслучае Вам необходимо указать каталог, в который Вы хотите извлечь их.\n\nПожалуйста, НЕ ИСПОЛЬЗУЙТЕ знак пробела в полном названии каталога!!!\n\n\nГде находятся файлы Puppy?..." 0 0
 RETVAL=$?
 if [ $RETVAL -eq 0 ];then #CD
  CDDRIVE="`readlink /dev/cdrom`"
  CDDRIVE="`basename $CDDRIVE`"
  CDDRVINFO="`probedisk2 | grep "/dev/$CDDRIVE" | cut -f 3 -d '|'`"
  Xdialog --wmclass "gtkdialog2" --left --title "Puppy - Универсальный инсталлятор" --msgbox "Вставьте, пожалуйста, Puppy live-CD (если не сделали этого ранее) в привод CD/DVD.\nЗамечание: если в ПК установлены два привода CD/DVD, live-CD необходимо поместить\nв привод $CDDRIVE, распознанный как :\n $CDDRVINFO \n\nПосле установки диска нажмите кнопку OK..." 0 0
  mkdir /mnt/$CDDRIVE 2> /dev/null
  mount -t iso9660 /dev/$CDDRIVE /mnt/$CDDRIVE
  if [ -f /mnt/$CDDRIVE/initrd.gz ];then
   SRCPATH="/mnt/$CDDRIVE"
  else
   Xdialog --wmclass "gtkdialog2" --left --title "Puppy - Универсальный инсталлятор: ОШИБКА" --msgbox "К сожалению, файлов Puppy нет на CD.\nСмонтируйте, пожалуйста, CD, используя одну из специальных программ\n(см. меню 'Файловая система') и затем нажмите кнопку OK..." 0 0
   RETVAL=1
  fi 
 fi
 if [ ! $RETVAL -eq 0 ];then #DIRECTORY
  SRCFPATH="`Xdialog --wmclass "gtkdialog2" --left --backtitle "Найдите, пожалуйста, следующие файлы Puppy\nvmlinuz, initrd.gz и pup_$NEWVER.sfs,\n\nВЫБЕРИТЕ ЛЮБОЙ ИЗ НИХ и нажмите кнопку OK" --title "Puppy - Универсальный инсталлятор" --stdout --no-buttons --no-cancel --fselect "*" 0 0`"
  [ ! $? -eq 0 ] && exit
  SRCPATH="`dirname $SRCFPATH`"
 fi
fi
#sanity check...
if [ ! -f ${SRCPATH}/pup_${NEWVER}*.sfs ];then #v3.01
 Xdialog --wmclass "gtkdialog2" --left --title "Puppy - Универсальный инсталлятор: ОШИБКА" --msgbox "\"Проверка готовности\" завершилась неудачно.\nФайл: $SRCPATH/pup_$NEWVER.sfs\n не существует.\nВыше указан путь, где должен располагаться файл /pup_xxx.sfs\n, где \"xxx\" - номер последней версии.\nНажмите кнопку OK для завершения..." 0 0
 exit
fi
} #end locate_puppy_src_files function.

HELPPUI='Замечания по использованию Универсального Инсталлятора

Classmate, eeePC и подобные маленькие портативные компьютеры:
Сначала необходимо загрузить Puppy на целевом ПК, использовав для этого внешний
USB CD/DVD привод или установив его предварительно на USB Flash (BIOS Classmate
легко поддерживает оба варианта). Затем снова запустите Универсальный инсталлятор
и выберите носитель, на который будет производиться установка -- например,
Встроенный USB Flash накопитель (uDiskOnChip) для Classmate.

Замечание: Если Вы хотите сохранить предустановленную операционную систему, сделать
это придётся вручную. В случае с Classmate для этого потребуется около 1GB свободного
места на USB накопителе, но в то же время BIOS Classmate BIOS не может загружаться
с накопителя более 512MB размером -- обойти это ограничение можно довольно неудобным
способом - загрузившись с устройства размером 512MB, подключить и смонтировать 
накопитель, затем выполнить команду:
# dd if=/dev/sdb | gzip - > /mnt/sdc1/backup-classmate-sdb.img.gz
где sdb - весь встроенный накопитель, а sdc1 - раздел на внешнем 2GB устройстве.
'

PMEDIA="`Xdialog --wmclass "gtkdialog2" --left --title "Puppy - Универсальный инсталлятор" --no-tags --stdout --help "${HELPPUI}" --menubox "\nДобро пожаловать в Универсальный инсталлятор Puppy!\n\nЕсли вы желаете установить Puppy на сменные носители, такие как USB Flash,\nжёсткий диск, флоппи-диск, Zip диск или диск LS-120, вставьте его, пожалуйста,\nпрямо сейчас, перед началом работы.\n\nВСТАВЬТЕ СМЕННОЕ УСТРОЙСТВО СЕЙЧАС\nИ выберите в списке, расположенном ниже, устройство, на которое будем\nустанавливать систему:" 0 0 10 usbflash "Накопитель USB Flash" usbhd "Сменный USB жёсткий диск" usb2ataflash "USB CF Flash накопитель, подключаемый через встроенный IDE/SATA адаптер" iusbflash "Встроенный USB Flash накопитель (например: uDiskOnChip)" ataflash "Встроенный IDE/SATA Flash накопитель (например: CF карта в IDE адаптере)" atazip "Встроенный ZIP или LS120 накопитель" atahd "Встроенный (IDE или SATA) жёсткий диск" scsihd "SCSI жёсткий диск" cd "CD диск"`"
[ ! $? -eq 0 ] && exit
[ "$PMEDIA" = "" ] && exit

TAGPMEDIA="$PMEDIA" #remember the tag chosen above.
[ "$TAGPMEDIA" = "iusbflash" ] && PMEDIA="usbflash"
FINALPMEDIA="$PMEDIA"
if [ "$PMEDIA" = "usb2ataflash" ];then
 PMEDIA="usbflash"
 FINALPMEDIA="ataflash"
fi

##v3.97 support /dev/hd*... v406 remove, i think this handled later...
#if [ -e /proc/ide ];then
# case $FINALPMEDIA in
# ata*)
#  if [ "$SATADRIVES" = "" ];then #see /etc/rc.d/PUPSTATE.
#   SUBST_ATA="ide"
#  else
#   SUBST_ATA="sata"
#   #if [ "`probedisk | grep '^/dev/hd'`" != "" ];then
#    Xdialog --wmclass "gtkdialog2" --left --title "Puppy universal installer: IDE or SATA" --ok-label "IDE" --cancel-label "SATA" --yesno "Do you want to install to a IDE or SATA drive?
#Note, any computer manufactured before 2006 is unlikely to have a SATA
#drive. SATA is a new internal fast drive interface. Physically, you
#can tell the difference by the cable between motherboard and drive:
#IDE: broad flat cable  SATA: very narrow flat cable.
#
#NOte2, if you are installing to a USB or other pluggable media that
#will later be moved to an internal IDE or SATA socket, then you have
#to answer here according to what the final interface will be." 0 0
#    [ $? -eq 0 ] && SUBST_ATA="ide"
#   #fi
#  fi
#  substPATTERN="s/^ata/${SUBST_ATA}/"
#  PMEDIA="`echo -n "$PMEDIA" | sed -e "$substPATTERN"`"
#  FINALPMEDIA="`echo -n "$FINALPMEDIA" | sed -e "$substPATTERN"`"
#  ;;
# esac
#fi

PROBEDISK="`probedisk2 2> /tmp/probediskerr.txt`"
case $PMEDIA in
 usbflash)
  USBDRIVES="`echo "$PROBEDISK" | grep '|usbdrv|' | cut -f 3 -d '/' | cut -f 1 -d '|' | tr "\n" " "`"
  SELECTIONS=""
  for ONEUSB in $USBDRIVES
  do
   [ "$ATADRIVES" != "" ] && [ "`echo "$ATADRIVES" | grep "$ONEUSB"`" != "" ] && continue #v3.94 eliminate ide/sata drives. v3.97
   [ "$SATADRIVES" != "" ] && [ "`echo "$SATADRIVES" | grep "$ONEUSB"`" != "" ] && continue #v3.97 for old kernel.
   [ "$TAGPMEDIA" = "usbflash" ] && [ "`cat /sys/block/$ONEUSB/removable`" != "1" ] && continue
   [ "$TAGPMEDIA" = "iusbflash" ] && [ "`cat /sys/block/$ONEUSB/removable`" != "0" ] && continue
   USBINFO="`echo "$PROBEDISK" | grep "/dev/$ONEUSB" | head -n 1 | cut -f 3 -d '|' | tr '$' " " | tr ',' ' ' | tr -s " " | sed -e 's/ $//g'`"
   USBSIZE="`disktype /dev/$ONEUSB | grep "Block device" | cut -f 2 -d ',' | tr -s " " | cut -f 1-4 -d " "`"
   SELECTIONS="${SELECTIONS} $ONEUSB \"${USBINFO}, ${USBSIZE}\""
  done
  ;;
 usbhd)
  USBDRIVES="`echo "$PROBEDISK" | grep '|usbdrv|' | cut -f 3 -d '/' | cut -f 1 -d '|' | tr "\n" " "`"
  SELECTIONS=""
  for ONEUSB in $USBDRIVES
  do
   [ "$ATADRIVES" != "" ] && [ "`echo "$ATADRIVES" | grep "$ONEUSB"`" != "" ] && continue #v3.94 eliminate ide/sata drives. v3.97
   [ "$SATADRIVES" != "" ] && [ "`echo "$SATADRIVES" | grep "$ONEUSB"`" != "" ] && continue #v3.97 for old kernel.
   [ "`cat /sys/block/$ONEUSB/removable`" != "0" ] && continue
   USBINFO="`echo "$PROBEDISK" | grep "/dev/$ONEUSB" | head -n 1 | cut -f 3 -d '|' | tr '$' " " | tr -s " " | sed -e 's/ $//g'`"
   USBSIZE="`disktype /dev/$ONEUSB | grep "Block device" | cut -f 2 -d ',' | tr -s " " | cut -f 1-4 -d " "`"
   SELECTIONS="${SELECTIONS} $ONEUSB \"${USBINFO}, ${USBSIZE}\""
  done
  ;;
 cd) #v3.94 was idecd
  #find cd drives... v3.97...
  CDDRIVES="`echo "$PROBEDISK" | grep '|optical|' | cut -f 3 -d '/' | cut -f 1 -d '|' | tr "\n" " "`"
  SELECTIONS=""
  for ONEHD in $CDDRIVES
  do
   HDINFO="`echo "$PROBEDISK" | grep "/dev/$ONEHD" | head -n 1 | cut -f 3 -d '|' | tr '$' " " | tr -s " " | sed -e 's/ $//g'`"
   HDSIZE="`disktype /dev/$ONEHD | grep "Block device" | cut -f 2 -d ',' | tr -s " " | cut -f 1-4 -d " "`"
   SELECTIONS="${SELECTIONS} $ONEHD \"${HDINFO}, ${HDSIZE}\""
  done
  Xdialog --wmclass "gtkdialog2" --left --title "Puppy - Универсальный инсталлятор" --ok-label "ВЫХОД" --msgbox "Ваш ПК имеет следующие приводы CD/DVD:\n$SELECTIONS \n\nТем не менее, Вы не можете установить Puppy на CD/DVD таким же способом, как\nна жёсткий диск, накопитель USB Flash или Zip, т.к. CD/DVD не поддерживает\nпрямую запись на диск. Для CD/DVD сначала необходимо с помощью специальной\nпрограммы (см. меню 'Настройки') создать собственный live-CD/DVD.\nЗамечание: Вам понадобится новый диск CD-R или DVD-R (+R не подойдёт).\n\nНажмите кнопку для выхода..." 0 0
  exit
  ;;
 atazip)
  HDDRIVES="`echo "$PROBEDISK" | grep '|floppy|' | cut -f 3 -d '/' | cut -f 1 -d '|' | tr "\n" " "`"
  SELECTIONS=""
  for ONEHD in $HDDRIVES
  do
   HDINFO="`echo "$PROBEDISK" | grep "/dev/$ONEHD" | head -n 1 | cut -f 3 -d '|' | tr '$' " " | tr -s " " | sed -e 's/ $//g'`"
   HDSIZE="`disktype /dev/$ONEHD | grep "Block device" | cut -f 2 -d ',' | tr -s " " | cut -f 1-4 -d " "`"
   SELECTIONS="${SELECTIONS} $ONEHD \"${HDINFO}, ${HDSIZE}\""
  done
  ;;
 atahd|ataflash) #v3.94
  #at bootup, init script creates ATADRIVES='' in /etc/rc.d/PUPSTATE...
  HDDRIVES="$ATADRIVES"
  if [ -e /proc/ide ];then #v3.97 old kernel.
    IDEDRIVES="`echo "$PROBEDISK" | grep '|drive|' | grep '/dev/hd' | cut -f 3 -d '/' | cut -f 1 -d '|' | tr "\n" " "`"
    HDDRIVES="$IDEDRIVES $SATADRIVES"
  fi
  for ONEHD in $HDDRIVES
  do
   HDINFO="`echo "$PROBEDISK" | grep "/dev/$ONEHD" | head -n 1 | cut -f 3 -d '|' | tr '$' " " | tr -s " " | sed -e 's/ $//g'`"
   HDSIZE="`disktype /dev/$ONEHD | grep "Block device" | cut -f 2 -d ',' | tr -s " " | cut -f 1-4 -d " "`"
   SELECTIONS="${SELECTIONS} $ONEHD \"${HDINFO}, ${HDSIZE}\""
  done
  ;;
 *)
  gxmessage "Ещё не выполнено"
  exit
  ;;
esac


echo "$SELECTIONS"
#v2.11
if [ "$SELECTIONS" = "" ];then
 Xdialog --wmclass "gtkdialog2" --left --title "Puppy - Универсальный инсталлятор" --ok-label "Выход" --msgbox "Ничего не выбрано. Если это внешнее устройство, подключили ли Вы его?" 0 0
 exit
fi

echo '#!/bin/sh' > /tmp/dlg1
echo -n 'Xdialog --wmclass "gtkdialog2" --title "Puppy - Универсальный инсталлятор" --no-cancel --stdout --menubox "Выберите устройство, на которое будем устанавливать систему:" 0 0 4' >> /tmp/dlg1
echo -n "$SELECTIONS" >> /tmp/dlg1
echo ' > /tmp/retval'  >> /tmp/dlg1
echo 'exit $?' >> /tmp/dlg1

chmod 755 /tmp/dlg1

while [ 1 ];do #BIG LOOP

/tmp/dlg1
[ ! $? -eq 0 ] && exit
 
DRVSEL="`cat /tmp/retval`"
[ "$DRVSEL" = "" ] && exit
echo "$DRVSEL"

#v3.97 old kernel, distinguish between ide and sata...
if [ -e /proc/ide ];then
 substPATTERN='s/^ata/ide/'
 if [ "$SATADRIVES" != "" ];then
  [ "`echo "$SATADRIVES" | grep "$DRVSEL"`" != "" ] && substPATTERN='s/^ata/sata/'
 fi
 PMEDIA="`echo -n "$PMEDIA" | sed -e "$substPATTERN"`"
 FINALPMEDIA="`echo -n "$FINALPMEDIA" | sed -e "$substPATTERN"`"
fi

DRVINFO="`disktype /dev/$DRVSEL`"
SUPERFS="`echo "$DRVINFO" | grep "file system" | grep "^[a-zA-Z]" | tr -s " " | cut -f 1 -d " "`"
DRVSIZE="`echo "$DRVINFO" | grep "Block device" | cut -f 2 -d ',' | tr -s " " | cut -f 1-4 -d " "`"
DRVSIZM="`echo "$DRVSIZE" | cut -f 3 -d " "`"
if [ ! "`echo "$DRVSIZE" | grep "GiB"`" = "" ];then
 DRVSIZM="`dc $DRVSIZM 1000 \* p`"
fi
IDRVSIZM="`echo -n "$DRVSIZM" | cut -f 1 -d '.'`" #truncate to integer.

##v3.95 offer to backup entire drive...
#if [ "$PMEDIA" = "usbflash" ];then
# uPATTERN="/dev/$DRVSEL"
# uDRVDESCR="`echo "$PROBEDISK" | grep "$uPATTERN" | cut -f 3 -d '|'`"
# dsDEST='/'
# [ "$PUP_HOME" != "" ] && dsDEST='/initrd'"${PUP_HOME}"
# dsPATTERN=' '"$dsDEST"'$'
# HOMEFREEM="`df -m | grep "$dsPATTERN" | tr -s ' ' | cut -f 4 -d ' '`"
# Xdialog --buttons-style "text" --wmclass "gtkdialog2" --left --title "Puppy Universal Installer" --ok-label "No backup" --cancel-label "Backup"  --yesno "You have chosen to install to ${DRVSEL}, which is a USB Flash drive, described as:
# ${uDRVDESCR}
#
#Before continuing with choosing the partition and doing the actual install, you may
#at this stage backup the entire drive. This may be useful if you are installing to
#the internal USB Flash drive of a Intel Classmate or Asus eeePC baby laptop and you
#want to save the existing operating system, and maybe reinstall it later.
#
#The total size of ${DRVSEL} is ${IDRVSIZM}MB and this will be backed up to a compressed
#file named 'installer-backup-${DRVSEL}.img.gz' which will be approximately half to
#2/3 of this size.
#The backup file will be created at '${dsDEST}' which has ${HOMEFREEM}MB free space
#on it. This free space must be at least 200KB bigger than the anticipated size of the
#compressed backup file, if not then do not attempt to backup.
#
#Note, if you choose to backup, there is no progress window. You should see the LED
#light on the Flash drive flickering to indicate action. It may take 3 or 4 minutes,
#and when completed this Installer program will continue with normal installation.
#
#Click 'No backup' to bypass backup (normal choice)...
#Click 'Backup' to backup a pre-existing installation...
#" 0 0
# if [ $? -eq 1 ];then
#  sync
#  dd if=/dev/$DRVSEL | gzip - > ${dsDEST}/installer-backup-${DRVSEL}.img.gz
#  sync
# fi
#fi

DRVMSG=""
PUPINST=""
if [ "$SUPERFS" ];then
 fsfunc $SUPERFS #returns FSTYPE
 ispupfunc $FSTYPE $DRVSEL #returns PUPVEROLD
 [ ! $? -eq 0 ] && PUPINST=", Puppy версии $PUPVEROLD установлен"
 DRVMSG="${DRVSEL}:  ${FSTYPE}, ${DRVSIZE}${PUPINST}
"
else
 #has mbr and partitions...
 echo -n "" > /tmp/pidrvmsg.txt
 echo "$DRVINFO" |
 while read ONELINE
 do
  xPARTNUM="`echo "$ONELINE" | grep '^Partition ' | tr -s " " | cut -f 1 -d ':' | cut -f 2 -d " "`"
  [ ! "$xPARTNUM" = "" ] && PARTNUM="$xPARTNUM"
  [ ! "$xPARTNUM" = "" ] && PARTSIZE="`echo "$ONELINE" | cut -f 2 -d ':' | tr -s " " | cut -f 2-3 -d " "`"
  PARTITIONFS="`echo "$ONELINE" | grep "file system" | cut -f 1 -d " "`"
  if [ "$PARTITIONFS" ];then
   fsfunc $PARTITIONFS #sets FSTYPE.
   #find out if partition has puppy, or has pup_xxx.sfs file...
   ispupfunc $FSTYPE ${DRVSEL}${PARTNUM} #returns PUPVEROLD
   [ ! $? -eq 0 ] && PUPINST=", Puppy версии $PUPVEROLD установлен" || PUPINST="" #v3.01
#   DRVMSG="${DRVMSG}${DRVSEL}${PARTNUM}: ${FSTYPE}, size ${PARTSIZE}${PUPINST}
#"
   echo "${DRVSEL}${PARTNUM}: ${FSTYPE}, size ${PARTSIZE}${PUPINST}" >> /tmp/pidrvmsg.txt
  fi
 done

 DRVMSG="`cat /tmp/pidrvmsg.txt`"

# NUMPARTS=`echo "$DRVINFO" | grep "file system" | grep "^ " | wc -l | tr -s " " | cut -f 2 -d " "`
# TRYPARTS="`echo "$DRVINFO" | grep 'Partition ' | cut -f 1 -d ':' | sed -e 's/Partition//g' | tr -s " " | cut -f 2 -d " " | tr "\n" " "`"
# for PARTNUM in $TRYPARTS
# do
#  PARTITIONFS="`echo "$DRVINFO" | grep "file system" | grep "^ " | head -n $PARTNUM | tail -n 1 | tr -s " " | cut -f 2 -d " "`"
#  if [ "$PARTITIONFS" ];then
#   PARTSIZE="`echo "$DRVINFO" | grep "Partition ${PARTNUM}:" | tr -s " " | cut -f 3-4 -d " "`"
#   fsfunc $PARTITIONFS #sets FSTYPE.
#   #find out if partition has puppy, or has pup_xxx.sfs file...
#   ispupfunc $FSTYPE ${DRVSEL}${PARTNUM} #returns PUPVEROLD
#   [ ! $? -eq 0 ] && PUPINST=", Puppy version $PUPVEROLD installed"
#   DRVMSG="${DRVMSG}${DRVSEL}${PARTNUM}: ${FSTYPE}, size ${PARTSIZE}${PUPINST}
#"
#  fi
# done

fi

echo "$DRVMSG"

DLGTXT=""
CHOICES="`echo "$DRVMSG" | grep ':' | cut -f 1 -d ':' | tr "\n" " "`"
for ONECHOICE in $CHOICES
do
 DLGTXT="$DLGTXT
   <hbox>
    <text><label>Установить Puppy на ${ONECHOICE}:</label></text>
    <button>
     <input file>/usr/local/lib/X11/mini-icons/mini-dog.xpm</input>
     <action>Exit:${ONECHOICE}</action>
    </button>
   </hbox>
"
done
if [ "$FINALPMEDIA" = "usbflash" ];then
 MSGex1="<text><label>ВАЖНО: При использовании GParted убедитесь, что после создания раздела установлен флаг 'boot' (загрузочный)(щелкнув правой кнопкой мыши по разделу, выбрать 'Manage flags'). Также, для USB Flash лучше выбрать файловую систему fat16 как более лёгкую для загрузки, чем fat32 -- разделы с ext2 или ext3 также вполне подходят для работы.</label></text>
<text><label>Дополнительно: Gparted может показать наличие ошибок в некоторых разделах (помечаются значком '!') -- удалите их и создайте заново (и не забудьте сделать его загрузочным)</label></text>"
else
 MSGex1="<text><label>ВАЖНО: При использовании GParted убедитесь, что после создания раздела установлен флаг 'boot' (загрузочный)(щелкнув правой кнопкой мыши по разделу, выбрать 'Manage flags').</label></text>
<text><label>Дополнительно: Gparted может показать наличие ошибок в некоторых разделах (помечаются значком '!') -- удалите их и создайте заново (и не забудьте сделать его загрузочным)</label></text>"
fi
if [ "$DLGTXT" = "" ];then
 DLGTXT="<hbox>
 <text><label>На ${DRVSEL} нет размеченных разделов! Запустите GParted и создайте раздел:</label></text>
    <button>
     <input file>/usr/local/lib/X11/mini-icons/mini-hdisk.xpm</input>
     <label>GParted</label>
     <action>Exit:RUNGPARTED</action>
    </button>
</hbox>
$MSGex1
<text><label>\" \"</label></text>
"
fi

DLGEXT=""

#v3.97 offer "comboformat" installation...
if [ "$FINALPMEDIA" = "usbflash" ];then
 DLGEXT="
   <frame Комбинированный формат>
    <hbox>
     <text><label>ПРЕДУПРЕЖДЕНИЕ: НЕ ИСПОЛЬЗУЙТЕ ЭТОТ МЕТОД БЕЗ НЕОБХОДИМОСТИ, ВОЗМОЖНЫ ОШИБКИ. ComboFormat - новый метод инсталляции, особенно удобный для устройств USB Flash. Он применяется только на дисках размером более 1GB, при этом создаётся раздел FAT16 размером  128MB, а на оставшемся пространстве - раздел ext2. Это нестандартный метод, который работает только на ПК, имеющих в BIOS возможность загрузки с устройств USB, главным образом 'USB-ZIP'. Поскольку  метод является экспериментальным, выбирать его стоит только в случае, когда все остальные способы не работают. Нажмите кнопку:</label></text>
     <vbox>
      <button>
       <input file>/usr/local/lib/X11/mini-icons/mini-dog.xpm</input>
       <action>Exit:COMBOFORMAT</action>
      </button>
      </vbox>
     </hbox>
    </frame>
 "
fi

if [ "`echo "$DRVMSG" | cut -f 1 -d ':' | grep "[a-zA-Z]$"`" = "" ];then
 #ask if want superfloppy install...
 DLGEXT="$DLGEXT
   <frame Файловая система в разделе>
    <hbox>
     <text><label>ВНИМАНИЕ: Вы действительно хотите использовать данную файловую систему на разделе? В частности, 'vfat' и 'ntfs' желательно заменить на 'ext2' или 'ext3', если Вы планируете использовать только Puppy или устанавливаете его на внутренний диск. При использовании 'vfat' или 'ntfs' Вы сможете выполнить только 'экономную' ('frugal') установку. Ntfs, к тому же, чрезвычайно требовательна к ресурсам ПК и медлена. Так что, по возможности, избавьтесь от них. Нажмите кнопку, чтобы запустить GParted для просмотра и изменения разделов:</label></text>
     <vbox>
      <button>
       <input file>/usr/local/lib/X11/mini-icons/gparted.xpm</input>
       <action>Exit:RUNGPARTED</action>
      </button>
     </vbox>
    </hbox>
   </frame>
   <frame Superfloppy>
   <hbox>
    <text><label>ВНИМАНИЕ: ОБЫЧНО НЕ РЕКОМЕНДУЕТСЯ. Вы хотите установить Puppy в режиме Superfloppy, то есть, без MBR и без разбиения диска на разделы? ...в этом случае диск будет доступен как /dev/$DRVSEL, без указания номера раздела. Это бывает необходимо для загрузки USB Flash на некоторых ПК с нестандартным BIOS. Нажмите кнопку, если Вы согласны:</label></text>
    <vbox>
     <button>
      <input file>/usr/local/lib/X11/mini-icons/mini-dog.xpm</input>
      <action>Exit:REFORMAT_${DRVSEL}</action>
     </button>
    </vbox>
   </hbox>
   </frame>
"
else #drive is a superfloppy.
 DLGEXT="$DLGEXT
   <frame Superfloppy>
   <hbox>
    <text><label>Сейчас диск размечен в режиме Superfloppy и не имеет MBR и разделов. Доступ к нему осуществляется как к /dev/$DRVSEL, без указания номера раздела (бывает полезно для загрузки с USB Flash на ПК с нестандартным BIOS). Хотите ли Вы переразметить диск таким образом, чтобы он стал иметь раздел /dev/${DRVSEL}1, в который будет установлен Puppy? Если это так, нажмите кнопку:</label></text>
    <vbox>
     <button>
      <input file>/usr/local/lib/X11/mini-icons/mini-dog.xpm</input>
      <action>Exit:REFORMAT_${DRVSEL}1</action>
     </button>
    </vbox>
   </hbox>
   </frame>
"
fi

DLG2="
 <wtitle>Puppy - Универсальный инсталлятор</wtitle>
 <vbox>
  <text><label>Вот что Puppy нашёл на выбранном устройстве:</label></text>
  <text><label>\"${DRVMSG}\"</label></text>
$DLGTXT
$DLGEXT
   <button>
    <label>Вернуться и выбрать другое устройство</label>
    <action>Exit:GOBACK</action>
   </button>
 </vbox>
"

RETTXT="`echo "$DLG2" | gtkdialog2 --stdin`"

if [ "`echo "$RETTXT" | grep 'RUNGPARTED'`" != "" ];then
HELPGPARTED=" От автоматического запуска Универсального инсталлятора по окончании работы GParted
отказались сознательно, т.к. есть необходимость убедиться в том, что изменения
разделов на диске ${DRVSEL} правильно опознаны ядром. Одна из особенностей
последних ядер Linux - невозможность немедленного применения изменения разделов.
 В случае с устройствами USB их необходимо отключить, не забыв размонтировать,
и подключить заново, чтобы пересканировать. И в любом случае, после внесения
изменений в разделы, запустите программу Pmount и убедитесь, что разделы опознаны 
правильно. Если это не так, понадобится перегрузить ПК. Затем можно снова запустить
Универсальный инсталлятор.

Касаетельно 'ntfs' или 'vfat' - не стоит изменять их на 'ext2' или 'ext3', если на
них установлены Windows или DOS. Также, большинство устройств USB Flash продаются
размеченными под 'fat16' и это нормально, т.к. Вы сможете их использовать для передачи
файлов в Windows, но будете ограничены использованием файла 'pup-save' для хранения
личных настроек. В случае же 'ext2/3' для этого можно использовать весь раздел. Если
сомневаетесь, оставьте 'vfat', но убедитесь, что используется 'fat16', а не 'fat32',
т.к. у Syslinux есть проблемы с загрузкой последней."
 Xdialog --wmclass "gtkdialog2" --left --title "Puppy - Универсальный инсталлятор" --help "$HELPGPARTED" --msgbox "При нажатии кнопки OK работа Универсального Инсталлятора будет завершена и запустится GParted. 
По окончании работы с GParted нужно будет снова запустить Универсальный Инсталлятор.

Более подробную информацию можно получить, нажав кнопку \"Help\"...

ВНИМАНИЕ: изменение файловой системы уничтожит все данные в разделе! 

И ещё. При работе в GParted не забывайте убедиться, что у загрузочного раздела установлен
соответствующий флаг! При необходимости сделать это можно, нажав правой кнопкой мыши на
названии раздела, выбрать в контекстном меню 'Упраление флагами' ('Manage flags')." 0 0
 [ $? -ne 0 ] && exit
 exec gparted /dev/$DRVSEL
fi

#v3.97 ComboFormat method....
if [ "`echo "$RETTXT" | grep 'COMBOFORMAT'`" != "" ];then
 Xdialog --wmclass "gtkdialog2" --left --title "Puppy - Универсальный инсталлятор" --ok-label "ПРОДОЛЖИТЬ" --cancel-label "НАЗАД" --yesno "ПРОВЕРКА ГОТОВНОСТИ К РАБОТЕ
 
 Комбинированный метод очистит диск $DRVSEL и создаст на нём два раздела не совсем
стандартным способом. Первый раздел размером 128MB с файловой системой FAT16
будет виден как диск ZIP и для загрузки с него можно выбрать в BIOS ПК параметр
'USB-ZIP', но в то же время диск будет определяться как superfloppy (несмотря на
то, что он имеет два раздела) и в BIOS можно выбрать - 'USB-FLOPPY'. Так как
на диске есть разделы, загрузка с 'USB-HDD' также должна работать на большинстве
компьютеров. Учитывая такой изменчивый набор свойств диска, некоторые программы,
такие как Gparted, могут неправильно отображать его разметку, однако базовые
утилиты, например fdisk, disktype и pmount, будут работать правильно.

Комбинированный метод относится к разряду экспериментальных и если Вы не готовы
к столь радикальной 'хирургии' Вашего диска, нажмите кнопку 'НАЗАД'...

Если Вы нажмёте кнопку 'ПРОДОЛЖИТЬ', диск будет немедленно переразмечен без 
дополнительных вопросов. Пожалуйста, убедитесь, что /dev/$DRVSEL - действительно
тот диск, который Вы хотите переразметить!!!..." 0 0
 [ ! $? -eq 0 ] && continue
 while [ "`mount | grep "$DRVSEL"`" != "" ];do
  Xdialog --wmclass "gtkdialog2" --left --title "Puppy - Универсальный инсталлятор" --ok-label "ПРОДОЛЖИТЬ" --cancel-label "ВЫХОД" --yesno "\nК сожалению, $DRVSEL сейчас смонтирован.\n\nРазмонтируйте его, пожалуйста, и нажмите кнопку 'ПРОДОЛЖИТЬ'.\nЕсли размонтировать не удастся, произвести установку будет\nневозможно и Вы должны будете завершить работу программы." 0 0
  [ ! $? -eq 0 ] && exit
 done
 #copy special 128MB fat16 partition image to flash drive...
 yaf-splash -font "8x16" -outline 0 -margin 4 -bg orange -text "Пожалуйста, ждите, копируется файл  /lib/boot128m.img размером 128MB на /dev/$DRVSEL..." &
 XPID9=$!
 gunzip -c /lib/boot128m.img.gz | dd of=/dev/$DRVSEL
 sync
 kill $XPID9
 yaf-splash -font "8x16" -outline 0 -margin 4 -bg orange -text "Пожалуйста, ждите, создаётся второй раздел с файловой системой ext2 ..." &
 XPID9=$!
 echo -e 'n\np\n2\n\n\nw\n' | fdisk /dev/$DRVSEL
 sync
 mke2fs -m 0 /dev/${DRVSEL}2
 sync
 kill $XPID9
 sfPATTERN="/dev/${DRVSEL}2|ext2"
 if [ "`probepart | grep "$sfPATTERN"`" = "" ];then
  Xdialog --wmclass "gtkdialog2" --left --title "Puppy - Универсальный инсталлятор: ОШИБКА" --msgbox "Произошла ошибка. Нажмите кнопку для выхода..." 0 0
  exit
 fi
 #this returns with SRCPATH, path of puppy files that are to be installed...
 locate_puppy_src_files
 #now copy puppy files to first fat16 partition...
 DESTPART="${DRVSEL}4"
 yaf-splash -font "8x16" -outline 0 -margin 4 -bg orange -text "Пожалуйста, ждите, копирование файлов Puppy на  /dev/${DRVSEL}4, файловая система FAT16 на разделе /dev/$DRVSEL..." &
 XPID9=$!
 mkdir -p /mnt/$DESTPART
 mount -t vfat /dev/$DESTPART /mnt/$DESTPART
 cp -f $SRCPATH/vmlinuz /mnt/$DESTPART/
 cp /usr/lib/syslinux/files/* /mnt/$DESTPART/
 if [ "$FINALPMEDIA" = "ataflash" -o "$FINALPMEDIA" = "ideflash" ];then
  echo "append initrd=initrd.gz ide=nodma pmedia=$FINALPMEDIA nosmp" >> /mnt/$DESTPART/syslinux.cfg
 else
  echo "append initrd=initrd.gz pmedia=$FINALPMEDIA nosmp" >> /mnt/$DESTPART/syslinux.cfg
 fi
 sync
 echo "Создание файла-метки..."
 [ "$FINALPMEDIA" = "usbflash" ] && touch /mnt/$DESTPART/USBFLASH
 [ "$FINALPMEDIA" = "ataflash" ] && touch /mnt/$DESTPART/IDEFLASH
 [ "$FINALPMEDIA" = "ideflash" ] && touch /mnt/$DESTPART/IDEFLASH
 [ "$FINALPMEDIA" = "usbhd" ] && touch /mnt/$DESTPART/USBHD
 sync
 echo "Копирование initrd.gz..."
 cp -f $SRCPATH/initrd.gz /mnt/$DESTPART/
 sync
 echo "Копирование файлов .sfs..."
 cp -f $SRCPATH/pup_${NEWVER}*.sfs /mnt/$DESTPART/ 2>/dev/null
 sync
 cp -f $SRCPATH/zdrv_${NEWVER}.sfs /mnt/$DESTPART/ 2>/dev/null
 sync
 umount /mnt/$DESTPART
 kill $XPID9
 Xdialog --wmclass "gtkdialog2" --left --title "Puppy - Универсальный инсталлятор" --msgbox "Вот и всё. PuppyRus установлен на /dev/$DRVSEL. Установите в BIOS загрузку с USB-ZIP
и всё должно работать, а если нет, попробуйте выбрать USB-FLOPPY или USB-HDD.
Замечание: некоторые современные BIOS не имеют этих установок, т.к. проверяют
и автоматически определяют тип подключенного USB устройства. 
Нажмите кнопку OK для выхода..." 0 0
 exit
fi

[ ! "`echo "$RETTXT" | grep 'abort'`" = "" ] && exit
[ "`echo "$RETTXT" | grep 'EXIT:GOBACK'`" = "" ] && break

done #BIG LOOP


#when arrive here, have
#RETTXT="EXIT:sda1", DRVMSG="sda1: vfat, size 122.1 MiB, Puppy version 108 installed" (has all parts fnd)

#sanity check...
#SANITYPART="`echo -n "$DRVMSG" | cut -f 1 -d ':'`"
SANITYPART="`echo -n "$RETTXT" | grep 'EXIT' | cut -f 2 -d ':' | cut -f 2 -d '_'`"
SANITYMNTPT="`mount | grep "/dev/$SANITYPART" | tr -s " " | cut -f 3 -d " "`"
#v2.02 cannot use mount for ntfs-3g driver...
#[ "$SANITYMNTPT" = "" ] && SANITYMNTPT="`ps -e | grep -o ntfs\-3g.* | grep "/dev/$SANITYPART" | sed -e 's/[^a-zA-Z0-9/._\-]/ /g' | tr -s ' ' | tr ' ' "\n" | grep '^/mnt/'`"

[ "$SANITYMNTPT" = "" ] && SANITYMNTPT="`ps -e | grep -o 'ntfs\-3g.*' | grep "/dev/$SANITYPART" | tr '\t' ' ' | tr -s ' ' | tr ' ' "\n" | grep '^/mnt/'`"

if [ ! "$SANITYMNTPT" = "" ];then
 SANITYMSG1="$SANITYPART смонтирован, надо размонтировать!!!"
 SANITYMSG2="$SANITYPART смонтирован в режиме чтения-записи."
 SANITYMSG3="$SANITYPART не содержит файл pup_save.3fs."
 #SANITYMNTPT="`mount | grep "/dev/$SANITYPART" | tr -s " " | cut -f 3 -d " "`"
 SANITYRORW="`mount | grep "/$SANITYPART" | tr -s " " | cut -f 6 -d " "`"
 [ ! "`echo -n "$SANITYMNTPT" | grep "/initrd/"`" = "" ] && SANITYMSG1="$SANITYPART не может быть размонтирован!"
 [ "$SANITYRORW" = "(ro)" ] && SANITYMSG2="$SANITYPART смонтирован в режиме только для чтения!"
 [ -f $SANITYMNTPT/pup_save.3fs ] && SANITYMSG3="$SANITYPART содержит персональный файл pup_save.3fs!"
 Xdialog --wmclass "gtkdialog2" --left --title "Puppy - Универсальный инсталлятор" --ok-label "ПРОДОЛЖИТЬ" --cancel-label "ВЫХОД" --yesno "\nПРОВЕРКА ГОТОВНОСТИ РАЗДЕЛА.\n\nПроверка готовности раздела перед продолжением работы:\n$SANITYMSG1 \n$SANITYMSG2 \n$SANITYMSG3 \n\nЕсли выше сообщено, что раздел смонтирован, его нужно размонтировать прямо\nсейчас, но если сообщается, что размонтировать нельзя, при установке возникнут\nпроблемы -- в случае установки на жёсткий диск Вы, естественно, можете\nпроизвести только установку \"option1\" (подробнее см. ниже).\nЕсли на разделе размещён pup_save.3fs, тогда понятно, почему раздел нельзя\nотмонтировать -- он сейчас используется Puppy. Загрузив Puppy с live-CD полностью\nв RAM (не используя pup_save.3fs), можно решить проблему -- но Вы не должны\nудалять или переименовывать pup_save.3fs прямо сейчас, ибо он используется\nсистемой. Или, запустив другую ОС и переименовав файл, загрузитесь с\nPuppyRus live-CD.\n\nПо возможности размонтируйте раздел прямо сейчас, иначе при нажатии кнопки\nПРОДОЛЖИТЬ можно будет выполнить только ограниченную установку\nили нажмите кнопку ВЫХОД и попытайтесь решить проблему с монтированием..." 0 0
 [ ! $? -eq 0 ] && exit
fi

if [ ! "`echo "$RETTXT" | grep 'EXIT:REFORMAT'`" = "" ];then
 #RETTXT will have "EXIT:REFORMAT_sda" or "EXIT:REFORMAT_sda1", depending whether
 #we want to format in superfloppy mode or with a MBR and a partition...
 DESTPART="`echo "$RETTXT" | grep 'EXIT:REFORMAT' | cut -f 2 -d ':' | cut -f 2 -d '_'`"
 if [ "`echo "$DESTPART" | grep "[0-9]$"`" = "" ];then
  #want superfloppy...
  DLG3="
 <wtitle>Puppy - Универсальный инсталлятор</wtitle>
 <vbox>
   <text><label>Вы выбрали - форматировать /dev/${DESTPART} в режиме Superfloppy. Теперь выберите тип файловой системы на диске - vfat или ext3. Ext3 более гибкая (и рекомендуемая) в использовании, однако если требуется доступ к устройству из Windows - выберите vfat. Примечание: вообще то, существуют и в Windows инструменты доступа к разделам ext2/3.</label></text>
   <text><label>Ещё одно уточнение: если Вы выберете ext3 - весь диск сразу будет доступен для хранения персональных данных, в то время, как при выборе vfat для их хранения необходимо будет создать на диске специальный файл (pup_save.3fs), содержащий внутри себя файловую систему ext3. Нажмите кнопку 'ФОРМАТИРОВАТЬ в ext3' или 'ФОРМАТИРОВАТЬ в vfat', чтобы начать форматирование...</label></text>
  <hbox>
   <button>
    <label>FORMAT_ext3</label>
    <action>Exit:ext3</action>
   </button>
   <button>
    <label>FORMAT_vfat</label>
    <action>Exit:vfat</action>
   </button>
  </hbox>
 </vbox>
"
  RETTXT="`echo "$DLG3" | gtkdialog2 --stdin`"

  [ ! "`echo "$RETTXT" | grep 'abort'`" = "" ] && exit
  DESTFS="`echo "$RETTXT" | grep 'EXIT:' | cut -f 2 -d ':'`"
  echo '#!/bin/sh' > /tmp/formatsuper.sh
  echo -e "echo -n \"ПРОВЕРКА ГОТОВНОСТИ: форматирование /dev/${DRVSEL}, ENTER для продолжения или CTRL-C - для выхода: \""  >> /tmp/formatsuper.sh
  echo 'read mooo'  >> /tmp/formatsuper.sh
  #echo 'echo "Zeroising the entire drive..."'  >> /tmp/formatsuper.sh
  #echo 'echo "(please be very patient, this could take awhile)"'  >> /tmp/formatsuper.sh
  ##echo "dd if=/dev/zero bs=1024 | $BAR -of /dev/$DRVSEL -s ${IDRVSIZM}m" >> /tmp/formatsuper.sh
  #echo "dd if=/dev/zero of=/dev/$DRVSEL" >> /tmp/formatsuper.sh
  #no, will just zeroise the mbr section...
  echo "dd if=/dev/zero of=/dev/$DRVSEL bs=512 count=1" >> /tmp/formatsuper.sh
  echo 'sync'  >> /tmp/formatsuper.sh
  if [ "$DESTFS" = "ext3" ];then
   echo 'echo "Создание файловой системы ext3 на диске..."'   >> /tmp/formatsuper.sh
   echo -e "echo \"y\" | mke2fs -j -m 0 /dev/$DRVSEL"   >> /tmp/formatsuper.sh
  else #vfat
   echo 'echo "Создание файловой системы vfat на диске..."'   >> /tmp/formatsuper.sh
   echo "mkdosfs -I /dev/$DRVSEL" >> /tmp/formatsuper.sh
  fi
  echo 'sync'  >> /tmp/formatsuper.sh
  echo 'echo -n "Нажмите кнопку ENTER для продолжения: "'   >> /tmp/formatsuper.sh
  echo 'read moo'   >> /tmp/formatsuper.sh
  chmod 755 /tmp/formatsuper.sh
  urxvt -bg "orange" -title "Puppy - Универсальный инсталлятор" -geometry 80x20 -e /tmp/formatsuper.sh
  DESTSIZM="$DRVSIZM"
  IDESTSIZM="$IDRVSIZM"
  DESTVER="" #previous version, n.a.
 else
  #want to partition with partition 1...
  DLG3="
 <wtitle>Puppy - Универсальный инсталлятор</wtitle>
 <vbox>
   <text><label>Вы выбрали форматирование /dev/${DRVSEL} с MBR и разделом. Теперь выберите тип файловой системы на диске - vfat или ext3. Ext3 более гибкая (и рекомендуемая) в использовании, однако если требуется доступ к устройству из Windows - выберите vfat. Примечание: вообще то, существуют и в Windows инструменты доступа к разделам ext2/3.</label></text>
   <text><label>Ещё одно уточнение: если Вы выберете ext3 - весь раздел сразу будет доступен для хранения персональных данных, в то время, как при выборе vfat для их хранения Puppy создаcт в разделе специальный файл (pup_save.2fs), содержащий внутри себя файловую систему ext2.</label></text>
   <text><label>Накопители USB Flash: на них наиболее часто распространены разделы vfat (fat16) для совместимости с Windows, к тому же некоторые старые BIOS поддерживают загрузку только с fat16.</label></text>
   <text><label>\" \"</label></text>
   <text><label>Теперь необходимо выйти из Универсального Инсталлятора и открыть GParted, по окончании работы в котором снова запустить Универсальный инсталлятор. В GParted, помните, -- после создания раздела необходимо назначить его загрузочным (boot) - щёлкнув правой кнопкой мыши по разделу, выбрать 'Управление флагами' и назначить 'Загрузка'.</label></text>
   <text><label>Дополнительно: Gparted может показать наличие ошибок в некоторых разделах (помечаются значком '!') -- удалите их и создайте заново (и не забудьте сделать его загрузочным)</label></text>
   <text><label>Нажмите кнопку для запуска GParted...</label></text>
  <hbox>
   <button>
    <label>Запустить GParted</label>
    <action>Exit:gparted</action>
   </button>
   <button cancel>
   </button>
  </hbox>
 </vbox>
"
  RETTXT="`echo "$DLG3" | gtkdialog2 --stdin`"
  MYACTION="`echo "$RETTXT" | grep 'EXIT:' | cut -f 2 -d ':'`"
  [ "$MYACTION" = "gparted" ] && exec gparted /dev/$DRVSEL
  exit
  
 fi
else
 DESTPART="`echo "$RETTXT" | grep 'EXIT:' | cut -f 2 -d ':'`"
 DESTFS="`echo "$DRVMSG" | grep "$DESTPART" | cut -f 1 -d ',' | tr -s " " | cut -f 2 -d " "`"
 DESTSIZE="`echo "$DRVMSG" | grep "$DESTPART" | tr -s " " | cut -f 4-5 -d " "`"
 DESTSIZM="`echo -n "$DESTSIZE" | cut -f 1 -d " "`"
 if [ ! "`echo "$DESTSIZE" | grep "GiB"`" = "" ];then
  DESTSIZM="`dc $DESTSIZM 1000 \* p`"
 fi
 IDESTSIZM="`echo -n "$DESTSIZM" | cut -f 1 -d '.'`" #truncate to integer.
 DESTVER="`echo "$DRVMSG" | grep "$DESTPART" | tr -s " " | grep "installed" | cut -f 8 -d " "`"
fi


if [ "`echo "$DESTPART" | grep "[0-9]$"`" = "" ];then
 #superfloppy
 DLG4="
 <wtitle>Puppy - Универсальный инсталлятор</wtitle>
 <vbox>
  <text><label>Вы выбрали для установки Puppy весь диск, размеченный в режиме Superfloppy - без MBR (Главной загрузочной записи) и разделов. Это помогает, если BIOS ПК имеет проблемы загрузки с устройств Flash-памяти (в том числе USB Flash).</label></text>
  <text><label>Целевой диск ${DESTPART} с файловой системой ${DESTFS} размером ${DESTSIZM}M. Нажмите кнопку 'OK' для установки Puppy...</label></text>
  <hbox><button ok></button><button cancel></button></hbox>
 </vbox>
"
 RETTXT="`echo "$DLG4" | gtkdialog2 --stdin`"
else
 DLG4="
 <wtitle>Puppy - Универсальный инсталлятор</wtitle>
 <vbox>
  <text><label>Вы выбрали для установки Puppy раздел /dev/${DESTPART} размером ${DESTSIZM}M с файловой системой ${DESTFS}.</label></text>
  <text><label>Нажмите кнопку OK для установки Puppy (замечание: до начала реальной установки будет выведено ещё одно или два дополнительнительных диалоговых окон)...</label></text>
  <hbox><button ok></button><button cancel></button></hbox>
 </vbox>
"
 RETTXT="`echo "$DLG4" | gtkdialog2 --stdin`"
fi

[ ! $? -eq 0 ] && exit
[ "`echo "$RETTXT" | grep 'OK'`" = "" ] && exit



#get latest Puppy files....
locate_puppy_src_files


#find out if puppy already on dest...
ispupfunc $DESTFS $DESTPART
#...sets PUPVEROLD.

#now to do the actual install...
case $FINALPMEDIA in
 usbflash|usbhd|ataflash|atazip) #removable media, install with syslinux/extlinux

  #26mar06 JustGreg fix mbr...
  if [ "`echo "$DESTPART" | grep '[0-9]$'`" != "" ];then #superfloppy mode has no mbr.
   #DESTPART is a partition (not superfloppy).
   DESTDRV="`echo -n "$DESTPART" | cut -b 1-3`"
   DESTNUM="`echo -n "$DESTPART" | cut -b 4-5`"
   dd if=/dev/$DESTDRV of=/tmp/mbr446.bin bs=446 count=1
   sync
   
   #v3.95
   ALPHADUMP="`hexdump -C /tmp/mbr446.bin | cut -f 2 -d '|' | tr '\n' ' ' | tr -d ' '`"
   #this will be =1 if mbr has 'GRUB' in it, else =0...
   FLAGGRUB="`echo "$ALPHADUMP" | grep 'GRUB' | wc -l`"
   
   #v3.97 have a case where normal bootable flash vfat pen drive has the
   #string 'GRUB.Geom.HardDisk.Read.Error' in the mbr...
   [ "$FLAGGRUB" = "1" ] && [ "`echo "$ALPHADUMP" | grep 'GRUB.Geom.HardDisk.Read.Error'`" != "" ] && FLAGGRUB="0"
   
   if [ "`hexdump -x /tmp/mbr446.bin | tr -s " " | cut -f 2-9 -d " " | grep '[1-9a-zA-Z]'`" = "" -o "$FLAGGRUB" = "1" ];then
    MBRCHOICE="`Xdialog --wmclass "gtkdialog2" --left --title "Puppy - Универсальный инсталлятор" --no-cancel --stdout --menubox "Отсутствует начальный загрузчик в MBR (Master Boot Record), так что\nзагрузиться с устройства USB  не получится. Для исправления проблемы\nвыберите один из следующих вариантов. Обычно подходит mbr.bin." 0 0 4 sys-nopart.mbr "Начальный загрузчик, созданный JustGreg" mbr.bin "Из пакета Syslinux" mbrfat.bin "Из пакета makebootfat" spb2_mbr.bin "Из spblinux, созданного Christian Ostheimer" `"
   else
    MBRCHOICE="`Xdialog --wmclass "gtkdialog2" --left --title "Puppy - Универсальный инсталлятор" --no-cancel --stdout --menubox "MBR (Master Boot Record) на устройстве USB записана правильно, так что можно\nвыбрать первый вариант. Однако, если Вы не можете загрузиться с устройства и\nуверены, что настройки BIOS правильны и ПК способен грузиться с USB, попробуйте\nодну из следующих альтернативных записей MBR.\nЗамечание: Если Вы выберите замену MBR, старые первые 446 байт (раздел\nначального загрузчика) MBR будут сохранены в /tmp/oldmbr.bin.\nЗамечание: Вы можете переписать MBR непосредственно, не запуская\nУниверсальный инсталлятор снова: файлы находятся в /usr/lib/syslinux,\nи для их копирования можно использовать программу dd.\nНапример: dd if=spb2_mbr.bin of=/dev/${DESTDRV}\nЗамечание: Обычно подходит mbr.bin." 0 0 6 default "НИЧЕГО НЕ ДЕЛАТЬ, оставить существующую MBR" sys-nopart.mbr "Начальный загрузчик, созданный JustGreg" mbr.bin "Из пакета Syslinux" mbrfat.bin "Из пакета makebootfat" spb2_mbr.bin "Из spblinux, созданного Christian Ostheimer" `"
   fi
   rm /tmp/mbr446.bin
   if [ ! "$MBRCHOICE" = "" ];then
    if [ ! "$MBRCHOICE" = "default" ];then
     dd if=/dev/$DESTDRV of=/tmp/oldmbr.bin bs=446 count=1
     sync
     dd if=/usr/lib/syslinux/$MBRCHOICE of=/dev/$DESTDRV
     sync
    fi
   fi
   
   #check that partition has 'boot' flag set...
   QPATTERN="^Partition ${DESTNUM}:"
   if [ "`disktype /dev/$DESTDRV | grep "$QPATTERN" | grep 'bootable'`" = "" ];then
    Xdialog --wmclass "gtkdialog2" --left --title "Puppy - Универсальный инсталлятор" --no-cancel --stdout --ok-label "GParted" --cancel-label "Пропустить" --yesno "Небольшая проблема. Раздел ${DESTPART}, возможно, не помечен загрузочным, что
необходимо для загрузки с него. Рекомендуется запустить сейчас GParted, 
нажав соответствующую кнопку, щёлкнуть правой кнопкой мыши по разделу и 
выбрав 'Управление флагами', установить флаг 'Загрузка'.
После выхода из GParted работа Универсального инсталлятора продолжится.

Нажмите кнопку 'GParted' (рекомендуется) для запуска GParted...
Нажмите кнопку 'Пропустить' для пропуска этой операции..." 0 0
    [ $? -eq 0 ] && gparted /dev/$DESTDRV
   fi
  fi

  case $DESTFS in
   vfat)
     if [ ! "`echo "$DESTPART" | grep '[0-9]$'`" = "" ];then
      PARTCHOICE="`Xdialog --wmclass "gtkdialog2" --left --title "Puppy - Универсальный инсталлятор" --no-cancel --stdout --menubox "По умолчанию выберите здесь 'ПРОСТО ПРОПУСТИТЬ'.\nУБЕДИТЕСЬ, ПОЖАЛУЙСТА, ЧТО ВЫБРАНА ВЕРХНЯЯ СТРОКА И НАЖМИТЕ КНОПКУ 'OK'\n\nОднако, если после завершения работы Универсального инсталлятора Puppy\nне загружается, Вы можете попробовать один из других вариантов.\n\nОбычно помогает удаление раздела и создание его заново с помощью GParted..." 0 0 4 default "ПРОСТО ПРОПУСТИТЬ" GParted "Удалить и заново создать раздел на USB/IDE-CF с помощью  GParted" syslinux "Сделать раздел msdos/vfat на USB или IDE-CF загрузочным"`"
    #  [ "$PARTCHOICE" = "syslinux" ] && fixusbfunc $DESTPART $DESTFS
      [ "$PARTCHOICE" = "GParted" ] && gpartedfixusbfunc $DESTPART $DESTFS
     fi
    #params passed in: $DESTPART "$SRCPATH" $FINALPMEDIA
    echo '#!/bin/sh
DESTPART="$1"
SRCPATH="$2"
FINALPMEDIA="$3"
echo "ЗАВЕРШАЮЩАЯ ПРОВЕРКА ГОТОВНОСТИ К РАБОТЕ!"
echo "Вы готовы к установке Puppy на /dev/$DESTPART, с параметром загрузки"
echo "pmedia=$FINALPMEDIA. Файлы vmlinuz, initrd.gz, pup_xxx.sfs, syslinux.cfg"
echo "(и, возможно, zdrv_xxx.sfs, если существует. pup_xxx.fs может находиться"
echo "внутри initrd.gz) будут записаны на /dev/$DESTPART и Syslinux будет"
echo "использован для загрузки."
echo
echo -n "Нажмите кнопку ENTER для продолжения или CTRL-C - для выхода: "
read goforit

#v3.95...
mount -t vfat /dev/$DESTPART /mnt/data
echo
echo "Вы хотите очистить все файлы на /dev/$DESTPART? Сейчас он смонтирован на"
echo "/mnt/data и прежде чем ответить, можно посмотреть его содержимое. При"
echo "обновлении Puppy необходимо ответить 'НЕТ', и 'ДА' в случае новой"
echo "установки, т.к. это даст Вам возможность избавиться от старых файлов,"
echo "просто занимающих место на диске."
echo "Замечание: Вы можете также вручную удалить файлы на /mnt/data прежде чем"
echo "ответить 'НЕТ'."
echo "Замечание: Если Вы сейчас ответите 'НЕТ', скрипт удалит некоторые файлы"
echo "предыдущей установки Puppy (это не касается pup_save файла!)."
echo
echo "НЕТ - нажмите одну только клавишу ENTER для сохранения файлов или "
echo -n "ДА - сначала любую клавишу, а затем ENTER для удаления всех файлов: "
read WIPEALL
if [ "$WIPEALL" != "" ];then
 echo
 echo "Удаление содержимого /mnt/data..."
 rm -rf /mnt/data/*
else
 #well, minimum to get rid of...
 rm -f /mnt/data/image.gz 2> /dev/null
 rm -f /mnt/data/usr_cram.fs 2> /dev/null
 rm -f /mnt/data/pup_*.sfs #v2.11
 rm -f /mnt/data/devx_*.sfs #v2.11
 rm -f /mnt/data/zdrv_*.sfs #v2.16
fi
sync
umount /mnt/data

echo
echo "Установка загрузчика на $DESTPART..."
syslinux  /dev/$DESTPART
sync

mount -t vfat /dev/$DESTPART /mnt/data
echo
echo "Копирование vmlinuz..."
cp -f $SRCPATH/vmlinuz /mnt/data/
sync
echo "Создание syslinux.cfg..."
FCOPY=""
echo "Записать в syslinux.cfg параметр загрузки 'pfix=copy'?"
echo "Это приведёт к тому, что файл pup_xxx.sfs при старте будет грузиться в"
echo "RAM, при этом время загрузки несколько увеличится, но скорость работы"
echo "приложений возрастёт."
echo "Хороший выбор, если в Вашем ПК 256MB или более RAM."
echo "(можно позже изменить его, отредактировав syslinux.cfg)"
echo "(Замечание: Puppy отменит это и не будет копировать в память при её недостатке)"
echo -n "Нажмите одну только клавишу ENTER для ответа 'НЕТ' или "
echo -n "любую клавишу и затем ENTER для ответа 'ДА': "
read FCOPY
[ "$FCOPY" != "" ] && FCOPY=" pfix=copy"
#v2.20 root=/dev/ram0 removed...
cp /usr/lib/syslinux/files/* /mnt/data/
if [ "$FINALPMEDIA" = "ataflash" ];then
 echo "append initrd=initrd.gz ide=nodma pmedia=$FINALPMEDIA$FCOPY nosmp" >> /mnt/data/syslinux.cfg
else
 echo "append initrd=initrd.gz pmedia=$FINALPMEDIA$FCOPY nosmp" >> /mnt/data/syslinux.cfg
fi
sync
echo "Создание маркерного файла..."
#echo "(Creating marker file for wakepup boot floppy...)"
[ "$FINALPMEDIA" = "usbflash" ] && touch /mnt/data/USBFLASH
[ "$FINALPMEDIA" = "ataflash" ] && touch /mnt/data/IDEFLASH
[ "$FINALPMEDIA" = "usbhd" ] && touch /mnt/data/USBHD
[ "$FINALPMEDIA" = "atazip" ] && touch /mnt/data/IDEZIP
sync
echo "Копирование initrd.gz..."
cp -f $SRCPATH/initrd.gz /mnt/data/
sync
echo "Копирование .sfs файлов..."
cp -f $SRCPATH/pup_*.sfs /mnt/data/ 2>/dev/null
sync
cp -f $SRCPATH/zdrv_*.sfs /mnt/data/ 2>/dev/null
sync
umount /mnt/data
echo -n "Завершено, нажмите клавишу ENTER для продолжения: "
read moo
' > /tmp/installpup.sh
    chmod 755 /tmp/installpup.sh
    urxvt -bg "orange" -title "Puppy - Универсальный инсталлятор" -geometry 80x20 -e /tmp/installpup.sh $DESTPART $SRCPATH $FINALPMEDIA
    ;;
   ext2|ext3)
    #params passed in: $DESTPART "$SRCPATH" $FINALPMEDIA
    echo '#!/bin/sh
DESTPART="$1"
SRCPATH="$2"
FINALPMEDIA="$3"
DESTFS="$4"
echo "ЗАВЕРШАЮЩАЯ ПРОВЕРКА ГОТОВНОСТИ К РАБОТЕ!"
echo "Вы готовы к установке Puppy на /dev/$DESTPART, с параметром загрузки"
echo "pmedia=$FINALPMEDIA. Файлы vmlinuz, initrd.gz, pup_xxx.sfs, syslinux.cfg"
echo "(и, возможно, zdrv_xxx.sfs, если существует. pup_xxx.fs может находиться"
echo "внутри initrd.gz) будут записаны на /dev/$DESTPART и Extlinux будет"
echo "использован для загрузки."
echo
echo -n "Нажмите клавишу ENTER для продолжения, CTRL-C для выхода: "
read goforit
mount -t $DESTFS /dev/$DESTPART /mnt/data
if [ ! $? -eq 0 ];then #v3.95
 dpPATTERN="^/dev/$DESTPART "
 if [ "`mount | grep "$dpPATTERN"`" = "" ];then
  echo
  echo "ошибка при монтировании /dev/$DESTPART в /mnt/data ...у Вас ничего не"
  echo "смонтировано в /mnt/data? Такого рода проблема бывает при установке на"
  echo "внутренний Flash диск ПК Intel Classmate. Можно попробовать решить её"
  echo "созданием новой $DESTFS файловой системы в $DESTPART (при этом, конечно,"
  echo "все содержимое будет очищено -- что не позволит вернуться назад к старой"
  echo "операционной системе)."
  echo "Нажмите одну только клавишу ENTER для прекращения установки или"
  echo "любую клавишу и затем ENTER для создания новой файловой системы и"
  echo "продолжения процесса установки:"
  read NEWFS
  [ "$NEWFS" = "" ] && exit
  DFPARAM=""
  [ "$DESTFS" = "ext3" ] && DFPARAM="-j"
  echo "y" | mke2fs $DFPARAM -m 0 /dev/$DESTPART
  sync
  mount -t $DESTFS /dev/$DESTPART /mnt/data
  if [ ! $? -eq 0 ];then
   echo -n "К сожалению, всё равно невозможно смонтировать раздел $DESTPART. Press ENTER to quit: "
   echo -n "Нажмите ENTER для выхода: "   
   read NOWQUIT
   exit
  fi
 fi
fi
echo
echo "Вы хотите очистить все файлы на /dev/$DESTPART? Сейчас он смонтирован на"
echo "/mnt/data и прежде чем ответить, можно посмотреть его содержимое. При"
echo "обновлении Puppy необходимо ответить 'НЕТ', и 'ДА' в случае новой"
echo "установки, т.к. это даст Вам возможность избавиться от старых файлов,"
echo "просто занимающих место на диске."
echo "Замечание: Вы можете также вручную удалить файлы на /mnt/data прежде чем"
echo "ответить 'НЕТ'."
echo "Замечание: Если Вы сейчас ответите 'НЕТ', скрипт удалит некоторые файлы"
echo "предыдущей установки Puppy (это не касается pup_save файла!)."
echo
echo "НЕТ - нажмите одну только клавишу ENTER для сохранения файлов или "
echo -n "ДА - сначала любую клавишу, а затем ENTER для удаления всех файлов: "
read WIPEALL
if [ "$WIPEALL" != "" ];then
 echo
 echo "Удаление содержимого /mnt/data..."
 rm -rf /mnt/data/*
else
 #well, minimum to get rid of...
 rm -f /mnt/data/pup_*.sfs #v2.11
 rm -f /mnt/data/devx_*.sfs #v2.11
 rm -f /mnt/data/zdrv_*.sfs #v2.16
fi
sync
echo
echo "Установка загрузчика на $DESTPART..."
if [ ! "`echo "$DESTPART" | grep '[0-9]$'`" = "" ];then
 extlinux -i /mnt/data #i think only use -z for superfloppy.
else
 extlinux -i -z /mnt/data
fi
sync
echo "Копирование vmlinuz..."
cp -f $SRCPATH/vmlinuz /mnt/data/
sync
echo "Создание extlinux.conf..."
FCOPY=""
echo "Записать в extlinux.cfg параметр загрузки 'pfix=copy'?"
echo "Это приведёт к тому, что файл pup_xxx.sfs при старте будет грузиться в"
echo "RAM, при этом время загрузки несколько увеличится, но скорость работы"
echo "приложений возрастёт."
echo "Хороший выбор, если в Вашем ПК 256MB или более RAM."
echo "(можно позже изменить его, отредактировав syslinux.cfg)"
echo "(Замечание: Puppy отменит это и не будет копировать в память при её недостатке)"
echo -n "Нажмите одну только клавишу ENTER для ответа 'НЕТ' или "
echo -n "любую клавишу и затем ENTER для ответа 'ДА': "
read FCOPY
[ "$FCOPY" != "" ] && FCOPY=" pfix=copy"
#v2.20 root=/dev/ram0 removed...
cp /usr/lib/syslinux/files/* /mnt/data/
mv /mnt/data/syslinux.cfg /mnt/data/extlinux.conf
if [ "$FINALPMEDIA" = "ataflash" ];then
 echo "append initrd=initrd.gz ide=nodma pmedia=$FINALPMEDIA$FCOPY nosmp" > /mnt/data/extlinux.conf
else
 echo "append initrd=initrd.gz pmedia=$FINALPMEDIA$FCOPY nosmp" > /mnt/data/extlinux.conf
fi
sync
#note do not create wakepup marker file as it only boots msdsos/vfat.
echo "Копирование initrd.gz..."
cp -f $SRCPATH/initrd.gz /mnt/data/
sync
echo "Копирование .sfs файлов..."
cp -f $SRCPATH/pup_*.sfs /mnt/data/
cp -f $SRCPATH/zdrv_*.sfs /mnt/data/
sync
umount /mnt/data
echo -n "Завершено, нажмите клавишу ENTER для продолжения: "
read moo
' > /tmp/installpup.sh
    chmod 755 /tmp/installpup.sh
    urxvt -bg "orange" -title "Puppy - Универсальный инсталлятор" -geometry 80x20 -e /tmp/installpup.sh $DESTPART $SRCPATH $FINALPMEDIA $DESTFS
    ;;
   *)
    gxmessage "На разделе $DESTPART находится файловая система $DESTFS.
В настоящее время поддерживается установка только vfat (FAT16/32) или ext2/ext3.
Нажмите кнопку OK для выхода..."
    exit
    ;;
  esac
  ;;
 scsihd|atahd|idehd|satahd) #internal media, boot with boot-disk or grub. #v3.98
  #arrive here with DESTPART & DESTFS where installing to, PMEDIA boot param FINALPMEDIA,
  #SRCPATH where to get vmlinuz, initrd, pup_xxx.sfs, PUPVEROLD is old puppy version in
  #format 200 (without dots) =0 if no prior installed puppy,
  #NEWVER is new puppy version, DESTSIZM is size of dest partition in Mb (real number),
  DESTMNTPT="`mount | grep "/dev/$DESTPART" | tr -s " " | cut -f 3 -d " "`"
  #v2.02 ntfs-3g needs this...
  #[ "$DESTMNTPT" = "" ] && DESTMNTPT="`ps -e | grep -o ntfs\-3g.* | grep "/dev/$DESTPART" | sed -e 's/[^a-zA-Z0-9/._\-]/ /g' | tr -s ' ' | tr ' ' "\n" | grep '^/mnt/'`"
  
   [ "$DESTMNTPT" = "" ] && DESTMNTPT="`ps -e | grep -o 'ntfs\-3g.*' | grep "/dev/$DESTPART" | tr '\t' ' ' | tr -s ' ' | tr ' ' "\n" | grep '^/mnt/'`"

  if [ "$DESTMNTPT" = "" ];then
   mkdir /mnt/$DESTPART 2> /dev/null
   mount -t $DESTFS /dev/$DESTPART /mnt/$DESTPART
   DESTMNTPT="/mnt/$DESTPART"
  fi

  #choose option1 or option2 install...
  #option1: files vmlinuz, initrd.gz, pup_xxx.sfs, to dest partition.
  #option2: file vmlinuz to partition, contents of pup_xxx.sfs to partition.
  if [ $PUPVEROLD -eq 0 ];then
   PREVPUPMSG="Похоже, что речь идет о новой установке."
  else
   PREVPUPMSG="Уже установлен Puppy версии $PUPVEROLD и Вы
можете обновить или полностью заменить его."
  fi
  INSTOPTION="1"
  if [ ! "$DESTFS" = "vfat" ];then
  HELPFRUGAL="'СЖАТАЯ' (FRUGAL) установка.

 ПРЕИМУЩЕСТВА:
- Можно установить вместе с другими дистрибутивами на одном разделе.
- Можно установить на разделы с файловыми системами FAT или NTFS (первый
вариант предпочтительнее).
- Лёгкость в обновлении: просто загрузить новый файл .iso и заменить 
указанные выше файлы их новыми версиями (смонтировав .iso для доступа к
файлам). (Замечание: Файлы .iso легко монтируются в Puppy щелчком мыши по ним)
- Можно использовать дополнения в виде специальных .sfs файлов с наборами
пакетов программ.
- Персональные настройки можно сохранять на отдельном разделе с файловой
системой Linux.

Замечание: При СЖАТОЙ установке на раздел FAT или NTFS требуется дополнительное
средство загрузки: \"WakePup2\" с использованием дискеты. В остальных случаях
для загрузки с дискеты, USB или внутреннего жёсткого диска используется GRUB.

Нажмите кнопку \"СЖАТАЯ\" для возврата в основное окно..."
   Xdialog --wmclass "gtkdialog2" --left --buttons-style text --title "Puppy - Универсальный инсталлятор" --ok-label "СЖАТАЯ" --cancel-label "ПОЛНАЯ" --help "$HELPFRUGAL" --yesno "Вы собираетесь установить систему на раздел /dev/$DESTPART,     который размещён
   на внутреннем жёстком диске ($FINALPMEDIA).
$PREVPUPMSG 

Есть два способа установить Puppy на раздел:

1. \"СЖАТАЯ\" (FRUGAL)  УСТАНОВКА (рекомендуется)
Файлы vmlinuz, initrd.gz, pup_$NEWVER.sfs и zdrv_$NEWVER.sfs просто копируются
в раздел, персональные настройки сохраняются внутри файла pup_save (как при
загрузке с CD) и всё предыдущее содержимое раздела остаётся нетронутым.

2. ПОЛНАЯ УСТАНОВКА
\"Обычная\" установка Linux, требующая выделения целого раздела под Puppy.

Нажмите СЖАТАЯ для выполнения установки такого типа (рекомендуется)...
Нажмите ПОЛНАЯ для обычной установки...
Нажмите Help для более подробного описания \"сжатой\" установки...
Нажмите кнопку закрытия окна для выхода..." 0 0
   RET_VAL=$?
   [ $RET_VAL -eq 255 ] && exit
   [ $RET_VAL -eq 1 ] && INSTOPTION="2"
  fi

  #info for creating a grub entry...
  DRV_TYPE="`echo -n "$DESTPART" | cut -b 1-3`" #ex: hda
  GRUB_DRVN=0
  for ONE_TYPE in `fdisk -l | grep "^Disk /dev/" | cut -d' ' -f2 | cut -d':' -f1 | tr '\n' ' '`
  do
   [ "/dev/$DRV_TYPE" = "$ONE_TYPE" ] && break
   GRUB_DRVN=`expr $GRUB_DRVN + 1`
  done
  GRUB_PARTN=`echo -n "$DESTPART" | cut -b 4-5`
  if [ $GRUB_PARTN ];then
   GRUB_PARTN=`expr $GRUB_PARTN - 1`
   GRUB_PARTN=",$GRUB_PARTN"
  fi
   
  #INSTOPTION, install puppy to DESTPART...
  if [ "$INSTOPTION" = "1" ];then #frugal.
   
   Xdialog --stdout --wmclass "gtkdialog2" --left --title "Puppy - Универсальный инсталлятор" --fixed-font --no-cancel --inputbox "Puppy будет установлен в раздел ${DESTPART}, который сейчас смонтирован
в ${DESTMNTPT}. Если это сжатая установка, можно определить каталог для
размещения Puppy. Это очень удобно, если Вы планируете иметь более одной
инсталляции Puppy. И даже если будет всего одна установка, лучше хранить
все файлы Puppy в отдельном каталоге, что исключит потенциальные конфликты
с другими файлами в корне раздела (например: уже существующая полная 
установка Linux могла разместить файл 'initrd.gz' в '/').

Укажите уникальное название каталога. Оно не должно включать символов пробела
и '/'. Также, при загрузке Puppy просматривает только первый уровень каталогов,
так что нельзя указывать путь типа 'puppyfiles/pup${NEWVER}'. Например, это
правильно - 'pup${NEWVER}' (конечно без '). Напечатайте одно слово, состоящее
только из букв и цифр или оставьте поле пустым, если хотите установить систему
в '/'..." 0 0 "puppyRus${NEWVER}" >/tmp/NEWPSUBDIR
   [ $? -ne 0 ] && exit
   NEWPSUBDIR="`cat /tmp/NEWPSUBDIR | sed -e 's%/%%g'`"
   
   yaf-splash -font "8x16" -outline 0 -margin 4 -bg orange -text "Пожалуйста, подождите, идёт копирование файлов на раздел $DESTPART в каталог $NEWPSUBDIR..." &
   XPID=$!
   mkdir -p $DESTMNTPT/$NEWPSUBDIR
   cp -f $SRCPATH/vmlinuz $DESTMNTPT/$NEWPSUBDIR/
   sync
   cp -f $SRCPATH/initrd.gz $DESTMNTPT/$NEWPSUBDIR/
   sync
   cp -f ${SRCPATH}/pup_${NEWVER}*.sfs $DESTMNTPT/$NEWPSUBDIR/
   sync
   [ -f $SRCPATH/zdrv_$NEWVER.sfs ] && cp -f $SRCPATH/zdrv_$NEWVER.sfs $DESTMNTPT/$NEWPSUBDIR/
   sync
   FPCAPS="`echo -n "$FINALPMEDIA" | tr [a-z] [A-Z]`"
   touch $DESTMNTPT/$NEWPSUBDIR/$FPCAPS #needed by WakePup
   sync
   kill $XPID
   umount /dev/$DESTPART
   
   if [ "`echo -n "$DESTFS" | grep -E 'msdos|vfat'`" != "" ];then
   
    Xdialog --wmclass "gtkdialog2" --left --title "Puppy - Универсальный инсталлятор" --ok-label "СОЗДАТЬ ДИСКЕТУ" --cancel-label "НЕ СОЗДАВАТЬ..." --yesno "
Для загрузки Puppy можно использовать дискету.
Небольшая программа WakePup2 создаст специальную загрузочную дискету, которая
будет сканировать ПК и находить, где установлен Puppy.

Замечание, после этой опереции Вы будете проинформированы, как настроить
загрузчик Grub." 0 0
    if [ $? -eq 0 ];then
     /usr/sbin/wakepup2
    fi
    
   fi
   xNEWPSUBDIR=""
   OPTIONPSUBDIR=""
   if [ "$NEWPSUBDIR" != "" ];then
    xNEWPSUBDIR="/$NEWPSUBDIR"
    OPTIONPSUBDIR=" psubdir=${NEWPSUBDIR}"
   fi
   if [ -e /proc/ide ];then #v3.97
    grubEXTRAMSG="...для Вашего удобства данная информация будет записана в /tmp/NEWGRUBTEXT"
   else
    grubEXTRAMSG="...для Вашего удобства данная информация будет записана в /tmp/NEWGRUBTEXT

ПРЕДУПРЕЖДЕНИЕ: Если на Вашем ПК имеются и IDE и SATA жёсткие диски, запись (hd${GRUB_DRVN}${GRUB_PARTN})
может быть неправильной. GRUB нумерует диски как hd<диск>,<раздел>, где отсчёт номеров
<диск> и <раздел> начинается с нуля. Проблема в том, что GRUB всегда выбирает диск IDE
первым (hd0,), даже когда Pmount определяет его вторым (hd1,). Универсальный инсталлятор
использует данные отчёта Pmount, что может быть неправильным для GRUB!
(Например: Если указано, что диск IDE - hd1,0 (при наличии sdb1), необходимо
будет изменить на hd0,0)"
   fi
   echo "title Puppy Linux $NEWVER frugal
rootnoverify (hd${GRUB_DRVN}${GRUB_PARTN})
kernel ${xNEWPSUBDIR}/vmlinuz pmedia=${FINALPMEDIA}${OPTIONPSUBDIR} nosmp
initrd ${xNEWPSUBDIR}/initrd.gz" > /tmp/NEWGRUBTEXT

   Xdialog --wmclass "gtkdialog2" --left --title "Puppy - Универсальный инсталлятор" --msgbox "Теперь Вы можете вручную установить загрузчики Grub, Lilo или иной.

На разделе $DESTPART находятся файлы vmlinuz, initrd.gz и pup_$NEWVER.sfs, где vmlinuz - ядро
системы, initrd.gz - начальный виртуальный диск и pup_$NEWVER.sfs содержит все файлы Puppy.

Если у вас установлен Grub, найдите файл 'menu.lst' (обычно находится в каталоге /boot раздела
с установленным Grub) и вставьте это:

title Puppy Linux $NEWVER frugal
rootnoverify (hd${GRUB_DRVN}${GRUB_PARTN})
kernel ${xNEWPSUBDIR}/vmlinuz pmedia=${FINALPMEDIA}${OPTIONPSUBDIR} nosmp
initrd ${xNEWPSUBDIR}/initrd.gz

${grubEXTRAMSG}" 0 0
   
   #finished. could put up a final dlg here, then quit script.
   Xdialog --wmclass "gtkdialog2" --title "Puppy - Универсальный инсталлятор" --msgbox "Отлично, всё закончено!" 0 0
   exit
  else #h.d. install option2
   #upgrade, ask if want delete partition...
   if [ ! $PUPVEROLD -eq 0 ];then
    Xdialog --wmclass "gtkdialog2" --left --buttons-style text --title "Puppy - Универсальный инсталлятор" --ok-label "ОБНОВИТЬ" --cancel-label "ОЧИСТИТЬ" --yesno "Другая копия Puppy уже установлена на $DESTPART.\nОбновить её или полностью очистить раздел?\n\nПОСЛЕДНЯЯ ПРОВЕРКА: ВЫ УВЕРЕНЫ, ЧТО РАЗДЕЛ $DESTPART ВЫБРАН ПРАВИЛЬНО?\n(замечание, $DESTPART в настоящее время смонтирован в $DESTMNTPT -- правильно?)\n\nНажмите кнопку ОБНОВИТЬ для обновления системы...\nНажмите кнопку ОЧИСТИТЬ для очистки раздела...\nНАжмите кнопку закрпытия окна для выхода..." 0 0
    RET_VAL=$?
    if [ $RET_VAL -eq 255 ];then
     rox -D "$DESTMNTPT"
     sync
     umount $DESTMNTPT 2>/dev/null
     exit
    fi
    if [ $RET_VAL -eq 1 ];then #no
     Xdialog --wmclass "gtkdialog2" --title "Puppy - Универсальный инсталлятор" --no-buttons --infobox "Пожалуйста, ждите, стираются все файлы в $DESTPART..." 0 0 200000 &
     XPID=$!
     sleep 3
     rm -rf $DESTMNTPT/*
     sync
     kill $XPID
    fi
   fi
   Xdialog --wmclass "gtkdialog2" --title "Puppy - Универсальный инсталлятор" --no-buttons --infobox "Пожалуйста, ждите, файлы Puppy копируются в $DESTPART..." 0 0 120000 &
   XPID=$!
   sleep 1
   #loop-device mount pup_xxx.sfs in DESTPART, copy contents of pup_xxx.sfs to DESTPART...
   SFSPATTERN="^pup_${NEWVER}.*\\.sfs" #v3.01
   xSFSNAME="`ls -1 $SRCPATH/ | grep "$SFSPATTERN" | head -n 1`" #v3.01
   #losetup-FULL /dev/loop2 $SRCPATH/pup_$NEWVER.sfs
   losetup-FULL /dev/loop2 $SRCPATH/$xSFSNAME #v3.01
   mkdir $DESTMNTPT/srcmntpt
   mount -r -t squashfs /dev/loop2 $DESTMNTPT/srcmntpt
   cp -a -u --remove-destination $DESTMNTPT/srcmntpt/bin $DESTMNTPT/
   cp -a -u --remove-destination $DESTMNTPT/srcmntpt/dev $DESTMNTPT/
   cp -a -u --remove-destination $DESTMNTPT/srcmntpt/etc $DESTMNTPT/
   cp -a -u --remove-destination $DESTMNTPT/srcmntpt/lib $DESTMNTPT/
   cp -a -u --remove-destination $DESTMNTPT/srcmntpt/mnt $DESTMNTPT/
   cp -a -u --remove-destination $DESTMNTPT/srcmntpt/proc $DESTMNTPT/
   cp -a -u --remove-destination $DESTMNTPT/srcmntpt/root $DESTMNTPT/
   cp -a -u --remove-destination $DESTMNTPT/srcmntpt/sbin $DESTMNTPT/
   cp -a -u --remove-destination $DESTMNTPT/srcmntpt/tmp $DESTMNTPT/
   cp -a -u --remove-destination $DESTMNTPT/srcmntpt/usr $DESTMNTPT/
   cp -a -u --remove-destination $DESTMNTPT/srcmntpt/var $DESTMNTPT/
   [ -d $DESTMNTPT/srcmntpt/opt ] && cp -a -u --remove-destination $DESTMNTPT/srcmntpt/opt $DESTMNTPT/ #v2.11
   #v2.12 external modules file...
   [ -f $SRCPATH/zdrv_$NEWVER.sfs ] && cp -af $SRCPATH/zdrv_$NEWVER.sfs $DESTMNTPT/
   [ -f /zdrv_$NEWVER.sfs ] && cp -af /zdrv_$NEWVER.sfs $DESTMNTPT/
   #v2.12 also copy the 'fetched' kernel modules...
   #no, as a fetched module may also have firmware and that would have to
   #be copied also...
   #cp -a -f /lib/modules/$KERNVER/* $DESTMNTPT/lib/modules/$KERNVER/
   #v2.12 not really necessary, but copy this too...
   #no, as fetched modules are commented-out by modprobe script...
   #[ -f /lib/modules/firmware.dep.$KERNVER ] && cp -a -f /lib/modules/firmware.dep.$NEWVER $DESTMNTPT/lib/modules/firmware.dep.$KERNVER
   #but, do copy this...
   if [ -d /lib/modules/$KERNVER/initrd ];then
    mkdir -p $DESTMNTPT/lib/modules/$KERNVER/initrd
    cp -af /lib/modules/$KERNVER/initrd/* $DESTMNTPT/lib/modules/$KERNVER/initrd/
    depmod -b $DESTMNTPT
   fi
   mkdir $DESTMNTPT/sys 2>/dev/null
   rm -f $DESTMNTPT/var/log/modprobes.log 2>/dev/null #v2.13 see /sbin/modprobe script.
   #...not necessary, not using this any more.
   #v3.96 /etc/rc.d/PUPSTATE only has 'PUPMODE=2', add this...
   if [ -e /proc/ide ];then
    echo "SATADRIVES='$SATADRIVES'" >> $DESTMNTPT/etc/rc.d/PUPSTATE
   else
    echo '#NEWS: IDE hd* drives are now also sd*. ATADRIVES is both ide and sata...' >> $DESTMNTPT/etc/rc.d/PUPSTATE
    echo "ATADRIVES='$ATADRIVES'" >> $DESTMNTPT/etc/rc.d/PUPSTATE
   fi
   sync
   kill $XPID
   #fix space optimisation links into initrd...
    #TODO
   #chroot to DESTPART, set /etc/puppyversion back to PUPVEROLD, run rc.update
   Xdialog --wmclass "gtkdialog2" --title "Puppy - Универсальный инсталлятор" --no-buttons --infobox "Пожалуйста, ждите, запускается скрипт rc.update..." 0 0 60000 &
   XPID=$!
   sleep 2
   echo -n "$PUPVEROLD" > $DESTMNTPT/etc/puppyversion #set it back to what it was.
   
   #chroot $DESTMNTPT -c /etc/rc.d/rc.update option2hdinstall
   #busybox chroot does not have -c ...
   chroot $DESTMNTPT /etc/rc.d/rc.update option2hdinstall
   #(need to tell rc.update where src files are, as passed param)
   sync
    mv -f $DESTMNTPT/etc/fstab $DESTMNTPT/etc/fstab.bak
    echo "/dev/$DESTPART     /            $DESTFS     defaults               0 1" > $DESTMNTPT/etc/fstab
    echo "none          /proc        proc     defaults               0 0" >> $DESTMNTPT/etc/fstab
    echo "none          /sys         sysfs    defaults               0 0" >> $DESTMNTPT/etc/fstab
    echo "none          /dev/pts     devpts   gid=2,mode=620         0 0" >> $DESTMNTPT/etc/fstab
    echo "/dev/fd0      /mnt/floppy  auto     noauto,rw              0 0" >> $DESTMNTPT/etc/fstab
    #echo "/dev/cdrom    /mnt/cdrom   iso9660  noauto,ro              0 0" >> $DESTMNTPT/etc/fstab
    sync
   kill $XPID
   umount $DESTMNTPT/srcmntpt
   rmdir $DESTMNTPT/srcmntpt
  fi

  #make bootable...
  #usb/floppy boot disk, or grub.
  while [ "$INSTOPTION" = "2" ];do
#TODO needs work, as could have usb hd, that cannot unplug and do not want it to be turned
#     into a boot disk!...
   Xdialog --wmclass "gtkdialog2" --left --buttons-style text --title "Puppy - Универсальный инсталлятор" --ok-label "Загружать с USB" --cancel-label "Установить/обновить GRUB" --yesno "Всё хорошо, Puppy установлен в $DESTPART.\n\
Теперь необходимо определиться, как Puppy будет загружаться.\n\
Вы можете выбрать  либо один из следующих вариантов, либо оба:\n\
\n\
Загрузочный диск: Использовать дискету или диск USB для загрузки Puppy.\n\
GRUB:      Установить GRUB на жёсткий диск (или обновить уже установленный).\n\
\n\
Нажмите 'Загружать с USB', если Вы хотите использовать  USB Flash диск в\n\
качестве 'загрузочного'. Универсальный инсталлятор вернётся к этому диалогу\n\
после создания 'загрузочного' USB диска.\n\
Замечание: этот способ удобен, если на Вашем ПК нет флоппи-дисковода и Вы\n\
не хотите устанавливать GRUB на жёсткий диск.\n\
\n\
Нажмите 'Установить/обновить GRUB' для установки (обновления) загрузчика GRUB.\n\
Вам будет дана возможность создать 'загрузочную' дискету или\n\
установить GRUB на жёсткий диск.\n\
\n\
ДЛЯ СОЗДАНИЯ ЗАГРУЗОЧНОГО USB ДИСКА ПОДКЛЮЧИТЕ ЕГО ПРЕДВАРИТЕЛЬНО!\n\
 (должен имет файловую систему FAT16 и все файлы на нём будут удалены)\n\
 ОН ДОЛЖЕН БЫТЬ НЕ СМОНТИРОВАН -- УБЕДИТЕСЬ ПЕРЕД НАЧАЛОМ ПРОЦЕССА" 0 0
   if [ $? -eq 0 ];then #BOOT DISK
    BOOTPART=""
    #v3.96...
    USBDRIVES="`echo "$PROBEDISK" | grep '|usbdrv|' | cut -f 3 -d '/' | cut -f 1 -d '|' | tr "\n" " "`"
    for ONEUSB in $USBDRIVES
    do
     [ "$ATADRIVES" != "" ] && [ "`echo "$ATADRIVES" | grep "$ONEUSB"`" != "" ] && continue #eliminate ide/sata drives. v3.97
     [ "$SATADRIVES" != "" ] && [ "`echo "$SATADRIVES" | grep "$ONEUSB"`" != "" ] && continue #eliminate sata drives, old kernel v3.97
     if [ "`disktype /dev/$ONEUSB | grep "file system" | grep "^FAT"`" != "" ];then
      BOOTPART="$ONEUSB"
      break
     fi
     if [ "`disktype /dev/${ONEUSB}1 | grep "file system" | grep "^FAT"`" != "" ];then
      BOOTPART="${ONEUSB}1"
      break
     fi
    done
    if [ ! "$BOOTPART" = "" ];then
     Xdialog --wmclass "gtkdialog2" --left --title "Puppy - Универсальный инсталлятор" --yesno "Подтвердите, пожалуйста, что Вы хотите создать '$BOOTPART' на диске Puppy.\nЕсли Puppy определил устройство неправильно, ответьте 'No' сейчас...\n\nНажмите кнопку 'Yes', если всё правильно..." 0 0
     [ ! $? -eq 0 ] && continue
    fi
    if [ ! "$BOOTPART" = "" ];then
     cp -af $SRCPATH/vmlinuz /mnt/$DESTPART/
     sync
     Xdialog --wmclass "gtkdialog2" --title "Puppy - Универсальный инсталлятор" --msgbox "Создание загрузочного диска $BOOTPART..." 0 0 &
     XPID=$!
     #passed params $BOOTPART $DESTPART $SRCPATH $FINALPMEDIA
     echo '#!/bin/sh
     BOOTPART="$1"
     DESTPART="$2"
     SRCPATH="$3"
     FINALPMEDIA="$4"
      mkdir /tmp/bootdiskmntpt 2> /dev/null
      mount -t msdos /dev/$BOOTPART /tmp/bootdiskmntpt
      rm -rf /tmp/bootdiskmntpt/*
      echo "Создание syslinux.cfg на /dev/$BOOTPART..."
      cp /usr/lib/syslinux/files/* /tmp/bootdiskmntpt/
      echo "append root=/dev/$DESTPART pmedia=$FINALPMEDIA nosmp" >> /tmp/bootdiskmntpt/syslinux.cfg
      echo "Запись ядра Linux vmlinuz в /dev/$BOOTPART..."
      cp -f $SRCPATH/vmlinuz /tmp/bootdiskmntpt/
      sync
      umount /dev/$BOOTPART
      rmdir /tmp/bootdiskmntpt
      echo "Установка загрузчика Syslinux на /dev/$BOOTPART ..."
      syslinux /dev/$BOOTPART
     sync
     echo -n "Выполнено. Нажмите клавишу ENTER: "
     read allisdone
' > /tmp/installpup.sh
     chmod 755 /tmp/installpup.sh
     urxvt -bg "orange" -title "Puppy - Универсальный инсталлятор" -geometry 80x20 -e /tmp/installpup.sh $BOOTPART $DESTPART $SRCPATH $FINALPMEDIA

     kill $XPID
    fi
   else #Grub
    mkdir -p /mnt/$DESTPART/boot/grub
    cp -af $SRCPATH/vmlinuz /mnt/$DESTPART/boot/
    sync
    umount /mnt/$DESTPART
    unmountcdfunc
    if [ -e /proc/ide ];then #v3.97
     grubEXTRAMSG=""
    else
     grubEXTRAMSG="
ПРЕДУПРЕЖДЕНИЕ: Если на Вашем ПК имеются и IDE и SATA жёсткие диски,
GRUB может их неправильно пронумеровать. Вы должны быть готовы
вручную отредактировать файл /boot/grub/menu.lst на разделе с 
установленным GRUB. Эта проблема возникла в результате того, что
последние версии ядер Linux стали именовать IDE диски как /dev/sd* -
той же буквой, что и SATA, хотя ранее было /dev/hd*.
GRUB использует \"hd\" нотацию и для IDE и для SATA дисков и нумерует
их как hd<диск>,<раздел>, где отсчёт номеров <диск> и <раздел>
начинается с нуля (опять отличие, в Linux номера разделов начинаются с 1).
 Проблема в том, что GRUB всегда выбирает диск IDE первым (hd0,), 
даже когда Pmount определяет его вторым (hd1,). Универсальный
инсталлятор использует данные отчёта Pmount, что может быть
неправильным для GRUB!
(Например: Если указано, что диск IDE - hd1,0 (при наличии sdb1),
необходимо будет изменить на hd0,0)"
    fi
    Xdialog --buttons-style "text" --wmclass "gtkdialog2" --left --title "Puppy - Универсальный инсталлятор" --ok-label "ОБНОВИТЬ" --cancel-label "УСТАНОВИТЬ" --yesno "Нажмите кнопку ОБНОВИТЬ, если необходимо обновить существующую
установку GRUB или кнопку УСТАНОВИТЬ для установки или
переустановки его...
${grubEXTRAMSG}" 0 0
    if [ $? -eq 0 ];then #v3.96 update grub.
     echo "title Puppy Linux $NEWVER full install
root (hd${GRUB_DRVN}${GRUB_PARTN})
kernel /boot/vmlinuz root=/dev/$DESTPART pmedia=${FINALPMEDIA} nosmp" > /tmp/NEWGRUBTEXT
     if [ -e /proc/ide ];then #v3.97
      grubEXTRAMSG="...для Вашего удобства данная информация будет записана в /tmp/NEWGRUBTEXT"
     else
      grubEXTRAMSG="...для Вашего удобства данная информация будет записана в /tmp/NEWGRUBTEXT

ПРЕДУПРЕЖДЕНИЕ: Если на Вашем ПК имеются и IDE и SATA жёсткие диски, запись (hd${GRUB_DRVN}${GRUB_PARTN})
может быть неправильной. GRUB нумерует диски как hd<диск>,<раздел>, где отсчёт номеров
<диск> и <раздел> начинается с нуля. Проблема в том, что GRUB всегда выбирает диск IDE
первым (hd0,), даже когда Pmount определяет его вторым (hd1,). Универсальный инсталлятор
использует данные отчёта Pmount, что может быть неправильным для GRUB!
(Например: Если указано, что диск IDE - hd1,0 (при наличии sdb1), необходимо будет
изменить на hd0,0)"
     fi

     Xdialog --wmclass "gtkdialog2" --left --title "Puppy - Универсальный инсталлятор" --msgbox "Вы выбрали обновление существующей установки GRUB.
Требуется завершающая ручная правка...
Найдите файл \"menu.lst\" (обычно в /boot/grub раздела, 
на котором установлен GRUB) и вставьте следующее:

title Puppy Linux $NEWVER full install in $DESTPART
root (hd${GRUB_DRVN}${GRUB_PARTN})
kernel /boot/vmlinuz root=/dev/$DESTPART pmedia=${FINALPMEDIA} nosmp

$grubEXTRAMSG

После нажатия кнопки 'OK' Универсальный инсталлятор завершит работу." 0 0
     exit
    else
     Xdialog --wmclass "gtkdialog2" --left --title "Puppy - Универсальный инсталлятор" --msgbox "Сейчас будет запущен скрипт \"grubconfig\".\nВыбирайте установки по умолчанию. Вас спросят о способе установки\n- выберите простую и подтвердите все установки, отмеченные по\nумолчанию. Единственно, рекомендуется указать место установки Grub - \"MBR\"." 0 0
     while [ 1 ];do
      grubconfig /dev/$DESTPART
      #...if choose to create a boot floppy, writes 'no' to /tmp/loopbrk.txt.
      Xdialog --wmclass "gtkdialog2" --title "Puppy - Универсальный инсталлятор" --yesno "Если Вы уже запускали grubconfig для создания загрузочной дискеты или установки GRUB\n\
на жёсткий диск, нажмите кнопку 'Yes' для повторного запуска скрипта для\n\
создания другой дискеты или установки (переустановки) на жёсткий диск.\n\
Выбрав 'Yes', согласитесь со всеми установками по умолчанию, как и раньше.\n\
\n\
Нажмите  'Yes' для возврата в grubconfig...\n\
Нажмите 'No' для завершения установки..." 0 0
      [ ! $? -eq 0 ] && break
     done
     rm -f /tmp/loopbrk.txt
     exit
    fi
   fi
   Xdialog --wmclass "gtkdialog2" --title "Puppy - Универсальный инсталлятор" --yesno "Хотите вернуться и создать другой загрузочный диск или загрузчик Grub?..." 0 0
   [ ! $? -eq 0 ] && break
  done
  umount /mnt/$DESTPART 2> /dev/null
  ;;
 atacd|scsicd|usbcd)
  gxmessage "пока ещё не реализован"
  #TO DO
  ;;
esac

unmountcdfunc

###END###
