diff options
author | irina <irinagomez@us.es> | 2014-09-26 10:14:34 +0000 |
---|---|---|
committer | irina <irinagomez@us.es> | 2014-09-26 10:14:34 +0000 |
commit | 512c692dec30c08e1ce967de592198816bbe0f00 (patch) | |
tree | ca77458ae008bbe9c2f8ce7504d73492257889bf | |
parent | a63fc89a5ae4fd71a1e9e5a1296e7e7d679b86ba (diff) |
#484 closed Arranque dual: funciones auxiliares para configurar el grub
git-svn-id: https://opengnsys.es/svn/branches/version1.0@4398 a21b9725-9963-47de-94b9-378ad31fedc9
-rwxr-xr-x | client/engine/Boot.lib | 190 | ||||
-rw-r--r-- | client/shared/etc/lang.ca_ES.conf | 3 | ||||
-rw-r--r-- | client/shared/etc/lang.en_GB.conf | 3 | ||||
-rw-r--r-- | client/shared/etc/lang.es_ES.conf | 3 |
4 files changed, 198 insertions, 1 deletions
diff --git a/client/engine/Boot.lib b/client/engine/Boot.lib index 3763f772..34eafad0 100755 --- a/client/engine/Boot.lib +++ b/client/engine/Boot.lib @@ -187,7 +187,7 @@ MNTDIR=$(ogMount $1 $2) || return $? # Fichero de configuración de GRUB. CONFDIR=$MNTDIR # Sistema de archivos de arranque (/boot). [ -d $MNTDIR/boot ] && CONFDIR=$MNTDIR/boot # Sist. archivos raíz con directorio boot. -for f in $MNTDIR/{,grubPARTITION/}{,boot/}{grub{,2},{,efi/}EFI/*}/{menu.lst,grub.cfg}; do +for f in $MNTDIR/{,grubPARTITION/}{,boot/}{grub{,2},{,efi/}EFI/*}/{menu.lst,grub.cfg,grub.cfg.backup.og}; do [ -r $f ] && CONFFILE=$f done [ -n "$CONFFILE" ] || ogRaiseError $OG_ERR_NOTFOUND "grub.cfg" || return $? @@ -982,3 +982,191 @@ MNTDIR=$(ogMount $1 $2) || return $? rm -f ${MNTDIR}/etc/udev/rules.d/70-persistent-net.rules } +#/** +# ogGrubAddOgclient num_disk num_part [ timeout ] +#@brief Crea entrada de menu grub para ogclient, tomando como paramentros del kernel los actuales del cliente. +#@param 1 Numero de disco +#@param 2 Numero de particion +#@param 3 timeout: Segundos de espera para iniciar el sistema operativo por defecto. +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND No existe kernel o initrd en cache. +#@exception OG_ERR_NOTFOUND No existe archivo de configuracion del grub. +# /// FIXME: Solo para el grub instalado en MBR por Opengnsys, ampliar para más casos. +#*/ + +ogGrubAddOgclient () { + local TIMEOUT DIRMOUNT GRUBGFC PARTTABLETYPE NUMDISK NUMPART KERNEL NUMLINE MENUENTRY + + # Si se solicita, mostrar ayuda. + if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition time_out" \ + "$FUNCNAME 1 6 15" + return + fi + + # Error si no se reciben 2 parámetros. + [ $# -lt 2 ] && return $(ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME num_disk num_part [ timeout ]"; echo $?) + TIMEOUT="$3" + + # Error si no existe el kernel y el initrd en la cache. + # Falta crear nuevo codigo de error. + [ -r $OGCAC/boot/ogvmlinuz -a -r $OGCAC/boot/oginitrd.img ] || return $(ogRaiseError log session OG_ERR_NOTFOUND "CACHE: ogvmlinuz, oginitrd.img" 1>&2; echo ?) + + # Archivo de configuracion del grub + DIRMOUNT=$(ogMount $1 $2) + GRUBGFC="$DIRMOUNT/boot/grubMBR/boot/grub/grub.cfg" + + # Error si no existe archivo del grub + [ -r $GRUBGFC ] || return $(ogRaiseError log session $OG_ERR_NOTFOUND "$GRUBGFC" 1>&2; echo $?) + + # Si existe la entrada de opengnsys nos salimos. + grep "menuentry Opengnsys" $GRUBGFC &>/dev/null && return 0 + + # Tipo de tabla de particiones + PARTTABLETYPE=$(ogGetPartitionTableType $1 | tr [:upper:] [:lower:]) + + # Localizacion de la cache + read NUMDISK NUMPART <<< $(ogFindCache) + let NUMDISK=$NUMDISK-1 + # kernel y sus opciones. Pasamos a modo usuario + KERNEL="/boot/ogvmlinuz $(sed -e s/^.*linuz//g -e s/ogactiveadmin=true/ogactiveadmin=false/g /proc/cmdline)" + # Numero de línea de la primera entrada del grub. + NUMLINE=$(grep -n -m 1 "^menuentry" $GRUBGFC|cut -d: -f1) + # Texto de la entrada de opengnsys +MENUENTRY="menuentry "Opengnsys" --class gnu-linux --class gnu --class os { \n \ +\tinsmod part_$PARTTABLETYPE \n \ +\tinsmod ext2 \n \ +\tset root='(hd${NUMDISK},$PARTTABLETYPE${NUMPART})' \n \ +\tlinux $KERNEL \n \ +\tinitrd /boot/oginitrd.img \n \ +}" + + + # Insertamos la entrada de opengnsys antes de la primera entrada existente. + sed -i "${NUMLINE}i\ $MENUENTRY" $GRUBGFC + + # Ponemos que la entrada por defecto sea la primera. + sed -i s/"set.*default.*$"/"set default=\"0\""/g $GRUBGFC + + # Si me dan valor para timeout lo cambio en el grub. + [ $TIMEOUT ] && sed -i s/timeout=.*$/timeout=$TIMEOUT/g $GRUBGFC +} + + +#/** +# ogGrubHidePartitions num_disk num_part +#@brief Configura el grub para que oculte las particiones de windows que no se esten iniciando. +#@param 1 Numero de disco +#@param 2 Numero de particion +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception No existe archivo de configuracion del grub. +#@ /// FIXME: Solo para el grub instalado en MBR por Opengnsys, ampliar para más casos. +#*/ +function ogGrubHidePartitions { + local DIRMOUNT GRUBGFC PARTTABLETYPE WINENTRY ENTRY TEXT ENTRY2 LINE2 PART2 HIDDEN + + # Si se solicita, mostrar ayuda. + if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \ + "$FUNCNAME 1 6" + return + fi + + # Error si no se reciben 2 parámetros. + [ $# -lt 2 ] && return $(ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME num_disk num_part"; echo $?) + + # Archivo de configuracion del grub + DIRMOUNT=$(ogMount $1 $2) + GRUBGFC="$DIRMOUNT/boot/grubMBR/boot/grub/grub.cfg" + + # Error si no existe archivo del grub + [ -r $GRUBGFC ] || return $(ogRaiseError log session $OG_ERR_NOTFOUND "$GRUBGFC" 1>&2; echo $?) + + # Si solo hay una entrada de Windows me salgo + [ $(grep -n "menuentry.*Windows" $GRUBGFC |wc -l) -eq 1 ] && return 0 + + # Elimino llamadas a parttool, se han incluido en otras ejecuciones de esta funcion. + sed -i '/parttool/d' $GRUBGFC + + PARTTABLETYPE=$(ogGetPartitionTableType $1 | tr [:upper:] [:lower:]) + + # Entradas de Windows: numero de linea y particion. De mayor a menor. + WINENTRY=$(awk '/menuentry.*Windows/ { gsub(/\/dev\/sda/,""); gsub(/\)\"/, ""); print NR":"$6} ' $GRUBGFC | sed '1!G;h;$!d' ) + # Modifico todas las entradas de Windows. + for ENTRY in $WINENTRY; do + LINE=${ENTRY%:*} + # En cada entrada, oculto o muestro cada particion. + TEXT="" + for ENTRY2 in $WINENTRY; do + LINE2=${ENTRY2%:*} + PART2=${ENTRY2#*:} + # Muestro solo la particion de la entrada actual. + [ $LINE2 -eq $LINE ] && HIDDEN="-" || HIDDEN="+" + + TEXT="\tparttool (hd0,$PARTTABLETYPE$PART2} hidden$HIDDEN \n$TEXT" + done + + sed -i "${LINE}a\ $TEXT" $GRUBGFC + done + + # Activamos la particion que se inicia en todas las entradas de windows. + sed -i "/chainloader/i\\\tparttool \$\{root\} boot+" $GRUBGFC + +} + +#/** +# ogGrubDeleteEntry num_disk num_part num_part_delete +#@brief Borra en el grub las entradas para el inicio en una particion. +#@param 1 Numero de disco donde esta el grub +#@param 2 Numero de particion donde esta el grub +#@parm 3 Numero de la particion de la que borramos las entradas +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception No existe archivo de configuracion del grub. +#@ /// FIXME: Solo para el grub instalado en MBR por Opengnsys, ampliar para más casos. +#*/ + + +function ogGrubDeleteEntry { + local DIRMOUNT GRUBGFC MENUENTRY DELETEENTRY ENDENTRY ENTRY + + # Si se solicita, mostrar ayuda. + if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition int_npartition_delete" \ + "$FUNCNAME 1 6 2" + return + fi + + # Error si no se reciben 3 parámetros. + [ $# -lt 3 ] && return $(ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME num_disk num_part"; echo $?) + + # Archivo de configuracion del grub + DIRMOUNT=$(ogMount $1 $2) + GRUBGFC="$DIRMOUNT/boot/grubMBR/boot/grub/grub.cfg" + + # Error si no existe archivo del grub) + [ -r $GRUBGFC ] || return $(ogRaiseError log session $OG_ERR_NOTFOUND "$GRUBGFC"; echo $?) + + # Numero de linea de cada entrada, de mayor a menor. + MENUENTRY="$(grep -n -e menuentry.*/dev/sda $GRUBGFC| cut -d: -f1 | sed '1!G;h;$!d' )" + + # Entradas que hay que borrar. + DELETEENTRY=$(grep -n menuentry.*/dev/sda$3 $GRUBGFC| cut -d: -f1) + + # Recorremos el fichero del final hacia el principio. + ENDENTRY="$(wc -l $GRUBGFC|cut -d" " -f1)" + for ENTRY in $MENUENTRY; do + # Comprobamos si hay que borrar la entrada. + if ogCheckStringInGroup $ENTRY "$DELETEENTRY" ; then + let ENDENTRY=$ENDENTRY-1 + sed -i -e $ENTRY,${ENDENTRY}d $GRUBGFC + fi + + # Guardamos el número de línea de la entrada, que sera el final de la siguiente. + ENDENTRY=$ENTRY + done + +} + diff --git a/client/shared/etc/lang.ca_ES.conf b/client/shared/etc/lang.ca_ES.conf index 5dfea567..ecad9b6b 100644 --- a/client/shared/etc/lang.ca_ES.conf +++ b/client/shared/etc/lang.ca_ES.conf @@ -142,6 +142,9 @@ MSG_HELP_ogGetRegistryValue="Devuelve el dato de un valor del registro de Window MSG_HELP_ogGetRepoIp="Devuelve la dirección IP del repositorio de datos." MSG_HELP_ogGetServerIp="Devuelve la dirección IP del servidor principal." MSG_HELP_ogGetWindowsName="Devuelve el nombre del cliente guardado en el registro de Windows." +MSG_HELP_ogGrubAddOgclient="Incluye en el grub del MBR una entrada llamando al cliente de opengnsys." +MSG_HELP_ogGrubDeleteEntry="Borra en el grub del MBR las entradas para el inicio en una particion." +MSG_HELP_ogGrubHidePartitions="Configura el grub del MBR para que oculte las particiones de windows que no se esten iniciando." 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." diff --git a/client/shared/etc/lang.en_GB.conf b/client/shared/etc/lang.en_GB.conf index f0954762..69965eeb 100644 --- a/client/shared/etc/lang.en_GB.conf +++ b/client/shared/etc/lang.en_GB.conf @@ -142,6 +142,9 @@ MSG_HELP_ogGetRegistryValue="Return a data value from the Windows registry." MSG_HELP_ogGetRepoIp="Return the IP address of an OpenGnsys Repository." MSG_HELP_ogGetServerIp="Return the main OpenGnSys Server IP address." MSG_HELP_ogGetWindowsName="Return the client name saved in the Windows registry." +MSG_HELP_ogGrubAddOgclient="Incluye en el grub del MBR una entrada llamando al cliente de opengnsys." +MSG_HELP_ogGrubDeleteEntry="Borra en el grub del MBR las entradas para el inicio en una particion." +MSG_HELP_ogGrubHidePartitions="Configura el grub del MBR para que oculte las particiones de windows que no se esten iniciando." MSG_HELP_ogHelp="Show the help menssages for functions." MSG_HELP_ogHidePartition="Hide a Windows partition." MSG_HELP_ogIdToType="Devuelve el mnemónico asociado al identificador de tipo de partición." diff --git a/client/shared/etc/lang.es_ES.conf b/client/shared/etc/lang.es_ES.conf index 29c71a16..7fe85629 100644 --- a/client/shared/etc/lang.es_ES.conf +++ b/client/shared/etc/lang.es_ES.conf @@ -142,6 +142,9 @@ MSG_HELP_ogGetRegistryValue="Devuelve el dato de un valor del registro de Window MSG_HELP_ogGetRepoIp="Devuelve la dirección IP del repositorio de datos." MSG_HELP_ogGetServerIp="Devuelve la dirección IP del servidor principal." MSG_HELP_ogGetWindowsName="Devuelve el nombre del cliente guardado en el registro de Windows." +MSG_HELP_ogGrubAddOgclient="Incluye en el grub del MBR una entrada llamando al cliente de opengnsys." +MSG_HELP_ogGrubDeleteEntry="Borra en el grub del MBR las entradas para el inicio en una particion." +MSG_HELP_ogGrubHidePartitions="Configura el grub del MBR para que oculte las particiones de windows que no se esten iniciando." 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." |