#!/bin/bash

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>

# (c) Antonio Sánchez león, 2010, 2011, 2012 <introlinux[fix@]gmail[fix.]com>
# (c) Miguel Anxo Bouzada, 2010, 2011, 2012 <mbouzada[fix@]gmail[fix.]com>
# (c) GALPon MinNo Team, 2010, 2011, 2012 <minino[fix@]galpon[fix.]org>

# Retocado para la Distribucion Ezaro, 2011,
# por Guillermo Cordeiro <gcordeiro[fix@]tegnix[fix.]com>
# Ampliado y revisado para MiniNo-v2 Ártabros, 2012,
# por el equipo de GALPon MiniNo <minino[fix@]galpon[fix.]org>

## -


nombre="MININO"
version_kernel=$(uname -r)
kernel="vmlinuz-${version_kernel}"
initrd="initrd.img-${version_kernel}"


# PREGUNTAMOS Y ESTABLECEMOS IDIOMA
clear
echo ""
echo -e "Esculli el seu idioma.  Per  \033[1;31mcatalà CA\033[0m escrigui:  \033[1;310m ca \033[0m"
echo -e "Escolla o seu idioma.   Para \033[1;32mgalego GL\033[0m escriba:   \033[1;32m gl \033[0m"
echo -e "Escoja su idioma.       Para \033[1;33mespañol ES\033[0m escriba:  \033[1;33m es \033[0m"
echo -e "Choose your language.   For  \033[1;34menglish US\033[0m write:    \033[1;34m en \033[0m"
#echo -e "Escolha o seu idioma.   Para \033[1;35mportugês BR\033[0m escreba: \033[1;35m br \033[0m"
echo ""

while [ ${idioma:-void} == "void" ]
do
    read -N 2 -p "! " idioma
    echo -n ""

    case $idioma in
        ca | CA | Ca | cA )
            LANG="ca_ES.UTF-8"
            export LANG
            echo "LANG=\"ca_ES.UTF-8\"" > /etc/default/locale
        ;;

        gl | GL | Gl | gL )
            LANG="gl_ES.UTF-8"
            export LANG
            echo "LANG=\"gl_ES.UTF-8\"" > /etc/default/locale
        ;;

        es | ES | Es | eS )
            LANG="es_ES.UTF-8"
            export LANG
            echo "LANG=\"es_ES.UTF-8\"" > /etc/default/locale
        ;;

        en | EN | En | eN )
            LANG="en_US.UTF-8"
            export LANG          
            echo "LANG=\"en_US.UTF-8\"" > /etc/default/locale
        ;;

#        br | BR | Br | bR )
#            LANG="pt_BR.UTF-8"
#            export LANG          
#            echo "LANG=\"pt_BR.UTF-8\"" > /etc/default/locale
#        ;;

        * )
            echo -e "\nIdioma incorrecto. / Wrong Language."
            unset idioma
    esac
done

clear

## TRANSLATIONS / TRADUCCIONES /TRADUCIÓNS

case $LANG in
    ca*)
        MSG1="\033[1;31m ## Instalació de GALPon MiniNo «Ártabros» ##\033[0m"
        MSG2="Per instalar el sistema és necessària una partició Linux (ext4)"
        MSG3="i és recomanable una partició d'intercanvi SWAP."
        MSG4="Si ja té particionat el disc dur respongui no, « n »"
        MSG5="a la següent pregunta."
        MSG6="Vol particionar el disc dur?"
        MSG7="A continuació es mostren les particions Linux disponibles."
        MSG8="\033[1;32mEscriba\033[0m la partició on s'instal·larà GALPon MiniNo: "
        MSG9="Per exemple, hda1: "
        MSG10="\033[1;31m ## ¡¡¡ PRECAUCIÓ !!! ## \033[0m"
        MSG11="Aquesta operació no té marxa enrere, en formatar es"
        MSG12="perdran totes les dades de les particions en qüestió."
        MSG13="Així ha quedat la taula de particions: "
        MSG14="Es va a \033[1;31mformatar\033[0m la partició"
        MSG15="per el sistema"
        MSG16="i la partició"
        MSG17="\033[1;42m interna en arxiu «swapfile» \033[0m per l'àrea d'intercanvi swap."
        MSG18="per l'àrea de intercanvi swap."
        MSG19="Esstà d'acord?"
        MSG20="Continuar la instal·lació SENSE formatar les particions?"
        MSG21="Es continua la instal·lació"
        MSG22="sense formatar la partició"
        MSG23="\033[1;42m Còpia de GALPon MiniNo realitzánt-se en \033[0m "
        MSG24="\033[1;42m sigui pacient...                        \033[0m "
        MSG25="\033[1;42m S'ha completat la instalació.                                   \033[0m "
        MSG26="\033[1;42m Recordeu-vos de treure el LiveCD abans de reiniciar el sistema. \033[0m "
        MSG27="Opció incorrecta."
        MSG28="(s/n): "
        MSG40="Pot optar per una instal·lació normal o una instal·lación automàtica:"
        MSG41="A la instal·lació normal tindrà la possibilitat de particionar el disc al seu gust."
        MSG42="A la instal·lació automàtica (desatesa) no se li preguntarà absolutament res,"
        MSG43="automàticament esborrarà \033[1;31mTOT\033[0m el contingut del primer disc dur i al finalitzar"
        MSG44="\033[1;31mÚNICAMENT\033[0m quedarà al seu ordinador el sistema operatiu GALPon MiniNo."
        MSG45="Desitja una instal·lació \033[1;32mm\033[0manual o \033[1;32ma\033[0mutomàtica?"
        MSG46="(m/a)"
        MSG46="No hi ha prou espaci en disc per instal·lar GALPon MiniNo"
    ;;

    es*)
        MSG1="\033[1;31m ## Instalación de GALPon MiniNo «Ártabros» ##\033[0m"
        MSG2="Para instalar el sistema es necesaria una partición Linux (ext4)"
        MSG3="y es recomendable una partición de intercambio SWAP."
        MSG4="Si ya tiene particionado el disco duro responda no, « n »"
        MSG5="a la siguiente pregunta."
        MSG6="¿Quiere particionar el disco duro?"
        MSG7="A continuación se muestran las particiones Linux disponibles."
        MSG8="\033[1;32mEscriba\033[0m la partición donde se va a instalar GALPon MiniNo: "
        MSG9="Por ejemplo, hda1: "
        MSG10="\033[1;31m ## ¡¡¡ PRECAUCIÓN !!! ## \033[0m"
        MSG11="Esta operación no tiene vuelta atrás, al formatear se"
        MSG12="perderán todos los datos de las particiones en cuestión."
        MSG13="Así ha quedado la tabla de particiones: "
        MSG14="Se va a \033[1;31mformatear\033[0m la partición"
        MSG15="para el sistema"
        MSG16="y la partición"
        MSG17="\033[1;42m interna en archivo «swapfile» \033[0m para el área de intercambio swap."
        MSG18="para el área de intercambio swap."
        MSG19="¿Está conforme?"
        MSG20="¿Continuar la instalación SIN formatear las particiones?"
        MSG21="Se continúa la instalación"
        MSG22="sin formatear la partición"
        MSG23="\033[1;42m Copia de GALPon MiniNo realizándose en \033[0m "
        MSG24="\033[1;42m sea paciente...                        \033[0m "
        MSG25="\033[1;42m Se ha completado la instalación.                              \033[0m "
        MSG26="\033[1;42m Acuérdese de extraer el LiveCD antes de reiniciar el sistema. \033[0m "
        MSG27="Opción incorrecta."
        MSG28="(s/n): "
        MSG40="Puede optar por una instalación normal o una instalación automática:"
        MSG41="En la instalación normal tendrá la posibilidad de particionar el disco a su gusto."
        MSG42="En la instalación automática (desatendida) no se le preguntará absolutamente nada,"
        MSG43="automáticamente borrará \033[1;31mTODO\033[0m el contenido del primer disco rígido y al finalizar" 
        MSG44="\033[1;31mÚNICAMENTE\033[0m quedará en su ordenador el sistema operativo GALPon MiniNo."
        MSG45="¿Desea una instalación \033[1;32mm\033[0manual o \033[1;32ma\033[0mutomática?"
        MSG46="(m/a)"
        MSG47="No hay suficiente espacio en disco para instalar GALPon MiniNo"
    ;;

    gl*)
        MSG1="\033[1;31m ## Instalación de GALPon MiniNo «Ártabros» ##\033[0m"
        MSG2="Para instalar o sistema é necesaria unha partición Linux (ext4)"
        MSG3="e é recomendábel unha partición de intercambio SWAP."
        MSG4="Se xa ten particionado o disco ríxido responda non, « n »"
        MSG5="á seguinte pregunta."
        MSG6="Quere particionar o disco ríxido?"
        MSG7="A continuación móstranse as particións Linux dispoñíbeis."
        MSG8="\033[1;32mEscriba\033[0m a partición onde se vai a instalar GALPon MiniNo: "
        MSG9="Por exemplo, hda1: "
        MSG10="\033[1;31m ## PRECAUCIÓN !!! ## \033[0m"
        MSG11="Esta operación non ten volta atrás, ao formatar perderanse"
        MSG12="todos os datos das particións en cuestión."
        MSG13="Así quedou a táboa de particións: "
        MSG14="Vaise a \033[1;31mformatar\033[0m a partición"
        MSG15="para o sistema"
        MSG16="e a partición"
        MSG17="\033[1;42m interna en ficheiro «swapfile» \033[0m para a área de intercambio swap."
        MSG18="para a área de intercambio swap."
        MSG19="Está de acordo?"
        MSG20="Continuar a instalación SEN formatar as particións?"
        MSG21="Continúase coa instalación"
        MSG22="sen formatar a partición"
        MSG23="\033[1;42m Copia de GALPon MiniNo realizándose en \033[0m "
        MSG24="\033[1;42m sexa paciente...                       \033[0m "
        MSG25="\033[1;42m Completouse a instalación.                                 \033[0m "
        MSG26="\033[1;42m Lémbrese de extraer o LiveCD antes de reiniciar o sistema. \033[0m "
        MSG27="Opción incorrecta."
        MSG28="(s/n): "
        MSG40="Pode escoller entre unha instalación normal ou unha instalación automática:"
        MSG41="Na instalación normal terá a posibilidade de particionar o disco ao seu gusto."
        MSG42="Na instalación automática (desatendida) non se lle preguntará absolutamente nada,"
        MSG43="automáticamente borrará \033[1;31mTODO\033[0m o contido do primeiro disco ríxido e ao rematar" 
        MSG44="\033[1;31mUNICAMENTE\033[0m quedará no seu computador o sistema operativo GALPon MiniNo."
        MSG45="Quere facer unha instalación \033[1;32mm\033[0manual ou unha \033[1;32ma\033[0mutomática?"
        MSG46="(m/a)"
        MSG47="Non hai espazo abondo no disco para instalar GALPon MiniNo"
    ;;

#    pt_BR*)
#    ;;

    *)
        MSG1="\033[1;31m ## GALPon MiniNo \"Artabros\" Installation ##\033[0m"
        MSG2="It is necessary to have a Linux partition  (ext4) for installing the system"
        MSG3="and is recommend a SWAP linux partition."
        MSG4="If you have already partitioned the hard disk, answer no, « n »"
        MSG5="to the next question."
        MSG6="Do you want to partition the hard disk?"
        MSG7="Next, you can see the linux partitions available."
        MSG8="\033[1;32mTo write\033[0m the partition where you want to install GALPon MiniNo: "
        MSG9="For example, hda1: "
        MSG10="\033[1;31m ## ¡¡¡ WARNING !!! ## \033[0m"
        MSG11="This step is not reversible, ones formated the disk there's no return,"
        MSG12="you'll LOST ALL DATAS in the partitions selected."
        MSG13="Here you can see the Partition table: "
        MSG14="The partition is going to be \033[1;31mformated\033[0m is"
        MSG15="for the system"
        MSG16="and the partition"
        MSG17="\033[1;42m in file «swapfile» \033[0m for the swap memory area."
        MSG18="for the swap memory area."
        MSG19="Do you agree?"
        MSG20="Continue the installation WITHOUT formating partitions?"
        MSG21="Se continúa la instalación"
        MSG22="sin formatear la partición"
        MSG23="\033[1;42m GALPon MiniNo is copying in \033[0m "
        MSG24="\033[1;42m be patient...               \033[0m "
        MSG25="\033[1;42m Installation has finished.                              \033[0m "
        MSG26="\033[1;42m Remember to eject the LiveCD before restart the system. \033[0m "
        MSG27="Not valid Option."
        MSG28="(y/n): "
        MSG40="You can choose between a manual (classic) or automatic (unattended) installation:"
        MSG41="In the normal installation you will can partition your hard disk manually."
        MSG42="In the automatic installation you won't be asked anything, your hard disk will be"
        MSG43="formated and you'll \033[1;31mLOST ALL\033[0m in it and when it has finished you'll have in your " 
        MSG44="computer GALPon MiniNo operating system \033[1;31mONLY\033[0m."
        MSG45="Do you want a \033[1;32mm\033[0manual or \033[1;32ma\033[0mutomatic installation?"
        MSG46="(m/a)"
        MSG47="There is not disk space enough to install GALPon MiniNo"
    ;;
esac


#Desmontamos la SWAP que haya montado el liveCD
swapoff $(grep '^/dev' /proc/swaps | awk '{print $1}' | paste -s -d" ")
clear



function partauto(){
    discoduro=`cat /proc/partitions|head -n3|tail -n1|awk '{print $4}'`

    RAM_QUE_TENGO=`free -mt | grep Mem | tail -1 | awk '{print $2}'`

    if (( $RAM_QUE_TENGO >= 256 )); then

        SWAP_SIZE="$RAM_QUE_TENGO"

    else

        SWAP_SIZE="256"
    fi

    TOTAL=`parted -l|grep $discoduro|cut -d" " -f3|cut -d"M" -f1`

    PARTI1=$(($TOTAL-$SWAP_SIZE))

    if (( $PARTI1 < 2500 ));then
        echo ${MSG47}
        exit 0
    fi

    parted -s /dev/"$discoduro" mklabel msdos

    # Con swap al principio
    #parted -s /dev/"$discoduro" mkpart primary linux-swap "0 ${SWAP_SIZE}m"
    #parted -s /dev/"$discoduro" mkpart primary ext2 "${SWAP_SIZE}m -1"

    # Con swap al final
    parted -s /dev/"$discoduro" mkpart primary ext2 "0 ${PARTI1}m"
    parted -s /dev/"$discoduro" mkpart primary linux-swap "${PARTI1}m -1"

    mkfs.ext4 -L MININO2 /dev/${discoduro}1
    mkswap -L SWAP /dev/${discoduro}2

    swap=$(cfdisk -P s /dev/${discoduro} | grep "swap" | cut -f2 -d " ")  #extrae el número de la partición swap    

}


# ¿QUIERE PARTICIONAR EL DISCO?

function particiona(){
    echo " "
    echo -e ${MSG1}
    echo " "
    echo ${MSG2}
    echo ${MSG3}
    echo ${MSG4}
    echo ${MSG5}
    echo " "
    echo -n ${MSG6}

    while [ ${particionar:-void} == "void" ]
    do
        read -N 1 -p "${MSG28}" particionar
        echo ""

        case "$particionar" in
            s | S | y | Y )
#                tmpLANG=$LANG
#                export LANG="en_EN.UTF-8"
                cfdisk
#                LANG=${tmpLANG}
#                export LANG
            ;;

            n | N )
            ;;

            * )
                echo -e "\n${MSG27}"
                unset particionar
            ;;
        esac
    done

    clear

    echo " "
    echo ${MSG7}
    echo " "
    echo ${MSG30}
    fdisk -l | grep '^/dev' | grep -v "Linux swap / Solaris" | tr -d '*+' | awk '{print $1 " " $4 " " $6}' | while read disco tamanho tipo
    do
        ## Me quedo con la partición
        disco=${disco/?dev?/}

        if [ $((tamanho/(1024*1024*1024))) -ge 1 ]
        then
            tamanho="$(echo "scale = 2 ; $tamanho / ( 1024 * 1024 * 1024 )" | bc) GiB"
        elif [ $((tamanho/(1024*1024))) -ge 1 ]
        then
            tamanho="$(echo "scale = 2 ; $tamanho / ( 1024 * 1024 )" | bc) MiB"
        elif [ $((tamanho/1024)) -ge 1 ]
        then
            tamanho="$(echo "scale = 2 ; $tamanho / 1024" | bc) KiB"
        else
            tamanho="$tamanho B"
        fi

        ## Mostramos el texto formateado"
        echo -e "${disco}\t${tamanho}\t${tipo}"
    done

    ## Vamos guardando todas las particiones para saber si se escogió una correcta.
    particiones=( $(fdisk -l | grep '^/dev' | grep -v "Linux swap / Solaris" | tr -d '*+' | awk '{print $1}' | sed 's/^.dev.//' | paste -s) )

    echo " "
    echo " "
    echo -e ${MSG8}

    while [ "${partidestino:-void}" == "void" ]
    do
        read -p "${MSG9}" partidestino
        echo ""

        for testdisco in ${particiones[@]}
        do
           if [ "${testdisco}" == "${partidestino}" ]
            then
                particion="ok"
                break
            fi
        done

        [ "${particion:-void}" == "void" ] && unset partidestino
    done

    discoduro=${partidestino/%?/}                                                                     #en nuestro ejemplo, hda
    swap=$(fdisk -l /dev/${discoduro} | grep "swap" | awk '{print $1}' | sed 's/.*\(.$\)/\1/')     #extrae el número de la partición swap
    clear


    # RESUMEN DE LO QUE SE VA A HACER CON LAS PARTICIONES

    echo -e ${MSG10}
    echo " "
    echo ${MSG11}
    echo ${MSG12}
    echo ${MSG13}
    echo " "
    (fdisk -l /dev/${discoduro} | grep '[MKG]B') 2>/dev/null
    echo " "
    (fdisk -l /dev/${discoduro} | grep 'Id') 2>/dev/null
    (fdisk -l /dev/${discoduro} | grep '^/dev') 2> /dev/null
    echo " "
    echo -e ${MSG14}
    echo -e "\033[1;42m ${partidestino} \033[0m"${MSG15}
    echo ${MSG16}
    if [ ${swap:-void} == "void" ]
    then
        echo -e ${MSG17}
    else
        echo -e "\033[1;42m ${discoduro}${swap} \033[0m"${MSG18}
    fi

    echo ${MSG19}

    while [ ${borra:-void} == "void" ]
    do
        read -p "${MSG28}" -N1 borra
        echo " "
        case "$borra" in
            s | S | y | Y )
                borra="s"
            ;;

            n | N )
                borra="n"
            ;;

            * )
                echo -e "\n${MSG27}"
                unset borra
            ;;
        esac
    done

    if [ "${borra:-void}" == "s" ]
    then
        mkfs.ext4 /dev/${partidestino}
        e2label /dev/${partidestino} ${nombre}
        if [ "${swap:-void}" != "void" ]
        then
            mkswap -L SWAP /dev/"${discoduro}${swap}"
        fi
    else
        echo " "
        echo ${MSG20}

        while [ ${sinformato:-void} == "void" ]
        do
            read -N1 -p "${MSG28}" sinformato
            echo ""

            case "${sinformato}" in
                n | N )
                    exit
                ;;

                s | S | y | Y )
                    e2label /dev/${partidestino} ${nombre}
                    if [ "${swap:-void}" != "void" ]
                    then
                        mkswap -L SWAP /dev/"${discoduro}${swap}"
                    fi
                    echo 
                    echo ${MSG21}
                    echo ${MSG22}
                    echo ""
                    sleep 3
                ;;

                * )
                    echo -e "\n${MSG27}"
                    unset sinformato
                ;;
            esac
        done
    fi
}


# COPIA DE GALPon MiniNo en $partidestino
function copia(){
    echo " "
    echo -e ${MSG23}"${partidestino} "
    echo -e ${MSG24}
    echo " "
    sleep 4

    mount -t auto -o rw /dev/${partidestino} /mnt/

    rsync -acvxHAXRS --exclude="/var/run/*" --exclude="/var/tmp/*" --exclude="/var/log/*" --exclude="/tmp/*" --exclude="/live/*" --exclude="/proc/*" --exclude="/sys/*" --exclude="/dev/*" / /mnt/

    if [ "${swap:-void}" == "void" ]
    then
        dd if=/dev/zero of=swapfile bs=1M count=100
        mkswap swapfile
    fi

    clear

    # CREAMOS EL /etc/fstab y el mtab acorde con los datos de particiones

    swap=$(cfdisk -P s /dev/${discoduro} | grep "swap" | cut -f2 -d " ")  #extrae el número de la partición swap

    if [ "${swap:-void}" == "void" ]
    then
        swap_line="/swapfile  none  swap  sw  0 0"
    else
        swap_line="LABEL=SWAP  none  swap  sw  0  0"
    fi

########## ARCHIVO FSTAB
cat <<EOF >/mnt/etc/fstab
# /etc/fstab: static file system information.
# Format:
#  <file system>         <mount point>   <type>  <options>      <dump>  <pass>
#/dev/${partidestino}  /  ext4  defaults,errors=remount-ro,noatime,commit=60  0  1
LABEL=${nombre}  /  ext4  defaults,errors=remount-ro,noatime,commit=60  0  1
${swap_line}
proc /proc  proc  defaults  0  0
/dev/cdrom /media/cdrom0 udf,iso9660 user,noauto  0  0
/dev/fd0 /floppy auto rw,user,noauto  0  0
EOF

########## ARCHIVO MTAB
#/dev/$partidestino / ext4 rw,errors=remount-ro 0 0
cat <<EOF >/mnt/etc/mtab
tmpfs /lib/init/rw tmpfs rw,nosuid,mode=0755 0 0
proc /proc proc rw,noexec,nosuid,nodev 0 0
sysfs /sys sysfs rw,noexec,nosuid,nodev 0 0
procbususb /proc/bus/usb usbfs rw 0 0
udev /dev tmpfs rw,mode=0755 0 0
tmpfs /dev/shm tmpfs rw,nosuid,nodev 0 0
devpts /dev/pts devpts rw,noexec,nosuid,gid=5,mode=620 0 0
EOF

    ## FINALMENTE INSTALAMOS GRUB en el MBR y añadimos "quiet splash vga=788" a las líneas de carga de kernel

    mount --bind /dev /mnt/dev
    mount -t proc proc /mnt/proc
    mount -t sysfs sysfs /mnt/sys

    chroot /mnt grub-install /dev/${discoduro}
    chroot /mnt update-grub

    ########## TERMINAMOS

    # Establecemos idioma
    cd /
    cp /etc/default/locale /mnt/etc/default/
    sync
    umount -a
    clear
    echo ""
    echo -e ${MSG25}
    echo -e ${MSG26}
    sleep 10

}



# INSTALACIÓN NORMAL O DESATENDIDA?
echo " "
echo -e ${MSG1}
echo " "
echo ${MSG40}
echo ${MSG41}
echo ${MSG42}
echo -e ${MSG43} 
echo -e ${MSG44}
echo " "
echo -e ${MSG45}
echo -n ${MSG46}

while [ ${instalacion:-void} == "void" ]
do
    read -N 1 -p ": " instalacion
    echo ""

    case "$instalacion" in
        m | M )
            particiona
            copia
        ;;

        a | A )
            partauto
            copia
        ;;

        * )
            echo -e "\n${MSG27}"
            unset instalacion
            exit 0
        ;;
    esac
done


