#!/bin/ash


echo " *** mkpart ***   "
echo "Sucht zur Installierung freien Platz auf der Festplatte oder  Partitionen die abgeschnitten werden können"

# Aufruf durch  init 

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

ls / 
ls /sbin/parted


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 

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


# 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 "Part.Tafel von " $NACH0 " , Ausgabe direkt:"
/sbin/parted -s /dev/hda unit s  print 
/sbin/parted -s /dev/hda unit s  print > parts0 
echo "parts0:"  ; cat parts0 
grep -e "Disk" parts0 > scr
echo "scr:" ; cat scr 
sed 's/s/ /g'  scr > tmp0
echo "tmp0:" ; cat 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

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
sleep 30  
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
echo "*** 1 ***"
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 
sleep 5

#  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  
sleep 30
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  
sleep 20                                      

# kleinste Nr. Partition suchen die noch nicht benutzt ist:
sort -n -k 1 tmp0 > tmp1        #  Nach Reihenfolge geordnet  
echo "Nach Reihenfolge geordnet:"
cat tmp1
(read A1 REST ; read A2 REST ;  read A3 REST ;  read A4 REST 
echo $A1 $A2 $A3 $A4 > tmp00 ) < tmp1
read A1 A2 A3 A4 < tmp00
echo "A1 A2 A3 A4 :" $A1 $A2 $A3 $A4 
NACHNR=5                #  5 falls 1,2,3,4 schon da
test $A4 = 4 ; if test $? -ne 0 ; then NACHNR=4 ; fi ; 
test $A3 = 3 ; if test $? -ne 0 ;then NACHNR=3 ; fi ; 
test $A2 = 2 ; if test $? -ne 0 ;then NACHNR=2 ; fi ; 
test $A1 = 1 ; if test $? -ne 0 ;then NACHNR=1 ; fi ; 
# ggf. extended Part. ausschliessen
#echo  $NACHNR > tmp3  
echo "NACHNR:" $NACHNR
sleep 10



# 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"  ;   echo " vhd. Partition kleiner machen:  "  ;  fi ;
if test $AA -ge $SIZE  ;   then   STATUS="-1"  ; echo " *** Platz reicht um neue Partition zu machen *** " ; fi ; 



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 " Kandidaten fuer verkleinernde Partitionen, Reihenfolge: " ; cat parts0
sleep 20  

read KLEINER S1 S2  SIZE0 REST < parts0   
echo " read für KLEINER S1 S2 SIZE0 REST: "  $KLEINER $S1 $S2 $SIZE0 $REST 
echo $KLEINER | grep -o "[1-4]" > tmp0
read KLEINERNR < tmp0
echo " read fr KLEINERNR: "  $KLEINERNR
echo " Partition verkleinern: "  $KLEINER  "    "  $KLEINERNR  "  Sektor Anfg, Ende,  Bloecke: "  $S1 "  " $S2 "  " $SIZE0
sleep 20

# 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,  Name, Nr, Track von bis: "  $KLEINER "  " $KLEINERNR  "    "  $S1  "   "  $S2  
#echo " *** Partitionen verkleinern momentan abgestellt, nur angegeben aber nicht gemacht"     #### spaeter anstellen
/sbin/parted $NACH0 rm $KLEINERNR
/sbin/parted $NACH0 unit s mkpart p ext3 $S1 $S2
#/sbin/parted $NACHNR unit s resize $KLEINERNR $S1 $S2         falls Module für ntfs resize vhd 
STATUS="-1"
fi ;    


if test $STATUS = "-1"  ;  then  
# 4.2 Platz vhd, Partition machen
#read NACHNR REST < tmp3 
 if test $NACHNR = 5 ; then
  NACHNR=4
    if test $NACHNR -eq $KLEINERNR ; then  NACHNR=$(($NACHNR-$EINS)) ; fi ;   
  echo "Part. " $NACHNR  " nicht geloescht, nur desaktiviert da Nr. benutzt, mit fdisk wieder aktivierbar selbe Zyl-Nrmn" 
  /sbin/parted $NACH0 rm $NACHNR
 fi ;
NACH=$NACH0$NACHNR
echo " Partition benutzen: "  $NACH  "    "  $NACHNR
echo " Platte / Partition benutzen:  NACH0 , NACHNR , NACH  " $NACH0 "  "  $NACHNR "   "  $NACH 
echo " Groesse von/bis XX , YY : "  $XX  "   "  $YY  "  "
sleep 30
# Partition NACHNR machen: 
/sbin/parted $NACH0 -s  unit s mkpart "primary" "ext3"  $XX $YY  
fi ;


# 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 $NACH -s unit s  print
echo "Alle Partitionen insgesamt: "
/sbin/parted $NACH0 -s  print



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


STATUS="1" 


