source: client/engine/Boot.lib @ f8a75f18

opengnsys-1.0.6b
Last change on this file since f8a75f18 was f2ac15a, checked in by ramon <ramongomez@…>, 8 years ago

#754: Congelar versión de mantenimiento en rama tags/opengnsys-1.0.6b.

git-svn-id: https://opengnsys.es/svn/tags/opengnsys-1.0.6b@5144 a21b9725-9963-47de-94b9-378ad31fedc9

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