source: admin/WebConsole/includes/tftputils.php @ 0b856b4d

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-instalacion
Last change on this file since 0b856b4d was 04b1594, checked in by Irina Gómez <irinagomez@…>, 6 years ago

Merge branch 'devel' into uefi (fast-forward)

  • Property mode set to 100644
File size: 8.1 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// Directorio de ficheros PXE.
15define("PXEDIRBIOS", "/opt/opengnsys/tftpboot/menu.lst");
16define("PXEDIRUEFI", "/opt/opengnsys/tftpboot/grub");
17
18
19/**
20 * @brief    Sustituye espacio por "_" y quita acentos y tildes.
21 * @param    string   Cadena a modificar.
22 * @return   string   Cadena modificada.
23 * @versión  1.0.5 - Primera versión, adaptada de NetBoot Avanzado.
24 * @author   
25 * @date     
26*/
27function cleanString ($cadena) {
28        return strtr(trim($cadena), " áéíóúñçÁÉÍÓÚÑÇ", "_aeiouncAEIOUNC");
29}
30
31
32/**
33 * Función que obtiene la versión del Kernel del cliente que se ejecuta durante el
34 * proceso de arranque mediante TFTP/PXE.
35 * @brief    Obtiene la versión del Kernel usada en arranque TFTP/PXE.
36 * @return   float    Versión del Kernel (Versión.Revisión, con 2 decimales).
37 * @versión  1.0.5 - Versión inicial.
38 * @authors  Ramón Gómez - ETSII Universidad de Sevilla
39 * @date     2013-04-11
40 */
41function clientKernelVersion () {
42        $tftpDir = "/opt/opengnsys/tftpboot";           // Directorio TFTP.
43        $kernelFile = "$tftpDir/ogclient/ogvmlinuz";    // Fichero del Kernel
44
45        // Devolver versión del Kernel (Versión.Revisión, con 2 decimales).
46        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)}}'");
47}
48
49
50/**
51 *           createBootMode ($cmd, $bootopt, $hostname, $lang)
52 * @brief    Crea un fichero PXE para el ordenador basado en la plantilla indicada y usando
53 *           los datos almacenados en la BD.
54 * @param    Object   cmd       Objeto de conexión a la base de datos.
55 * @param    String   bootopt   Plantilla de arranque PXE.
56 * @param    Integer  hostid    Id. del ordenador.
57 * @param    String   lang      Idioma de arranque.
58 * @version  1.0.5 - Primera versión, adaptada de NetBoot Avanzado (Antonio J. Doblas Viso - Universidad de Málaga)
59 * @author  Ramón Gómez - ETSII Universidad de Sevilla
60 * @date     2013-04-25
61 * @version  1.1.0 - Se incluye la unidad organizativa como parametro del kernel: ogunit=directorio_unidad (ticket #678).
62 * @author   Irina Gómez - ETSII Universidad de Sevilla
63 * @date     2015-12-16
64 * @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).
65 * @author   Antonio J. Doblas Viso - Universidad de Malaga
66 * @date     2017-06-01
67 * @version  1.1.0 - Se incluye el nombre del perfil hardware y se elimina el winboot (ticket #828).
68 * @author   Antonio J. Doblas Viso - Universidad de Malaga
69 * @date     2018-01-21
70 * @version  1.1.1 - Se utiliza setclientmode. Gestiona plantilla bios y uefi (ticket #802 #888)
71 * @author   Irina Gómez - ETSII Universidad de Sevilla
72 * @date     2019-03-14
73 */
74function createBootMode ($cmd, $bootopt, $hostname, $lang) {
75        global $cadenaconexion;
76
77        // Datos para el acceso a mysql
78        $strcn=explode(";",$cadenaconexion);
79        $file=tempnam("/tmp",".server.cnf.");
80
81        // Creo fichero con datos para mysql
82        $gestor=fopen($file, "w");
83        fwrite($gestor, "USUARIO=".$strcn[1]."\nPASSWORD=".$strcn[2]."\n");
84        fwrite($gestor, "datasource=".$strcn[0]."\nCATALOG=".$strcn[3]);
85        fclose($gestor);
86
87        // Plantilla con las opciones por defecto.
88        if (empty ($bootopt))  $bootopt = "00unknown";
89
90        // Componer código de idioma para el parámetro de arranque.
91        switch ($lang) {
92                case "eng":
93                        $lang="en_GB";
94                        break;
95                case "esp":
96                        $lang="es_ES";
97                        break;
98                case "cat":
99                        $lang="ca_ES";
100                        break;
101        }
102
103        // Descripción plantilla PXE
104        $description=exec("awk 'NR==1 {print $2}' ".PXEDIRBIOS."/templates/".$bootopt);
105        if ($description === "") $description=exec("awk 'NR==1 {print $2}' ".PXEDIRUEFI."/templates/".$bootopt);
106        // Llamamos al script setclientmode
107        shell_exec("export LANG=$lang; /opt/opengnsys/bin/setclientmode $description $hostname PERM $file");
108
109        // Borro fichero para mysql
110        unlink($file);
111}
112
113
114/**
115 *           deleteBootFile ($mac)
116 * @brief    Borra el fichero PXE del ordenador con la dirección MAC correspondiente.
117 * @param    String  mac     Dirección MAC del ordenador (sin caracteres ":").
118 * @versión  1.0.5 - Primera versión, adaptada de NetBoot Avanzado.
119 * @authors  Ramón Gómez - ETSII Universidad de Sevilla
120 * @date     2013-04-25
121 */
122function deleteBootFile ($mac) {       
123
124        // Obtener nombre de fichero a partir de dirección MAC.
125        $mac = strtoupper($mac);
126        $macfile = "/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);
127        // Eliminar el fichero.
128        @unlink(PXEDIRBIOS.$macfile);
129        @unlink(PXEDIRUEFI.$macfile);
130}
131
132/**
133 *           updateBootMode ($cmd, $idfield, $idvalue, $lang)
134 * @brief    Ejecuta la función para componer fichero PXE para todos los clientes que cumplan
135 *           con un determinado criterio de búsqueda basado en clave ejena.
136 * @param    Object   cmd       Objeto de conexión con la base de datos.
137 * @param    String   idfield   Campo identificador de la clave ajena para buscar ordenadores.
138 * @param    Integer  idvalue   Valor a buscar en el ídentificador de la clave ajena.
139 * @param    String   lang      Idioma de arranque.
140 * @versión  1.0.5 - Primera versión, adaptada de NetBoot Avanzado.
141 * @authors  Ramón Gómez - ETSII Universidad de Sevilla
142 * @date     2013-04-25
143 */
144function updateBootMode ($cmd, $idfield, $idvalue, $lang) {
145
146        // Salir si los es nulo el campo de identificador y su valor de índice.
147        if (empty ($idfield) or empty ($idvalue))
148                return;
149        // Control para evitar ataques XSS.
150        $idfield = mysqli_real_escape_string ($cmd->Conexion->controlador, $idfield);
151        $idvalue = mysqli_real_escape_string ($cmd->Conexion->controlador, $idvalue);
152
153        // Obtener los ordenadores asociados al aula y sus plantillas de arranque.
154        $cmd->texto = "SELECT nombreordenador AS hostname, arranque AS bootopt
155                         FROM ordenadores
156                        WHERE $idfield=$idvalue";
157        $rs = new Recordset;
158        $rs->Comando=&$cmd;
159        if ($rs->Abrir()) {
160                $rs->Primero();
161                while (! $rs->EOF) {
162                        $hostname=$rs->campos["hostname"];
163                        if (! empty ($hostname)) {
164                                $bootopt=$rs->campos["bootopt"];
165
166                                // Volver a crear el fichero de arranque.
167                                createBootMode ($cmd, $bootopt, $hostname, $lang);
168                        }
169                        $rs->Siguiente();
170                }
171                $rs->Cerrar();
172        }
173}
174
175/**
176 *           updateBootRepo ($cmd, $repoid)
177 * @brief    Actualiza la IP del repositorio en los ficheros PXE de todos sus equipos asociados.
178 * @param    Object  cmd      Objeto de conexión con la base de datos
179 * @param    Integer repoid   Campo identificador del repositorio
180 * @return   Integer          0, sin errores; -1, error acceso a BD; >0, ficheros no modificados
181 * @versión  1.1.0 - Primera versión.
182 * @authors  Ramón Gómez - ETSII Universidad de Sevilla
183 * @date     2018-01-19
184 */
185function updateBootRepo ($cmd, $repoid) {
186        $errors = 0;
187        // Obtener todas las MAC de los ordenadores incluidos en el repositorio.
188        $cmd->texto = "SELECT UPPER(ordenadores.mac) AS mac, repositorios.ip AS iprepo
189                         FROM ordenadores
190                         JOIN repositorios USING (idrepositorio)
191                        WHERE ordenadores.idrepositorio = '$repoid'";
192        $rs = new Recordset;
193        $rs->Comando=&$cmd;
194        if ($rs->Abrir()) {
195                $rs->Primero();
196                while (! $rs->EOF) {
197                        $mac = $rs->campos["mac"];
198                        $repo = $rs->campos["iprepo"];
199                        // Obtener nombre de fichero PXE a partir de la MAC del ordenador cliente.
200                        $macfile = "/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);
201                        // Actualizar parámetro "ogrepo" en el fichero PXE.
202                        foreach (array (PXEDIRBIOS,PXEDIRUEFI) as $bootdir) {
203                            if ($pxecode = @file_get_contents($bootdir.$macfile)) {
204                                $pxecode = preg_replace("/ogrepo=[^ ]*/", "ogrepo=$repo", $pxecode);
205                                if (! @file_put_contents($bootdir.$macfile, $pxecode)) {
206                                        $errors++;
207                                }
208                            }
209                        }
210                        $rs->Siguiente();
211                }
212                $rs->Cerrar();
213        } else {
214                $errors = -1;
215        }
216        return($errors);
217}
Note: See TracBrowser for help on using the repository browser.