summaryrefslogtreecommitdiffstats
path: root/admin/WebConsole/includes/tftputils.php
diff options
context:
space:
mode:
authorramon <ramongomez@us.es>2013-05-03 12:03:59 +0000
committerramon <ramongomez@us.es>2013-05-03 12:03:59 +0000
commit8c2a78c33d5d7059fa1040b20ca17b2473b7b746 (patch)
tree4515d534e407069920e24d980f6cefad5e806c16 /admin/WebConsole/includes/tftputils.php
parent09f400081ab9935634bcf724a516c291a398a209 (diff)
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
Diffstat (limited to 'admin/WebConsole/includes/tftputils.php')
-rw-r--r--admin/WebConsole/includes/tftputils.php209
1 files changed, 209 insertions, 0 deletions
diff --git a/admin/WebConsole/includes/tftputils.php b/admin/WebConsole/includes/tftputils.php
new file mode 100644
index 00000000..aa22571e
--- /dev/null
+++ b/admin/WebConsole/includes/tftputils.php
@@ -0,0 +1,209 @@
+<?php
+/**
+ * @file tftptools.php
+ * @brief Utilidades para menejar ficheros de arranque TFTP/PXE.
+ * @version 1.0.5
+ * @copyright GNU Public License v3+
+ */
+
+
+// Ficheros de inclusión.
+include_once("../includes/ctrlacc.php");
+include_once("../clases/AdoPhp.php");
+
+
+/**
+ * @brief Sustituye espacio por "_" y quita acentos y tildes.
+ * @param cadena Cadena a modificar.
+ * @return string Cadena modificada.
+ * @versión 1.0.5 - Primera versión, adaptada de NetBoot Avanzado.
+ * @author
+ * @date
+*/
+function cleanString ($cadena) {
+ return strtr ($cadena, " áéíóúñçÁÉÍÓÚÑÇ", "_aeiouncAEIOUNC");
+}
+
+
+/**
+ * Función que obtiene la versión del Kernel del cliente que se ejecuta durante el
+ * proceso de arranque mediante TFTP/PXE.
+ * @brief Obtiene la versión del Kernel usada en arranque TFTP/PXE.
+ * @return {String} Versión del Kernel.
+ * @versión 1.0.5 - Versión inicial.
+ * @authors Ramón Gómez - ETSII Universidad de Sevilla
+ * @date 2013-04-11
+ */
+function clientKernelVersion () {
+ $tftpDir = "/opt/opengnsys/tftpboot"; // Directorio TFTP.
+ $kernelFile = "$tftpDir/ogclient/ogvmlinuz"; // Fichero del Kernel
+
+ // Devolver versión del Kernel (8ª palabra del tipo de fichero).
+ return exec ("file -b $kernelFile 2>/dev/null | cut -f8 -d' '");
+}
+
+
+/**
+ * createBootMode ($cmd, $bootopt, $hostid, $lang)
+ * @brief Crea un fichero PXE para el ordenador basado en la plantilla indicada y usando
+ * los datos almacenados en la BD.
+ * @param {Object} cmd Objeto de conexión a la base de datos.
+ * @param {String} bootopt Plantilla de arranque PXE.
+ * @param {Number} hostid Id. del ordenador.
+ * @param {String} lang Idioma de arranque.
+ * @versión 1.0.5 - Primera versión, adaptada de NetBoot Avanzado.
+ * @authors Ramón Gómez - ETSII Universidad de Sevilla
+ * @date 2013-04-25
+ */
+function createBootMode ($cmd, $bootopt, $hostid, $lang) {
+
+ // Plantilla con las opciones por defecto.
+ if (empty ($bootopt)) $bootopt = "00unknown";
+
+ // Actualizar opción de arranque para el equipo.
+ $cmd->CreaParametro("@arranque",$bootopt,0);
+ $cmd->CreaParametro("@idordenador",$hostid,1);
+ $cmd->texto="UPDATE ordenadores SET arranque=@arranque WHERE idordenador=@idordenador";
+ $cmd->Ejecutar();
+
+ // Obtener información de la base de datos.
+ $cmd->texto="SELECT ordenadores.nombreordenador AS hostname, ordenadores.ip AS ip,
+ ordenadores.mac AS mac, ordenadores.netiface AS netiface,
+ aulas.netmask AS netmask, aulas.router AS router,
+ aulas.dns AS dns, aulas.proxy AS proxy,
+ aulas.nombreaula AS grupo, repositorios.ip AS iprepo,
+ (SELECT ipserveradm FROM entornos LIMIT 1) AS ipserveradm,
+ menus.resolucion AS vga, perfileshard.winboot AS winboot
+ FROM ordenadores
+ JOIN aulas USING (idaula)
+ JOIN repositorios USING (idrepositorio)
+ LEFT JOIN menus USING (idmenu)
+ LEFT JOIN perfileshard USING (idperfilhard)
+ WHERE ordenadores.idordenador='$hostid'";
+
+ $rs=new Recordset;
+ $rs->Comando=&$cmd;
+ if (!$rs->Abrir()) return;
+ $rs->Primero();
+ $hostname=$rs->campos["hostname"];
+ $ip=$rs->campos["ip"];
+ $mac=$rs->campos["mac"];
+ $netiface=$rs->campos["netiface"];
+ $netmask=$rs->campos["netmask"];
+ $router=$rs->campos["router"];
+ $dns=$rs->campos["dns"];
+ $proxy=$rs->campos["proxy"];
+ $group=cleanString($rs->campos["grupo"]);
+ $repo=$rs->campos["iprepo"];
+ $server=$rs->campos["ipserveradm"];
+ $vga=$rs->campos["vga"];
+ $winboot=$rs->campos["winboot"];
+
+ $rs->Cerrar();
+
+ // Componer código de idioma para el parámetro de arranque.
+ switch ($lang) {
+ case "eng":
+ $lang="en_GB";
+ break;
+ case "esp":
+ $lang="es_ES";
+ break;
+ case "cat":
+ $lang="ca_ES";
+ break;
+ }
+
+ // Componer parámetros del kernel.
+ $infohost=" LANG=$lang".
+ " ip=$ip:$server:$router:$netmask:$hostname:$netiface:none" .
+ " group=$group" .
+ " ogrepo=$repo" .
+ " oglive=$repo" .
+ " oglog=$server" .
+ " ogshare=$server";
+ // Añadir parámetros opcionales.
+ if (! empty ($dns)) { $infohost.=" ogdns=$dns"; }
+ if (! empty ($proxy)) { $infohost.=" ogproxy=$proxy"; }
+ if (! empty ($winboot)) { $infohost.=" winboot=$winboot"; }
+ // Comprobar si se usa el parámetro "vga" (número de 3 cifras) o "video" (cadena).
+ if (! empty ($vga)) {
+ if (is_int ($vga) and strlen ($vga) == 3) {
+ $infohost.=" vga=$vga";
+ } else {
+ $infohost.=" video=$vga";
+ }
+ }
+
+ // Obtener nombre de fichero PXE a partir de la MAC del ordenador cliente.
+ $pxedir="/opt/opengnsys/tftpboot/menu.lst";
+ $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);
+ $macfile="$pxedir/01-" . str_replace(":","-",strtoupper($mac));
+
+ // Crear fichero de arranque a partir de la plantilla y los datos del cliente.
+ exec ("sed -e 's|vga=...||g' -e 's|INFOHOST|$infohost|g' $pxedir/templates/$bootopt > $macfile");
+ exec ("chmod 777 $macfile");
+}
+
+
+/**
+ * deleteBootFile ($mac)
+ * @brief Borra el fichero PXE del ordenador con la dirección MAC correspondiente.
+ * @param {String} mac Dirección MAC del ordenador (sin caracteres ":").
+ * @versión 1.0.5 - Primera versión, adaptada de NetBoot Avanzado.
+ * @authors Ramón Gómez - ETSII Universidad de Sevilla
+ * @date 2013-04-25
+ */
+function deleteBootFile ($mac) {
+
+ // Obtener nombre de fichero a partir de dirección MAC.
+ $pxedir="/opt/opengnsys/tftpboot/menu.lst";
+ $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);
+ // Eliminar el fichero.
+ exec ("rm -f $macfile");
+}
+
+/**
+ * updateBootMode ($cmd, $idfield, $idvalue, $lang)
+ * @brief Ejecuta la función para componer fichero PXE para todos los clientes que cumplan
+ * con un determinado criterio de búsqueda basado en clave ejena.
+ * @param {Object} cmd Objeto de conexión con la base de datos.
+ * @param {String} idfield Campo identificador de la clave ajena para buscar ordenadores.
+ * @param {Number} idvalue Valor a buscar en el ídentificador de la clave ajena.
+ * @param {String} lang Idioma de arranque.
+ * @versión 1.0.5 - Primera versión, adaptada de NetBoot Avanzado.
+ * @authors Ramón Gómez - ETSII Universidad de Sevilla
+ * @date 2013-04-25
+ */
+function updateBootMode ($cmd, $idfield, $idvalue, $lang) {
+
+ // Salir si los es nulo el campo de identificador y su valor de índice.
+ if (empty ($idfield) or empty ($idvalue))
+ return;
+ // Control para evitar ataques XSS.
+ $idfield = mysql_real_escape_string ($idfield);
+ $idvalue = mysql_real_escape_string ($idvalue);
+
+ // Obtener los ordenadores asociados al aula y sus plantillas de arranque.
+ $cmd->texto = "SELECT idordenador AS hostid, arranque AS bootopt
+ FROM ordenadores
+ WHERE $idfield=$idvalue";
+ $rs = new Recordset;
+ $rs->Comando=&$cmd;
+ if ($rs->Abrir()) {
+ $rs->Primero();
+ while (! $rs->EOF) {
+ $hostid=$rs->campos["hostid"];
+ if (! empty ($hostid)) {
+ $bootopt=$rs->campos["bootopt"];
+ // Volver a crear el fichero de arranque.
+ createBootMode ($cmd, $bootopt, $hostid, $lang);
+ }
+ $rs->Siguiente();
+ }
+ $rs->Cerrar();
+ }
+}
+
+?>
+