source: client/engine/Boot.lib @ c7d9af7

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 c7d9af7 was f5432db7, checked in by ramon <ramongomez@…>, 16 years ago

Leves correcciones en scripts y funciones.

git-svn-id: https://opengnsys.es/svn/trunk@398 a21b9725-9963-47de-94b9-378ad31fedc9

  • Property mode set to 100755
File size: 12.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 0.9
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#@arg  \c int_ndisk      nº de orden del disco
16#@arg  \c 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.9 - Adaptación para OpenGNSys.
24#@author  Ramon Gomez, ETSII Universidad de Sevilla
25#@date    2009-09-11
26#*/
27function ogBoot () {
28
29# Variables locales.
30local PART TYPE MNTDIR PARAMS KERNEL INITRD APPEND FILE LOADER
31
32#/// Si se solicita, mostrar ayuda.
33if [ "$*" == "help" ]; then
34    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
35           "$FUNCNAME 1 1"
36    return
37fi
38#/// Error si no se reciben 2 parámetros.
39[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
40
41#/// Detectar tipo de sistema de archivos y montarlo.
42TYPE=$(ogGetFsType $1 $2) || return $?
43MNTDIR=$(ogMount $1 $2) 2>/dev/null
44[ -z "$MNTDIR" ] && ogRaiseError OG_ERR_PARTITION "$1, $2" && return $?
45
46case "$TYPE" in
47    EXT[234]|REISERFS|REISER4)
48        #/// Obtiene los parámetros de arranque para Linux.
49        PARAMS=$(ogLinuxBootParameters $1 $2) || return $?
50        read -e KERNEL INITRD APPEND <<<"$PARAMS"
51        # Si no hay kernel, no hay sistema operativo.
52        [ -z "$KERNEL" ] && ogRaiseError $OG_ERR_NOTOS && return $?
53        # Configurar kernel Linux con los parámetros leídos de su GRUB.
54        kexec -l ${MNTDIR}${KERNEL} --append="$APPEND" --initrd=${MNTDIR}${INITRD}
55        ;;
56    NTFS|HNTFS|FAT32|HFAT32)
57        #/// Compruebar si hay un cargador de Windows.
58        for f in io.sys ntldr bootmgr; do
59            FILE="$(ogGetPath $1 $2 $f 2>/dev/null)"
60            [ -n "$FILE" ] && LOADER="$(basename $FILE)"
61        done
62        [ -z "$LOADER" ] && ogRaiseError $OG_ERR_NOTOS && return $?
63        # Activar la partición y copiar Grub4DOS.
64        ogSetPartitionActive $1 $2
65        cp $OGLIB/grub4dos/* $MNTDIR    # */ (necesario para Doxygen)
66        kexec -l $MNTDIR/grub.exe --append=--config-file="find --set-root /$LOADER; chainloader /$LOADER; tpm --init"
67        ;;
68    *)  ogRaiseError $OG_ERR_PARTITION "$1, $2"
69        return $?
70        ;;
71esac
72
73#/// Arrancar.
74kexec -e
75}
76
77
78#/**
79#         ogGetRegistryValue path_mountpoint str_registrytype str_valuename
80#@brief   Devuelve el dato de un valor del registro de Windows.
81#@arg  \c path_mountpoint  directorio donde está montado el sistema Windows
82#@arg  \c str_registrytype tipo de registro a leer
83#@arg  \c str_valuename    valor de registro
84#@return  str_valuedata - valor de la clave.
85#@exception OG_ERR_FORMAT    Formato incorrecto.
86#@exception OG_ERR_NOTFOUND  Disco o partición no corresponden con un dispositivo.
87#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
88#@note    registrytype = { default, sam, security, software, system, components }
89#@warning Requisitos: chntpw, awk
90#@warning La partición de Windows debe estar montada previamente.
91#@version 0.9 - Adaptación para OpenGNSys.
92#@author  Ramon Gomez, ETSII Universidad de Sevilla
93#@date    2009-09-11
94#*/
95function ogGetRegistryValue () {
96
97# Variables locales.
98local FILE FILENT FILEXP
99
100#/// Si se solicita, mostrar ayuda.
101if [ "$*" == "help" ]; then
102    ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_registrytype str_key"
103    return
104fi
105#/// Error si no se reciben 3 parámetros.
106[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $?
107
108#/// Camino del fichero de registro en NT/2000 o XP/Vista/7.
109FILENT=$(ogGetPath "/$1/winnt/system32/config/$2")
110[ -f $FILENT ] && FILE="$FILENT"
111FILEXP=$(ogGetPath "/$1/windows/system32/config/$2")
112[ -f $FLEHXP ] && FILE="$FILEXP"
113[ ! -f $FILE ] && ogRaiseError OG_ERR_NOTFOUND "$1,$2" && return $?
114
115#/// Devolver el dato del valor de registro.
116chntpw $FILE << FIN 2>/dev/null | awk '/> Value/ {getline;print $0;}'
117cd ${3%\\*}
118cat ${3##*\\}
119q
120FIN
121}
122
123
124#/**
125#         ogGetWindowsName int_ndisk int_npartition
126#@brief   Muestra el nombre del equipo en el registro de Windows.
127#@arg  \c int_ndisk      nº de orden del disco
128#@arg  \c int_npartition nº de orden de la partición
129#@return  str_name - nombre del equipo
130#@exception OG_ERR_FORMAT    Formato incorrecto.
131#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
132#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
133#@version 0.9 - Adaptación para OpenGNSys.
134#@author  Ramon Gomez, ETSII Universidad de Sevilla
135#@date    2009-09-23
136#*/
137function ogGetWindowsName () {
138
139# Variables locales.
140local PART MNTDIR
141
142#/// Si se solicita, mostrar ayuda.
143if [ "$*" == "help" ]; then
144    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
145           "$FUNCNAME 1 1  ==>  PRACTICA-PC"
146    return
147fi
148#/// Error si no se reciben 2 parámetros.
149[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
150
151#/// Montar el sistema de archivos.
152MNTDIR=$(ogMount $1 $2) 2>/dev/null
153[ -z "$MNTDIR" ] && ogRaiseError OG_ERR_PARTITION "$1, $2" && return $?
154
155#/// Obtener dato del valor de registro.
156ogGetRegistryValue $MNTDIR system '\ControlSet001\Control\ComputerName\ComputerName\ComputerName'
157}
158
159
160#/**
161#         ogListRegistryKeys path_mountpoint str_registrytype str_key
162#@brief   Lista los nombres de claves de una determinada clave del registro de Windows.
163#@arg  \c path_mountpoint  directorio donde está montado el sistema Windows
164#@arg  \c str_registrytype tipo de registro a leer
165#@arg  \c str_key          clave de registro
166#@return
167#@exception OG_ERR_FORMAT    Formato incorrecto.
168#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
169#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
170#@note    registrytype = { default, sam, security, software, system, components }
171#@warning Requisitos: chntpw, awk
172#@warning La partición de Windows debe estar montada previamente.
173#@version 0.9 - Adaptación para OpenGNSys.
174#@author  Ramon Gomez, ETSII Universidad de Sevilla
175#@date    2009-09-23
176#*/
177function ogListRegistryKeys () {
178
179# Variables locales.
180local FILE FILENT FILEXP
181
182#/// Si se solicita, mostrar ayuda.
183if [ "$*" == "help" ]; then
184    ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_registrytype str_key"
185    return
186fi
187#/// Error si no se reciben 3 parámetros.
188[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $?
189
190#/// Camino del fichero de registro en NT/2000 o XP/Vista/7.
191FILENT=$(ogGetPath "/$1/winnt/system32/config/$2")
192[ -f $FILENT ] && FILE="$FILENT"
193FILEXP=$(ogGetPath "/$1/windows/system32/config/$2")
194[ -f $FLEHXP ] && FILE="$FILEXP"
195[ ! -f $FILE ] && ogRaiseError OG_ERR_NOTFOUND "$1,$2" && return $?
196
197#/// Devolver la lista de claves de registro.
198chntpw $FILE << FIN 2>/dev/null | awk 'BEGIN {FS="[<>]"} $1~/^  $/ {print $2}'
199ls $3
200q
201FIN
202}
203
204
205#/**
206#         ogLinuxBootParameters int_ndisk int_npartition
207#@brief   Muestra los parámetros de arranque de un sistema de archivos Linux.
208#@arg  \c int_ndisk      nº de orden del disco
209#@arg  \c int_npartition nº de orden de la partición
210#@return  kernel initrd parámetros ...
211#@exception OG_ERR_FORMAT    Formato incorrecto.
212#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
213#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
214#@warning Función básica usada por \c ogBoot
215#@version 0.9 - Primera adaptación para OpenGNSys.
216#@author  Ramon Gomez, ETSII Universidad de Sevilla
217#@date    2009-09-11
218#*/
219function ogLinuxBootParameters () {
220
221# Variables locales.
222local MNTDIR CONF
223
224#/// Si se solicita, mostrar ayuda.
225if [ "$*" == "help" ]; then
226    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
227           "$FUNCNAME 1 2  ==>  ..."
228    return
229fi
230#/// Error si no se reciben 2 parámetros.
231[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
232
233#/// Detectar id. de tipo de partición y codificar al mnemonico.
234MNTDIR=$(ogMount $1 $2) 2>/dev/null
235[ -z "$MNTDIR" ] && ogRaiseError OG_ERR_PARTITION "$1, $2" && return $?
236
237# Fichero de configuración de GRUB.
238CONF="$MNTDIR/boot/grub/menu.lst"
239[ ! -e $CONF ] && CONF="$MNTDIR/boot/grub/grub.cfg"
240[ ! -e $CONF ] && ogRaiseError $OG_ERR_NOTFOUND "grub.cfg" && return $?
241
242#/** Toma del fichero de configuracion los valores del kernel, initrd
243#       y parámetros de arranque usando las cláusulas por defecto
244#       ("default" en GRUB1, "set default" en GRUB2)
245#       y los formatea para que sean compatibles con \c kexec .  */
246#/* (ncesario para Doxygen)
247awk 'BEGIN {cont=-1;}
248     $1~/^default/      {sub(/=/," "); def=$2;}
249     $1~/^set/ && $2~/^default/ {gsub(/[="]/," "); def=$3;}
250     $1~/^title|^menuentry/ {cont++}
251     $1~/^kernel|^linux/ {if (def==cont) {
252                            kern=$2;
253                            sub($1,"");sub($1,"");sub(/^[ \t]*/,"");app=$0}
254                        }
255     $1~/^initrd/       {if (def==cont) init=$2}
256     END {if (kern!="") printf("%s %s %s", kern,init,app)}
257    ' $CONF
258}
259
260
261
262#/**
263#         ogSetRegistryValue path_mountpoint str_registrytype str_valuename str_valuedata
264#@brief   Establece el dato asociado a un valor del registro de Windows.
265#@arg  \c path_mountpoint  directorio donde está montado el sistema Windows
266#@arg  \c str_registrytype tipo de registro
267#@arg  \c str_valuename    nombre del valor de registro
268#@arg  \c str_valuedata    dato del valor de registro
269#@return  (nada)
270#@exception OG_ERR_FORMAT    Formato incorrecto.
271#@exception OG_ERR_NOTFOUND  Disco o partición no corresponden con un dispositivo.
272#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
273#@note    registrytype = { default, sam, security, software, system, components }
274#@warning Requisitos: chntpw, awk
275#@warning La partición de Windows debe estar montada previamente.
276#@version 0.9 - Adaptación para OpenGNSys.
277#@author  Ramon Gomez, ETSII Universidad de Sevilla
278#@date    2009-09-24
279#*/
280function ogSetRegistryValue () {
281
282# Variables locales.
283local FILE FILENT FILEXP
284
285#/// Si se solicita, mostrar ayuda.
286if [ "$*" == "help" ]; then
287    ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_registrytype str_key"
288    return
289fi
290#/// Error si no se reciben 4 parámetros.
291[ $# == 4 ] || ogRaiseError $OG_ERR_FORMAT || return $?
292
293#/// Camino del fichero de registro en NT/2000 o XP/Vista/7.
294FILENT=$(ogGetPath "/$1/winnt/system32/config/$2")
295[ -f $FILENT ] && FILE="$FILENT"
296FILEXP=$(ogGetPath "/$1/windows/system32/config/$2")
297[ -f $FLEHXP ] && FILE="$FILEXP"
298[ ! -f $FILE ] && ogRaiseError OG_ERR_NOTFOUND "$1,$2" && return $?
299
300#/// Cambiar el dato del valor de registro.
301chntpw $FILE << FIN &>/dev/null
302ed $3
303$4
304q
305y
306FIN
307}
308
309
310#/**
311#         ogSetWindowsName int_ndisk int_npartition str_name
312#@brief   Establece el nombre del equipo en el registro de Windows.
313#@arg  \c int_ndisk      nº de orden del disco
314#@arg  \c int_npartition nº de orden de la partición
315#@arg  \c str_name       nombre asignado
316#@return  (nada)
317#@exception OG_ERR_FORMAT    Formato incorrecto.
318#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
319#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
320#@version 0.9 - Adaptación a OpenGNSys.
321#@author  Ramon Gomez, ETSII Universidad de Sevilla
322#@date    2009-09-24
323#*/
324function ogSetWindowsName () {
325
326# Variables locales.
327local PART MNTDIR NAME
328
329#/// Si se solicita, mostrar ayuda.
330if [ "$*" == "help" ]; then
331    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
332           "$FUNCNAME 1 1 PRACTICA-PC"
333    return
334fi
335#/// Error si no se reciben 3 parámetros.
336[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $?
337
338#/// Montar el sistema de archivos.
339MNTDIR=$(ogMount $1 $2) 2>/dev/null
340[ -z "$MNTDIR" ] && ogRaiseError OG_ERR_PARTITION "$1, $2" && return $?
341NAME="$3"
342
343#/// Modificar datos de los valores de registro.
344ogSetRegistryValue $MNTDIR system '\ControlSet001\Control\ComputerName\ComputerName\ComputerName' "$NAME"
345ogSetRegistryValue $MNTDIR system '\ControlSet001\Services\Tcpip\Parameters\Hostname' "$NAME"
346ogSetRegistryValue $MNTDIR system '\ControlSet001\Services\Tcpip\Parameters\NV Hostname' "$NAME"
347}
348
349
350function ogNewMbrXP () {
351#/**  @function NewMbrXP: @brief Genera un nuevo Master Boot Record en el disco duro indicado, compatible con los SO tipo Windows
352#@param  $1 obligatorio   int_numdisk
353#@return  salida del programa my-sys
354#@warning    no definidos
355#@attention Requisitos:  my-sys, compilado ubicado en /var/EAC/admin/source
356#@note
357#@version 0.1       Date: 27/10/2008                 Author Antonio J. Doblas Viso. Universidad de Malaga
358#*/
359#
360if [ $# = 0 ]
361then
362        Msg "sintaxis: ogNewMbrXP int_disco " red
363return
364fi
365if [ $# = 1 ]
366then
367        particion=`ogDiskToDev $1`
368        ms-sys -z -f $particion
369        ms-sys -m -f $particion
370fi
371}
Note: See TracBrowser for help on using the repository browser.