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

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 b966d519 was e528cb6, checked in by Ramón M. Gómez <ramongomez@…>, 7 years ago

#872: Code cleaning.

  • Property mode set to 100644
File size: 10.5 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
[60459a1]14// Directorio de ficheros PXE.
15define("PXEDIR", "/opt/opengnsys/tftpboot/menu.lst");
16
[8c2a78c]17
18/**
19 * @brief    Sustituye espacio por "_" y quita acentos y tildes.
20 * @param    cadena   Cadena a modificar.
21 * @return   string   Cadena modificada.
22 * @versión  1.0.5 - Primera versión, adaptada de NetBoot Avanzado.
23 * @author   
24 * @date     
25*/
26function cleanString ($cadena) {
[f7f7a21]27        return strtr(trim($cadena), " áéíóúñçÁÉÍÓÚÑÇ", "_aeiouncAEIOUNC");
[8c2a78c]28}
29
30
31/**
32 * Función que obtiene la versión del Kernel del cliente que se ejecuta durante el
33 * proceso de arranque mediante TFTP/PXE.
34 * @brief    Obtiene la versión del Kernel usada en arranque TFTP/PXE.
[7894c0a]35 * @return   float    Versión del Kernel (Versión.Revisión, con 2 decimales).
[8c2a78c]36 * @versión  1.0.5 - Versión inicial.
37 * @authors  Ramón Gómez - ETSII Universidad de Sevilla
38 * @date     2013-04-11
39 */
40function clientKernelVersion () {
41        $tftpDir = "/opt/opengnsys/tftpboot";           // Directorio TFTP.
42        $kernelFile = "$tftpDir/ogclient/ogvmlinuz";    // Fichero del Kernel
43
[7894c0a]44        // Devolver versión del Kernel (Versión.Revisión, con 2 decimales).
45        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]46}
47
48
49/**
50 *           createBootMode ($cmd, $bootopt, $hostid, $lang)
51 * @brief    Crea un fichero PXE para el ordenador basado en la plantilla indicada y usando
52 *           los datos almacenados en la BD.
53 * @param    {Object}  cmd       Objeto de conexión a la base de datos.
54 * @param    {String}  bootopt   Plantilla de arranque PXE.
55 * @param    {Number}  hostid    Id. del ordenador.
56 * @param    {String}  lang      Idioma de arranque.
[3a89d3d]57 * @version  1.0.5 - Primera versión, adaptada de NetBoot Avanzado (Antonio J. Doblas Viso - Universidad de Málaga)
[0c86fb7]58 * @author  Ramón Gómez - ETSII Universidad de Sevilla
[8c2a78c]59 * @date     2013-04-25
[0c86fb7]60 * @version  1.1.0 - Se incluye la unidad organizativa como parametro del kernel: ogunit=directorio_unidad (ticket #678).
61 * @author   Irina Gómez - ETSII Universidad de Sevilla
62 * @date     2015-12-16
[3a89d3d]63 * @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).
64 * @author   Antonio J. Doblas Viso - Universidad de Malaga
65 * @date     2017-06-01
[9b89a15]66  * @version  1.1.0 - Se incluye el nombre del perfil hardware y se elimina el winboot (ticket #828).
67 * @author   Antonio J. Doblas Viso - Universidad de Malaga
68 * @date     2018-01-21
[8c2a78c]69 */
70function createBootMode ($cmd, $bootopt, $hostid, $lang) {     
71
72        // Plantilla con las opciones por defecto.
73        if (empty ($bootopt))  $bootopt = "00unknown";
74
75        // Actualizar opción de arranque para el equipo.
76        $cmd->CreaParametro("@arranque",$bootopt,0);
77        $cmd->CreaParametro("@idordenador",$hostid,1);
78        $cmd->texto="UPDATE ordenadores SET arranque=@arranque WHERE idordenador=@idordenador";
79        $cmd->Ejecutar();
80
81        // Obtener información de la base de datos.
82        $cmd->texto="SELECT ordenadores.nombreordenador AS hostname, ordenadores.ip AS ip,
83                            ordenadores.mac AS mac, ordenadores.netiface AS netiface,
[ccda415]84                            ordenadores.oglivedir AS oglivedir,
[8c2a78c]85                            aulas.netmask AS netmask, aulas.router AS router,
[e38ac22]86                            aulas.ntp AS ntp, aulas.dns AS dns, aulas.proxy AS proxy,
[6449e04]87                            aulas.nombreaula AS grupo, IFNULL(repositorios.ip, '') AS iprepo,
[8c2a78c]88                            (SELECT ipserveradm FROM entornos LIMIT 1) AS ipserveradm,
[9b89a15]89                            menus.resolucion AS vga, perfileshard.descripcion AS hardprofile,
[0c86fb7]90                            centros.directorio, entidades.ogunit
[8c2a78c]91                        FROM ordenadores
92                        JOIN aulas USING (idaula)
[0c86fb7]93                        JOIN centros USING (idcentro)
94                        JOIN entidades USING (identidad)
[6449e04]95                        LEFT JOIN repositorios USING (idrepositorio)
[8c2a78c]96                        LEFT JOIN menus USING (idmenu)
97                        LEFT JOIN perfileshard USING (idperfilhard)
98                        WHERE ordenadores.idordenador='$hostid'";
99
100        $rs=new Recordset;
101        $rs->Comando=&$cmd;
102        if (!$rs->Abrir())  return;
103        $rs->Primero();
104        $hostname=$rs->campos["hostname"];
105        $ip=$rs->campos["ip"];
106        $mac=$rs->campos["mac"];
107        $netiface=$rs->campos["netiface"];
108        $netmask=$rs->campos["netmask"];
109        $router=$rs->campos["router"];
[e38ac22]110        $ntp=$rs->campos["ntp"];
[8c2a78c]111        $dns=$rs->campos["dns"];
112        $proxy=$rs->campos["proxy"];
113        $group=cleanString($rs->campos["grupo"]);
114        $repo=$rs->campos["iprepo"];
115        $server=$rs->campos["ipserveradm"];
116        $vga=$rs->campos["vga"];
[5607003]117        $hardprofile=cleanString($rs->campos["hardprofile"]);
[ccda415]118        $oglivedir=$rs->campos["oglivedir"];
[0c86fb7]119        $ogunit=$rs->campos["ogunit"];
120        if ($ogunit == 0 or $rs->campos["directorio"] == null) {
121                $directorio="" ;
122        } else {
123                $directorio=$rs->campos["directorio"];
124        }
[8c2a78c]125
126        $rs->Cerrar();
127
128        // Componer código de idioma para el parámetro de arranque.
129        switch ($lang) {
130                case "eng":
131                        $lang="en_GB";
132                        break;
133                case "esp":
134                        $lang="es_ES";
135                        break;
136                case "cat":
137                        $lang="ca_ES";
138                        break;
139        }
140
141        // Componer parámetros del kernel.
142        $infohost=" LANG=$lang".
143                  " ip=$ip:$server:$router:$netmask:$hostname:$netiface:none" .
144                  " group=$group" .
145                  " ogrepo=$repo" .
[3a89d3d]146                  " oglive=$server" .
[8c2a78c]147                  " oglog=$server" .
[2211576]148                  " ogshare=$server";
[8c2a78c]149        // Añadir parámetros opcionales.
[e38ac22]150        if (! empty ($ntp))     { $infohost.=" ogntp=$ntp"; }
[8c2a78c]151        if (! empty ($dns))     { $infohost.=" ogdns=$dns"; }
152        if (! empty ($proxy))   { $infohost.=" ogproxy=$proxy"; }
[9b89a15]153        if (! empty ($hardprofile))     { $infohost.=" hardprofile=$hardprofile"; }
[8c2a78c]154        // Comprobar si se usa el parámetro "vga" (número de 3 cifras) o "video" (cadena).
155        if (! empty ($vga)) {
[18779c5]156                // UHU - Se sustituye la función is_int por is_numeric, ya que al ser un string no funciona bien con is_int
157                if (is_numeric($vga) && strlen($vga) == 3) {
[8c2a78c]158                        $infohost.=" vga=$vga";
159                } else {
160                        $infohost.=" video=$vga";
161                }
162        }
[0c86fb7]163        if (! empty ($directorio)) { $infohost.=" ogunit=$directorio"; }
[18779c5]164       
[8c2a78c]165        $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);
[60459a1]166        $macfile = PXEDIR . "/01-" . str_replace(":", "-", strtoupper($mac));   
[8c2a78c]167
168        // Crear fichero de arranque a partir de la plantilla y los datos del cliente.
[18779c5]169        // UHU - si el parametro vga no existe, no se quita.
170        if (! empty ($vga)) {
[60459a1]171                exec("sed -e 's|vga=...||g; s|INFOHOST|$infohost|g; s|set ISODIR=.*|set ISODIR=$oglivedir|g' " . PXEDIR . "/templates/$bootopt > $macfile");
[18779c5]172        }
173        else{
[60459a1]174                exec("sed -e 's|INFOHOST|$infohost|g; s|set ISODIR=.*|set ISODIR=$oglivedir|g; s|set ISODIR=.*|set ISODIR=$oglivedir|g' " . PXEDIR . "/templates/$bootopt > $macfile");
[18779c5]175        }
[60459a1]176        chmod($macfile, 0777);
[8c2a78c]177}
178
179
180/**
181 *           deleteBootFile ($mac)
182 * @brief    Borra el fichero PXE del ordenador con la dirección MAC correspondiente.
183 * @param    {String}  mac     Dirección MAC del ordenador (sin caracteres ":").
184 * @versión  1.0.5 - Primera versión, adaptada de NetBoot Avanzado.
185 * @authors  Ramón Gómez - ETSII Universidad de Sevilla
186 * @date     2013-04-25
187 */
188function deleteBootFile ($mac) {       
189
190        // Obtener nombre de fichero a partir de dirección MAC.
[7d8c134]191        $mac = strtoupper($mac);
[60459a1]192        $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);
[8c2a78c]193        // Eliminar el fichero.
[7d8c134]194        @unlink($macfile);
[8c2a78c]195}
196
197/**
198 *           updateBootMode ($cmd, $idfield, $idvalue, $lang)
199 * @brief    Ejecuta la función para componer fichero PXE para todos los clientes que cumplan
200 *           con un determinado criterio de búsqueda basado en clave ejena.
201 * @param    {Object}  cmd       Objeto de conexión con la base de datos.
202 * @param    {String}  idfield   Campo identificador de la clave ajena para buscar ordenadores.
203 * @param    {Number}  idvalue   Valor a buscar en el ídentificador de la clave ajena.
204 * @param    {String}  lang      Idioma de arranque.
205 * @versión  1.0.5 - Primera versión, adaptada de NetBoot Avanzado.
206 * @authors  Ramón Gómez - ETSII Universidad de Sevilla
207 * @date     2013-04-25
208 */
209function updateBootMode ($cmd, $idfield, $idvalue, $lang) {
210
211        // Salir si los es nulo el campo de identificador y su valor de índice.
212        if (empty ($idfield) or empty ($idvalue))
213                return;
214        // Control para evitar ataques XSS.
[55fcaa6]215        $idfield = mysqli_real_escape_string ($cmd->Conexion->controlador, $idfield);
216        $idvalue = mysqli_real_escape_string ($cmd->Conexion->controlador, $idvalue);
[8c2a78c]217
218        // Obtener los ordenadores asociados al aula y sus plantillas de arranque.
219        $cmd->texto = "SELECT idordenador AS hostid, arranque AS bootopt
220                         FROM ordenadores
221                        WHERE $idfield=$idvalue";
222        $rs = new Recordset;
223        $rs->Comando=&$cmd;
224        if ($rs->Abrir()) {
225                $rs->Primero();
226                while (! $rs->EOF) {
227                        $hostid=$rs->campos["hostid"];
228                        if (! empty ($hostid)) {
229                                $bootopt=$rs->campos["bootopt"];
230                                // Volver a crear el fichero de arranque.
231                                createBootMode ($cmd, $bootopt, $hostid, $lang);
232                        }
233                        $rs->Siguiente();
234                }
235                $rs->Cerrar();
236        }
237}
238
[60459a1]239/**
240 *           updateBootRepo ($cmd, $repoid)
241 * @brief    Actualiza la IP del repositorio en los ficheros PXE de todos sus equipos asociados.
242 * @param    {Object}  cmd      Objeto de conexión con la base de datos
243 * @param    {Integer} repoid   Campo identificador del repositorio
244 * @return   {Integer}          0, sin errores; -1, error acceso a BD; >0, ficheros no modificados
245 * @versión  1.1.0 - Primera versión.
246 * @authors  Ramón Gómez - ETSII Universidad de Sevilla
247 * @date     2018-01-19
248 */
249function updateBootRepo ($cmd, $repoid) {
250        $errors = 0;
251        // Obtener todas las MAC de los ordenadores incluidos en el repositorio.
252        $cmd->texto = "SELECT UPPER(ordenadores.mac) AS mac, repositorios.ip AS iprepo
253                         FROM ordenadores
254                         JOIN repositorios USING (idrepositorio)
255                        WHERE ordenadores.idrepositorio = '$repoid'";
256        $rs = new Recordset;
257        $rs->Comando=&$cmd;
258        if ($rs->Abrir()) {
259                $rs->Primero();
260                while (! $rs->EOF) {
261                        $mac = $rs->campos["mac"];
262                        $repo = $rs->campos["iprepo"];
263                        // Obtener nombre de fichero PXE a partir de la MAC del ordenador cliente.
264                        $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);
265                        // Actualizar parámetro "ogrepo" en el fichero PXE.
266                        if ($pxecode = @file_get_contents($macfile)) {
267                                $pxecode = preg_replace("/ogrepo=[^ ]*/", "ogrepo=$repo", $pxecode);
268                                if (! @file_put_contents($macfile, $pxecode)) {
269                                        $erros++;
270                                }
271                        }
272                        $rs->Siguiente();
273                }
274                $rs->Cerrar();
275        } else {
276                $errors = -1;
277        }
278        return($errors);
279}
Note: See TracBrowser for help on using the repository browser.