source: admin/WebConsole/rest/server.php @ 213a832

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 213a832 was 213a832, checked in by ramon <ramongomez@…>, 8 years ago

#708: Nueva ruta GET /ous/:ouid/labs/:labid/clients//status para obtener el estado de todos los clientes de un aula; actualizar definición de la API REST y definir parámetros para evitar duplicados.

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

  • Property mode set to 100644
File size: 31.4 KB
RevLine 
[fb2ee20]1<?php
2/**
3 * @file    index.php
[3551804]4 * @brief   OpenGnsys Server REST API manager.
[fb2ee20]5 * @warning All input and output messages are formatted in JSON.
6 * @note    Some ideas are based on article "How to create REST API for Android app using PHP, Slim and MySQL" by Ravi Tamada, thanx.
7 * @license GNU GPLv3+
8 * @author  Ramón M. Gómez, ETSII Univ. Sevilla
[3551804]9 * @version 1.1.0 - First version
[ac8b234e]10 * @date    2016-09-19
[fb2ee20]11 */
12
13
14// Auxiliar functions.
15
16/**
17 * @brief    Check if user is administrator and print error messages if not.
18 * @param    int adminid   Administrator id.
19 * @return   boolean       "true" if admin id. is equals to global user id., otherwise "false".
20 */
21function checkAdmin($adminid) {
22        global $userid;
23
24        if ($adminid == $userid) {
25                return true;
26        } else {
27                // Print error message.
28                $response['message'] = 'Cannot access this resource';
29                jsonResponse(401, $response);
30                return false;
31        }
32}
33
[606a0c7]34/**
35 * @fn    addClassroomGroup(&$classroomGroups, $rs)
36 * @brief Funcion privada usada para añadir grupos de aulas recursivamente
37 * @param classroomGroups Grupos de aulas que pueden contener más grupos
38 * @param rs resultset de la consulta a la base de datos.
39 */
40function addClassroomGroup(&$classroomGroups, $rs){
41
42        array_walk($classroomGroups, function(&$group,$key){
43                global $rs;
44                if (isset($group['id']) && $group['id'] === $rs->campos["group_group_id"]) {
45                        array_push($group["classroomGroups"],array("id" => $rs->campos["group_id"],
46                                "name" => $rs->campos["nombregrupoordenador"],
47                                "comments" => $rs->campos["comentarios"],
48                                "classroomGroups" => array()));
49                }
50                else if(count($group["classroomGroups"]) > 0){
51                        addClassroomGroup($group["classroomGroups"], $rs);
52                }
53                /**/
54        });
55}
[fb2ee20]56
57
[3551804]58// REST routes.
[fb2ee20]59
60/**
61 * @brief    user login.
62 * @note     Route: /login, Method: POST
63 * @param    string username   User name.
64 * @param    string password   User password.
65 * @return   string            JSON response with user id. and API key.
66 * @note     User's API key is stored in a new field of "usuarios" table.
67 */
68$app->post('/login',
69    function() use ($app) {
70        global $cmd;
71        global $userid;
72
[5ff84a5]73        $response = Array();
[fb2ee20]74        // Reading JSON parameters.
75        try {
76                $input = json_decode($app->request()->getBody());
77                $user = htmlspecialchars($input->username);
78                $pass = htmlspecialchars($input->password);
79        } catch (Exception $e) {
[29bc749]80                // Error message.
[fb2ee20]81                $response["message"] = $e->getMessage();
82                jsonResponse(400, $response);
83                $app->stop();
84        }
85
[3551804]86        // Checking parameters.
[fb2ee20]87        if (! empty($user) and ! empty($pass)) {
88                // Database query.
89                $cmd->texto = "SELECT idusuario, apikey
90                                 FROM usuarios
91                                WHERE usuario='$user' AND pasguor='$pass'";
92                $rs=new Recordset;
93                $rs->Comando=&$cmd;
94                if ($rs->Abrir()) {
95                        $rs->Primero();
96                        if (!$rs->EOF){
97                                // JSON response.
98                                $userid=$rs->campos["idusuario"];
99                                $apikey=$rs->campos["apikey"];
100                                $response['userid'] = $userid;
101                                $response['apikey'] = $apikey;
102                                jsonResponse(200, $response);
103                        } else {
104                                // Credentials error.
105                                $response['message'] = 'Login failed. Incorrect credentials';
106                                jsonResponse(401, $response);
107                                $app->stop();
108                        }
109                        $rs->Cerrar();
110                } else {
111                        // Access error.
112                        $response['message'] = "An error occurred. Please try again";
113                        jsonResponse(500, $response);
114                        $app->stop();
115                }
116        } else {
117                # Error: missing some input parameter.
118                $response['message'] = 'Missing username or password';
119                jsonResponse(400, $response);
120                $app->stop();
121        }
122    }
123);
124
125/**
126 * @brief    List all defined Organizational Units
127 * @note     Route: /ous, Method: GET
128 * @param    no
[1485b99]129 * @return   JSON array with id. and name for every defined OU
[fb2ee20]130 */
[18391d1]131$app->get('/ous(/)', function() {
[fb2ee20]132        global $cmd;
133
134        $cmd->texto = "SELECT * FROM centros";
135        $rs=new Recordset;
136        $rs->Comando=&$cmd;
[2aa8687]137        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
[5ff84a5]138        $response = Array();
[fb2ee20]139        $rs->Primero();
140        while (!$rs->EOF) {
[5ff84a5]141                $tmp = Array();
[1485b99]142                $tmp['id'] = $rs->campos["idcentro"];
143                $tmp['name'] = $rs->campos["nombrecentro"];
[4a511f81]144                array_push($response, $tmp);
[fb2ee20]145                $rs->Siguiente();
146        }
147        $rs->Cerrar();
148        jsonResponse(200, $response);
[3551804]149   }
[fb2ee20]150);
151
152/**
153 * @brief    Get Organizational Unit data
154 * @note     Route: /ous/id, Method: GET
155 * @param    id      OU id.
[1485b99]156 * @return   JSON string with OU's parameters
[fb2ee20]157 */
[18391d1]158$app->get('/ous/:ouid(/)', 'validateApiKey',
[fb2ee20]159    function($ouid) {
160        global $cmd;
[18391d1]161        global $userid;
[fb2ee20]162
163        $ouid = htmlspecialchars($ouid);
[18391d1]164        // Show OU information if user is OU's admin.
165        $cmd->texto = <<<EOD
166SELECT *
167  FROM centros
168 RIGHT JOIN administradores_centros USING(idcentro)
169 WHERE administradores_centros.idadministradorcentro = '$userid'
170   AND centros.idcentro = '$ouid'
171 LIMIT 1;
172EOD;
[fb2ee20]173        $rs=new Recordset;
174        $rs->Comando=&$cmd;
[2aa8687]175        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
[fb2ee20]176        $rs->Primero();
[18391d1]177        if (checkAdmin($rs->campos["idadministradorcentro"]) and
178            checkParameter($rs->campos["idcentro"])) {
[bbc672f]179                $response['id'] = $ouid;
180                $response['name'] = $rs->campos["nombrecentro"];
[fb2ee20]181                $response['description'] = $rs->campos["comentarios"];
182                jsonResponse(200, $response);
183        }
184        $rs->Cerrar();
185    }
186);
187
[18391d1]188/**
189 * @brief    List group of labs in an Organizational Unit
190 * @note     Route: /ous/id/groups, Method: GET
191 * @param    id      OU id.
192 * @return   JSON array of OU groups
193 */
194$app->get('/ous/:ouid/groups(/)', 'validateApiKey', function($ouid) {
[23a72c0]195        global $cmd;
196        global $userid;
197
198        $ouid = htmlspecialchars($ouid);
[18391d1]199        // List group of labs if user is OU's admin.
200        $cmd->texto = <<<EOD
201SELECT adm.idadministradorcentro, grupos.*
202  FROM grupos
203 RIGHT JOIN administradores_centros AS adm USING(idcentro)
204 WHERE adm.idadministradorcentro = '$userid'
205   AND idcentro='$ouid';
206EOD;
207        $rs=new Recordset;
208        $rs->Comando=&$cmd;
[2aa8687]209        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
[18391d1]210        $rs->Primero();
211        // Check if user is an UO admin.
212        if (checkAdmin($rs->campos["idadministradorcentro"])) {
[5ff84a5]213                $response = Array();
[18391d1]214                // Read data.
215                if (! is_null($rs->campos["idcentro"])) {
216                        while (!$rs->EOF) {
[5ff84a5]217                                $tmp = Array();
[18391d1]218                                $tmp['id'] = $rs->campos["idgrupo"];
219                                $tmp['name'] = $rs->campos["nombregrupo"];
220                                $tmp['type'] = $rs->campos["tipo"];
221                                $tmp['comments'] = $rs->campos["comentarios"];
[23a72c0]222                                if($rs->campos["grupoid"] != 0){
223                                        $tmp['parent']['id'] = $rs->campos["grupoid"];
224                                }
225                                array_push($response, $tmp);
226                                $rs->Siguiente();
227                        }
228                }
[18391d1]229                jsonResponse(200, $response);
[23a72c0]230        }
[18391d1]231        $rs->Cerrar();
[23a72c0]232    }
233);
234
[ac8b234e]235/**
236 * @brief    List all labs defined in an OU
237 * @note     Route: /ous/id/labs, Method: GET
238 * @param    id      OU id.
[18391d1]239 * @return   JSON array of all UO's labs data
[ac8b234e]240 */
[18391d1]241$app->get('/ous/:ouid/labs(/)', 'validateApiKey',
[fb2ee20]242    function($ouid) {
[606a0c7]243        global $userid;
[fb2ee20]244        global $cmd;
245
246        $ouid = htmlspecialchars($ouid);
[2aa8687]247        // Database query.
[fb2ee20]248        $cmd->texto = <<<EOD
[18391d1]249SELECT adm.idadministradorcentro, aulas.*, grp.idgrupo AS group_id,
[606a0c7]250       grp.nombregrupoordenador, grp.grupoid AS group_group_id, grp.comentarios
[fb2ee20]251  FROM aulas
252 RIGHT JOIN administradores_centros AS adm USING(idcentro)
[606a0c7]253  LEFT JOIN gruposordenadores AS grp USING(idaula)
[18391d1]254 WHERE adm.idadministradorcentro = '$userid'
[5ff84a5]255   AND adm.idcentro='$ouid'
[606a0c7]256 ORDER BY aulas.idaula, grp.idgrupo
[fb2ee20]257EOD;
258        $rs=new Recordset;
259        $rs->Comando=&$cmd;
[606a0c7]260        if (!$rs->Abrir()) return(false);       // Error opening recordset.
[18391d1]261        // Check if user is an UO admin.
[fb2ee20]262        $rs->Primero();
[18391d1]263        if (checkAdmin($rs->campos["idadministradorcentro"])) {
[5ff84a5]264                $response = Array();
[18391d1]265                if (! is_null($rs->campos["idcentro"])) {
266                        while (!$rs->EOF) {
267                                // En los resultados las aulas vienen repetidas tantas veces como grupos tengan, solo dejamos uno
268                                $classroomIndex = -1;
269                                $found=false;
270                                $index = 0;
271                                while(!$found && $index < count($response)){
272                                        if(isset($response[$index]["id"]) && $response[$index]["id"] == $rs->campos["idaula"]){
273                                                $classroomIndex = $index;
274                                                $found = true;
275                                        }
276                                        $index++;
[606a0c7]277                                }
[18391d1]278                                if(!$found){
[5ff84a5]279                                        $tmp = Array();
[18391d1]280                                        $tmp['id'] = $rs->campos["idaula"];
281                                        $tmp['name'] = $rs->campos["nombreaula"];
282                                        $tmp['inremotepc'] = $rs->campos["inremotepc"]==0 ? false: true;
283                                        $tmp['group']['id'] = $rs->campos["grupoid"];
284                                        $tmp['ou']['id'] = $ouid;
285                                        array_push($response, $tmp);
[606a0c7]286                                }
[18391d1]287                                else{
288                                        // Le añadimos el grupo en cuestion siempre que no sea un subgrupo
289                                        if($rs->campos["group_group_id"] == 0){
290                                                array_push($response[$classroomIndex]['classroomGroups'],
291                                                        array("id" => $rs->campos["group_id"],
292                                                        "name" => $rs->campos["nombregrupoordenador"],
293                                                        "comments" => $rs->campos["comentarios"],
294                                                        "classroomGroups" => array()));
295                                        }
296                                        else {
297                                                // Buscamos el grupo donde añadir el grupo
298                                                addClassroomGroup($response[$classroomIndex]['classroomGroups'], $rs);
299                                        }
[606a0c7]300                                }
[18391d1]301                                $rs->Siguiente();
[606a0c7]302                        }
[fb2ee20]303                }
304                jsonResponse(200, $response);
305        }
306        $rs->Cerrar();
307    }
308);
309
[ac8b234e]310/**
311 * @brief    Get lab data
312 * @note     Route: /ous/id1/labs/id2, Method: GET
313 * @param    id1     OU id.
314 * @param    id2     lab id.
315 * @return   JSON string with lab parameters
316 */
[4139899]317$app->get('/ous/:ouid/labs/:labid(/)', 'validateApiKey',
[fb2ee20]318    function($ouid, $labid) {
[4139899]319        global $userid;
[fb2ee20]320        global $cmd;
321
322        $ouid = htmlspecialchars($ouid);
323        $labid = htmlspecialchars($labid);
[2aa8687]324        // Database query.
[fb2ee20]325        $cmd->texto = <<<EOD
[2aa8687]326SELECT adm.idadministradorcentro, COUNT(idordenador) AS defclients, aulas.*
[fb2ee20]327  FROM aulas
328 RIGHT JOIN administradores_centros AS adm USING(idcentro)
329  LEFT JOIN ordenadores USING(idaula)
[4139899]330 WHERE adm.idadministradorcentro = '$userid'
331   AND idcentro='$ouid'
[fb2ee20]332   AND idaula='$labid';
333EOD;
334        $rs=new Recordset;
335        $rs->Comando=&$cmd;
[2aa8687]336        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
[fb2ee20]337        $rs->Primero();
[4139899]338        // Check if user is an UO admin and lab exists.
339        if (checkAdmin($rs->campos["idadministradorcentro"]) and checkParameter($rs->campos["idaula"])) {
[bbc672f]340                $response['id'] = $rs->campos["idaula"];
341                $response['name'] = $rs->campos["nombreaula"];
342                $response['location'] = $rs->campos["ubicacion"];
[fb2ee20]343                $response['description'] = $rs->campos["comentarios"];
344                $response['inremotepc'] = $rs->campos["inremotepc"]==0 ? false: true;
[bbc672f]345                $response['capacity'] = $rs->campos["puestos"];
[fb2ee20]346                $response['defclients'] = $rs->campos["defclients"];
347                $response['projector'] = $rs->campos["cagnon"]==0 ? false: true;
348                $response['board'] = $rs->campos["pizarra"]==0 ? false: true;
349                $response['routerip'] = $rs->campos["router"];
350                $response['netmask'] = $rs->campos["netmask"];
351                $response['ntp'] = $rs->campos["ntp"];
352                $response['dns'] = $rs->campos["dns"];
353                $response['proxyurl'] = $rs->campos["proxy"];
354                switch ($rs->campos["modomul"]) {
355                        case 1:  $response['mcastmode'] = "half-duplex"; break;
356                        case 2:  $response['mcastmode'] = "full-duplex"; break;
357                        default: $response['mcastmode'] = $rs->campos["modomul"];
358                }
359                $response['mcastip'] = $rs->campos["ipmul"];
360                $response['mcastport'] = $rs->campos["pormul"];
361                $response['mcastspeed'] = $rs->campos["velmul"];
362                $response['p2pmode'] = $rs->campos["modp2p"];
363                $response['p2ptime'] = $rs->campos["timep2p"];
[0126b05]364                $response['picture'] = $rs->campos["urlfoto"];
[fb2ee20]365                jsonResponse(200, $response);
366        }
367        $rs->Cerrar();
368    }
369);
370
[213a832]371
[4139899]372/**
373 * @brief    List all clients defined in a lab
374 * @note     Route: /ous/id1/labs/id2/clients, Method: GET
375 * @param    id1     OU id.
376 * @param    id2     lab id.
377 * @return   JSON data with lab id. and array of lab parameters
378 */
379$app->get('/ous/:ouid/labs/:labid/clients(/)', 'validateApiKey',
[fb2ee20]380    function($ouid, $labid) {
[4139899]381        global $userid;
[fb2ee20]382        global $cmd;
383
384        $ouid = htmlspecialchars($ouid);
385        $labid = htmlspecialchars($labid);
[2aa8687]386        // Database query.
[fb5338c]387        $cmd->texto = <<<EOD
[2aa8687]388SELECT adm.idadministradorcentro, ordenadores.*, aulas.idaula AS labid
[fb5338c]389  FROM ordenadores
[4139899]390 RIGHT JOIN aulas USING(idaula)
[fb5338c]391 RIGHT JOIN administradores_centros AS adm USING(idcentro)
[4139899]392 WHERE adm.idadministradorcentro = '$userid'
[2aa8687]393   AND adm.idcentro='$ouid'
394   AND aulas.idaula='$labid';
[fb5338c]395EOD;
[fb2ee20]396        $rs=new Recordset;
397        $rs->Comando=&$cmd;
[2aa8687]398        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
[fb2ee20]399        $rs->Primero();
[4139899]400        // Check if user is an UO admin and lab exists.
401        if (checkAdmin($rs->campos["idadministradorcentro"]) and checkParameter($rs->campos["labid"])) {
[5ff84a5]402                $response = Array();
[fb2ee20]403                while (!$rs->EOF) {
[4139899]404                        if (!is_null($rs->campos["idordenador"])) {
[5ff84a5]405                                $tmp = Array();
[4139899]406                                $tmp['id'] = $rs->campos["idordenador"];
407                                $tmp['name'] = $rs->campos["nombreordenador"];
408                                $tmp['ip'] = $rs->campos["ip"];
409                                $tmp['mac'] = $rs->campos["mac"];
410                                $tmp['ou']['id'] = $ouid;
411                                $tmp['lab']['id'] = $labid;
412                                array_push($response, $tmp);
413                        }
[fb2ee20]414                        $rs->Siguiente();
415                }
416                jsonResponse(200, $response);
417        }
418        $rs->Cerrar();
419    }
420);
421
[4139899]422/**
423 * @brief    Get client data
424 * @note     Route: /ous/id1/labs/id2clients/id3, Method: GET
425 * @param    id1     OU id.
426 * @param    id2     lab id.
427 * @param    id3     client id.
[2aa8687]428 * @return   JSON string with hardware parameters
[4139899]429 */
430$app->get('/ous/:ouid/labs/:labid/clients/:clntid(/)', 'validateApiKey',
[fb2ee20]431    function($ouid, $labid, $clntid) {
[4139899]432        global $userid;
[fb2ee20]433        global $cmd;
434
435        $ouid = htmlspecialchars($ouid);
436        $labid = htmlspecialchars($labid);
437        $clntid = htmlspecialchars($clntid);
[2aa8687]438        // Database query.
[fb5338c]439        $cmd->texto = <<<EOD
[2aa8687]440SELECT adm.idadministradorcentro, ordenadores.*
[fb5338c]441  FROM ordenadores
442  JOIN aulas USING(idaula)
443 RIGHT JOIN administradores_centros AS adm USING(idcentro)
[4139899]444 WHERE adm.idadministradorcentro = '$userid'
445   AND idcentro='$ouid'
[fb5338c]446   AND idaula='$labid'
447   AND idordenador='$clntid';
448EOD;
[fb2ee20]449        $rs=new Recordset;
450        $rs->Comando=&$cmd;
[2aa8687]451        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
[fb2ee20]452        $rs->Primero();
[4139899]453        // Check if user is an UO admin, lab exists and client exists.
454        if (checkAdmin($rs->campos["idadministradorcentro"]) and checkParameter($rs->campos["idaula"]) and checkParameter($rs->campos["idordenador"])) {
[2aa8687]455                // Read data.
[bbc672f]456                $response['id'] = $rs->campos["idordenador"];
457                $response['name'] = $rs->campos["nombreordenador"];
458                $response['serialno'] = $rs->campos["numserie"];
[fb2ee20]459                $response['netiface'] = $rs->campos["netiface"];
460                $response['netdriver'] = $rs->campos["netdriver"];
461                $response['mac'] = $rs->campos["mac"];
462                $response['ip'] = $rs->campos["ip"];
463                $response['netmask'] = $rs->campos["mascara"];
464                $response['routerip'] = $rs->campos["router"];
[4a511f81]465                $response['repo']['id'] = $rs->campos["idrepositorio"];
466                //$response['hardprofile']['id'] = $rs->campos["idperfilhard"];
467                //$response['menu']['id'] = $rs->campos["idmenu"];
[fb5338c]468                $response['validation'] = $rs->campos["validacion"]==0 ? false: true;
469                $response['boottype'] = $rs->campos["arranque"];
[0126b05]470                $response['picture'] = $rs->campos["fotoord"];
[fb2ee20]471                jsonResponse(200, $response);
472        }
473        $rs->Cerrar();
474    }
475);
476
[2aa8687]477/**
478 * @brief    Get client's harware configuration data
479 * @note     Route: /ous/id1/labs/id2clients/id3/hardware, Method: GET
480 * @param    id1     OU id.
481 * @param    id2     lab id.
482 * @param    id3     client id.
483 * @return   JSON string with cleint parameters
484 */
485$app->get('/ous/:ouid/labs/:labid/clients/:clntid/hardware(/)', 'validateApiKey',
[fb2ee20]486    function($ouid, $labid, $clntid) {
[4139899]487        global $userid;
[fb2ee20]488        global $cmd;
489
490        $ouid = htmlspecialchars($ouid);
491        $labid = htmlspecialchars($labid);
492        $clntid = htmlspecialchars($clntid);
[2aa8687]493        // Database query.
[fb2ee20]494        $cmd->texto = <<<EOD
[2aa8687]495SELECT adm.idadministradorcentro, ordenadores.idordenador, ordenadores.nombreordenador,
[fb2ee20]496       tipohardwares.nemonico, hardwares.descripcion
[2aa8687]497  FROM ordenadores
498  JOIN aulas USING(idaula)
499 RIGHT JOIN administradores_centros AS adm USING(idcentro)
500  LEFT JOIN perfileshard_hardwares USING(idperfilhard)
501  LEFT JOIN hardwares ON perfileshard_hardwares.idhardware=hardwares.idhardware
502  LEFT JOIN tipohardwares ON tipohardwares.idtipohardware=hardwares.idtipohardware
503 WHERE adm.idadministradorcentro = '$userid'
504   AND adm.idcentro='$ouid'
505   AND aulas.idaula='$labid'
506   AND ordenadores.idordenador='$clntid';
[fb2ee20]507EOD;
508        $rs=new Recordset;
509        $rs->Comando=&$cmd;
[2aa8687]510        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
[fb2ee20]511        $rs->Primero();
[2aa8687]512        // Check if user is an UO admin and client exists.
513        if (checkAdmin($rs->campos["idadministradorcentro"]) and checkParameter($rs->campos["idordenador"])) {
514                // Read data.
[bbc672f]515                $response['id'] = $rs->campos["idordenador"];
516                $response['name'] = $rs->campos["nombreordenador"];
[5ff84a5]517                $response['hardware'] = Array();
[fb2ee20]518                while (!$rs->EOF) {
[2aa8687]519                        if (!is_null($rs->campos["nemonico"])) {
[5ff84a5]520                                $tmp = Array();
[2aa8687]521                                $tmp['type'] = $rs->campos["nemonico"];
522                                $tmp['description'] = $rs->campos["descripcion"];
523                                array_push($response['hardware'], $tmp);
524                        }
[fb2ee20]525                        $rs->Siguiente();
526                }
527                jsonResponse(200, $response);
528        }
529        $rs->Cerrar();
530    }
531);
532
[2aa8687]533/**
534 * @brief    Get client's disk configuration data
535 * @note     Route: /ous/id1/labs/id2clients/id3/diskcfg, Method: GET
536 * @param    id1     OU id.
537 * @param    id2     lab id.
538 * @param    id3     client id.
539 * @return   JSON string with disk parameters
540 */
541$app->get('/ous/:ouid/labs/:labid/clients/:clntid/diskcfg(/)', 'validateApiKey',
[fb2ee20]542    function($ouid, $labid, $clntid) {
[2aa8687]543        global $userid;
[fb2ee20]544        global $cmd;
545
546        $ouid = htmlspecialchars($ouid);
547        $labid = htmlspecialchars($labid);
548        $clntid = htmlspecialchars($clntid);
[2aa8687]549        // Database query.
[fb2ee20]550        $cmd->texto = <<<EOD
[2aa8687]551SELECT adm.idadministradorcentro, ordenadores.idordenador AS clientid,
552       ordenadores.nombreordenador, ordenadores_particiones.*, tipospar.tipopar,
[208ee50]553       sistemasficheros.nemonico, nombresos.nombreso, imagenes.nombreca,
554       (imagenes.revision - ordenadores_particiones.revision) AS difimagen
[fb2ee20]555  FROM ordenadores_particiones
556 RIGHT JOIN ordenadores USING(idordenador)
[2aa8687]557  JOIN aulas USING(idaula)
558 RIGHT JOIN administradores_centros AS adm USING(idcentro)
[fb2ee20]559  LEFT JOIN tipospar USING(codpar)
560  LEFT JOIN sistemasficheros USING(idsistemafichero)
561  LEFT JOIN nombresos USING(idnombreso)
562  LEFT JOIN imagenes USING(idimagen)
[2aa8687]563 WHERE adm.idadministradorcentro = '$userid'
564   AND adm.idcentro='$ouid'
565   AND aulas.idaula='$labid'
566   AND ordenadores.idordenador='$clntid'
[fb2ee20]567 ORDER BY numdisk ASC, numpar ASC;
568EOD;
569        $rs=new Recordset;
570        $rs->Comando=&$cmd;
[2aa8687]571        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
[fb2ee20]572        $rs->Primero();
[2aa8687]573        // Check if user is an UO admin and client exists.
574        if (checkAdmin($rs->campos["idadministradorcentro"]) and checkParameter($rs->campos["clientid"])) {
575                // Read data.
[bbc672f]576                $response['id'] = $rs->campos["clientid"];
577                $response['name'] = $rs->campos["nombreordenador"];
[5ff84a5]578                $response['diskcfg'] = Array();
[fb2ee20]579                while (!$rs->EOF) {
580                        if ($rs->campos["numdisk"] == 0) {
581                                $rs->Siguiente();
582                                continue;
583                        }
[5ff84a5]584                        $tmp = Array();
[fb2ee20]585                        if ($rs->campos["numpar"] == 0) {
[2aa8687]586                                // Disk data.
[fb2ee20]587                                $tmp['disk'] = $rs->campos["numdisk"];
588                                switch ($rs->campos["codpar"]) {
589                                        case 1:  $tmp['parttable'] = "MSDOS"; break;
590                                        case 2:  $tmp['parttable'] = "GPT"; break;
591                                        case 3:  $tmp['parttable'] = "LVM"; break;
592                                        case 4:  $tmp['parttable'] = "ZPOOL"; break;
593                                        default: $tmp['parttable'] = $rs->campos["codpar"];
594                                }
595                                $tmp['size'] = $rs->campos["tamano"];
596                        } else {
[2aa8687]597                                // Partition data.
[fb2ee20]598                                $tmp['partition'] = $rs->campos["numpar"];
599                                $tmp['parttype'] = $rs->campos["tipopar"];
600                                $tmp['filesystem'] = $rs->campos["nemonico"];
601                                $tmp['size'] = $rs->campos["tamano"];
602                                $tmp['usage'] = $rs->campos["uso"];
603                                if ($rs->campos["nombreso"] != null) {
604                                        $tmp['os'] = $rs->campos["nombreso"];
[df81ab78]605                                        if ($rs->campos["idimagen"] > 0) {
[2aa8687]606                                                // Restored image data.
[df81ab78]607                                                $tmp['image']['id'] = $rs->campos["idimagen"];
608                                                $tmp['image']['deploydate'] = $rs->campos["fechadespliegue"];
[2aa8687]609                                                // Check if image is updated.
[df81ab78]610                                                $tmp['image']['updated'] = ($rs->campos["difimagen"]>0 ? "false" : "true");
611                                        }
[fb2ee20]612                                }
613                                //$tmp['cachedata'] = $rs->campos["cache"];
614                        }
615                        array_push($response['diskcfg'], $tmp);
616                        $rs->Siguiente();
617                }
618                jsonResponse(200, $response);
619        }
620        $rs->Cerrar();
621    }
622);
623
[2aa8687]624/**
625 * @brief    Get client's execution status
626 * @note     Route: /ous/id1/labs/id2clients/id3/status, Method: GET
627 * @param    id1     OU id.
628 * @param    id2     lab id.
629 * @param    id3     client id.
630 * @return   JSON string with client status
631 */
[213a832]632$app->get('/ous/:ouid/labs/:labid/clients//status(/)', 'validateApiKey', 'getStatus');
633$app->get('/ous/:ouid/labs/:labid/clients/:clntid/status(/)', 'validateApiKey', 'getStatus');
634function getStatus($ouid, $labid, $clntid=0) {
[2aa8687]635        global $userid;
[fb2ee20]636        global $cmd;
637        global $LONCABECERA;
638        global $LONHEXPRM;
[213a832]639        $app = \Slim\Slim::getInstance();
640        $clientid = $clientip = "";
641        $urls = Array();
[208ee50]642        // Status mapping.
[5ff84a5]643        $status = Array('OFF'=>"off",
[208ee50]644                        'INI'=>"initializing",
645                        'OPG'=>"ogclient",
646                        'BSY'=>"busy",
647                        'LNX'=>"linux",
[213a832]648                        'OSX'=>"macos",
649                        'WIN'=>"windows",
650                        'UNK'=>"unknown");
[fb2ee20]651        // Parameters.
652        $ouid = htmlspecialchars($ouid);
653        $labid = htmlspecialchars($labid);
[213a832]654        $single = is_numeric(explode("/", $app->request->getResourceUri())[6]);
[fb2ee20]655
656        // Database query.
657        $cmd->texto = <<<EOD
[2aa8687]658SELECT adm.idadministradorcentro, entornos.ipserveradm, entornos.portserveradm,
[213a832]659       aulas.idaula, ordenadores.idordenador, ordenadores.ip
[2aa8687]660  FROM entornos, ordenadores
661  JOIN aulas USING(idaula)
662 RIGHT JOIN administradores_centros AS adm USING(idcentro)
663 WHERE adm.idadministradorcentro = '$userid'
664   AND adm.idcentro='$ouid'
665   AND aulas.idaula='$labid'
[213a832]666EOD;
667        // Request for a single client.
668        if ($single) {
669                $clntid = htmlspecialchars($clntid);
670                $cmd->texto .= <<<EOD
[2aa8687]671   AND ordenadores.idordenador='$clntid';
[fb2ee20]672EOD;
[213a832]673        } else {
674                $response = Array();
675        }
[fb2ee20]676        $rs=new Recordset;
677        $rs->Comando=&$cmd;
[2aa8687]678        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
[fb2ee20]679        $rs->Primero();
[213a832]680        // Check if user is an UO admin and asset exists.
681        if (checkAdmin($rs->campos["idadministradorcentro"]) and (($single and checkParameter($rs->campos["idordenador"])) or (! $single and checkParameter($rs->campos["idaula"])))) {
[353c112]682                // First, try to connect to ogAdmCleint service.
[fb2ee20]683                $serverip = $rs->campos["ipserveradm"];
684                $serverport = $rs->campos["portserveradm"];
[213a832]685                while (!$rs->EOF) {
686                        $id[$rs->campos["ip"]] = $rs->campos["idordenador"];
687                        $stat[$rs->campos["ip"]] = $status['OFF'];
688                        $rs->Siguiente();
689                }
[fb2ee20]690                // Connect to reset client's status.
[213a832]691                $clientid = implode(",", $id);
692                $clientip = implode(";", array_keys($id));
[fb2ee20]693                $reqframe = "nfn=Sondeo\r".
694                            "ido=$clientid\r".
695                            "iph=$clientip\r";
696                $result = sendCommand($serverip, $serverport, $reqframe, $values);
697                // Connect to fetch client's status.
698                // Asuming client is off by default.
699                $values["tso"]="OFF";
700                // Iterate to check client's status.
701                // Exit if status!=OFF or end iterations (status=OFF).
702                $maxIter = 30;
703                for ($i=1; $i<$maxIter and preg_match('/OFF/', $values["tso"]); $i++) {
704                        // Connect to check status.
705                        $reqframe = "nfn=respuestaSondeo\r".
706                                    "ido=$clientid\r".
707                                    "iph=$clientip\r";
708                        $result = sendCommand($serverip, $serverport, $reqframe, $values);
709                        // Wait until next checking (0.1 ms).
710                        usleep(100000);
711                }
712                // Parse status response.
713                if ($result) {
714                        // Check status type.
715                        if (checkParameter($values["tso"])) {
[213a832]716                                foreach (explode(";", $values["tso"]) as $data) {
717                                        if (!empty($data)) {
718                                                list($clip, $clst) = explode("/", $data);
719                                                if ($clst != "OFF") {
720                                                        // Update current status.
721                                                        $stat[$clip] = $status[$clst];
[353c112]722                                                }
723                                        }
[208ee50]724                                }
[213a832]725                        }
726                        // Prepare request to new OGAgent for OSes.
727                        foreach ($stat as $ip => $st) {
728                                if ($st == "off") {
729                                        $urls[$ip] = "https://$ip:8000/opengnsys/status";
[fb2ee20]730                                }
731                        }
[213a832]732                        // Send request to OGAgents.
733                        if (isset($urls)) {
734                                $result = multiRequest($urls);
735                        }
736                        // Parse responses.
737                        reset($urls);
738                        foreach ($result as $res) {
739                                if (!empty($res['data'])) {
740                                        // Get status and session data.
741                                        $ip = key($urls);
742                                        $data = json_decode($res['data']);
743                                        if (@isset($status[$data->status])) {
744                                                $stat[$ip] = $status[$data->status];
745                                                $logged[$ip] = $data->loggedin;
746                                        } else {
747                                                $stat[$ip] = $status['UNK'];
748                                        }
749                                }
750                                unset($urls[$ip]);
751                        }
752                        // Compose JSON response.
753                        if ($single) {
754                                // Single response.
755                                $response['id'] = reset($id);
756                                $response['ip'] = key($id);
757                                $response['status'] = $stat[$ip];
758                                empty($logged[$ip]) || $response['loggedin'] = $logged[$ip];
759                        } else {
760                                // Multiple responses.
761                                foreach ($stat as $ip => $st) {
762                                        $tmp = Array();
763                                        $tmp['id'] = $id[$ip];
764                                        $tmp['ip'] = $ip;
765                                        $tmp['status'] = $stat[$ip];
766                                        empty($logged[$ip]) || $tmp['loggedin'] = $logged[$ip];
767                                        array_push($response, $tmp);
768                                }
769                        }
770                        jsonResponse(200, $response);
[fb2ee20]771                } else {
772                        // Access error.
773                        $response['message'] = "Cannot access to OpenGnsys server";
774                        jsonResponse(500, $response);
775                }
776        }
777        $rs->Cerrar();
[213a832]778}
[fb2ee20]779
780
[2aa8687]781/**
782 * @brief    List all image repositories defined in an OU
783 * @note     Route: /ous/id/repos, Method: GET
784 * @param    id      OU id.
785 * @return   JSON array of all UO's repo data
786 */
787$app->get('/ous/:ouid/repos(/)', 'validateApiKey',
[fb2ee20]788    function($ouid) {
[2aa8687]789        global $userid;
[fb2ee20]790        global $cmd;
791
792        $ouid = htmlspecialchars($ouid);
[2aa8687]793        // Database query.
794        $cmd->texto = <<<EOD
[5ff84a5]795SELECT adm.idadministradorcentro, adm.idcentro AS ouid, repositorios.*
[2aa8687]796  FROM repositorios
797 RIGHT JOIN administradores_centros AS adm USING(idcentro)
798 WHERE adm.idadministradorcentro = '$userid'
799   AND adm.idcentro='$ouid';
800EOD;
[fb2ee20]801        $rs=new Recordset;
802        $rs->Comando=&$cmd;
[2aa8687]803        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
[fb2ee20]804        $rs->Primero();
[2aa8687]805        // Check if user is an UO admin.
[5ff84a5]806        if (checkAdmin($rs->campos["idadministradorcentro"]) and checkParameter($rs->campos["ouid"])) {
807                $response = Array();
[fb2ee20]808                while (!$rs->EOF) {
[2aa8687]809                        if (! is_null($rs->campos["idcentro"])) {
[5ff84a5]810                                $tmp = Array();
[2aa8687]811                                $tmp['id'] = $rs->campos["idrepositorio"];
812                                $tmp['name'] = $rs->campos["nombrerepositorio"];
813                                $tmp['ou']['id'] = $ouid;
814                                array_push($response, $tmp);
815                        }
[fb2ee20]816                        $rs->Siguiente();
817                }
818                jsonResponse(200, $response);
819        }
820        $rs->Cerrar();
821    }
822);
823
[2aa8687]824/**
825 * @brief    Get image repository data
826 * @note     Route: /ous/id1/repos/id2, Method: GET
827 * @param    id1     OU id.
828 * @param    id2     repo id.
829 * @return   JSON string with repo parameters
830 */
831$app->get('/ous/:ouid/repos/:repoid(/)', 'validateApiKey',
[fb2ee20]832    function($ouid, $repoid) {
[2aa8687]833        global $userid;
[fb2ee20]834        global $cmd;
835
836        $ouid = htmlspecialchars($ouid);
837        $repoid = htmlspecialchars($repoid);
[2aa8687]838        // Database query.
839        $cmd->texto = <<<EOD
840SELECT adm.idadministradorcentro, repositorios.*
841  FROM repositorios
842 RIGHT JOIN administradores_centros AS adm USING(idcentro)
843 WHERE adm.idadministradorcentro = '$userid'
844   AND adm.idcentro='$ouid'
845   AND idrepositorio='$repoid';
846EOD;
[fb2ee20]847        $rs=new Recordset;
848        $rs->Comando=&$cmd;
[2aa8687]849        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
[fb2ee20]850        $rs->Primero();
[2aa8687]851        // Check if user is an UO admin and repo exists.
852        if (checkAdmin($rs->campos["idadministradorcentro"]) and checkParameter($rs->campos["idrepositorio"])) {
853                // Read data.
[bbc672f]854                $response['id'] = $rs->campos["idrepositorio"];
855                $response['name'] = $rs->campos["nombrerepositorio"];
[fb2ee20]856                $response['description'] = $rs->campos["comentarios"];
[4a511f81]857                $response['ip'] = $rs->campos["ip"];
[fb2ee20]858                //$response['port'] = $rs->campos["puertorepo"];
859                jsonResponse(200, $response);
860        }
861        $rs->Cerrar();
862    }
863);
864
[5ff84a5]865/**
866 * @brief    List all images defined in an OU
867 * @note     Route: /ous/id/images, Method: GET
868 * @param    id      OU id.
869 * @return   JSON array of all UO's image data
870 */
871$app->get('/ous/:ouid/images(/)', 'validateApiKey',
[fb2ee20]872    function($ouid) {
[5ff84a5]873        global $userid;
[fb2ee20]874        global $cmd;
875
876        $ouid = htmlspecialchars($ouid);
[5ff84a5]877        // Database query.
878        $cmd->texto = <<<EOD
879SELECT adm.idadministradorcentro, adm.idcentro AS ouid, imagenes.*
880  FROM imagenes
881 RIGHT JOIN administradores_centros AS adm USING(idcentro)
882 WHERE adm.idadministradorcentro = '$userid'
883   AND adm.idcentro='$ouid';
884EOD;
[fb2ee20]885        $rs=new Recordset;
886        $rs->Comando=&$cmd;
[5ff84a5]887        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
[fb2ee20]888        $rs->Primero();
[5ff84a5]889        // Check if user is an UO admin.
890        if (checkAdmin($rs->campos["idadministradorcentro"]) and checkParameter($rs->campos["ouid"])) {
891                $response = Array();
[fb2ee20]892                while (!$rs->EOF) {
[5ff84a5]893                        if (! is_null($rs->campos["idcentro"])) {
894                                $tmp = Array();
895                                $tmp['id'] = $rs->campos["idimagen"];
896                                $tmp['name'] = $rs->campos["nombreca"];
897                                $tmp['inremotepc'] = $rs->campos["inremotepc"]==0 ? false: true;
898                                $tmp['ou']['id'] = $ouid;
899                                array_push($response, $tmp);
900                        }
[fb2ee20]901                        $rs->Siguiente();
902                }
903                jsonResponse(200, $response);
904        }
905    }
906);
907
[5ff84a5]908/**
909 * @brief    Get image data
910 * @note     Route: /ous/id1/images/id2, Method: GET
911 * @param    id1     OU id.
912 * @param    id2     image id.
913 * @return   JSON string with image parameters
914 */
915$app->get('/ous/:ouid/images/:imgid(/)', 'validateApiKey',
[fb2ee20]916    function($ouid, $imgid) {
[5ff84a5]917        global $userid;
[fb2ee20]918        global $cmd;
919
920        $ouid = htmlspecialchars($ouid);
921        $imgid = htmlspecialchars($imgid);
[5ff84a5]922        // Database query.
923        $cmd->texto = <<<EOD
924SELECT adm.idadministradorcentro, imagenes.*
925  FROM imagenes
926 RIGHT JOIN administradores_centros AS adm USING(idcentro)
927 WHERE adm.idadministradorcentro = '$userid'
928   AND adm.idcentro='$ouid'
929   AND idimagen='$imgid';
930EOD;
[fb2ee20]931        $rs=new Recordset;
932        $rs->Comando=&$cmd;
[5ff84a5]933        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
[fb2ee20]934        $rs->Primero();
[5ff84a5]935        // Check if user is an UO admin and repo exists.
936        if (checkAdmin($rs->campos["idadministradorcentro"]) and checkParameter($rs->campos["idimagen"])) {
937                // Read data.
[bbc672f]938                $response['id'] = $rs->campos["idimagen"];
939                $response['name'] = $rs->campos["nombreca"];
[fb2ee20]940                $response['description'] = $rs->campos["descripcion"];
941                $response['comments'] = $rs->campos["comentarios"];
942                $response['inremotepc'] = $rs->campos["inremotepc"]==0 ? false: true;
[3b5daf8]943                $response['repo']['id'] = $rs->campos["idrepositorio"];
[fb2ee20]944                switch ($rs->campos["tipo"]) {
[5ff84a5]945                        // Image type.
[fb2ee20]946                        case 1:  $response['type'] = "monolithic"; break;
947                        case 2:  $response['type'] = "base"; break;
948                        case 3:  $response['type'] = "incremental";
949                                 $response['baseimg'] = $rs->campos["imagenid"];
950                                 $response['path'] = $rs->campos["ruta"];
951                                 break;
952                        default: $response['type'] = $rs->campos["tipo"];
953                }
954                if ($rs->campos["idordenador"] != 0) {
[5ff84a5]955                        // Source client data.
[3b5daf8]956                        $response['client']['id'] = $rs->campos["idordenador"];
957                        $response['client']['disk'] = $rs->campos["numdisk"];
958                        $response['client']['partition'] = $rs->campos["numpar"];
[fb2ee20]959                        $response['creationdate'] = $rs->campos["fechacreacion"];
[bbc672f]960                        $response['release'] = $rs->campos["revision"];
[fb2ee20]961                }
962                jsonResponse(200, $response);
963        }
964        $rs->Cerrar();
965    }
966);
967
968// Lista de softeare instalado en una imagen.
[5ff84a5]969$app->get('/ous/:ouid/images/:imgid/software(/)', 'validateApiKey',
[fb2ee20]970    function($ouid, $imgid) {
[5ff84a5]971        global $userid;
[fb2ee20]972        global $cmd;
973
974        $ouid = htmlspecialchars($ouid);
975        $imgid = htmlspecialchars($imgid);
[5ff84a5]976        // Database query.
[fb2ee20]977        $cmd->texto = <<<EOD
[5ff84a5]978SELECT adm.idadministradorcentro, imagenes.idimagen, imagenes.nombreca,
979       nombresos.nombreso, softwares.descripcion
980  FROM imagenes
981 RIGHT JOIN administradores_centros AS adm USING(idcentro)
982  LEFT JOIN perfilessoft USING(idperfilsoft)
[bbc672f]983  LEFT JOIN nombresos USING(idnombreso)
[fb2ee20]984  LEFT JOIN perfilessoft_softwares USING(idperfilsoft)
985  LEFT JOIN softwares USING(idsoftware)
[5ff84a5]986 WHERE adm.idadministradorcentro = '$userid'
987   AND imagenes.idimagen='$imgid'
[fb2ee20]988 ORDER BY softwares.descripcion ASC;
989EOD;
990        $rs=new Recordset;
991        $rs->Comando=&$cmd;
[5ff84a5]992        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
[fb2ee20]993        $rs->Primero();
[5ff84a5]994        // Check if user is an UO admin and repo exists.
995        if (checkAdmin($rs->campos["idadministradorcentro"]) and checkParameter($rs->campos["idimagen"])) {
[bbc672f]996                $response['id'] = $rs->campos["idimagen"];
997                $response['name'] = $rs->campos["nombreca"];
[5ff84a5]998                if (is_null($rs->campos["nombreso"])) {
999                        // Null object.
1000                        $response['software'] = Array();
1001                        jsonResponse(200, $response, JSON_FORCE_OBJECT);
1002                } else {
1003                        // Read data.
1004                        $response['software']['os'] = $rs->campos["nombreso"];
1005                        //$response['software']['type'] = ...;  // OS type
1006                        $response['software']['applications'] = Array();
1007                        while (!$rs->EOF) {
1008                                // Ignoring empty fields.
1009                                if (!is_null($rs->campos["descripcion"])) {
1010                                        array_push($response['software']['application'], $rs->campos["descripcion"]);
1011                                }
[fb2ee20]1012                                $rs->Siguiente();
1013                        }
[5ff84a5]1014                        jsonResponse(200, $response);
[fb2ee20]1015                }
1016        }
1017        $rs->Cerrar();
1018    }
1019);
1020
[21e5ee3]1021?>
Note: See TracBrowser for help on using the repository browser.