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

Last change on this file since b1ef135 was 3aadac3b, checked in by OpenGnSys Support Team <soporte-og@…>, 5 years ago

#980 Update POST /mode to the new ogServer API

This patch selects the machines whose modes need to be changed using the
client's IP rather than their scope names.

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