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

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 aa26f6e was f7f7a21, checked in by ramon <ramongomez@…>, 7 years ago

#828: Aplicar los cambios en el script setclientmode y descartar espacios iniciales y finales al obtener datos para varialbes PXE.

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

  • Property mode set to 100644
File size: 10.5 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("PXEDIR", "/opt/opengnsys/tftpboot/menu.lst");
16
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) {
27        return strtr(trim($cadena), " áéíóúñçÁÉÍÓÚÑÇ", "_aeiouncAEIOUNC");
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.
35 * @return   float    Versión del Kernel (Versión.Revisión, con 2 decimales).
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
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)}}'");
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.
57 * @version  1.0.5 - Primera versión, adaptada de NetBoot Avanzado (Antonio J. Doblas Viso - Universidad de Málaga)
58 * @author  Ramón Gómez - ETSII Universidad de Sevilla
59 * @date     2013-04-25
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
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
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
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,
84                            ordenadores.oglivedir AS oglivedir,
85                            aulas.netmask AS netmask, aulas.router AS router,
86                            aulas.ntp AS ntp, aulas.dns AS dns, aulas.proxy AS proxy,
87                            aulas.nombreaula AS grupo, repositorios.ip AS iprepo,
88                            (SELECT ipserveradm FROM entornos LIMIT 1) AS ipserveradm,
89                            menus.resolucion AS vga, perfileshard.descripcion AS hardprofile,
90                            centros.directorio, entidades.ogunit
91                        FROM ordenadores
92                        JOIN aulas USING (idaula)
93                        JOIN centros USING (idcentro)
94                        JOIN entidades USING (identidad)
95                        JOIN repositorios USING (idrepositorio)
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"];
110        $ntp=$rs->campos["ntp"];
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"];
117        $hardprofile=cleanString($rs->campos["hardprofile"]);
118        $oglivedir=$rs->campos["oglivedir"];
119        $ogunit=$rs->campos["ogunit"];
120        if ($ogunit == 0 or $rs->campos["directorio"] == null) {
121                $directorio="" ;
122        } else {
123                $directorio=$rs->campos["directorio"];
124        }
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" .
146                  " oglive=$server" .
147                  " oglog=$server" .
148                  " ogshare=$server" .
149                  " oglivedir=$oglivedir";
150        // Añadir parámetros opcionales.
151        if (! empty ($ntp))     { $infohost.=" ogntp=$ntp"; }
152        if (! empty ($dns))     { $infohost.=" ogdns=$dns"; }
153        if (! empty ($proxy))   { $infohost.=" ogproxy=$proxy"; }
154        if (! empty ($hardprofile))     { $infohost.=" hardprofile=$hardprofile"; }
155        // Comprobar si se usa el parámetro "vga" (número de 3 cifras) o "video" (cadena).
156        if (! empty ($vga)) {
157                // UHU - Se sustituye la función is_int por is_numeric, ya que al ser un string no funciona bien con is_int
158                if (is_numeric($vga) && strlen($vga) == 3) {
159                        $infohost.=" vga=$vga";
160                } else {
161                        $infohost.=" video=$vga";
162                }
163        }
164        if (! empty ($directorio)) { $infohost.=" ogunit=$directorio"; }
165       
166        $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);
167        $macfile = PXEDIR . "/01-" . str_replace(":", "-", strtoupper($mac));   
168
169        // Crear fichero de arranque a partir de la plantilla y los datos del cliente.
170        // UHU - si el parametro vga no existe, no se quita.
171        if (! empty ($vga)) {
172                exec("sed -e 's|vga=...||g; s|INFOHOST|$infohost|g; s|set ISODIR=.*|set ISODIR=$oglivedir|g' " . PXEDIR . "/templates/$bootopt > $macfile");
173        }
174        else{
175                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");
176        }
177        chmod($macfile, 0777);
178}
179
180
181/**
182 *           deleteBootFile ($mac)
183 * @brief    Borra el fichero PXE del ordenador con la dirección MAC correspondiente.
184 * @param    {String}  mac     Dirección MAC del ordenador (sin caracteres ":").
185 * @versión  1.0.5 - Primera versión, adaptada de NetBoot Avanzado.
186 * @authors  Ramón Gómez - ETSII Universidad de Sevilla
187 * @date     2013-04-25
188 */
189function deleteBootFile ($mac) {       
190
191        // Obtener nombre de fichero a partir de dirección MAC.
192        $mac = strtoupper($mac);
193        $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);
194        // Eliminar el fichero.
195        @unlink($macfile);
196}
197
198/**
199 *           updateBootMode ($cmd, $idfield, $idvalue, $lang)
200 * @brief    Ejecuta la función para componer fichero PXE para todos los clientes que cumplan
201 *           con un determinado criterio de búsqueda basado en clave ejena.
202 * @param    {Object}  cmd       Objeto de conexión con la base de datos.
203 * @param    {String}  idfield   Campo identificador de la clave ajena para buscar ordenadores.
204 * @param    {Number}  idvalue   Valor a buscar en el ídentificador de la clave ajena.
205 * @param    {String}  lang      Idioma de arranque.
206 * @versión  1.0.5 - Primera versión, adaptada de NetBoot Avanzado.
207 * @authors  Ramón Gómez - ETSII Universidad de Sevilla
208 * @date     2013-04-25
209 */
210function updateBootMode ($cmd, $idfield, $idvalue, $lang) {
211
212        // Salir si los es nulo el campo de identificador y su valor de índice.
213        if (empty ($idfield) or empty ($idvalue))
214                return;
215        // Control para evitar ataques XSS.
216        $idfield = mysql_real_escape_string ($idfield);
217        $idvalue = mysql_real_escape_string ($idvalue);
218
219        // Obtener los ordenadores asociados al aula y sus plantillas de arranque.
220        $cmd->texto = "SELECT idordenador AS hostid, arranque AS bootopt
221                         FROM ordenadores
222                        WHERE $idfield=$idvalue";
223        $rs = new Recordset;
224        $rs->Comando=&$cmd;
225        if ($rs->Abrir()) {
226                $rs->Primero();
227                while (! $rs->EOF) {
228                        $hostid=$rs->campos["hostid"];
229                        if (! empty ($hostid)) {
230                                $bootopt=$rs->campos["bootopt"];
231                                // Volver a crear el fichero de arranque.
232                                createBootMode ($cmd, $bootopt, $hostid, $lang);
233                        }
234                        $rs->Siguiente();
235                }
236                $rs->Cerrar();
237        }
238}
239
240/**
241 *           updateBootRepo ($cmd, $repoid)
242 * @brief    Actualiza la IP del repositorio en los ficheros PXE de todos sus equipos asociados.
243 * @param    {Object}  cmd      Objeto de conexión con la base de datos
244 * @param    {Integer} repoid   Campo identificador del repositorio
245 * @return   {Integer}          0, sin errores; -1, error acceso a BD; >0, ficheros no modificados
246 * @versión  1.1.0 - Primera versión.
247 * @authors  Ramón Gómez - ETSII Universidad de Sevilla
248 * @date     2018-01-19
249 */
250function updateBootRepo ($cmd, $repoid) {
251        $errors = 0;
252        // Obtener todas las MAC de los ordenadores incluidos en el repositorio.
253        $cmd->texto = "SELECT UPPER(ordenadores.mac) AS mac, repositorios.ip AS iprepo
254                         FROM ordenadores
255                         JOIN repositorios USING (idrepositorio)
256                        WHERE ordenadores.idrepositorio = '$repoid'";
257        $rs = new Recordset;
258        $rs->Comando=&$cmd;
259        if ($rs->Abrir()) {
260                $rs->Primero();
261                while (! $rs->EOF) {
262                        $mac = $rs->campos["mac"];
263                        $repo = $rs->campos["iprepo"];
264                        // Obtener nombre de fichero PXE a partir de la MAC del ordenador cliente.
265                        $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);
266                        // Actualizar parámetro "ogrepo" en el fichero PXE.
267                        if ($pxecode = @file_get_contents($macfile)) {
268                                $pxecode = preg_replace("/ogrepo=[^ ]*/", "ogrepo=$repo", $pxecode);
269                                if (! @file_put_contents($macfile, $pxecode)) {
270                                        $erros++;
271                                }
272                        }
273                        $rs->Siguiente();
274                }
275                $rs->Cerrar();
276        } else {
277                $errors = -1;
278        }
279        return($errors);
280}
281
282?>
283
Note: See TracBrowser for help on using the repository browser.