source: client/engine/Boot.lib @ d1795da

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 d1795da was 27aa561, checked in by ramon <ramongomez@…>, 11 years ago

#621: Evitar que proceso ogAdmServer consuma CPU al apagar o reiniciar varios equipos, debido a la parada prematura del Browser del cliente.

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

  • Property mode set to 100755
File size: 32.9 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.5
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#*/ ##
33function ogBoot ()
34{
35# Variables locales.
36local PART TYPE MNTDIR PARAMS KERNEL INITRD APPEND FILE LOADER f
37
38# Si se solicita, mostrar ayuda.
39if [ "$*" == "help" ]; then
40    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
41           "$FUNCNAME 1 1"
42    return
43fi
44# Error si no se reciben 2 parámetros.
45[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
46
47# Detectar tipo de sistema de archivos y montarlo.
48PART=$(ogDiskToDev $1 $2) || return $?
49TYPE=$(ogGetFsType $1 $2) || return $?
50# Error si no puede montar sistema de archivos.
51MNTDIR=$(ogMount $1 $2) || return $?
52
53case "$TYPE" in
54    EXT[234]|REISERFS|REISER4|JFS|XFS)
55        # Obtiene los parámetros de arranque para Linux.
56        PARAMS=$(ogLinuxBootParameters $1 $2) || return $?
57        read -e KERNEL INITRD APPEND <<<"$PARAMS"
58        # Si no hay kernel, no hay sistema operativo.
59        [ -n "$KERNEL" ] || ogRaiseError $OG_ERR_NOTOS || return $?
60        # Arrancar de partición distinta a la original.
61        [ -e "$MNTDIR/etc" ] && APPEND=$(echo $APPEND | awk -v P="$PART " '{sub (/root=[-+=_/a-zA-Z0-9]* /,"root="P);print}')
62        # Configurar kernel Linux con los parámetros leídos de su GRUB.
63        kexec -l "${MNTDIR}${KERNEL}" --append="$APPEND" --initrd="${MNTDIR}${INITRD}"
64        kexec -e &
65        ;;
66    NTFS|HNTFS|FAT32|HFAT32)
67        # Compruebar si hay un cargador de Windows.
68        for f in io.sys ntldr bootmgr; do
69            FILE="$(ogGetPath $1 $2 $f 2>/dev/null)"
70            [ -n "$FILE" ] && LOADER="$f"
71        done
72        [ -n "$LOADER" ] || ogRaiseError $OG_ERR_NOTOS || return $?
73        if [ "$winboot" == "kexec" ]; then
74            # Modo de arranque en caliente (con kexec).
75            cp $OGLIB/grub4dos/* $MNTDIR    # */ (Comentario Doxygen)
76            kexec -l $MNTDIR/grub.exe --append=--config-file="root (hd$[$1-1],$[$2-1]); chainloader (hd$[$1-1],$[$2-1])/$LOADER; tpm --init"
77            kexec -e &
78        else
79            # Modo de arranque por reinicio (con reboot).
80            dd if=/dev/zero of=${MNTDIR}/ogboot.me bs=1024 count=3
81            dd if=/dev/zero of=${MNTDIR}/ogboot.firstboot bs=1024 count=3
82            dd if=/dev/zero of=${MNTDIR}/ogboot.secondboot bs=1024 count=3
83            if  [ -z "$(ogGetRegistryValue $MNTDIR SOFTWARE '\Microsoft\Windows\CurrentVersion\Run\ogcleannboot')" ]; then               
84            ogAddRegistryValue $MNTDIR SOFTWARE '\Microsoft\Windows\CurrentVersion\Run\ogcleanboot'
85            ogSetRegistryValue $MNTDIR SOFTWARE '\Microsoft\Windows\CurrentVersion\Run\ogcleanboot' "cmd /c del c:\ogboot.*"
86            fi
87            # Activar la partición.
88            ogSetPartitionActive $1 $2
89            reboot
90        fi
91        ;;
92    *)  ogRaiseError $OG_ERR_PARTITION "$1, $2"
93        return $?
94        ;;
95esac
96}
97
98
99#/**
100#         ogGetWindowsName int_ndisk int_npartition
101#@brief   Muestra el nombre del equipo en el registro de Windows.
102#@param   int_ndisk      nº de orden del disco
103#@param   int_npartition nº de orden de la partición
104#@return  str_name - nombre del equipo
105#@exception OG_ERR_FORMAT    Formato incorrecto.
106#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
107#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
108#@version 0.9 - Adaptación para OpenGnSys.
109#@author  Ramon Gomez, ETSII Universidad de Sevilla
110#@date    2009-09-23
111#*/ ##
112function ogGetWindowsName ()
113{
114# Variables locales.
115local PART MNTDIR
116
117# Si se solicita, mostrar ayuda.
118if [ "$*" == "help" ]; then
119    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
120           "$FUNCNAME 1 1  ==>  PRACTICA-PC"
121    return
122fi
123# Error si no se reciben 2 parámetros.
124[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
125
126# Montar el sistema de archivos.
127MNTDIR=$(ogMount $1 $2) || return $?
128
129# Obtener dato del valor de registro.
130ogGetRegistryValue $MNTDIR system '\ControlSet001\Control\ComputerName\ComputerName\ComputerName'
131}
132
133
134#/**
135#         ogLinuxBootParameters int_ndisk int_nfilesys
136#@brief   Muestra los parámetros de arranque de un sistema de archivos Linux.
137#@param   int_ndisk      nº de orden del disco
138#@param   int_nfilesys   nº de orden del sistema de archivos
139#@return  str_kernel str_initrd str_parameters ...
140#@exception OG_ERR_FORMAT    Formato incorrecto.
141#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
142#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
143#@warning Función básica usada por \c ogBoot
144#@version 0.9 - Primera adaptación para OpenGnSys.
145#@author  Ramon Gomez, ETSII Universidad de Sevilla
146#@date    2009-09-11
147#@version 0.9.2 - Soporta partición /boot independiente.
148#@author  Ramon Gomez, ETSII Universidad de Sevilla
149#@date    2010-07-20
150#@version 1.0.5 - Mejoras en tratamiento de GRUB2.
151#@author  Ramon Gomez, ETSII Universidad de Sevilla
152#@date    2013-05-14
153#*/ ##
154function ogLinuxBootParameters ()
155{
156# Variables locales.
157local MNTDIR CONFDIR CONFFILE
158
159# Si se solicita, mostrar ayuda.
160if [ "$*" == "help" ]; then
161    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \
162           "$FUNCNAME 1 2  ==>  /vmlinuz-3.5.0-21-generic /initrd.img-3.5.0-21-generic root=/dev/sda2 ro splash"
163    return
164fi
165# Error si no se reciben 2 parámetros.
166[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
167
168# Detectar id. de tipo de partición y codificar al mnemonico.
169MNTDIR=$(ogMount $1 $2) || return $?
170
171# Fichero de configuración de GRUB.
172CONFDIR=$MNTDIR                               # Partición de arranque /boot.
173[ -d $MNTDIR/boot ] && CONFDIR=$MNTDIR/boot   # Partición raíz con directorio boot.
174CONFFILE="$CONFDIR/grubPARTITION/boot/grub/grub.cfg"
175[ ! -e $CONFFILE ] && CONFFILE="$CONFDIR/grub/menu.lst"
176[ ! -e $CONFFILE ] && CONFFILE="$CONFDIR/grub/grub.cfg"
177[ ! -e $CONFFILE ] && CONFFILE="$CONFDIR/grub2/grub.cfg"
178[ -e $CONFFILE ] || ogRaiseError $OG_ERR_NOTFOUND "grub.cfg" || return $?
179
180# Toma del fichero de configuracion los valores del kernel, initrd
181#       y parámetros de arranque usando las cláusulas por defecto
182#       ("default" en GRUB1, "set default" en GRUB2)
183#       y los formatea para que sean compatibles con \c kexec .  */
184# /* (comentario Doxygen)
185awk 'BEGIN {cont=-1;}
186     $1~/^default$/     {sub(/=/," "); def=$2;}
187     $1~/^set$/ && $2~/^default$/ {gsub(/[="]/," "); def=$3;
188                                   if (def ~ /saved_entry/) def=0;
189                                  }
190     $1~/^(title|menuentry)$/ {cont++}
191     $1~/^(kernel|linux)$/ {if (def==cont) {
192                               kern=$2;
193                               sub($1,"");sub($1,"");sub(/^[ \t]*/,"");app=$0}  # /* (comentario Doxygen)
194                           }
195     $1~/^initrd$/      {if (def==cont) init=$2}
196     END {if (kern!="") printf("%s %s %s", kern,init,app)}
197    ' $CONFFILE
198# */ (comentario Doxygen)
199}
200
201
202#/**
203#         ogSetWindowsName int_ndisk int_nfilesys str_name
204#@brief   Establece el nombre del equipo en el registro de Windows.
205#@param   int_ndisk      nº de orden del disco
206#@param   int_nfilesys   nº de orden del sistema de archivos
207#@param   str_name       nombre asignado
208#@return  (nada)
209#@exception OG_ERR_FORMAT     Formato incorrecto.
210#@exception OG_ERR_NOTFOUND   Disco o particion no corresponden con un dispositivo.
211#@exception OG_ERR_PARTITION  Tipo de partición desconocido o no se puede montar.
212#@exception OG_ERR_OUTOFLIMIT Nombre Netbios con más de 15 caracteres.
213#@version 0.9 - Adaptación a OpenGnSys.
214#@author  Ramon Gomez, ETSII Universidad de Sevilla
215#@date    2009-09-24
216#@version 1.0.5 - Establecer restricción de tamaño de nombre Netbios.
217#@author  Ramon Gomez, ETSII Universidad de Sevilla
218#@date    2013-03-20
219#*/ ##
220function ogSetWindowsName ()
221{
222# Variables locales.
223local PART MNTDIR NAME
224
225# Si se solicita, mostrar ayuda.
226if [ "$*" == "help" ]; then
227    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_filesys str_name" \
228           "$FUNCNAME 1 1 PRACTICA-PC"
229    return
230fi
231# Error si no se reciben 3 parámetros.
232[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $?
233# Error si el nombre supera los 15 caracteres.
234[ ${#3} -le 15 ] || ogRaiseError $OG_ERR_OUTOFLIMIT "\"${3:0:15}...\"" || return $?
235
236# Montar el sistema de archivos.
237MNTDIR=$(ogMount $1 $2) || return $?
238
239# Asignar nombre.
240NAME="$3"
241
242# Modificar datos de los valores de registro.
243ogSetRegistryValue $MNTDIR system '\ControlSet001\Control\ComputerName\ComputerName\ComputerName' "$NAME" 2>/dev/null
244ogSetRegistryValue $MNTDIR system '\ControlSet001\Services\Tcpip\Parameters\Hostname' "$NAME" 2>/dev/null
245ogSetRegistryValue $MNTDIR system '\ControlSet001\services\Tcpip\Parameters\Hostname' "$NAME" 2>/dev/null
246ogSetRegistryValue $MNTDIR system '\ControlSet001\Services\Tcpip\Parameters\NV Hostname' "$NAME" 2>/dev/null
247ogSetRegistryValue $MNTDIR system '\ControlSet001\services\Tcpip\Parameters\NV Hostname' "$NAME" 2>/dev/null
248}
249
250
251#/**
252#         ogSetWinlogonUser int_ndisk int_npartition str_username
253#@brief   Establece el nombre de usuario por defecto en la entrada de Windows.
254#@param   int_ndisk      nº de orden del disco
255#@param   int_npartition nº de orden de la partición
256#@param   str_username   nombre de usuario por defecto
257#@return  (nada)
258#@exception OG_ERR_FORMAT    Formato incorrecto.
259#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
260#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
261#@version 0.9.2 - Adaptación a OpenGnSys.
262#@author  Ramon Gomez, ETSII Universidad de Sevilla
263#@date    2010-07-20
264#*/ ##
265function ogSetWinlogonUser ()
266{
267# Variables locales.
268local PART MNTDIR NAME
269
270# Si se solicita, mostrar ayuda.
271if [ "$*" == "help" ]; then
272    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition str_username" \
273           "$FUNCNAME 1 1 USUARIO"
274    return
275fi
276# Error si no se reciben 3 parámetros.
277[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $?
278
279# Montar el sistema de archivos.
280MNTDIR=$(ogMount $1 $2) || return $?
281
282# Asignar nombre.
283NAME="$3"
284
285# Modificar datos en el registro.
286ogSetRegistryValue $MNTDIR SOFTWARE '\Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultUserName' "$3"
287}
288
289
290#/**
291#         ogBootMbrXP int_ndisk
292#@brief   Genera un nuevo Master Boot Record en el disco duro indicado, compatible con los SO tipo Windows
293#@param   int_ndisk      nº de orden del disco
294#@return  salida del programa my-sys
295#@exception OG_ERR_FORMAT    Formato incorrecto.
296#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
297#@version 0.9 - Adaptación a OpenGnSys.
298#@author  Antonio J. Doblas Viso. Universidad de Málaga
299#@date    2009-09-24
300#*/ ##
301
302function ogBootMbrXP ()
303{
304# Variables locales.
305local DISK
306
307# Si se solicita, mostrar ayuda.
308if [ "$*" == "help" ]; then
309    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk " \
310           "$FUNCNAME 1"
311    return
312fi
313# Error si no se recibe 1 parámetro.
314[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
315
316DISK="$(ogDiskToDev $1)" || return $?
317ms-sys -z -f $DISK
318ms-sys -m -f $DISK
319}
320
321
322#/**
323#         ogBootMbrGeneric int_ndisk
324#@brief   Genera un nuevo Codigo de arranque en el MBR del disco indicado, compatible con los SO tipo Windows, Linux.
325#@param   int_ndisk      nº de orden del disco
326#@return  salida del programa my-sys
327#@exception OG_ERR_FORMAT    Formato incorrecto.
328#@exception OG_ERR_NOTFOUND Tipo de partición desconocido o no se puede montar.
329#@version 0.9 - Adaptación a OpenGnSys.
330#@author  Antonio J. Doblas Viso. Universidad de Málaga
331#@date    2009-09-24
332#*/ ##
333
334function ogBootMbrGeneric ()
335{
336# Variables locales.
337local DISK
338
339# Si se solicita, mostrar ayuda.
340if [ "$*" == "help" ]; then
341    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk " \
342           "$FUNCNAME 1 "
343    return
344fi
345# Error si no se recibe 1 parámetro.
346[ $# == 1 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?)
347
348DISK="$(ogDiskToDev $1)" || return $?
349ms-sys -z -f $DISK
350ms-sys -s -f $DISK
351}
352
353
354
355
356#/**
357#         ogFixBootSector int_ndisk int_parition
358#@brief   Corrige el boot sector de una particion activa para MS windows/dos -fat-ntfs
359#@param   int_ndisk      nº de orden del disco
360#@param   int_partition     nº de particion
361#@return 
362#@exception OG_ERR_FORMAT    Formato incorrecto.
363#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
364#@version 0.9 - Adaptación a OpenGnSys.
365#@author  Antonio J. Doblas Viso. Universidad de Málaga
366#@date    2009-09-24
367#*/ ##
368
369function ogFixBootSector ()
370{
371# Variables locales.
372local PARTYPE DISK PART FILE
373
374# Si se solicita, mostrar ayuda.
375if [ "$*" == "help" ]; then
376    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_partition " \
377           "$FUNCNAME 1 1 "
378    return
379fi
380
381# Error si no se reciben 2 parámetros.
382[ $# == 2 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?)
383
384#TODO, solo si la particion existe
385#TODO, solo si es ntfs o fat
386PARTYPE=$(ogGetPartitionId $1 $2)
387case "$PARTYPE" in
388        1|4|6|7|b|c|e|f|17|700)
389        ;;
390        *)
391        return $(ogRaiseError $OG_ERR_PARTITION; echo $?)
392        ;;
393esac
394
395ogUnmount $1 $2 || return $(ogRaiseError $OG_ERR_PARTITION; echo $?)
396
397#Preparando instruccion
398let DISK=$1-1   
399PART=$2
400FILE=/tmp/temp$$
401cat > $FILE <<EOF
402disk=$DISK
403main_part=$PART
404fix_first_sector=yes
405EOF
406
407spartlnx.run -cui -nm -a -f $FILE &
408sleep 5
409ps aux > /dev/null | grep $! | grep -E "T|S" | kill -9 $! > /dev/null
410rm -f $FILE
411}
412
413
414
415#/**
416#         ogWindowsBootParameters int_ndisk int_parition
417#@brief   Configura el gestor de arranque de windows 7 / vista / XP / 2000
418#@param   int_ndisk      nº de orden del disco
419#@param   int_partition     nº de particion
420#@return 
421#@exception OG_ERR_FORMAT    Formato incorrecto.
422#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
423#@version 0.9 - Integración desde EAC para OpenGnSys.
424#@author  Antonio J. Doblas Viso. Universidad de Málaga
425#@date    2009-09-24
426#@version 1.0.1 - Adapatacion para OpenGnsys.
427#@author  Antonio J. Doblas Viso. Universidad de Málaga
428#@date    2011-05-20
429#@version 1.0.5 - Soporte para Windows 8 y Windows 8.1.
430#@author  Ramon Gomez, ETSII Universidad de Sevilla
431#@date    2014-01-28
432#*/ ##
433
434function ogWindowsBootParameters ()
435{
436# Variables locales.
437local PART DISK FILE VERSION WINVER MOUNT
438
439# Si se solicita, mostrar ayuda.
440if [ "$*" == "help" ]; then
441    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_partition " \
442           "$FUNCNAME 1 1 "
443    return
444fi
445
446# Error si no se reciben 2 parámetros.
447[ $# == 2 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?)
448
449ogDiskToDev $1 $2 || return $(ogRaiseError $OG_ERR_PARTITION; echo $?)
450
451#Preparando variables adaptadas a sintaxis windows.
452let DISK=$1-1
453PART=$2
454FILE=/tmp/temp$$
455
456VERSION=$(ogGetOsVersion $1 $2)
457
458if echo "$VERSION" | grep "Windows 8.1"
459then
460        WINVER="Windows 8.1"
461elif echo "$VERSION" | grep "Windows 8"
462then
463        WINVER="Windows 8"
464elif echo "$VERSION" | grep "Windows 7"
465then
466        WINVER="Windows 7"
467elif echo "$VERSION" | grep "Windows Seven"
468then
469        WINVER="Windows Vista"
470elif echo "$VERSION" | grep "XP"
471then
472        MOUNT=$(ogMount $1 $2)
473        [ -f ${MOUNT}/boot.ini ] || return $(ogRaiseError $OG_ERR_NOTOS; echo $?)
474        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
475        return 0
476else
477        return $(ogRaiseError $OG_ERR_NOTOS; echo $?)
478fi
479
480ogUnmount $1 $2 || return $(ogRaiseError $OG_ERR_PARTITION; echo $?)
481
482
483#Preparando instruccion Windows Resume Application
484cat > $FILE <<EOF
485boot_disk=$DISK
486boot_main_part=$PART
487disk=$DISK
488main_part=$PART
489boot_entry=Windows Resume Application
490EOF
491spartlnx.run -cui -nm -w -f $FILE &
492sleep 5
493ps aux > /dev/null | grep $! | grep -E "T|S" | kill -9 $! > /dev/null
494
495 
496
497#Preparando instruccion tipo windows
498cat > $FILE <<EOF
499boot_disk=$DISK
500boot_main_part=$PART
501disk=$DISK
502main_part=$PART
503boot_entry=$WINVER
504EOF
505spartlnx.run -cui -nm -w -f $FILE &
506sleep 5
507ps aux > /dev/null | grep $! | grep -E "T|S" | kill -9 $! > /dev/null
508
509
510##Preparando instruccion        Ramdisk Options
511cat > $FILE <<EOF
512boot_disk=$DISK
513boot_main_part=$PART
514disk=$DISK
515main_part=$PART
516boot_entry=Ramdisk Options
517EOF
518spartlnx.run -cui -nm -w -f $FILE &
519sleep 5
520ps aux > /dev/null | grep $! | grep -E "T|S" | kill -9 $! > /dev/null
521
522
523#Preparando instruccion Windows Boot Manager
524cat > $FILE <<EOF
525boot_disk=$DISK
526boot_main_part=$PART
527disk=$DISK
528main_part=$PART
529boot_entry=Windows Boot Manager
530EOF
531spartlnx.run -cui -nm -w -f $FILE &
532sleep 5
533ps aux > /dev/null | grep $! | grep -E "T|S" | kill -9 $! > /dev/null
534
535
536#Preparando instruccion Herramienta de diagnóstico de memoria de Windows
537cat > $FILE <<EOF
538boot_disk=$DISK
539boot_main_part=$PART
540disk=$DISK
541main_part=$PART
542boot_entry=Herramienta de diagnóstico de memoria de Windows
543EOF
544spartlnx.run -cui -nm -w -f $FILE &
545sleep 5
546ps aux > /dev/null | grep $! | grep -E "T|S" | kill -9 $! > /dev/null
547
548}
549
550
551#         ogWindowsRegisterPartition int_ndisk int_partiton str_volume int_disk int_partition
552#@brief   Registra una partición en windows con un determinado volumen.
553#@param   int_ndisk      nº de orden del disco a registrar
554#@param   int_partition     nº de particion a registrar
555#@param   str_volumen      volumen a resgistar
556#@param   int_ndisk_windows      nº de orden del disco donde esta windows
557#@param   int_partition_windows     nº de particion donde esta windows
558#@return 
559#@exception OG_ERR_FORMAT    Formato incorrecto.
560#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
561#@version 0.9 - Adaptación a OpenGnSys.
562#@author  Antonio J. Doblas Viso. Universidad de Málaga
563#@date    2009-09-24
564#*/ ##
565function ogWindowsRegisterPartition ()
566{
567# Variables locales.
568local PART DISK FILE REGISTREDDISK REGISTREDPART REGISTREDVOL VERSION SYSTEMROOT
569
570# Si se solicita, mostrar ayuda.
571if [ "$*" == "help" ]; then
572    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk_TO_registre int_partition_TO_registre str_NewVolume int_disk int_parition " \
573           "$FUNCNAME 1 1 c: 1 1"
574    return
575fi
576
577# Error si no se reciben 5 parámetros.
578[ $# == 5 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?)
579
580REGISTREDDISK=$1
581REGISTREDPART=$2
582REGISTREDVOL=$(echo $3 | cut -c1 | tr '[:lower:]' '[:upper:]')
583DISK=$4
584PART=$5
585FILE=/tmp/temp$$
586
587ogDiskToDev $REGISTREDDISK $REGISTREDPART || return $(ogRaiseError $OG_ERR_PARTITION "particion a registrar "; echo $?)
588ogDiskToDev $DISK $PART || return $(ogRaiseError $OG_ERR_PARTITION "particion de windows"; echo $?)
589
590ogGetOsType $DISK $PART | grep "Windows" || return $(ogRaiseError $OG_ERR_NOTOS "no es windows"; echo $?)
591
592VERSION=$(ogGetOsVersion $DISK $PART)
593
594#Systemroot
595
596if ogGetPath $DISK $PART WINDOWS
597then
598        SYSTEMROOT="Windows"
599elif ogGetPath $DISK $PART WINNT
600then
601        SYSTEMROOT="winnt"
602else
603        return $(ogRaiseError $OG_ERR_NOTOS; echo $?)
604fi
605
606ogUnmount $DISK $PART
607let DISK=$DISK-1
608let REGISTREDDISK=$REGISTREDDISK-1
609#Preparando instruccion Windows Boot Manager
610cat > $FILE <<EOF
611windows_disk=$DISK
612windows_main_part=$PART
613windows_dir=$SYSTEMROOT
614disk=$REGISTREDDISK
615main_part=$REGISTREDPART
616;ext_part
617part_letter=$REGISTREDVOL
618EOF
619spartlnx.run -cui -nm -u -f $FILE &
620sleep 5
621ps aux > /dev/null | grep $! | grep -E "T|S" | kill -9 $! > /dev/null
622
623}
624
625
626#         ogGrubInstallMbr  int_disk_GRUBCFG  int_partition_GRUBCFG #@param   bolean_Check_Os_installed_and_Configure_2ndStage   true | false[default]
627#@brief   Instala y actualiza el gestor grub el el MBR del disco duro donde se encuentra el fichero grub.cfg. Admite sistemas Windows.
628#@param   int_disk_SecondStage     
629#@param   int_part_SecondStage     
630#@param   bolean_Check_Os_installed_and_Configure_2ndStage   true | false[default]
631#@return 
632#@exception OG_ERR_FORMAT    Formato incorrecto.
633#@version 1.0.2 - Primeras pruebas.
634#@author  Antonio J. Doblas Viso.   Universidad de Malaga.
635#@date    2011-10-29
636#@version 1.0.3 - Soporte para linux de 32 y 64 bits
637#@author  Antonio J. Doblas Viso.   Universidad de Malaga.
638#@date    2012-03-13
639#@version 1.0.3 - Ficheros de configuracion independientes segun ubicación de la primera etapa
640#@author  Antonio J. Doblas Viso.   Universidad de Malaga.
641#@date    2012-03-13
642#*/ ##
643
644function ogGrubInstallMbr {
645
646# Variables locales.
647local PART DISK VERSION FIRSTAGE SECONSTAGE CHECKOS KERNELPARAM BACKUPNAME
648
649# Si se solicita, mostrar ayuda.
650if [ "$*" == "help" ]; then
651    ogHelp "$FUNCNAME" "$FUNCNAME  int_ndiskSecondStage int_partitionSecondStage bolean_Configure_2ndStage   \"param param \"  " \
652           "$FUNCNAME 1 1 FALSE " \
653           "$FUNCNAME 1 1 TRUE \"nomodeset irqpoll pci=noacpi quiet splash \" "
654    return
655fi 
656
657# Error si no se reciben 2 parámetros.
658[ $# -ge 2 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?)
659
660
661DISK=$1; PART=$2;
662CHECKOS=${3:-"FALSE"}
663KERNELPARAM=$4
664BACKUPNAME=".backup.og"
665
666#Error si no es linux.
667#TODO: comprobar si se puede utilizar la particion windows como contenedor de grub.
668#VERSION=$(ogGetOsVersion $DISK $PART)
669#echo $VERSION | grep "Linux" || return $(ogRaiseError $OG_ERR_NOTOS "no es linux"; echo $?)
670
671#Localizar primera etapa del grub
672FIRSTSTAGE=$(ogDiskToDev $DISK)
673
674#localizar disco segunda etapa del grub
675SECONDSTAGE=$(ogMount $DISK $PART)
676
677# prepara el directorio principal de la segunda etapa
678[ -d ${SECONDSTAGE}/boot/grub/ ]  || mkdir -p ${SECONDSTAGE}/boot/grub/
679
680#Localizar directorio segunda etapa del grub   
681PREFIXSECONDSTAGE="/boot/grubMBR"
682
683# Si Reconfigurar segunda etapa (grub.cfg) == FALSE
684if [ -f ${SECONDSTAGE}/boot/grub/grub.cfg -o -f ${SECONDSTAGE}/boot/grub/grub.cfg$BACKUPNAME ]
685then
686    if [ "$CHECKOS" == "false" -o "$CHECKOS" == "FALSE" ]
687    then
688        # Si no se reconfigura se utiliza el grub.cfg orginal
689        [ -f ${SECONDSTAGE}/boot/grub/grub.cfg$BACKUPNAME ] && mv ${SECONDSTAGE}/boot/grub/grub.cfg$BACKUPNAME ${SECONDSTAGE}/boot/grub/grub.cfg
690                # Si no se reconfigure se borra los ficheros previos de configuración específicos de opengnsys.
691        [ -d ${SECONDSTAGE}${PREFIXSECONDSTAGE} ] &&  rm -fr ${SECONDSTAGE}${PREFIXSECONDSTAGE}
692        # Reactivamos el grub con el grub.cfg original.
693        grub-install --force --root-directory=${SECONDSTAGE} $FIRSTSTAGE
694        return $?
695    fi
696fi
697
698# SI Reconfigurar segunda etapa (grub.cfg) == TRUE
699#Configur la sintaxis grub para evitar menus de "recovery" en el OGLive
700echo "GRUB_DISABLE_RECOVERY=\"true\"" >> /etc/default/grub
701echo "GRUB_DISABLE_LINUX_UUID=\"true\"" >> /etc/default/grub
702
703#Evitar detectar modo recovery - mover grub.cfg original a grub.cfg.backup
704[ -f ${SECONDSTAGE}/boot/grub/grub.cfg ] && mv ${SECONDSTAGE}/boot/grub/grub.cfg ${SECONDSTAGE}/boot/grub/grub.cfg$BACKUPNAME
705
706#Preparar configuración segunda etapa: crear ubicacion
707mkdir -p ${SECONDSTAGE}${PREFIXSECONDSTAGE}/boot/grub/
708#Preparar configuración segunda etapa: crear cabecera del fichero
709/etc/grub.d/00_header > ${SECONDSTAGE}${PREFIXSECONDSTAGE}/boot/grub/grub.cfg
710#Preparar configuración segunda etapa: crear entrada del sistema operativo
711grubSyntax "$KERNELPARAM" >> ${SECONDSTAGE}${PREFIXSECONDSTAGE}/boot/grub/grub.cfg
712
713#Instalar el grub
714grub-install --force --root-directory=${SECONDSTAGE}${PREFIXSECONDSTAGE} $FIRSTSTAGE
715}
716
717
718
719#         ogGrubInstallPartition int_disk_SECONDSTAGE  int_partition_SECONDSTAGE bolean_Check_Os_installed_and_Configure_2ndStage
720#@brief   Instala y actualiza el gestor grub en el bootsector de la particion indicada
721#@param   int_disk_SecondStage     
722#@param   int_part_SecondStage     
723#@param   bolean_Check_Os_installed_and_Configure_2ndStage   true | false[default]
724#@param   str "kernel param "   
725#@return 
726#@exception OG_ERR_FORMAT    Formato incorrecto.
727#@version 1.0.2 - Primeras pruebas.
728#@author  Antonio J. Doblas Viso.   Universidad de Malaga.
729#@date    2011-10-29
730#@version 1.0.3 - Soporte para linux de 32 y 64 bits
731#@author  Antonio J. Doblas Viso.   Universidad de Malaga.
732#@date    2012-03-13
733#@version 1.0.3 - Ficheros de configuracion independientes segun ubicación de la priemra etapa
734#@author  Antonio J. Doblas Viso.   Universidad de Malaga.
735#@date    2012-03-13
736#*/ ##
737
738function ogGrubInstallPartition {
739
740# Variables locales.
741local PART DISK VERSION FIRSTAGE SECONSTAGE CHECKOS KERNELPARAM BACKUPNAME
742
743# Si se solicita, mostrar ayuda.
744if [ "$*" == "help" ]; then
745    ogHelp "$FUNCNAME" "$FUNCNAME int_ndiskSecondStage int_partitionSecondStage bolean_Configure_2ndStage   \"param param \" " \
746           "$FUNCNAME 1 1 FALSE " \
747           "$FUNCNAME 1 1 TRUE \"nomodeset irqpoll pci=noacpi quiet splash \" "
748    return
749fi 
750
751# Error si no se reciben 2 parámetros.
752[ $# -ge 2 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?)
753
754DISK=$1; PART=$2;
755CHECKOS=${3:-"FALSE"}
756KERNELPARAM=$4
757BACKUPNAME=".backup.og"
758
759#error si no es linux.
760VERSION=$(ogGetOsVersion $DISK $PART)
761echo $VERSION | grep "Linux" || return $(ogRaiseError $OG_ERR_NOTOS "no es linux"; echo $?)
762
763#Localizar primera etapa del grub
764FIRSTSTAGE=$(ogDiskToDev $DISK $PART)
765
766#localizar disco segunda etapa del grub
767SECONDSTAGE=$(ogMount $DISK $PART)
768
769#Localizar directorio segunda etapa del grub   
770PREFIXSECONDSTAGE="/boot/grubPARTITION"
771
772# Si Reconfigurar segunda etapa (grub.cfg) == FALSE
773if [ -f ${SECONDSTAGE}/boot/grub/grub.cfg -o -f ${SECONDSTAGE}/boot/grub/grub.cfg$BACKUPNAME ]
774then
775    if [ "$CHECKOS" == "false" -o "$CHECKOS" == "FALSE" ]
776    then
777        # Si no se reconfigura se utiliza el grub.cfg orginal
778        [ -f ${SECONDSTAGE}/boot/grub/grub.cfg$BACKUPNAME ] && mv ${SECONDSTAGE}/boot/grub/grub.cfg$BACKUPNAME ${SECONDSTAGE}/boot/grub/grub.cfg
779                # Si no se reconfigure se borra los ficheros previos de configuración específicos de opengnsys.
780        [ -d ${SECONDSTAGE}${PREFIXSECONDSTAGE} ] &&  rm -fr ${SECONDSTAGE}${PREFIXSECONDSTAGE}
781        # Reactivamos el grub con el grub.cfg original.
782        grub-install --force --root-directory=${SECONDSTAGE} $FIRSTSTAGE
783        return $?
784    fi
785fi
786
787# SI Reconfigurar segunda etapa (grub.cfg) == TRUE
788#Configur la sintaxis grub para evitar menus de "recovery" en el OGLive
789echo "GRUB_DISABLE_RECOVERY=\"true\"" >> /etc/default/grub
790echo "GRUB_DISABLE_LINUX_UUID=\"true\"" >> /etc/default/grub
791
792#Evitar detectar modo recovery - mover grub.cfg original a grub.cfg.backup.og
793[ -f ${SECONDSTAGE}/boot/grub/grub.cfg ] && mv ${SECONDSTAGE}/boot/grub/grub.cfg ${SECONDSTAGE}/boot/grub/grub.cfg$BACKUPNAME
794
795#Preparar configuración segunda etapa: crear ubicacion
796mkdir -p ${SECONDSTAGE}${PREFIXSECONDSTAGE}/boot/grub/
797#Preparar configuración segunda etapa: crear cabecera del fichero
798/etc/grub.d/00_header > ${SECONDSTAGE}${PREFIXSECONDSTAGE}/boot/grub/grub.cfg
799#Preparar configuración segunda etapa: crear entrada del sistema operativo
800grubSyntax $DISK $PART "$KERNELPARAM" >> ${SECONDSTAGE}${PREFIXSECONDSTAGE}/boot/grub/grub.cfg
801
802#Instalar el grub
803grub-install --force --root-directory=${SECONDSTAGE}${PREFIXSECONDSTAGE} $FIRSTSTAGE
804}
805
806###
807#En pruebas
808##
809#/**
810#         ogConfigureFstab int_ndisk int_nfilesys
811#@brief   Establece el nombre del equipo en los ficheros hostname y hosts.
812#@param   int_ndisk      nº de orden del disco
813#@param   int_nfilesys   nº de orden del sistema de archivos
814#@return  (nada)
815#@exception OG_ERR_FORMAT    Formato incorrecto.
816#@exception OG_ERR_NOTFOUND  No se encuentra el fichero fstab a procesar.
817#@warning Puede haber un error si hay más de 1 partición swap.
818#@version 1.0.5 - Primera versión para OpenGnSys.
819#@author  Antonio J. Doblas Viso.   Universidad de Malaga.
820#@date    2013-03-21
821#*/ ##
822function ogConfigureFstab {
823# Variables locales.
824local FSTAB DEFROOT PARTROOT DEFSWAP PARTSWAP
825
826# Si se solicita, mostrar ayuda.
827if [ "$*" == "help" ]; then
828    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \
829           "$FUNCNAME 1 1"
830    return
831fi
832# Error si no se reciben 2 parámetros.
833[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
834# Error si no se encuentra un fichero  etc/fstab  en el sistema de archivos.
835FSTAB=$(ogGetPath $1 $2 /etc/fstab) 2>/dev/null
836[ -n "$FSTAB" ] || ogRaiseError $OG_ERR_NOTFOUND "$1,$2,/etc/fstab" || return $?
837
838# Hacer copia de seguridad del fichero fstab original.
839cp -a ${FSTAB} ${FSTAB}.backup
840# Dispositivo del raíz en fichero fstab: 1er campo (si no tiene "#") con 2º campo = "/".
841DEFROOT=$(awk '$1!~/#/ && $2=="/" {print $1}' ${FSTAB})
842PARTROOT=$(ogDiskToDev $1 $2)
843# Configuración de swap (solo 1ª partición detectada).
844PARTSWAP=$(blkid -t TYPE=swap | awk -F: 'NR==1 {print $1}')
845if [ -n "$PARTSWAP" ]
846then
847    # Dispositivo de swap en fichero fstab: 1er campo (si no tiene "#") con 3er campo = "swap".
848    DEFSWAP=$(awk '$1!~/#/ && $3=="swap" {print $1}' ${FSTAB})
849    if [ -n "$DEFSWAP" ]
850    then
851        echo "Hay definicion de swap en el fstab $DEFSWAP -> modificamos fichero con nuevo valor $DEFSWAP->$PARTSWAP"   # Mensaje temporal.
852        sed "s|$DEFSWAP|$PARTSWAP|g ; s|$DEFROOT|$PARTROOT|g" ${FSTAB}.backup > ${FSTAB}
853    else
854        echo "No hay definicion de swap y si hay partición swap -> moficamos fichero"   # Mensaje temporal.
855        sed "s|$DEFROOT|$PARTROOT|g" ${FSTAB}.backup > ${FSTAB}
856        echo "$PARTSWAP  none    swap    sw   0  0" >> ${FSTAB}
857    fi 
858else
859    echo "No hay partición swap -> configuramos fstba"  # Mensaje temporal.
860    sed "s|$DEFROOT|$PARTROOT|g" ${FSTAB}.backup > ${FSTAB}
861fi
862}
863
864
865###
866#En pruebas
867##
868#/**
869#         ogSetLinuxName int_ndisk int_nfilesys [str_name]
870#@brief   Establece el nombre del equipo en los ficheros hostname y hosts.
871#@param   int_ndisk      nº de orden del disco
872#@param   int_nfilesys   nº de orden del sistema de archivos
873#@param   str_name       nombre asignado (opcional)
874#@return  (nada)
875#@exception OG_ERR_FORMAT    Formato incorrecto.
876#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
877#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
878#@note    Si no se indica nombre, se asigna un valor por defecto.
879#@version 1.0.5 - Primera versión para OpenGnSys.
880#@author  Antonio J. Doblas Viso.   Universidad de Malaga.
881#@date    2013-03-21
882#*/ ##
883function ogSetLinuxName ()
884{
885# Variables locales.
886local MNTDIR ETC NAME
887
888# Si se solicita, mostrar ayuda.
889if [ "$*" == "help" ]; then
890    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys [str_name]" \
891           "$FUNCNAME 1 1" "$FUNCNAME 1 1 practica-pc"
892    return
893fi
894# Error si no se reciben 2 o 3 parámetros.
895case $# in
896    2)   # Asignar nombre automático (por defecto, "pc").
897         NAME="$(ogGetHostname)"
898         NAME=${NAME:-"pc"} ;;
899    3)   # Asignar nombre del 3er parámetro.
900         NAME="$3" ;;
901    *)   # Formato de ejecución incorrecto.
902         ogRaiseError $OG_ERR_FORMAT
903         return $?
904esac
905
906# Montar el sistema de archivos.
907MNTDIR=$(ogMount $1 $2) || return $?
908
909ETC=$(ogGetPath $1 $2 /etc)
910
911if [ -d "$ETC" ]; then
912        #cambio de nombre en hostname
913        echo "$NAME" > $ETC/hostname
914        #Opcion A para cambio de nombre en hosts
915        #sed "/127.0.1.1/ c\127.0.1.1 \t $HOSTNAME" $ETC/hosts > /tmp/hosts && cp /tmp/hosts $ETC/ && rm /tmp/hosts
916        #Opcion B componer fichero de hosts
917        cat > $ETC/hosts <<EOF
918127.0.0.1       localhost
919127.0.1.1       $NAME
920
921# The following lines are desirable for IPv6 capable hosts
922::1     ip6-localhost ip6-loopback
923fe00::0 ip6-localnet
924ff00::0 ip6-mcastprefix
925ff02::1 ip6-allnodes
926ff02::2 ip6-allrouters
927EOF
928fi
929}
930
931
932###
933#En pruebas
934##
935#/**
936#         ogCleanLinuxDevices int_ndisk int_nfilesys
937#@brief   Limpia los dispositivos del equipo de referencia. Interfaz de red ...
938#@param   int_ndisk      nº de orden del disco
939#@param   int_nfilesys   nº de orden del sistema de archivos
940#@return  (nada)
941#@exception OG_ERR_FORMAT    Formato incorrecto.
942#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
943#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
944#@version 1.0.5 - Primera versión para OpenGnSys.
945#@author  Antonio J. Doblas Viso.   Universidad de Malaga.
946#@date    2013-03-21
947#*/ ##
948function ogCleanLinuxDevices ()
949{
950# Variables locales.
951local MNTDIR
952
953# Si se solicita, mostrar ayuda.
954if [ "$*" == "help" ]; then
955    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \
956           "$FUNCNAME 1 1"
957    return
958fi
959# Error si no se reciben 2 parámetros.
960[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
961
962# Montar el sistema de archivos.
963MNTDIR=$(ogMount $1 $2) || return $?
964
965# Eliminar fichero de configuración de udev para dispositivos fijos de red.
966rm -f ${MNTDIR}/etc/udev/rules.d/70-persistent-net.rules
967}
968
Note: See TracBrowser for help on using the repository browser.