#!/bin/bash
# Under the terms of the 'COPYRIGHT.TXT' file.

# Funciones.

# Una funcin para preguntar el punto de montaje y crear el fstab temporal:
ask_mountpoint() {
  dialog \
   --backtitle "Establishing the Linux partitions" \
   --title "MOUNT POINT" --cancel-label "- Back" \
   --inputbox "\nEnter a mount-point for '${PARTITION}':" \
    10 41 2> ${TMP}/return-mountpoint

  MNTPOINT=$(cat ${TMP}/return-mountpoint)

  if [[ -n $MNTPOINT ]]; then
    if [[ $MNTPOINT = / ]]; then
      # Agrega la particin root al fstab temporal:
      printf "%-15s %-15s %-11s %-16s %-5s %s\n" \
       "$PARTITION" "$MNTPOINT" "$TYPE_FS" "defaults" "1" "1" >> ${TMP}/fstab
    else  # Agrega las particiones no-root:
      printf "%-15s %-15s %-11s %-16s %-5s %s\n" \
       "$PARTITION" "$MNTPOINT" "$TYPE_FS" "defaults" "1" "2" >> ${TMP}/fstab
    fi
  fi

  # Elimina posibles entradas repetidas:
  if [[ -f ${TMP}/fstab ]]; then
    if [[ $(grep -c "^$PARTITION" ${TMP}/fstab) -eq 2 ]]; then
      repeated="$(grep -m1 -n "^$PARTITION" ${TMP}/fstab)"
      repeated=${repeated%%:*}
      sed -i "${repeated}d" ${TMP}/fstab
    fi
  fi
}

# Una funcin para determinar el tamao de una particin:
get_size() {
  GSIZE="$(probe -l 2>/dev/null | grep "^$1" | tr -d '[*+]' | awk '{ print $4 }')"
  echo "$GSIZE"
}

mk_xext() {
  local name
  name="$1"
  PSIZE=$(get_size $PARTITION)
  dialog \
   --title "FORMAT (${name})" \
   --ok-label "Format" --no-cancel \
   --checklist \
    "$PARTITION - $PSIZE K" 0 0 0 \
    "$PARTITION" "Check for bad blocks" off \
     2> ${TMP}/return-mk_xext
  if (( $? == 0 )); then
    MK_EXT=$(cat ${TMP}/return-mk_xext)
    if [[ -z $MK_EXT ]]; then
      dialog --title "$name (${PARTITION})" --sleep 1 \
       --infobox "Formatting without checking bad blocks..." 3 45
      mkfs.${name} $PARTITION 1> $OUTPUT_TTY 2>&1
    else
      dialog --title "$name (${PARTITION})" --sleep 1 \
       --infobox "Formatting and checking bad blocks..." 3 41
      mkfs.${name} -c $PARTITION 1> $OUTPUT_TTY 2>&1
    fi
  fi
}

mk_jfs() {
  PSIZE=$(get_size $PARTITION)
  dialog \
   --title "FORMAT (jfs)" \
   --ok-label "Format" --no-cancel \
   --checklist \
    "$PARTITION - $PSIZE K" 0 0 0 \
    "$PARTITION" "Check for bad blocks" off \
     2> ${TMP}/return-mk_jfs
  if (( $? == 0 )); then
    MK_JFS=$(cat ${TMP}/return-mk_jfs)
    if [[ -z $MK_JFS ]]; then
      dialog --title "jfs (${PARTITION})" --sleep 1 \
       --infobox "Formatting without checking bad blocks..." 3 45
      jfs_mkfs -q $PARTITION 1> $OUTPUT_TTY 2>&1
    else
      dialog --title "jfs (${PARTITION})" --sleep 1 \
       --infobox "Formatting and checking bad blocks..." 3 41
      jfs_mkfs -c -q $PARTITION 1> $OUTPUT_TTY 2>&1
    fi
  fi
}

mk_xfs() {
  PSIZE=$(get_size $PARTITION)
  dialog \
   --title "FORMAT (xfs)" --sleep 2 \
   --infobox "Formatting $PARTITION - $PSIZE K" 3 40
  if (( $? == 0 )); then
    mkfs.xfs -f $PARTITION 1> $OUTPUT_TTY 2>&1
  fi
}

# Men de formato:
format() {
  local CODE
  dialog \
   --backtitle "Establishing the Linux partitions" \
   --title "$PARTITION" \
   --yesno "\nDo you want to specify a format?\n" 7 36
  CODE=$?
  if (( $CODE == 0 )); then
    dialog  \
     --backtitle "Establishing the Linux partitions" \
     --title "FORMAT" \
     --default-item "ext3" --menu \
"Specify the type of file system which \
will format the partition '${PARTITION}':" 8 46 0 \
     "ext2" "Second extended filesystem" \
     "ext3" "Third  extended filesystem" \
     "ext4" "Fourth extended filesystem" \
     "jfs"  "A file system developed by IBM" \
     "xfs"  "A file system developed by SGI" \
      2> ${TMP}/return-format
    if (( $? == 0 )); then
      umount $PARTITION 1> /dev/null 2>&1
      TYPE_FS=$(cat ${TMP}/return-format)
      case "$TYPE_FS" in
        ext2)  mk_xext ext2;;
        ext3)  mk_xext ext3;;
        ext4)  mk_xext ext4;;
        jfs)   mk_jfs;;
        xfs)   mk_xfs;;
      esac
    fi
  elif (( $CODE == 1 )); then
    # Determina el tipo de sistema de archivos para el fstab temporal,
    # en caso de que no se halla especificado el formato:
    TYPE_FS=$(blkid -c /dev/null -o list | grep -m1 "^$PARTITION" | cut -f3 -d ' ')
    TYPE_FS=${TYPE_FS:-unknown}
    return $CODE;
  else
    return $CODE;
  fi
  ask_mountpoint
}

# Una funcin para crear la lista de particiones:
partition_list() {
  while read LINE ; do
    if [[ ${#LINE} -eq 0 ]]; then
      break;
    fi
    DEVICE=${LINE%% *}
    SIZE=$(echo "$LINE" | tr -d '[*+]' | awk '{ print $4 }')
    DEVPOINT=""
    FORMAT=""
    DEVPOINT=$(echo $(grep -s "^$DEVICE" ${TMP}/fstab) | cut -f 2 -d ' ')
    FORMAT=$(echo $(grep -s "^$DEVICE" ${TMP}/fstab) | cut -f 3 -d ' ')
    if [[ $FORMAT = defaults ]]; then
      FORMAT=$(blkid $DEVICE -s TYPE | cut -f 2 -d \")
    fi
    if [[ -z $DEVPOINT || -z $FORMAT ]]; then
      echo "\"${DEVICE}\" \"Linux ${SIZE}K\" \\" >> ${TMP}/show_partitions
    else
      echo "\"${DEVICE}\" \"Linux ${SIZE}K (${FORMAT}) ${DEVPOINT}\" \\" \
       >> ${TMP}/show_partitions
    fi
  done < ${TMP}/SeTplist
  echo " 2> ${TMP}/return" >> ${TMP}/show_partitions
}

# Crea el men (loop):
while : ; do
  cat << EOF > ${TMP}/show_partitions
dialog \\
 --backtitle "Establishing the Linux partitions" \\
 --title "PARTITIONS" \\
 --extra-button \\
 --extra-label "Continue" \\
 --cancel-label "- Main Menu" \\
 --menu \\
"Detected Linux partitions...\n\n\\
Select the partition to assign a file system, or a mount point:\n\n" 16 51 6 \\
EOF
  partition_list
  . ${TMP}/show_partitions
  CODE=$?
  if (( $CODE == 0 )); then
    PARTITION=$(cat ${TMP}/return)
    format
    if (( $? == 1 )); then
      ask_mountpoint;
    else
      continue;
    fi
  elif (( $CODE == 3 )); then
    if grep -qs '/ ' ${TMP}/fstab ; then
      break;
    else
      dialog --title "ROOT PARTITION NOT SET" --msgbox \
"Unable to continue with the installation.\n\n\
The mount point \"/\" for the root partition has not been set." 9 46
      continue;
    fi
  elif (( $CODE == 1 )); then
    CODE=1
    break;
  else
    break;
  fi
done

exit $CODE

