#!/bin/ash

# Sucht GERÄTE - nicht PARTITIONEN - VON wovon gelesen und NACH0 wohin installiert wird
# läßt VON gemountet nach /von  

echo   "  Anfang mkdevs "


read  TST SIZE NACH0 NACH VON KLEINER OLDSYS WINDOWS REST  < installinfo           
echo " mkdev Anfang: TST SIZE NACH0 NACH VON KLEINER OLDSYS WINDOWS: "   
echo  $TST $SIZE $NACH0 $NACH $VON $KLEINER $OLDSYS $WINDOWS  



# 2.   Geraete
# 2.1. Bestandsaufnahme
 

echo -e "\c" > devices


echo "***" ; echo "*** Von linux gefundene Geraete: " ; echo "***"
#  geht scheinbar nur mit udevd  :(   
echo "/dev/disk/by-id :"
ls -l /dev/disk/by-id/* 
echo "/dev/disk/by-path :"
ls -l /dev/disk/by-path/* 
echo "/dev/disk/by-uuid :"
ls -l /dev/disk/by-uuid/* 
echo "/dev/input/by-path :"
ls -l /dev/input/by-path/* 
echo "/dev/cd , /dev/dvd :"
ls -l /dev/cd* 
ls -l /dev/dvd*
echo "/dev/fb :"
ls -l /dev/fb 
# Geraete-Bezeichnungen ohne /dev  
( cd /dev  ;  ls -1L disk/by-path/*  > devices  ; cd - ; mv /dev/devices  . )    
grep "part" devices > partitions0
grep -v "part" devices > devices0 
echo "Geraete: "
cat devices0
echo "Partitionen: "
cat partitions0 
# Zur Sicherheit werden diese Geraetebezeichnungen hilfsweise verwendet wenn aus irgendwelchen komischen Gruenden
#   die normalen nicht vhd sind.   Hauptsaechlich fuer Install-DVD und Festplatte noetig um sie anschliessend zu mounten
DEV1="" ; DEV2="" ; DEV3="" ; DEV4=""
( read DEV1 REST ; read DEV2 REST ; read DEV3 REST ; read DEV4 REST  
  echo $DEV1 $DEV2 $DEV3 $DEV4 > devs ) < devices0  
  read DEV1 DEV2 DEV3 DEV4 REST < devs  
  echo " Geraete: " $DEV1 $DEV2 $DEV3 $DEV4  
  # Partitionen nicht so wichtig  
PART1="" ; PART2="" ; PART3="" ; PART4="" ; PART5="" ; PART6="" ; PART7="" ; PART8=""
( read PART1 REST ; read PART2 REST ; read PART3 REST ; read PART4 REST 
  read PART5 REST ; read PART6 REST ; read PART7 REST ; read PART8 REST  
  echo $PART1 $PART2 $PART3 $PART4 $PART5 $PART6 $PART7 $PART8 > parts ) < partitions0  
  read PART1 PART2 PART3 PART4 PART5 PART6 PART7 PART8 REST < parts 
  echo " Partitionen: " $PART1 $PART2 $PART3 $PART4 $PART5 $PART6 $PART7 $PART8   
echo "***" ; echo "*** in /proc/partitions gefundene Geraete: " ; echo "***"
cat /proc/partitions  

# Statt uns auf /proc , /sys , /dev zu verlassen, sie von dort kompliziert aus- und einzulesen
#    - und wenn sie dann gebraucht werden geht das mounten doch nicht - suchen wir die
#    /hda , /sda unten einfach durch Probieren ab  ob sie de facto da und mountbar sind,
  read PARTITIONEN < parts ; echo $PARTITIONEN > partitionen       # erste Vorbesetzung 

echo -e "\c" > devices

echo "***" ; echo "*** Test Geraete mit hdparm   = Festplatten, CDs: " ; echo "***"
FESTPLATTEN="" ; USBKEYS="" ; CDS=""  ; LEEREGERAETE="" 
SIZEG=18 ; UNPARTMAXG=-1 ; FREIMAXG=-1 ; NTARGETS=0 ;  TARGETS=""    # potentielle Installgeraete groesser als SIZEG, max. unpartionierter Platz, Anzahl
###dmesg > dmesg0                   # oder unten hdparm , besser
#for I0 in a b c d ; do   # spaeter noch vorsehen DVD auf /dev/sr0 usw
#for J0 in hd sd ; do
#DEVICE0=$J0$I0 ; 
for DEVICE0 in hda hdb hdc hdd sda sdb sdc sdd uba ubb ubc ubd sr0 sr1 sr2 sr3 $DEV1 $DEV2 $DEV3 $DEV4  ; do 
# hda vor sda lassen damit IDE-Geraete VOR usb-keys gefunden werden
DEVICE=/dev/$DEVICE0  ; AUSGABE=0 
echo "** Test Aufruf von:   " $DEVICE "  :  **"
hdparm -I $DEVICE  > devices0      # oder oben dmesg 
###IFDMESG=0 ; grep $DEVICE0 dmesg0 > devices0 ; if test $? -eq 0 ; then IFDMESG=HD ; fi ;    # falls device unter dmesg gefunden
###            grep "LBA" devices0 ; if test $? -eq 0 ; then IFDMESG=HD ; fi ;   # alternativ falls hdparm statt dmesg verwendet
###            grep "DVD" devices0 ; if test $? -eq 0 ; then IFDMESG=CD ; fi ;
###            grep "CD" devices0 ; if test $? -eq 0 ; then IFDMESG=CD ; fi ;
IFDMESG=0 ; grep "LBA" devices0 ; if test $? -eq 0 ; then IFDMESG=HD  ; fi ;
            grep "DVD" devices0 ; if test $? -eq 0 ; then IFDMESG=CD ; fi ;  
            grep "CD" devices0 ; if test $? -eq 0 ; then IFDMESG=CD ; fi ;
DEVSIZE=0 ; /sbin/fdisk -s $DEVICE ; if test $? -eq 0 ; then /sbin/fdisk -s -u $DEVICE > scr0 ; read DEVSIZE REST < scr0  
                                     if test $DEVSIZE -gt 0 ; then echo " " ; else DEVSIZE=0 ; fi ; fi ;
if  test $IFDMESG != 0 ; then AUSGABE=1 ; fi ; if  test $DEVSIZE -gt 0 ; then AUSGABE=1 ; fi ; 
# Geraet in Datei aller Geraete  devices , der Festplatten  hds , der CD-Geraete  cds , der USB-Geraete  usbs   eintragen
# TARGETS potentielle Zielgeraete: Festplatten oder USB-keys.     Name, Groesse, unpart in G ,  wird in init im Dialog benutzt
if test $AUSGABE = 1 ; then 
DEVSIZEG=$(($DEVSIZE / 976000))  ;  DEVSIZE=$(($DEVSIZE * 2)) 
echo $DEVICE $IFDMESG $DEVSIZE  $DEVSIZEG"G .GT. " $SIZEG"G"  ; echo $DEVICE $IFDMESG $DEVSIZE  >> devices 
if test $DEVSIZE -gt 0 ; then
if test $IFDMESG = CD ; then  CDS=$CDS" "$DEVICE0" "  ; fi ;
if test $IFDMESG != CD ; then
if test $IFDMESG = HD ; then  FESTPLATTEN=$FESTPLATTEN" "$DEVICE0" " ; fi ; 
if test $IFDMESG = 0  ; then  USBKEYS=$USBKEYS" "$DEVICE0" " ; fi ;
     if test $DEVSIZEG -gt $SIZEG ; then     # zur Installation geeignet
       SP=0 ; SV=0
#  Groesse und belegter Platz der Partitionen abfragen (falls unmountbar, Groesse nehmen, daher unformatierte Part. vorher loeschen) ,  
#   SP partitioniert. SV voll.  Werte von df um 1/42 erhoehen
       for J in 1 2 3 4 ; do
       PS=0 ; /sbin/fdisk -s -u $DEVICE$J > scr0 ; read PS REST < scr0  # ; echo " PS: " $PS  
       if test $PS -gt 0 ; then SP=$(($SP + $PS))  
       PV=PS ; mkdir -p /$DEVICE0$J ; mount $DEVICE$J /$DEVICE0$J ; IFMOUNT=$?   
       if test $IFMOUNT = 0 ; then df $DEVICE$J > scr ; grep $DEVICE$J scr > scr0 ; read UNW UNW1 PV REST < scr0 ; umount /$DEVICE0$J ; fi ; 
       if test $IFMOUNT != 0 ; then rmdir /$DEVICE0$J  ; fi ;              # kann man auch da lassen. Evtl IFMOUNT = 32.           
       PV0=$(($PV / 64)) ; PV=$(($PV + $PV0)) ; SV=$(($SV + $PV)) ; fi ;   # PS -gt 0
       echo "   Partition " $DEVICE$J "IFMOUNT: " $IFMOUNT " Groesse: " $PS " voll: " $PV  " , Geraet Groesse: " $SP " , voll: " $SV  "  (in k)" 
       done      
       SPG=$(($SP / 976000)) ; UNPARTG=$(($DEVSIZEG - $SPG))  # ;  UNPART=$(($UNPART * 2))     # nicht-partitionierter freier Platz
       echo " partioniert SPG: " $SPG "  unpart. UNPARTG: " $UNPARTG "G"
       SVG=$(($SV / 976000)) ; FREIG=$(($DEVSIZEG - $SVG)) 
       echo " voll SVG: " $SVG "  frei FREIG: " $FREIG "G"
       if test $UNPARTG -gt $UNPARTMAXG ; then NACH0P=$DEVICE ; UNPARTMAXG=$UNPARTG ; fi ;
       if test $FREIG -gt $FREIMAXG ; then NACH0V=$DEVICE ; FREIMAXG=$FREIG ; fi ;
     TARGETS=$TARGETS" "$DEVICE"   \" "$DEVSIZEG" G  ...... "$UNPARTG" G  ....... "$FREIG" G \" "  ; NTARGETS=$(($NTARGETS + 1)) 
     echo "als Install-Geraet getestet: " $DEVICE " , Groesse: " $DEVSIZEG " G , unpartitioniert: " $UNPARTG " G , frei: " $FREIG " G"
     echo "   jetzt beste Kandidaten:  NACH0P : " $NACH0P " , unpart. frei: " $UNPARTMAXG " G" "NACH0V : " $NACH0V " , insg. frei: " $FREIMAXG " G" 
     fi ;   # DEVSIZEG -gt SIZEG 
fi ;   # IFDMESG -ne CD
fi ;   # DEVSIZE -gt 0 
if test $DEVSIZE -le 0 ; then  LEEREGERAETE=$LEEREGERAETE" "$DEVICE0" "  ; fi ; 
fi ;   # AUSGABE = 1
#done
done 

NACH0=$NACH0P ; if test $UNPARTMAXG -lt $SIZEG ; then NACH0=$NACH0V ; fi ;     # Geraet mit meistem Platz ohne / mit Redimensionieren

echo "***" ; echo "*** GEFUNDENE GERAETE    = Festplatten / USB-keys , CDs: " ; echo "***"
echo "***       Angabe sowohl als /dev/sda,hda  als auch als path, daher jede device doppelt: "
cat devices
echo $FESTPLATTEN >> festplatten ; echo $USBKEYS >> usbkeys ; echo $CDS >> cds ; echo $LEEREGERAETE >> leeregeraete
echo "***  davon Festplatten : " $FESTPLATTEN ; echo "***  davon USB-Geraete : " $USBKEYS  ; echo "***  davon CDs : " $CDS 
echo "***  leere Geraete, zBsp CD-Leser ohne CD drin : " $LEEREGERAETE  ; echo "***"
echo "***** empfohlenes Geraet fuer eine Installation : " $NACH0
 

# 2.2. Bewertung                       (was wir davon als Install-CD und als Ziel-Festplatte nehmen)

#  Mindestens irgendein DVD-Drive finden, um  copysys fuer /dev/cdrom  benutzen
grep "CD" devices > scr0  
read DEVCDROM REST < scr0           
if test $? -eq 0 ; then DEVCDROM=$DEVCDROM ; echo $DEVCDROM > devcdrom   ; else  DEVCDROM=- ; fi ; 

# 2.2.1  Install-Quelle :  DVD oder Datei  SYS_Linux.iso  auf einer Partition
echo "***" ; echo "*** Install-CDs  " ; echo "***"           # Hier /von mounten und gemountet lassen
VON=-
echo " 1. DVD-Suche: CD-Geraete mit Groesse -gt 0"
grep -v " 0" scr0 > scr1  
echo " CD-Devices  mit eingelegtem CD:      erste wird als Install-Quelle benutzt " ; cat scr1 
read VON UNW SIZE00 REST < scr1    # erstes CD mit Groesse .ne. 0 als Install-CD VON angesehen.  SIZE immer 4.7 GB, nicht verwenden 
if test $? -eq 0 ; then VON=$VON   ; else  VON=- ; fi ;     # Weil in Linux alles so bescheuert ist ... hier waere 'continue' gut

if test $VON != - ; then  umount $VON ;  mount $VON /von -t udf -o ro,unhide ; fi ;  
echo " 1. DVD-Suche beendet , 2.2.1  ,   VON = " $VON

# 2.2.1.1 Nochmal sorgfältig  suchen ob irgendwo ein  DVD vhd ... 
echo " 2. DVD-Suche: eingelegte DVDs suchen"
if test $VON = - ; then
for I0 in hda hdb hdc hdd sda sdb sdc sdd uba ubb ubc ubd sr0 sr1 sr2 sr3 $DEV1 $DEV2 $DEV3 $DEV4 ; do
if test $VON = - ; then                                # damit nichts anderes mehr gemountet wird  nachdem CD gefunden 
# test /dev/$I0 = $NACH0 ; if test $? -ne 0 ; then        
umount /dev/$I0   ; mount /dev/$I0 /von -t udf -o ro,unhide  ;  if test $? -eq 0 ; then VON=/dev/$I0 ; fi ; 
echo " getestet:  /dev/"$I0   "    VON = " $VON   
# fi ;   
fi ; 
done
echo " 2. DVD-Suche beendet , 2.2.1.1   ,  VON = " $VON
fi ; 

if test $VON != - ; then ls /von/SYS_Linux.ext3.lzma ; if test $? -ne 0 ; then 
echo "DVD gefunden in " $VON " ist kein SYS-Install-DVD. " ; umount /von ; VON=- ; fi ; fi ;     


if test $VON != - ; then DEVCDROM=$VON ; fi ;  
echo $DEVCDROM > devcdrom           # falls VON ein Install-DVD ist, sein Geraet spaeter als /dev/cdrom definieren 
echo $DEVCDROM " wird im installierten System als /dev/cdrom , /dev/dvd definiert" 
rm -f /dev/dvd ; rm -f /dev/cdrom ; ln -s $DEVCDROM /dev/dvd ; ln -s $DEVCDROM /dev/cdrom
echo " ... und auch jetzt schon hier im Install/Rescue System" ; ls -l /dev/cdrom ; ls -l /dev/dvd

# 2.2.1.2 Suchen ob eine Datei SYS_Linux.iso auf einer Partition vhd  (nachrangig nach ggf. eingelegtem DVD)  
if test $VON = - ; then
echo "***" ; echo "*** Install-.iso-Datei suchen: " ; echo "***" 
for J0 in 1 2 3 4  ; do
for I0 in sda hda sdb hdb sdc hdc sdd hdd uba ubb ubc ubd  $DEV1 $DEV2 $DEV3 $DEV4 ; do          # sr0 sr1 sr2 sr3
# hier kann ruhig vorrangig auf sda also usb-keys vor hda gesucht werden
if test $VON = - ; then                                # damit nichts anderes mehr gemountet wird  nachdem .iso gefunden 
mkdir /$I0$J0 ; /bin/mount /dev/$I0$J0 /$I0$J0         # Nur in initrd noetig, außerhalb Partition mit .iso als gemountet angesehen  
umount /von ; mount /$I0$J0/SYS_Linux.iso  /von -t udf -o ro,unhide,loop  
if test $? -eq 0 ; then VON=/$I0$J0/SYS_Linux.iso ; fi ; 
if test $VON = - ; then rmdir  /$I0$J0   ; fi ;
echo " getestet:  /dev/"$I0$J0   "    VON = " $VON   
fi ;  
done ; done 
if test $VON != - ; then echo " Datei SYS_Linux gefunden,      VON = " $VON  "  , als /von gemountet " ; fi ;   
echo " Datei SYS_Linux.iso -Suche beendet , 2.2.1,   VON = " $VON
fi ; 


if test $VON = - ; then  echo " Install-CD nicht da. Abbruch Installation, -> Rescue" ; echo "12  Install-CD nicht da" > problem ; exit ; fi ;
echo "Auf Install-DVD oder .iso gefunden,  unter /von  gemountet: "
ls -l /von

# 3. Groesse der Installation          (Groesse des Install-CDs, Kompaktrate, Sicherheit)

KOMPAKT10=39                #  10-fache max. Kompakt-Rate,  die bei lzma = 3.8 ... 4.2 ist  .  Besser zu hoch waehlen
SIZEMIN=20000000            #  Mindestgroesse der Installation in Sektoren jedenfalls .  Hier normalerweise ruhig GrÃ¶sse des Instal-DVDs
                               #  nur fÃ¼r Tests / kleines .img  einen kleinen Wert

#mount $VON /von              # Ist von oben noch gemountet 
df | grep -v "tmpfs" ;  df -k | grep -v "tmpfs" > df0        
Z0=0
grep "/von" df0 > scr0       #  Geraet oft als  /dev/loop/0 statt $VON  bezeichnet, daher nach /von suchen 
# Problem: bei langen Namen wie hda1/SYS_Linux.iso setzt Ausgabe von df auf naechster Zeile fort ...
#if test $? -eq 0 ; then read UNW1 SIZE00ALT SIZE00 UNW2 VONALT VONNORMAL REST < scr0 ;  fi ;       #  SIZE00 : Groesse des Install-CD in k
if test $? -eq 0 ; then read UNW1 SIZE00  REST < scr0 ;  fi ;   # wir nehmen den 2. Wert der ist immer richtig
#echo " VONNORMAL " $VONNORMAL  ; echo " VONALT " $VONALT  
#echo " alle: " $UNW1 $SIZE00ALT "SIZE00:" $SIZE00 $UNW2 "VONALT:" $VONALT "VONNORMAL:" $VONNORMAL
#if test $VONNORMAL = "/von" ; then SIZE00=$SIZE00 ; fi ; echo " == " ;    if test $VONALT = "/von" ; then SIZE00=$SIZE00ALT ; fi ;    
echo " *** device /von : " ; cat scr0 ; echo " ... also Groesse Install-.iso in k:   SIZE00 : " $SIZE00
if test $SIZE00 -gt 0 ; then SIZE00=$SIZE00 ; else SIZE00=4500000 ; fi ;
SIZE=$(($SIZE00 * 2 * $KOMPAKT10 / 10))     # minimale Groesse der Installation in k, de facto wird mehr Platz genommen falls auf $NACH0 frei 
echo "SIZE: " $SIZE  " SIZEMIN " $SIZEMIN   # SIZE, SIZEMIN in Sektoren
test $(($SIZE - $SIZEMIN)) -gt 0 ;   if test $? -ne 0 ;  then SIZE=$SIZEMIN ; fi ;
echo " *** Groesse Install-CD Sektoren:  " $(($SIZE00 * 2))  "  Benoetigter Platz / Neue Partition Sektoren:  "  $SIZE  "   mindestens:"   $SIZEMIN      
SIZEG=$(($SIZE / 1952000))     # Sinnvoll zu verlangen dass in TARGETS nur solche Festplatten mit DISKSIZEG -gt SIZEG kommen

# Aus TARGETS zu kleine Platten rauswerfen, und brauchbare Geraete zaehlen.  Wir machen das einstweilen oben 
echo $NTARGETS $TARGETS > targets 
#read UNW NACH0 REST < targets   #  Als NACH0 oben Geraet mit groesstem nicht-part. Platz nehmen
echo "***  " $NTARGETS "potentielle Install-Geraete  HD/USB : " $TARGETS " , empfohlen NACH0 : " $NACH0 ; echo "***"
if test $NTARGETS = 0 ; then  echo "11  Festplatte zu klein fuer Instalation" > problem ; exit ; fi ;  # kuenftig ggf. andere Platten suchen
if test $NACH0 != - ; then NACH0=$NACH0  ; else echo " Festplatte Install-Ziel nicht da. Abbruch Installation, -> Rescue"  
echo "13 Ziel nicht da"> problem ; exit ; fi ;           # sollte an sich nicht vorkommen


echo "***" ; echo "*** Installation von:  " $VON "  Groesse:" $SIZE00 " Sektoren" ; echo "***" 
 


echo " mkdev Ende: TST SIZE NACH0 NACH VON KLEINER OLDSYS WINDOWS: "  
echo  $TST $SIZE $NACH0 $NACH $VON $KLEINER $OLDSYS $WINDOWS    
echo  $TST $SIZE $NACH0 $NACH $VON $KLEINER $OLDSYS $WINDOWS  > installinfo         


exit  





