/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)}}'"); } /** * 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. * @version 1.0.5 - Primera versión, adaptada de NetBoot Avanzado (Antonio J. Doblas Viso - Universidad de Málaga) * @author Ramón Gómez - ETSII Universidad de Sevilla * @date 2013-04-25 * @version 1.1.0 - Se incluye la unidad organizativa como parametro del kernel: ogunit=directorio_unidad (ticket #678). * @author Irina Gómez - ETSII Universidad de Sevilla * @date 2015-12-16 * @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). * @author Antonio J. Doblas Viso - Universidad de Malaga * @date 2017-06-01 * @version 1.1.0 - Se incluye el nombre del perfil hardware y se elimina el winboot (ticket #828). * @author Antonio J. Doblas Viso - Universidad de Malaga * @date 2018-01-21 */ 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, ordenadores.oglivedir AS oglivedir, aulas.netmask AS netmask, aulas.router AS router, aulas.ntp AS ntp, 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.descripcion AS hardprofile, centros.directorio, entidades.ogunit FROM ordenadores JOIN aulas USING (idaula) JOIN centros USING (idcentro) JOIN entidades USING (identidad) 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"]; $ntp=$rs->campos["ntp"]; $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"]; $hardprofile=cleanString($rs->campos["hardprofile"]); $oglivedir=$rs->campos["oglivedir"]; $ogunit=$rs->campos["ogunit"]; if ($ogunit == 0 or $rs->campos["directorio"] == null) { $directorio="" ; } else { $directorio=$rs->campos["directorio"]; } $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=$server" . " oglog=$server" . " ogshare=$server"; // Añadir parámetros opcionales. if (! empty ($ntp)) { $infohost.=" ogntp=$ntp"; } if (! empty ($dns)) { $infohost.=" ogdns=$dns"; } if (! empty ($proxy)) { $infohost.=" ogproxy=$proxy"; } if (! empty ($hardprofile)) { $infohost.=" hardprofile=$hardprofile"; } // Comprobar si se usa el parámetro "vga" (número de 3 cifras) o "video" (cadena). if (! empty ($vga)) { // UHU - Se sustituye la función is_int por is_numeric, ya que al ser un string no funciona bien con is_int if (is_numeric($vga) && strlen($vga) == 3) { $infohost.=" vga=$vga"; } else { $infohost.=" video=$vga"; } } if (! empty ($directorio)) { $infohost.=" ogunit=$directorio"; } $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. // UHU - si el parametro vga no existe, no se quita. if (! empty ($vga)) { exec("sed -e 's|vga=...||g; s|INFOHOST|$infohost|g; s|set ISODIR=.*|set ISODIR=$oglivedir|g' " . PXEDIR . "/templates/$bootopt > $macfile"); } else{ 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"); } chmod($macfile, 0777); } /** * 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. $mac = strtoupper($mac); $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. @unlink($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 = mysqli_real_escape_string ($cmd->Conexion->controlador, $idfield); $idvalue = mysqli_real_escape_string ($cmd->Conexion->controlador, $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(); } } /** * updateBootRepo ($cmd, $repoid) * @brief Actualiza la IP del repositorio en los ficheros PXE de todos sus equipos asociados. * @param {Object} cmd Objeto de conexión con la base de datos * @param {Integer} repoid Campo identificador del repositorio * @return {Integer} 0, sin errores; -1, error acceso a BD; >0, ficheros no modificados * @versión 1.1.0 - Primera versión. * @authors Ramón Gómez - ETSII Universidad de Sevilla * @date 2018-01-19 */ function updateBootRepo ($cmd, $repoid) { $errors = 0; // Obtener todas las MAC de los ordenadores incluidos en el repositorio. $cmd->texto = "SELECT UPPER(ordenadores.mac) AS mac, repositorios.ip AS iprepo FROM ordenadores JOIN repositorios USING (idrepositorio) WHERE ordenadores.idrepositorio = '$repoid'"; $rs = new Recordset; $rs->Comando=&$cmd; if ($rs->Abrir()) { $rs->Primero(); while (! $rs->EOF) { $mac = $rs->campos["mac"]; $repo = $rs->campos["iprepo"]; // Obtener nombre de fichero PXE a partir de la MAC del ordenador cliente. $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); // Actualizar parámetro "ogrepo" en el fichero PXE. if ($pxecode = @file_get_contents($macfile)) { $pxecode = preg_replace("/ogrepo=[^ ]*/", "ogrepo=$repo", $pxecode); if (! @file_put_contents($macfile, $pxecode)) { $erros++; } } $rs->Siguiente(); } $rs->Cerrar(); } else { $errors = -1; } return($errors); } ?>