#!/bin/ash 

#   mkcdiso           Macht ein CD/DVD .iso -Image einer Linux-Installation und dieses Programmpaketes zur Re-Installation
#                                 (   SYS_Linux  ) 
#                            Vor Anwendung muss das Install-System als initrd gepackt werden 
PARTITION=/dev/sda1     #  Hier hinschreiben welche Partition das zu rettende System enthaelt 

VON1="."
#VON1=zzz                        # Ordner in CD wo .lzma -Datei ist.    zzz falls sie am Ende geschrieben werden soll. Achtung:
                                #  dann Groesse auch mit ISO9660-level 3,4 max. 4 GB

PWDINIT=`pwd` ;  NV=${PWDINIT##*/}  ;  NAME=${NV%%-[0,1-9]*} ; VERSION=${NV#$NAME-}    #   Von wo aus gestartet wurde,  in Name und Version spalten
#echo "  Name:  "  $NAME   "   Version:  "  $VERSION     # Beispiel:  NAME=SYS_Linux   VERSION=0.20-rc3  



if test $VON1 != "." ; then cd $VON1 ; fi ;    ####

# 1.  Ob Partition der Linux-Installation schon als kompaktierte Datei vorhanden und in diesen Ordner kopiert ?
ls -l  $NAME.ext3.lzma  > scr 
#grep "$NAME.ext3.lzma" scr      #   .lrz .lzma  .bz2  

# 2.    Partition noch nicht als kompakte Datei da, machen
# if test -r SYS_Linux.ext3.lzma  -ne 0 ; then     # ... dieser shit geht nicht
if test $? -ne 0 ; then 
echo " Datei $NAME.ext3.lzma nicht da , aus Partition erzeugen"    # lzma  .lrz  
#sleep 20
# 2.1.  Abfragen welche Partition als Install-CD/DVD gerettet werden soll
#   dialog --inputbox "            $ All this shit no working
#Nao tem arquivo compactado da instalacao.
#A instalacao está em qual particao ?   
#( ex: /dev/hda1 )
#<espaco> = nao fazer, neste caso deve
#estar presente uma imagem nao-compactada
#" 20  60  > partition
#cat partition   
#read PARTITION REST < partition
mkdir -p /scr                  # momentan geht es nur mit /dev/hda1
# 2.2.   benutzter Anteil FSSIZE des Platzes FSSIZE0 der Partition abfragen 
###  if test $PARTITION != " " ; then
tune2fs -m 0 $PARTITION                       # damit Groesse korrekt und kein unntiger admin-space  
mount $PARTITION  /scr 
df $PARTITION > scr             
umount /scr
echo "df $PARTITION  : "  ;  cat scr   
#sleep 20
grep $PARTITION scr > scr0
echo "hier soll Groesse der Partition sein: " ; cat scr0
read UNW1 FSSIZE0 FSSIZE REST < scr0       #  FSSize0 jetzige, FSSize nötige/belegte Groesse Dateien in $PARTITION
FSSIZE1=$(($FSSIZE + $FSSIZE / 50 ))     #  sicherheitshalber etwas grsser machen
echo " Sicherheitshalber gewaehlte Groesse: "  $FSSIZE1
#sleep 20
umount -f $PARTITION 
# 2.3. Grsse Datei-System auf benutzten Anteil FSSIZE (+Sicherheit) verringern
e2fsck -f $PARTITION 
#echo " Nur verkleinern, nicht vergrössern.  Blegt: "  $FSSIZE  " .. mal 1.05 : "  $FSSIZE1  " Groesse momentan: " $FSSIZE0
#echo $(($FSSIZE0 - $FSSIZE))
#  focking bash dont work correctly, incl. the following condition dont work
#test $(($FSSIZE0 - $FSSIZE)) -gt 0 ; if test $? -gt 0  ; then  echo "***" ;   resize2fs -f $PARTITION   "$FSSIZE1"k  ;  echo "*** 2" ;  FSSIZE0=$FSSIZE1 ; fi ;    
FSSIZE2=$(( $FSSIZE1 * 2 ))
resize2fs -f $PARTITION   "$FSSIZE2"s 
echo "resize fertig"
e2fsck -f $PARTITION                           #  zur Vermeidung von Problemen 
echo "e2fsck  fertig"
sync 
# 2.4. Dateisystem woanders hin kopieren (stattdessen die Partition verkleinern, wrde reboot erfordern)
echo " vor dd"
dd if=$PARTITION of=$NAME.ext3 bs=1k count=$FSSIZE1 conv=noerror  
#echo $(($FSSIZE1 * 2)) "  Sektoren " > $NAME.ext3.size   # Problem: lesen vor mounten   
ls -l $NAME.ext3 
echo " dd fertig"
sync
###  fi ;

# 2.6  Aufrumen
resize2fs -f $PARTITION   # Nach dem Packen, Installierung wieder an Grösse der Partitio anpassenn 
echo " resize fertig"

# 3. kompaktieren
#bzip2 -9 -fc $NAME.ext3 > $NAME.ext3.bz2       # gross und lahm 
#lrzip -w 2 -L 9 $NAME.ext3    # kompaktiert zu 1/  4.2     ,  mit -M Absturz Problem mit irgendwelchen streams in rzip_fd 
lzma -8 -kf $NAME.ext3         # knapp 1% grsser als lrzip -w 2 -L 9 , aber schneller und lzmacat ist in busybox vhd
#lrzip -l -o $NAME.ext3.lrz $NAME.ext3      # kompaktiert 30x schneller als lzma , 1.5 x so gross
echo " lzma fertig, md5 berechnen ..."
md5sum $NAME.ext3.lzma > $NAME.ext3.lzma.md5
echo " lzma.md5 fertig, iso machen ..." 
mv $NAME.ext3 ..               # oder loeschen, kann nicht hier bleiben da sonst auf CD  

fi ;  
sync 


if test $VON1 != "." ; then cd .. ; fi ;    #### 

rm scr* 

# 4.  CD/DVD  .iso   erzeugen           #  normalerweise bis 4482 MB , ab 4096 MB Probleme mit mkisofs daher genisoimage verwendet
CDISO="../$NV.iso"                      #  nicht auf der zu kopierenden Partition selbst, oder mit -x ausnehmen 
rm  $CDISO 

                                        #  Man kann /boot/initrd ausnehmen da in der initrd gepackt  :    -x ./boot/initrd \
mv ../initrd ../initrd.old ; mv ./boot/initrd .. 

MKISO=1                                 #  mkisofs geht nicht bei > 4 GB , erzeugt unbrauchbare .iso s
if test $MKISO = 1 ; then
genisoimage -o $CDISO  \
  -R -J -A "$NV" \
  -hide-rr-moved \
  -v -d -N \
  -no-emul-boot -iso-level 4 -boot-load-size 4 -boot-info-table \
  -allow-lowercase -allow-multidot -allow-limited-size  \
  -udf \
  -b boot/isolinux/isolinux.bin \
  -c boot/isolinux/isolinux.boot \
  -V "$NV-DVD" . 
fi ;
if test $MKISO = 2 ; then
mkisofs -o $CDISO  \
  -R -J -A "$NV" \
  -hide-rr-moved \
  -v -d -N \
  -no-emul-boot -iso-level 4 -boot-load-size 4 -boot-info-table \
  -allow-lowercase -allow-multidot  \
  -UDF \
  -b boot/isolinux/isolinux.bin \
  -c boot/isolinux/isolinux.boot \
  -V "$NV-DVD" .
fi ;

mv ../initrd ./boot  

echo " iso fertig,  iso.md5 berechnen ..."
cd ..
md5sum $NV.iso > $NV.iso.md5 

sync

#growisofs -overburn -Z /dev/hdb=$CDISO    #  ueberbrennen geht nicht   


