<?php
/**
 * Script de la aplicación
 *
 * Para la comunicación entre el cliente y este script
 * se emplea AJAX utilizando JSON como notación para la
 * transferencia de información al cliente
 *
 * @author Jesús Algeciras <jes.algeciras@gmail.com>
 * @version 2010-10-24
 *
 * @author Alberto Martín <betolapalma@gmail.com>
 * @version 
 *
 */

if ((isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') || (isset($_POST['act']) && $_POST['act'] == 'setConmutador')
|| (isset($_POST['act']) && $_POST['act'] == 'subir')) {
	session_start();
	require_once('func_comunes.php');
	require_once('red.php');
	
	try {
		// Se lleva a cabo la petición correspondiente y se devuelve el resultado en formato JSON.
		// La estructura de la respuesta es siempre la misma:
		// array( stdout => (str),  stderr => array(error => (str), info => (str)))
		// Esta respuesta es tratada segun corresponda en el navegador mediante Javascript
		$respuesta['stdout'] = '';
		$respuesta['stderr']['error'] = FALSE; // Tipos de errores: excepcion, validacion, aplicacion
		$respuesta['stderr']['info'] = array();
		$respuesta['stdfich']= FALSE; // Por si devuelve fichero (usado para la captura)

		$log = LogFile::abrirLog();
		$database = Database::conectar();
		if (!Usuario::accesoAplicacion()) {
			$respuesta['stderr']['error'] = 'aplicacion';
			$respuesta['stderr']['info'] = array('Ya existe un usuario haciendo uso de la aplicación');
		} else {
			// Si la aplicación ya ha sido iniciada correctamente, existirá una instancia de
			// la clase Red almacenada. Se recupera dicha instancia.
			if (isset($_SESSION['red']))
				$red = unserialize($_SESSION['red']);

			switch ($_POST['act']) {
				// Inicio de la aplicación
				case 'start':
					$log->log('Iniciando la aplicación');
					Usuario::accedeRed();

					// Se obtienen los datos necesarios del archivo de configuración
					$pcs = $cnxn_red[$_SESSION['idred']]['pc'];
					$conmutadores = $cnxn_red[$_SESSION['idred']]['conmutador'];

					// Se crea y configura la red
					$red = new Red;
					foreach ($pcs as $id => $pc)
						$red->add(new PC($id, $pc['ip'], $pc['puerto']));
					foreach ($conmutadores as $id => $conmutador)
						$red->add(new Conmutador($id, $conmutador['ip'], $conmutador['password']));
					$respuesta['stderr'] = $red->loadConfig($red->defaultConfig());
					if (!$respuesta['stderr']['error'])
						$respuesta['stderr'] = $red->sendConfig();

					// Si se produce un error se aborta el inicio de la aplicación
					if ($respuesta['stderr']['error']) {
						Usuario::abandonaRed();
					} else {
						$respuesta['stdout'] = 'La aplicación ha sido iniciada con éxito';
						// Se crean cookies con la información necesaria para la aplicación
						foreach ($red->getPC() as $pc)
							setcookie('pc'.$pc->getID(), urlencode(json_encode($pc->getConfig())),mktime(substr($_SESSION['turno_fin'], 0, 2), substr($_SESSION['turno_fin'], 3, 2), 0), '/aplicacion/');
						foreach ($cnxn_red[$_SESSION['idred']]['conmutador'] as $id => $conmutador) {
							$topologia = array('modelo' => $conmutador['modelo']);
							$topologia = array('conexiones' => $used_ports[$id]);
							setcookie('conmutador'.$id, urlencode(json_encode($topologia)),mktime(substr($_SESSION['turno_fin'], 0, 2), substr($_SESSION['turno_fin'], 3, 2), 0), '/aplicacion/');
						}
						$dbdata = $database->query('SELECT * FROM configuracion WHERE usuario='.$_SESSION['idusuario']);
						for ($i = 0; $i < $dbdata->num_rows; $i++) {
							$config = $dbdata->fetch_assoc();
							setcookie('config'.$config['idconfiguracion'], urlencode(json_encode($config)), mktime(substr($_SESSION['turno_fin'], 0, 2), substr($_SESSION['turno_fin'], 3, 2), 0), '/aplicacion/');
						}
						setcookie('idred', urlencode(json_encode($_SESSION['idred'])), mktime(substr($_SESSION['turno_fin'], 0, 2), substr($_SESSION['turno_fin'], 3, 2), 0), '/aplicacion/');
						$dbdata->free();
						// Se almacena el objeto Red creado
						$_SESSION['red'] = serialize($red);
					}
					break;


				// Cierre de la aplicación
				case 'end':
					$log->log('Cerrando la aplicación');

					// Se devuelve la red a su estado por defecto
					$respuesta['stderr'] = $red->loadConfig($red->defaultConfig());
					if (!$respuesta['stderr']['error'])
						$respuesta['stderr'] = $red->sendConfig();

					if (!$respuesta['stderr']['error']) {
						unset($_SESSION['red']);
						Usuario::abandonaRed();
						$respuesta['stdout'] = 'La aplicación ha sido finalizada con éxito';
						foreach($_COOKIE as $name => $value)
							setcookie($name, $value, time() - 7200, '/aplicacion/');
					} else {
						$_SESSION['red'] = serialize($red);
					}
					break;


				// Cargar configuración
				case 'load':
					$log->log('Cargando configuración en la red');

					// Validación
					$validacion = new Validacion;
					if (!isset($_POST['confirmado']))
						$validacion->setErrores('confirmado', 'Marque la casilla de confirmación');
					if ($_POST['idconfig'] != 'default') {
						if ($validacion->esEntero('idconfig', $_POST['idconfig'])) {
							$dbdata = $database->query('SELECT * FROM configuracion WHERE usuario='.$_SESSION['idusuario'].' AND idconfiguracion='.$_POST['idconfig']);
							if ($dbdata->num_rows == 0)
								$validacion->setErrores('idconfig', 'Configuracion inexistente');
							$dbdata->free();
						}
					}

					// Carga de la configuración
					if (count($validacion->getErrores()) == 0) {
						if ($_POST['idconfig'] == 'default') {
							$respuesta['stderr'] = $red->loadConfig($red->defaultConfig());
						} else {
							$respuesta['stderr'] = $red->loadConfig($_POST['idconfig']);
						}
						if (!$respuesta['stderr']['error'])
							$respuesta['stderr'] = $red->sendConfig();

						if (!$respuesta['stderr']['error']) {
							$respuesta['stdout'] = 'La configuración ha sido cargada con éxito';
							foreach ($red->getPC() as $pc)
								setcookie('pc'.$pc->getID(), urlencode(json_encode($pc->getConfig())), mktime(substr($_SESSION['turno_fin'], 0, 2), substr($_SESSION['turno_fin'], 3, 2), 0), '/aplicacion/');
						}
					} else {
						$respuesta['stderr']['error'] = 'validacion';
						$respuesta['stderr']['info'] = $validacion->getErrores();
					}
					$_SESSION['red'] = serialize($red);
					break;


				// Almacenar configuración
				case 'store':
					$log->log('Guardando configuración');

					// Validación
					$validacion = new Validacion;
					if (!isset($_POST['confirmado']))
						$validacion->setErrores('confirmado', 'Marque la casilla de confirmación');

					$nombre = str_replace(" ","_",$_POST['nombre']);
					$validacion->esTexto('nombre', $nombre);

					if ($_POST['idconfig'] != 'new' && $validacion->esEntero('idconfig', $_POST['idconfig'])) {
						if ($validacion->esEntero('idconfig', $_POST['idconfig'])) {
							$dbdata = $database->query('SELECT default_config FROM red WHERE default_config='.$_POST['idconfig']);
							if ($dbdata->num_rows > 0)
								$validacion->setErrores('idconfig', 'No es posible sobreescribir esta configuración');
							$dbdata->free();
							if($validacion->esEntero('idconfig', $_POST['idconfig'])) {
								$dbdata = $database->query('SELECT * FROM configuracion WHERE usuario='.$_SESSION['idusuario'].' AND idconfiguracion='.$_POST['idconfig']);
								if ($dbdata->num_rows == 0)
									$validacion->setErrores('idconfig', 'Configuración inexistente');
								$dbdata->free();
							}
						}
					}

					// Se guarda la configuración en ausencia de errores
					if (count($validacion->getErrores()) == 0) {
						$respuesta['stderr'] = $red->storeConfig($_POST['idconfig'], $nombre);
						if (!$respuesta['stderr']['error']) {
							$respuesta['stdout'] = 'La configuración ha sido guardada con éxito';
							$dbdata = $database->query('SELECT * FROM configuracion WHERE usuario='.$_SESSION['idusuario']);
							for ($i = 0; $i < $dbdata->num_rows; $i++) {
								$config = $dbdata->fetch_assoc();
								setcookie('config'.$config['idconfiguracion'], urlencode(json_encode($config)), mktime(substr($_SESSION['turno_fin'], 0, 2), substr($_SESSION['turno_fin'], 3, 2), 0), '/aplicacion/');
							}
							$dbdata->free();
						}
					} else {
						$respuesta['stderr']['error'] = 'validacion';
						$respuesta['stderr']['info'] = $validacion->getErrores();
					}
					$_SESSION['red'] = serialize($red);
					break;


				// Borrar confguración
				case 'delete':
					$log->log('Borrando configuración');

					// Validación
					$validacion = new Validacion;
					if (!isset($_POST['confirmado']))
						$validacion->setErrores('confirmado', 'Marque la casilla de confirmación');
					if ($validacion->esEntero('idconfig', $_POST['idconfig'])) {
						$dbdata = $database->query('SELECT default_config FROM red WHERE default_config='.$_POST['idconfig']);
						if ($dbdata->num_rows > 0)
							$validacion->setErrores('idconfig', 'No es posible borrar esta configuración');
						$dbdata->free();
						if($validacion->esEntero('idconfig', $_POST['idconfig'])) {
							$dbdata = $database->query('SELECT * FROM configuracion WHERE usuario='.$_SESSION['idusuario'].' AND idconfiguracion='.$_POST['idconfig']);
							if ($dbdata->num_rows == 0)
								$validacion->setErrores('idconfig', 'Configuración inexistente');
							$dbdata->free();
						}
					}

					// Borrado de la configuración
					if (count($validacion->getErrores()) == 0) {
						if ($red->deleteConfig($_POST['idconfig'])) {
							$respuesta['stdout'] = 'La configuración ha sido borrada con éxito';
							setcookie('config'.$_POST['idconfig'], '', 1, '/aplicacion/');
						}
					} else {
						$respuesta['stderr']['error'] = 'validacion';
						$respuesta['stderr']['info'] = $validacion->getErrores();
					}
					$_SESSION['red'] = serialize($red);
					break;


				// Configurar PC
				case 'setPC':
					// Validación
					$validacion = new Validacion;
					if ($validacion->esEntero('id', $_POST['id'])) {
						$pc = $red->getPC($_POST['id']);
						if ($pc) {
							if (!isset($_POST['confirmado']))
								$validacion->setErrores('confirmado', 'Marque la casilla de confirmación');
							if (isset($_POST['default'])) {
								$pc->loadConfig($red->defaultConfig());
							} else {
								$config = array('ip' => $_POST['ip'],
                				'mascara' => $_POST['mascara'],
                				'puerta' => $_POST['puerta'],
                				'dns1' => $_POST['dns1'],
                				'dns2' => $_POST['dns2']);
								$validacion->esPC($config);
								if (count($validacion->getErrores()) == 0)
									$pc->setConfig($config);
							}

							// Si la configuración es valida se envia al PC
							if (count($validacion->getErrores()) == 0) {
								$respuesta['stderr'] = $pc->sendConfig();
								if (!$respuesta['stderr']['error']) {
									$respuesta['stdout'] = 'La configuración ha sido establecida con éxito';
									setcookie('pc'.$pc->getID(), urlencode(json_encode($pc->getConfig())), mktime(substr($_SESSION['turno_fin'], 0, 2), substr($_SESSION['turno_fin'], 3, 2), 0), '/aplicacion/');
								}
							} else {
								$respuesta['stderr']['error'] = 'validacion';
								$respuesta['stderr']['info'] = $validacion->getErrores();
							}
						}
					}
					$_SESSION['red'] = serialize($red);
					break;


				// Configurar Conmutador
				case 'setConmutador':
					// Validación
					$validacion = new Validacion;
					if ($validacion->esEntero('id', $_POST['id'])) {
						$conmutador = $red->getConmutador($_POST['id']);
						if ($conmutador) {
							if (!isset($_POST['confirmado']))
								$validacion->setErrores('confirmado', 'Marque la casilla de confirmación');
							if (isset($_POST['default'])) {
								$conmutador->loadConfig($red->defaultConfig());
							} elseif (count($validacion->getErrores()) == 0) {
								if ($_FILES['archivo']['error'] == UPLOAD_ERR_OK) {
									if (preg_match('/\.txt$/i', $_FILES['archivo']['name'])) {
										if ($_FILES['archivo']['size'] > 5000) {
											$validacion->setErrores('archivo', 'Tamaño de archivo excesivo');
										} else {
											$config = array();
											$config['archivo'] = FILES_TEMP.'user'.sprintf('%02d',$_SESSION['idusuario']).'conf00conm'.$_POST['id'].'.txt';
											Archivo::almacenar($_FILES['archivo']['tmp_name'], $config['archivo']);
											$validacion->esConmutador('archivo', $_SESSION['idred'], $_POST['id'], $config['archivo']);
											if (count($validacion->getErrores()) == 0)
												$conmutador->setConfig($config);
										}
									} else {
										$validacion->setErrores('archivo', 'La extension debe ser "txt"');
									}
								} else {
									$validacion->setErrores('archivo', 'El archivo no ha sido subido correctamente');
								}
							}

							// Si la configuración es valida se envia al Conmutador
							if (count($validacion->getErrores()) == 0) {
								$respuesta['stderr'] = $conmutador->sendConfig();
								if (!$respuesta['stderr']['error'])
									$respuesta['stdout'] = 'La configuración ha sido establecida con éxito';
							} else {
								$respuesta['stderr']['error'] = 'validacion';
								$respuesta['stderr']['info'] = $validacion->getErrores();
							}
						}
					}
					$_SESSION['red'] = serialize($red);
					break;
					
				// Hace una consulta show a un conmutador
				case 'show':
					// Validación
					$validacion = new Validacion;
					$conmutador = $red->getConmutador($_POST['id']);
					
					$accion = $_POST['accion'].' '.$_POST['accion2'];
					
					if ($conmutador) {
						$respuesta = $conmutador->show($accion);
					} else{
						$respuesta['stderr']['error'] = 'validacion';
						$respuesta['stderr']['info'] = array('id' => 'Conmutador desconocido');
					}
				$_SESSION['red'] = serialize($red);
				break;
				
				// Manda una orden de configuración a un conmutador
				case 'configure':
					// Validación
					$validacion = new Validacion;
					$conmutador = $red->getConmutador($_POST['id']);
					
					$accion = $_POST['accion'].' '.$_POST['accion2'];
					
					$validacion->esConmutador('accion', $_SESSION['idred'], $_POST['id'], $accion);
					
					if (count($validacion->getErrores()) == 0) {
						$respuesta = $conmutador->configure($accion);
					} else{
						$respuesta['stderr']['error'] = 'validacion';
						$respuesta['stderr']['info'] = $validacion->getErrores();
					}
				$_SESSION['red'] = serialize($red);
				break;
				
				// Ping
				case 'ping':
					// Validación
					$validacion = new Validacion;
					$paquetes = $_POST['paquetes'];
					
					if (!$validacion->esEntero('idorigen', $_POST['idorigen']) || !$validacion->esIP('ipdestino', $_POST['ipdestino'])) {
						$respuesta['stderr']['error'] = 'validacion';
						$respuesta['stderr']['info'] = $validacion->getErrores();
					} elseif ($validacion->esAdministracion($_POST['ipdestino'])) {
						$respuesta['stderr']['error'] = 'validacion';
						$respuesta['stderr']['info'] = array('ipdestino' => 'Valor no permitido');
					} elseif (!$validacion->esEntero('paquetes', $_POST['paquetes'])){
						$respuesta['stderr']['error'] = 'validacion';
						$respuesta['stderr']['info'] = array('paquetes' => 'Valor no permitido');				
					}else{
						$origen = $red->getPC($_POST['idorigen']);
						if ($origen) {
							$respuesta = $origen->ping($_POST['ipdestino'],$paquetes);
						} else {
							$respuesta['stderr']['error'] = 'validacion';
							$respuesta['stderr']['info'] = array('idorigen' => 'Origen desconocido');
						}
					}
					$_SESSION['red'] = serialize($red);
					break;
					
					// Realiza una captura de tráfico en el PC remoto
					case 'captura':
					// Validación
					$validacion = new Validacion;
					if (!$validacion->esEntero('idorigen', $_POST['idorigen'])) {
						$respuesta['stderr']['error'] = 'validacion';
						$respuesta['stderr']['info'] = $validacion->getErrores();
					} else {
						$origen = $red->getPC($_POST['idorigen']);
						if ($origen) {
							$respuesta = $origen->captura($_POST['accion'], $_SESSION['usuario']);
							
							// Se obtiene el fichero de la captura
							if($respuesta['stdfich']){
								$ficherob64 = implode($respuesta['stdfich']);
								if($ficherob64){
									$ruta = "/home/labredes/capturas/";
									$ruta = $ruta.basename($_SESSION['usuario']).'.pcap';
									$gestor = fopen($ruta,"w");
									$contenido = fwrite($gestor, base64_decode($ficherob64));
									if($contenido){
										fclose($gestor);
									} else {
										$respuesta['stderr']['error'] = 'validacion';
										$respuesta['stderr']['info'] = array('accion' => 'Fallo en fread');
									}
								}
							}
							
						} else {
							$respuesta['stderr']['error'] = 'validacion';
							$respuesta['stderr']['info'] = array('idorigen' => 'Origen desconocido');
						}
					}
					$_SESSION['red'] = serialize($red);
					break;
					
				// Muestra configuracion de la interfaz de usuario del PC remoto
				case 'ifconfig':
					// Validación
					$validacion = new Validacion;
					if (!$validacion->esEntero('idorigen', $_POST['idorigen'])) {
						$respuesta['stderr']['error'] = 'validacion';
						$respuesta['stderr']['info'] = $validacion->getErrores();
					} else {
						$origen = $red->getPC($_POST['idorigen']);
						if ($origen) {
							$respuesta = $origen->ifconfig();
						} else {
							$respuesta['stderr']['error'] = 'validacion';
							$respuesta['stderr']['info'] = array('idorigen' => 'Origen desconocido');
						}
					}
					$_SESSION['red'] = serialize($red);
					break;
					
				// Muestra tabla de rutas del PC remoto
				case 'route':
					// Validación
					$validacion = new Validacion;
					if (!$validacion->esEntero('idorigen', $_POST['idorigen'])) {
						$respuesta['stderr']['error'] = 'validacion';
						$respuesta['stderr']['info'] = $validacion->getErrores();
					} else {
						$origen = $red->getPC($_POST['idorigen']);
						if ($origen) {
							$respuesta = $origen->route();
						} else {
							$respuesta['stderr']['error'] = 'validacion';
							$respuesta['stderr']['info'] = array('idorigen' => 'Origen desconocido');
						}
					}
					$_SESSION['red'] = serialize($red);
					break;
					
				// Listado de archivos de las carpetas de usuario del PC remoto
				case 'ls':
					// Validación
					$validacion = new Validacion;
					if (!$validacion->esEntero('idorigen', $_POST['idorigen'])) {
						$respuesta['stderr']['error'] = 'validacion';
						$respuesta['stderr']['info'] = $validacion->getErrores();
					} else {
						$origen = $red->getPC($_POST['idorigen']);
						if ($origen) {
							$respuesta = $origen->ls($_POST['rol']);
						} else {
							$respuesta['stderr']['error'] = 'validacion';
							$respuesta['stderr']['info'] = array('idorigen' => 'Origen desconocido');
						}
					}
					$_SESSION['red'] = serialize($red);
					break;
					
				// Subida archivo al PC remoto
				case 'subir':
					// Validación
					$validacion = new Validacion;
					if ($validacion->esEntero('idorigen', $_POST['idorigen'])) {
						if ($_FILES['fichero']['error'] == UPLOAD_ERR_OK) {
							//if (preg_match('/\.txt$/i', $_FILES['fichero']['name'])) {
								//if ($_FILES['fichero']['size'] > 5000000) {
								//	$validacion->setErrores('fichero', 'Tamaño de archivo excesivo');
								//} else {
									$ruta = "/home/labredes/uploads/";
									$ruta = $ruta.basename($_FILES['fichero']['name']);
									// Almacena el archivo en el Servidor Web
									Archivo::almacenar($_FILES['fichero']['tmp_name'], $ruta);
								// }
							//} else {
								//$validacion->setErrores('fichero', 'La extension debe ser "txt"');
							//}
						} else {
							$validacion->setErrores('fichero', $_FILES['fichero']['error']);
						}
					}
					
					// Si no hay errores, se manda al PC remoto
					if (count($validacion->getErrores()) == 0) {
						$gestor = fopen($ruta,"r");
						$contenido = fread($gestor, filesize($ruta));
						fclose($gestor);
						if($contenido){
							$ficheroxml = base64_encode($contenido);
							if($ficheroxml){
								$origen = $red->getPC($_POST['idorigen']);
								if ($origen) {
									$respuesta = $origen->enviar($ficheroxml, $_FILES['fichero']['name']);
								} else {
									$respuesta['stderr']['error'] = 'validacion';
									$respuesta['stderr']['info'] = array('idorigen' => 'Origen desconocido');
								}
							} else{
								$respuesta['stderr']['error'] = 'validacion';
								$respuesta['stderr']['info'] = array('fichero' => 'Problemas en la subida');
							}
						} else {
							$respuesta['stderr']['error'] = 'validacion';
							$respuesta['stderr']['info'] = array('fichero' => 'Problemas en la subida');
						}
					} else {
						$respuesta['stderr']['error'] = 'validacion';
						$respuesta['stderr']['info'] = $validacion->getErrores();
					}
					
					$_SESSION['red'] = serialize($red);
					break;
					
					// Borra los archivos de la carpeta de usuario especificada
					case 'borrar':
					// Validación
					$validacion = new Validacion;
					if (!$validacion->esEntero('idorigen', $_POST['idorigen'])) {
						$respuesta['stderr']['error'] = 'validacion';
						$respuesta['stderr']['info'] = $validacion->getErrores();
					} else {
						$origen = $red->getPC($_POST['idorigen']);
						if ($origen) {
							$respuesta = $origen->borrar($_POST['rol']);
						} else {
							$respuesta['stderr']['error'] = 'validacion';
							$respuesta['stderr']['info'] = array('idorigen' => 'Origen desconocido');
						}
					}
					$_SESSION['red'] = serialize($red);
					break;
					
				//  Transferencia de archivos por TFTP
				case 'tftp':
					// Validación
					$validacion = new Validacion;
					if (!$validacion->esEntero('idcliente', $_POST['idcliente']) || !$validacion->esIP('ipservidor', $_POST['ipservidor'])) {
						$respuesta['stderr']['error'] = 'validacion';
						$respuesta['stderr']['info'] = $validacion->getErrores();
					} elseif ($validacion->esAdministracion($_POST['ipservidor'])) {
						$respuesta['stderr']['error'] = 'validacion';
						$respuesta['stderr']['info'] = array('ipservidor' => 'Valor no permitido');
					} elseif (!$validacion->noNulo('archivo', $_POST['archivo'])){
						$respuesta['stderr']['error'] = 'validacion';
						$respuesta['stderr']['info'] = array('archivo' => 'Valor nulo no permitido');
					} else {
						$cliente = $red->getPC($_POST['idcliente']);
						if ($cliente) {
							$respuesta = $cliente->tftp($_POST['ipservidor'], $_POST['archivo']);
						} else {
							$respuesta['stderr']['error'] = 'validacion';
							$respuesta['stderr']['info'] = array('idcliente' => 'Cliente desconocido');
						}
					}
					$_SESSION['red'] = serialize($red);
					break;
					
					// Transferencia de archivos mediante la orden WGET
					case 'wget':
					// Validación
					$validacion = new Validacion;
					if (!$validacion->esEntero('idcliente', $_POST['idcliente']) || !$validacion->esIP('ipservidor', $_POST['ipservidor'])) {
						$respuesta['stderr']['error'] = 'validacion';
						$respuesta['stderr']['info'] = $validacion->getErrores();
					} elseif ($validacion->esAdministracion($_POST['ipservidor'])) {
						$respuesta['stderr']['error'] = 'validacion';
						$respuesta['stderr']['info'] = array('ipservidor' => 'Valor no permitido');
					} elseif (!$validacion->noNulo('archivo', $_POST['archivo'])){
						$respuesta['stderr']['error'] = 'validacion';
						$respuesta['stderr']['info'] = array('archivo' => 'Valor nulo no permitido');
					} else {
						$origen = $red->getPC($_POST['idcliente']);
						if ($origen) {
							$respuesta = $origen->wget($_POST['ipservidor'], $_POST['archivo']);
						} else {
							$respuesta['stderr']['error'] = 'validacion';
							$respuesta['stderr']['info'] = array('idcliente' => 'Cliente desconocido');
						}
					}
					$_SESSION['red'] = serialize($red);
					break;
			}
		}

		// Resultado de la operación
		echo json_encode(array('stdout' => $respuesta['stdout'], 'stderr' => array('error' => $respuesta['stderr']['error'], 'info' => $respuesta['stderr']['info'])));
	}
	catch (Exception $excepcion) {
		if ($_POST['act'] == 'start')
			Usuario::abandonaRed();
		if (Usuario::esAdmin()) {
			echo json_encode(array('stdout' => '', 'stderr' => array('error' => 'excepcion', 'info' => array((string) $excepcion))));
		} else {
			echo json_encode(array('stdout' => '', 'stderr' => array('error' => 'excepcion', 'info' => array('Se ha producido un error grave durante su petición. Pongase en contacto con el administrador de la aplicación.'))));
		}
		exit();
	}
} else {
	header('HTTP/1.1 403 Forbidden');
}
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es">
	<head>
            <title>e-REdING. Biblioteca de la Escuela Superior de Ingenieros de Sevilla.</title>

                <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="description" content="Buscador de proyectos ETSI" />
<meta name="author" content="Daniel Callejo"/>
<meta name="author" content="Federico L&oacute;pez"/>
<meta name="author" content="Juli&aacute;n P&eacute;rez"/>
<meta name="author" content="Jos&eacute; Mar&iacute;a Vidal Vidal"/>
<base href="/bibing/proyectos/" /><link rel="shortcut icon" href="./favicon.ico" />
<link rel="stylesheet" href="./publico/css/estructura.css" type="text/css" />
<link rel="stylesheet" href="./publico/css/bootstrap.css" type="text/css" media="screen"/>
<link rel="stylesheet" href="./publico/css/enlaces-capas.css" type="text/css"  />
<link rel="stylesheet" href="./publico/css/pestanas.css" type="text/css"  /> 
<link rel="stylesheet" href="./publico/css/formularios.css" type="text/css" />
<link rel="stylesheet" href="./publico/css/lightbox.css" type="text/css"  />
<link rel="stylesheet" href="./publico/css/autocompleter.css" type="text/css"  />
<link rel="stylesheet" href="./publico/css/resultados.css" type="text/css"  />
<link rel="stylesheet" href="./publico/css/milista.css" type="text/css"  />
<link rel="stylesheet" href="./publico/css/explorador.css" type="text/css"  />
<link rel="stylesheet" href="./publico/css/ultimos.css" type="text/css"  />
<link rel="stylesheet" href="./publico/css/contactar.css" type="text/css"  />
<!-- <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" /> -->
<script src="./publico/javascript/jquery-1.9.1.min.js" type="text/javascript"></script>
<script src="./publico/javascript/bootstrap.js" type="text/javascript"></script>

<script src="./publico/javascript/mootools-1.2.4-core.js" type="text/javascript"></script>
<script src="./publico/javascript/mootools-1-1.2.4.2-more.js" type="text/javascript"></script>
<script src="./publico/javascript/targetbl.js" type="text/javascript"></script>
<script src="./publico/javascript/mensajes.js" type="text/javascript"></script>
<script src="./publico/javascript/form.js" type="text/javascript"></script>
<script src="./publico/javascript/autocompleter/Observer.js" type="text/javascript"></script>
<script src="./publico/javascript/autocompleter/Autocompleter.js" type="text/javascript"></script>
<script src="./publico/javascript/autocompleter/Autocompleter.Request.js" type="text/javascript"></script>
<script src="./publico/javascript/domready.js" type="text/javascript"></script>

<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-8T1TSNC1QY"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'G-8T1TSNC1QY');
</script>



<script type="text/javascript">
function seleccionar_todo(){
   for (i=0;i<document.formulario_marcados.elements.length;i++)
      if(document.formulario_marcados.elements[i].type == "checkbox")
         document.formulario_marcados.elements[i].checked=1
}
function deseleccionar_todo(){
   for (i=0;i<document.formulario_marcados.elements.length;i++)
      if(document.formulario_marcados.elements[i].type == "checkbox")
         document.formulario_marcados.elements[i].checked=0
} 
</script>
	</head>
    <body style="min-width: 960px; background-color: #e2e2e2; height: 100%">	
		<a name="arriba"></a>
<div>
<div id="header">
    <table id="Tabla_01" height="105" border="0" cellpadding="0" cellspacing="0">
    <tr>
        <td>
            <img src="./publico/imagenes/cabecera/banner_new2_01.jpg" width="3" height="105" alt="">
        </td>
        <td>
            <img src="./publico/imagenes/cabecera/banner_new2_02.jpg" width="100" height="105" alt="">
        </td>
        <td width="100%" align="right"  style="min-width: 613px; background-repeat: no-repeat; background-position: top right; font-size: medium; font-weight: bold; color: white;">
            <table width="100%" height="105" border="0">
                <tr>
                    <td style=" vertical-align: top; width: 547px">
                        <!-- <a style="text-decoration: none" href="./"><img src="./publico/imagenes/cabecera/banner_new2_03.jpg"alt=""></a> -->
                        <a style="text-decoration: none" href="/bibing/proyectos/"><img src="./publico/imagenes/cabecera/banner_new2_03.jpg"alt=""></a>
                     </td>
                     <td  background="./publico/imagenes/cabecera/banner_new2_04.jpg" style="background-repeat: no-repeat; background-color: #c6d4e8;"><br><br><br>
                         &nbsp;
                        </td>
                    </tr>
             </table>
        </td>
    </tr>
    <tr style="border-top: 1px solid #ffffff;">
        <td colspan="3" id="menu_sup" style="font-size: small; text-align: right; background-color: #9c1f2f; vertical-align: bottom">
             
					<a href="/bibing/proyectos/" class="enlace " style=" color: #ffffff">Inicio&nbsp;&nbsp;|</a>
					<a href="/bibing/proyectos/acerca/" style=" color: #ffffff" class="enlace ">&nbsp;&nbsp;Acerca de&nbsp;&nbsp;|</a>
					
					<a href="/bibing/proyectos/contactar/" style=" color: #ffffff" class="enlace ">&nbsp;&nbsp;Contactar&nbsp;&nbsp;</a>
			 <!--       <a href="/bibing/proyectos/ayuda/" style=" color: #ffffff" class="enlace  ">&nbsp;&nbsp;Ayuda&nbsp;&nbsp;|</a> -->
					<!-- <form id="idioma" class=""  method="post" action="">
					<div class="inline" style="color: white">
					<input type="submit" class="tipo_letra " style=" color: #ffffff"name="idioma" value="Castellanossss" />&nbsp;&nbsp;
					</div>	
					</form> -->
			        </td>

    </tr>
    </table>
</div>
<br><br>
<div class="colmask rightmenu">
<div class="panel panel-default" style="margin:20px">
            <div class="panel-heading"><h4>DESARROLLO DE UN ENTORNO DE PRÁCTICAS PARA REDES MULTISERVICIO</h4><h5 style="color:grey"><span class="glyphicon glyphicon-user""></span> : <b>MARTÍN REDONDO, ALBERTO JESÚS</b><br><span class="glyphicon glyphicon-book""></span>  :<b> Ingenier&iacute;a Telecomunicación</b></h5></div><div class="panel-body"><div class="contenido_proyecto"><div class="titulo2_explorador">Contenido del proyecto:</div><div class="ruta"><a href="use/abreproy/12106">Directorio ra&iacute;z</a>&nbsp;&nbsp;>&nbsp;&nbsp;<a href="use/abreproy/12106/direccion/ARCHIVOS%252F">ARCHIVOS</a>&nbsp;&nbsp;>&nbsp;&nbsp;<a href="use/abreproy/12106/direccion/ARCHIVOS%252Fredes%252F">redes</a>&nbsp;&nbsp;>&nbsp;&nbsp;<a href="use/abreproy/12106/direccion/ARCHIVOS%252Fredes%252Fadmin%252F">admin</a>&nbsp;&nbsp;>&nbsp;&nbsp;<a href="use/abreproy/12106/direccion/ARCHIVOS%252Fredes%252Fadmin%252Faplicacion.php%252F">aplicacion.php</a></div><div class="listing"></div></div></div></div>
</div>
</div>

        
	</body>
 
 
<!-- Inicio Google Analytics -->
<!--
	<script type="text/javascript">
		var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
		document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
	</script>
	
	<script type="text/javascript">
		try {
		var pageTracker = _gat._getTracker("UA-7789620-1");
		pageTracker._trackPageview();
	} 
		catch(err) {}
	</script>
-->
<!-- Fin Google Analytics -->

</html>

