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: admin/WebConsole/includes/tftputils.php @ c311ef2f

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 c311ef2f was 3a89d3d, checked in by adv <adv@…>, 8 years ago

#787 Todos los componentes del ogLive se se ofrecen desde el SERVER. Evitamos problemas de sincronismo entre el kernel-initrd y el rootfs

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

  • Property mode set to 100644
File size: 8.5 KB
Line 
1<?php
2/**
3 * @file      tftptools.php
4 * @brief     Utilidades para menejar ficheros de arranque TFTP/PXE.
5 * @version   1.0.5
6 * @copyright GNU Public License v3+
7 */
8
9
10// Ficheros de inclusión.
11include_once("../includes/ctrlacc.php");
12include_once("../clases/AdoPhp.php");
13
14
15/**
16 * @brief    Sustituye espacio por "_" y quita acentos y tildes.
17 * @param    cadena   Cadena a modificar.
18 * @return   string   Cadena modificada.
19 * @versión  1.0.5 - Primera versión, adaptada de NetBoot Avanzado.
20 * @author   
21 * @date     
22*/
23function cleanString ($cadena) {
24        return strtr ($cadena, " áéíóúñçÁÉÍÓÚÑÇ", "_aeiouncAEIOUNC");
25}
26
27
28/**
29 * Función que obtiene la versión del Kernel del cliente que se ejecuta durante el
30 * proceso de arranque mediante TFTP/PXE.
31 * @brief    Obtiene la versión del Kernel usada en arranque TFTP/PXE.
32 * @return   float    Versión del Kernel (Versión.Revisión, con 2 decimales).
33 * @versión  1.0.5 - Versión inicial.
34 * @authors  Ramón Gómez - ETSII Universidad de Sevilla
35 * @date     2013-04-11
36 */
37function clientKernelVersion () {
38        $tftpDir = "/opt/opengnsys/tftpboot";           // Directorio TFTP.
39        $kernelFile = "$tftpDir/ogclient/ogvmlinuz";    // Fichero del Kernel
40
41        // Devolver versión del Kernel (Versión.Revisión, con 2 decimales).
42        return exec ("file -bkr $kernelFile 2>/dev/null | awk '/Linux/ {for(i=1;i<=NF;i++) if(\$i~/version/) {v=\$(i+1); printf(\"%d\",v); sub(/[0-9]*\./,\"\",v); printf(\".%02d\",v)}}'");
43}
44
45
46/**
47 *           createBootMode ($cmd, $bootopt, $hostid, $lang)
48 * @brief    Crea un fichero PXE para el ordenador basado en la plantilla indicada y usando
49 *           los datos almacenados en la BD.
50 * @param    {Object}  cmd       Objeto de conexión a la base de datos.
51 * @param    {String}  bootopt   Plantilla de arranque PXE.
52 * @param    {Number}  hostid    Id. del ordenador.
53 * @param    {String}  lang      Idioma de arranque.
54 * @version  1.0.5 - Primera versión, adaptada de NetBoot Avanzado (Antonio J. Doblas Viso - Universidad de Málaga)
55 * @author  Ramón Gómez - ETSII Universidad de Sevilla
56 * @date     2013-04-25
57 * @version  1.1.0 - Se incluye la unidad organizativa como parametro del kernel: ogunit=directorio_unidad (ticket #678).
58 * @author   Irina Gómez - ETSII Universidad de Sevilla
59 * @date     2015-12-16
60 * @version  1.1.0 - La segunda fase de carga del ogLive se define en el SERVER para evitar erores de sincronismo entre versiones (ticket #787).
61 * @author   Antonio J. Doblas Viso - Universidad de Malaga
62 * @date     2017-06-01
63 */
64function createBootMode ($cmd, $bootopt, $hostid, $lang) {     
65
66        // Plantilla con las opciones por defecto.
67        if (empty ($bootopt))  $bootopt = "00unknown";
68
69        // Actualizar opción de arranque para el equipo.
70        $cmd->CreaParametro("@arranque",$bootopt,0);
71        $cmd->CreaParametro("@idordenador",$hostid,1);
72        $cmd->texto="UPDATE ordenadores SET arranque=@arranque WHERE idordenador=@idordenador";
73        $cmd->Ejecutar();
74
75        // Obtener información de la base de datos.
76        $cmd->texto="SELECT ordenadores.nombreordenador AS hostname, ordenadores.ip AS ip,
77                            ordenadores.mac AS mac, ordenadores.netiface AS netiface,
78                            aulas.netmask AS netmask, aulas.router AS router,
79                            aulas.ntp AS ntp, aulas.dns AS dns, aulas.proxy AS proxy,
80                            aulas.nombreaula AS grupo, repositorios.ip AS iprepo,
81                            (SELECT ipserveradm FROM entornos LIMIT 1) AS ipserveradm,
82                            menus.resolucion AS vga, perfileshard.winboot AS winboot,
83                            centros.directorio, entidades.ogunit
84                        FROM ordenadores
85                        JOIN aulas USING (idaula)
86                        JOIN centros USING (idcentro)
87                        JOIN entidades USING (identidad)
88                        JOIN repositorios USING (idrepositorio)
89                        LEFT JOIN menus USING (idmenu)
90                        LEFT JOIN perfileshard USING (idperfilhard)
91                        WHERE ordenadores.idordenador='$hostid'";
92
93        $rs=new Recordset;
94        $rs->Comando=&$cmd;
95        if (!$rs->Abrir())  return;
96        $rs->Primero();
97        $hostname=$rs->campos["hostname"];
98        $ip=$rs->campos["ip"];
99        $mac=$rs->campos["mac"];
100        $netiface=$rs->campos["netiface"];
101        $netmask=$rs->campos["netmask"];
102        $router=$rs->campos["router"];
103        $ntp=$rs->campos["ntp"];
104        $dns=$rs->campos["dns"];
105        $proxy=$rs->campos["proxy"];
106        $group=cleanString($rs->campos["grupo"]);
107        $repo=$rs->campos["iprepo"];
108        $server=$rs->campos["ipserveradm"];
109        $vga=$rs->campos["vga"];
110        $winboot=$rs->campos["winboot"];
111        $ogunit=$rs->campos["ogunit"];
112        if ($ogunit == 0 or $rs->campos["directorio"] == null) {
113                $directorio="" ;
114        } else {
115                $directorio=$rs->campos["directorio"];
116        }
117
118        $rs->Cerrar();
119
120        // Componer código de idioma para el parámetro de arranque.
121        switch ($lang) {
122                case "eng":
123                        $lang="en_GB";
124                        break;
125                case "esp":
126                        $lang="es_ES";
127                        break;
128                case "cat":
129                        $lang="ca_ES";
130                        break;
131        }
132
133        // Componer parámetros del kernel.
134        $infohost=" LANG=$lang".
135                  " ip=$ip:$server:$router:$netmask:$hostname:$netiface:none" .
136                  " group=$group" .
137                  " ogrepo=$repo" .
138                  " oglive=$server" .
139                  " oglog=$server" .
140                  " ogshare=$server";
141        // Añadir parámetros opcionales.
142        if (! empty ($ntp))     { $infohost.=" ogntp=$ntp"; }
143        if (! empty ($dns))     { $infohost.=" ogdns=$dns"; }
144        if (! empty ($proxy))   { $infohost.=" ogproxy=$proxy"; }
145        if (! empty ($winboot)) { $infohost.=" winboot=$winboot"; }
146        // Comprobar si se usa el parámetro "vga" (número de 3 cifras) o "video" (cadena).
147        if (! empty ($vga)) {
148                // UHU - Se sustituye la función is_int por is_numeric, ya que al ser un string no funciona bien con is_int
149                if (is_numeric($vga) && strlen($vga) == 3) {
150                        $infohost.=" vga=$vga";
151                } else {
152                        $infohost.=" video=$vga";
153                }
154        }
155        if (! empty ($directorio)) { $infohost.=" ogunit=$directorio"; }
156       
157        // Obtener nombre de fichero PXE a partir de la MAC del ordenador cliente.
158        $pxedir="/opt/opengnsys/tftpboot/menu.lst";
159        $mac = substr($mac,0,2) . ":" . substr($mac,2,2) . ":" . substr($mac,4,2) . ":" . substr($mac,6,2) . ":" . substr($mac,8,2) . ":" . substr($mac,10,2);
160        $macfile="$pxedir/01-" . str_replace(":","-",strtoupper($mac));
161
162        // Crear fichero de arranque a partir de la plantilla y los datos del cliente.
163        // UHU - si el parametro vga no existe, no se quita.
164        if (! empty ($vga)) {
165                exec ("sed -e 's|vga=...||g' -e 's|INFOHOST|$infohost|g' $pxedir/templates/$bootopt > $macfile");
166        }
167        else{
168                exec ("sed -e 's|INFOHOST|$infohost|g' $pxedir/templates/$bootopt > $macfile");
169        }
170        exec ("chmod 777 $macfile");
171}
172
173
174/**
175 *           deleteBootFile ($mac)
176 * @brief    Borra el fichero PXE del ordenador con la dirección MAC correspondiente.
177 * @param    {String}  mac     Dirección MAC del ordenador (sin caracteres ":").
178 * @versión  1.0.5 - Primera versión, adaptada de NetBoot Avanzado.
179 * @authors  Ramón Gómez - ETSII Universidad de Sevilla
180 * @date     2013-04-25
181 */
182function deleteBootFile ($mac) {       
183
184        // Obtener nombre de fichero a partir de dirección MAC.
185        $pxedir="/opt/opengnsys/tftpboot/menu.lst";
186        $macfile = "$pxedir/01-" . substr($mac,0,2) . "-" . substr($mac,2,2) . "-" . substr($mac,4,2) . "-" . substr($mac,6,2) . "-" . substr($mac,8,2) . "-" . substr($mac,10,2);
187        // Eliminar el fichero.
188        exec ("rm -f $macfile");
189}
190
191/**
192 *           updateBootMode ($cmd, $idfield, $idvalue, $lang)
193 * @brief    Ejecuta la función para componer fichero PXE para todos los clientes que cumplan
194 *           con un determinado criterio de búsqueda basado en clave ejena.
195 * @param    {Object}  cmd       Objeto de conexión con la base de datos.
196 * @param    {String}  idfield   Campo identificador de la clave ajena para buscar ordenadores.
197 * @param    {Number}  idvalue   Valor a buscar en el ídentificador de la clave ajena.
198 * @param    {String}  lang      Idioma de arranque.
199 * @versión  1.0.5 - Primera versión, adaptada de NetBoot Avanzado.
200 * @authors  Ramón Gómez - ETSII Universidad de Sevilla
201 * @date     2013-04-25
202 */
203function updateBootMode ($cmd, $idfield, $idvalue, $lang) {
204
205        // Salir si los es nulo el campo de identificador y su valor de índice.
206        if (empty ($idfield) or empty ($idvalue))
207                return;
208        // Control para evitar ataques XSS.
209        $idfield = mysql_real_escape_string ($idfield);
210        $idvalue = mysql_real_escape_string ($idvalue);
211
212        // Obtener los ordenadores asociados al aula y sus plantillas de arranque.
213        $cmd->texto = "SELECT idordenador AS hostid, arranque AS bootopt
214                         FROM ordenadores
215                        WHERE $idfield=$idvalue";
216        $rs = new Recordset;
217        $rs->Comando=&$cmd;
218        if ($rs->Abrir()) {
219                $rs->Primero();
220                while (! $rs->EOF) {
221                        $hostid=$rs->campos["hostid"];
222                        if (! empty ($hostid)) {
223                                $bootopt=$rs->campos["bootopt"];
224                                // Volver a crear el fichero de arranque.
225                                createBootMode ($cmd, $bootopt, $hostid, $lang);
226                        }
227                        $rs->Siguiente();
228                }
229                $rs->Cerrar();
230        }
231}
232
233?>
234
Note: See TracBrowser for help on using the repository browser.