source: client/engine/Boot.lib @ c8f8a9c

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 c8f8a9c was 6e139c9, checked in by adv <adv@…>, 15 years ago

ogNewMbrXP 0.9 adaptado a sintáxis OpenGNsys

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

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