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

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 b584da5 was 0c86fb7, checked in by irina <irinagomez@…>, 9 years ago

#678 Se incluye la unidad organizativa como parametro del kernel: ogunit=directorio_unidad

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

  • Property mode set to 100644
File size: 8.2 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
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.
[7894c0a]32 * @return   float    Versión del Kernel (Versión.Revisión, con 2 decimales).
[8c2a78c]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
[7894c0a]41        // Devolver versión del Kernel (Versión.Revisión, con 2 decimales).
42        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]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.
[0c86fb7]54 * @version  1.0.5 - Primera versión, adaptada de NetBoot Avanzado.
55 * @author  Ramón Gómez - ETSII Universidad de Sevilla
[8c2a78c]56 * @date     2013-04-25
[0c86fb7]57 * @version  1.1.0 - Se incluye la unidad organizativa como parametro del kernel: ogunit=directorio_unidad (ticket #678).
58 * @author   Irina Gómez - ETSII Universidad de Sevilla
59 * @date     2015-12-16
[8c2a78c]60 */
61function createBootMode ($cmd, $bootopt, $hostid, $lang) {     
62
63        // Plantilla con las opciones por defecto.
64        if (empty ($bootopt))  $bootopt = "00unknown";
65
66        // Actualizar opción de arranque para el equipo.
67        $cmd->CreaParametro("@arranque",$bootopt,0);
68        $cmd->CreaParametro("@idordenador",$hostid,1);
69        $cmd->texto="UPDATE ordenadores SET arranque=@arranque WHERE idordenador=@idordenador";
70        $cmd->Ejecutar();
71
72        // Obtener información de la base de datos.
73        $cmd->texto="SELECT ordenadores.nombreordenador AS hostname, ordenadores.ip AS ip,
74                            ordenadores.mac AS mac, ordenadores.netiface AS netiface,
75                            aulas.netmask AS netmask, aulas.router AS router,
[e38ac22]76                            aulas.ntp AS ntp, aulas.dns AS dns, aulas.proxy AS proxy,
[8c2a78c]77                            aulas.nombreaula AS grupo, repositorios.ip AS iprepo,
78                            (SELECT ipserveradm FROM entornos LIMIT 1) AS ipserveradm,
[0c86fb7]79                            menus.resolucion AS vga, perfileshard.winboot AS winboot,
80                            centros.directorio, entidades.ogunit
[8c2a78c]81                        FROM ordenadores
82                        JOIN aulas USING (idaula)
[0c86fb7]83                        JOIN centros USING (idcentro)
84                        JOIN entidades USING (identidad)
[8c2a78c]85                        JOIN repositorios USING (idrepositorio)
86                        LEFT JOIN menus USING (idmenu)
87                        LEFT JOIN perfileshard USING (idperfilhard)
88                        WHERE ordenadores.idordenador='$hostid'";
89
90        $rs=new Recordset;
91        $rs->Comando=&$cmd;
92        if (!$rs->Abrir())  return;
93        $rs->Primero();
94        $hostname=$rs->campos["hostname"];
95        $ip=$rs->campos["ip"];
96        $mac=$rs->campos["mac"];
97        $netiface=$rs->campos["netiface"];
98        $netmask=$rs->campos["netmask"];
99        $router=$rs->campos["router"];
[e38ac22]100        $ntp=$rs->campos["ntp"];
[8c2a78c]101        $dns=$rs->campos["dns"];
102        $proxy=$rs->campos["proxy"];
103        $group=cleanString($rs->campos["grupo"]);
104        $repo=$rs->campos["iprepo"];
105        $server=$rs->campos["ipserveradm"];
106        $vga=$rs->campos["vga"];
107        $winboot=$rs->campos["winboot"];
[0c86fb7]108        $ogunit=$rs->campos["ogunit"];
109        if ($ogunit == 0 or $rs->campos["directorio"] == null) {
110                $directorio="" ;
111        } else {
112                $directorio=$rs->campos["directorio"];
113        }
[8c2a78c]114
115        $rs->Cerrar();
116
117        // Componer código de idioma para el parámetro de arranque.
118        switch ($lang) {
119                case "eng":
120                        $lang="en_GB";
121                        break;
122                case "esp":
123                        $lang="es_ES";
124                        break;
125                case "cat":
126                        $lang="ca_ES";
127                        break;
128        }
129
130        // Componer parámetros del kernel.
131        $infohost=" LANG=$lang".
132                  " ip=$ip:$server:$router:$netmask:$hostname:$netiface:none" .
133                  " group=$group" .
134                  " ogrepo=$repo" .
135                  " oglive=$repo" .
136                  " oglog=$server" .
137                  " ogshare=$server";
138        // Añadir parámetros opcionales.
[e38ac22]139        if (! empty ($ntp))     { $infohost.=" ogntp=$ntp"; }
[8c2a78c]140        if (! empty ($dns))     { $infohost.=" ogdns=$dns"; }
141        if (! empty ($proxy))   { $infohost.=" ogproxy=$proxy"; }
142        if (! empty ($winboot)) { $infohost.=" winboot=$winboot"; }
143        // Comprobar si se usa el parámetro "vga" (número de 3 cifras) o "video" (cadena).
144        if (! empty ($vga)) {
[18779c5]145                // UHU - Se sustituye la función is_int por is_numeric, ya que al ser un string no funciona bien con is_int
146                if (is_numeric($vga) && strlen($vga) == 3) {
[8c2a78c]147                        $infohost.=" vga=$vga";
148                } else {
149                        $infohost.=" video=$vga";
150                }
151        }
[0c86fb7]152        if (! empty ($directorio)) { $infohost.=" ogunit=$directorio"; }
[18779c5]153       
[8c2a78c]154        // Obtener nombre de fichero PXE a partir de la MAC del ordenador cliente.
155        $pxedir="/opt/opengnsys/tftpboot/menu.lst";
156        $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);
157        $macfile="$pxedir/01-" . str_replace(":","-",strtoupper($mac));
158
159        // Crear fichero de arranque a partir de la plantilla y los datos del cliente.
[18779c5]160        // UHU - si el parametro vga no existe, no se quita.
161        if (! empty ($vga)) {
162                exec ("sed -e 's|vga=...||g' -e 's|INFOHOST|$infohost|g' $pxedir/templates/$bootopt > $macfile");
163        }
164        else{
165                exec ("sed -e 's|INFOHOST|$infohost|g' $pxedir/templates/$bootopt > $macfile");
166        }
[8c2a78c]167        exec ("chmod 777 $macfile");
168}
169
170
171/**
172 *           deleteBootFile ($mac)
173 * @brief    Borra el fichero PXE del ordenador con la dirección MAC correspondiente.
174 * @param    {String}  mac     Dirección MAC del ordenador (sin caracteres ":").
175 * @versión  1.0.5 - Primera versión, adaptada de NetBoot Avanzado.
176 * @authors  Ramón Gómez - ETSII Universidad de Sevilla
177 * @date     2013-04-25
178 */
179function deleteBootFile ($mac) {       
180
181        // Obtener nombre de fichero a partir de dirección MAC.
182        $pxedir="/opt/opengnsys/tftpboot/menu.lst";
183        $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);
184        // Eliminar el fichero.
185        exec ("rm -f $macfile");
186}
187
188/**
189 *           updateBootMode ($cmd, $idfield, $idvalue, $lang)
190 * @brief    Ejecuta la función para componer fichero PXE para todos los clientes que cumplan
191 *           con un determinado criterio de búsqueda basado en clave ejena.
192 * @param    {Object}  cmd       Objeto de conexión con la base de datos.
193 * @param    {String}  idfield   Campo identificador de la clave ajena para buscar ordenadores.
194 * @param    {Number}  idvalue   Valor a buscar en el ídentificador de la clave ajena.
195 * @param    {String}  lang      Idioma de arranque.
196 * @versión  1.0.5 - Primera versión, adaptada de NetBoot Avanzado.
197 * @authors  Ramón Gómez - ETSII Universidad de Sevilla
198 * @date     2013-04-25
199 */
200function updateBootMode ($cmd, $idfield, $idvalue, $lang) {
201
202        // Salir si los es nulo el campo de identificador y su valor de índice.
203        if (empty ($idfield) or empty ($idvalue))
204                return;
205        // Control para evitar ataques XSS.
206        $idfield = mysql_real_escape_string ($idfield);
207        $idvalue = mysql_real_escape_string ($idvalue);
208
209        // Obtener los ordenadores asociados al aula y sus plantillas de arranque.
210        $cmd->texto = "SELECT idordenador AS hostid, arranque AS bootopt
211                         FROM ordenadores
212                        WHERE $idfield=$idvalue";
213        $rs = new Recordset;
214        $rs->Comando=&$cmd;
215        if ($rs->Abrir()) {
216                $rs->Primero();
217                while (! $rs->EOF) {
218                        $hostid=$rs->campos["hostid"];
219                        if (! empty ($hostid)) {
220                                $bootopt=$rs->campos["bootopt"];
221                                // Volver a crear el fichero de arranque.
222                                createBootMode ($cmd, $bootopt, $hostid, $lang);
223                        }
224                        $rs->Siguiente();
225                }
226                $rs->Cerrar();
227        }
228}
229
230?>
231
Note: See TracBrowser for help on using the repository browser.