#!/bin/ash

# Sucht GERTE - nicht PARTITIONEN - VON wovon gelesen und NACH0 wohin installiert wird
# lt 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  
# Diese /hda , /sda suchen wir unten einfach ab statt sie kompliziert aus- und einzulesen

echo -e "\c" > devices

echo "***" ; echo "*** Test Geraete mit hdparm   = Festplatten, CDs: " ; echo "***"
###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 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 ; 
if test $AUSGABE -ne 0 ; then DEVSIZE=$(($DEVSIZE * 2)) ; echo $DEVICE $IFDMESG $DEVSIZE >> devices ; fi ;
#done
done 
echo "***" ; echo "*** Gefundene Geraete    = Festplatten, CDs: " ; echo "***"
echo "***       Angabe sowohl als /dev/sda,hda  als auch als path, daher jede device doppelt: "
cat devices

 

# 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 > 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 ; 
echo " 1. DVD-Suche beendet , 2.2.1  ,   VON = " $VON

# 2.2.1.1 Nochmal sorgfltig  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 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 ; 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" 

# 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 sr0 sr1 sr2 sr3 $DEV1 $DEV2 $DEV3 $DEV4 ; do
# 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, auerhalb 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 ; 
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


# 2.2.2  Install-Ziel  Festplatte wohin installiert wird  
echo "***" ; echo "*** Install-Festplatten " ; echo "***"
NACH0=- 
#grep "HD" devices > scr0
#grep -v " 0" scr0 > scr1       # Festplatten Groesse 0 sollte man sowieso verbieten ...
# Wir suchen nach allem was nicht CD ist, um auch USB-keys mit Kennung 0 zu bekommen      
grep -v "CD" devices > scr1
echo " HD-Devices:      erste wird als Install-Ziel benutzt" ; cat scr1 
#cat scr1 > scr0 ; sort -o scr1 -r -n -k 3 scr0    ;  echo " Devices nach Groesse sortiert: " ; cat scr1 
read NACH0 UNW DISKSIZE REST < scr1           # erste HD mit Groesse .ne. 0 als Install-Platte NACH0 angesehen 
if test $? -eq 0 ; then NACH0=$NACH0  ; else  NACH0=- ; fi ;
if test $NACH0 != - ; then NACH0=$NACH0  ; else echo " Festplatte Install-Ziel nicht da. Abbruch Installation, -> Rescue"  
echo "13 Ziel nicht da"> problem ; exit ; fi ;

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

echo " *** mkpart nach 2.2 "  


# 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 jedenfalls    , in Sektoren   .  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 
if test $? -eq 0 ; then read UNW1 UNW2 SIZE00 REST < scr0 ;  fi ;       #  SIZE00 : Groesse des Install-CD in k
if test $SIZE00 -gt 0 ; then SIZE00=$SIZE00 ; else SIZE00=2500000 ; fi ;
SIZE=$(($SIZE00 * 2 * $KOMPAKT10 / 10))     # minimale Groesse, de facto wird mehr Platz genommen falls auf $NACH0 frei 
echo "SIZE: " $SIZE  " SIZEMIN " $SIZEMIN
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      
if test $DISKSIZE -lt $SIZE ; then  echo "11  Festplatte zu klein fuer Instalation" > problem ; exit ; fi ;  # kuenftig ggf. andere Platten suchen


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         
echo  $DISKSIZE > disksize 


exit  

