diff options
Diffstat (limited to 'client')
-rwxr-xr-x | client/engine/Boot.lib | 18 | ||||
-rw-r--r-- | client/engine/UEFI.lib | 255 | ||||
-rw-r--r-- | client/shared/etc/lang.ca_ES.conf | 8 | ||||
-rw-r--r-- | client/shared/etc/lang.en_GB.conf | 8 | ||||
-rw-r--r-- | client/shared/etc/lang.es_ES.conf | 8 | ||||
-rwxr-xr-x | client/shared/scripts/configureOs | 48 | ||||
-rwxr-xr-x | client/shared/scripts/createImage | 18 | ||||
-rwxr-xr-x | client/shared/scripts/deployImage | 2 |
8 files changed, 342 insertions, 23 deletions
diff --git a/client/engine/Boot.lib b/client/engine/Boot.lib index 539be0b1..d3b683f5 100755 --- a/client/engine/Boot.lib +++ b/client/engine/Boot.lib @@ -91,7 +91,7 @@ case "$TYPE" in # [ -r $f ] && DIRGRUB=$(dirname $f) #done #DIRGRUB=${DIRGRUB#$MNTDIR/} - #ogGrubUEFIConf $1 $2 $DIRGRUB || return $? + #ogGrubUefiConf $1 $2 $DIRGRUB || return $? # Borrar cargador guardado con la misma etiqueta. BOOTLABEL=$(printf "Part-%02d-%02d" $1 $2) @@ -175,7 +175,7 @@ case "$TYPE" in ;; GrubLoader) # Reiniciar. - reboot + #reboot ;; *) ogRaiseError $OG_ERR_NOTOS "$1 $2 ${TYPE:+($TYPE)}" return $? @@ -732,6 +732,9 @@ ps aux > /dev/null | grep $! | grep -E "T|S" | kill -9 $! > /dev/null #@version 1.1.0 - #827 Entrada para el ogLive si el equipo tiene partición cache. #@author Antonio J. Doblas Viso. Universidad de Malaga. #@date 2018-01-21 +#@version 1.1.1 - #802 Equipos EFI: Se crea el grub.cfg de la partición EFI +#@author Irina Gomez, ETSII Universidad de Sevilla +#@date 2019-01-08 #*/ ## function ogGrubInstallMbr () @@ -800,7 +803,7 @@ then # Reactivamos el grub con el grub.cfg original. if ogIsEfiActive; then # Configuración de grub.cfg para EFI - ogGrubUEFIConf $1 $2 + ogGrubUefiConf $1 $2 else grub-install --force --root-directory=${SECONDSTAGE} $FIRSTSTAGE fi @@ -831,7 +834,7 @@ grubSyntax "$KERNELPARAM" >> ${SECONDSTAGE}${PREFIXSECONDSTAGE}/boot/grub/grub.c # Instalar el grub no EFI, configurar EFI # Para EFI en ESP para otros en la partición de sistema. if ogIsEfiActive; then - ogGrubUEFIConf $1 $2 ${PREFIXSECONDSTAGE} + ogGrubUefiConf $1 $2 ${PREFIXSECONDSTAGE} else grub-install --force --root-directory=${SECONDSTAGE}${PREFIXSECONDSTAGE} $FIRSTSTAGE fi @@ -856,6 +859,9 @@ fi #@version 1.0.3 - Ficheros de configuracion independientes segun ubicación de la priemra etapa #@author Antonio J. Doblas Viso. Universidad de Malaga. #@date 2012-03-13 +#@version 1.1.1 - #802 Equipos EFI: Se crea el grub.cfg de la partición EFI +#@author Irina Gomez, ETSII Universidad de Sevilla +#@date 2019-01-08 #*/ ## function ogGrubInstallPartition () @@ -919,7 +925,7 @@ then # Reactivamos el grub con el grub.cfg original. if ogIsEfiActive; then # Configuración de grub.cfg para EFI - ogGrubUEFIConf $1 $2 + ogGrubUefiConf $1 $2 else grub-install --force --root-directory=${SECONDSTAGE} $FIRSTSTAGE fi @@ -945,7 +951,7 @@ grubSyntax $DISK $PART "$KERNELPARAM" >> ${SECONDSTAGE}${PREFIXSECONDSTAGE}/boot #Instalar el grub si no es EFI, configurar si es EFI if ogIsEfiActive; then - ogGrubUEFIConf $1 $2 ${PREFIXSECONDSTAGE} + ogGrubUefiConf $1 $2 ${PREFIXSECONDSTAGE} else grub-install --force --root-directory=${SECONDSTAGE}${PREFIXSECONDSTAGE} $FIRSTSTAGE fi diff --git a/client/engine/UEFI.lib b/client/engine/UEFI.lib index 5672e09c..e64f99f2 100644 --- a/client/engine/UEFI.lib +++ b/client/engine/UEFI.lib @@ -3,7 +3,7 @@ # Las funciones se incluirán las librerías ya existentes #/** -# ogGrubUEFIConf int_ndisk int_part str_dir_grub +# ogGrubUefiConf int_ndisk int_part str_dir_grub #@brief Genera el fichero grub.cfg de la ESP #@param int_ndisk nº de orden del disco #@param int_part nº de partición @@ -13,14 +13,14 @@ #@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado. #@TODO Confirmar si el fichero "$EFIDIR/EFI/$BOOTLABEL/grub.cfg" es necesario. #*/ ## -function ogGrubUEFIConf { +function ogGrubUefiConf () { local EFIDIR BOOTLABEL GRUBEFI UUID DEVICE DIRGRUB # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_part [ str_dir_grub ]" \ "$FUNCNAME 1 2" \ - "$FUNCNAME 1 3 grubPARTITION/boot/grub" \ + "$FUNCNAME 1 3 grubPARTITION/boot/grub" return fi @@ -50,7 +50,7 @@ cp $GRUBDIR/grub.cfg "$EFIDIR/EFI/$BOOTLABEL/grub.cfg" } #/** -# ogUUIDChange int_ndisk str_repo +# ogUuidChange int_ndisk str_repo #@brief Reemplaza el UUID de un sistema de ficheros. #@param int_ndisk nº de orden del disco #@param int_part nº de partición @@ -59,7 +59,7 @@ cp $GRUBDIR/grub.cfg "$EFIDIR/EFI/$BOOTLABEL/grub.cfg" #@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado. #@TODO Se utiliza el comando uuidgen que no existe en el ogLive #*/ ## -function ogUUIDChange { +function ogUuidChange () { local MNTDIR DEVICE UUID NEWUUID f # Si se solicita, mostrar ayuda. @@ -89,3 +89,248 @@ for f in $MNTDIR/etc/fstab $MNTDIR/{,boot/}{{grubMBR,grubPARTITION}/boot/,}{grub [ -r $f ] && sed -i s/$UUID/$NEWUUID/g $f done } + +#/** +# ogCopyEfiBootLoader int_ndisk str_repo path_image +#@brief Copia el cargador de arranque desde la partición EFI a la de sistema. +#@param int_ndisk nº de orden del disco +#@param int_part nº de partición +#@return (nada, por determinar) +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado. +#@note Si existe el cargador en la partición de sistema no es válido +#*/ ## +function ogCopyEfiBootLoader () { +# Variables locales +local MNTDIR EFIDIR BOOTLABEL OSVERSION LOADER f + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_part" \ + "$FUNCNAME 1 2" + return +fi + +# Error si no se reciben 2 arámetros. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME int_ndisk int_part" || return $? + +# Comprobamos que exista partición de sistema y la ESP +MNTDIR=$(ogMount $1 $2) || ogRaiseError $OG_ERR_PARTITION "$DISK $PART" || return $? +EFIDIR=$(ogMount $(ogGetEsp)) || ogRaiseError $OG_ERR_PARTITION "ESP" || return $? + +# Comprobamos que exista el cargador +BOOTLABEL=$(printf "Part-%02d-%02d" $1 $2) +OSVERSION=$(ogGetOsVersion $1 $2) +case $OSVERSION in + *Windows\ 10*) + for f in $EFIDIR/EFI/{$BOOTLABEL,Microsoft}/Boot/bootmgfw.efi; do + [ -r $f ] && LOADER=$f + done + [ -n "$LOADER" ] || ogRaiseError $OG_ERR_NOTOS "$1 $2 ($OSVERSION, EFI)" || return $? + # Si existe el directorio Boot lo borramos + [ -d $MNTDIR/Boot ] && rm -rf $MNTDIR/Boot + DIRLOADER=$(realpath "${LOADER%/*}/..") + cp -r ${DIRLOADER}/Boot $MNTDIR + ;; +esac +} + +#/** +# ogRestoreEfiBootLoader int_ndisk str_repo +#@brief Copia el cargador de arranque de la partición de sistema a la partición EFI. +#@param int_ndisk nº de orden del disco +#@param int_part nº de partición +#@return (nada, por determinar) +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado (partición de sistema o EFI). +#@exception OG_ERR_NOTOS sin sistema operativo. +#@note Si existe el cargador en la partición de sistema puede no ser válido +#*/ ## +function ogRestoreEfiBootLoader () { +# Variables locales +local MNTDIR EFIDIR BOOTLABEL OSVERSION LOADER f UUID DEVICE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_part" \ + "$FUNCNAME 1 2" + return +fi + +# Error si no se reciben 2 arámetros. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME int_ndisk int_part" || return $? + +# Comprobamos que exista partición de sistema y la ESP +MNTDIR=$(ogMount $1 $2) || ogRaiseError $OG_ERR_PARTITION "$DISK $PART" || return $? +EFIDIR=$(ogMount $(ogGetEsp)) || ogRaiseError $OG_ERR_PARTITION "ESP" || return $? + +# Comprobamos que exista el cargador +#BOOTLABEL=$(printf "Part-%02d-%02d" $1 $2) +OSVERSION=$(ogGetOsVersion $1 $2) +case $OSVERSION in + *Windows\ 10*) + BOOTLABEL=$(printf "Part-%02d-%02d" $1 $2) + LOADER=$(ogGetPath $MNTDIR/Boot/bootmgfw.efi) + [ -n "$LOADER" ] || ogRaiseError $OG_ERR_NOTOS "$1 $2 ($OSVERSION, EFI)" || return $? + [ -r $EFIDIR/$BOOTLABEL ] && rm -rf $EFIDIR/$BOOTLABEL + mkdir -p $EFIDIR/EFI/$BOOTLABEL + cp -r "${LOADER%/*}" $EFIDIR/EFI/$BOOTLABEL + ;; +esac +} + + +# ogRestoreUuidPartitions +#@brief Restaura los uuid de las particiones y la tabla de particiones +#@param int_ndisk nº de orden del disco +#@param int_nfilesys nº de orden del sistema de archivos +#@param REPO|CACHE repositorio +#@param str_imgname nombre de la imagen +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND No encontrado fichero de información de la imagen (con uuid) +function ogRestoreUuidPartitions () { +local DISK PART IMGNAME INFOFILE DEVICE PARTDEVICE DATA GUID UUID IMGGUID IMGUUID +local EFIPARTDEVICE EFIDEVICE EFIDATA EFIGUID EFIUUID EFIUUID IMGEFIGUID IMGEFIUUID + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME REPO|CACHE str_imgname int_ndisk int_npart" \ + "$FUNCNAME REPO Windows 1 2" + return +fi +# Error si no se reciben 4 parámetros. +[ $# -eq 4 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME REPO|CACHE str_imgname int_ndisk int_npart" || return $? + +# Sólo se ejecuta si es UEFI +[ ogIsEfiActive ] || return + +# Parámetros de entrada +IMGNAME="$2" +INFOFILE="$OGIMG/.$IMGNAME.img.json" +[ "${1^^}" == "CACHE" ] && INFOFILE="$OGCAC$INFOFILE" +# TODO: que la función getPath soporte archivos ocultos +ls $INFOFILE &>/dev/null || ogRaiseError $OG_ERR_NOTFOUND "$INFOFILE" || return $? +DISK=$3 +PART=$4 + +DEVICE=$(ogDiskToDev $DISK) +PARTDEVICE=$(ogDiskToDev $DISK $PART) || return $? +read -e EFIDISK EFIPART <<<"$(ogGetEsp)" +EFIPARTDEVICE=$(ogDiskToDev $EFIDISK $EFIPART) || return $? + +# Datos de la imagen +IMGGUID=$(jq .guid $INFOFILE|tr -d \") +IMGUUID=$(jq .uuid $INFOFILE|tr -d \") +IMGEFIGUID=$(jq .espguid $INFOFILE|tr -d \") +IMGEFIUUID=$(jq .espuuid $INFOFILE|tr -d \") + +# Datos actuales +DATA=$(sfdisk -J $DEVICE) +GUID=$(echo $DATA|jq ".partitiontable|.id"|tr -d \") +UUID=$(echo $DATA|jq ".partitiontable.partitions[]|select(.node==\"$PARTDEVICE\").uuid"|tr -d \") + +if [ "$IMGGUID" != "$GUID" ]; then + echo sgdisk -U "$IMGGUID" "$DEVICE" + sgdisk -U "$IMGGUID" "$DEVICE" + partprobe +fi + +if [ "$IMGUUID" != "$UUID" ]; then + NUMPART="${PARTDEVICE##$DEVICE}" + echo sgdisk -u "${NUMPART}:$IMGUUID" "$DEVICE" + sgdisk -u "${NUMPART}:$IMGUUID" "$DEVICE" + partprobe +fi + +if [ $DISK -eq $EFIDISK ]; then + EFIDATA=$DATA + EFIDEVICE=$DEVICE +else + EFIDEVICE=$(ogDiskToDev $EFIDISK) || return $? + EFIDATA=$(sfdisk -J $EFIDEVICE) + EFIGUID=$(echo $EFIDATA|jq ".partitiontable|.id"|tr -d \") + if [ "$IMGEFIGUID" != "$EFIGUID" ]; then +echo sgdisk -U "$IMGEFIGUID" "$EFIDEVICE" + sgdisk -U "$IMGEFIGUID" "$EFIDEVICE" + partprobe + fi +fi + +EFIUUID=$(echo $EFIDATA|jq ".partitiontable.partitions[]|select(.node==\"$EFIPARTDEVICE\").uuid"|tr -d \") +if [ "$IMGEFIUUID" != "$EFIUUID" ]; then + EFINUMPART="${EFIPARTDEVICE##$EFIDEVICE}" + echo sgdisk -u "${EFINUMPART}:$IMGEFIUUID" "$EFIDEVICE" + sgdisk -u "${EFINUMPART}:$IMGEFIUUID" "$EFIDEVICE" + partprobe +fi +} + +# ogSaveImageInfo +#@brief Crea un fichero con la información de la imagen. +#@param int_ndisk nº de orden del disco +#@param int_nfilesys nº de orden del sistema de archivos +#@param REPO|CACHE repositorio +#@param str_imgname nombre de la imagen +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado. +function ogSaveImageInfo () { +local DISK PART IMGDIR IMGNAME INFO INFOFILE DEVICE PARTDEVICE DATA GUID UUID +local EFIPARTDEVICE EFIDEVICE EFIDATA EFIUUID EFIGUID + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys REPO|CACHE str_imgname" \ + "$FUNCNAME 1 2 REPO Windows" + return +fi +# Error si no se reciben 4 parámetros. +[ $# -eq 4 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME int_ndisk int_nfilesys REPO|CACHE str_imgname" || return $? + +DISK=$1 +PART=$2 +IMGDIR="$(ogGetParentPath "$3" "/$4")" +# Si no existe el directorio de la imagen me salgo +[ "$IMGDIR" != "" ] || ogRaiseError $OG_ERR_NOTFOUND "$3 $(dirname $4)" || return $? +IMGNAME="$(basename "$4")" +INFOFILE="$IMGDIR/.$IMGNAME.img.json" + +DEVICE=$(ogDiskToDev $DISK) || return $? +PARTDEVICE=$(ogDiskToDev $DISK $PART) || return $? +DATA=$(sfdisk -J $DEVICE) +GUID=$(echo $DATA|jq ".partitiontable|.id"|tr -d \") +UUID=$(echo $DATA|jq ".partitiontable.partitions[]|select(.node==\"$PARTDEVICE\").uuid"|tr -d \") + +# Información de la imagen. Valor inicial de efi: false +INFO=$(cat << EOT | jq . +{"name":"$IMGNAME","efi":"false","guid":"$GUID","uuid":"$UUID"} +EOT + ) + +if ogIsEfiActive; then + # Cambio valor de efi a true + INFO=$(echo $INFO| jq --arg aux true '. + {efi: $aux}') + + # Obtener partición EFI. + read -e EFIDISK EFIPART <<<"$(ogGetEsp)" + EFIPARTDEVICE=$(ogDiskToDev $EFIDISK $EFIPART) || return $? + if [ $DISK -eq $EFIDISK ]; then + EFIDEVICE=$DEVICE + EFIDATA=$DATA + EFIGUID=$GUID + else + EFIDEVICE=$(ogDiskToDev $EFIDISK) || return $? + EFIDATA=$(sfdisk -J $EFIDEVICE) + EFIGUID=$(echo $EFIDATA|jq ".partitiontable|.id"|tr -d \") + fi + EFIUUID=$(echo $EFIDATA|jq ".partitiontable.partitions[]|select(.node==\"$EFIPARTDEVICE\").uuid"|tr -d \") + + # Incluyo valor de EFIGUID (por si partición EFI en distinto disco que la de sistema) + INFO=$(echo $INFO| jq --arg aux $EFIGUID '. + {espguid: $aux}') + # Incluyo valor de EFIUUID + INFO=$(echo $INFO| jq --arg aux $EFIUUID '. + {espuuid: $aux}') +fi + +cat << EOT | jq . > $INFOFILE +$INFO +EOT +} diff --git a/client/shared/etc/lang.ca_ES.conf b/client/shared/etc/lang.ca_ES.conf index 1bb2483d..7dd96c72 100644 --- a/client/shared/etc/lang.ca_ES.conf +++ b/client/shared/etc/lang.ca_ES.conf @@ -131,6 +131,7 @@ MSG_HELP_ogCreateMbrImage="Genera una imagen del sector de arranque (MBR)." MSG_HELP_ogCreatePartitions="Define la estructura de particiones de un disco." MSG_HELP_ogCreatePartitionTable="Genera una tabla de particiones en caso de que no sea valida." MSG_HELP_ogCreateTorrent="" +MSG_HELP_ogCopyEfiBootLoader="Copia el cargador de arranque desde la partición EFI a la de sistema." MSG_HELP_ogDeleteCache="Elimina la partición de caché local." MSG_HELP_ogDeleteFile="Borra un fichero de un espacio de almacenamiento." MSG_HELP_ogDeletePartitionTable="Elimina la tabla de particiones del disco" @@ -196,7 +197,7 @@ MSG_HELP_ogGrubHidePartitions="Configura el grub del MBR para que oculte las par MSG_HELP_ogGrubInstallMbr="Instal·la el carregador d'arrencada GRUB al MBR del primer disc dur" MSG_HELP_ogGrubInstallPartition="Instal·la el carregador d'arrencada BURG al BootSector" MSG_HELP_ogGrubOgliveDefaultEntry="Configura la entrada de ogLive como la entrada por defecto de GRUB." -MSG_HELP_ogGrubUEFIConf="Genera el fichero grub.cfg de la partición EFI." +MSG_HELP_ogGrubUefiConf="Genera el fichero grub.cfg de la partición EFI." MSG_HELP_ogHelp="Muestra mensajes de ayudas para las funciones." MSG_HELP_ogHidePartition="Oculta una partición de Windows." MSG_HELP_ogIdToType="Devuelve el mnemónico asociado al identificador de tipo de partición." @@ -249,9 +250,12 @@ MSG_HELP_ogReduceImage="Reduce el tamaño de la imagen" MSG_HELP_ogRestoreAclImage="" MSG_HELP_ogRestoreBootLoaderImage="" MSG_HELP_ogRestoreDiskImage="Restaura una imagen de un disco completo." +MSG_HELP_ogRestoreEfiBootLoader="Copia el cargador de arranque de la partición de sistema a la partición EFI." MSG_HELP_ogRestoreImage="Restaura una imagen de sistema operativo." MSG_HELP_ogRestoreInfoImage="Restablece informacion del sistema: acl y enlaces simbolicos" MSG_HELP_ogRestoreMbrImage="Restaura una imagen del sector de arranque (MBR)." +MSG_HELP_ogRestoreUuidPartitions="Restaura los uuid de las particiones y la tabla de particiones." +MSG_HELP_ogSaveImageInfo="Crea un fichero con la información de la imagen." MSG_HELP_ogSetLinuxName="" MSG_HELP_ogSetPartitionActive="Establece el número de partición activa de un disco." MSG_HELP_ogSetPartitionId="Modifica el tipo de una partición física usando el mnemónico del tipo." @@ -283,7 +287,7 @@ MSG_HELP_ogUnmountImage="Desmonta la imagen" MSG_HELP_ogUnsetDirtyBit="" MSG_HELP_ogUpdateCacheIsNecesary="Comprueba si es necesario actualizar una archivo en la cache local." MSG_HELP_ogUpdatePartitionTable="Actualiza informacion tabla particiones del disco" -MSG_HELP_ogUUIDChange="Reemplaza el UUID de un sistema de ficheros." +MSG_HELP_ogUuidChange="Reemplaza el UUID de un sistema de ficheros." MSG_HELP_ogWaitSyncImage="" MSG_HELP_ogWindowsBootParameters="" MSG_HELP_ogWindowsRegisterPartition="" diff --git a/client/shared/etc/lang.en_GB.conf b/client/shared/etc/lang.en_GB.conf index ca12ed8e..9059e573 100644 --- a/client/shared/etc/lang.en_GB.conf +++ b/client/shared/etc/lang.en_GB.conf @@ -134,6 +134,7 @@ MSG_HELP_ogCreateMbrImage="Creates MBR image." MSG_HELP_ogCreatePartitions="Creates disk partition table." MSG_HELP_ogCreatePartitionTable="Creates partition table, if necessary." MSG_HELP_ogCreateTorrent="" +MSG_HELP_ogCopyEfiBootLoader="Copy the boot loader from the EFI partition to system partition." MSG_HELP_ogDeleteCache="Deletes local cache partition." MSG_HELP_ogDeleteFile="Deletes file from storage." MSG_HELP_ogDeletePartitionTable="Deletes disk table partition" @@ -199,7 +200,7 @@ MSG_HELP_ogGrubHidePartitions="Sets MBR grub to hide non starting Windows partit MSG_HELP_ogGrubInstallMbr="Installs GRUB boot loader on 1st HD MBR" MSG_HELP_ogGrubInstallPartition="Installs GRUB boot loader on BootSector" MSG_HELP_ogGrubOgliveDefaultEntry="Sets ogLive entry as default GRUB entry." -MSG_HELP_ogGrubUEFIConf="Generates the grub.cfg file of the EFI partition." +MSG_HELP_ogGrubUefiConf="Generates the grub.cfg file of the EFI partition." MSG_HELP_ogHelp="Shows functions help messages." MSG_HELP_ogHidePartition="Hides Windows partition." MSG_HELP_ogIdToType="Returns partition type identifier." @@ -252,9 +253,12 @@ MSG_HELP_ogReduceImage="Reduces image size." MSG_HELP_ogRestoreAclImage="Restores Windows ACL (Inf. must be on /tmp)." MSG_HELP_ogRestoreBootLoaderImage="" MSG_HELP_ogRestoreDiskImage="Restores disk image." +MSG_HELP_ogRestoreEfiBootLoader="Copy the boot loader from the system partition to the EFI partition." MSG_HELP_ogRestoreImage="Restore OS image." MSG_HELP_ogRestoreInfoImage="Restores system information: ACL and symbolic links" MSG_HELP_ogRestoreMbrImage="Restores boot sector image (MBR)." +MSG_HELP_ogRestoreUuidPartitions="Restores UUID of partitions and partition table." +MSG_HELP_ogSaveImageInfo="Creates the image information file." MSG_HELP_ogSetLinuxName="" MSG_HELP_ogSetPartitionActive="Sets active partition number of disk." MSG_HELP_ogSetPartitionId="Changes partition ID using mnemonic." @@ -286,7 +290,7 @@ MSG_HELP_ogUnmount="Unmounts file system." MSG_HELP_ogUnsetDirtyBit= MSG_HELP_ogUpdateCacheIsNecesary="Checks if necessary file update in local cache." MSG_HELP_ogUpdatePartitionTable="Updates disk partition table info " -MSG_HELP_ogUUIDChange="Replaces the filesystem UUID" +MSG_HELP_ogUuidChange="Replaces the filesystem UUID" MSG_HELP_ogWaitSyncImage="" MSG_HELP_ogWindowsBootParameters="" MSG_HELP_ogWindowsRegisterPartition="" diff --git a/client/shared/etc/lang.es_ES.conf b/client/shared/etc/lang.es_ES.conf index 281ac1d9..7766e923 100644 --- a/client/shared/etc/lang.es_ES.conf +++ b/client/shared/etc/lang.es_ES.conf @@ -131,6 +131,7 @@ MSG_HELP_ogCreateMbrImage="Genera una imagen del sector de arranque (MBR)." MSG_HELP_ogCreatePartitions="Define la estructura de particiones de un disco." MSG_HELP_ogCreatePartitionTable="Genera una tabla de particiones en caso de que no sea valida." MSG_HELP_ogCreateTorrent="" +MSG_HELP_ogCopyEfiBootLoader="Copia el cargador de arranque desde la partición EFI a la de sistema." MSG_HELP_ogDeleteCache="Elimina la partición de caché local." MSG_HELP_ogDeleteFile="Borra un fichero de un espacio de almacenamiento." MSG_HELP_ogDeletePartitionTable="Elimina la tabla de particiones del disco" @@ -196,7 +197,7 @@ MSG_HELP_ogGrubHidePartitions="Configura el grub del MBR para que oculte las par MSG_HELP_ogGrubInstallMbr="Instala el gestor de arranque GRUB en el MBR del primer disco duro" MSG_HELP_ogGrubInstallPartition="Instala el gestor de arranque GRUB en el BootSector" MSG_HELP_ogGrubOgliveDefaultEntry="Configura la entrada de ogLive como la entrada por defecto de GRUB." -MSG_HELP_ogGrubUEFIConf="Genera el fichero grub.cfg de la partición EFI." +MSG_HELP_ogGrubUefiConf="Genera el fichero grub.cfg de la partición EFI." MSG_HELP_ogHelp="Muestra mensajes de ayudas para las funciones." MSG_HELP_ogHidePartition="Oculta una partición de Windows." MSG_HELP_ogIdToType="Devuelve el mnemónico asociado al identificador de tipo de partición." @@ -249,9 +250,12 @@ MSG_HELP_ogReduceImage="Reduce el tamaño de la imagen" MSG_HELP_ogRestoreAclImage="Restaura las ACL de Windows (La informacion debe estar copiada en /tmp)." MSG_HELP_ogRestoreBootLoaderImage="" MSG_HELP_ogRestoreDiskImage="Restaura una imagen de un disco completo." +MSG_HELP_ogRestoreEfiBootLoader="Copia el cargador de arranque de la partición de sistema a la partición EFI." MSG_HELP_ogRestoreImage="Restaura una imagen de sistema operativo." MSG_HELP_ogRestoreInfoImage="Restablece información del sistema: ACL y enlaces simbolicos" MSG_HELP_ogRestoreMbrImage="Restaura una imagen del sector de arranque (MBR)." +MSG_HELP_ogRestoreUuidPartitions="Restaura los uuid de las particiones y la tabla de particiones." +MSG_HELP_ogSaveImageInfo="Crea un fichero con la información de la imagen." MSG_HELP_ogSetLinuxName="" MSG_HELP_ogSetPartitionActive="Establece el número de partición activa de un disco." MSG_HELP_ogSetPartitionId="Modifica el tipo de una partición física usando el mnemónico del tipo." @@ -283,7 +287,7 @@ MSG_HELP_ogUnmountImage="Desmonta la imagen." MSG_HELP_ogUnsetDirtyBit="" MSG_HELP_ogUpdateCacheIsNecesary="Comprueba si es necesario actualizar una archivo en la cache local." MSG_HELP_ogUpdatePartitionTable="Actualiza información de la tabla de particiones del disco." -MSG_HELP_ogUUIDChange="Reemplaza el UUID de un sistema de ficheros." +MSG_HELP_ogUuidChange="Reemplaza el UUID de un sistema de ficheros." MSG_HELP_ogWaitSyncImage="" MSG_HELP_ogWindowsBootParameters="" MSG_HELP_ogWindowsRegisterPartition="" diff --git a/client/shared/scripts/configureOs b/client/shared/scripts/configureOs index 4a7672a3..c251b0ff 100755 --- a/client/shared/scripts/configureOs +++ b/client/shared/scripts/configureOs @@ -5,6 +5,8 @@ #@brief Script para realizar la configuracion del sistema operativo restaurado. #@param 1 disco #@param 2 particion +#@param 3 Repositorio (CACHE, REPO o dirección IP) +#@param 4 Nombre canónico de la imagen (sin extensión) #@return #@TODO comprobar que el tipo de particion corresponde con el sistema de archivos. #@exception OG_ERR_FORMAT # 1 formato incorrecto. @@ -32,12 +34,45 @@ #@version 1.0.6b - llamadas opcionales para mejoras varias. Descomentar la instruccion para su activacion. ogConfigureFstab #@author Antonio J. Doblas Viso. Universidad de Malaga. #@date 2016-11-03 +#@version 1.1.1 - Equipos UEFI: cambia uuid de las particiones y restaura el cargador de arranque (Windows) (tickect #802) +#@author Irina Gomez, ETSII Universidad de Sevilla +#@date 2019-01-08 #*/ ## # Carga el configurador del engine y los parámetros de red. [ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg [ -f $DEVICECFG ] && source $DEVICECFG +PROG="$(basename $0)" + +# Para Windows en equipos EFI son necesarios cuatro parámetros +OSTYPE="$(ogGetOsType $1 $2)" +if [ ogIsEfiActive -a "$OSTYPE" == "Windows" ]; then + if [ $# -lt 4 ]; then + ogRaiseError session $OG_ERR_FORMAT + ogHelp "$PROG:" \ + "$PROG ndisco nparticion [ REPO|CACHE|IPSERVER ] [imagename]" \ + "$PROG 1 1" \ + "$PROG 1 2 REPO Windows (UEFI)" + exit $OG_ERR_FORMAT + fi + + REPO="${3^^}" + REPO=${REPO:-"REPO"} + IMGNAME="$4" + # Cambio de repositorio + if [ "$REPO" == "$(ogGetIpAddress)" -o "$REPO" == "CACHE" ]; then + REPO="CACHE" + else + ogCheckIpAddress "$REPO" + if [ $? == 0 -o "$REPO" == "REPO" ]; then + # Si falla el cambio -> salimos con error repositorio no valido + ogChangeRepo $REPO ${OGUNIT} || exit $(ogRaiseError $OG_ERR_NOTFOUND "$REPO $OGUNIT"; echo $?) + REPO="REPO" + fi + fi +fi + # Si el sistema de archivos no esta extendido, ampliarlo al tamaño de su partición. PARTSIZE=$(ogGetPartitionSize $1 $2) || exit $? FSSIZE=$(ogGetFsSize $1 $2) @@ -61,9 +96,13 @@ fi HOST="$(ogGetHostname)" # Post-configuración personalizada para cada tipo de sistema operativo. -OSTYPE="$(ogGetOsType $1 $2)" case "$OSTYPE" in Windows) # Postconfiguración de Windows. + # Si es UEFI pongo el UUID de la partición del modelo + if ogIsEfiActive; then + echo ogRestoreUuidPartitions $REPO $IMGNAME $1 $2 + ogRestoreUuidPartitions $REPO $IMGNAME $1 $2 + fi # Cambiar nombre en sistemas Windows. HOST=${HOST:-"pc"} ogSetWindowsName $1 $2 "$HOST" @@ -80,12 +119,17 @@ case "$OSTYPE" in ogInstallMiniSetup $1 $2 postconf.cmd ogUninstallWindowsClient $1 $2 postconf.cmd fi + # Si es UEFI copio el cargador de arranque a la partición EFI + if ogIsEfiActive; then + echo ogRestoreEfiBootLoader $1 $2 + ogRestoreEfiBootLoader $1 $2 + fi ;; Linux) # Postconfiguración de GNU/Linux. # Instalamos EFI Boot Loader if [ ogIsEfiActive ]; then # Cambio UUID del sistema de ficheros - ogUUIDChange $1 $2 + ogUuidChange $1 $2 ogConfigureFstab $1 $2 fi ## Instala (no configura) el codigo de arranque del Grub en la partición (no lo configura, se mantiene el original de la imagen) diff --git a/client/shared/scripts/createImage b/client/shared/scripts/createImage index 65da156b..b15955c0 100755 --- a/client/shared/scripts/createImage +++ b/client/shared/scripts/createImage @@ -35,6 +35,9 @@ #@version 1.1.0 - Se muestra el espacio necesario para alojar la imagen y el disponible (ticket #771) #@author Irina Gomez - ETSII Universidad de Sevilla #@date 2017-03-28 +#@version 1.1.1 - #802 Equipos EFI: se guarda el cargador de arranque y UUID de las particiones +#@author Irina Gomez - ETSII Universidad de Sevilla +#@date 2019-01-08 #*/ ## # Test 1. crear una imagen en un REPO sin espacio libre. @@ -123,10 +126,20 @@ ogEcho log session "[20] $MSG_HELP_ogCheckFs $PART $SIZEFS (KB)" ogUnmount $1 $2 2>/dev/null ogCheckFs $1 $2 || exit $(ogRaiseError $OG_ERR_PARTITION "ogCheckFs $1 $2" && echo $?) +# Si es UEFI copio el cargador de arranque a la partición +OSTYPE="$(ogGetOsType $1 $2)" +if [ ogIsEfiActive -a "$OSTYPE" == "Windows" ] ; then + ogEcho log session "[25] $MSG_HELP_ogCopyEfiBootLoader" + ogCopyEfiBootLoader $1 $2 + echo ogSaveImageInfo $1 $2 "$REPO" "$4" + ogSaveImageInfo $1 $2 "$REPO" "$4" + +fi + # Evaluar variable de engine.cfg para reducir el sistema de archivos en la creacion if [ "$IMGREDUCE" == "TRUE" ] then - ogEcho log session "[30]: $MSG_HELP_ogReduceFs" + ogEcho log session "[30] $MSG_HELP_ogReduceFs" ogReduceFs $1 $2 &>> $OGLOGCOMMAND || exit $(ogRaiseError $OG_ERR_REDUCEFS "$1 $2"; echo $?) NEWSIZEFS=$(ogGetFsSize $1 $2) TIMEAUX=$[SECONDS-TIME1] @@ -135,7 +148,7 @@ fi # Renombrar el fichero de imagen si ya existe. if [ -f "$IMGFILE" ]; then - ogEcho log session "[10] $MSG_SCRIPTS_FILE_RENAME \"$IMGFILE\" -> \"$IMGFILE.ant\"." + ogEcho log session "[35] $MSG_SCRIPTS_FILE_RENAME \"$IMGFILE\" -> \"$IMGFILE.ant\"." mv "$IMGFILE" "$IMGFILE.ant" mv "$IMGFILE.torrent" "$IMGFILE.torrent.ant" 2>/dev/null mv "$IMGFILE.sum" "$IMGFILE.sum.ant" 2>/dev/null @@ -170,4 +183,3 @@ TIME=$[SECONDS-TIME1] ogEcho log session "[100] $MSG_SCRIPTS_TIME_TOTAL $[TIME/60]m $[TIME%60]s" ogEcho log session " FileSystem $PART with $NEWSIZEFS KB data created onto file-image as $4 and used $IMGSIZE KB across DFS $ogprotocol" ogEcho log session " Image-file $4 metada: $IMGOS" - diff --git a/client/shared/scripts/deployImage b/client/shared/scripts/deployImage index 824da2af..59188f22 100755 --- a/client/shared/scripts/deployImage +++ b/client/shared/scripts/deployImage @@ -220,7 +220,7 @@ if which configureOsCustom &>/dev/null; then configureOsCustom "$DISK" "$PART" "$REPO" "$IMGNAME" else ogEcho log session "[90] $MSG_SCRIPTS_OS_CONFIGURE " - configureOs "$DISK" "$PART" + configureOs "$DISK" "$PART" "$REPO" "$IMGNAME" fi TIME=$[SECONDS-TIME1] |