#!/bin/ash

#echo "Sucht zur Installierung freien Platz auf der Festplatte oder  Partitionen die abgeschnitten werden können"
echo " 1. Freien Platz finden oder grsste bestehende Partition kleiner machen"



# Aufruf durch  init 

#                                                                  (c) 2007 werner@copaya.yi.org  

#ls / 


STATUS=-3                                    #   -2  kein Platz da    -1 Platz da, Part. ist zu machen     1 Partition fertig

# 0. Neu zu machende Partition
SIZEMIN=200000          #  in Sektoren
read SIZE REST < installdevice     # Uebergabe von aussen 

echo "SIZE: " $SIZE  " SIZEMIN " $SIZEMIN
test $(($SIZE - $SIZEMIN)) -gt 0 ;   if test $? -ne 0 ;  then SIZE=$SIZEMIN ; fi ;
echo " *** Neue Partition Bloecke:  "  $SIZE   $SIZEMIN      


echo " TEST 1"

# 1. Partitionstafel erhalten

/sbin/parted -ls > parts0                     #/sbin/parted /dev/hda unit s  print  ;   /sbin/parted /dev/hda mkpart p ext3 0 1G   

echo " vorhandene Partitionen: "
cat parts0
grep -e "/dev/sda" parts0
#/sbin/parted /dev/sda print 
if test $? -eq 0  ;  then NACH0=/dev/sda ; fi ;
grep -e "/dev/hda" parts0
#/sbin/parted /dev/hda print 
if test $? -eq 0  ;  then NACH0=/dev/hda ; fi ;
echo " Device benutzen: "  $NACH0

echo "TEST 2"

#echo "Part.Tafel von " $NACH0 
#/sbin/parted -s $NACH0 unit s  print 
/sbin/parted -s $NACH0 unit s  print > parts0 
grep -e "Disk" parts0 > scr
sed 's/s/ /g'  scr > tmp0
read A1 A2 A3 DISKSIZE REST < tmp0     # size in Sektoren
#echo "Harddisk Groesse: "   $DISKSIZE 

grep "primary" parts0 > parts          # parts enthaelt nur Partitionen 1-4 
grep "extended" parts0 >> parts


# 2. Feststellen ob/wo grösster freier Platz auf Platte vh

echo "TST3"

sort -n -k 2 parts > parts0        #  Nach Reihenfolge geordnet  
#echo "Partitionen nach Reihenfolge auf Platte sortiert: "
#cat parts0
sed 's/s/ /g'  parts0 > tmp0
#echo " Nach Loeschen des Textes:"
#cat tmp0
A1=0 ; A2=0 ; A3=0 ; A4=0 ; X1=1 ; X2=1 ; X3=1 ; X4=1 ; Y1=1 ; Y2=1 ; Y3=1 ; Y4=1
( read A1  X1  Y1  REST  ;  read A2  X2  Y2  REST  ;    read A3  X3  Y3  REST  ;  read A4  X4  Y4  REST  ;  
echo $A1 $X1 $Y1 $A2 $X2 $Y2 $A3 $X3 $Y3 $A4 $X4 $Y4 > tmp00 ) < tmp0
read A1 X1 Y1 A2 X2 Y2 A3 X3 Y3 A4 X4 Y4 < tmp00
#echo "Partitionen Nr/Anfg/Ende"  $A1 " " $X1 " " $Y1  " " $A2 " " $X2 " " $Y2 
#echo "Partitionen Nr/Anfg/Ende"  $A3 " " $X3 " " $Y3  " " $A4 " " $X4 " " $Y4  
#echo "DISKSIZE :" $DISKSIZE 


echo "TST 4"

#  Zu jeder Partition J den vorigen J-1 und den folgenden J Zwischenraum bestimmen:
EINS=1 
test $A1 -le 0 ; if test $? -eq 0 ; then  X1=$DISKSIZE ; Z0=$DISKSIZE ; fi ;                   # falls keine Partition da
#  echo " Part. 0: " $Z0 
test $A1 -gt 0 ; if test $? -eq 0 ; then  X1=$(($X1-$EINS)) ; Z0=$(($X1-$EINS)) ; Z1=$(($DISKSIZE-$Y1)) ; fi ;
#  echo " Part. 1: " $Z0 $Z1
test $A2 -gt 0 ; if test $? -eq 0 ; then  X2=$(($X2-$EINS)) ; Z1=$(($X2-$Y1)) ; Z2=$(($DISKSIZE-$Y2)) ; fi ;
#  echo " Part. 2: " $Z1 $Z2
test $A3 -gt 0 ; if test $? -eq 0 ; then  X3=$(($X3-$EINS)) ; Z2=$(($X3-$Y2)) ; Z3=$(($DISKSIZE-$Y3)) ; fi ;
#  echo " Part. 3: " $Z2 $Z3
test $A4 -gt 0 ; if test $? -eq 0 ; then  X4=$(($X4-$EINS)) ; Z3=$(($X4-$Y3)) ; Z4=$(($DISKSIZE-$Y4)) ;  fi ;
#  echo " Part. 4: " $Z3 $Z4
echo " " > tmp2
echo  $Z0  "   "  1    >> tmp2
echo  $Z1  "   "  $Y1   >> tmp2  
echo  $Z2  "   "  $Y2   >> tmp2
echo  $Z3  "   "  $Y3    >> tmp2
echo  $Z4  "   "  $Y4   >> tmp2   
#echo "  Zwischenrume auf der Platte:  " 
#echo $Z0 " ab " 1  " ; " $Z1 " ab " $Y1 " ; " $Z2 " ab " $Y2 " ; "  $Z3 " ab " $Y3 " ; "  $Z4 " ab " $Y4   
#echo "Zw. unsortiert:"  ; cat  tmp2  
sort  -o tmp1 -r  -n  -k 1   tmp2           # Zwischenraeume nach Groesse sortieren
#echo "Zw. sortiert:" ; cat tmp1
read AA XX  REST < tmp1                    # Groesse, Anfang, Ende des groessten freien Platzes 
YY=$(($XX+$AA))
#echo "Groesster freier Platz auf der HD, und Zwischenräume sortiert"  $AA  "   "  $XX  "    "  $YY  

# kleinste  Part-Nr suchen die noch nicht benutzt ist:
# Falls alle 4 benutzt, wird hchste Part-Nr die nicht extended ist und nicht verkleinert wird, desaktiviert aber nicht gelscht   
sort -n -k 1 tmp0 > tmp1        #  Nach Reihenfolge geordnet  
#echo "Nach Reihenfolge geordnet:"
#cat tmp1
(read A1 X1 Y1 Z1 ART1 SY1 REST ; read A2 X2 Y2 Z2 ART2 SY2 REST ;  read A3 X3 Y3 Z3  ART3 SY3 REST ;  read A4 X4 Y4 Z4 ART4 SY4 REST 
SY1=fs$SY1 ; SY2=fs$SY2 ; SY3=fs$SY3 ; SY4=fs$SY4            #  da extended keinen Wert haben, gaebe Probleme bei naechstem Lesen
echo $A1 $ART1 $SY1 $A2 $ART2 $SY2 $A3 $ART3 $SY3 $A4 $ART4 $SY4 > tmp00 ) < tmp1
read A1 ART1 SY1 A2 ART2 SY2 A3 ART3 SY3 A4 ART4 SY4 < tmp00
#echo "A1 ART1 A2 ART2 A3 ART3 A4 ART4 :" $A1 $ART1 $A2 $ART2 $A3 $ART3 $A4 $ART4 
EXTNR=5 ; NACHNR=5                #  5 falls 1,2,3,4 schon da
test $A4 = 4 ; if test $? -ne 0 ; then NACHNR=4 ; else test $ART4 = "extended" ; if test $? -eq 0 ; then EXTNR=4 ; fi ; fi ; 
test $A3 = 3 ; if test $? -ne 0 ; then NACHNR=3 ; else test $ART3 = "extended" ; if test $? -eq 0 ; then EXTNR=3 ; fi ; fi ;
test $A2 = 2 ; if test $? -ne 0 ; then NACHNR=2 ; else test $ART2 = "extended" ; if test $? -eq 0 ; then EXTNR=2 ; fi ; fi ;
test $A1 = 1 ; if test $? -ne 0 ; then NACHNR=1 ; else test $ART1 = "extended" ; if test $? -eq 0 ; then EXTNR=1 ; fi ; fi ;
echo "  ************  extended soll 4 sein:  "  $EXTNR " ********************** "

# ggf. extended Part. ausschliessen
#echo "NACHNR:" $NACHNR  "EXTNR:" $EXTNR
echo "TST5"


# 3. Testen ob freier Platz ausreicht, sonst eine Partition kleiner machen

#echo " max. Zwischenraum auf Disk: "  $AA "  Groesse der zu machenden Partition:  "  $SIZE   "  Zylinder"
if test $AA -lt $SIZE  ;   then   STATUS="-2"  ; fi ;  #  echo " vhd. Partition kleiner machen:  "  ;  
if test $AA -ge $SIZE  ;   then   STATUS="-1"  ; fi ;  # echo " *** Platz reicht um neue Partition zu machen *** " ;  


echo " ********* STATUS  "    $STATUS




echo "TST6"



if test $STATUS = "-2"  ;  then  
# 4.1  Disk voll, erst eine Partition kleiner machen

sort -o parts -r -n -k 4  tmp0 
grep "NTFS" parts > parts0             # Prioritt für ggf. zu verkleinernde Partitionen wenn Platz gebraucht wird
grep "fat" parts >> parts0
grep "ext4" parts >> parts0
grep "ext3" parts >> parts0
grep "ext2" parts >> parts0
grep "reiser" parts >> parts0
sort -o tmp0 -r  -k 5  parts0          # extended nachrangig primary
#cat tmp0 parts0 

echo "TEST7"

#echo " Kandidaten fuer verkleinernde Partitionen, Reihenfolge: " ; cat parts0

read KLEINERNR S1 S2  SIZE0 REST < parts0   
KLEINER=$NACH0$KLEINERNR
#echo " Partition verkleinern: "  $KLEINER  "    "  $KLEINERNR  "  Sektor Anfg, Ende,  Bloecke: "  $S1 "  " $S2 "  " $SIZE0


echo "  *******kleiner:  "  $KLEINER


# Neuer freier Platz von XX bis YY
YY=$S2
EINS=1
XX=$(($YY-$SIZE))
S2=$(($XX-$EINS))

#echo " *** Zum Einrichten einer neuen Partition wird eine bestehende verkleinert *** "
#echo "verkleinerte Partition: Platte, Name, Nr, Track von bis: " $NACH0 "  "  $KLEINER "  " $KLEINERNR  "    "  $S1  "   "  $S2  
SIZEKLEINER=$(($S2-$S1)) ; SIZEKLEINER=$(($SIZEKLEINER / 2))k
echo " zu verkleinernden Partition / neue Groesse: "  $KLEINER "   " $SIZEKLEINER   "   in k ;   Filesystem: "  $SY$KLEINERNR 
#echo " *** Partitionen verkleinern momentan abgestellt, nur angegeben aber nicht gemacht"     #### spaeter anstellen
# umount $KLEINER
#echo " erster Versuch mit parted:"
#/sbin/parted -s $NACH0 unit s resize $KLEINERNR $S1 $S2   # das funktioniert fast nie
#echo " ... danach mit resize2fs usw:"  

echo " ***  KLEINER  SIZEKLEINER SYS.KLEINERNR : *** "  $KLEINER  $SIZEKLEINER  $SY$KLEINERNR

test $SY$KLEINERNR = fsext2 ; if test $? -eq 0 ; then resize2fs -f -p $KLEINER $SIZEKLEINER ; echo "1**"; fi ;      # geht nicht mit Sektoren
test $SY$KLEINERNR = fsext3 ; if test $? -eq 0 ; then resize2fs -f -p $KLEINER $SIZEKLEINER ; echo "2**" ; fi ;    # geht nicht mit Sektoren
test $SY$KLEINERNR = fsext4 ; if test $? -eq 0 ; then resize2fs -f -p $KLEINER $SIZEKLEINER ; echo "3**" ; fi ;      # geht nicht mit Sektoren
test $SY$KLEINERNR = fsext4dev ; if test $? -eq 0 ; then resize2fs -f -p $KLEINER $SIZEKLEINER ; echo "4**" ; fi ;      # geht nicht mit Sektoren
test $SY$KLEINERNR = fsreiserfs ; if test $? -eq 0 ; then resize_reiserfs -s  $SIZEKLEINER -f $KLEINER ; echo "5**" ; fi ;
test $SY$KLEINERNR = fsNTFS ; if test $? -eq 0 ; then ntfsfix $KLEINER  ;  ntfsresize -f -s $SIZEKLEINER  $KLEINER ; fi ;
/sbin/parted -s $NACH0 rm $KLEINERNR                       #  Partition hinten absbeln egal ob Filesystem verkleinert oder nicht
echo "parted: ***"
test $SY$KLEINERNR = fsNTFS ; if test $? -eq 0 ; then /sbin/parted -s $NACH0 unit s mkpart primary NTFS $S1 $S2 ; echo "6**" ; fi ;
test $SY$KLEINERNR = fsNTFS ; if test $? -ne 0 ; then /sbin/parted -s $NACH0 unit s mkpart primary ext3 $S1 $S2 ; echo "7** " ; fi ;
STATUS="-1"
fi ;    

echo "TEST8"


   echo "KLEINER: " $KLEINERNR 
   echo "kleiner, sizekleiner, syskleinernr"   $KLEINER    $SIZEKLEINER   $SYS$KLEINERNR
   echo $NACHNR  $EXTRANR


echo "status, nachnr, kleinernr"  $STATUS  $NACHNR  $EXTNR  $KLEINERNR


if test $STATUS = "-1"  ;  then  
# 4.2 Platz vhd, Partition machen
 if test $NACHNR = 5 ; then
  NACHNR=4 ; if test $NACHNR = $EXTNR ; then NACHNR=3 ; fi ;
echo " schon 4 Part. vhd: vhd. Partition" $NACHNR " wird in fdisk ausgeschaltet, um Nr. fr neue Part. zu benutzen, "
echo " wird aber nicht gelscht und kann durch Eintippen ihrer Grenzen in fdisk wieder benutzt werden" 
    if test $NACHNR -eq $KLEINERNR ; then  NACHNR=$(($NACHNR-$EINS)) ; fi ;
    
    echo $NACH0  $NACHNR
       
  /sbin/parted $NACH0 rm $NACHNR
 fi ;
 NACH=$NACH0$NACHNR

echo "status, nachnr, kleinernr"  $STATUS  $NACHNR  $EXTNR  $KLEINERNR


#echo " Platte / Partition benutzen:  NACH0 , NACHNR , NACH  " $NACH0 "  "  $NACHNR "   "  $NACH 
#echo " Groesse von/bis XX , YY : "  $XX  "   "  $YY  "  "
# Partition NACHNR machen: 
/sbin/parted -s $NACH0  unit s mkpart primary ext3  $XX $YY 
sync
fi ;

echo "TEST9"

# 4.3.  Hier ggf. nochmal Groesse ueberpruefen und wenn  wenn was nicht iO mit leicht geaenderten Bedingungen bzgl Groesse
#   o.ae. nach oben springen
#echo " *** INSTALL-DRIVE , DEVICE SOLLTEN JETZT DA SEIN:  "  $NACH0   "    "  $NACH  
#/sbin/parted -s $NACH  unit s  print
#echo "Alle Partitionen: "
#/sbin/parted -s $NACH0   print


# 5. Parameteruebergabe nach aussen
echo $SIZE  "  "  $NACH0 "  " $NACH  "  " $VON "  "  $KLEINER > installdevice
echo "neue Partition: Platte,  Name, Nr, Track von bis:   " $NACH0 "  "  $NACH "  " $NACHNR  "    "  $XX  "   "  $YY  


STATUS="1" 

    
echo "TEST10   Ende mkpart"


