#!/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 
#
#     Von innerhalb Ordner /NAME-VERSION zBsp /SYS_Linux-0.23+ aus starten
#       der Inhalt des .iso -Images enthaelt


RESIZEART=1    #  resize mit resize2fs -M und hinterher Groesse ermitteln   
# RESIZEART=2   #  resize mit vorher ermittelter Groesse:   = Daten * 1.025      
LEER=300       #  MB leerer Platz auf Partition, mit 0 gefuellt, kompaktiert klein


NACH=/dev/hda1          #  Wo .iso hingeschrieben wird, meist / , wird nach /tmp gemountet
PARTITION=/dev/hda1     #  Hier hinschreiben welche Partition das zu rettende System enthaelt 
                        #  Darf nicht Ziel sein wo .ext3 , .iso hingeschrieben werden 
                        #  lzma kommt immer in PWD

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


/bin/setterm -powersave off -blank 0   # auf Konsole schicken, nicht umleiten       

mv -f logfile ../logfile > /dev/zero 2>&1

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


#fdisk -l | grep "/dev/" | grep "Linux" > scr
#dialog --title "partitions" --no-collapse --colors --textbox  scr 0 0 


for J in sda hda sdb hdb sdc hdc sdd hdd ; do  
ls /dev/$J > /dev/zero 2>&1; if test $? = 0 ; then        # nur wenn Geraet ueberhaupt da; unklar ob sicher ohne udevd / in initrd, ggf. weg          
for I in 1 2 3 4 5 ; do 
ls /dev/$J$I > /dev/zero 2>&1 ; if test $? = 0 ; then
mkdir -p /$J$I > /dev/zero 2>&1
mount /dev$J$I $J$I > /dev/zero 2>&1  ; sleep 1 ; df /dev$J$I > /dev/zero 2>&1
if test $? != 0 ; then rm -f $J$I > /dev/zero 2>&1; fi ;
fi ;  
done 
fi ; 
done 


df -h  > scr 

echo -e "\a"

dialog --title "partitions" --no-collapse --colors --textbox  scr 0 0 

dialog --title "output partition .." --no-collapse --colors --inputbox "

        \Z1 A qual particao escrever ?   
      Auf welche Partition schreiben ? \Zn
  ( > 30 GB : .ext3 , .ext3.lzma , .iso )

"  0 0  $NACH  2> scr   

read NACH REST < scr  

umount /nach   >> logfile 2>&1
mkdir -p /nach   >> logfile 2>&1
mount $NACH /nach 

if test $? != 0 ; then 
dialog --title "output partition can not be mounted .." --no-collapse --colors --infobox "

   \Z1 Particao de destino nao pode ser montada 
Ziel-Partition kann nicht gemounted werden \Zn

"  7 54 
exit 
fi ; 



     



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 2>&1   ; KOMPAKTIEREN=$?
#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 $KOMPAKTIEREN -ne 0 ; then 



dialog --title "no compacted system .." --no-collapse --colors --infobox "

 \Z1 Nao tem nenhum    Es gibt keine
         Arquivo    Datei \Zn 
      \Z4 $NAME.ext3.lzma \Zn

"  8 40 
sleep 5 



#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 esta 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
# 2.2.   benutzter Anteil FSSIZE des Platzes FSSIZE0 der Partition abfragen 
###  if test $PARTITION != " " ; then

mkdir -p /von    >> logfile 2>&1

echo -e "\a"

dialog --title "source partition .." --no-collapse --colors --inputbox "

   \Z1 Qual particao p/ compactar  
   Welche Partition archivieren  \Zn

"  0 0  $PARTITION  2> scr   

read PARTITION REST < scr  



umount $PARTITION   >> logfile 2>&1 

if test $? != 0 ; then 
dialog --title "partition in use .." --no-collapse --colors --infobox "

   \Z1 Particao nao pode ser desmontada 
Partition kann nicht freigegeben werden \Zn

"  7 44 
exit 
fi ; 

mount $PARTITION  /von   

if test $? != 0 ; then 
dialog --title "partition can not be mounted .." --no-collapse --colors --infobox "

   \Z1 Particao nao pode ser montada 
Partition kann nicht gemounted werden \Zn

"  7 42 
exit 
fi ; 



init 2   #; sleep 2          # text-Modus, da lzma viel Speicher braucht



dialog --title "source partition .." --no-collapse --colors --infobox "

    \Z1 COMPACTAR     KOMPRIMIEREN
    A PARTICAO     DER PARTITION \Zn 
           \Z4 $PARTITION \Zn

"  8 40 
sleep 5 



tune2fs -m 0 $PARTITION   >> logfile 2>&1                      # damit Groesse korrekt und kein unnĂtiger admin-space  


# leere Datei erzeugen, gepackt sehr klein, sodass ungepackt freier Platz
#    vhd ist falls bei der Installation resize nicht geht 


df $PARTITION    >> logfile 2>&1 
echo " leere Datei mit "  $LEER " MB Groesse erzeugen: "     >> logfile 2>&1
( dd if=/dev/zero of=/von/leer bs=1M count=$LEER    >> logfile 2>&1 )  
df $PARTITION     >> logfile 2>&1
sync
umount /von    >> logfile 2>&1



if test $RESIZEART = 1 ; then 
echo " *** Resize auf minimate Groesse"  >> logfile 2>&1 
umount -f $PARTITION  >> logfile 2>&1 
dialog --title " fsck"  --no-collapse --colors --infobox " ..."  0 0 

sleep 2 ; clear 
e2fsck -f $PARTITION   

dialog --title "minimalize partition .." --no-collapse --colors --infobox "

 \Z1 Redimensionar particao para tamanho minimo ... 
  Partition zu kleinster Groesse verkleinern ... \Zn

"  7 54 

sleep 2 ; clear 

touch rs 
( while   [ -e rs ]  ; do  
dialog --title "resizing .."  --no-collapse --colors --infobox "`cat rs | sed 's/-//g' | sed 's///g'`" 0 0   2>> logfile 
sleep 30
done ) & 
( resize2fs -FfMp $PARTITION > rs 2>&1 ) >> logfile 2>&1       # resizen auf min. Wert
cat rs >> logfile ; rm rs 
resize2fs -FP $PARTITION   "  Bloecke = 4 Sektoren"  >> logfile 2>&1 
echo " *** resize auf min. Groesse fertig"  >> logfile 2>&1 

fi ; 
 
mount $PARTITION  /von  >> logfile 2>&1 
df $PARTITION  > scr                       # Groesse muss MIT leer ermittelt wd
#rm -f /von/leer     >> logfile 2>&1       #  unten
umount /von   >> logfile 2>&1 
echo "df $PARTITION  : "   >> logfile 2>&1 
cat scr   >> logfile 2>&1              #  Groesse in K hier ausgegeben , mit 1.024 mult. gibt in k unten benoetigt
#sleep 20
grep $PARTITION scr > scr0             #  eigentlich nicht noetig ... 
echo " *** Daten auf der Partition "  >> logfile 2>&1
cat scr0   >> logfile 2>&1
read UNW1 FSSIZE0 FSSIZE REST < scr0  >> logfile 2>&1  #  FSSize0 jetzige, FSSize nĂ¶tige/belegte Groesse Dateien in $PARTITION
FSSIZE1=$(($FSSIZE + $FSSIZE / 40 ))  >> logfile 2>&1  # *1.024 K->k , sicherheitshalber etwas grĂsser machen   
echo " *** Sicherheitshalber gewaehlte Groesse: "  $FSSIZE1 "k  = Daten * 1.025 "  >> logfile 2>&1
#sleep 20

if test $RESIZEART = 2 ; then 
echo " *** Resize auf Daten * 1.025 "
umount -f $PARTITION   >> logfile 2>&1 
# 2.3. GrĂsse Datei-System auf benutzten Anteil FSSIZE (+Sicherheit) verringern

#dialog --title " fsck"  --no-collapse --colors --infobox " ..."  0 0 
sleep 2 ; clear 
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 ))
#clear # geht nach vorigem resize schnell, normalerweise kein Fehler etc 
resize2fs -Ff $PARTITION   "$FSSIZE2"s    >> logfile 2>&1 
echo " *** Resize auf Daten * 1.025 fertig: " "$FSSIZE1" "k"   >> logfile 2>&1 
fi ;
 
sync 

 
mount $PARTITION  /von  >> logfile 2>&1 
rm -f /von/leer     >> logfile 2>&1       # /leer loeschen, dann unkompaktiert LEER freier Platz vhd, kompaktiert ist /leer sehr klein          
echo " Nach /leer loeschen: " >> logfile 2>&1
df  >> logfile 2>&1   ; ls -l /von  >> logfile 2>&1
umount /von   >> logfile 2>&1 




echo "resize fertig, e2fsck beginnt"    >> logfile 2>&1 

dialog --title " fsck"  --no-collapse --colors --infobox " ..."  0 0 
sleep 2 ; clear 
e2fsck -f $PARTITION         #  zur Vermeidung von Problemen 
echo "e2fsck  fertig"  >> logfile 2>&1 




echo "resize fertig, Partition wird nun in die Datei "  $NAME.ext3 " kopiert"  >> logfile 2>&1 



# 2.4. Dateisystem woanders hin kopieren (stattdessen die Partition verkleinern, wĂrde reboot erfordern)

EXT3SIZE=19000000               # in k
touch /nach/$NAME.ext3              # damit keine Fehlermeldung solange Datei nicht da

( 
SIZE=0 ; SIZE0=-1 ; PROZENT=0  
while test $SIZE -ne  $SIZE0  ; do
#if test $SIZE -ne  $SIZE0 ; then 
echo $PROZENT  
#fi ;
sleep 60                     
ls -1 -s -k /nach/$NAME.ext3 > scr 
SIZE0=$SIZE
read SIZE REST < scr 
if test $SIZE = "" ; then SIZE=0 ; fi ; 
PROZENT=$(( $SIZE * 100 / $EXT3SIZE ))
if test $PROZENT -gt 100 ; then PROZENT=100 ; fi ; 
done 

) | dialog --title " copy minimalized system .. " --no-collapse  --colors  --gauge "

  \Z1 Copiar sistema minimalizado num arquivo ... 
  Minimalisiertes System in Datei kopieren  ...\Zn

"  10  53  0 &

echo " vor dd"  >> logfile 2>&1 
FSSIZE1=$(( $FSSIZE1 + 16 ))   >> logfile 2>&1                    #  machen wir die Partition / Kopie 16k groesser als das Dateisystem
echo " *** verkleinerte Partition kopieren: " "$FSSIZE1" "k"   >> logfile 2>&1    
dd if=$PARTITION of=/nach/$NAME.ext3 bs=1k count=$FSSIZE1 conv=noerror  >> logfile 2>&1   
#echo $(($FSSIZE1 * 2)) "  Sektoren " > /nach/$NAME.ext3.size   # Problem: lesen vor mounten   
ls -l /nach/$NAME.ext3  >> logfile 2>&1  
echo " dd fertig"  >> logfile 2>&1 
sync
###  fi ;
killall -HUP sleep ; reset                    # damit kein Muell auf den screen kommt 



echo "Kopieren fertig, e2fsck beginnt"   >> logfile 2>&1 

dialog --title " fsck"  --no-collapse --colors --infobox " ..."  0 0 
sleep 2 ; clear 
e2fsck -f /nach/$NAME.ext3            #  zur Vermeidung von Problemen 
echo "e2fsck  fertig"  >> logfile 2>&1
 
echo " md5 berechnen ..."  >> logfile 2>&1 
dialog --title " md5"  --no-collapse --colors --infobox " ..."  0 0 

cd /nach                              # wir wollen keine absoluten Datei-Namen im .md5
md5sum $NAME.ext3 > $NAME.ext3.md5
ls -l $NAME.ext3 >> $NAME.ext3.md5
cd - 
mv /nach/$NAME.ext3.md5 . 


# 2.6  AufrĂumen

dialog --title "resize partition .." --no-collapse --colors --infobox "

 \Z1 Redimensionar particao para tamanho maximo ... 
   Partition zu normaler Groesse erweitern ... \Zn

"  7 54 

#clear    
resize2fs -Ff $PARTITION    >> logfile 2>&1  # Nach dem Packen, Installierung wieder an GrĂ¶sse der Partitin anpassenn 
echo " resize fertig"  >> logfile 2>&1 




# 3. kompaktieren
#bzip2 -9 -fc /nach/$NAME.ext3 > $NAME.ext3.bz2       # gross und lahm 
#lrzip -w 2 -L 9 /nach/$NAME.ext3    # kompaktiert zu 1/  4.2     ,  mit -M Absturz Problem mit irgendwelchen streams in rzip_fd 




LZMASIZE=4400000               # in k
touch /nach/$NAME.ext3.lzma        # damit keine Fehlermeldung solange Datei nicht da

( 
SIZE=0 ; SIZE0=-1 ; PROZENT=0  
while test $SIZE -ne  $SIZE0  ; do
#if test $SIZE -ne  $SIZE0 ; then 
echo $PROZENT  
#fi ;
sleep 800                      #  1 Prozent dauert typischerweise 5 - 20 Min.
ls -1 -s -k /nach/$NAME.ext3.lzma > scr 
SIZE0=$SIZE
read SIZE REST < scr 
if test $SIZE = "" ; then SIZE=0 ; fi ; 
PROZENT=$(( $SIZE * 100 / $LZMASIZE ))
if test $PROZENT -gt 100 ; then PROZENT=100 ; fi ; 
done 

) | dialog --title "  compact system ..." --no-collapse  --colors  --gauge "

    fazer $PWD/$NAME.ext3.lzma ...
       (observavel um outro terminal)
    $PWD/$NAME.ext3.lzma machen ...
       (in anderem Terminal beobachtbar)
            ( ca. 0.5 - 3 hs / GB )

"  15  0  0 &



lzma -8 -kf /nach/$NAME.ext3  >> logfile 2>&1       # knapp 1% grĂsser als lrzip -w 2 -L 9 , aber schneller und lzmacat ist in busybox vhd
#lrzip -l -o /nach/$NAME.ext3.lrz /nach/$NAME.ext3      # kompaktiert 30x schneller als lzma , 1.5 x so gross
sleep 10                                      # um lzma korrekt abzuschliessen

killall -HUP sleep ; reset                    # damit kein Muell auf den screen kommt 

# Bescheuerterweise bei lzma keine Ausgabedatei angebbar ... 
mv /nach/$NAME.ext3.lzma  .    >> logfile 2>&1      # nur relevant falls /nach -ne /   


echo " lzma fertig, md5 berechnen ..."  >> logfile 2>&1
dialog --title " md5"  --no-collapse --colors --infobox " ..."  0 0 

cd /nach/
md5sum $NAME.ext3.lzma > $NAME.ext3.lzma.md5
ls -l $NAME.ext3.lzma >> $NAME.ext3.lzma.md5
cd - 
mv /nach/$NAME.ext3.lzma.md5 . 


#mv /nach/$NAME.ext3 /nach  >> logfile 2>&1              # oder loeschen, kann nicht hier bleiben da es sonst auf das CD kaeme  

fi ;   # KOMPAKTIEREN -ne 0
sync 


echo " iso machen ..."  >> logfile 2>&1 

dialog --title "make iso .." --no-collapse --colors --infobox "

 \Z1 Fazer o .iso ... 
  .iso machen ... \Zn

"  7 23  
sleep 3 


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

rm scr* >> logfile 2>&1 

# 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  /nach/$CDISO  >> logfile 2>&1 

                                        #  Man kann /boot/initrd ausnehmen da in der initrd gepackt  :    -x ./boot/initrd \
cp -f ./boot/initrd/installiso  .   >> logfile 2>&1
mv ../initrd ../initrd.old  >> logfile 2>&1 ; mv ./boot/initrd ..  >> logfile 2>&1 
mv ./logfile ..  





ISOSIZE=4550000               # in k
touch /nach/$CDISO        # damit keine Fehlermeldung solange Datei nicht da

( 
SIZE=0 ; SIZE0=-1 ; PROZENT=0  
while test $SIZE -ne  $SIZE0  ; do
#if test $SIZE -ne  $SIZE0 ; then 
echo $PROZENT  
#fi ;
sleep 20                      
ls -1 -s -k /nach/$CDISO > ../scr 
SIZE0=$SIZE
read SIZE REST < ../scr 
if test $SIZE = "" ; then SIZE=0 ; fi ; 
PROZENT=$(( $SIZE * 100 / $ISOSIZE ))
if test $PROZENT -gt 100 ; then PROZENT=100 ; fi ; 
done 

) | dialog --title "    make .iso ..." --no-collapse  --colors  --gauge "

    fazer $CDISO ...
    $CDISO machen ...

"  10  42  0 &


MKISO=1                                 #  mkisofs geht nicht bei > 4 GB , erzeugt unbrauchbare .iso s
if test $MKISO = 1 ; then
genisoimage -o /nach/$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" .    >> ../logfile 2>&1 
fi ;
if test $MKISO = 2 ; then
mkisofs -o /nach/$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" .   >> ../logfile 2>&1 
fi ;

#growisofs -overburn -Z /dev/hdb=/nach/$CDISO  &   #  ueberbrennen geht nicht   
sync
echo " iso fertig "  >> logfile 2>&1 

sleep 20 ; killall -HUP sleep > /dev/zero 2>&1 ; reset                    # damit kein Muell auf den screen kommt 

mv ../initrd ./boot    ; mv ../logfile  .
rm -f ../scr  installiso  >> logfile 2>&1
ls -l /nach/$CDISO  >> logfile 2>&1 

# Falls von hier aus direkt installiert werden soll (ohne Umkopieren), erwartet der Installer ein SYS_Linux.iso
# Falls das gerade erzeugte .iso eine Versions-Nr hat, machen wir einen link, und verschieben ein ggf. vhd SYS_Linux.iso nach .old
( cd /nach ; if test $CDISO != SYS_Linux.iso ; then 
mv -f SYS_Linux.iso SYS_Linux.iso.old ; ln -s $CDISO SYS_Linux.iso ; fi ; cd - )  >> logfile 2>&1 

mkdir -p /var/log  >> logfile 2>&1 ; cp -f logfile /var/log/logfile.mkcdiso >> logfile 2>&1

#cd ..
echo " iso.md5   im Hintergrund berechnen ..."  >> logfile 2>&1 

( cd /nach ; md5sum $CDISO > $CDISO.md5  ; cd - ; umount /nach ) & 


clear 

echo -e "\a"

exit

