source: client/boot-tools/clientstructure/etc/initramfs-tools/scripts/ogfunctions @ 634c5ec

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 634c5ec was 9ff7b49, checked in by adv <adv@…>, 14 years ago

version 1.0.2 #404 boot-tools no configura la interfaz de red, hasta que la señal portadora ethernet sea detectada.

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

  • Property mode set to 100644
File size: 13.7 KB
Line 
1#@file    ogfunctions.lib
2#@brief   Librería o clase para la generación del 1erFS
3#@class   client
4#@brief   Funciones para la generación del primers sistema (initrd)
5#@version 0.91
6#@warning License: GNU GPLv3+
7
8
9
10
11ogExportKernelParameters ()
12{
13        GLOBAL="cat /proc/cmdline"
14        for i in `${GLOBAL}`
15        do
16                echo $i | grep "=" > /dev/null && export $i
17        done
18return 0
19}
20
21ogExportVarEnvironment ()
22{
23        export CFGINITRD="/tmp/initrd.cfg"
24        echo "puntos de accesos al servidor ogprotocol=nfs" >> $CFGINITRD
25        export NFSROOTBOOT="/var/lib/tftpboot" && echo "NFSROOTBOOT=$NFSROOTBOOT" >> $CFGINITRD
26        export NFSCLIENTDIR="/opt/opengnsys/client" && echo "NFSCLIENDIR=$NFSCLIENTDIR" >> $CFGINITRD   
27        export NFSLOGDIR="/opt/opengnsys/log/clients" && echo "NFSLOGDIR=$NFSLOGDIR" >> $CFGINITRD     
28        export NFSIMGDIR="/opt/opengnsys/images" && echo "NFSIMGDIR=$NFSIMGDIR" >> $CFGINITRD   
29        echo "puntos de accesos al servidor ogprotocol=smb" >> $CFGINITRD
30        export SMBROOTBOOT="tftpboot"  && echo "SMBROOTBOOT=$SMBROOTBOOT" >> $CFGINITRD
31        export SMBCLIENTDIR="ogclient" && echo "SMBCLIENTDIR=$SMBCLIENTDIR" >> $CFGINITRD
32        export SMBLOGDIR="oglog" && echo "SMBLOGDIR=$SMBLOGDIR" >> $CFGINITRD
33        export SMBIMGDIR="ogimages" && echo "SMBIMGDIR=$SMBIMGDIR" >> $CFGINITRD
34
35        echo "puntos de montaje local para los contenedores" >> $CFGINITRD
36        export LOCALROOTBOOT="/opt/og2fs/tftpboot"      && echo "LOCALROOTBOOT=$LOCALROOTBOOT" >> $CFGINITRD
37        export LOCALCLIENTDIR="/opt/opengnsys" && echo "LOCALCLIENTDIR=$LOCALCLIENTDIR" >> $CFGINITRD           
38        export LOCALLOGDIR="/opt/opengnsys/log" && echo "LOCALLOGDIR=$LOCALLOGDIR" >> $CFGINITRD
39        export LOCALIMGDIR="/opt/opengnsys/images" && echo "LOCALIMGDIR=$LOCALIMGDIR" >> $CFGINITRD
40       
41        echo "puntos de montajes para realizar la integración unionfs entre el initrd y el sistema root" >> $CFGINITRD
42        #punto de montaje donde se accede al 2nd FS mediante loop
43        export LOCALROOTIMG="/opt/og2fs/2ndfs"  && echo "LOCALROOTIMG=$LOCALROOTIMG" >> $CFGINITRD             
44        #punto de montaje para unionfs
45        export LOCALROOTRAM="/opt/og2fs/1stfs" && echo "LOCALROOTRAM=$LOCALROOTRAM" >> $CFGINITRD                               
46        #punto de union entreo LOCALROOTIMG y LOCALROOTRAM
47        export LOCALROOTUNION="/opt/og2fs/unionfs" && echo "LOCALROOTUNION=$LOCALROOTUNION" >> $CFGINITRD                       
48        ##INFORMACION DE OTRAS VARIABLES OBTENDIAS EN OTRAS FUNCIONES.
49        #ogGetROOTSERVER()  ip del servidor pxe, valor obtenido automaticamente desde dhcpd.
50        #IPV4DDR
51        #IPV4BROADCAST
52        #IPV4NETMASK
53        #IPV4GATEWAY
54        #DNS0   DNS1
55        #HOSTNAME
56        #ROOTSERVER  #ip del servidor pxe que ha servido el kernel
57        #REPOSERVER=ogrepo  -> ogConectROOTSERVER() ip del servidor de images para separar serviicios.
58        return 0
59}
60
61ogConfigureRamfs ()
62{
63        mkdir -p $LOCALROOTBOOT
64        mkdir -p $LOCALROOTIMG
65        mkdir -p $LOCALROOTRAM                           
66        mkdir -p $LOCALROOTUNION
67}
68
69ogLoadNetModule ()
70{
71        #cargando netmodule
72        if [ -n "$ognetmodule" ]
73        then
74                echo "Cargando modulo de red $netmodule"
75                insmod `find /lib/modules/ -name ${netmodule}*`
76        fi
77}
78
79
80ogPostConfigureFS()
81{
82        # configuramos el /etc/hostname.
83        echo $HOSTNAME > /etc/hostname
84       
85        #configuramos el /etc/hosts
86        echo "127.0.0.1 localhost" > /etc/hosts
87        echo "$IPV4ADDR $HOSTNAME" >> /etc/hosts
88       
89        #configuramos el host.conf
90        echo "order hosts,bind" > /etc/host.conf
91        echo "multi on" >> /etc/host.conf
92       
93        # configuramos el /etc/networks
94        #read -e NETIP NETDEFAULT <<<$(route -n | grep eth0 | awk -F" " '{print $1}')
95        NETIP=$(route -n | grep eth0 | awk -F" " '{print $1}') && NETIP=$(echo $NETIP | cut -f1 -d" ")
96        echo "default 0.0.0.0" > /etc/networks
97        echo "loopback 127.0.0.0" >> /etc/networks
98        echo "link-local 169.254.0.0" >> /etc/networks
99        echo "localnet $NETIP" >> /etc/networks
100        #route
101
102        #enlace si iniciamos desde ogprotocolo=local { cdrom, usb, cache } .
103    # monta el raiz del dispositivo local en /opt/og2fs/tftpboot  - acceso al fichero .sqfs
104    # y monta el sistema root sqfs en /opt/og2fs/2ndfs
105        [ "$LOCALMEDIA" == "CACHE" ] && ln -s /opt/og2fs/tftpboot /opt/opengnsys/cache
106        [ "$ogprotocol" == "local" ] &&  ln -s /opt/og2fs/2ndfs/opt/opengnsys/* /opt/opengnsys/
107
108
109}
110
111
112
113
114ogGetROOTSERVER ()
115{
116        # get nfs root from dhcp
117        if [ "x${NFSROOT}" = "xauto" ]; then
118                # check if server ip is part of dhcp root-path
119                if [ "${ROOTPATH#*:}" = "${ROOTPATH}" ]; then
120                        NFSROOT=${ROOTSERVER}:${ROOTPATH}
121                else
122                        NFSROOT=${ROOTPATH}
123                fi
124
125        # nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]
126        elif [ -n "${NFSROOT}" ]; then
127                # nfs options are an optional arg
128                if [ "${NFSROOT#*,}" != "${NFSROOT}" ]; then
129                        NFSOPTS="-o ${NFSROOT#*,}"
130                fi
131                NFSROOT=${NFSROOT%%,*}
132                if [ "${NFSROOT#*:}" = "$NFSROOT" ]; then
133                        NFSROOT=${ROOTSERVER}:${NFSROOT}
134                fi
135        fi
136        export ROOTSERVER
137        echo "ROOTSERVER=$ROOTSERVER" >> $CFGINITRD
138return 0
139}       
140
141ogConectROOTSERVER ()
142{
143local OPTIONS
144#params a detectar
145if [ $ogrepo ]
146then
147        # Validar si la ip es correcta
148        ROOTREPO=$ogrepo
149else
150        ROOTREPO=$ROOTSERVER
151fi
152
153case "$ogprotocol" in
154        local)
155                echo  "Montar imagen del sistema root desde dispositivo local"
156                for i in $(blkid /dev/s* | grep ogClient | awk -F: '{print $2}' | tr -d \"); do export $i; done
157                mount -t $TYPE LABEL=$LABEL $LOCALROOTBOOT
158                if [ $? != 0 ]
159                then
160                        mount -t reiserfs LABEL=CACHE $LOCALROOTBOOT
161                        export LOCALMEDIA=CACHE
162                fi
163                ;;   
164        httfs)
165                echo "protocolo httfs aun no soportado"
166                ;;
167        sshfs)
168                echo "protocolo sshfs aun no soportado"
169                ;;
170        smb)   
171                echo "Preparando conexión con el Repositorio $ROOTSERVER por $ogprotocol"
172                OPTIONS=" -o user=opengnsys,pass=og"
173                mount.cifs //${ROOTSERVER}/${SMBCLIENTDIR} $LOCALCLIENTDIR $OPTIONS
174                mount.cifs //${ROOTSERVER}/${SMBLOGDIR} $LOCALLOGDIR $OPTIONS
175                mount.cifs //${ROOTSERVER}/${SMBROOTBOOT} $LOCALROOTBOOT $OPTIONS
176                mount.cifs //${ROOTREPO}/${SMBIMGDIR} $LOCALIMGDIR ${OPTIONS},ro
177                ;;
178        nfs)
179                echo "Preparando conexión con el Repositorio $ROOTSERVER por $ogprotocol"
180                nfsmount -o nolock,ro $ROOTSERVER:$NFSCLIENTDIR $LOCALCLIENTDIR
181                nfsmount -o nolock $ROOTSERVER:$NFSLOGDIR $LOCALLOGDIR
182                nfsmount -o nolock $ROOTSERVER:$NFSROOTBOOT $LOCALROOTBOOT
183                nfsmount -o nolock,ro $ROOTREPO:$NFSIMGDIR $LOCALIMGDIR
184                ;;
185esac
186}
187
188ogMerge2ndFile()
189{
190if [ -f $LOCALROOTBOOT/ogclient/ogclient.sqfs ]
191then   
192        cat /proc/mounts > /tmp/mtab.preunion
193        if [ "$og2nd" == "img" ]
194        then
195                #para acceder al img
196                losetup /dev/loop0 $LOCALROOTBOOT/ogclient/ogclient.img -o 32256
197                mount /dev/loop0 $LOCALROOTIMG
198        else
199                ## para acceder al squashfs
200                mount $LOCALROOTBOOT/ogclient/ogclient.sqfs $LOCALROOTIMG -t squashfs -o loop
201        fi
202        for i in etc var lib bin sbin usr root boot; do
203                unionmount $i
204        done
205        cat /tmp/mtab.preunion > /etc/mtab
206else
207        echo "Fichero imagen del cliente no encontrado"
208        return 1
209fi
210}
211
212
213unionmount()
214{
215        tmpdir=/$1              #dir
216        FUSE_OPT="-o default_permissions -o allow_other -o use_ino -o nonempty -o suid"
217        UNION_OPT="-o cow -o noinitgroups"
218        UBIN="unionfs-fuse"
219                                        #UPATH="/unionfs"
220                                        #LOCALROOTIMG="/opt/og2fs/2ndfs"       
221                                        #LOCALROOTRAM="/opt/og2fs/1stfs"                #/unionfs/host  #punto de montaje para unionfs
222                                        #LOCALROOTUNION=/opt/og2fs/unionfs/"    #/unionfs/union #punto de union entreo LOCALROOTIMG y LOCALROOTRAM
223                                        #mkdir -p $LOCALROOTRAM                          #/unionfs/host
224                                        #mkdir -p $LOCALROOTUNION                         #/unionfs/union
225        mkdir -p $LOCALROOTRAM$tmpdir
226        #mount --bind /$tmpdir $LOCALROOTRAM$tmpdir
227        U1STDIR="${LOCALROOTRAM}${tmpdir}=RW"
228        U2NDDIR="${LOCALROOTIMG}${tmpdir}=RO"
229        UNIONDIR=$LOCALROOTUNION$tmpdir
230        mkdir -p $UNIONDIR
231        $UBIN $FUSE_OPT $UNION_OPT ${U1STDIR}:${U2NDDIR} $UNIONDIR
232        mount --bind  $UNIONDIR $tmpdir
233}
234
235
236unionmountOLD()
237{
238        FUSE_OPT="-o default_permissions -o allow_other -o use_ino -o nonempty -o suid"
239        UNION_OPT="-o cow -o noinitgroups"
240        UPATH="/unionfs"
241        UBIN="unionfs-fuse"
242        mkdir -p /unionfs/host
243        mkdir -p /unionfs/union
244        dir=$1
245        mkdir -p /unionfs/host/$dir
246        #mount --bind /$dir /unionfs/host/$dir
247        mkdir -p /unionfs/union/$dir
248        host="/unionfs/host/${dir}=RW"
249        common="/opt/og2fs/${dir}=RO"
250        $UBIN $FUSE_OPT $UNION_OPT ${host}:${common} /unionfs/union/$dir
251        mount --bind  /unionfs/union/$dir /$dir
252}
253
254ogconfigure_lo()
255{
256# for the portmapper we need localhost
257ifconfig lo 127.0.0.1
258#/etc/init.d/portmap start
259}
260
261ogconfigure_networking()
262{
263#echo "ogconfigure_networking: Buscando interfaz a configurar DEVICE"
264if [ -n "${BOOTIF}" ]
265then
266        #echo " variable BOOTIF exportada con pxelinux.0 con valor $BOOTIF"
267        IP=$IPOPTS
268        temp_mac=${BOOTIF#*-}
269        # convert to typical mac address format by replacing "-" with ":"
270        bootif_mac=""
271        IFS='-'
272        for x in $temp_mac ; do
273                if [ -z "$bootif_mac" ]; then
274        bootif_mac="$x"
275        else
276                bootif_mac="$x:$bootif_mac"
277        fi
278        done
279        unset IFS
280        # look for devices with matching mac address, and set DEVICE to
281        # appropriate value if match is found.
282        for device in /sys/class/net/* ; do
283                if [ -f "$device/address" ]; then
284                        current_mac=$(cat "$device/address")
285                        if [ "$bootif_mac" = "$current_mac" ]; then
286                                DEVICE=${device##*/}
287                                break
288                        fi
289                fi
290        done
291else
292        #echo "variable BOOTIF no exportada, intentamos detectar que interfaz se ha iniciado"
293        IP=$ip
294        #TODO Detectar que interfaz se ha iniciado
295        case ${IP} in
296                none|off)
297           return 0
298        ;;
299        ""|on|any)
300          # Bring up device
301          DEVICE=eth0
302        ;;
303        dhcp|bootp|rarp|both)
304          DEVICE=eth0
305        ;;
306        *)
307          DEVICE=`echo $IP | cut -f6 -d:`
308        ;;
309        esac
310fi
311if [ -z "${DEVICE}" ]; then
312        echo "variable DEVICE con valor $DEVICE no encontrada, llamamos de nuevo a ogconfigure_networking"
313        ogconfigure_networking
314fi
315
316[ -n "${DEVICE}" ] && [ -e /tmp/net-"${DEVICE}".conf ] && return 0
317#if [ -n "${DEVICE}" ] && [ -e /tmp/net-"${DEVICE}".conf ]; then
318#       echo "variable DEVICE con valor $DEVICE  y fichero /tmp/net-$DEVICE encontrados"
319#       return 0
320#else
321#       echo "variable DEVICE con valor $DEVICE encontrada, procedemos a configurala y a crear el fichero /tmp/net-$DEVICE"
322#fi
323
324# Activamos la interfaz antes de configurar.
325ip address flush $DEVICE
326ip link set dev $DEVICE up
327# Si no se detecta señal portadora volver a configurar.
328sleep 1
329CARRIER=$(cat /sys/class/net/${DEVICE}/carrier)
330if [ "$CARRIER" != "1" ]
331then
332        ogconfigure_networking
333fi
334
335# support ip options see linux sources
336# Documentation/filesystems/nfsroot.txt
337# Documentation/frv/booting.txt
338for ROUNDTTT in 2 3 4 6 9 16 25 36 64 100; do
339        # The NIC is to be configured if this file does not exist.
340        # Ip-Config tries to create this file and when it succeds
341        # creating the file, ipconfig is not run again.
342        if [ -e /tmp/net-"${DEVICE}".conf ]; then
343                break;
344        fi
345        case ${IP} in
346                none|off)
347                        return 0
348                ;;
349                ""|on|any)
350                        # Bring up device
351                        echo "Setting $DEVICE  with option:on|any and Variable IP= $IP: ipconfig -t ${ROUNDTTT} ${DEVICE} "
352                        ipconfig -t ${ROUNDTTT} ${DEVICE}
353                ;;
354                dhcp|bootp|rarp|both)
355                        echo "Setting $DEVICE with option:dhcp|bootp|rarp|both and Variable IP=  $IP: ipconfig -t ${ROUNDTTT} -c ${IP} -d ${DEVICE} "
356                        ipconfig -t ${ROUNDTTT} -c ${IP} -d ${DEVICE}
357                ;;
358                *)
359                        echo "Setting $DEVICE with option *  and Variable IP= $IP: ipconfig -t ${ROUNDTTT} -d $IP  "
360                        ipconfig -t ${ROUNDTTT} -d $IP
361                        # grab device entry from ip option
362                        NEW_DEVICE=${IP#*:*:*:*:*:*}
363                        if [ "${NEW_DEVICE}" != "${IP}" ]; then
364                                NEW_DEVICE=${NEW_DEVICE%:*}
365                        else
366                                # wrong parse, possibly only a partial string
367                                NEW_DEVICE=
368                        fi
369                        if [ -n "${NEW_DEVICE}" ]; then
370                                DEVICE="${NEW_DEVICE}"
371                        fi
372                ;;
373        esac
374done
375
376# source ipconfig output
377if [ -n "${DEVICE}" ]; then     
378    . /tmp/net-${DEVICE}.conf
379    DEVICECFG="/tmp/net-${DEVICE}"
380        export DEVICECFG
381        export DEVICE
382        echo "DEVICE=$DEVICE" >> $CFGINITRD
383        echo "DEVICECFG=$DEVICECFG" >> $CFGINITRD
384        echo "exportando variable DEVICE con valor = $DEVICE y el DEVICECFG con valor $DEVICECFG"   
385else
386    # source any interface as not exaclty specified
387    . /tmp/net-*.conf
388fi
389}
390
391   #####################################################################
392# Ask yesno question.
393#
394# Usage: yesno OPTIONS QUESTION
395#
396#   Options:
397#     --timeout N    Timeout if no input seen in N seconds.
398#     --default ANS  Use ANS as the default answer on timeout or
399#                    if an empty answer is provided.
400#
401# Exit status is the answer.  0=yes 1=no
402
403ogYesNo()
404{
405    local ans
406    local ok=0
407    local timeout=0
408    local default
409    local t
410
411    while [[ "$1" ]]
412    do
413        case "$1" in
414        --default)
415            shift
416            default=$1
417            if [[ ! "$default" ]]; then error "Missing default value"; fi
418            t=$(echo $default | tr '[:upper:]' '[:lower:]')
419
420            if [[ "$t" != 'y'  &&  "$t" != 'yes'  &&  "$t" != 'n'  &&  "$t" != 'no' ]]; then
421                error "Illegal default answer: $default"
422            fi
423            default=$t
424            shift
425            ;;
426
427        --timeout)
428            shift
429            timeout=$1
430            if [[ ! "$timeout" ]]; then error "Missing timeout value"; fi
431            #if [[ ! "$timeout" =~ ^[0-9][0-9]*$ ]]; then error "Illegal timeout value: $timeout"; fi
432            shift
433            ;;
434
435        -*)
436            error "Unrecognized option: $1"
437            ;;
438
439        *)
440            break
441            ;;
442        esac
443    done
444
445    if [[ $timeout -ne 0  &&  ! "$default" ]]; then
446        error "Non-zero timeout requires a default answer"
447    fi
448
449    if [[ ! "$*" ]]; then error "Missing question"; fi
450
451    while [[ $ok -eq 0 ]]
452    do
453        if [[ $timeout -ne 0 ]]; then
454            if ! read -t $timeout -p "$*" ans; then
455                ans=$default
456            else
457                # Turn off timeout if answer entered.
458                timeout=0
459                if [[ ! "$ans" ]]; then ans=$default; fi
460            fi
461        else
462            read -p "$*" ans
463            if [[ ! "$ans" ]]; then
464                ans=$default
465            else
466                ans=$(echo $ans | tr '[:upper:]' '[:lower:]')
467            fi
468        fi
469
470        if [[ "$ans" == 'y'  ||  "$ans" == 'yes'  ||  "$ans" == 'n'  ||  "$ans" == 'no' ]]; then
471            ok=1
472        fi
473
474        if [[ $ok -eq 0 ]]; then warning "Valid answers are: yes y no n"; fi
475    done
476    [[ "$ans" = "y" || "$ans" == "yes" ]]
477}
478     
479
Note: See TracBrowser for help on using the repository browser.