#!/bin/sh
#simple script to remaster the puppy2 live-cd.
#(c) Copyright 2006 Barry Kauler, www.puppyos.com
#2007 Lesser GPL licence v2 (http://www.fsf.org/licensing/licenses/lgpl.html)
#BK 9 oct 2007: updated for puppy v3.01.
#RE 9 apr 2008: v3.99 copy active post-install scripts
#v4.02 /lib/modules/firmware.dep.<kern>,DOTconfig-K<kern> moved to /etc/modules. ...um no mods this script.
#v411 update what gets copied from /root and /etc.
#Translated for Russian by Valerij Kruvjalis (vkvkvk).

#variables created at bootup by /initrd/usr/sbin/init...
. /etc/rc.d/PUPSTATE
[ "$PUP_LAYER" = "" ] && PUP_LAYER="/pup_ro2"
PUPPYVERSION="`cat /etc/puppyversion`"

PPATTERN="/initrd${PUP_LAYER}"
if [ "`mount | grep "$PPATTERN"`" = "" ];then
 #no pup_xxx.sfs file mounted on pup_ro2, probably h.d. install...
 Xdialog --wrap --left --title "Создание собственного Puppy liveCD: ОШИБКА" --msgbox "Для работы программы необходим файл pup_$PUPPYVERSION.sfs, смонтированный в /initrd${PUP_LAYER}.
Вероятно, Вы используете вариант полной установки Puppy на жесткий диск и 
данного файла там нет. В любом случае, загрузите Puppy с liveCD и Вы сможете 
использовать этот скрипт.

Замечание, не проверено, но если Вы смонтируете файл pup_$PUPPYVERSION.sfs в 
каталог /initrd${PUP_LAYER}, этого будет достаточно для работы программы.
Кроме того, Вам понадобится рабочий liveCD, т.к. программа использует файлы 
с него.
Кто хочет попробовать?

Нажмите кнопку 'Ok' для выхода..." 0 0
 exit
fi

SAVEPART="$PDEV1" #from PUPSTATE.
CDR="/dev/$SAVEPART"

#choose where to create isolinux-builds/ directory...
Xdialog --wrap --left --title "Создание собственного Puppy liveCD" --msgbox "Добро пожаловать! Эта маленькая программа сделает копию Вашей текущей системы и запишет её на CD.

Puppy liveCD содержит 4 главных файла : vmlinuz, isolinux.cfg, initrd.gz и pup_$PUPPYVERSION.sfs, где $PUPPYVERSION - номер текущей версии дистрибутива (без точки). Замечание: Некоторые сборки Puppy могут иметь ещё и 5-й файл - zdrv_$PUPPYVERSION.sfs.

Файл pup_$PUPPYVERSION.sfs нас интересует сейчас больше всего: он содержит всю файловую систему Puppy, всё - от корня ('/') и ниже. Так вот, данный скрипт пересобирает файл pup_$PUPPYVERSION.sfs, включая в него всё, что настроено и установлено в системе в данное время -- все установленные пользователем пакеты (DotPups, PETs и пакеты Slackware), все файлы с расширением SFS, смонтированные в системе, всё это компанует в один файл, pup_$PUPPYVERSION.sfs и записывает на CD.
Примечание, будьте внимательны, файл pup_$PUPPYVERSION.sfs может получиться достаточно большим и вы увидите сообщение об ошибке 'underdog Linux'!

Нажмите кнопку OK для продолжения (или закройте окно для выхода)..." 0 0

[ ! $? -eq 0 ] && exit

#calc size needed...
Xdialog --wrap --title "Создание собственного Puppy liveCD" --msgbox "Подсчёт требуемого для работы свободного места.\nПожалуйста, подождите, это займёт некоторое время..." 0 0 &
XPID=$!
SIZEOPT=0
SIZEBIN=`du -sk /bin | cut -f 1`
SIZESBIN=`du -sk /sbin | cut -f 1`
SIZELIB=`du -sk /lib | cut -f 1`
SIZEUSR=`du -sk /usr | cut -f 1`
[ -d /opt ] && SIZEOPT=`du -sk /opt | cut -f 1`
sync
kill $XPID
#SIZETOTALK=`expr $SIZEBIN + $SIZESBIN + $SIZELIB + $SIZEUSR + $SIZEOPT`
SIZETOTALK=`dc $SIZEBIN $SIZESBIN + $SIZELIB + $SIZEUSR + $SIZEOPT + p`
SIZETOTALM=`expr $SIZETOTALK \/ 1024`
echo "SIZETOTALM=$SIZETOTALM"
#estimate a compressed size...
SIZENEEDEDM=`expr $SIZETOTALM \/ 3`
SIZESLACKM=`expr $SIZENEEDEDM \/ 3` #guess
SIZENEEDEDM=`expr $SIZENEEDEDM + $SIZESLACKM`
SIZENEEDEDM=`expr $SIZENEEDEDM + 25` #space for vmlinuz, initrd.gz, zdrv, etc

#now choose working partition...
PARTSLIST="`probepart -m 2> /dev/null | grep '^/dev/' | grep --extended-regexp 'ext2|ext3|reiserfs|msdos|vfat|ntfs' | cut -f 1-3 -d '|'`"

 echo -n "" > /tmp/schoices.txt
 echo "$PARTSLIST" |
 while read APART
 do
  [ "$APART" = "" ] && continue #v3.01 preaution
  MNTSTATUS='(смонтирован)'
  ATAG="`echo -n "$APART" | cut -f 1 -d '|' | cut -f 3 -d '/'`"
  ASIZE="`echo -n "$APART" | cut -f 3 -d '|'`"
  AFS="`echo -n "$APART" | cut -f 2 -d '|'`"
  AFPATTERN="^/dev/$ATAG " #v3.01
  AFREE="`df -m | grep "$AFPATTERN" | tr -s " " | cut -f 4 -d " "`"
  if [ ! "$AFREE" ];then
   MNTSTATUS='(не смонтирован)'
   mkdir -p /mnt/$ATAG
   mount -t $AFS /dev/$ATAG /mnt/$ATAG > /dev/null 2>&1
   if [ $? -eq 0 ];then
    if [ "$ATAG" = "fd0" ];then
     FFREE=`df -k | grep "$AFPATTERN" | tr -s " " | cut -f 4 -d " "`
     AFREE="`dc $FFREE 1024 \/ p`"
    else
     AFREE="`df -m | grep "$AFPATTERN" | tr -s " " | cut -f 4 -d " "`"
    fi
    umount /dev/$ATAG
   fi
  fi
  [ "$AFS" ] && echo "${ATAG} \"Файловая система: $AFS  Размер: ${ASIZE}M  Свободно: ${AFREE}M ${MNTSTATUS}\" \\" >> /tmp/schoices.txt #v3.01 added precaution.
 done
 SCHOICES="`cat /tmp/schoices.txt`"

#add tmpfs ramdisk choice...
SIZETMPFSM="`df -m | grep '^tmpfs' | grep '/initrd/pup_rw' | tr -s " " | cut -f 4 -d " "`"
TMPFSMSG=''
if [ "$SIZETMPFSM" != "" ];then
 TOTALTMPFSM="`df -m | grep '^tmpfs' | grep '/initrd/pup_rw' | tr -s " " | cut -f 2 -d " "`"
 if [ "$SCHOICES" = "" ];then #v3.01
  SCHOICES="ramdisk \"Файловая система: tmpfs  Размер: ${TOTALTMPFSM}M  Свободно: ${SIZETMPFSM}M (смонтирован)\" \\"
 else
  SCHOICES="$SCHOICES
ramdisk \"Файловая система: tmpfs  Размер: ${TOTALTMPFSM}M  Свободно: ${SIZETMPFSM}M (смонтирован)\" \\"
 fi
 TMPFSMSG='Примечание 2: Вы можете использовать виртуальный раздел ramdisk, который находится в оперативной памяти (RAM), если на нём достаточно свободного места.
'
fi

[ "$SCHOICES" = "" ] && exit #precaution.

 echo '#!/bin/sh' > /tmp/savedlg
 echo -n "Xdialog --wrap --stdout --left --title \"Создание собственного Puppy liveCD\" --menubox \"Выбор места для размещения файла образа (ISO) нового liveCD.
Ниже перечислены доступные разделы. Вы можете выбрать любой из них, содержащий не менее  ${SIZENEEDEDM}M свободного места. К тому же, если Вы выберите способ создания ISO файла иным, чем прямая запись на CD/DVD, Вам потребуется еще 100 - 200MB свободного места (независимо от размера самого файла ISO).

Если на разделе, который Вы хотите использовать, менее ${SIZENEEDEDM}M свободного места, необходимо завершить работу скрипта и удалить ненужные файлы.
Примечание 1: Вы можете использовать накопитель USB, но он должен быть 
        	подключен до запуска скрипта, чтобы быть правильно опознанным.
${TMPFSMSG}
Выберите раздел и нажмите кнопку OK...\" 0 0 5 " >> /tmp/savedlg
 echo "$SCHOICES"  >> /tmp/savedlg
 echo ' > /tmp/tag.txt' >> /tmp/savedlg
 chmod 755 /tmp/savedlg

/tmp/savedlg
WKGPART="`cat /tmp/tag.txt`"
echo "WKGPART=$WKGPART"
[ "$WKGPART" = "" ] && exit
#[ "$WKGPART" = "ramdisk" ] && WKGPART="tmpfs"

#copy files off live-cd....
DRIVESFND="`probedisk 2>&1`"
IDEDRVSFND="`test-eide 2>&1 | grep "cdrom"`"
SELECTIONS="`echo "$DRIVESFND" | grep '^/dev/' | grep "cdrom" | cut -f 1,3 -d "|" | tr " " "_" | tr "|" " " | tr '$' "_"`"
BURNERDRV="`Xdialog --wrap --left --title \"Создание собственного Puppy liveCD\" --stdout --menubox \"Программе необходимо прочитать некоторые файлы с исходного liveCD.
Итак, Вы должны выбрать привод CD/DVD, и он должен быть записывающим, чтобы файлы, созданные программой, могли быть записаны на новый компакт диск CD/DVD (кроме случая, если планируется создать только ISO файл образа, а сама запись будет произведена в другое время).
Выберите привод CD/DVD...\" 0 108 4 $SELECTIONS 2> /dev/null `"
[ ! $? -eq 0 ] && exit
[ "$BURNERDRV" = "" ] && exit
BURNERDRV="`echo -n "$BURNERDRV" | cut -f 3 -d '/'`"
echo "BURNERDRV=$BURNERDRV"

CDPATTERN="/dev/$BURNERDRV "
CDMNTPT="`mount | grep "$CDPATTERN" | tr -s " " | cut -f 3 -d " "`"
if [ "$CDMNTPT" != "" ];then
 if [ ! -f $CDMNTPT/initrd.gz ];then
  fuser -k -m /dev/$BURNERDRV
  sync
  umount /dev/$BURNERDRV 2> /dev/null
  if [ ! $? -eq 0 ];then
   Xdialog --title "ОШИБКА" --msgbox "CD смонтирован, размонтируйте его, прежде чем запускать эту программу!" 0 0
   exit
  fi
  CDMNTPT=""
 fi
fi

if [ "$CDMNTPT" = "" ];then
 while [ 1 ];do
 Xdialog --wrap --title "Создание собственного Puppy liveCD" --msgbox "Вставьте, пожалуйста, исходный Puppy liveCD в привод $BURNERDRV.
Затем нажмите кнопку OK..." 0 0
 #now mount it...
 CDMNTPT="/mnt/$BURNERDRV"
 mkdir -p /mnt/$BURNERDRV
 mount -t iso9660 /dev/$BURNERDRV /mnt/$BURNERDRV
 [ $? -eq 0 ] && break
 done
fi

#now get the files off it...
#firstly need working place to write to...
[ "$WKGPART" = "ramdisk" ] && WKGMNTPT="/"
WPATTERN="/dev/$WKGPART "
[ "$WKGMNTPT" = "" ] && WKGMNTPT="`mount | grep "$WPATTERN" | tr -s " " | cut -f 3 -d " "`"
#[ "$WKGMNTPT" = "/initrd/pup_rw" ] && WKGMNTPT="/"
if [ "$WKGMNTPT" = "" ];then
 PPATTERN="^$WKGPART "
 WKGFS="`echo "$SCHOICES" | grep "$PPATTERN" | cut -f 2 -d ':' | cut -f 2 -d " "`"
 [ "$WKGFS" = "msdos" ] && WKGFS="vfat"
 mkdir -p /mnt/$WKGPART
 mount -t $WKGFS /dev/$WKGPART /mnt/$WKGPART
 [ $? -ne 0 ] && exit #precaution.
 WKGMNTPT="/mnt/$WKGPART"
fi
[ "$WKGMNTPT" = "/" ] && WKGMNTPT=""

Xdialog --wrap --title "Создание собственного Puppy liveCD" --msgbox "Копирование файлов с CD в  $WKGMNTPT/puppylivecdbuild/, пожалуйста, подождите..." 0 0 &
XPID=$!
rm -rf $WKGMNTPT/puppylivecdbuild #precaution
mkdir $WKGMNTPT/puppylivecdbuild
#now copy the files...
   sync
   cp $CDMNTPT/isolinux.bin $WKGMNTPT/puppylivecdbuild/
   sync
   cp $CDMNTPT/isolinux.cfg $WKGMNTPT/puppylivecdbuild/
   sync
   cp $CDMNTPT/boot.msg $WKGMNTPT/puppylivecdbuild/ 2> /dev/null
   sync
   cp $CDMNTPT/goofy.16 $WKGMNTPT/puppylivecdbuild/ 2> /dev/null
   sync
   cp $CDMNTPT/vmlinuz $WKGMNTPT/puppylivecdbuild/
   sync
   cp $CDMNTPT/initrd.gz $WKGMNTPT/puppylivecdbuild/
   sync
# copy files 8x16.psf - for PuppyRus only
   cp $CDMNTPT/8x16.psf $WKGMNTPT/puppylivecdbuild/
   sync
   #v2.12...
   [ -f $CDMNTPT/zdrv_$PUPPYVERSION.sfs ] && cp -af $CDMNTPT/zdrv_$PUPPYVERSION.sfs $WKGMNTPT/puppylivecdbuild/
   sync

umount /dev/$BURNERDRV 2> /dev/null

kill $XPID
Xdialog --left --title "Создание собственного Puppy liveCD" --msgbox "Создание файла pup_$PUPPYVERSION.sfs в  $WKGMNTPT/puppylivecdbuild/.
Это может занять довольно много времени, так что, пожалуйста, подождите....
Примечание, нет необходимости нажимать на кнопку OK, т.к. окно закроется само после создания файла pup_$PUPPYVERSION.sfs.
Пожалуйста, подождите..." 0 0 &
XPID=$!

#create new pup_xxx.sfs file...
DIRHOME=""
[ -d /home ] && DIRHOME="/home"
[ -d /sys ] && DIRSYS="/sys"
[ -d /lost+found ] && DIRLOST="/lost+found"
rm -f ${WKGMNTPT}/puppylivecdbuild/pup_${PUPPYVERSION}*.sfs 2> /dev/null
sync
#note, /pup_$PUPPYVERSION.sfs is not normally there, i relocated it to a separate tmpfs,
#however have not yet done that for multisession-cd/dvd (PUPMODE=77).
#note, /home could be in underdog linux...
mksquashfs / $WKGMNTPT/puppylivecdbuild/pup_$PUPPYVERSION.sfs -e /etc /proc /initrd /var /tmp /archive /mnt /root /puppylivecdbuild $DIRHOME $DIRSYS $DIRLOST /pup_$PUPPYVERSION.sfs
sync

#add pristine folders (out of current pup_xxx.sfs)...
mksquashfs /initrd${PUP_LAYER}/proc $WKGMNTPT/puppylivecdbuild/pup_$PUPPYVERSION.sfs -keep-as-directory
sync
mksquashfs /initrd${PUP_LAYER}/tmp $WKGMNTPT/puppylivecdbuild/pup_$PUPPYVERSION.sfs -keep-as-directory
sync
mksquashfs /initrd${PUP_LAYER}/mnt $WKGMNTPT/puppylivecdbuild/pup_$PUPPYVERSION.sfs -keep-as-directory
sync

kill $XPID

#######START WORKING ON /root#######
rm -rf /tmp/root 2> /dev/null
#do some work on /root before add it to the squashfs...
cp -a /initrd${PUP_LAYER}/root /tmp/root #pristine /root
#copy all of my-applications/
cp -af /root/my-applications/* /tmp/root/my-applications/
#some dotpups get installed here...
cp -af /root/my-roxapps /tmp/root/ 2>/dev/null
#window manager config files...
cp -af /root/.jwmrc /tmp/root/
cp -af /root/.jwmrc-tray /tmp/root/ #v411
cp -af /root/.fvwm95rc /tmp/root/
cp -af /root/.icewm/menu /tmp/root/.icewm/
#rox desktop settings...
cp -af /root/Choices/ROX-Filer/PuppyPin /tmp/root/Choices/ROX-Filer/
cp -af /root/Choices/ROX-Filer/globicons /tmp/root/Choices/ROX-Filer/
#v411 tidy up, remove desktop drive icons...
grep -v '/root/.pup_event/drive_' /tmp/root/Choices/ROX-Filer/PuppyPin > /tmp/remaster-PuppyPin
mv -f /tmp/remaster-PuppyPin /tmp/root/Choices/ROX-Filer/PuppyPin
#this may have been modified for a different w.m...
cp -af /root/.xinitrc /tmp/root/
#also this...
[ -f /root/.xset.sh ] && cp -af /root/.xset.sh /tmp/root/

#v411 gtk theme may have been changed...
cp -af /root/.gtkrc-2.0 /tmp/root/

#v411 jwm theme may have changed...
cp -af /root/.jwm/jwm_colors /tmp/root/.jwm/
cp -af /root/.jwm/jwmrc-personal /tmp/root/.jwm/
cp -af /root/.jwm/jwmrc-personal2 /tmp/root/.jwm/
cp -af /root/.jwm/jwmrc-theme /tmp/root/.jwm/

#v411 pmount preferences...
cp -af /root/.pmountauto /tmp/root/
cp -af /root/.pmountengine /tmp/root/
cp -af /root/.pmountquit /tmp/root/
cp -af /root/.pmountsingle /tmp/root/

#TODO think need to do this for /var also...

#.packages/ .files, copy any files installed to /root...
echo -n "" > /tmp/allpkgs.files
for ONEPKG in `ls -1 /root/.packages/*.files 2>/dev/null | tr "\n" " "`
do
 for ONEFILE in `cat $ONEPKG | grep '^/root/' | tr "\n" " "`
 do
  DIRNAME="`dirname $ONEFILE`"
  mkdir -p /tmp$DIRNAME
  cp -f $ONEFILE /tmp$DIRNAME/
 done
done

#modify /root/.packages/ files, as all installed packages are now part of the new cd...
 #integrity check of /root/.packages/alienpackages.txt...
 if [ -s /root/.packages/alienpackages.txt ];then
  ZZPATTERN='^".\+" ".\+" .\+ ".*" \\$' #v2.11
  ERRLINE="`cat /root/.packages/alienpackages.txt | grep -v "$ZZPATTERN"`"
  if [ ! "$ERRLINE" = "" ];then
   gxmessage -bg '#ff8080' -title "ОШИБКА ОШИБКА" "Следующие строки в /root/.packages/alienpackages.txt
имеют неправильный формат и должны быть удалены:
$ERRLINE

Пожалуйста, информируйте авторов пакета об этом!
Примечание, для продолжения работы программы нажмите кнопку..."
  fi
  #cat /root/.packages/alienpackages.txt | grep '^".\+" ".\+" .\+ ".\+" \\' > /tmp/alienpackagesxxx
  #v2.11...
  cat /root/.packages/alienpackages.txt | grep "$ZZPATTERN" > /tmp/alienpackagesxxx
  sync
  cp -f /tmp/alienpackagesxxx /root/.packages/alienpackages.txt
 fi
#any entries in livepackages.txt now "on", transferred to packages.txt...
rm -rf /tmp/root/.packages/*
echo -n "" > /tmp/root/.packages/packages.txt
cp /root/.packages/buildvariables /tmp/root/.packages/
#tricky, packages.txt lines have "\" on ends, which stuffs up the read...
cat /root/.packages/packages.txt | tr "\\" "|" |
while read ONELINE
do
 [ "$ONELINE" = "" ] && continue #precaution, blank line.
 ONEPKG="^\"`echo -n "$ONELINE" | cut -f 2 -d '"'`\""   #' fix Geany highlighting
  #if alien package with same name, let it override...
  if [ -s /root/.packages/alienpackages.txt ];then
   [ ! "`cat /root/.packages/alienpackages.txt | grep "$ONEPKG"`" = "" ] && continue
  fi
 NEWLINE="`cat /root/.packages/livepackages.txt 2> /dev/null | grep "$ONEPKG" | grep '" on "'`"
 if [ "$NEWLINE" = "" ];then
  echo "$ONELINE" | tr "|" "\\" >> /tmp/root/.packages/packages.txt
 else
  echo "$NEWLINE" >> /tmp/root/.packages/packages.txt
 fi
done
#also handle any alien packages (dotpups will be)...
if [ -s /root/.packages/alienpackages.txt ];then
 cat /root/.packages/alienpackages.txt >> /tmp/root/.packages/packages.txt
 sort -u /tmp/root/.packages/packages.txt > /tmp/packagesxxx
 cp -f /tmp/packagesxxx /tmp/root/.packages/packages.txt
fi
#v411 have multiple .pet repos...
for ONEREPO in `ls -1 /root/.packages/livepackages*.txt | tr '\n' ' '`
do
 REPOFILE="`basename $ONEREPO`"
 [ "$REPOFILE" = "livepackages.txt" ] && continue #offical repo for current version.
 #on pkgs are now part of live-cd...
 grep '" on "' $ONEREPO >> /tmp/root/.packages/packages.txt
 sort -u /tmp/root/.packages/packages.txt > /tmp/packagesxxx
 cp -f /tmp/packagesxxx /tmp/root/.packages/packages.txt
 #remove on pkgs from repo list...
 grep -v '" on "' $ONEREPO > /tmp/root/.packages/$REPOFILE
done
#v411 doesn't seem to be done earlier, remove on entries from livepackages.txt...
grep -v '" on "' /root/.packages/livepackages.txt > /tmp/root/.packages/livepackages.txt

Xdialog --left --title "Создание собственного Puppy liveCD" --msgbox "Программа создала каталог /tmp/root, в который поместила всё, что должно быть 
добавлено в /root файла pup_$PUPPYVERSION.sfs file.
Всё это записано в 'первоначальном' виде, так как, очевидно, Вам нет необходимости хранить 
файлы кэша, временные файлы, письма и другие рабочие/временные файлы на CD. Тем не менее Вы, 
если достаточно много работали с Puppy, можете сейчас просмотреть каталог /tmp/root, и добавить 
что-либо дополнительно вручную (или удалить!)

После проверки каталога /tmp/root, нажмите кнопку 'Ok' и 
добавьте каталог /root в файл pup_$PUPPYVERSION.sfs..." 0 0
sync
mksquashfs /tmp/root $WKGMNTPT/puppylivecdbuild/pup_$PUPPYVERSION.sfs -keep-as-directory
sync
rm -rf /tmp/root
#######END WORKING ON /root#######

#######START WORKING ON /etc#######
rm -rf /tmp/etc 2> /dev/null
#do some work on /etc before add it to the .sfs...
cp -a /initrd${PUP_LAYER}/etc /tmp/etc #pristine /etc.
#maybe this has been modified...
cp -af /etc/ld.so.conf /tmp/etc/
#firmware tarballs may install these scripts...
cp -af /etc/init.d/* /tmp/etc/init.d/   #3.99

#.packages/ .files, copy any files installed to /etc...
echo -n "" > /tmp/allpkgs.files
for ONEPKG in `ls -1 /root/.packages/*.files 2>/dev/null | tr "\n" " "`
do
 for ONEFILE in `cat $ONEPKG | grep '^/etc/' | tr "\n" " "`
 do
  DIRNAME="`dirname $ONEFILE`"
  mkdir -p /tmp$DIRNAME
  cp -f $ONEFILE /tmp$DIRNAME/
 done
done
sync

cp -af /etc/eventmanager /tmp/etc/ #v411

#what about settings for a particular pc?...
MSG1="Настройки аппаратных средств не определены."
Xdialog --left --title "Создание собственного Puppy liveCD" --yesno "Создан каталог /etc для нового файла pup_$PUPPYVERSION.sfs file.
Все параметры установлены в 'первоначальный' вид, но Вы можете изменить их для работы с 
конкретно Вашим компьютером.
Хотите настроить поддержку конкретно Вашего оборудования? Например, мыши, клавиатуры, видео. 
Однако, помните, ответив сейчас 'Yes', Вы настроите свой liveCD для работы только с Вашим ПК. 
Поэтому лучше ответить 'No', если Вы планируете использовать новый liveCD и на других ПК.

Нажмите кнопку 'Yes' для изменения /etc...
Нажмите кнопку 'No'чтобы оставить настройки по умолчанию  (рекомендуется)..." 0 0
if [ $? -eq 0 ];then
 cp -af /etc/codepage /tmp/etc/
 cp -af /etc/fontmap /tmp/etc/
 cp -af /etc/keyboardtype /tmp/etc/
 cp -af /etc/keymap /tmp/etc/
 cp -af /etc/mousebuttons /tmp/etc/
 cp -af /etc/mousedevice /tmp/etc/
 cp -af /etc/videomode /tmp/etc/
 cp -af /etc/eth0mode /tmp/etc/
 cp -af /etc/eth1mode /tmp/etc/
 cp -af /etc/resolv.conf /tmp/etc/
 rm -f /tmp/etc/localtime #a symlink
 cp -af /etc/localtime /tmp/etc/
 cp -af /etc/TZ /tmp/etc/
 cp -af /etc/cdburnerdevice /tmp/etc/
 cp -af /etc/dvddevice /tmp/etc/
 cp -af /etc/modemdevice /tmp/etc/
 cp -af /etc/securetelnetrc /tmp/etc/
 cp -af /etc/modules.conf /tmp/etc/
 cp -af /etc/modprobe.conf /tmp/etc/
 cp -af /etc/rdesktoprc /tmp/etc/
 cp -af /etc/windowmanager /tmp/etc/
 cp -af /etc/xextraoptions /tmp/etc/
 cp -af /etc/X11/xorg.conf /tmp/etc/X11
 MSG1="Данные файлы были помещены в /etc:
codepage fontmap keyboardtype keymap mousebuttons mousedevice videomode
eth0mode eth1mode resolv.conf localtime TZ cdburnerdevice dvddevice modemdevice
securetelnetrc modprobe.conf rdesktoprc windowmanager xextraoptions X11/xorg.conf"
fi

#some files to always copy...
cp -af /etc/Puppybackgroundcolor /tmp/etc/
cp -af /etc/Puppybackgroundpicture /tmp/etc/
#TODO: other gtk and jwm customisations.

Xdialog --left --title "Создание собственного Puppy liveCD" --msgbox "$MSG1

Если Вы уверены в своих знаниях, можете вручную изменить любые файлы в /tmp/etc. Они будут
 добавлены в каталог /etc файла SFS.
Все изменения производите до нажатия кнопки 'Ok'.

Нажмите кнопку 'Ok' для добавления каталога /etc в файл pup_$PUPPYVERSION.sfs..." 0 0

sync
mksquashfs /tmp/etc $WKGMNTPT/puppylivecdbuild/pup_$PUPPYVERSION.sfs -keep-as-directory
sync
rm -rf /tmp/etc
#######END WORKING ON /etc#######

#######START WORKING ON /var#######
rm -rf /tmp/var 2> /dev/null
cp -a /initrd${PUP_LAYER}/var /tmp/var #pristine var

#.packages/ .files, copy any files installed to /var...
echo -n "" > /tmp/allpkgs.files
for ONEPKG in `ls -1 /root/.packages/*.files 2>/dev/null | tr "\n" " "`
do
 for ONEFILE in `cat $ONEPKG | grep '^/var/' | tr "\n" " "`
 do
  DIRNAME="`dirname $ONEFILE`"
  mkdir -p /tmp$DIRNAME
  cp -f $ONEFILE /tmp$DIRNAME/
 done
done
sync

sync
mksquashfs /tmp/var $WKGMNTPT/puppylivecdbuild/pup_$PUPPYVERSION.sfs -keep-as-directory
sync
rm -rf /tmp/var
#######END WORKING ON /var#######


#edit isolinux.cfg...
ISOLINUXCFG="`cat $WKGMNTPT/puppylivecdbuild/isolinux.cfg`"
#small tweaks, like acpi=on, ide=nodma...
Xdialog --wrap --left --title "Создание собственного Puppy liveCD" --yesno "Почти всё готово для записи CD!
Все файлы, которые должны быть записаны на CD, располагаются в $WKGMNTPT/puppylivecdbuild/.

Возможно, Вы захотите изменить файл isolinux.cfg. Сейчас в нём записано:
$ISOLINUXCFG

'pmedia' - параметр, указывающий Puppy, с  какого носителя загружаться.
'pmedia=cd' означает загрузку с CD/DVD. Названия других устройств выглядят так:
 usbflash usbhd usbcd ideflash idehd idecd idezip satahd satacd scsihd scsicd

'pkeys' - раскладка клавиатуры по умолчанию. Например: 'pkeys=us'  Можно выбрать:
 be br cf de dk es fi fr gr hu it jp no pl ru se uk us
Если Вам этого недостаточно, после загрузки Мастер настройки клавиатуры 
предоставит больше вариантов.

Вы также можете указать параметры загрузки ядра. Например, некоторым ПК требуется указать 'acpi=off'.

(Если ответить 'Yes', загрузится редактор, который необходимо будет закрыть прежде, чем продолжить работу программы)
Нажмите кнопку 'Yes' для редактирования файла isolinux.cfg..." 0 0
if [ $? -eq 0 ];then
 #leafpad $WKGMNTPT/puppylivecdbuild/isolinux.cfg
 #gtk-shell -t "$WKGMNTPT/puppylivecdbuild/isolinux.cfg" -ef "$WKGMNTPT/puppylivecdbuild/isolinux.cfg"
 #sync
 defaulttexteditor $WKGMNTPT/puppylivecdbuild/isolinux.cfg
fi
sync

Xdialog --left --title "Создание собственного Puppy liveCD" --msgbox "Почти всё готово для записи CD!
Все файлы, которые должны быть записаны на CD, располагаются в $WKGMNTPT/puppylivecdbuild/.

В нём находится файл 'pup_${PUPPYVERSION}.sfs', но Вы при желании можете изменить
его название, добавив свои обозначения после номера версии, как например:
 pup_${PUPPYVERSION}beta1.sfs  pup_${PUPPYVERSION}ce.sfs  pup_${PUPPYVERSION}firehydrant.sfs

Это полезно использовать, чтобы не путать различные варианты своих CD и официальную версию Puppy. 
Так, для ускорения загрузки Puppy с liveCD можно скопировать файл pup_${PUPPYVERSION}.sfs 
на жесткий диск и использование различных названий исключит возможную ошибку в выборе 
необходимого файла.

Измените название файла сейчас, до нажатия кнопки 'OK', открыв с помощью файлового менеджера 
ROX-Filer каталог $WKGMNTPT/puppylivecdbuild/. Допускается добавлять строковые символы после
 номера версии как указано в вышерасположенных примерах." 0 0
sync

#build new iso file, or direct burn to cd...
#to save space, burn direct from $WKGMNTPT/puppylivecdbuild/ to cd...
Xdialog --wrap --left --title "Создание собственного Puppy liveCD" --yesno "Все файлы, предназначенные для записи CD/DVD находятся в $WKGMNTPT/puppylivecdbuild/.

Если рабочий раздел имеет ограниченный размер (например, Вы используете USB Flash), файлы будут записаны на CD/DVD непосредственно, минуя промежуточную стадию создания файла образа ISO. Если же Вам всё таки нужен ISO образ, получить его можно позже копированием CD
 (dd if=/dev/$BURNERDRV of=puppy.iso seek=0 bs=32k).

С другой стороны, если Вы хотите получить только образ системы в виде файла ISO, без записи диска CD/DVD, нажмите кнопку 'No'.

Нажмите кнопку 'No' (или закройте окно программы) для завершения работы в данной точке (файлы, находящиеся в каталоге $WKGMNTPT/puppylivecdbuild/, сохранятся) и создания файла образа ISO...
Нажмите кнопку 'Yes' для начала записи CD/DVD..." 0 0

if [ ! $? -eq 0 ];then
 Xdialog --wrap --left --title "Создание собственного Puppy liveCD" --yesno "Нажмите кнопку 'Yes' для создания 'custom-puppy-${PUPPYVERSION}.iso' в ${WKGMNTPT}/ (должно быть 100MB-200MB свободного места на разделе)...
Нажмите кнопку 'No' (или закройте окно программы) для завершения работы в данной точке (файлы, находящиеся в каталоге ${WKGMNTPT}/puppylivecdbuild/, сохранятся)..." 0 0
 if [ $? -eq 0 ];then
  #cd $WKGMNTPT
  rxvt -bg orange -title "Создание собственного Puppy liveCD" -e mkisofs -D -R -o $WKGMNTPT/custom-puppy-$PUPPYVERSION.iso -b isolinux.bin -c boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table $WKGMNTPT/puppylivecdbuild/
 fi
 sync
 Xdialog --wrap --left --title "Создание собственного Puppy liveCD" --msgbox "$WKGMNTPT/custom-puppy-$PUPPYVERSION.iso создан.
Каталог $WKGMNTPT/puppylivecdbuild/ не удалён.
Нажмите кнопку 'Ok' для завершения..." 0 0
 exit
fi

if [ "`echo "$BURNERDRV" | grep 'hd'`" != "" ];then
 DEVDEV="ATAPI:/dev/$BURNERDRV"
else
 DEVDEV="/dev/$BURNERDRV"
fi

#now for the actual burn...
CDCHOICE="`Xdialog --wrap --left --stdout --title \"Создание собственного Puppy liveCD\" --menubox \"Выберите, пожалуйста, устройство для записи.
Записывающий привод /dev/$BURNERDRV, может быть использован, при желании, для записи DVD!

Примечание, Вы можете позже использовать программу 'dd' для создания файла образа ISO:
 # dd if=/dev/$BURNERDRV of=puppy.iso seek=0 bs=32k

ВСТАВЬТЕ, ПОЖАЛУЙСТА, НОВЫЙ ДИСК CD ИЛИ DVD В ПРИВОД И ВЫБЕРИТЕ ИЗ МЕНЮ...\" 0 0 4 CD-R \"Новый пустой диск CD\" DVD-R \"Новый пустой DVD-R (нельзя +R, -RW, +RW)\"`"

echo '#!/bin/sh' > /tmp/new2cd.sh
if [ "`echo "$CDCHOICE" | grep 'DVD'`" = "" ];then
 #burn to CD...
 echo "mkisofs -D -R -quiet -b isolinux.bin -c boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table $WKGMNTPT/puppylivecdbuild/ | cdrecord -multi -tao -pad -data -v speed=4 gracetime=2 dev=$DEVDEV  -" >> /tmp/new2cd.sh
else
 echo "growisofs -speed=4 -Z /dev/$BURNERDRV -R -D -quiet -b isolinux.bin -c boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table $WKGMNTPT/puppylivecdbuild/" >> /tmp/new2cd.sh
fi
echo 'echo -n "Выполнено. Нажмите клавишу ENTER для продолжения: "' >> /tmp/new2cd.sh
echo 'read nippi'  >> /tmp/new2cd.sh
chmod 755 /tmp/new2cd.sh
rxvt -bg orange -title "Создание собственного Puppy liveCD" -e /tmp/new2cd.sh

sync
rm -rf /puppylivecdbuild
rm -rf $WKGMNTPT/puppylivecdbuild
sync
umount /dev/$WKGPART

eject /dev/$BURNERDRV

Xdialog --wrap --left --title "Создание собственного Puppy liveCD" --msgbox "У Вас теперь есть новый собственный Puppy liveCD!

ПРЕДУПРЕЖДЕНИЕ:
Теперь, когда все инсталлированные пакеты (DotPups и PETs), плюс что-то еще, установленное Вами, плюс файлы с расширением SFS записаны на диск CD/DVD, возникает непростая ситуация.
Ведь всё это же находится и в текущем файле pup_save.2fs, файле, в котором Puppy сохраняет  данные и настройки для применения при следующей загрузке. Все эти файлы теперь дублируются. И что же плохого произойдёт при загрузке с нового  CD? ...всё будет нормально, однако, всё равно рекомендуется удалить как можно больше дубликатов сейчас,до загрузки с CD. Примечание, не удаляйте их после загрузки с нового CD, т.к. в этом случае 'удалятся' и пакеты, записанные на CD.

Или, ещё лучше и проще, загрузите Puppy с параметром 'pfix=ram', а при выключении создайте новый 'pup_save' файл. По сути, это необходимо сделать обязательно, ведь Вы даже не знаете, будет ли новый CD правильно работать -- поэтому лучше всего загрузитесь в оперативную память для проверки!" 0 0


####THE END######
