#!/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

RESIZEART=1    #  resize mit resize2fs -M und hinterher Groesse ermitteln   
# RESIZEART=2   #  resize mit vorher ermittelter Groesse:   = Daten * 1.025      

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  

if test $RESIZEART = 1 ; then 
echo " *** Resize auf minimate Groesse"
umount -f $PARTITION 
e2fsck -f $PARTITION 
resize2fs -M $PARTITION       # resizen auf min. Wert
resize2fs -P $PARTITION   "  Bloecke = 4 Sektoren"
echo " *** resize auf min. Groesse fertig"
fi ; 
 
mount $PARTITION  /scr 
df $PARTITION > scr             
umount /scr
echo "df $PARTITION  : "  ;  cat scr                #  Groesse in K hier ausgegeben , mit 1.024 mult. gibt in k unten benoetigt
#sleep 20
grep $PARTITION scr > scr0
echo " *** Daten auf der Partition " ; cat scr0
read UNW1 FSSIZE0 FSSIZE REST < scr0       #  FSSize0 jetzige, FSSize nötige/belegte Groesse Dateien in $PARTITION
FSSIZE1=$(($FSSIZE + $FSSIZE / 40 ))     # *1.024 K->k , sicherheitshalber etwas grsser machen   
echo " *** Sicherheitshalber gewaehlte Groesse: "  $FSSIZE1 "k  = Daten * 1.025 "
#sleep 20

if test $RESIZEART = 2 ; then 
echo " *** Resize auf Daten * 1.025 "
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 auf Daten * 1.025 fertig: " "$FSSIZE1" "k"
fi ;
 
sync 

echo "resize fertig, e2fsck beginnt"
e2fsck -f $PARTITION          #  zur Vermeidung von Problemen 
echo "e2fsck  fertig"


echo "resize fertig, Partition wird nun in die Datei "  $NAME.ext3 " kopiert"

# 2.4. Dateisystem woanders hin kopieren (stattdessen die Partition verkleinern, wrde reboot erfordern)
echo " vor dd"
FSSIZE1=$(( $FSSIZE1 + 16 ))                   #  machen wir die Partition / Kopie 16k groesser als das Dateisystem
echo " *** verkleinerte Partition kopieren: " "$FSSIZE1" "k"   
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 ;

echo "Kopieren fertig, e2fsck beginnt"
e2fsck -f $NAME.ext3          #  zur Vermeidung von Problemen 
echo "e2fsck  fertig"
echo " md5 berechnen ..."
md5sum $NAME.ext3 > $NAME.ext3.md5
ls -l $NAME.ext3 >> $NAME.ext3.md5


# 2.6  Aufrumen
resize2fs -f $PARTITION   # Nach dem Packen, Installierung wieder an Grösse der Partitin 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
ls -l $NAME.ext3.lzma >> $NAME.ext3.lzma.md5


echo " iso machen ..." 
mv $NAME.ext3 ..               # oder loeschen, kann nicht hier bleiben da es sonst auf das CD kaeme  

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  

ls -l ../$NV.iso 

echo " iso fertig,  iso.md5   im Hintergrund berechnen ..."
sync
cd ..
md5sum $NV.iso > $NV.iso.md5   &  


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


