#!/bin/ash

# Programm zum Starten der SYS Installation mit der .iso -Datei, ohne sie auf ein DVD zu brennen.     Geht nur im Text-Modus 
# Kann von irgendwo aus aufgerufen werden, zBsp vom bereits gemounteten .iso aus. 
# Oder in KDE als Standard-Anwendung (Text-Mode)  bei Anklicken einer .iso -Datei definiert werden,  dann Aufruf
# durch ./installiso  oder durch   mount %1 /cdrom -t udf -o loop ; cp /cdrom/installiso . : umount /cdrom ; ./installiso 
# Jedoch nicht innerhalb von chroot aufrufen, zur Kontrolle daher auch nicht von / aus,  
# denn chrootet selbst und muss VORHER alle unbenutzten Partitionen aussen unmounten und rc.local aendern

#   In  .img wird installiso  innerhalb initrd.cpio.gz gebraucht,   beim .iso zwar eher ausserhalb.  meist aber mit entfalteter
#   initrd (und cd oder chroot nach /initrd).    installiso gehoert auch zu den Programmen der Richtung der Installierung 
#   und nicht zur Richtung des backups.        Um in einem read-only
#   System (Start von mkimg / Erzeugen des USB-Installers aus einem .iso oder Install-DVD) die vorhandene initrd.cpio.gz
#   unveraendert weiterverwenden zu koennen, tun wir eine Kopie von installiso immer in initrd hinein.    

# Sucht auf allen Partitionen eine Datei /SYS_Linux.iso , mountet sie , entpackt die initrd nach /initrd, chrootet dorthin
# mit Aufruf von init .  Macht temporaeren Zusatz zu /etc/rc.d/rc.local sodass nach reboot Installation automatisch fortsetzt  

# Programm NUR relevant wenn zu einem bestimmten Installer (in .iso) gechrootet werden soll, NICHT wenn der eigene Installer mit
#   dem ein DVD oder USB-key gebootet wurde also der / ist verwendet wird, selbst wenn das SYS.lzma von einem anderen .iso benutzt wird 
#   oder/und wenn zu booten ist.    Am Ende des Programmes wird nur zum zu vwd. Installer gechrootet.        Es werden keine 
#   Parameter uebergeben.     Ein gefundenes, .lzma-relevantes .iso bleibt zwar auf /von gemountet, aber das sucht/findet
#   init / mkdev auch selbst. 

# Vor allem muss die Quelle des Installers bestimmt werden, wovon abhaengt ob gechrootet wird, die Quelle des SYS.lzma $VON
#   wovon abhaengt ob reboot erfolgt,  das Zielgeraet $NACH von dem abhaengt welche Partitionen redimensioniert werden und ob
#   reboot erfolgt.    Das kann/muss ausserhalb und vor init erfolgen, denn davon haengt ab welches init verwendet wird. 

### Alle nicht gebrauchten Partitionen vor chroot unmounten, da sonst im Installer nicht richtig behandelt und nicht redimensionierbar

#  Bis nach /initrd gegangen wird, sind wir evtl. im .iso , read-only


mkdir /von   >> /dev/zero 2>&1


dialog --title " search .iso file for install .. "  --yes-label "CONTINUE" --no-label "STOP" --timeout 6 --colors --no-collapse --yesno  "
Procurar arquivo .iso p/a instalacao ...
      Install-.iso-Datei suchen ...
"  8 45 
if test $? -eq 1 ; then exit ; fi ;        # timeout = installieren 

VON=-  
for J0 in 1 2 3 4  ; do
for I0 in sda hda sdb hdb sdc hdc sdd hdd uba ubb ubc ubd ; do         # Auf  sr0 sr1 sr2 sr3  keine Partitionen mit .iso-Datei erwartet
if test $VON = - ; then                                # damit nichts anderes mehr gemountet wird  nachdem .iso gefunden 
mkdir /$I0$J0  >> /dev/zero 2>&1 ; /bin/mount /dev/$I0$J0 /$I0$J0 >> /dev/zero 2>&1         # Nur in initrd noetig, außerhalb Partition mit .iso als gemountet angesehen  
umount /von  >> /dev/zero 2>&1 ; mount /$I0$J0/SYS_Linux.iso  /von -t udf -o ro,unhide,loop   >> /dev/zero 2>&1  
if test $? -eq 0 ; then VON=/$I0$J0 ; fi ; 
# echo " getestet:  /dev/"$I0$J0   "    VON = " $VON   
fi ;
done ; done 

if test $VON = - ; then 
dialog --title " no install .iso file found "  --no-collapse --colors --infobox "
 Nao foi achado nenhum arquivo SYS_Linux.iso
    Keine Datei SYS_Linux.iso gefunden
"  6 48
sleep 4 
exit ; fi ;   



#VON=$VON/SYS_Linux.iso      #  Da mountpoint in initrd / installer anders sein kann, besser nur PartName uebergeben statt loopdevice


dialog --title " install .iso file found "  --no-collapse --colors --infobox "
      Achado:     Gefunden:
       $VON/SYS_Linux.iso 
"  6 40
sleep 4 

# Falls installiso von /initrd aus gestartet wird, Annahme dass zu verwendender Installer schon nach /initrd
#  entpackt wurde;  dann wird dieser verwendet und NICHT der Installer in der initrd auf dem .iso -File SYS_Linux.iso
#  installiert wird aber das System SYS_Linux.ext3.lzma  von SYS_Linux.iso
if test $PWD = "/" ; then
dialog   --title " started from / " --yes-label "CONTINUE" --no-label "STOP" --timeout 5 --colors --no-collapse --yesno  "
Von / aus gestartet, weiter nur wenn NICHT
   chroot vorher ausgefuehrt wurde
Lancado a partir de / , continuar somente
   se nao foi feito chroot antes
" 0 0    
HALTEN=$?
echo $HALTEN
if test $HALTEN = 1 ; then 
exit ; fi ; fi ;  

# Wir starten von /initrd aus: dieses jedenfalls benutzen
if test $PWD = "/initrd" ; then
dialog --title " use installer in /initrd .. "  --no-collapse --colors --infobox "
Usar programa da instalacao em /initrd ...
 Install Program in /initrd benutzen ...
"  6 46 
sleep 4
fi ;  
# Wir starten nicht von /initrd aus ...
if test $PWD != "/initrd" ; then
mv -f /initrd /initrd.0  >> /dev/zero 2>&1      # jedenfalls erst mal altes /initrd retten und ein neues leer einrichten 
mkdir /initrd  >> /dev/zero 2>&1    
#    ... aber es gibt ein ./root/initrd: wir starten vom Ordner ./SYS_Linux aus, dessen ./root/initrd nehmen
if test -d ./boot/initrd ; then
dialog --title " use copy of the installer in ../initrd .. "  --no-collapse --colors --infobox "
Usar uma copia do programa da instalacao em ../initrd ...
   Kopie von Install Program in ../initrd benutzen ...
"  6 64 
 cp -adpPR ./boot/initrd /initrd
 else 
#    ... es gibt ein Install .iso oder DVD, wir entfalten dessen initrd.cpio.gz nach /initrd und nehmen sie als Installer
dialog --title " unfold installer to /initrd .. "  --no-collapse --colors --infobox "
Desdobrar programa da instalacao do .iso para /initrd ...
    Install Program vom .iso nach /initrd entpacken ...
"  6 64 
#sleep 3 
cd /initrd
gzip -dc /von/boot/initrd.cpio.gz | cpio -id  --no-absolute-filenames  # >> /dev/zero 2>&1     #### test, aktivieren sobald fertig / neue initrd in .iso ist  
#cp ./installiso /initrd 
# else 
## Wir nehmen das alte initrd  . Sollte nicht vorkommen da oben Abbruch wenn kein .iso da
#rmdir /initrd
#mv -f /initrd.0 /initrd 
fi ;   fi ; 
sync

# Sollte eigentlich nicht vorkommen:
if test ! -d /initrd ; then
dialog --title " Problem: /initrd dont exist .. "  --no-collapse --colors --infobox "
Problema: /initrd nao exista ...
Problem: /initrd nicht da ...
"  6 42
exit ; fi ;


cd /initrd 

#touch  /initrd/isofile 
#ls --block-size=512 -s $VON/SYS_Linux.iso  >  /initrd/isofile      # Kann aber muss nicht um Installer verwendet werden als Kriterium ob von .iso-Datei installieren  
# Installer sucht selbst ob .iso -Datei vhd

# 2. Teil der Installation /initrd/init wiederholen: 
#Nach reboot waehrend der Installation, bzw solange bis erfolgreich boot ins neu installierte System geht, /initrd beibehalten
cp -f /etc/rc.d/rc.local /etc/rc.d/rc.local.0  >> /dev/zero 2>&1 

echo '( for J0 in 1 2 3 4  ; do for I0 in sda hda sdb hdb sdc hdc sdd hdd uba ubb ubc ubd ; do  umount  /dev/$I0$J0  >> /dev/zero 2>&1 ; done ; done )'  >>  /etc/rc.d/rc.local 
echo '( cd /initrd ; mv -f /etc/rc.d/rc.local.0 /etc/rc.d/rc.local  >> /dev/zero 2>&1 ; rm -f /etc/rc.d/rc.local.0  )'  >>  /etc/rc.d/rc.local 
echo '( cd /initrd ;  chroot .   ./init )' >>  /etc/rc.d/rc.local 
# Klammer noetig da sonst normales rc.local zurueckkopiert bevor zusaetzliche Anweisungen  wie chroot ./init ausgefuehrt wurden


# Alle nicht gebrauchten Partitionen   AUSSERHALB chroot   unmounten, sonst im Installer Probleme 

dialog --title " unmount all unused partitions .. "  --no-collapse --colors --infobox "
 Desmontar todas particoes nao-usadas ...
Alle unbenutzten Partitionen unmounten ...
"  6 46
sleep 3 

for J0 in 1 2 3 4  ; do
for I0 in sda hda sdb hdb sdc hdc sdd hdd uba ubb ubc ubd ; do    
umount  /dev/$I0$J0  >> /dev/zero 2>&1 
done ; done 

# Das .iso ist noch unter /von gemountet 


# echo "***" ; echo "*** Nach initrd chrooten und Installer starten: " ; echo "***" 

dialog --title " start installer .. "  --no-collapse --colors --infobox "
Lancar Instalacao, modo texto, chroot /initrd
Installer starten, Textmodus, chroot /initrd 
                   ...

   Se nao lancar, tambem depois do reboot: 
Falls es nicht startet, auch nach dem reboot:
  CTRL-C ; init 2 ; chroot /initrd   ./init 
"  11 50
#sleep 4  Unnoetig da installer starten sowieso dauert ... 


#init 2  >> /dev/zero 2>&1 
#echo "nach init 2" 
cd /initrd ; chroot .   ./init  
#cd /initrd  ; ls .   # stattdessen zum testen

exit  

