close Warning: Failed to sync with repository "ogBrowser-Git": (1366, "Incorrect string value: '\\xF0\\x9F\\x93\\xA6 I...' for column 'message' at row 1"); repository information may be out of date. Look in the Trac log for more information including mitigation strategies.

source: ogLive-Builder-Git/includes/etc/initramfs-tools/scripts/ogfunctions

main 3.14.1
Last change on this file was b95b589, checked in by Natalia Serrano <natalia.serrano@…>, 8 weeks ago

refs #2594 save a log of early init

  • Property mode set to 100644
File size: 34.0 KB
Line 
1#/**
2#@file    ogfunctions.lib
3#@brief   Librería o clase para la gestion del sistema operativo de los clientes OpenGnsys.
4#@class   client
5#@version 1.1.0
6#@warning License: GNU GPLv3+
7#*/ ##
8
9
10#/**
11#         ogGetNetworkDevice
12#@brief   Devuelve el nombre de dispositivo de red correpondiente al índice indicado.
13#@param   int_devindex   índice de dispositivo de red.
14#@return  str_devname    nombre de dispositivo de red.
15#@note    Índice 0 debe corresponder a interfaz "lo" y a partir de 1 para las reales.
16#@version 1.1.0 - Primera versión de la función.
17#@author  Ramón Gómez, ETSII Universidad de Sevilla
18#@date    2016/04/20
19#*/ ##
20ogGetNetworkDevice ()
21{
22echo "ogGetNetworkDevice()" >>/tmp/oginit.log
23# Mantener retrocompatibilidad con interfaces antiguas tipo eth.
24case "$1" in
25    eth0)    ind=1 ;;
26    eth1)    ind=2 ;;
27    eth2)    ind=3 ;;
28    *)    ind="$1" ;;
29esac
30echo "ind ($ind)" >>/tmp/oginit.log
31# Buscar el dispositivo del índice.
32dev=""
33for f in /sys/class/net/*/uevent; do
34    echo "source $f" >>/tmp/oginit.log
35    source $f
36    let aux=$IFINDEX-1
37    echo "aux ($aux)" >>/tmp/oginit.log
38    [ "$ind" = "$INTERFACE" -o "$ind" = $aux ] && dev="$INTERFACE"
39done
40echo "dev ($dev)" >>/tmp/oginit.log
41[ -n "$dev" ] && echo "$dev"
42}
43
44
45#/**
46#         ogExportKernelParameters
47#@brief   Exporta los parametros pasados al kernel
48#@exception OG_ERR_FORMAT    Formato incorrecto.
49#@version 0.7 - Primera versión de la función.
50#@author  Antonio J. Doblas. Universidad de Malaga.
51#@date    2010/05/24
52#@version 1.1.0 - Sustituir índice de interfaz de red por su dispositivo.
53#@author  Ramón Gómez, ETSII Universidad de Sevilla
54#@date    2016/04/20
55#*/ ##
56ogExportKernelParameters ()
57{
58    echo "ogExportKernelParameters()" >>/tmp/oginit.log
59    GLOBAL="cat /proc/cmdline"
60    for i in `${GLOBAL}`; do
61        echo $i | grep "=" > /dev/null && export $i && echo "export $i" >>/tmp/oginit.log
62    done
63    # Sustituir índice de interfaz de red por su dispositivo.
64    DEVIND=$(echo "$ip" | cut -f6 -d:)
65    echo "DEVIND ($DEVIND)" >>/tmp/oginit.log
66    if [ -n "$DEVIND" ]; then
67        PRE=$(echo "$ip" | cut -f1-5 -d:)
68        POST=$(echo "$ip" | cut -f7- -d:)
69        DEVICE=$(ogGetNetworkDevice $DEVIND)
70        echo "DEVICE ($DEVICE)" >>/tmp/oginit.log
71        [ -n "$DEVICE" ] && export ip="$PRE:$DEVICE:${POST:-none}" && echo "export ip=$PRE:$DEVICE:${POST:-none}" >>/tmp/oginit.log
72    fi
73    return 0
74}
75
76
77#/**
78#         ogChangeVideoResolution
79#@brief   Cambia la resolución de vídeo utilizando el parámetro "video" del Kernel
80#         (sustituye al parámetro "vga").
81#@note    Formato del parámetro vídeo:    video=DRIVER:RESXxRESY-BITS
82#@note    El valor por defecto es:        video=uvesafb:640x480-16
83#@todo    Control de errores en el foramto de la variable "video".
84#@version 1.0.5 - Primera versión de la función.
85#@author  Ramón Gómez, ETSII Universidad de Sevilla
86#@date    2013/02/18
87#*/ ##
88ogChangeVideoResolution ()
89{
90echo "ogChangeVideoResolution()" >>/tmp/oginit.log
91# Variables locales.
92local DRIVER MODE
93# Mostrar resolución y driver por defecto si solo hay una opción disponible.
94if [ $(grep -c "" /sys/class/graphics/fb0/modes) -eq 1 ]; then
95    echo "Default screen mode: $(cat /sys/class/graphics/fb0/modes),$(cat /sys/class/graphics/fb0/bits_per_pixel)bpp$(lsmod|awk '$1=="video" && $3>0 {printf " (%s)",$4}')."
96else
97    # Obtener driver y resolución.
98    DRIVER="$(echo $video|cut -f1 -d:)"
99    MODE="$(echo $video|cut -f2 -d:)"
100    case "$DRIVER" in
101        # Cambiar resolución para driver "uvesafb".
102        uvesafb)
103            # Obtener modo por defecto si parámetro "video=uvesafb:D".
104            [ "$MODE" == "D" ] && MODE=$(awk -F: '$1=="D" {print $2; nextfile}' /sys/class/graphics/fb0/modes)
105            # Cambiar resolución según valor del parámetro "video".
106            grep ":$(echo ${MODE/p/}|cut -f1 -d-)p" /sys/class/graphics/fb0/modes | head -1 > /sys/class/graphics/fb0/mode 2>&1
107            echo "$(echo $MODE|cut -f2 -d-)" > /sys/class/graphics/fb0/bits_per_pixel 2>&1
108            echo "Screen mode: $(cat /sys/class/graphics/fb0/mode),$(cat /sys/class/graphics/fb0/bits_per_pixel)bpp."
109            ;;
110        # Resolución por defecto para el resto de casos.
111        *)    echo "Unknown video driver, using default mode."
112            ;;
113    esac
114fi
115}
116
117
118#/**
119#       ogExportVarEnvironment
120#@brief   Exporta las variables usadas en el proceso de inicio OpenGnsys y las almacena en /tmp
121#@param
122#@return
123#@exception OG_ERR_FORMAT    Formato incorrecto.
124#@version 0.9
125#@author Antonio J. Doblas. Universidad de Malaga.
126#@date    2011/05/24
127#*/ ##
128ogExportVarEnvironment ()
129{
130    echo "ogExportVarEnvironment()" >>/tmp/oginit.log
131    export CFGINITRD="/tmp/initrd.cfg"
132    OGPROTOCOL="${ogprotocol:-smb}"
133    [ "$ogunit" != "" ] && OGUNIT="/$ogunit"
134    # OPTIONS Para samba y local (a nfs no le afecta)
135    export OPTIONS=" -o user=opengnsys,pass=og"
136    DEFOGLIVE="ogclient"
137    export OGLIVEDIR="${oglivedir:-$DEFOGLIVE}" && echo "OGLIVEDIR=$OGLIVEDIR" >> $CFGINITRD
138    echo "CFGINITRD ($CFGINITRD) OGPROTOCOL ($OGPROTOCOL) OGUNIT ($OGUNIT) OGLIVEDIR ($OGLIVEDIR)" >>/tmp/oginit.log
139    export CFGINITRD="/tmp/initrd.cfg"
140    case "$OGPROTOCOL" in
141        nfs|NFS)
142            export SRCOGLIVE="/var/lib/tftpboot" && echo "SRCOGLIVE=$SRCOGLIVE" >> $CFGINITRD
143            export SRCOGSHARE="/opt/opengnsys/client" && echo "SRCOGSHARE=$SRCOGSHARE" >> $CFGINITRD
144            export SRCOGLOG="/opt/opengnsys/log/clients" && echo "SRCOGLOG=$SRCOGLOG" >> $CFGINITRD
145            export SRCOGIMAGES="/opt/opengnsys/images$OGUNIT" && echo "SRCOGIMAGES=$SRCOGIMAGES" >> $CFGINITRD
146        ;;
147        smb|SMB|cifs|CIFS|samba|SAMBA)
148            export SRCOGLIVE="tftpboot"  && echo "SRCOGLIVE=$SRCOGLIVE" >> $CFGINITRD
149            export SRCOGSHARE="ogclient" && echo "SRCOGSHARE=$SRCOGSHARE" >> $CFGINITRD
150            export SRCOGLOG="oglog" && echo "SRCOGLOG=$SRCOGLOG" >> $CFGINITRD
151            export SRCOGIMAGES="ogimages$OGUNIT" && echo "SRCOGIMAGES=$SRCOGIMAGES" >> $CFGINITRD
152        ;;
153        local|LOCAL)
154            # Ponemos variables SRC compatibles con smb y nfs.
155            export SRCOGLIVE="local"
156            export SRCOGSHARE="client" && echo "SRCOGSHARE=$SRCOGSHARE" >> $CFGINITRD
157            export SRCOGLOG="log" && echo "SRCOGLOG=$SRCOGLOG" >> $CFGINITRD
158            export SRCOGIMAGES="images" && echo "SRCOGIMAGES=$SRCOGIMAGES" >> $CFGINITRD
159        ;;
160    esac
161    echo "SRCOGLIVE ($SRCOGLIVE) SRCOGSHARE ($SRCOGSHARE) SRCOGLOG ($SRCOGLOG) SRCOGIMAGES ($SRCOGIMAGES)" >>/tmp/oginit.log
162    export DSTOGLIVE="/opt/oglive/tftpboot"                                                         #punto de acceso al boot-tools live
163    export OGLIVERAMFS="/opt/oglive/ramfs" && echo "OGLIVERAMFS=$OGLIVERAMFS" >> $CFGINITRD         #punto de montaje para unionfs
164    export OGLIVEROOTFS="/opt/oglive/rootfs" && echo "OGLIVEROOTFS=$OGLIVEROOTFS" >> $CFGINITRD     #punto de montaje donde se accede al 2nd FS mediante loop
165    export OGLIVEUNIONFS="/opt/oglive/unionfs" && echo "OGLIVEUNIONFS=$OGLIVEUNIONFS" >> $CFGINITRD #punto de union entre LOCALROOTIMG y LOCALROOTRAM
166    export OGLIVELABEL="ogClient"                                                                   #etiquta para los dispositivos offline
167    echo "DSTOGLIVE ($DSTOGLIVE) OGLIVERAMFS ($OGLIVERAMFS) OGLIVEROOTFS ($OGLIVEROOTFS) OGLIVEUNIONFS ($OGLIVEUNIONFS)" >>/tmp/oginit.log
168
169    #echo "puntos de montajes para los demas accesos"
170    #echo "acceso al client, engine, scritps, interfaz"
171    export DSTOGSHARE="/opt/opengnsys" && echo "DSTOGSHARE=$DSTOGSHARE" >> $CFGINITRD
172    export DSTOGLOG="/opt/opengnsys/log" && echo "DSTOGLOG=$DSTOGLOG" >> $CFGINITRD
173    export DSTOGIMAGES="/opt/opengnsys/images" && echo "DSTOGIMAGES=$DSTOGIMAGES" >> $CFGINITRD
174    echo "DSTOGSHARE ($DSTOGSHARE) DSTOGLOG ($DSTOGLOG) DSTOGIMAGES ($DSTOGIMAGES)" >>/tmp/oginit.log
175
176    ##INFORMACION DE OTRAS VARIABLES OBTENDIAS EN OTRAS FUNCIONES ogConfigureNetwork.
177        #DEVICE
178        #IPV4DDR
179        #IPV4BROADCAST
180        #IPV4NETMASK
181        #IPV4GATEWAY
182        #HOSTNAME
183    #INFORMACION de otras variasbles obteneidas desde ogGetROOTSERVER
184        #ROOTSERVER  si ip=dhcp -> ROOTSERVER=NEXT-SERVER; si ip=host:rootserver:gw:mask:hostname:interfaz -> ROOTSERVER=rootserver
185        #BOOTIF -> si el gestor remoto es pxelinux.0 y se añade una linea más tipo "IPAPPEND 2" esta variable tendrá la mac de la interfaz.
186        #$OGSERVERLIVE
187        #$OGSERVERSHARE
188        #$OGSERVERLOG
189        #$OGSERVERIMAGES
190    return 0
191}
192
193
194#/**
195#       ogConfigureRamfs
196#@brief   Configura el initrd para adaptarlo al sistema raiz.
197#@param
198#@return
199#@exception OG_ERR_FORMAT    Formato incorrecto.
200#@version 0.9
201#@author Antonio J. Doblas. Universidad de Malaga.
202#@date    2010/05/24
203#*/ ##
204ogConfigureRamfs ()
205{
206    echo "ogConfigureRamfs()" >>/tmp/oginit.log
207    mkdir -p $DSTOGLIVE
208    mkdir -p $OGLIVERAMFS
209    mkdir -p $OGLIVEROOTFS
210    mkdir -p $OGLIVEUNIONFS
211
212    touch /etc/fstab
213}
214
215
216#/**
217#       ogLoadNetModule
218#@brief   Carga en un demerminado modulo de red, requiere compilación previo del modulo
219#@param
220#@return
221#@exception OG_ERR_FORMAT    Formato incorrecto.
222#@version 0.9
223#@author Antonio J. Doblas. Universidad de Malaga.
224#@date    2010/05/24
225#*/ ##
226ogLoadNetModule ()
227{
228    echo "ogLoadNetModule()" >>/tmp/oginit.log
229    if [ -n "$ognetmodule" ]; then
230        echo "Cargando modulo de red $ognetmodule" |tee -a /tmp/oginit.log
231        modprobe ${ognetmodule}
232    fi
233}
234
235
236#/**
237#      ogPostConfigureFS
238#@brief   Configura el sistema raiz, para independizarlo entre los clientes.
239#@param
240#@return
241#@exception OG_ERR_FORMAT    Formato incorrecto.
242#@version 0.9
243#@author Antonio J. Doblas. Universidad de Malaga.
244#@date    2010/05/24
245#*/ ##
246ogPostConfigureFS()
247{
248    echo "ogPostConfigureFS()" >>/tmp/oginit.log
249    echo "IPV4ADDR ($IPV4ADDR) HOSTNAME ($HOSTNAME)" >>/tmp/oginit.log
250    # configuramos el /etc/hostname.
251    echo $HOSTNAME > /etc/hostname
252
253    #configuramos el /etc/hosts
254    echo "127.0.0.1 localhost" > /etc/hosts
255    echo "$IPV4ADDR $HOSTNAME" >> /etc/hosts
256
257    #configuramos el host.conf
258    echo "order hosts,bind" > /etc/host.conf
259    echo "multi on" >> /etc/host.conf
260
261    #configuramos el dns anterior ubuntu 12.04 (parámetro del Kernel "ogdns=IP_DNS")
262    if [ -n "$ogdns" ]; then
263        mkdir -p /run/resolvconf
264        echo "writing 'nameserver $ogdns' to /run/resolvconf/resolv.conf" >>/tmp/oginit.log
265        echo "nameserver $ogdns" > /run/resolvconf/resolv.conf
266    fi
267
268    #configuramos el uso del servicio http proxy (parámetro del Kernel "ogproxy=URL_Proxy")
269    echo "ogproxy ($ogproxy)" >>/tmp/oginit.log
270    if [ -n "${ogproxy}" ]; then
271        export http_proxy="$ogproxy"
272        export https_proxy="$ogproxy"
273        export ftp_proxy="$ogproxy"
274        export ftps_proxy="$ogproxy"
275    fi
276
277    # configuramos el /etc/networks
278    #read -e NETIP NETDEFAULT <<<$(route -n | grep eth0 | awk -F" " '{print $1}')
279    NETIP=$(route -n | grep eth0 | awk -F" " '{print $1}') && NETIP=$(echo $NETIP | cut -f1 -d" ")
280    echo "NETIP ($NETIP)" >>/tmp/oginit.log
281    echo "default 0.0.0.0" > /etc/networks
282    echo "loopback 127.0.0.0" >> /etc/networks
283    echo "link-local 169.254.0.0" >> /etc/networks
284    echo "localnet $NETIP" >> /etc/networks
285    #route
286
287    #echo "ogLive1.0.2" > /etc/debian_chroot
288
289    #enlace si iniciamos desde ogprotocolo=local { cdrom, usb, cache } .
290    # monta el raiz del dispositivo local en /opt/og2fs/tftpboot  - acceso al fichero .sqfs
291    # y monta el sistema root sqfs en /opt/og2fs/2ndfs
292    echo "LOCALMEDIA ($LOCALMEDIA) ogprotocol ($ogprotocol) ogstatus ($ogstatus)" >>/tmp/oginit.log
293    #[ "$LOCALMEDIA" == "CACHE" ] && ln -s $DSTOGLIVE /opt/opengnsys/cache
294    #[ "$ogprotocol" == "local" ] &&  ln -s ${OGLIVEROOTFS}/opt/opengnsys/* /opt/opengnsys/
295    if [ "$ogprotocol" == "local" ]; then
296        # Creamos los subdirectorios de /opt/opengnsys/
297        [ "$ogstatus" == "offline" ] && ln -s ${OGLIVEROOTFS}/opt/opengnsys/* /opt/opengnsys/
298        # Montamos CACHE
299        # Si existe particion identificada como CACHE se monta.
300        DEVICECACHE=$(blkid -L "CACHE")
301        echo "DEVICECACHE ($DEVICECACHE)" >>/tmp/oginit.log
302        if [ "$DEVICECACHE" != "" ]; then
303            # Se monta diferente segun el dispositivo de cache igual o no al de ogclient.
304            DEVICEOGLIVE=$(df |grep $DSTOGLIVE|awk '{print $1}')
305            echo "DEVICEOGLIVE ($DEVICEOGLIVE)" >>/tmp/oginit.log
306            if [[ "$DEVICECACHE" == "*$DEVICEOGLIVE*" ]];then
307                echo "running 'mount --bind $DSTOGLIVE /opt/opengnsys/cache'" >>/tmp/oginit.log
308                mount --bind $DSTOGLIVE /opt/opengnsys/cache
309            else
310                echo "running 'mount $DEVICECACHE /opt/opengnsys/cache'" >>/tmp/oginit.log
311                mount $DEVICECACHE /opt/opengnsys/cache
312            fi
313            if [ "$ogstatus" == "offline" ]; then
314                [ -d /opt/opengnsys/cache/log ] || mkdir /opt/opengnsys/cache/log
315                echo "running 'mount --bind /opt/opengnsys/cache/log /opt/opengnsys/log'" >>/tmp/oginit.log
316                mount --bind /opt/opengnsys/cache/log /opt/opengnsys/log
317            fi
318        fi
319        # Montamos REPO
320        if [ "$ogstatus" == "offline" ]; then
321            # Si estatus distinto de online buscamos un dispositivo con etiqueta repo
322            # y si no existe montamos la cache como repo (si existe).
323            TYPE=$(blkid | grep REPO | awk -F"TYPE=" '{print $2}' | tr -d \")
324            echo "TYPE ($TYPE)" >>/tmp/oginit.log
325            if [ "$TYPE" == "" ]; then
326                if [ -d "/opt/opengnsys/cache$DSTOGIMAGES" ]; then
327                    echo "running 'mount --bind  /opt/opengnsys/cache$DSTOGIMAGES $DSTOGIMAGES'" >>/tmp/oginit.log
328                    mount --bind  /opt/opengnsys/cache$DSTOGIMAGES $DSTOGIMAGES
329                fi
330            else
331                echo "running 'mount -t $TYPE LABEL=REPO $DSTOGIMAGES'" >>/tmp/oginit.log
332                mount -t $TYPE LABEL=REPO $DSTOGIMAGES &>/dev/null
333            fi
334        fi
335    fi
336
337    #Montamos un directorio temporal para permitir instalacion de softare desde el comando apt-get (parametor kernel "ogtmpfs=50" valor en megas
338    ogtmpfs="${ogtmpfs:-15}"
339    #mount tmpfs /var/cache/apt/archives -t tmpfs -o size=${ogtmpfs}M
340    mkdir -p /var/cache/apt/archives/partial
341
342    mkdir -p /run/user/0
343    chmod 700 /run/user/0
344
345    # esto completa la inicializacion de udev y permite el inicio del escritorio grafico
346    /bin/udevadm trigger
347
348    # Memoria compartida -- necesario para browser
349    mkdir -p /dev/shm
350    mount tmpfs -t tmpfs /dev/shm
351    chmod 1777 /dev/shm
352}
353
354
355#/**
356#     ogGetROOTSERVER
357#@brief   Determina los puntos de accesos a los distintos recursos.
358#Requiere ogConfigureNetworking.
359#Exporta ROOTSERVER
360# si la red ha sido configurada con dhcp el valor de ROOTSERVER será el valor de next-server del dhcp
361# si la red ha sido configurada con el parametro de kernel ip, será el segundo valor.
362## ip=iphost:ipnext-server:ipgateway:netmask:hostname:iface:none
363## ip=172.17.36.21:62.36.225.150:172.17.36.254:255.255.255.0:prueba1:eth0:none
364#@param
365#@return
366#@exception OG_ERR_FORMAT    Formato incorrecto.
367#@version 0.9
368#@author Antonio J. Doblas. Universidad de Malaga.
369#@date    2010/05/24
370#*/ ##
371ogGetROOTSERVER ()
372{
373    echo "ogGetROOTSERVER()" >>/tmp/oginit.log
374    echo "NFSROOT ($NFSROOT)" >>/tmp/oginit.log
375    # get nfs root from dhcp
376    if [ "x${NFSROOT}" = "xauto" ]; then
377        # check if server ip is part of dhcp root-path
378        if [ "${ROOTPATH#*:}" = "${ROOTPATH}" ]; then
379            NFSROOT=${ROOTSERVER}:${ROOTPATH}
380        else
381            NFSROOT=${ROOTPATH}
382        fi
383
384    # nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]
385    elif [ -n "${NFSROOT}" ]; then
386        # nfs options are an optional arg
387        if [ "${NFSROOT#*,}" != "${NFSROOT}" ]; then
388            NFSOPTS="-o ${NFSROOT#*,}"
389        fi
390        NFSROOT=${NFSROOT%%,*}
391        if [ "${NFSROOT#*:}" = "$NFSROOT" ]; then
392            NFSROOT=${ROOTSERVER}:${NFSROOT}
393        fi
394    fi
395    echo "NFSROOT now ($NFSROOT)" >>/tmp/oginit.log
396    export ROOTSERVER
397    echo "ROOTSERVER=$ROOTSERVER" >> $CFGINITRD
398    echo "ROOTSERVER ($ROOTSERVER)" >>/tmp/oginit.log
399
400    #si oglive no oglive=R
401    export OGSERVERIMAGES="${ogrepo:-$ROOTSERVER}" && echo "OGSERVERIMAGES=$OGSERVERIMAGES" >> $CFGINITRD
402    export OGSERVERSHARE="${ogshare:-$ROOTSERVER}" && echo "OGSERVERSHARE=$OGSERVERSHARE" >> $CFGINITRD
403    export OGSERVERLOG="${oglog:-$ROOTSERVER}" && echo "OGSERVERLOG=$OGSERVERLOG" >> $CFGINITRD
404    export OGSERVERLIVE="${oglive:-$OGSERVERIMAGES}" && echo "OGSERVERLIVE=$OGSERVERLIVE" >> $CFGINITRD
405    echo "OGSERVERIMAGES ($OGSERVERIMAGES) OGSERVERSHARE ($OGSERVERSHARE) OGSERVERLOG ($OGSERVERLOG) OGSERVERLIVE ($OGSERVERLIVE)" >>/tmp/oginit.log
406
407    return 0
408}
409
410
411
412#       ogUpdateInitrd
413#@brief   Actualiza el initrd de la cache desde el servidor. Si el arranque ha sido desde cache, comprueba desde el servidor nueva version del initird.
414#@param1
415#@return
416#@exception OG_ERR_FORMAT    Formato incorrecto.
417#@version 0.9
418#@author Antonio J. Doblas. Universidad de Malaga.
419#@date    2011/05/24
420#@version 1.1.0 - Permite varios ogLive dentro de subdirectorios
421#@author Irina Gómez. ETSII Universidad de Sevilla
422#@date    2017/04/27
423#@version 1.1.0 - Se permite varios ogLives en la CACHE
424#@author Antonio J. Doblas Viso. Universidad de Malaga
425#@date    2017/05/31
426#*/ ##
427
428ogUpdateInitrd ()
429{
430    echo "ogUpdateInitrd()" >>/tmp/oginit.log
431    local OGLIVEDIR
432    OGLIVEDIR=${oglivedir:-"ogclient"}
433    echo "OGLIVEDIR ($OGLIVEDIR)" >>/tmp/oginit.log
434    cd /tmp
435    mkdir /tmp/cache
436    TYPE=$(blkid -po export $(blkid -L CACHE) 2>/dev/null | awk -F= '$1=="TYPE" { print $2}')
437    echo "TYPE ($TYPE)" >>/tmp/oginit.log
438    # Salir si no se detecta caché.
439    [ -z "$TYPE" ] && return
440    echo "running 'mount -t $TYPE LABEL=CACHE /tmp/cache'" >>/tmp/oginit.log
441    mount -t $TYPE LABEL=CACHE /tmp/cache || return
442    echo "running 'mkdir -p /tmp/cache/boot/$OGLIVEDIR'" >>/tmp/oginit.log
443    mkdir -p /tmp/cache/boot/$OGLIVEDIR
444
445    # comparamos los del server
446    busybox tftp -g -r $OGLIVEDIR/ogvmlinuz.sum $ROOTSERVER
447    busybox tftp -g -r $OGLIVEDIR/oginitrd.img.sum $ROOTSERVER
448    SERVERVMLINUZ=`cat ogvmlinuz.sum`
449    SERVERINITRD=`cat oginitrd.img.sum`
450
451    #comparamos los de la cache
452    CACHEVMLINUZ=`cat /tmp/cache/boot/$OGLIVEDIR/ogvmlinuz.sum`
453    CACHEINITRD=`cat /tmp/cache/boot/$OGLIVEDIR/oginitrd.img.sum`
454
455    echo "MD5 on SERVER: $SERVERVMLINUZ $SERVERINITRD" |tee -a /tmp/oginit.log
456    echo "MD5 on  CACHE: $CACHEVMLINUZ $CACHEINITRD" |tee -a /tmp/oginit.log
457
458    cd /tmp/cache/boot/$OGLIVEDIR || mkdir -p /tmp/cache/boot/$OGLIVEDIR
459
460    if [ "$CACHEVMLINUZ" != "$SERVERVMLINUZ" ]; then
461        echo "ogvmlinuz updating" |tee -a /tmp/oginit.log
462        busybox tftp -g -r $OGLIVEDIR/ogvmlinuz $ROOTSERVER
463        busybox tftp -g -r $OGLIVEDIR/ogvmlinuz.sum $ROOTSERVER
464        DOREBOOT=true
465    fi
466    if [ "$CACHEINITRD" != "$SERVERINITRD" ]; then
467        echo "oginitrd updating" |tee -a /tmp/oginit.log
468        busybox tftp -g -r $OGLIVEDIR/oginitrd.img $ROOTSERVER
469        busybox tftp -g -r $OGLIVEDIR/oginitrd.img.sum $ROOTSERVER
470        DOREBOOT=true
471    fi
472
473    cd /; umount /tmp/cache
474    [ "$DOREBOOT" == "true" ] && reboot -f
475
476}
477
478#/**
479#       ogConnect
480#@brief   Conecta con los recursos necesarios para opengnsys
481#@param1 ip del servidor TODO:dns
482#@param2 protocolo
483#@param3 punto de acceso remoto
484#@param4  punto de montaje local
485#@param5 acceso de lectura tipo ",ro"
486#@return
487#@exception OG_ERR_FORMAT    Formato incorrecto.
488#@version 0.9
489#@author Antonio J. Doblas. Universidad de Malaga.
490#@date    2011/05/24
491#*/ ##
492
493ogConnect ()
494{
495    echo "ogConnect()" >>/tmp/oginit.log
496    SERVER=$1
497    PROTOCOL=$2
498    SRC=$3
499    DST=$4
500    READONLY=$5
501    echo "SERVER ($SERVER) PROTOCOL ($PROTOCOL) SRC ($SRC) DST ($DST) READONLY ($READONLY)" >>/tmp/oginit.log
502    OPTIONS_LOG_SAFE=$(echo "$OPTIONS" |sed -e 's/pass=.*/pass=***/')
503
504    case "$PROTOCOL" in
505        nfs)
506            echo "running 'nfsmount  ${SERVER}:${SRC} ${DST} -o nolock${READONLY} || mount.nfs ${SERVER}:${SRC} ${DST} -o nolock${READONLY}'" >>/tmp/oginit.log
507            nfsmount  ${SERVER}:${SRC} ${DST} -o nolock${READONLY} 2> /dev/null || mount.nfs ${SERVER}:${SRC} ${DST} -o nolock${READONLY}
508        ;;
509        smb)
510            echo "running 'mount.cifs //${SERVER}/${SRC} ${DST} ${OPTIONS_LOG_SAFE}${READONLY}'" >>/tmp/oginit.log
511            mount.cifs //${SERVER}/${SRC} ${DST} ${OPTIONS}${READONLY}
512        ;;
513        local)
514            # Comprobamos que estatus sea online y que la variable del server no esta vacia.
515            echo "ogstatus ($ogstatus) SERVER ($SERVER) SRC ($SRC)" >>/tmp/oginit.log
516            if [ "$ogstatus" != "offline" -a "$SERVER" != "" -a "$SRC" != "" ]; then
517                # Comprobamos que existe un servicio de samba.
518                echo "running 'smbclient -L $SERVER -N'" >>/tmp/oginit.log
519                smbclient -L $SERVER -N &>/dev/null
520                if [ $? -eq 0 ]; then
521                    echo "running 'mount.cifs //${SERVER}/og${SRC} ${DST} ${OPTIONS_LOG_SAFE}${READONLY}'" >>/tmp/oginit.log
522                    mount.cifs //${SERVER}/og${SRC} ${DST} ${OPTIONS}${READONLY}
523                fi
524                # TODO: buscar condicion para NFS
525            fi
526        ;;
527        *)
528            return 1
529        ;;
530    esac
531    return $?
532}
533
534
535#/**
536#       ogConnectOgLive
537#@brief   Conecta con el recurso para usar el sistema raiz externo, remoto o local
538#@param1
539#@return
540#@exception OG_ERR_FORMAT    Formato incorrecto.
541#@version 0.9
542#@author Antonio J. Doblas. Universidad de Malaga.
543#@date    2011/05/24
544ogConnectOgLive ()
545{
546    echo "ogConnectOgLive()" >>/tmp/oginit.log
547    echo "SRCOGLIVE ($SRCOGLIVE)" >>/tmp/oginit.log
548# Si ogprotocol=local, la funcion ogExportVar => SRCOGLIVE=local
549    if [ "$SRCOGLIVE" == "local" ]; then
550        echo  "Montar imagen del sistema root desde dispositivo local" |tee -a /tmp/oginit.log
551        for i in $(blkid /dev/s* | grep $OGLIVELABEL  | awk -F: '{print $2}' | tr -d \"); do
552            echo "export $i" >>/tmp/oginit.log
553            export $i
554        done
555        # si local usb| cd con partcion es identificada como label $OGLIVELABEL
556        echo "running 'mount -t $TYPE LABEL=$OGLIVELABEL $DSTOGLIVE'" >>/tmp/oginit.log
557        mount -t $TYPE LABEL=$OGLIVELABEL $DSTOGLIVE
558        if [ $? != 0 ]; then
559            # Si local es particion CACHE es identificada como CACHE
560            echo "mount failed, running 'mount LABEL=CACHE $DSTOGLIVE'" >>/tmp/oginit.log
561            mount LABEL=CACHE $DSTOGLIVE
562            #export LOCALMEDIA=CACHE
563        fi
564    else
565        # Si ogprotocol es remoto.    TODO en smb rw y en nfs ro??
566        echo "running 'ogConnect $OGSERVERLIVE $OGPROTOCOL $SRCOGLIVE $DSTOGLIVE'" >>/tmp/oginit.log
567        ogConnect $OGSERVERLIVE $OGPROTOCOL $SRCOGLIVE $DSTOGLIVE
568    fi
569# Si el montaje ha sido correcto, tanto en local como en remoto. Procedemos con la union
570    ogMergeLive
571}
572
573
574#/**
575#       ogMergeLive
576#@brief   Metafuncion para fusionar el initrd con el sistema raiz.
577#@param1
578#@return
579#@exception OG_ERR_FORMAT    Formato incorrecto.
580#@version 0.9
581#@author Antonio J. Doblas. Universidad de Malaga.
582#@date    2011/05/24
583ogMergeLive()
584{
585echo "ogMergeLive()" >>/tmp/oginit.log
586#Si existe en el punto de acceso del del oglive el fichero ogclient.sqfs
587if [ ! -d $DSTOGLIVE/$OGLIVEDIR ]; then
588    echo "Usando ogLive por defecto."
589    export OGLIVEDIR=$DEFOGLIVE
590fi
591echo "OGLIVEDIR ($OGLIVEDIR) og2nd ($og2nd)" >>/tmp/oginit.log
592if [ -f $DSTOGLIVE/$OGLIVEDIR/ogclient.sqfs ]; then
593    cat /proc/mounts > /tmp/mtab.preunion
594    if [ "$og2nd" == "img" ]; then
595        #Montamos el ROOTFS tipo  img, para desarrolladores
596        #TODO: comprobar que se tiene acceso de escritura
597        echo "running 'losetup /dev/loop0 $DSTOGLIVE/$OGLIVEDIR/ogclient.img -o 32256'" >>/tmp/oginit.log
598        losetup /dev/loop0 $DSTOGLIVE/$OGLIVEDIR/ogclient.img -o 32256
599        echo "running 'mount /dev/loop0 $OGLIVEROOTFS'" >>/tmp/oginit.log
600        mount /dev/loop0 $OGLIVEROOTFS
601    else
602        ## Montamos el ROOTFS tipo squashfs
603        echo "running 'mount $DSTOGLIVE/$OGLIVEDIR/ogclient.sqfs $OGLIVEROOTFS -t squashfs -o loop'" >>/tmp/oginit.log
604        mount $DSTOGLIVE/$OGLIVEDIR/ogclient.sqfs $OGLIVEROOTFS -t squashfs -o loop
605    fi
606# Realizamos la union entre el ogliveram(initrd) y el ogliverootfs(ogclient.sqfs)
607# Nota: el orden es muy importante para evitar errores de montaje.
608    [ -d $OGLIVEROOTFS/lib32 ] && LIBS=lib32
609    echo "LIBS ($LIBS)" >>/tmp/oginit.log
610    for i in bin sbin lib $LIBS etc var usr root boot; do
611        echo "ogUnionLiveDir $i" >>/tmp/oginit.log
612        ogUnionLiveDir $i
613    done
614    [ -L /etc/mtab ] || cat /tmp/mtab.preunion > /etc/mtab
615else
616    echo "Fichero imagen del cliente no encontrado" |tee -a /tmp/oginit.log
617    return 1
618fi
619}
620
621
622
623#/**
624#       ogUnionLiveDir
625#@brief  fusiona dos directorios con unionfs
626#@param1
627#@return
628#@exception OG_ERR_FORMAT    Formato incorrecto.
629#@version 0.9
630#@author Antonio J. Doblas. Universidad de Malaga.
631#@date    2011/05/24
632ogUnionLiveDir()
633{
634    echo "ogUnionLiveDir()" >>/tmp/oginit.log
635    TMPDIR=/$1        #dir
636    FUSE_OPT="-o default_permissions -o allow_other -o use_ino -o nonempty -o suid"
637    UNION_OPT="-o cow -o noinitgroups"
638    UBIN="unionfs-fuse"
639    echo "TMPDIR ($TMPDIR) FUSE_OPT ($FUSE_OPT) UNION_OPT ($UNION_OPT) UBIN ($UBIN)" >>/tmp/oginit.log
640
641    mkdir -p $OGLIVERAMFS$TMPDIR
642    U1STDIR="${OGLIVERAMFS}${TMPDIR}=RW"
643    U2NDDIR="${OGLIVEROOTFS}${TMPDIR}=RO"
644    UNIONDIR=${OGLIVEUNIONFS}${TMPDIR}
645    ulimit -n 4096
646    mkdir -p $UNIONDIR $TMPDIR
647    echo "running '$UBIN $FUSE_OPT $UNION_OPT ${U1STDIR}:${U2NDDIR} $UNIONDIR'" >>/tmp/oginit.log
648    $UBIN $FUSE_OPT $UNION_OPT ${U1STDIR}:${U2NDDIR} $UNIONDIR
649    echo "running 'mount --bind  $UNIONDIR $TMPDIR'" >>/tmp/oginit.log
650    mount --bind  $UNIONDIR $TMPDIR
651}
652
653
654
655#/**
656#     ogConfigureLoopback
657#@brief   Configura la interfaz loopback para cliente torrent
658#@param
659#@return
660#@exception OG_ERR_FORMAT    Formato incorrecto.
661#@version 0.9   Usando funciones generales de ubuntu
662#@author Antonio J. Doblas. Universidad de Malaga.
663#@date    2010/05/24
664#@version 1.0.1   Deteccion automatica de interfaz con enlace activo.
665#@author Antonio J. Doblas. Universidad de Malaga.
666#@date    2011/05/24
667#*/ ##
668ogConfigureLoopback()
669{
670    echo "ogConfigureLoopback()" >>/tmp/oginit.log
671    # for the portmapper we need localhost
672    ifconfig lo 127.0.0.1
673    #/etc/init.d/portmap start
674}
675
676#/**
677#    ogConfigureNetworking
678#@brief   Configura la interfaz de red usada en el pxe
679#@param
680#@return
681#@exception OG_ERR_FORMAT    Formato incorrecto.
682#@version 0.9
683#@author Antonio J. Doblas. Universidad de Malaga.
684#@date    2010/05/24
685#*/ ##
686ogConfigureNetworking()
687{
688    echo "ogConfigureNetworking()" >>/tmp/oginit.log
689echo "ogConfigureNetworking: Buscando interfaz a configurar DEVICE" >>/tmp/oginit.log
690if [ -n "${BOOTIF}" ]; then
691    echo " variable BOOTIF exportada con pxelinux.0 con valor ($BOOTIF)" >>/tmp/oginit.log
692    IP=$IPOPTS
693    temp_mac=${BOOTIF#*-}
694    # convert to typical mac address format by replacing "-" with ":"
695    bootif_mac=""
696    IFS='-'
697    for x in $temp_mac ; do
698        if [ -z "$bootif_mac" ]; then
699        bootif_mac="$x"
700        else
701            bootif_mac="$x:$bootif_mac"
702        fi
703    done
704    unset IFS
705    echo "IP ($IP) bootif_mac ($bootif_mac)" >>/tmp/oginit.log
706    # look for devices with matching mac address, and set DEVICE to appropriate value if match is found.
707    for device in /sys/class/net/* ; do
708        if [ -f "$device/address" ]; then
709            current_mac=$(cat "$device/address")
710            if [ "$bootif_mac" = "$current_mac" ]; then
711                DEVICE=${device##*/}
712                echo "current_mac ($current_mac) of device ($device) equals bootif_mac ($bootif_mac), setting DEVICE to ($DEVICE)" >>/tmp/oginit.log
713                break
714            fi
715        fi
716    done
717else
718    echo "variable BOOTIF no exportada, intentamos detectar que interfaz se ha iniciado" >>/tmp/oginit.log
719    IP=$ip
720    echo "IP ($IP)" >>/tmp/oginit.log
721    #TODO Detectar que interfaz se ha iniciado
722    case "$IP" in
723        none|off)
724            return 0
725            ;;
726        ""|on|any)
727            # Bring up device
728            DEVICE=1
729            ;;
730        dhcp|bootp|rarp|both)
731            DEVICE=1
732            ;;
733        *)
734            DEVICE=`echo $IP | cut -f6 -d:`
735            ;;
736    esac
737    echo "DEVICE ($DEVICE)" >>/tmp/oginit.log
738fi
739DEVICE=$(ogGetNetworkDevice $DEVICE)
740echo "DEVICE now ($DEVICE)" >>/tmp/oginit.log
741if [ -z "${DEVICE}" ]; then
742    echo "variable DEVICE con valor $DEVICE no encontrada, llamamos de nuevo a ogconfigure_networking" |tee -a /tmp/oginit.log
743    ogConfigureNetworking
744fi
745
746[ -n "${DEVICE}" ] && [ -e /run/net-"${DEVICE}".conf ] && echo "/run/net-$DEVICE.conf exists" >>/tmp/oginit.log && return 0
747#if [ -n "${DEVICE}" ] && [ -e /run/net-"${DEVICE}".conf ]; then
748#    echo "variable DEVICE con valor $DEVICE  y fichero /run/net-$DEVICE encontrados" |tee -a /tmp/oginit.log
749#    return 0
750#else
751#    echo "variable DEVICE con valor $DEVICE encontrada, procedemos a configurala y a crear el fichero /run/net-$DEVICE" |tee -a /tmp/oginit.log
752#fi
753
754# Activamos la interfaz antes de configurar.
755echo "running 'ip address flush $DEVICE'" >>/tmp/oginit.log
756ip address flush $DEVICE
757echo "running 'ip link set dev $DEVICE up'" >>/tmp/oginit.log
758ip link set dev $DEVICE up
759
760# Si no se detecta señal portadora volver a configurar.
761sleep 1
762CARRIER=$(cat /sys/class/net/${DEVICE}/carrier)
763echo "CARRIER ($CARRIER)" >>/tmp/oginit.log
764if [ "$CARRIER" != "1" ]; then
765    ogConfigureNetworking
766fi
767
768# support ip options see linux sources
769# Documentation/filesystems/nfsroot.txt
770# Documentation/frv/booting.txt
771for ROUNDTTT in 2 3 4 6 9 16 25 36 64 100; do
772    echo "ROUNDTTT ($ROUNDTTT)" >>/tmp/oginit.log
773    # The NIC is to be configured if this file does not exist.
774    # Ip-Config tries to create this file and when it succeds creating the file, ipconfig is not run again.
775    if [ -e /run/net-"${DEVICE}".conf ]; then
776        echo "/run/net-$DEVICE.conf exists" >>/tmp/oginit.log
777        break;
778    fi
779    echo "IP ($IP)" >>/tmp/oginit.log
780    case "$IP" in
781        none|off)
782            return 0
783        ;;
784        ""|on|any)
785            # Bring up device
786            echo "Setting $DEVICE  with option:on|any and Variable IP= $IP: ipconfig -t ${ROUNDTTT} ${DEVICE} " |tee -a /tmp/oginit.log
787            ipconfig -t ${ROUNDTTT} ${DEVICE}
788        ;;
789        dhcp|bootp|rarp|both)
790            echo "Setting $DEVICE with option:dhcp|bootp|rarp|both and Variable IP=  $IP: ipconfig -t ${ROUNDTTT} -c ${IP} -d ${DEVICE} " |tee -a /tmp/oginit.log
791            ipconfig -t ${ROUNDTTT} -c ${IP} -d ${DEVICE}
792        ;;
793        *)
794            echo "Setting $DEVICE with option *  and Variable IP= $IP: ipconfig -t ${ROUNDTTT} -d $IP  " |tee -a /tmp/oginit.log
795            ipconfig -t ${ROUNDTTT} -d $IP
796            # grab device entry from ip option
797            NEW_DEVICE=${IP#*:*:*:*:*:*}
798            if [ "${NEW_DEVICE}" != "${IP}" ]; then
799                NEW_DEVICE=${NEW_DEVICE%:*}
800            else
801                # wrong parse, possibly only a partial string
802                NEW_DEVICE=
803            fi
804            echo "NEW_DEVICE ($NEW_DEVICE)" >>/tmp/oginit.log
805            if [ -n "${NEW_DEVICE}" ]; then
806                DEVICE="${NEW_DEVICE}"
807            fi
808        ;;
809    esac
810done
811
812# source ipconfig output
813echo "DEVICE ($DEVICE)" >>/tmp/oginit.log
814if [ -n "${DEVICE}" ]; then
815    export DEVICE
816    export DEVICECFG="/run/net-${DEVICE}.conf"
817    # En algunos casos, el fichero de configuración está en /tmp.
818    [ ! -f $DEVICECFG -a -f ${DEVICECFG/run/tmp} ] && mv ${DEVICECFG/run/tmp} $DEVICECFG
819    echo "source'ing DEVICECFG ($DEVICECFG)" >>/tmp/oginit.log
820    source $DEVICECFG
821    echo "DEVICE=$DEVICE" >> $CFGINITRD
822    echo "DEVICECFG=$DEVICECFG" >> $CFGINITRD
823    echo "exportando variable DEVICE con valor = ($DEVICE) y DEVICECFG con valor ($DEVICECFG)"
824    # Compatibilidad con versiones anteriores.
825    ln -fs $DEVICECFG /tmp
826else
827    # source any interface as not exaclty specified
828    NET_STAR=/run/net-*.conf
829    echo "source'ing ($NET_STAR)" >>/tmp/oginit.log
830    source /run/net-*.conf
831fi
832}
833
834
835#/**
836#    ogYesNo
837#@brief   Gestion de peticiones de usuario en modo ogdebug=true
838#@param1  OPTIONS    --timeout N    --default ANSWER
839#@param1 Questions
840#@return  1=yes 0=no
841#@exception OG_ERR_FORMAT    Formato incorrecto.
842#@version 0.9
843#@author:
844#@date    2010/05/24
845#*/ ##
846ogYesNo()
847{
848    echo "ogYesNo()" >>/tmp/oginit.log
849    local ans
850    local ok=0
851    local timeout=0
852    local default
853    local t
854
855    while [[ "$1" ]]
856    do
857        case "$1" in
858        --default)
859            shift
860            default=$1
861            if [[ ! "$default" ]]; then error "Missing default value"; fi
862            t=$(echo $default | tr '[:upper:]' '[:lower:]')
863
864            if [[ "$t" != 'y'  &&  "$t" != 'yes'  &&  "$t" != 'n'  &&  "$t" != 'no' ]]; then
865                error "Illegal default answer: $default"
866            fi
867            default=$t
868            shift
869            ;;
870
871        --timeout)
872            shift
873            timeout=$1
874            if [[ ! "$timeout" ]]; then error "Missing timeout value"; fi
875            #if [[ ! "$timeout" =~ ^[0-9][0-9]*$ ]]; then error "Illegal timeout value: $timeout"; fi
876            shift
877            ;;
878
879        -*)
880            error "Unrecognized option: $1"
881            ;;
882
883        *)
884            break
885            ;;
886        esac
887    done
888
889    if [[ $timeout -ne 0  &&  ! "$default" ]]; then
890        error "Non-zero timeout requires a default answer"
891    fi
892
893    if [[ ! "$*" ]]; then error "Missing question"; fi
894
895    while [[ $ok -eq 0 ]]
896    do
897        if [[ $timeout -ne 0 ]]; then
898            if ! read -t $timeout -p "$*" ans; then
899                ans=$default
900            else
901                # Turn off timeout if answer entered.
902                timeout=0
903                if [[ ! "$ans" ]]; then ans=$default; fi
904            fi
905        else
906            read -p "$*" ans
907            if [[ ! "$ans" ]]; then
908                ans=$default
909            else
910                ans=$(echo $ans | tr '[:upper:]' '[:lower:]')
911            fi
912        fi
913
914        if [[ "$ans" == 'y'  ||  "$ans" == 'yes'  ||  "$ans" == 'n'  ||  "$ans" == 'no' ]]; then
915            ok=1
916        fi
917
918        if [[ $ok -eq 0 ]]; then warning "Valid answers are: yes y no n"; fi
919    done
920    [[ "$ans" = "y" || "$ans" == "yes" ]]
921}
922
Note: See TracBrowser for help on using the repository browser.