summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoririna <irinagomez@us.es>2014-09-26 10:14:34 +0000
committeririna <irinagomez@us.es>2014-09-26 10:14:34 +0000
commit512c692dec30c08e1ce967de592198816bbe0f00 (patch)
treeca77458ae008bbe9c2f8ce7504d73492257889bf
parenta63fc89a5ae4fd71a1e9e5a1296e7e7d679b86ba (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-xclient/engine/Boot.lib190
-rw-r--r--client/shared/etc/lang.ca_ES.conf3
-rw-r--r--client/shared/etc/lang.en_GB.conf3
-rw-r--r--client/shared/etc/lang.es_ES.conf3
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."