source: client/engine/Boot.lib @ 0a735488

918-git-images-111dconfigfileconfigure-oglivegit-imageslgromero-new-oglivemainmaint-cronmount-efivarfsmultivmmultivm-ogboot-installerogClonningEngineogboot-installer-jenkinsoglive-ipv6test-python-scriptsticket-301ticket-50ticket-50-oldticket-577ticket-585ticket-611ticket-612ticket-693ticket-700ubu24tplunification2use-local-agent-oglivevarios-instalacionwebconsole3
Last change on this file since 0a735488 was 26255c2, checked in by irina <irinagomez@…>, 10 years ago

#484 funcion ogGrubHidePartitions: correccion errata.

git-svn-id: https://opengnsys.es/svn/branches/version1.0@4423 a21b9725-9963-47de-94b9-378ad31fedc9

  • Property mode set to 100755
File size: 40.6 KB
Line 
1#!/bin/bash
2#/**
3#@file    Boot.lib
4#@brief   Librería o clase Boot
5#@class   Boot
6#@brief   Funciones para arranque y post-configuración de sistemas de archivos.
7#@version 1.0.6
8#@warning License: GNU GPLv3+
9#*/
10
11
12#/**
13#         ogBoot int_ndisk int_npartition
14#@brief   Inicia el proceso de arranque de un sistema de archivos.
15#@param   int_ndisk      nº de orden del disco
16#@param   int_npartition nº de orden de la partición
17#@return  (activar el sistema de archivos).
18#@exception OG_ERR_FORMAT    Formato incorrecto.
19#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
20#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
21#@exception OG_ERR_NOTOS     La partición no tiene instalado un sistema operativo.
22#@note    En Linux, debe arrancarse la partición del directorio \c /boot
23#@version 0.1 - Integración para OpenGnSys. - EAC: HDboot; BootLinuxEX en Boot.lib 
24#@author  Antonio J. Doblas Viso, Universidad de Malaga
25#@date    2008-10-27
26#@version 0.9 - Adaptación para OpenGnSys.
27#@author  Ramon Gomez, ETSII Universidad de Sevilla
28#@date    2009-09-11
29#@version 1.0.4 - Soporta modo de arranque Windows (parámetro de inicio "winboot").
30#@author  Ramon Gomez, ETSII Universidad de Sevilla
31#@date    2012-04-12
32#@version 1.0.6 - Selección a partir de tipo de sistema operativo (en vez de S.F.).
33#@author  Ramon Gomez, ETSII Universidad de Sevilla
34#@date    2014-08-28
35#*/ ##
36function ogBoot ()
37{
38# Variables locales.
39local PART TYPE MNTDIR PARAMS KERNEL INITRD APPEND FILE LOADER f
40
41# Si se solicita, mostrar ayuda.
42if [ "$*" == "help" ]; then
43    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
44           "$FUNCNAME 1 1"
45    return
46fi
47# Error si no se reciben 2 parámetros.
48[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
49
50# Detectar tipo de sistema de archivos y montarlo.
51PART=$(ogDiskToDev $1 $2) || return $?
52TYPE=$(ogGetOsType $1 $2) || return $?
53# Error si no puede montar sistema de archivos.
54MNTDIR=$(ogMount $1 $2) || return $?
55
56case "$TYPE" in
57    Linux|Android)
58        # Obtiene los parámetros de arranque para Linux.
59        PARAMS=$(ogLinuxBootParameters $1 $2) || return $?
60        read -e KERNEL INITRD APPEND <<<"$PARAMS"
61        # Si no hay kernel, no hay sistema operativo.
62        [ -n "$KERNEL" ] || ogRaiseError $OG_ERR_NOTOS "$1 $2 ($TYPE)" || return $?
63        # Arrancar de partición distinta a la original.
64        [ -e "$MNTDIR/etc" ] && APPEND=$(echo $APPEND | awk -v P="$PART " '{sub (/root=[-+=_/a-zA-Z0-9]* /,"root="P);print}')
65        # Configurar kernel Linux con los parámetros leídos de su GRUB.
66        kexec -l "${MNTDIR}${KERNEL}" --append="$APPEND" --initrd="${MNTDIR}${INITRD}"
67        kexec -e &
68        ;;
69    Windows|WinLoader)
70        # Compruebar si hay un cargador de Windows.
71        for f in io.sys ntldr bootmgr; do
72            FILE="$(ogGetPath $1 $2 $f 2>/dev/null)"
73            [ -n "$FILE" ] && LOADER="$f"
74        done
75        [ -n "$LOADER" ] || ogRaiseError $OG_ERR_NOTOS "$1 $2 ($TYPE)" || return $?
76        if [ "$winboot" == "kexec" ]; then
77            # Modo de arranque en caliente (con kexec).
78            cp $OGLIB/grub4dos/* $MNTDIR    # */ (Comentario Doxygen)
79            kexec -l $MNTDIR/grub.exe --append=--config-file="root (hd$[$1-1],$[$2-1]); chainloader (hd$[$1-1],$[$2-1])/$LOADER; tpm --init"
80            kexec -e &
81        else
82            # Modo de arranque por reinicio (con reboot).
83            dd if=/dev/zero of=${MNTDIR}/ogboot.me bs=1024 count=3
84            dd if=/dev/zero of=${MNTDIR}/ogboot.firstboot bs=1024 count=3
85            dd if=/dev/zero of=${MNTDIR}/ogboot.secondboot bs=1024 count=3
86            if  [ -z "$(ogGetRegistryValue $MNTDIR SOFTWARE '\Microsoft\Windows\CurrentVersion\Run\ogcleannboot')" ]; then               
87            ogAddRegistryValue $MNTDIR SOFTWARE '\Microsoft\Windows\CurrentVersion\Run\ogcleanboot'
88            ogSetRegistryValue $MNTDIR SOFTWARE '\Microsoft\Windows\CurrentVersion\Run\ogcleanboot' "cmd /c del c:\ogboot.*"
89            fi
90            # Activar la partición.
91            ogSetPartitionActive $1 $2
92            reboot
93        fi
94        ;;
95    MacOS)
96        # Modo de arranque por reinicio.
97        # Nota: el cliente tiene que tener configurado correctamente Grub.
98        touch ${MNTDIR}/boot.mac &>/dev/null
99        reboot
100        ;;
101    GrubLoader)
102        # Reiniciar.
103        reboot
104        ;;
105    *)  ogRaiseError $OG_ERR_NOTOS "$1 $2 ${TYPE:+($TYPE)}"
106        return $?
107        ;;
108esac
109}
110
111
112#/**
113#         ogGetWindowsName int_ndisk int_npartition
114#@brief   Muestra el nombre del equipo en el registro de Windows.
115#@param   int_ndisk      nº de orden del disco
116#@param   int_npartition nº de orden de la partición
117#@return  str_name - nombre del equipo
118#@exception OG_ERR_FORMAT    Formato incorrecto.
119#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
120#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
121#@version 0.9 - Adaptación para OpenGnSys.
122#@author  Ramon Gomez, ETSII Universidad de Sevilla
123#@date    2009-09-23
124#*/ ##
125function ogGetWindowsName ()
126{
127# Variables locales.
128local PART MNTDIR
129
130# Si se solicita, mostrar ayuda.
131if [ "$*" == "help" ]; then
132    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
133           "$FUNCNAME 1 1  ==>  PRACTICA-PC"
134    return
135fi
136# Error si no se reciben 2 parámetros.
137[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
138
139# Montar el sistema de archivos.
140MNTDIR=$(ogMount $1 $2) || return $?
141
142# Obtener dato del valor de registro.
143ogGetRegistryValue $MNTDIR system '\ControlSet001\Control\ComputerName\ComputerName\ComputerName'
144}
145
146
147#/**
148#         ogLinuxBootParameters int_ndisk int_nfilesys
149#@brief   Muestra los parámetros de arranque de un sistema de archivos Linux.
150#@param   int_ndisk      nº de orden del disco
151#@param   int_nfilesys   nº de orden del sistema de archivos
152#@return  str_kernel str_initrd str_parameters ...
153#@exception OG_ERR_FORMAT    Formato incorrecto.
154#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
155#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
156#@warning Función básica usada por \c ogBoot
157#@version 0.9 - Primera adaptación para OpenGnSys.
158#@author  Ramon Gomez, ETSII Universidad de Sevilla
159#@date    2009-09-11
160#@version 0.9.2 - Soporta partición /boot independiente.
161#@author  Ramon Gomez, ETSII Universidad de Sevilla
162#@date    2010-07-20
163#@version 1.0.5 - Mejoras en tratamiento de GRUB2.
164#@author  Ramon Gomez, ETSII Universidad de Sevilla
165#@date    2013-05-14
166#@version 1.0.6 - Detectar instalaciones sobre EFI.
167#@author  Ramon Gomez, ETSII Universidad de Sevilla
168#@date    2014-09-15
169#*/ ##
170function ogLinuxBootParameters ()
171{
172# Variables locales.
173local MNTDIR CONFDIR CONFFILE f
174
175# Si se solicita, mostrar ayuda.
176if [ "$*" == "help" ]; then
177    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \
178           "$FUNCNAME 1 2  ==>  /vmlinuz-3.5.0-21-generic /initrd.img-3.5.0-21-generic root=/dev/sda2 ro splash"
179    return
180fi
181# Error si no se reciben 2 parámetros.
182[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
183
184# Detectar id. de tipo de partición y codificar al mnemonico.
185MNTDIR=$(ogMount $1 $2) || return $?
186
187# Fichero de configuración de GRUB.
188CONFDIR=$MNTDIR                               # Sistema de archivos de arranque (/boot).
189[ -d $MNTDIR/boot ] && CONFDIR=$MNTDIR/boot   # Sist. archivos raíz con directorio boot.
190for f in $MNTDIR/{,grubPARTITION/}{,boot/}{grub{,2},{,efi/}EFI/*}/{menu.lst,grub.cfg,grub.cfg.backup.og}; do
191    [ -r $f ] && CONFFILE=$f
192done
193[ -n "$CONFFILE" ] || ogRaiseError $OG_ERR_NOTFOUND "grub.cfg" || return $?
194
195# Toma del fichero de configuracion los valores del kernel, initrd
196#       y parámetros de arranque usando las cláusulas por defecto
197#       ("default" en GRUB1, "set default" en GRUB2)
198#       y los formatea para que sean compatibles con \c kexec .  */
199# /* (comentario Doxygen)
200awk 'BEGIN {cont=-1;}
201     $1~/^default$/     {sub(/=/," "); def=$2;}
202     $1~/^set$/ && $2~/^default/ { gsub(/[="]/," "); def=$3;
203                                   if (def ~ /saved_entry/) def=0;
204                                 }
205     $1~/^(title|menuentry)$/ {cont++}
206     $1~/^(kernel|linux(efi)?)$/ { if (def==cont) {
207                                       kern=$2;
208                                       sub($1,""); sub($1,""); sub(/^[ \t]*/,""); app=$0
209                                   } # /* (comentario Doxygen)
210                                 }
211     $1~/^initrd(efi)?$/ {if (def==cont) init=$2}
212     END {if (kern!="") printf("%s %s %s", kern,init,app)}
213    ' $CONFFILE
214# */ (comentario Doxygen)
215}
216
217
218#/**
219#         ogSetWindowsName int_ndisk int_nfilesys str_name
220#@brief   Establece el nombre del equipo en el registro de Windows.
221#@param   int_ndisk      nº de orden del disco
222#@param   int_nfilesys   nº de orden del sistema de archivos
223#@param   str_name       nombre asignado
224#@return  (nada)
225#@exception OG_ERR_FORMAT     Formato incorrecto.
226#@exception OG_ERR_NOTFOUND   Disco o particion no corresponden con un dispositivo.
227#@exception OG_ERR_PARTITION  Tipo de partición desconocido o no se puede montar.
228#@exception OG_ERR_OUTOFLIMIT Nombre Netbios con más de 15 caracteres.
229#@version 0.9 - Adaptación a OpenGnSys.
230#@author  Ramon Gomez, ETSII Universidad de Sevilla
231#@date    2009-09-24
232#@version 1.0.5 - Establecer restricción de tamaño de nombre Netbios.
233#@author  Ramon Gomez, ETSII Universidad de Sevilla
234#@date    2013-03-20
235#*/ ##
236function ogSetWindowsName ()
237{
238# Variables locales.
239local PART MNTDIR NAME
240
241# Si se solicita, mostrar ayuda.
242if [ "$*" == "help" ]; then
243    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_filesys str_name" \
244           "$FUNCNAME 1 1 PRACTICA-PC"
245    return
246fi
247# Error si no se reciben 3 parámetros.
248[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $?
249# Error si el nombre supera los 15 caracteres.
250[ ${#3} -le 15 ] || ogRaiseError $OG_ERR_OUTOFLIMIT "\"${3:0:15}...\"" || return $?
251
252# Montar el sistema de archivos.
253MNTDIR=$(ogMount $1 $2) || return $?
254
255# Asignar nombre.
256NAME="$3"
257
258# Modificar datos de los valores de registro.
259ogSetRegistryValue $MNTDIR system '\ControlSet001\Control\ComputerName\ComputerName\ComputerName' "$NAME" 2>/dev/null
260ogSetRegistryValue $MNTDIR system '\ControlSet001\Services\Tcpip\Parameters\Hostname' "$NAME" 2>/dev/null
261ogSetRegistryValue $MNTDIR system '\ControlSet001\services\Tcpip\Parameters\Hostname' "$NAME" 2>/dev/null
262ogSetRegistryValue $MNTDIR system '\ControlSet001\Services\Tcpip\Parameters\NV Hostname' "$NAME" 2>/dev/null
263ogSetRegistryValue $MNTDIR system '\ControlSet001\services\Tcpip\Parameters\NV Hostname' "$NAME" 2>/dev/null
264}
265
266
267#/**
268#         ogSetWinlogonUser int_ndisk int_npartition str_username
269#@brief   Establece el nombre de usuario por defecto en la entrada de Windows.
270#@param   int_ndisk      nº de orden del disco
271#@param   int_npartition nº de orden de la partición
272#@param   str_username   nombre de usuario por defecto
273#@return  (nada)
274#@exception OG_ERR_FORMAT    Formato incorrecto.
275#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
276#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
277#@version 0.9.2 - Adaptación a OpenGnSys.
278#@author  Ramon Gomez, ETSII Universidad de Sevilla
279#@date    2010-07-20
280#*/ ##
281function ogSetWinlogonUser ()
282{
283# Variables locales.
284local PART MNTDIR NAME
285
286# Si se solicita, mostrar ayuda.
287if [ "$*" == "help" ]; then
288    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition str_username" \
289           "$FUNCNAME 1 1 USUARIO"
290    return
291fi
292# Error si no se reciben 3 parámetros.
293[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $?
294
295# Montar el sistema de archivos.
296MNTDIR=$(ogMount $1 $2) || return $?
297
298# Asignar nombre.
299NAME="$3"
300
301# Modificar datos en el registro.
302ogSetRegistryValue $MNTDIR SOFTWARE '\Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultUserName' "$3"
303}
304
305
306#/**
307#         ogBootMbrXP int_ndisk
308#@brief   Genera un nuevo Master Boot Record en el disco duro indicado, compatible con los SO tipo Windows
309#@param   int_ndisk      nº de orden del disco
310#@return  salida del programa my-sys
311#@exception OG_ERR_FORMAT    Formato incorrecto.
312#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
313#@version 0.9 - Adaptación a OpenGnSys.
314#@author  Antonio J. Doblas Viso. Universidad de Málaga
315#@date    2009-09-24
316#*/ ##
317
318function ogBootMbrXP ()
319{
320# Variables locales.
321local DISK
322
323# Si se solicita, mostrar ayuda.
324if [ "$*" == "help" ]; then
325    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk " \
326           "$FUNCNAME 1"
327    return
328fi
329# Error si no se recibe 1 parámetro.
330[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
331
332DISK="$(ogDiskToDev $1)" || return $?
333ms-sys -z -f $DISK
334ms-sys -m -f $DISK
335}
336
337
338#/**
339#         ogBootMbrGeneric int_ndisk
340#@brief   Genera un nuevo Codigo de arranque en el MBR del disco indicado, compatible con los SO tipo Windows, Linux.
341#@param   int_ndisk      nº de orden del disco
342#@return  salida del programa my-sys
343#@exception OG_ERR_FORMAT    Formato incorrecto.
344#@exception OG_ERR_NOTFOUND Tipo de partición desconocido o no se puede montar.
345#@version 0.9 - Adaptación a OpenGnSys.
346#@author  Antonio J. Doblas Viso. Universidad de Málaga
347#@date    2009-09-24
348#*/ ##
349
350function ogBootMbrGeneric ()
351{
352# Variables locales.
353local DISK
354
355# Si se solicita, mostrar ayuda.
356if [ "$*" == "help" ]; then
357    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk " \
358           "$FUNCNAME 1 "
359    return
360fi
361# Error si no se recibe 1 parámetro.
362[ $# == 1 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?)
363
364DISK="$(ogDiskToDev $1)" || return $?
365ms-sys -z -f $DISK
366ms-sys -s -f $DISK
367}
368
369
370
371
372#/**
373#         ogFixBootSector int_ndisk int_parition
374#@brief   Corrige el boot sector de una particion activa para MS windows/dos -fat-ntfs
375#@param   int_ndisk      nº de orden del disco
376#@param   int_partition     nº de particion
377#@return 
378#@exception OG_ERR_FORMAT    Formato incorrecto.
379#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
380#@version 0.9 - Adaptación a OpenGnSys.
381#@author  Antonio J. Doblas Viso. Universidad de Málaga
382#@date    2009-09-24
383#*/ ##
384
385function ogFixBootSector ()
386{
387# Variables locales.
388local PARTYPE DISK PART FILE
389
390# Si se solicita, mostrar ayuda.
391if [ "$*" == "help" ]; then
392    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_partition " \
393           "$FUNCNAME 1 1 "
394    return
395fi
396
397# Error si no se reciben 2 parámetros.
398[ $# == 2 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?)
399
400#TODO, solo si la particion existe
401#TODO, solo si es ntfs o fat
402PARTYPE=$(ogGetPartitionId $1 $2)
403case "$PARTYPE" in
404        1|4|6|7|b|c|e|f|17|700)
405        ;;
406        *)
407        return $(ogRaiseError $OG_ERR_PARTITION; echo $?)
408        ;;
409esac
410
411ogUnmount $1 $2 || return $(ogRaiseError $OG_ERR_PARTITION; echo $?)
412
413#Preparando instruccion
414let DISK=$1-1   
415PART=$2
416FILE=/tmp/temp$$
417cat > $FILE <<EOF
418disk=$DISK
419main_part=$PART
420fix_first_sector=yes
421EOF
422
423spartlnx.run -cui -nm -a -f $FILE &
424sleep 5
425ps aux > /dev/null | grep $! | grep -E "T|S" | kill -9 $! > /dev/null
426rm -f $FILE
427}
428
429
430
431#/**
432#         ogWindowsBootParameters int_ndisk int_parition
433#@brief   Configura el gestor de arranque de windows 7 / vista / XP / 2000
434#@param   int_ndisk      nº de orden del disco
435#@param   int_partition     nº de particion
436#@return 
437#@exception OG_ERR_FORMAT    Formato incorrecto.
438#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
439#@version 0.9 - Integración desde EAC para OpenGnSys.
440#@author  Antonio J. Doblas Viso. Universidad de Málaga
441#@date    2009-09-24
442#@version 1.0.1 - Adapatacion para OpenGnsys.
443#@author  Antonio J. Doblas Viso. Universidad de Málaga
444#@date    2011-05-20
445#@version 1.0.5 - Soporte para Windows 8 y Windows 8.1.
446#@author  Ramon Gomez, ETSII Universidad de Sevilla
447#@date    2014-01-28
448#*/ ##
449
450function ogWindowsBootParameters ()
451{
452# Variables locales.
453local PART DISK FILE VERSION WINVER MOUNT
454
455# Si se solicita, mostrar ayuda.
456if [ "$*" == "help" ]; then
457    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_partition " \
458           "$FUNCNAME 1 1 "
459    return
460fi
461
462# Error si no se reciben 2 parámetros.
463[ $# == 2 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?)
464
465ogDiskToDev $1 $2 || return $(ogRaiseError $OG_ERR_PARTITION; echo $?)
466
467#Preparando variables adaptadas a sintaxis windows.
468let DISK=$1-1
469PART=$2
470FILE=/tmp/temp$$
471
472VERSION=$(ogGetOsVersion $1 $2)
473
474if echo "$VERSION" | grep "Windows 8.1"
475then
476        WINVER="Windows 8.1"
477elif echo "$VERSION" | grep "Windows 8"
478then
479        WINVER="Windows 8"
480elif echo "$VERSION" | grep "Windows 7"
481then
482        WINVER="Windows 7"
483elif echo "$VERSION" | grep "Windows Seven"
484then
485        WINVER="Windows Vista"
486elif echo "$VERSION" | grep "XP"
487then
488        MOUNT=$(ogMount $1 $2)
489        [ -f ${MOUNT}/boot.ini ] || return $(ogRaiseError $OG_ERR_NOTOS; echo $?)
490        cat ${MOUNT}/boot.ini | sed s/partition\([0-9]\)/partition\($PART\)/g | sed s/rdisk\([0-9]\)/rdisk\($DISK\)/g > ${MOUNT}/tmp.boot.ini; mv ${MOUNT}/tmp.boot.ini ${MOUNT}/boot.ini
491        return 0
492else
493        return $(ogRaiseError $OG_ERR_NOTOS; echo $?)
494fi
495
496ogUnmount $1 $2 || return $(ogRaiseError $OG_ERR_PARTITION; echo $?)
497
498
499#Preparando instruccion Windows Resume Application
500cat > $FILE <<EOF
501boot_disk=$DISK
502boot_main_part=$PART
503disk=$DISK
504main_part=$PART
505boot_entry=Windows Resume Application
506EOF
507spartlnx.run -cui -nm -w -f $FILE &
508sleep 5
509ps aux > /dev/null | grep $! | grep -E "T|S" | kill -9 $! > /dev/null
510
511 
512
513#Preparando instruccion tipo windows
514cat > $FILE <<EOF
515boot_disk=$DISK
516boot_main_part=$PART
517disk=$DISK
518main_part=$PART
519boot_entry=$WINVER
520EOF
521spartlnx.run -cui -nm -w -f $FILE &
522sleep 5
523ps aux > /dev/null | grep $! | grep -E "T|S" | kill -9 $! > /dev/null
524
525
526##Preparando instruccion        Ramdisk Options
527cat > $FILE <<EOF
528boot_disk=$DISK
529boot_main_part=$PART
530disk=$DISK
531main_part=$PART
532boot_entry=Ramdisk Options
533EOF
534spartlnx.run -cui -nm -w -f $FILE &
535sleep 5
536ps aux > /dev/null | grep $! | grep -E "T|S" | kill -9 $! > /dev/null
537
538
539#Preparando instruccion Windows Boot Manager
540cat > $FILE <<EOF
541boot_disk=$DISK
542boot_main_part=$PART
543disk=$DISK
544main_part=$PART
545boot_entry=Windows Boot Manager
546EOF
547spartlnx.run -cui -nm -w -f $FILE &
548sleep 5
549ps aux > /dev/null | grep $! | grep -E "T|S" | kill -9 $! > /dev/null
550
551
552#Preparando instruccion Herramienta de diagnóstico de memoria de Windows
553cat > $FILE <<EOF
554boot_disk=$DISK
555boot_main_part=$PART
556disk=$DISK
557main_part=$PART
558boot_entry=Herramienta de diagnóstico de memoria de Windows
559EOF
560spartlnx.run -cui -nm -w -f $FILE &
561sleep 5
562ps aux > /dev/null | grep $! | grep -E "T|S" | kill -9 $! > /dev/null
563
564}
565
566
567#         ogWindowsRegisterPartition int_ndisk int_partiton str_volume int_disk int_partition
568#@brief   Registra una partición en windows con un determinado volumen.
569#@param   int_ndisk      nº de orden del disco a registrar
570#@param   int_partition     nº de particion a registrar
571#@param   str_volumen      volumen a resgistar
572#@param   int_ndisk_windows      nº de orden del disco donde esta windows
573#@param   int_partition_windows     nº de particion donde esta windows
574#@return 
575#@exception OG_ERR_FORMAT    Formato incorrecto.
576#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
577#@version 0.9 - Adaptación a OpenGnSys.
578#@author  Antonio J. Doblas Viso. Universidad de Málaga
579#@date    2009-09-24
580#*/ ##
581function ogWindowsRegisterPartition ()
582{
583# Variables locales.
584local PART DISK FILE REGISTREDDISK REGISTREDPART REGISTREDVOL VERSION SYSTEMROOT
585
586# Si se solicita, mostrar ayuda.
587if [ "$*" == "help" ]; then
588    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk_TO_registre int_partition_TO_registre str_NewVolume int_disk int_parition " \
589           "$FUNCNAME 1 1 c: 1 1"
590    return
591fi
592
593# Error si no se reciben 5 parámetros.
594[ $# == 5 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?)
595
596REGISTREDDISK=$1
597REGISTREDPART=$2
598REGISTREDVOL=$(echo $3 | cut -c1 | tr '[:lower:]' '[:upper:]')
599DISK=$4
600PART=$5
601FILE=/tmp/temp$$
602
603ogDiskToDev $REGISTREDDISK $REGISTREDPART || return $(ogRaiseError $OG_ERR_PARTITION "particion a registrar "; echo $?)
604ogDiskToDev $DISK $PART || return $(ogRaiseError $OG_ERR_PARTITION "particion de windows"; echo $?)
605
606ogGetOsType $DISK $PART | grep "Windows" || return $(ogRaiseError $OG_ERR_NOTOS "no es windows"; echo $?)
607
608VERSION=$(ogGetOsVersion $DISK $PART)
609
610#Systemroot
611
612if ogGetPath $DISK $PART WINDOWS
613then
614        SYSTEMROOT="Windows"
615elif ogGetPath $DISK $PART WINNT
616then
617        SYSTEMROOT="winnt"
618else
619        return $(ogRaiseError $OG_ERR_NOTOS; echo $?)
620fi
621
622ogUnmount $DISK $PART
623let DISK=$DISK-1
624let REGISTREDDISK=$REGISTREDDISK-1
625#Preparando instruccion Windows Boot Manager
626cat > $FILE <<EOF
627windows_disk=$DISK
628windows_main_part=$PART
629windows_dir=$SYSTEMROOT
630disk=$REGISTREDDISK
631main_part=$REGISTREDPART
632;ext_part
633part_letter=$REGISTREDVOL
634EOF
635spartlnx.run -cui -nm -u -f $FILE &
636sleep 5
637ps aux > /dev/null | grep $! | grep -E "T|S" | kill -9 $! > /dev/null
638
639}
640
641
642#         ogGrubInstallMbr  int_disk_GRUBCFG  int_partition_GRUBCFG #@param   bolean_Check_Os_installed_and_Configure_2ndStage   true | false[default]
643#@brief   Instala y actualiza el gestor grub el el MBR del disco duro donde se encuentra el fichero grub.cfg. Admite sistemas Windows.
644#@param   int_disk_SecondStage     
645#@param   int_part_SecondStage     
646#@param   bolean_Check_Os_installed_and_Configure_2ndStage   true | false[default]
647#@return 
648#@exception OG_ERR_FORMAT    Formato incorrecto.
649#@version 1.0.2 - Primeras pruebas.
650#@author  Antonio J. Doblas Viso.   Universidad de Malaga.
651#@date    2011-10-29
652#@version 1.0.3 - Soporte para linux de 32 y 64 bits
653#@author  Antonio J. Doblas Viso.   Universidad de Malaga.
654#@date    2012-03-13
655#@version 1.0.3 - Ficheros de configuracion independientes segun ubicación de la primera etapa
656#@author  Antonio J. Doblas Viso.   Universidad de Malaga.
657#@date    2012-03-13
658#*/ ##
659
660function ogGrubInstallMbr {
661
662# Variables locales.
663local PART DISK VERSION FIRSTAGE SECONSTAGE CHECKOS KERNELPARAM BACKUPNAME
664
665# Si se solicita, mostrar ayuda.
666if [ "$*" == "help" ]; then
667    ogHelp "$FUNCNAME" "$FUNCNAME  int_ndiskSecondStage int_partitionSecondStage bolean_Configure_2ndStage   \"param param \"  " \
668           "$FUNCNAME 1 1 FALSE " \
669           "$FUNCNAME 1 1 TRUE \"nomodeset irqpoll pci=noacpi quiet splash \" "
670    return
671fi 
672
673# Error si no se reciben 2 parámetros.
674[ $# -ge 2 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?)
675
676
677DISK=$1; PART=$2;
678CHECKOS=${3:-"FALSE"}
679KERNELPARAM=$4
680BACKUPNAME=".backup.og"
681
682#Error si no es linux.
683#TODO: comprobar si se puede utilizar la particion windows como contenedor de grub.
684#VERSION=$(ogGetOsVersion $DISK $PART)
685#echo $VERSION | grep "Linux" || return $(ogRaiseError $OG_ERR_NOTOS "no es linux"; echo $?)
686
687#Localizar primera etapa del grub
688FIRSTSTAGE=$(ogDiskToDev $DISK)
689
690#localizar disco segunda etapa del grub
691SECONDSTAGE=$(ogMount $DISK $PART)
692
693# prepara el directorio principal de la segunda etapa
694[ -d ${SECONDSTAGE}/boot/grub/ ]  || mkdir -p ${SECONDSTAGE}/boot/grub/
695
696#Localizar directorio segunda etapa del grub   
697PREFIXSECONDSTAGE="/boot/grubMBR"
698
699# Si Reconfigurar segunda etapa (grub.cfg) == FALSE
700if [ -f ${SECONDSTAGE}/boot/grub/grub.cfg -o -f ${SECONDSTAGE}/boot/grub/grub.cfg$BACKUPNAME ]
701then
702    if [ "$CHECKOS" == "false" -o "$CHECKOS" == "FALSE" ]
703    then
704        # Si no se reconfigura se utiliza el grub.cfg orginal
705        [ -f ${SECONDSTAGE}/boot/grub/grub.cfg$BACKUPNAME ] && mv ${SECONDSTAGE}/boot/grub/grub.cfg$BACKUPNAME ${SECONDSTAGE}/boot/grub/grub.cfg
706                # Si no se reconfigure se borra los ficheros previos de configuración específicos de opengnsys.
707        [ -d ${SECONDSTAGE}${PREFIXSECONDSTAGE} ] &&  rm -fr ${SECONDSTAGE}${PREFIXSECONDSTAGE}
708        # Reactivamos el grub con el grub.cfg original.
709        grub-install --force --root-directory=${SECONDSTAGE} $FIRSTSTAGE
710        return $?
711    fi
712fi
713
714# SI Reconfigurar segunda etapa (grub.cfg) == TRUE
715#Configur la sintaxis grub para evitar menus de "recovery" en el OGLive
716echo "GRUB_DISABLE_RECOVERY=\"true\"" >> /etc/default/grub
717echo "GRUB_DISABLE_LINUX_UUID=\"true\"" >> /etc/default/grub
718
719#Evitar detectar modo recovery - mover grub.cfg original a grub.cfg.backup
720[ -f ${SECONDSTAGE}/boot/grub/grub.cfg ] && mv ${SECONDSTAGE}/boot/grub/grub.cfg ${SECONDSTAGE}/boot/grub/grub.cfg$BACKUPNAME
721
722#Preparar configuración segunda etapa: crear ubicacion
723mkdir -p ${SECONDSTAGE}${PREFIXSECONDSTAGE}/boot/grub/
724#Preparar configuración segunda etapa: crear cabecera del fichero
725/etc/grub.d/00_header > ${SECONDSTAGE}${PREFIXSECONDSTAGE}/boot/grub/grub.cfg
726#Preparar configuración segunda etapa: crear entrada del sistema operativo
727grubSyntax "$KERNELPARAM" >> ${SECONDSTAGE}${PREFIXSECONDSTAGE}/boot/grub/grub.cfg
728
729#Instalar el grub
730grub-install --force --root-directory=${SECONDSTAGE}${PREFIXSECONDSTAGE} $FIRSTSTAGE
731}
732
733
734
735#         ogGrubInstallPartition int_disk_SECONDSTAGE  int_partition_SECONDSTAGE bolean_Check_Os_installed_and_Configure_2ndStage
736#@brief   Instala y actualiza el gestor grub en el bootsector de la particion indicada
737#@param   int_disk_SecondStage     
738#@param   int_part_SecondStage     
739#@param   bolean_Check_Os_installed_and_Configure_2ndStage   true | false[default]
740#@param   str "kernel param "   
741#@return 
742#@exception OG_ERR_FORMAT    Formato incorrecto.
743#@version 1.0.2 - Primeras pruebas.
744#@author  Antonio J. Doblas Viso.   Universidad de Malaga.
745#@date    2011-10-29
746#@version 1.0.3 - Soporte para linux de 32 y 64 bits
747#@author  Antonio J. Doblas Viso.   Universidad de Malaga.
748#@date    2012-03-13
749#@version 1.0.3 - Ficheros de configuracion independientes segun ubicación de la priemra etapa
750#@author  Antonio J. Doblas Viso.   Universidad de Malaga.
751#@date    2012-03-13
752#*/ ##
753
754function ogGrubInstallPartition {
755
756# Variables locales.
757local PART DISK VERSION FIRSTAGE SECONSTAGE CHECKOS KERNELPARAM BACKUPNAME
758
759# Si se solicita, mostrar ayuda.
760if [ "$*" == "help" ]; then
761    ogHelp "$FUNCNAME" "$FUNCNAME int_ndiskSecondStage int_partitionSecondStage bolean_Configure_2ndStage   \"param param \" " \
762           "$FUNCNAME 1 1 FALSE " \
763           "$FUNCNAME 1 1 TRUE \"nomodeset irqpoll pci=noacpi quiet splash \" "
764    return
765fi 
766
767# Error si no se reciben 2 parámetros.
768[ $# -ge 2 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?)
769
770DISK=$1; PART=$2;
771CHECKOS=${3:-"FALSE"}
772KERNELPARAM=$4
773BACKUPNAME=".backup.og"
774
775#error si no es linux.
776VERSION=$(ogGetOsVersion $DISK $PART)
777echo $VERSION | grep "Linux" || return $(ogRaiseError $OG_ERR_NOTOS "no es linux"; echo $?)
778
779#Localizar primera etapa del grub
780FIRSTSTAGE=$(ogDiskToDev $DISK $PART)
781
782#localizar disco segunda etapa del grub
783SECONDSTAGE=$(ogMount $DISK $PART)
784
785#Localizar directorio segunda etapa del grub   
786PREFIXSECONDSTAGE="/boot/grubPARTITION"
787
788# Si Reconfigurar segunda etapa (grub.cfg) == FALSE
789if [ -f ${SECONDSTAGE}/boot/grub/grub.cfg -o -f ${SECONDSTAGE}/boot/grub/grub.cfg$BACKUPNAME ]
790then
791    if [ "$CHECKOS" == "false" -o "$CHECKOS" == "FALSE" ]
792    then
793        # Si no se reconfigura se utiliza el grub.cfg orginal
794        [ -f ${SECONDSTAGE}/boot/grub/grub.cfg$BACKUPNAME ] && mv ${SECONDSTAGE}/boot/grub/grub.cfg$BACKUPNAME ${SECONDSTAGE}/boot/grub/grub.cfg
795                # Si no se reconfigure se borra los ficheros previos de configuración específicos de opengnsys.
796        [ -d ${SECONDSTAGE}${PREFIXSECONDSTAGE} ] &&  rm -fr ${SECONDSTAGE}${PREFIXSECONDSTAGE}
797        # Reactivamos el grub con el grub.cfg original.
798        grub-install --force --root-directory=${SECONDSTAGE} $FIRSTSTAGE
799        return $?
800    fi
801fi
802
803# SI Reconfigurar segunda etapa (grub.cfg) == TRUE
804#Configur la sintaxis grub para evitar menus de "recovery" en el OGLive
805echo "GRUB_DISABLE_RECOVERY=\"true\"" >> /etc/default/grub
806echo "GRUB_DISABLE_LINUX_UUID=\"true\"" >> /etc/default/grub
807
808#Evitar detectar modo recovery - mover grub.cfg original a grub.cfg.backup.og
809[ -f ${SECONDSTAGE}/boot/grub/grub.cfg ] && mv ${SECONDSTAGE}/boot/grub/grub.cfg ${SECONDSTAGE}/boot/grub/grub.cfg$BACKUPNAME
810
811#Preparar configuración segunda etapa: crear ubicacion
812mkdir -p ${SECONDSTAGE}${PREFIXSECONDSTAGE}/boot/grub/
813#Preparar configuración segunda etapa: crear cabecera del fichero
814/etc/grub.d/00_header > ${SECONDSTAGE}${PREFIXSECONDSTAGE}/boot/grub/grub.cfg
815#Preparar configuración segunda etapa: crear entrada del sistema operativo
816grubSyntax $DISK $PART "$KERNELPARAM" >> ${SECONDSTAGE}${PREFIXSECONDSTAGE}/boot/grub/grub.cfg
817
818#Instalar el grub
819grub-install --force --root-directory=${SECONDSTAGE}${PREFIXSECONDSTAGE} $FIRSTSTAGE
820}
821
822###
823#En pruebas
824##
825#/**
826#         ogConfigureFstab int_ndisk int_nfilesys
827#@brief   Establece el nombre del equipo en los ficheros hostname y hosts.
828#@param   int_ndisk      nº de orden del disco
829#@param   int_nfilesys   nº de orden del sistema de archivos
830#@return  (nada)
831#@exception OG_ERR_FORMAT    Formato incorrecto.
832#@exception OG_ERR_NOTFOUND  No se encuentra el fichero fstab a procesar.
833#@warning Puede haber un error si hay más de 1 partición swap.
834#@version 1.0.5 - Primera versión para OpenGnSys.
835#@author  Antonio J. Doblas Viso.   Universidad de Malaga.
836#@date    2013-03-21
837#*/ ##
838function ogConfigureFstab {
839# Variables locales.
840local FSTAB DEFROOT PARTROOT DEFSWAP PARTSWAP
841
842# Si se solicita, mostrar ayuda.
843if [ "$*" == "help" ]; then
844    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \
845           "$FUNCNAME 1 1"
846    return
847fi
848# Error si no se reciben 2 parámetros.
849[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
850# Error si no se encuentra un fichero  etc/fstab  en el sistema de archivos.
851FSTAB=$(ogGetPath $1 $2 /etc/fstab) 2>/dev/null
852[ -n "$FSTAB" ] || ogRaiseError $OG_ERR_NOTFOUND "$1,$2,/etc/fstab" || return $?
853
854# Hacer copia de seguridad del fichero fstab original.
855cp -a ${FSTAB} ${FSTAB}.backup
856# Dispositivo del raíz en fichero fstab: 1er campo (si no tiene "#") con 2º campo = "/".
857DEFROOT=$(awk '$1!~/#/ && $2=="/" {print $1}' ${FSTAB})
858PARTROOT=$(ogDiskToDev $1 $2)
859# Configuración de swap (solo 1ª partición detectada).
860PARTSWAP=$(blkid -t TYPE=swap | awk -F: 'NR==1 {print $1}')
861if [ -n "$PARTSWAP" ]
862then
863    # Dispositivo de swap en fichero fstab: 1er campo (si no tiene "#") con 3er campo = "swap".
864    DEFSWAP=$(awk '$1!~/#/ && $3=="swap" {print $1}' ${FSTAB})
865    if [ -n "$DEFSWAP" ]
866    then
867        echo "Hay definicion de swap en el fstab $DEFSWAP -> modificamos fichero con nuevo valor $DEFSWAP->$PARTSWAP"   # Mensaje temporal.
868        sed "s|$DEFSWAP|$PARTSWAP|g ; s|$DEFROOT|$PARTROOT|g" ${FSTAB}.backup > ${FSTAB}
869    else
870        echo "No hay definicion de swap y si hay partición swap -> moficamos fichero"   # Mensaje temporal.
871        sed "s|$DEFROOT|$PARTROOT|g" ${FSTAB}.backup > ${FSTAB}
872        echo "$PARTSWAP  none    swap    sw   0  0" >> ${FSTAB}
873    fi 
874else
875    echo "No hay partición swap -> configuramos fstba"  # Mensaje temporal.
876    sed "s|$DEFROOT|$PARTROOT|g" ${FSTAB}.backup > ${FSTAB}
877fi
878}
879
880
881###
882#En pruebas
883##
884#/**
885#         ogSetLinuxName int_ndisk int_nfilesys [str_name]
886#@brief   Establece el nombre del equipo en los ficheros hostname y hosts.
887#@param   int_ndisk      nº de orden del disco
888#@param   int_nfilesys   nº de orden del sistema de archivos
889#@param   str_name       nombre asignado (opcional)
890#@return  (nada)
891#@exception OG_ERR_FORMAT    Formato incorrecto.
892#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
893#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
894#@note    Si no se indica nombre, se asigna un valor por defecto.
895#@version 1.0.5 - Primera versión para OpenGnSys.
896#@author  Antonio J. Doblas Viso.   Universidad de Malaga.
897#@date    2013-03-21
898#*/ ##
899function ogSetLinuxName ()
900{
901# Variables locales.
902local MNTDIR ETC NAME
903
904# Si se solicita, mostrar ayuda.
905if [ "$*" == "help" ]; then
906    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys [str_name]" \
907           "$FUNCNAME 1 1" "$FUNCNAME 1 1 practica-pc"
908    return
909fi
910# Error si no se reciben 2 o 3 parámetros.
911case $# in
912    2)   # Asignar nombre automático (por defecto, "pc").
913         NAME="$(ogGetHostname)"
914         NAME=${NAME:-"pc"} ;;
915    3)   # Asignar nombre del 3er parámetro.
916         NAME="$3" ;;
917    *)   # Formato de ejecución incorrecto.
918         ogRaiseError $OG_ERR_FORMAT
919         return $?
920esac
921
922# Montar el sistema de archivos.
923MNTDIR=$(ogMount $1 $2) || return $?
924
925ETC=$(ogGetPath $1 $2 /etc)
926
927if [ -d "$ETC" ]; then
928        #cambio de nombre en hostname
929        echo "$NAME" > $ETC/hostname
930        #Opcion A para cambio de nombre en hosts
931        #sed "/127.0.1.1/ c\127.0.1.1 \t $HOSTNAME" $ETC/hosts > /tmp/hosts && cp /tmp/hosts $ETC/ && rm /tmp/hosts
932        #Opcion B componer fichero de hosts
933        cat > $ETC/hosts <<EOF
934127.0.0.1       localhost
935127.0.1.1       $NAME
936
937# The following lines are desirable for IPv6 capable hosts
938::1     ip6-localhost ip6-loopback
939fe00::0 ip6-localnet
940ff00::0 ip6-mcastprefix
941ff02::1 ip6-allnodes
942ff02::2 ip6-allrouters
943EOF
944fi
945}
946
947
948###
949#En pruebas
950##
951#/**
952#         ogCleanLinuxDevices int_ndisk int_nfilesys
953#@brief   Limpia los dispositivos del equipo de referencia. Interfaz de red ...
954#@param   int_ndisk      nº de orden del disco
955#@param   int_nfilesys   nº de orden del sistema de archivos
956#@return  (nada)
957#@exception OG_ERR_FORMAT    Formato incorrecto.
958#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
959#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
960#@version 1.0.5 - Primera versión para OpenGnSys.
961#@author  Antonio J. Doblas Viso.   Universidad de Malaga.
962#@date    2013-03-21
963#*/ ##
964function ogCleanLinuxDevices ()
965{
966# Variables locales.
967local MNTDIR
968
969# Si se solicita, mostrar ayuda.
970if [ "$*" == "help" ]; then
971    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \
972           "$FUNCNAME 1 1"
973    return
974fi
975# Error si no se reciben 2 parámetros.
976[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
977
978# Montar el sistema de archivos.
979MNTDIR=$(ogMount $1 $2) || return $?
980
981# Eliminar fichero de configuración de udev para dispositivos fijos de red.
982rm -f ${MNTDIR}/etc/udev/rules.d/70-persistent-net.rules
983}
984
985#/**
986# ogGrubAddOgclient num_disk num_part [ timeout ]
987#@brief   Crea entrada de menu grub para ogclient, tomando como paramentros del kernel los actuales del cliente.
988#@param 1 Numero de disco
989#@param 2 Numero de particion
990#@param 3 timeout: Segundos de espera para iniciar el sistema operativo por defecto.
991#@return  (nada)
992#@exception OG_ERR_FORMAT    Formato incorrecto.
993#@exception OG_ERR_NOTFOUND No existe kernel o initrd  en cache.
994#@exception OG_ERR_NOTFOUND No existe archivo de configuracion del grub.
995# /// FIXME: Solo para el grub instalado en MBR por Opengnsys, ampliar para más casos.
996#*/
997
998ogGrubAddOgclient () {
999    local TIMEOUT DIRMOUNT GRUBGFC PARTTABLETYPE NUMDISK NUMPART KERNEL NUMLINE MENUENTRY
1000
1001    # Si se solicita, mostrar ayuda.
1002    if [ "$*" == "help" ]; then
1003        ogHelp  "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition time_out" \
1004                "$FUNCNAME 1 6 15"
1005        return
1006    fi
1007
1008    # Error si no se reciben 2 parámetros.
1009    [ $# -lt 2 ] && return $(ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME num_disk num_part [ timeout ]"; echo $?)
1010    TIMEOUT="$3"
1011
1012    # Error si no existe el kernel y el initrd en la cache.
1013    # Falta crear nuevo codigo de error.
1014    [ -r $OGCAC/boot/ogvmlinuz -a -r $OGCAC/boot/oginitrd.img ] || return $(ogRaiseError log session OG_ERR_NOTFOUND "CACHE: ogvmlinuz, oginitrd.img" 1>&2; echo ?)
1015
1016    # Archivo de configuracion del grub
1017    DIRMOUNT=$(ogMount $1 $2)
1018    GRUBGFC="$DIRMOUNT/boot/grubMBR/boot/grub/grub.cfg"
1019
1020    # Error si no existe archivo del grub
1021    [ -r $GRUBGFC ] || return $(ogRaiseError log session $OG_ERR_NOTFOUND  "$GRUBGFC" 1>&2; echo $?)
1022
1023    # Si existe la entrada de opengnsys nos salimos.
1024    grep "menuentry Opengnsys" $GRUBGFC &>/dev/null && return 0
1025
1026    # Tipo de tabla de particiones
1027    PARTTABLETYPE=$(ogGetPartitionTableType $1 | tr [:upper:] [:lower:])
1028
1029    # Localizacion de la cache
1030    read NUMDISK NUMPART <<< $(ogFindCache)
1031    let NUMDISK=$NUMDISK-1
1032    # kernel y sus opciones. Pasamos a modo usuario
1033    KERNEL="/boot/ogvmlinuz $(sed -e s/^.*linuz//g -e s/ogactiveadmin=true/ogactiveadmin=false/g /proc/cmdline)"
1034    # Numero de línea de la primera entrada del grub.
1035    NUMLINE=$(grep -n -m 1 "^menuentry" $GRUBGFC|cut -d: -f1)
1036    # Texto de la entrada de opengnsys
1037MENUENTRY="menuentry "Opengnsys"  --class gnu-linux --class gnu --class os { \n \
1038\tinsmod part_$PARTTABLETYPE \n \
1039\tinsmod ext2 \n \
1040\tset root='(hd${NUMDISK},$PARTTABLETYPE${NUMPART})' \n \
1041\tlinux $KERNEL \n \
1042\tinitrd /boot/oginitrd.img \n \
1043}"
1044
1045
1046    # Insertamos la entrada de opengnsys antes de la primera entrada existente.
1047    sed -i "${NUMLINE}i\ $MENUENTRY" $GRUBGFC
1048
1049    # Ponemos que la entrada por defecto sea la primera.
1050    sed -i s/"set.*default.*$"/"set default=\"0\""/g $GRUBGFC
1051
1052    # Si me dan valor para timeout lo cambio en el grub.
1053    [ $TIMEOUT ] &&  sed -i s/timeout=.*$/timeout=$TIMEOUT/g $GRUBGFC
1054}
1055
1056
1057#/**
1058# ogGrubHidePartitions num_disk num_part
1059#@brief Configura el grub para que oculte las particiones de windows que no se esten iniciando.
1060#@param 1 Numero de disco
1061#@param 2 Numero de particion
1062#@return  (nada)
1063#@exception OG_ERR_FORMAT    Formato incorrecto.
1064#@exception No existe archivo de configuracion del grub.
1065#@ /// FIXME: Solo para el grub instalado en MBR por Opengnsys, ampliar para más casos.
1066#*/
1067function ogGrubHidePartitions {
1068    local DIRMOUNT GRUBGFC PARTTABLETYPE WINENTRY ENTRY TEXT ENTRY2 LINE2 PART2 HIDDEN
1069
1070    # Si se solicita, mostrar ayuda.
1071    if [ "$*" == "help" ]; then
1072        ogHelp  "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
1073                "$FUNCNAME 1 6"
1074        return
1075    fi
1076
1077    # Error si no se reciben 2 parámetros.
1078    [ $# -lt 2 ] && return $(ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME num_disk num_part"; echo $?)
1079
1080    # Archivo de configuracion del grub
1081    DIRMOUNT=$(ogMount $1 $2)
1082    GRUBGFC="$DIRMOUNT/boot/grubMBR/boot/grub/grub.cfg"
1083
1084    # Error si no existe archivo del grub
1085    [ -r $GRUBGFC ] || return $(ogRaiseError log session $OG_ERR_NOTFOUND  "$GRUBGFC" 1>&2; echo $?)
1086
1087    # Si solo hay una entrada de Windows me salgo
1088    [ $(grep -n "menuentry.*Windows" $GRUBGFC |wc -l) -eq 1 ] && return 0
1089
1090    # Elimino llamadas a parttool, se han incluido en otras ejecuciones de esta funcion.
1091    sed -i '/parttool/d' $GRUBGFC
1092
1093    PARTTABLETYPE=$(ogGetPartitionTableType $1 | tr [:upper:] [:lower:])
1094
1095    # Entradas de Windows: numero de linea y particion. De mayor a menor.
1096    WINENTRY=$(awk '/menuentry.*Windows/ { gsub(/\/dev\/sda/,""); gsub(/\)\"/, "");  print NR":"$6} ' $GRUBGFC | sed '1!G;h;$!d' )
1097    # Modifico todas las entradas de Windows.
1098    for ENTRY in $WINENTRY; do
1099        LINE=${ENTRY%:*}
1100        # En cada entrada, oculto o muestro cada particion.
1101        TEXT=""
1102        for ENTRY2 in $WINENTRY; do
1103                LINE2=${ENTRY2%:*}
1104                PART2=${ENTRY2#*:}
1105                # Muestro solo la particion de la entrada actual.
1106                [ $LINE2 -eq $LINE ] && HIDDEN="-" || HIDDEN="+"
1107
1108                TEXT="\tparttool (hd0,$PARTTABLETYPE$PART2) hidden$HIDDEN \n$TEXT"
1109        done
1110       
1111        sed -i "${LINE}a\ $TEXT" $GRUBGFC
1112    done
1113
1114    # Activamos la particion que se inicia en todas las entradas de windows.
1115    sed -i "/chainloader/i\\\tparttool \$\{root\} boot+"  $GRUBGFC
1116
1117}
1118
1119#/**
1120# ogGrubDeleteEntry num_disk num_part num_part_delete
1121#@brief Borra en el grub las entradas para el inicio en una particion.
1122#@param 1 Numero de disco donde esta el grub
1123#@param 2 Numero de particion donde esta el grub
1124#@parm 3 Numero de la particion de la que borramos las entradas
1125#@return  (nada)
1126#@exception OG_ERR_FORMAT    Formato incorrecto.
1127#@exception No existe archivo de configuracion del grub.
1128#@ /// FIXME: Solo para el grub instalado en MBR por Opengnsys, ampliar para más casos.
1129#*/
1130
1131
1132function ogGrubDeleteEntry {
1133    local DIRMOUNT GRUBGFC MENUENTRY DELETEENTRY ENDENTRY ENTRY
1134
1135    # Si se solicita, mostrar ayuda.
1136    if [ "$*" == "help" ]; then
1137        ogHelp  "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition int_npartition_delete" \
1138                "$FUNCNAME 1 6 2"
1139        return
1140    fi
1141
1142    # Error si no se reciben 3 parámetros.
1143    [ $# -lt 3 ] && return $(ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME num_disk num_part"; echo $?)
1144
1145    # Archivo de configuracion del grub
1146    DIRMOUNT=$(ogMount $1 $2)
1147    GRUBGFC="$DIRMOUNT/boot/grubMBR/boot/grub/grub.cfg"
1148
1149    # Error si no existe archivo del grub)
1150    [ -r $GRUBGFC ] || return $(ogRaiseError log session $OG_ERR_NOTFOUND  "$GRUBGFC"; echo $?)
1151
1152    # Numero de linea de cada entrada, de mayor a menor.
1153    MENUENTRY="$(grep -n -e menuentry.*/dev/sda $GRUBGFC| cut -d: -f1 | sed '1!G;h;$!d' )"
1154
1155    # Entradas que hay que borrar.
1156    DELETEENTRY=$(grep -n menuentry.*/dev/sda$3 $GRUBGFC| cut -d: -f1)
1157
1158    # Recorremos el fichero del final hacia el principio.
1159    ENDENTRY="$(wc -l $GRUBGFC|cut  -d" " -f1)"
1160    for ENTRY in $MENUENTRY; do
1161        # Comprobamos si hay que borrar la entrada.
1162        if  ogCheckStringInGroup $ENTRY "$DELETEENTRY" ; then
1163            let ENDENTRY=$ENDENTRY-1
1164            sed -i -e $ENTRY,${ENDENTRY}d  $GRUBGFC
1165        fi
1166
1167        # Guardamos el número de línea de la entrada, que sera el final de la siguiente.
1168        ENDENTRY=$ENTRY
1169    done
1170
1171}
1172
Note: See TracBrowser for help on using the repository browser.