#!/bin/bash


#Load engine configurator from engine.cfg file.
#Carga el configurador del engine desde el fichero engine.cfg
[ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg
	
# Clear temporary file used as log track by httpdlog
# Limpia los ficheros temporales usados como log de seguimieincludento para httpdlog
echo " " > $OGLOGSESSION; echo " " > $OGLOGCOMMAND; echo " " > ${OGLOGCOMMAND}.tmp
	
# Registro de inicio de ejecución
ogEcho log session "$MSG_INTERFACE_START $0 $*"

# Solo ejecutable por OpenGnsys Client.
PATH=$PATH:$(dirname $0)
PROG=$(basename $0)

#____________________________________________________________________
#
# El parámetro $2 es el que aporta toda la información y el $1 se queda obsoleto
# Formato de entrada:
#		dis=Número de disco
#		*=caracter de separación
#		che=Vale 0 o 1
#		*=caracter de separación
#		$tch=tamaño cache
#		!= caracter de separación
#
#   Y un numero indeterminado de cadenas del tipo siguuenteseparadas por el caracter '$':
#		par=Número de particion*cod=Código de partición*sfi=Sistema de ficheros*tam=Tamaño de la partición*ope=Operación
#		@= caracter de separación
#____________________________________________________________________

# Captura de parámetros (se ignora el 1er parámetro y se eliminan espacios y tabuladores).
#param='dis=1*che=0*tch=70000000!par=1*cpt=NTFS*sfi=NTFS*tam=11000000*ope=0%'
shift
param="$(echo $* | sed 's/[ 	]//g')"

# Activa navegador para ver progreso
coproc /opt/opengnsys/bin/browser -qws http://localhost/cgi-bin/httpd-log.sh

# Leer los dos bloques de parámetros, separados por '!'.
declare -a TBPRM

IFS='!' read -a TBPRM <<<"$param"
pparam="${TBPRM[0]}"	# Parámetros generales del disco.
sparam="${TBPRM[1]}"	# Parámetros de particionado y formateo.


# Toma valores de disco y caché, separados por "*".
# Los valores están en las variables $dis: disco, $che: existe cache (1, 0), $tch: Tamaño de la cache.
unset TBPRM
IFS='*' read -a TBPRM <<<"$pparam"
[[ ${TBPRM} =~ = ]] && eval ${TBPRM[@]}		# Comprobar asignación antes de exportar valores.

# Error si no se define el parámetro de disco (dis).
[ -z "$dis" ] && exit $OG_ERR_FORMAT

# Toma valores de distribución de particiones, separados por "%".
declare -a CFG		# Valores de configuración.
declare -a TBP		# Tabla de particionado.
declare -a TBF		# Tabla de formateo.

unset TBPRM
IFS='%' read -a TBPRM <<<"$sparam"

maxp=0
for ((i=0; i<${#TBPRM[@]}; i++)); do
        # Leer datos de la partición, separados por "*".
        unset par
        IFS='*' read -a CFG <<<"${TBPRM[i]}" 2>/dev/null
        [[ ${CFG} =~ = ]] && eval ${CFG[@]}     # Comprobar asignación antes de exportar valores.
        # Componer datos de particionado. 
        if [ "$cpt" != "CACHE" ]; then
                        TBP[par]="$cpt:$tam"
        fi 
        # Si se activa operación de formatear, componer datos de formateo.
        if [ "$ope" == 1 ]; then
           # Comprobamos que la particion y el s.f sean validos.
	   ogCheckStringInGroup $cpt "EMPTY EXTENDED LINUX-LVM LVM ZPOOL"
           [ $? -ne 0 ] && TBF[par]="$sfi"
        fi
        # Obtener la partición mayor.
        [ $par -gt $maxp ] && maxp=$par
done
#____________________________________________________
# 
# Proceso
#____________________________________________________

# Tamaño actual de la cache
CACHESIZE=$(ogGetCacheSize)

# Desmonta todas las particiones y la caché

ogEcho session log "[10] $MSG_HELP_ogUnmountAll"
ogUnmountAll $dis &>/dev/null
ogUnmountCache

# Elimina la tabla de particiones
ogDeletePartitionTable $dis
ogExecAndLog COMMAND ogUpdatePartitionTable $dis

# Crea tabla de particiones MSDOS (NOTA: adaptar para tablas GPT).
ogCreatePartitionTable $dis MSDOS

# Inicia la cache.
if echo "$sparam" |grep "CACHE" >/dev/null; then
        ogEcho session log "[30] $MSG_HELP_ogCreateCache"
        ogEcho session log "   initCache $tch"
	ogExecAndLog COMMAND  initCache $tch
fi

# Definir particionado.
ogEcho session log "[50] $MSG_HELP_ogCreatePartitions"
ogEcho session log "   ogCreatePartitions $dis ${TBP[@]}"
ogExecAndLog COMMAND ogCreatePartitions $dis ${TBP[@]}
if [ $? -ne 0 ]; then
        kill $COPROC_PID
        exit $(ogRaiseError session log $OG_ERR_GENERIC "ogCreatePartitions $dis ${TBP[@]}")
fi
ogExecAndLog COMMAND ogUpdatePartitionTable $dis

#  Formatear particiones
ogEcho session log "[70] $MSG_HELP_ogFormat"

for ((par=1; par<=$maxp; par++)); do
	case "${TBF[par]}" in
		CACHE)  # Si el tamaño es distinto ya se ha formateado.
			if [ "$CACHESIZE" == $tch ]; then
			   ogEcho session log "   ogFormatCache"
			   ogExecAndLog COMMAND ogFormatCache
			fi
		;;
		"") ;;
        	*) ogEcho session log "   ogFormatFs $dis $par ${TBF[par]}"
		   ogExecAndLog COMMAND ogFormatFs $dis $par ${TBF[par]}
		   if [ $? -ne 0 ]; then
                        kill $COPROC_PID
                        exit $(ogRaiseError session log $OG_ERR_GENERIC "ogFormatFs  $dis $par ${TBF[par]}");
                   fi
        	;;
   	esac
done
RETVAL=$?
# Registro de fin de ejecución
ogEcho log session "$MSG_INTERFACE_END $RETVAL"

#___________________________________________________________________
#
# Retorno
#___________________________________________________________________

kill $COPROC_PID
exit 0

