#!/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.
	# Saltar si no existe definición de partición.
	if [ -n "$par" -a $par != 0 ]; then
		# Componer datos de particionado. 
		TBP[par]="$cpt:$tam"
		# Si se activa operación de formatear, componer datos de formateo.
		if [ "$ope" == 1 ]; then
			TBF[par]="$sfi"
		else
			TBF[par]="EMPTY"
		fi
		# Obtener la partición mayor por si hay que rellenar con valores EMPTY.
		[ $par -gt $maxp ] && maxp=$par
	fi
done

# Control de datos.
for ((par=1; par<=maxp; par++)); do
	# Ignorar partición 4 si existe caché.
	if [ $che != 1 -o $par -ne 4 ]; then
		# Rellenar con "EMPTY:0" la configuración de particiones no definidas.
		[ -z "${TBP[par]}" ] && TBP[par]="EMPTY:0"
	fi
	# Ignorar formateo en particiones que no soportan sistemas de archivos.
	case "${TBP[par]%:*}" in
		""|EMPTY|EXTENDED|LINUX-SWAP|LINUX-LVM)
			TBF[par]="EMPTY" ;;
	esac
done

#____________________________________________________
# 
# Proceso
#____________________________________________________


# Desmonta todas las particiones y la caché
ogUnmountCache 
ogUnmountAll $dis &>/dev/null

# Elimina la tabla de particiones
ogDeletePartitionTable $dis  
ogUpdatePartitionTable $dis | tee -a $OGLOGSESSION $OGLOGFILE	

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

# Cuestión caché
if [ "$che" == "1" ]; then
	initCache $tch >/dev/null | tee -a $OGLOGSESSION $OGLOGFILE
fi

# Definir particionado.
ogCreatePartitions $dis ${TBP[@]}  | tee -a $OGLOGSESSION $OGLOGFILE
ogUpdatePartitionTable $dis | tee -a $OGLOGSESSION $OGLOGFILE	

RETVAL=$?	
if [ $RETVAL -ne 0 ]; then
	kill $COPROC_PID
	exit $RETVAL
fi 

# Formatear particiones, excepto las marcadas como "EMPTY".
for ((par=1; par<=$maxp; par++)); do
	sfi="${TBF[par]}"
	if [ "$sfi" != "EMPTY" ]; then
		ogFormatFs $dis $par $sfi | tee -a $OGLOGSESSION $OGLOGFILE
		RETVAL=$?
		if [ $RETVAL -ne 0 ]; then
			kill $COPROC_PID
			exit $OG_ERR_PARTITION
		fi 
	fi
done	

#___________________________________________________________________
#
# Retorno
#___________________________________________________________________

kill $COPROC_PID
exit 0

