source: admin/WebConsole/includes/tftputils.php @ a237bd1

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 a237bd1 was ccda415, checked in by ramon <ramongomez@…>, 8 years ago

#768: Incluir directorio de ogLive al generar fichero PXE.

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

  • Property mode set to 100644
File size: 8.6 KB
RevLine 
[8c2a78c]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.
[7894c0a]32 * @return   float    Versión del Kernel (Versión.Revisión, con 2 decimales).
[8c2a78c]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
[7894c0a]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)}}'");
[8c2a78c]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.
[3a89d3d]54 * @version  1.0.5 - Primera versión, adaptada de NetBoot Avanzado (Antonio J. Doblas Viso - Universidad de Málaga)
[0c86fb7]55 * @author  Ramón Gómez - ETSII Universidad de Sevilla
[8c2a78c]56 * @date     2013-04-25
[0c86fb7]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
[3a89d3d]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
[8c2a78c]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,
[ccda415]78                            ordenadores.oglivedir AS oglivedir,
[8c2a78c]79                            aulas.netmask AS netmask, aulas.router AS router,
[e38ac22]80                            aulas.ntp AS ntp, aulas.dns AS dns, aulas.proxy AS proxy,
[8c2a78c]81                            aulas.nombreaula AS grupo, repositorios.ip AS iprepo,
82                            (SELECT ipserveradm FROM entornos LIMIT 1) AS ipserveradm,
[0c86fb7]83                            menus.resolucion AS vga, perfileshard.winboot AS winboot,
84                            centros.directorio, entidades.ogunit
[8c2a78c]85                        FROM ordenadores
86                        JOIN aulas USING (idaula)
[0c86fb7]87                        JOIN centros USING (idcentro)
88                        JOIN entidades USING (identidad)
[8c2a78c]89                        JOIN repositorios USING (idrepositorio)
90                        LEFT JOIN menus USING (idmenu)
91                        LEFT JOIN perfileshard USING (idperfilhard)
92                        WHERE ordenadores.idordenador='$hostid'";
93
94        $rs=new Recordset;
95        $rs->Comando=&$cmd;
96        if (!$rs->Abrir())  return;
97        $rs->Primero();
98        $hostname=$rs->campos["hostname"];
99        $ip=$rs->campos["ip"];
100        $mac=$rs->campos["mac"];
101        $netiface=$rs->campos["netiface"];
102        $netmask=$rs->campos["netmask"];
103        $router=$rs->campos["router"];
[e38ac22]104        $ntp=$rs->campos["ntp"];
[8c2a78c]105        $dns=$rs->campos["dns"];
106        $proxy=$rs->campos["proxy"];
107        $group=cleanString($rs->campos["grupo"]);
108        $repo=$rs->campos["iprepo"];
109        $server=$rs->campos["ipserveradm"];
110        $vga=$rs->campos["vga"];
111        $winboot=$rs->campos["winboot"];
[ccda415]112        $oglivedir=$rs->campos["oglivedir"];
[0c86fb7]113        $ogunit=$rs->campos["ogunit"];
114        if ($ogunit == 0 or $rs->campos["directorio"] == null) {
115                $directorio="" ;
116        } else {
117                $directorio=$rs->campos["directorio"];
118        }
[8c2a78c]119
120        $rs->Cerrar();
121
122        // Componer código de idioma para el parámetro de arranque.
123        switch ($lang) {
124                case "eng":
125                        $lang="en_GB";
126                        break;
127                case "esp":
128                        $lang="es_ES";
129                        break;
130                case "cat":
131                        $lang="ca_ES";
132                        break;
133        }
134
135        // Componer parámetros del kernel.
136        $infohost=" LANG=$lang".
137                  " ip=$ip:$server:$router:$netmask:$hostname:$netiface:none" .
138                  " group=$group" .
139                  " ogrepo=$repo" .
[3a89d3d]140                  " oglive=$server" .
[8c2a78c]141                  " oglog=$server" .
[ccda415]142                  " ogshare=$server" .
143                  " oglivedir=$oglivedir";
[8c2a78c]144        // Añadir parámetros opcionales.
[e38ac22]145        if (! empty ($ntp))     { $infohost.=" ogntp=$ntp"; }
[8c2a78c]146        if (! empty ($dns))     { $infohost.=" ogdns=$dns"; }
147        if (! empty ($proxy))   { $infohost.=" ogproxy=$proxy"; }
148        if (! empty ($winboot)) { $infohost.=" winboot=$winboot"; }
149        // Comprobar si se usa el parámetro "vga" (número de 3 cifras) o "video" (cadena).
150        if (! empty ($vga)) {
[18779c5]151                // UHU - Se sustituye la función is_int por is_numeric, ya que al ser un string no funciona bien con is_int
152                if (is_numeric($vga) && strlen($vga) == 3) {
[8c2a78c]153                        $infohost.=" vga=$vga";
154                } else {
155                        $infohost.=" video=$vga";
156                }
157        }
[0c86fb7]158        if (! empty ($directorio)) { $infohost.=" ogunit=$directorio"; }
[18779c5]159       
[8c2a78c]160        // Obtener nombre de fichero PXE a partir de la MAC del ordenador cliente.
161        $pxedir="/opt/opengnsys/tftpboot/menu.lst";
162        $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);
163        $macfile="$pxedir/01-" . str_replace(":","-",strtoupper($mac));
164
165        // Crear fichero de arranque a partir de la plantilla y los datos del cliente.
[18779c5]166        // UHU - si el parametro vga no existe, no se quita.
167        if (! empty ($vga)) {
168                exec ("sed -e 's|vga=...||g' -e 's|INFOHOST|$infohost|g' $pxedir/templates/$bootopt > $macfile");
169        }
170        else{
[ccda415]171                exec ("sed -e 's|INFOHOST|$infohost|g' -e 's|set ISODIR=.*|set ISODIR=$oglivedir|g' $pxedir/templates/$bootopt > $macfile");
[18779c5]172        }
[8c2a78c]173        exec ("chmod 777 $macfile");
174}
175
176
177/**
178 *           deleteBootFile ($mac)
179 * @brief    Borra el fichero PXE del ordenador con la dirección MAC correspondiente.
180 * @param    {String}  mac     Dirección MAC del ordenador (sin caracteres ":").
181 * @versión  1.0.5 - Primera versión, adaptada de NetBoot Avanzado.
182 * @authors  Ramón Gómez - ETSII Universidad de Sevilla
183 * @date     2013-04-25
184 */
185function deleteBootFile ($mac) {       
186
187        // Obtener nombre de fichero a partir de dirección MAC.
188        $pxedir="/opt/opengnsys/tftpboot/menu.lst";
189        $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);
190        // Eliminar el fichero.
191        exec ("rm -f $macfile");
192}
193
194/**
195 *           updateBootMode ($cmd, $idfield, $idvalue, $lang)
196 * @brief    Ejecuta la función para componer fichero PXE para todos los clientes que cumplan
197 *           con un determinado criterio de búsqueda basado en clave ejena.
198 * @param    {Object}  cmd       Objeto de conexión con la base de datos.
199 * @param    {String}  idfield   Campo identificador de la clave ajena para buscar ordenadores.
200 * @param    {Number}  idvalue   Valor a buscar en el ídentificador de la clave ajena.
201 * @param    {String}  lang      Idioma de arranque.
202 * @versión  1.0.5 - Primera versión, adaptada de NetBoot Avanzado.
203 * @authors  Ramón Gómez - ETSII Universidad de Sevilla
204 * @date     2013-04-25
205 */
206function updateBootMode ($cmd, $idfield, $idvalue, $lang) {
207
208        // Salir si los es nulo el campo de identificador y su valor de índice.
209        if (empty ($idfield) or empty ($idvalue))
210                return;
211        // Control para evitar ataques XSS.
212        $idfield = mysql_real_escape_string ($idfield);
213        $idvalue = mysql_real_escape_string ($idvalue);
214
215        // Obtener los ordenadores asociados al aula y sus plantillas de arranque.
216        $cmd->texto = "SELECT idordenador AS hostid, arranque AS bootopt
217                         FROM ordenadores
218                        WHERE $idfield=$idvalue";
219        $rs = new Recordset;
220        $rs->Comando=&$cmd;
221        if ($rs->Abrir()) {
222                $rs->Primero();
223                while (! $rs->EOF) {
224                        $hostid=$rs->campos["hostid"];
225                        if (! empty ($hostid)) {
226                                $bootopt=$rs->campos["bootopt"];
227                                // Volver a crear el fichero de arranque.
228                                createBootMode ($cmd, $bootopt, $hostid, $lang);
229                        }
230                        $rs->Siguiente();
231                }
232                $rs->Cerrar();
233        }
234}
235
236?>
237
Note: See TracBrowser for help on using the repository browser.