source: admin/WebConsole/includes/tftputils.php @ 6d5e5bc

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 6d5e5bc was 8c2a78c, checked in by ramon <ramongomez@…>, 12 years ago

Versión 1.0.5, #596: Incorporar código del ticket:596.

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

  • Property mode set to 100644
File size: 7.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
15/**
16 * @brief    Sustituye espacio por "_" y quita acentos y tildes.
17 * @param    cadena   Cadena a modificar.
18 * @return   string   Cadena modificada.
19 * @versión  1.0.5 - Primera versión, adaptada de NetBoot Avanzado.
20 * @author   
21 * @date     
22*/
23function cleanString ($cadena) {
24        return strtr ($cadena, " áéíóúñçÁÉÍÓÚÑÇ", "_aeiouncAEIOUNC");
25}
26
27
28/**
29 * Función que obtiene la versión del Kernel del cliente que se ejecuta durante el
30 * proceso de arranque mediante TFTP/PXE.
31 * @brief    Obtiene la versión del Kernel usada en arranque TFTP/PXE.
32 * @return   {String}  Versión del Kernel.
33 * @versión  1.0.5 - Versión inicial.
34 * @authors  Ramón Gómez - ETSII Universidad de Sevilla
35 * @date     2013-04-11
36 */
37function clientKernelVersion () {
38        $tftpDir = "/opt/opengnsys/tftpboot";           // Directorio TFTP.
39        $kernelFile = "$tftpDir/ogclient/ogvmlinuz";    // Fichero del Kernel
40
41        // Devolver versión del Kernel (8ª palabra del tipo de fichero).
42        return exec ("file -b $kernelFile 2>/dev/null | cut -f8 -d' '");
43}
44
45
46/**
47 *           createBootMode ($cmd, $bootopt, $hostid, $lang)
48 * @brief    Crea un fichero PXE para el ordenador basado en la plantilla indicada y usando
49 *           los datos almacenados en la BD.
50 * @param    {Object}  cmd       Objeto de conexión a la base de datos.
51 * @param    {String}  bootopt   Plantilla de arranque PXE.
52 * @param    {Number}  hostid    Id. del ordenador.
53 * @param    {String}  lang      Idioma de arranque.
54 * @versión  1.0.5 - Primera versión, adaptada de NetBoot Avanzado.
55 * @authors  Ramón Gómez - ETSII Universidad de Sevilla
56 * @date     2013-04-25
57 */
58function createBootMode ($cmd, $bootopt, $hostid, $lang) {     
59
60        // Plantilla con las opciones por defecto.
61        if (empty ($bootopt))  $bootopt = "00unknown";
62
63        // Actualizar opción de arranque para el equipo.
64        $cmd->CreaParametro("@arranque",$bootopt,0);
65        $cmd->CreaParametro("@idordenador",$hostid,1);
66        $cmd->texto="UPDATE ordenadores SET arranque=@arranque WHERE idordenador=@idordenador";
67        $cmd->Ejecutar();
68
69        // Obtener información de la base de datos.
70        $cmd->texto="SELECT ordenadores.nombreordenador AS hostname, ordenadores.ip AS ip,
71                            ordenadores.mac AS mac, ordenadores.netiface AS netiface,
72                            aulas.netmask AS netmask, aulas.router AS router,
73                            aulas.dns AS dns, aulas.proxy AS proxy,
74                            aulas.nombreaula AS grupo, repositorios.ip AS iprepo,
75                            (SELECT ipserveradm FROM entornos LIMIT 1) AS ipserveradm,
76                            menus.resolucion AS vga, perfileshard.winboot AS winboot
77                        FROM ordenadores
78                        JOIN aulas USING (idaula)
79                        JOIN repositorios USING (idrepositorio)
80                        LEFT JOIN menus USING (idmenu)
81                        LEFT JOIN perfileshard USING (idperfilhard)
82                        WHERE ordenadores.idordenador='$hostid'";
83
84        $rs=new Recordset;
85        $rs->Comando=&$cmd;
86        if (!$rs->Abrir())  return;
87        $rs->Primero();
88        $hostname=$rs->campos["hostname"];
89        $ip=$rs->campos["ip"];
90        $mac=$rs->campos["mac"];
91        $netiface=$rs->campos["netiface"];
92        $netmask=$rs->campos["netmask"];
93        $router=$rs->campos["router"];
94        $dns=$rs->campos["dns"];
95        $proxy=$rs->campos["proxy"];
96        $group=cleanString($rs->campos["grupo"]);
97        $repo=$rs->campos["iprepo"];
98        $server=$rs->campos["ipserveradm"];
99        $vga=$rs->campos["vga"];
100        $winboot=$rs->campos["winboot"];
101
102        $rs->Cerrar();
103
104        // Componer código de idioma para el parámetro de arranque.
105        switch ($lang) {
106                case "eng":
107                        $lang="en_GB";
108                        break;
109                case "esp":
110                        $lang="es_ES";
111                        break;
112                case "cat":
113                        $lang="ca_ES";
114                        break;
115        }
116
117        // Componer parámetros del kernel.
118        $infohost=" LANG=$lang".
119                  " ip=$ip:$server:$router:$netmask:$hostname:$netiface:none" .
120                  " group=$group" .
121                  " ogrepo=$repo" .
122                  " oglive=$repo" .
123                  " oglog=$server" .
124                  " ogshare=$server";
125        // Añadir parámetros opcionales.
126        if (! empty ($dns))     { $infohost.=" ogdns=$dns"; }
127        if (! empty ($proxy))   { $infohost.=" ogproxy=$proxy"; }
128        if (! empty ($winboot)) { $infohost.=" winboot=$winboot"; }
129        // Comprobar si se usa el parámetro "vga" (número de 3 cifras) o "video" (cadena).
130        if (! empty ($vga)) {
131                if (is_int ($vga) and strlen ($vga) == 3) {
132                        $infohost.=" vga=$vga";
133                } else {
134                        $infohost.=" video=$vga";
135                }
136        }
137
138        // Obtener nombre de fichero PXE a partir de la MAC del ordenador cliente.
139        $pxedir="/opt/opengnsys/tftpboot/menu.lst";
140        $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);
141        $macfile="$pxedir/01-" . str_replace(":","-",strtoupper($mac));
142
143        // Crear fichero de arranque a partir de la plantilla y los datos del cliente.
144        exec ("sed -e 's|vga=...||g' -e 's|INFOHOST|$infohost|g' $pxedir/templates/$bootopt > $macfile");
145        exec ("chmod 777 $macfile");
146}
147
148
149/**
150 *           deleteBootFile ($mac)
151 * @brief    Borra el fichero PXE del ordenador con la dirección MAC correspondiente.
152 * @param    {String}  mac     Dirección MAC del ordenador (sin caracteres ":").
153 * @versión  1.0.5 - Primera versión, adaptada de NetBoot Avanzado.
154 * @authors  Ramón Gómez - ETSII Universidad de Sevilla
155 * @date     2013-04-25
156 */
157function deleteBootFile ($mac) {       
158
159        // Obtener nombre de fichero a partir de dirección MAC.
160        $pxedir="/opt/opengnsys/tftpboot/menu.lst";
161        $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);
162        // Eliminar el fichero.
163        exec ("rm -f $macfile");
164}
165
166/**
167 *           updateBootMode ($cmd, $idfield, $idvalue, $lang)
168 * @brief    Ejecuta la función para componer fichero PXE para todos los clientes que cumplan
169 *           con un determinado criterio de búsqueda basado en clave ejena.
170 * @param    {Object}  cmd       Objeto de conexión con la base de datos.
171 * @param    {String}  idfield   Campo identificador de la clave ajena para buscar ordenadores.
172 * @param    {Number}  idvalue   Valor a buscar en el ídentificador de la clave ajena.
173 * @param    {String}  lang      Idioma de arranque.
174 * @versión  1.0.5 - Primera versión, adaptada de NetBoot Avanzado.
175 * @authors  Ramón Gómez - ETSII Universidad de Sevilla
176 * @date     2013-04-25
177 */
178function updateBootMode ($cmd, $idfield, $idvalue, $lang) {
179
180        // Salir si los es nulo el campo de identificador y su valor de índice.
181        if (empty ($idfield) or empty ($idvalue))
182                return;
183        // Control para evitar ataques XSS.
184        $idfield = mysql_real_escape_string ($idfield);
185        $idvalue = mysql_real_escape_string ($idvalue);
186
187        // Obtener los ordenadores asociados al aula y sus plantillas de arranque.
188        $cmd->texto = "SELECT idordenador AS hostid, arranque AS bootopt
189                         FROM ordenadores
190                        WHERE $idfield=$idvalue";
191        $rs = new Recordset;
192        $rs->Comando=&$cmd;
193        if ($rs->Abrir()) {
194                $rs->Primero();
195                while (! $rs->EOF) {
196                        $hostid=$rs->campos["hostid"];
197                        if (! empty ($hostid)) {
198                                $bootopt=$rs->campos["bootopt"];
199                                // Volver a crear el fichero de arranque.
200                                createBootMode ($cmd, $bootopt, $hostid, $lang);
201                        }
202                        $rs->Siguiente();
203                }
204                $rs->Cerrar();
205        }
206}
207
208?>
209
Note: See TracBrowser for help on using the repository browser.