summaryrefslogtreecommitdiffstats
path: root/admin/WebConsole
diff options
context:
space:
mode:
authorramon <ramongomez@us.es>2016-04-26 13:13:57 +0000
committerramon <ramongomez@us.es>2016-04-26 13:13:57 +0000
commit15acccdf950630f68cd77ed1e7abf6e4c34dc40e (patch)
tree4d584a525dd5d912c16238e1e446b013fd1151d2 /admin/WebConsole
parentdbbe6893690f7687e03b05d42e1d96ae88446f02 (diff)
#743: Integrar código del ticket:743 en rama de desarrollo.
git-svn-id: https://opengnsys.es/svn/branches/version1.1@4904 a21b9725-9963-47de-94b9-378ad31fedc9
Diffstat (limited to 'admin/WebConsole')
-rw-r--r--admin/WebConsole/comandos/gestores/wakeonlan_repo.php76
-rw-r--r--admin/WebConsole/gestores/gestor_repositorios.php8
-rw-r--r--admin/WebConsole/idiomas/php/cat/propiedades_repositorios_cat.php1
-rw-r--r--admin/WebConsole/idiomas/php/eng/propiedades_repositorios_eng.php1
-rw-r--r--admin/WebConsole/idiomas/php/esp/propiedades_repositorios_esp.php1
-rw-r--r--admin/WebConsole/includes/restfunctions.php49
-rw-r--r--admin/WebConsole/propiedades/propiedades_repositorios.php119
-rw-r--r--admin/WebConsole/rest/index.php3
-rw-r--r--admin/WebConsole/rest/repository.php176
9 files changed, 388 insertions, 46 deletions
diff --git a/admin/WebConsole/comandos/gestores/wakeonlan_repo.php b/admin/WebConsole/comandos/gestores/wakeonlan_repo.php
new file mode 100644
index 00000000..d9a04aa8
--- /dev/null
+++ b/admin/WebConsole/comandos/gestores/wakeonlan_repo.php
@@ -0,0 +1,76 @@
+<?
+// Fichero con funciones para trabajar con el webservice
+include_once("../../includes/restfunctions.php");
+
+/**
+ En este punto disponemos de tres variables indicando las ips, las macs y las ids de los
+ ordenadores, este script obtiene cual es el repositorio
+ $cadenaid
+ $cadenaip
+ $cadenamac
+
+*/
+// Capturamos todas las ids
+$macs = explode(";",$cadenamac);
+// Recorremos las ids y vemos cual es la ip del repositorio
+$repos = array();
+$reposAndMacs = array();
+foreach($macs as $mac){
+ $cmd->texto="SELECT repo.ip, repo.apikey FROM ordenadores o,repositorios repo WHERE o.mac=\"".$mac."\" AND o.idrepositorio=repo.idrepositorio";
+ $rs=new Recordset;
+ $rs->Comando=&$cmd;
+ if (!$rs->Abrir())
+ return; // Error al abrir recordset
+ while (!$rs->EOF){
+ $repo = $rs->campos["ip"];
+ if(!existREPO($repo, $repos)){
+ $repos[count($repos)]=$repo;
+ }
+ // Una vez creado el repo se asigna la mac del pc a su lista
+ if(empty($reposAndMacs[$repo])){
+ $reposAndMacs[$repo] = array();
+ $reposAndMacs[$repo]["apikey"] = $rs->campos["apikey"];
+ }
+ // Modificar la mac añadiendo ":" cada dos caracteres
+ $tmp = substr_replace($mac, ":", 2, 0);
+ $tmp = substr_replace($tmp, ":", 5, 0);
+ $tmp = substr_replace($tmp, ":", 8, 0);
+ $tmp = substr_replace($tmp, ":", 11, 0);
+ $tmp = substr_replace($tmp, ":", 14, 0);
+
+ $reposAndMacs[$repo][count($reposAndMacs[$repo])] = $tmp;
+ $rs->Siguiente();
+ }
+ $rs->Cerrar();
+}
+// En este punto tenemos un array con todos los repos y cada uno de ellos con una lista de todas las macs que deben arrancar
+// Recorremos cada uno de ellos
+foreach($reposAndMacs as $repo => $macs){
+ // En el array de $macs tenemos la clave "apikey"
+ if($macs["apikey"] !== ""){
+ $apiKeyRepo = $macs["apikey"];
+ unset($macs["apikey"]);
+ $url = "http://".$repo."/opengnsys/rest/index.php/repository/poweron";
+ $headers = array('Authorization: '.$apiKeyRepo);
+ $data = http_build_query(array("macs" => $macs));
+ $result = callAPI("POST",$url, $data, $headers);
+ $result = json_decode($result);
+ }
+ else{
+ echo "No hacemos nada, el repositorio no tiene el webservice activo";
+
+ }
+}
+
+function existREPO($repo, $repos){
+ $found=false;
+ $index = 0;
+ while(!$found && $index < count($repos)){
+ $r = $repos[$index];
+ if($r == $repo)
+ $found=true;
+ }
+ return $found;
+}
+
+?>
diff --git a/admin/WebConsole/gestores/gestor_repositorios.php b/admin/WebConsole/gestores/gestor_repositorios.php
index 88727394..29e2111a 100644
--- a/admin/WebConsole/gestores/gestor_repositorios.php
+++ b/admin/WebConsole/gestores/gestor_repositorios.php
@@ -26,6 +26,7 @@ $passguor="";
$grupoid=0;
$puertorepo="";
+$apiKeyRepo="";
$comentarios="";
if (isset($_POST["opcion"])) $opcion=$_POST["opcion"]; // Recoge parametros
@@ -38,6 +39,7 @@ if (isset($_POST["nombrerepositorio"])) $nombrerepositorio=$_POST["nombrereposit
if (isset($_POST["ip"])) $ip=$_POST["ip"];
if (isset($_POST["passguor"])) $passguor=$_POST["passguor"];
if (isset($_POST["puertorepo"])) $puertorepo=$_POST["puertorepo"];
+if (isset($_POST["apiKeyRepo"])) $apiKeyRepo=$_POST["apiKeyRepo"];
if (isset($_POST["comentarios"])) $comentarios=$_POST["comentarios"];
$tablanodo=""; // Arbol para nodos insertados
@@ -109,6 +111,7 @@ function Gestiona(){
global $ip;
global $passguor;
global $puertorepo;
+ global $apiKeyRepo;
global $comentarios;
global $op_alta;
@@ -126,11 +129,12 @@ function Gestiona(){
$cmd->CreaParametro("@ip",$ip,0);
$cmd->CreaParametro("@passguor",$passguor,0);
$cmd->CreaParametro("@puertorepo",$puertorepo,0);
+ $cmd->CreaParametro("@apiKeyRepo",$apiKeyRepo,0);
$cmd->CreaParametro("@comentarios",$comentarios,0);
switch($opcion){
case $op_alta :
- $cmd->texto="INSERT INTO repositorios(idcentro,grupoid,nombrerepositorio,ip,passguor,puertorepo,comentarios) VALUES (@idcentro,@grupoid,@nombrerepositorio,@ip,@passguor,@puertorepo,@comentarios)";
+ $cmd->texto="INSERT INTO repositorios(idcentro,grupoid,nombrerepositorio,ip,passguor,puertorepo,comentarios,apikey) VALUES (@idcentro,@grupoid,@nombrerepositorio,@ip,@passguor,@puertorepo,@comentarios,@apiKeyRepo)";
$resul=$cmd->Ejecutar();
if ($resul){ // Crea una tabla nodo para devolver a la p�gina que llam� �sta
$idrepositorio=$cmd->Autonumerico();
@@ -142,7 +146,7 @@ function Gestiona(){
}
break;
case $op_modificacion:
- $cmd->texto="UPDATE repositorios SET nombrerepositorio=@nombrerepositorio,ip=@ip,passguor=@passguor,puertorepo=@puertorepo,comentarios=@comentarios WHERE idrepositorio=@idrepositorio";
+ $cmd->texto="UPDATE repositorios SET nombrerepositorio=@nombrerepositorio,ip=@ip,passguor=@passguor,puertorepo=@puertorepo,comentarios=@comentarios, apikey=@apiKeyRepo WHERE idrepositorio=@idrepositorio";
$resul=$cmd->Ejecutar();
break;
case $op_eliminacion :
diff --git a/admin/WebConsole/idiomas/php/cat/propiedades_repositorios_cat.php b/admin/WebConsole/idiomas/php/cat/propiedades_repositorios_cat.php
index ccaaadcb..8ffd1ede 100644
--- a/admin/WebConsole/idiomas/php/cat/propiedades_repositorios_cat.php
+++ b/admin/WebConsole/idiomas/php/cat/propiedades_repositorios_cat.php
@@ -22,4 +22,5 @@ $TbMsg[13]="Espai Lliure";
$TbMsg[14]="% Ocupat";
$TbMsg[15]='Limitacions d\'aquesta versió';
$TbMsg[16]='Informació d\'espai és permès si Repositori i Servidor Web allotjats al mateix servidor';
+$TbMsg[17]='Api Token';
?>
diff --git a/admin/WebConsole/idiomas/php/eng/propiedades_repositorios_eng.php b/admin/WebConsole/idiomas/php/eng/propiedades_repositorios_eng.php
index 22644e67..d98028f4 100644
--- a/admin/WebConsole/idiomas/php/eng/propiedades_repositorios_eng.php
+++ b/admin/WebConsole/idiomas/php/eng/propiedades_repositorios_eng.php
@@ -22,4 +22,5 @@ $TbMsg[13]="Space Free";
$TbMsg[14]="% Taken";
$TbMsg[15]='Limitations of this version';
$TbMsg[16]='Space information is allowed only if Repository and Web Server are hosted on the same server';
+$TbMsg[17]='Api Token';
?>
diff --git a/admin/WebConsole/idiomas/php/esp/propiedades_repositorios_esp.php b/admin/WebConsole/idiomas/php/esp/propiedades_repositorios_esp.php
index 2eae0b47..67f14a17 100644
--- a/admin/WebConsole/idiomas/php/esp/propiedades_repositorios_esp.php
+++ b/admin/WebConsole/idiomas/php/esp/propiedades_repositorios_esp.php
@@ -22,4 +22,5 @@ $TbMsg[13]="Espacio Libre";
$TbMsg[14]="% Ocupado";
$TbMsg[15]='Limitaciones de esta versi&oacute;n';
$TbMsg[16]='Informaci&oacute;n de espacio solo disponible si Repositorio y Servidor Web est&aacute;n alojados en el mismo servidor';
+$TbMsg[17]='Api Token';
?>
diff --git a/admin/WebConsole/includes/restfunctions.php b/admin/WebConsole/includes/restfunctions.php
index 3293cd51..1fb5770f 100644
--- a/admin/WebConsole/includes/restfunctions.php
+++ b/admin/WebConsole/includes/restfunctions.php
@@ -64,5 +64,52 @@ function multiRequest($data, $options = array()) {
return $result;
}
-?>
+
+
+/**
+ * @brief Realiza una petición POST, PUT, GET, DELETE a una webservice. Pueden enviarse datos y cabeceras especificas
+ * @param $method Metodo http (POST, GET, etc)
+ * @param $url Url del webservice a consultar
+ * @param $data array de datos a enviar. Ej. array("param" => "value") ==> index.php?param=value
+ * @param $headers Cabeceras especificas de la peticion. Ej. array('Authorization: "9Ka7wG3EqhcjylUeQXITy0llj2TS8eKe"')
+ */
+// Method: POST, PUT, GET etc
+// Data:
+// Ej. callAPI("GET", "http://172.17.11.176/opengnsys/rest/index.php/repository/images?extensions[]=img&extensions[]=sum", array('Authorization: "9Ka7wG3EqhcjylUeQXITy0llj2TS8eKe"'))
+function callAPI($method, $url, $data = false, $headers = false)
+{
+ $curl = curl_init();
+
+ switch ($method)
+ {
+ case "POST":
+ curl_setopt($curl, CURLOPT_POST, 1);
+
+ if ($data)
+ curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
+ break;
+ case "PUT":
+ curl_setopt($curl, CURLOPT_PUT, 1);
+ break;
+ default:
+ if ($data)
+ $url = sprintf("%s?%s", $url, http_build_query($data));
+ }
+
+ // Optional Authentication:
+ //curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
+ //curl_setopt($curl, CURLOPT_USERPWD, "username:password");
+
+ curl_setopt($curl, CURLOPT_URL, $url);
+ curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
+ if($headers != false){
+ curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
+ }
+
+ $result = curl_exec($curl);
+
+ curl_close($curl);
+
+ return $result;
+}
diff --git a/admin/WebConsole/propiedades/propiedades_repositorios.php b/admin/WebConsole/propiedades/propiedades_repositorios.php
index 571c7d0e..f8bb2314 100644
--- a/admin/WebConsole/propiedades/propiedades_repositorios.php
+++ b/admin/WebConsole/propiedades/propiedades_repositorios.php
@@ -12,7 +12,9 @@ include_once("../includes/ctrlacc.php");
include_once("../includes/opciones.php");
include_once("../includes/CreaComando.php");
include_once("../clases/AdoPhp.php");
-include_once("../idiomas/php/".$idioma."/propiedades_repositorios_".$idioma.".php");
+include_once("../idiomas/php/".$idioma."/propiedades_repositorios_".$idioma.".php");
+// Fichero con funciones para trabajar con el webservice
+include_once("../includes/restfunctions.php");
//________________________________________________________________________________________________________
$opcion=0;
$opciones=array($TbMsg[0],$TbMsg[1],$TbMsg[2],$TbMsg[3]);
@@ -21,6 +23,7 @@ $idrepositorio=0;
$nombrerepositorio="";
$ip="";
$puertorepo="2002";
+$apiKeyRepo="";
$grupoid=0;
$comentarios="";
$ordenadores=0; // Número de ordenador a los que da servicio
@@ -45,38 +48,40 @@ if ($opcion!=$op_alta){
$iprepositorio="";
$ipservidor=$_SERVER['SERVER_ADDR'];
- $cmd->texto="SELECT * FROM repositorios WHERE idrepositorio=$idrepositorio";
- $rs=new Recordset;
- $rs->Comando=&$cmd;
- if (!$rs->Abrir()) return(true); // Error al abrir recordset
- $rs->Primero();
- if (!$rs->EOF){
- $nombrerepositorio=$rs->campos["nombrerepositorio"];
- $iprepositorio=$rs->campos["ip"];
- }
- $rs->Cerrar();
-
-if ($iprepositorio == $ipservidor)
+if ($ip == $ipservidor)
{
$repolocal="si";
$espaciorepo=exec("df -h /opt/opengnsys/images");
- $espaciorepo=split(" ",$espaciorepo);
- for ($j=0;$j<count($espaciorepo);$j++)
- {
- if ($espaciorepo[$j]!="")
- {$espaciorepos[]=$espaciorepo[$j];}
- }
- for ($k=0;$k<count($espaciorepos);$k++)
- {
- $totalrepo=$espaciorepos[1];
- $ocupadorepo=$espaciorepos[2];
- $librerepo=$espaciorepos[3];
- $porcentajerepo=$espaciorepos[4];
- }
+ $espaciorepos=split(" ",preg_replace('/\s+/', ' ', $espaciorepo));
+
+ $totalrepo=$espaciorepos[1];
+ $ocupadorepo=$espaciorepos[2];
+ $librerepo=$espaciorepos[3];
+ $porcentajerepo=$espaciorepos[4];
+
}
else{
- $repolocaL="no";
+ $repolocal="no";
+ $repoWithApi=false;
+ $repoImages = null;
+
+ // Si tenemos un apiKey podemos obtener la información desde el webservice en el repositorio
+ if($apiKeyRepo != ""){
+ $url = "http://".$ip."/opengnsys/rest/index.php/repository/images";
+ $headers = array('Authorization: '.$apiKeyRepo);
+ $result = callAPI("GET",$url, false, $headers);
+ $result = json_decode($result);
+ $totalrepo=$result->disk->total;
+ $ocupadorepo=$result->disk->used;
+ $librerepo=$result->disk->free;
+ $porcentajerepo=$result->disk->percent;
+ $repoImages = $result->images;
+ $repoWithApi = true;
+
+
+ /**/
}
+}
//#########################################################################
?>
@@ -101,59 +106,69 @@ else{
<P align=center class=cabeceras><?echo $TbMsg[4]?><BR>
<SPAN align=center class=subcabeceras><? echo $opciones[$opcion]?></SPAN></P>
<TABLE align=center border=0 cellPadding=1 cellSpacing=1 class=tabla_datos >
-<!------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------->
+<!----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -->
<TR>
- <TH align=center>&nbsp;<?echo $TbMsg[5]?>&nbsp;</TD>
+ <TH align="center">&nbsp;<?echo $TbMsg[5]?>&nbsp;</TD>
<?
if ($opcion==$op_eliminacion)
echo '<TD>'.$nombrerepositorio.'</TD>';
else
- echo '<TD><INPUT class="formulariodatos" name=nombrerepositorio style="width:200" type=text value="'.$nombrerepositorio.'"></TD>';
+ echo '<TD><INPUT class="formulariodatos" name="nombrerepositorio" style="width:200" type="text" value="'.$nombrerepositorio.'"></TD>';
?>
- <TD valign=top align=left rowspan=3 ><CENTER>
- <IMG border=3 style="border-color:#63676b" src="../images/aula.jpg">
+ <TD valign="top" align="left" rowspan="4" ><CENTER>
+ <IMG border="3" style="border-color:#63676b" src="../images/aula.jpg">
<BR>&nbsp;Ordenadores:&nbsp;<? echo $ordenadores?></CENTER></TD>
</TR>
-<!------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------->
+<!----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -->
<TR>
<TH align=center>&nbsp;<?echo $TbMsg[6]?>&nbsp;</TD>
<?
if ($opcion==$op_eliminacion)
echo '<TD>'.$ip.'</TD>';
else
- echo'<TD><INPUT class="formulariodatos" name=ip type=text style="width:200" value="'.$ip.'"></TD>';
+ echo'<TD><INPUT class="formulariodatos" name="ip" type="text" style="width:200" value="'.$ip.'"></TD>';
?>
</TR>
-<!------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------->
+<!----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -->
<TR>
<TH align=center>&nbsp;<?echo $TbMsg[8]?>&nbsp;</TD>
<?
if ($opcion==$op_eliminacion)
echo '<TD>'.$puertorepo.'</TD>';
else
- echo'<TD><INPUT class="formulariodatos" name=puertorepo type=text style="width:200" value="'.$puertorepo.'"></TD>';
+ echo'<TD><INPUT class="formulariodatos" name=puertorepo type="text" style="width:200" value="'.$puertorepo.'"></TD>';
+ ?>
+ </TR>
+<!----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -->
+ <TR>
+ <TH align=center>&nbsp;<?echo $TbMsg[17]?>&nbsp;</TD>
+ <?
+ if ($opcion==$op_eliminacion)
+ echo '<TD>'.$apiKeyRepo.'</TD>';
+ else
+ echo'<TD><INPUT class="formulariodatos" name="apiKeyRepo" type="text" style="width:200" value="'.$apiKeyRepo.'"></TD>';
?>
</TR>
-<!------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------->
+<!----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -->
<TR>
<TH align=center>&nbsp;<?echo $TbMsg[7]?>&nbsp;</TD>
<?
if ($opcion==$op_eliminacion)
- echo '<TD colspan=2>'.$comentarios.'</TD>';
+ echo '<TD colspan="2">'.$comentarios.'</TD>';
else
- echo '<TD colspan=2><TEXTAREA class="formulariodatos" name=comentarios rows=2 cols=50>'.$comentarios.'</TEXTAREA></TD>';
+ echo '<TD colspan="2"><TEXTAREA class="formulariodatos" name="comentarios" rows=2 cols=50>'.$comentarios.'</TEXTAREA></TD>';
?>
</TR>
-<!------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------->
+<!----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -->
</TABLE>
<?php if ( $opcion == 1 ){} else { ?>
<TABLE align=center border=0 cellPadding=2 cellSpacing=2 class=tabla_datos >
- <!------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------->
+ <!----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -->
- <?php if ($repolocal == "si" ) { ?>
+ <?php if ($repolocal == "si" || $repoWithApi == true ) { ?>
<TR>
<TH align=center width=125>&nbsp;<?echo $TbMsg[11]?>&nbsp;</TD>
<TH align=center width=120>&nbsp;<?echo $TbMsg[12]?>&nbsp;</TD>
@@ -166,15 +181,31 @@ else{
<TD align=center width=120>&nbsp;<?echo $librerepo?>&nbsp;</TD>
<TD align=center width=101>&nbsp;<?echo $porcentajerepo?>&nbsp;</TD>
</TR>
+ <?php
+ // Si tenemos informacion del repositorio remoto, mostramos las imagenes
+ if($repoWithApi == true && is_array($repoImages)){
+ echo "<tr class='tabla_listados_sin'><th colspan='4'>Contenido /opengnsys/images</th></tr>";
+ echo "<tr><td>File</td><td>Size</td><td>Modified</td><td>Permissions</td></tr>";
+ foreach($repoImages as $image){
+ echo "<tr class='tabla_listados_sin'>";
+ echo "<td>".$image->file->name."</td>";
+ echo "<td>".$image->file->size." bytes</td>";
+ echo "<td>".$image->file->modified."</td>";
+ echo "<td>".$image->file->permissions."</td>";
+ echo "</tr>";
+ }
+ }
+ ?>
<?php }else { ?>
<tr>
<th align="center">&nbsp;<?php echo '<strong>'.$TbMsg[15].'</strong></br>'.$TbMsg[16] ?></th>
</tr>
<?php } ?>
<?php } ?>
-<!------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------->
+<!----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -->
</TABLE>
+
</FORM>
</DIV>
@@ -197,6 +228,7 @@ function TomaPropiedades($cmd,$id){
global $ip;
global $comentarios;
global $puertorepo;
+ global $apiKeyRepo;
global $ordenadores;
@@ -217,6 +249,7 @@ function TomaPropiedades($cmd,$id){
$ip=$rs->campos["ip"];
$comentarios=$rs->campos["comentarios"];
$puertorepo=$rs->campos["puertorepo"];
+ $apiKeyRepo=$rs->campos["apikey"];
// $ordenadores=$rs->campos["numordenadores"];
}
$rs->Cerrar();
diff --git a/admin/WebConsole/rest/index.php b/admin/WebConsole/rest/index.php
index f43ebda5..fc29c517 100644
--- a/admin/WebConsole/rest/index.php
+++ b/admin/WebConsole/rest/index.php
@@ -1009,6 +1009,9 @@ EOD;
// }
//);
+// Include repository routes.
+include("repository.php");
+
// Include OGAgent push routes.
include("ogagent.php");
diff --git a/admin/WebConsole/rest/repository.php b/admin/WebConsole/rest/repository.php
new file mode 100644
index 00000000..0c18b6dd
--- /dev/null
+++ b/admin/WebConsole/rest/repository.php
@@ -0,0 +1,176 @@
+<?php
+/**
+ * @file index.php
+ * @brief OpenGnsys REST API manager.
+ * @warning All input and output messages are formatted in JSON.
+ * @note Some ideas are based on article "How to create REST API for Android app using PHP, Slim and MySQL" by Ravi Tamada, thanx.
+ * @license GNU GPLv3+
+ * @author Juan Manuel Bardallo SIC Universidad de Huelva
+ * @version 1.0
+ * @date 2016-04-06
+ */
+
+// Auxiliar functions.
+/**
+ * @brief Validate API key included in "Authorization" HTTP header.
+ * @return JSON response on error.
+ */
+function validateRepositoryApiKey() {
+ $response = array();
+
+ // Read Authorization HTTP header.
+ $headers = apache_request_headers();
+ if (! empty($headers['Authorization'])) {
+ // Assign user id. that match this key to global variable.
+ $apikey = htmlspecialchars($headers['Authorization']);
+ // El repositorio recupera el token desde el fichero de configuracion ogAdmRepo.cfg
+ $confFile = fopen("../../etc/ogAdmRepo.cfg", "r");
+
+ // Leemos cada linea hasta encontrar la clave "ApiToken"
+ if ($confFile) {
+ $found = false;
+ while(!feof($confFile)){
+ $line = fgets($confFile);
+ $key = strtok($line,"=");
+ if($key == "ApiToken"){
+ $token = trim(strtok("="));
+ if(strcmp($apikey,$token) == 0){
+ $found = true;
+ }
+ }
+ }
+ if (!$found){
+ // Credentials error.
+ $response['error'] = true;
+ $response['message'] = 'Login failed. Incorrect credentials';
+ jsonResponse(401, $response);
+ $app->stop();
+ }
+ } else {
+ // Access error.
+ $response['error'] = true;
+ $response['message'] = "An error occurred, please try again";
+ jsonResponse(500, $response);
+ }
+ } else {
+ // Error: missing API key.
+ $response['error'] = true;
+ $response['message'] = 'Missing Repository API key';
+ jsonResponse(400, $response);
+ $app = \Slim\Slim::getInstance();
+ $app->stop();
+ }
+}
+
+function commandExist($cmd) {
+ $returnVal = shell_exec("which $cmd");
+ return (empty($returnVal) ? false : true);
+}
+
+// Define REST routes.
+
+
+/**
+ * @brief List all images in the repository
+ * @note Route: /images, Method: GET
+ * @param no
+ * @return JSON array with imagename, file size
+ */
+$app->get('/repository/images', 'validateRepositoryApiKey',
+ function() {
+ $imgPath = '/opt/opengnsys/images';
+ $app = \Slim\Slim::getInstance();
+ // Comprobar si en la peticion se especificó un filtro por extensiones
+ $extensions = $app->request->get('extensions');
+
+ if ($manager = opendir($imgPath)) {
+ $repoInfo=exec("df -h ".$imgPath);
+ $repoInfo=split(" ",preg_replace('/\s+/', ' ', $repoInfo));
+
+ $response['disk']["total"]=$repoInfo[1];
+ $response['disk']["used"]=$repoInfo[2];
+ $response['disk']["free"]=$repoInfo[3];
+ $response['disk']["percent"]=$repoInfo[4];
+
+ $response['images'] = array();
+ while (false !== ($entry = readdir($manager))) {
+ $include = true;
+ if ($entry != "." && $entry != "..") {
+ // Si se especificó algun filtro por extension, comprobamos si el fichero la cumple
+ if($extensions){
+ $ext = pathinfo($imgPath."/".$entry, PATHINFO_EXTENSION);
+ // Puede ser una o varias dependiendo de si es array o no
+ if(is_array($extensions) && !in_array($ext, $extensions)){
+ $include = false;
+ }
+ else if(!is_array($extensions) && $extensions != $ext){
+ $include = false;
+ }
+
+ }
+ if($include == true){
+ $strFileName = $imgPath."/".$entry;
+ $fileInfo["file"]["name"] = $entry;
+ $fileInfo["file"]["size"] = filesize($strFileName);
+ $fileInfo["file"]["modified"] = date( "D d M Y g:i A", filemtime($strFileName));
+ $fileInfo["file"]["permissions"] = (is_readable($strFileName)?"r":"-").(is_writable($strFileName)?"w":"-").(is_executable($strFileName)?"x":"-");
+ array_push($response['images'], $fileInfo);
+ }
+ }
+ }
+ closedir($manager);
+ jsonResponse(200, $response);
+ }else{
+ // Print error message.
+ $response['error'] = true;
+ $response['message'] = 'Images directory not found';
+ jsonResponse(404, $response);
+ }
+ $app->stop();
+ }
+);
+
+
+/**
+ * @brief Power on a pc or group of pcs with the MAC specified in POST parameters
+ * @note Route: /poweron, Method: POST
+ * @param macs OU id.
+ * @return JSON string ok if the power on command was sent
+ */
+$app->post('/repository/poweron', 'validateRepositoryApiKey',
+ function() {
+ $app = \Slim\Slim::getInstance();
+ // Debe venir el parametro macs en el post
+ $data = $app->request()->post();
+ if(empty($data["macs"])){
+ // Print error message.
+ $response['error'] = true;
+ $response['message'] = 'Required param macs not found';
+ jsonResponse(400, $response);
+ }
+ else{
+ $macs = $data["macs"];
+ $strMacs = "";
+ foreach($macs as $mac){
+ $strMacs .= " ".$mac;
+ }
+ // Ejecutar comando wakeonlan, debe estar disponible en el sistema operativo
+ if(commandExist("wakeonlan")){
+ $response["output"] = "Executing wakeonlan ".trim($strMacs)."\n";
+ $response["output"] .= shell_exec("wakeonlan ".trim($strMacs));
+ // Comprobar si el comando se ejecutórrectamente
+ jsonResponse(200, $response);
+ }
+ else{
+ // Print error message.
+ $response['error'] = true;
+ $response['message'] = 'Wakeonlan command not found in this repository';
+ jsonResponse(404, $response);
+ }
+ }
+ }
+);
+
+?>
+
+