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

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 e3b1b1e was 25d4404, checked in by Irina Gómez <irinagomez@…>, 6 years ago

#802 Advanced Boot Management sends to 'sendclientmode' script access data to the database as environment variables.

  • Property mode set to 100644
File size: 7.9 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    String  hostname  Nombre 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        $acceso="USUARIO=".$strcn[1]." PASSWORD=".$strcn[2]." CATALOG=".$strcn[3];
80
81        // Plantilla con las opciones por defecto.
82        if (empty ($bootopt))  $bootopt = "00unknown";
83
84        // Componer código de idioma para el parámetro de arranque.
85        switch ($lang) {
86                case "eng":
87                        $lang="en_GB";
88                        break;
89                case "esp":
90                        $lang="es_ES";
91                        break;
92                case "cat":
93                        $lang="ca_ES";
94                        break;
95        }
96
97        // Descripción plantilla PXE
98        $description=exec("awk 'NR==1 {print $2}' ".PXEDIRBIOS."/templates/".$bootopt);
99        if ($description === "") $description=exec("awk 'NR==1 {print $2}' ".PXEDIRUEFI."/templates/".$bootopt);
100        // Llamamos al script setclientmode
101        shell_exec("export LANG=$lang $acceso; /opt/opengnsys/bin/setclientmode $description $hostname PERM $file");
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 nombreordenador AS hostname, 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                        $hostname=$rs->campos["hostname"];
154                        if (! empty ($hostname)) {
155                                $bootopt=$rs->campos["bootopt"];
156
157                                // Volver a crear el fichero de arranque.
158                                createBootMode ($cmd, $bootopt, $hostname, $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.