#Barry Kauler 2007 www.puppylinux.com
#2007 Lesser GPL licence v2 (http://www.fsf.org/licensing/licenses/lgpl.html)
#created for v3.01, oct 2007.
#Translated for Russian by Valerij Kruvjalis (vkvkvk).

DEVCONSOLE="/dev/console" #when X not running
PSINFO="`ps`"
[ "`echo "$PSINFO" | grep ' X :0'`" != "" ] && DEVCONSOLE="/dev/tty" #running in rxvt.

#waittrayclosedfunc is used by /etc/rc.d/rc.shutdown and /usr/sbin/savesession-dvd.
#v2.16...
waittrayclosed_func() {
 CDDRV="$1"
 #while [ "`dvd+rw-mediainfo $CDDRV 2>&1 | grep 'no media mounted'`" != "" ];do
 # clear
 # echo -e "\\033[1;31mThe media tray appears to be open, or media not inserted." >$DEVCONSOLE #31=red
 # echo -en "Please insert media and/or close tray then press ENTER key:\\033[0;39m " >$DEVCONSOLE
 # read waitaenter
 #done
 if [ "`cddetect -d${CDDRV} | grep '^tray open!'`" != "" ];then #v2.22
  echo -e "\\033[1;31mЛоток привода открыт." >$DEVCONSOLE #31=red
  echo -en "Закройте, пожалуйста, лоток и нажмите клавишу ENTER:\\033[0;39m " >$DEVCONSOLE
  read waitaenter
 fi
 echo -e "\\033[1;34mЕСЛИ ВЫ ВИДИТЕ ЭТО СООБЩЕНИЕ ДЛИТЕЛЬНОЕ ВРЕМЯ, УБЕДИТЕСЬ, ЧТО ЛОТОК ЗАКРЫТ
 И НАЖМИТЕ КЛАВИШУ ENTER:\\033[0;39m " >$DEVCONSOLE #34=blue
}


#multisavefunc is used by /etc/rc.d/rc.shutdown and /usr/sbin/savesession-dvd.
#these variables must be preset before calling...
#PUPSAVE=partition,filesystem,/pup_save.2fs where 1st 2 are the partition holding the file.
#SAVEPART=filesystem which is same as above filesystem.
#PUPPYVERSION=version example: 301.
multisavefunc() {
 #save session to folder on multisession CD/DVD.
 touch -c /.badfolders #update modifytime, so will get saved. badlist, see init script.
 MSPATTERN="/dev/$SAVEPART " #v2.22
 if [ "`mount | grep "$MSPATTERN"`" != "" ];then
  echo "/dev/$SAVEPART смонтирован, необходимо его размонтировать..."
  fuser -k -m /dev/$SAVEPART
  sync
  umount /dev/$SAVEPART 2> /dev/null
 fi
 CDR="/dev/$SAVEPART"

 if [ "`mount | grep "$CDR"`" != "" ];then #v3.01
  dialog --msgbox "Привод $CDR нельзя размонтировать,
поэтому текущая сессия не может быть сохранена на него.
Возможно из за того, что ПК имеет недостаточно оперативной
памяти для копирования файлов с CD или какая-то программа
использует его и не может быть завершена.

Нажмите клавишу ENTER..." 0 0 >$DEVCONSOLE
  clear >$DEVCONSOLE
  return
 fi
  
 #v3.01 have restored this... 
 HDRCDR="ATAPI:$CDR" #v2.16
 [ "`echo -n "$CDR" | grep '/dev/hd'`" = "" ] && HDRCDR="$CDR" #v2.16
 #...no, sata cd (/dev/scd0) is still an atapi device? so don't implement this.
  
 dialog --yes-label "СОХРАНИТЬ" --no-label "НЕ СОХРАНЯТЬ" --yesno "Вставьте, пожалуйста, диск Puppy live-CD/DVD, с которого Вы загружались, в привод CD/DVD, использовавшийся для загрузки -- это /dev/$SAVEPART  и этот привод должен быть способен записывать диски!

Вставьте диск CD/DVD, затем нажмите клавишу ENTER для сохранения сессии...
Или нажмите клавишу TAB и затем ENTER для выхода без сохранения..." 0 0 >$DEVCONSOLE
 if [ ! $? -eq 0 ];then
  eject $CDR
  dialog --msgbox "Ваша сессия не сохранена на live-CD/DVD.
Если хотите, можете удалить диск CD/DVD.
Не нажимайте кнопку закрытия лотка на приводе.
Нажмите клавишу ENTER, чтобы закрыть лоток привода" 0 0 >$DEVCONSOLE
  eject -t $CDR
  sleep 1
  clear >$DEVCONSOLE
  waittrayclosed_func $CDR #v2.16
  return
 fi
 
 clear >$DEVCONSOLE
 if [ "`cddetect -d${CDR} | grep '^no disc!'`" != "" ];then #v2.22
  echo -e "\\033[1;31mПохоже, компакт-диск отсутствует." >$DEVCONSOLE #31=red
  echo -en "Вставьте, пожалуйста, диск и нажмите клавишу ENTER:\\033[0;39m " >$DEVCONSOLE
  read waitaenter
 fi
 
 MEDIATYPE="CD"
 waittrayclosed_func $CDR #v2.16
 DVDRWMEDIAINFO="`dvd+rw-mediainfo $CDR 2>&1`"
 [ "`echo -n "$DVDRWMEDIAINFO" | grep --extended-regexp "non\\-DVD|not a DVD unit|Input/Output error|Input/output error|Invalid argument"`" = "" ] && MEDIATYPE="DVD"

 #if new version iso inserted, need to save all files, not just changed/new...
 MSPATTERN="$CDR "
 DVDMNTPT="`mount | grep "$MSPATTERN" | tr -s " " | cut -f 3 -d " "`" #in case not unmounted.
 if [ "$DVDMNTPT" = "" ];then
  mkdir -p /tmp/dvdmntpt
  mount -t iso9660 $CDR /tmp/dvdmntpt
  [ $? -eq 0 ] && DVDMNTPT="/tmp/dvdmntpt"
 fi
 if [ "$DVDMNTPT" != "" ];then
  if [ $ORIGPUPMODE -eq 77 ];then #bypass first boot, PUPMODE=5. v2.22
   [ "`find $DVDMNTPT -maxdepth 1 -type d -name 20[0-9][0-9]*`" = "" ] && NEWISO="yes"
  fi
  umount $CDR 2>/dev/null
 fi

 #want to copy contents of /initrd/pup_rw to a new folder on /dev/$SAVEPART...
 MYDATE="`date "+%Y-%m-%d-%H-%M"`" #this will become the folder name on cd.

 SAVEABORT="" #v3.01
 while [ 1 ];do #WHILELOOP1

  #if have new live-cd, need a 'full save', not just what is in pup_rw. Maybe easiest
  #way is to save two tracks, pup_ro1, which has all prior saved folders read from cd
  #at bootup, then save latest session, pup_rw...
  if [ "$NEWISO" = "yes" ];then
   echo "Запись данных с предшествующего $MEDIATYPE на первую дорожку..." >$DEVCONSOLE
   #use last folder name from previous cd, to avoid name conflict with next folder...
   FOLDEROLD="`echo -n "$PUPSAVE" | cut -f 2 -d '/'`"
   #minimal error checking here, errors reported when save current session (below)...
   if [ "$MEDIATYPE" = "CD" ];then
    waittrayclosed_func $CDR #v2.16 v3.01 now HDRCDR...
    SECT=`cdrecord -msinfo dev=${HDRCDR} 2>/tmp/cdrerr.txt | grep '^[0-9]*.[0-9]'` #v3.01
    if [ "$SECT" = "" ];then
     SAVEABORT="$CDR" #v3.01
     break
    else
     waittrayclosed_func $CDR #v2.16
     #v2.02 added -pad ...  v3.01 now HDRCDR...
     #v2.16 removed -pad from cdrecord as mkisofs has -pad by default... no, leave for now...
     mkisofs -D -R -C $SECT -M $CDR -quiet -new-dir-mode 0755 -graft-points ${FOLDEROLD}=/initrd/pup_ro1 | cdrecord -multi -data -tao -pad -eject -v speed=4 gracetime=2 dev=${HDRCDR} -
    fi
   else #dvd
    waittrayclosed_func $CDR #v2.16
    #v2.16 removed '-speed=4' as got 'failed to change write speed' error on one drive...
    growisofs -M $CDR -D -R -quiet -new-dir-mode 0755 -graft-points ${FOLDEROLD}=/initrd/pup_ro1 2> /tmp/dvderr.txt
   fi
  fi
  #v2.22 NEWISO=""

  #normal session save of new/changed files...
  #exclude .sfs files... v3.97 no, allow to save...
  REMSFS=""
  #for ONESFS in `ls -1 /initrd/pup_rw/*.sfs 2>/dev/null | tr "\n" " "`
  #do
  # REMSFS="$REMSFS -x $ONESFS"
  #done
  
  #tack on this exclude as well... (samba network drives mount here)
  [ -d /initrd/pup_rw/root/mnt ] && REMSFS="$REMSFS -x /initrd/pup_rw/root/mnt"
  #if a new iso, do not want to save /.badfolders file...
  if [ "$NEWISO" = "yes" ];then
   [ -f /initrd/pup_rw/.badfolders ] && REMSFS="$REMSFS -x /initrd/pup_rw/.badfolders"
  fi
  #v2.02 removed, messes up some pkgs...
  ##move some files to /archive, they will not get reloaded...
  #MAXASIZE="99000k"
  #ARCHIVEFILES="`find /initrd/pup_rw -type f -mount -name "*.tar*" -or -name "*.tgz" -or -name "*.gz" -or -name "*.bz2" -or -name "*.tbz2" -or -name "*.zip" -or -size +$MAXASIZE | grep -v "/root/\.etc/" | grep -v "/root/\.usr/" | grep -v "/root/my\-roxapps/" | grep -v '\.sfs' | sed -e 's/\/initrd\/pup_rw//g'`"
  #if [ ! "$ARCHIVEFILES" = "" ];then
  # for ONEFILE in $ARCHIVEFILES
  # do
  #  echo "Moving $ONEFILE to $MYDATE/archive on CD, will not reload..."
  #  mv -f $ONEFILE /archive/ 2>/dev/null
  # done
  # sync
  #fi

  if [ "$MEDIATYPE" = "CD" ];then
   waittrayclosed_func $CDR #v2.16 v3.01 now HDRCDR...
   SECT=`cdrecord -msinfo dev=${HDRCDR} 2>/tmp/cdrerr.txt | grep '^[0-9]*.[0-9]'`
   if [ "$SECT" = "" ];then
    SAVEABORT="$CDR" #v3.01
    break #v3.01
   else
     waittrayclosed_func $CDR #v2.16
    TSIZE="`mkisofs -print-size -D -R -C $SECT -M $CDR -quiet -new-dir-mode 0755 -graft-points -x /initrd/pup_rw/tmp $REMSFS -x /initrd/pup_rw/proc -x /initrd/pup_rw/sys -x /initrd/pup_rw/var -x /initrd/pup_rw/initrd -x /initrd/pup_rw/mnt ${MYDATE}=/initrd/pup_rw`"
    #-J Joliet extension disabled, sometimes causes failure...
    #v2.02 added -pad ...
    waittrayclosed_func $CDR #v2.16 v3.01 now HDRCDR...
    #v2.16 removed -pad from cdrecord as mkisofs has -pad by default... no, leave for now...
    mkisofs -D -R -C $SECT -M $CDR -quiet -new-dir-mode 0755 -graft-points -x /initrd/pup_rw/tmp $REMSFS -x /initrd/pup_rw/proc -x /initrd/pup_rw/sys -x /initrd/pup_rw/var -x /initrd/pup_rw/initrd -x /initrd/pup_rw/mnt ${MYDATE}=/initrd/pup_rw | cdrecord -multi -data -tao -pad -eject -v speed=4 gracetime=2 tsize=${TSIZE}s dev=${HDRCDR} -
    [ $? -eq 0 ] && break
   fi
   echo "Невозможна запись на CD" > /tmp/dvderr.txt
  else #dvd
    waittrayclosed_func $CDR #v2.16
    #-J Joliet extension disabled, sometimes causes failure...
    #v2.16 removed '-speed=4' as got 'failed to change write speed' error on one drive...
    growisofs -M $CDR -D -R -quiet -new-dir-mode 0755 -graft-points -x /initrd/pup_rw/tmp $REMSFS -x /initrd/pup_rw/proc -x /initrd/pup_rw/sys -x /initrd/pup_rw/var -x /initrd/pup_rw/initrd -x /initrd/pup_rw/mnt ${MYDATE}=/initrd/pup_rw 2> /tmp/dvderr.txt
    [ $? -eq 0 ] && break
  fi
  dialog --yes-label "ЧИСТЫЙ ДИСК ${MEDIATYPE}-R" --no-label "ОБНОВИТЬ ${MEDIATYPE}-R" --yesno "ERROR MESSAGE:
`cat /tmp/dvderr.txt | head -n 1`

Кажется, пришло время перейти на новый live-${MEDIATYPE}.
Вы можете использовать новый чистый диск ${MEDIATYPE}-R или
обновить версию Puppy ISO файла, записав его предварительно
в режиме мультисессии на ${MEDIATYPE}-R.

ПРЕДУПРЕЖДЕНИЕ:
Если выключить ПК без обновления, при следующем включении
запустите его опять с текущего live-$MEDIATYPE и выключите
ещё раз.

Приготовьте новый компакт-диск, но не вставляйте его пока.
Просто выберите соответствующую кнопку..." 0 0 >$DEVCONSOLE
  if [ $? -eq 0 ];then #new blank cd/dvd.
   DVDMNTPT="`mount | grep "$CDR" | tr -s " " | cut -f 3 -d " "`" #in case not unmounted.
   if [ "$DVDMNTPT" = "" ];then
    mkdir /tmp/dvdmntpt
    mount -t iso9660 $CDR /tmp/dvdmntpt
    [ ! $? -eq 0 ] && break
    DVDMNTPT="/tmp/dvdmntpt"
   fi
   #get vmlinuz etc off current dvd...
   echo "Копирование файлов с $CDR..." >$DEVCONSOLE
   mkdir /tmp/livecd
   cp $DVDMNTPT/isolinux.bin /tmp/livecd/
   cp $DVDMNTPT/isolinux.cfg /tmp/livecd/
   cp $DVDMNTPT/vmlinuz /tmp/livecd/
   cp $DVDMNTPT/initrd.gz /tmp/livecd/
   cp $DVDMNTPT/boot.msg /tmp/livecd/ 2> /dev/null
   cp $DVDMNTPT/goofy.16 /tmp/livecd/ 2> /dev/null
   cp $DVDMNTPT/zdrv_${PUPPYVERSION}.sfs /tmp/livecd/ 2> /dev/null #v2.22
   sync
   umount $CDR
   [ ! $? -eq 0 ] && break
   eject $CDR
   dialog --msgbox "Выньте старый диск из привода и запишите на нём дату окончания
   использования.
ПРИМЕЧАНИЕ: Не нажимайте кнопку закрывания лотка на приводе $MEDIATYPE.
Вставьте, пожалуйста, новый диск и нажмите клавишу ENTER..." 0 0 >$DEVCONSOLE
   eject -t $CDR
   
   ##echo "/$PUPSFS" > /tmp/dvdextras.txt
   #echo "/initrd/mnt/tmpfs/pup_${PUPPYVERSION}.sfs" > /tmp/dvdextras.txt #v2.22
   echo -n "/initrd/mnt/tmpfs/" > /tmp/dvdextras.txt #v3.01
   ls -1 /initrd/mnt/tmpfs | grep 'pup_' >> /tmp/dvdextras.txt #v3.01
   
   waittrayclosed_func $CDR #v2.16
   if [ "$MEDIATYPE" = "DVD" ];then
    #v2.16 removed '-speed=4' as got 'failed to change write speed' error on one drive...
    growisofs -Z $CDR -R -D -quiet -b isolinux.bin -c boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -path-list /tmp/dvdextras.txt /tmp/livecd
    [ ! $? -eq 0 ] && break
   else
    #v2.02 added -pad ...
    #v2.16 removed -pad from cdrecord as mkisofs has -pad by default... no, leave for now...
    mkisofs -D -R -quiet -b isolinux.bin -c boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -path-list /tmp/dvdextras.txt /tmp/livecd | cdrecord -multi -tao -pad -data -v speed=4 gracetime=2 dev=$HDRCDR  -
    [ ! $? -eq 0 ] && break
   fi
  fi
  #have new live-cd, and loops back up to save session, but need a 'full save', not just
  #what is in pup_rw. Maybe easiest way is to save two tracks, pup_ro1, which has all prior
  #saved folders read from cd at bootup, then save latest session, pup_rw...
  NEWISO="yes" #loop back up.
 done #end WHILELOOP1

 sync
 [ "`mount | grep "$CDR"`" != "" ] && STILLMNTD="yes" #v3.01
 if [ "$STILLMNTD" = "yes" ];then
  CLOSEMSG="Нажмите клавишу ENTER для окончательного выключения..."
 else
  CLOSEMSG="Удалите диск $MEDIATYPE, если желаете.
Не нажимайте кнопку закрывания на приводе.
Нажмите клавишу ENTER для закрывания лотка привода
(на ноутбуке это придется сделать вручную)"
  eject $CDR
 fi
 if [ "$SAVEABORT" = "" ];then #v3.01
  dialog --msgbox "Вы сохранили сессию на live-$MEDIATYPE

${CLOSEMSG}" 0 0 >$DEVCONSOLE
 else
  dialog --msgbox "Возникла проблема с приводом ${MEDIATYPE} ${SAVEABORT},
сессию сохранить невозможно. Извините.

${CLOSEMSG}" 0 0 >$DEVCONSOLE
 fi
 [ "$STILLMNTD" != "yes" ] && eject -t $CDR #close tray.
 sleep 1
 #waittrayclosed_func $CDR #v2.16
} #end multisavefunc


###END###
