source: admin/WebConsole/rest/server.php @ e7d47882

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

#708: Cambios en la salida de la ruta /ous/:ouid/images/:imageid/software y seguir aplicando cambios de r5190 a más rutas REST.

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

  • Property mode set to 100644
File size: 30.2 KB
Line 
1<?php
2/**
3 * @file    index.php
4 * @brief   OpenGnsys Server REST API manager.
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
9 * @version 1.1.0 - First version
10 * @date    2016-09-19
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
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}
56
57
58// REST routes.
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
73        $response = Array();
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) {
80                // Error message.
81                $response["message"] = $e->getMessage();
82                jsonResponse(400, $response);
83                $app->stop();
84        }
85
86        // Checking parameters.
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
129 * @return   JSON array with id. and name for every defined OU
130 */
131$app->get('/ous(/)', function() {
132        global $cmd;
133
134        $cmd->texto = "SELECT * FROM centros";
135        $rs=new Recordset;
136        $rs->Comando=&$cmd;
137        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
138        $response = Array();
139        $rs->Primero();
140        while (!$rs->EOF) {
141                $tmp = Array();
142                $tmp['id'] = $rs->campos["idcentro"];
143                $tmp['name'] = $rs->campos["nombrecentro"];
144                array_push($response, $tmp);
145                $rs->Siguiente();
146        }
147        $rs->Cerrar();
148        jsonResponse(200, $response);
149   }
150);
151
152/**
153 * @brief    Get Organizational Unit data
154 * @note     Route: /ous/id, Method: GET
155 * @param    id      OU id.
156 * @return   JSON string with OU's parameters
157 */
158$app->get('/ous/:ouid(/)', 'validateApiKey',
159    function($ouid) {
160        global $cmd;
161        global $userid;
162
163        $ouid = htmlspecialchars($ouid);
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;
173        $rs=new Recordset;
174        $rs->Comando=&$cmd;
175        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
176        $rs->Primero();
177        if (checkAdmin($rs->campos["idadministradorcentro"]) and
178            checkParameter($rs->campos["idcentro"])) {
179                $response['id'] = $ouid;
180                $response['name'] = $rs->campos["nombrecentro"];
181                $response['description'] = $rs->campos["comentarios"];
182                jsonResponse(200, $response);
183        }
184        $rs->Cerrar();
185    }
186);
187
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) {
195        global $cmd;
196        global $userid;
197
198        $ouid = htmlspecialchars($ouid);
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;
209        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
210        $rs->Primero();
211        // Check if user is an UO admin.
212        if (checkAdmin($rs->campos["idadministradorcentro"])) {
213                $response = Array();
214                // Read data.
215                if (! is_null($rs->campos["idcentro"])) {
216                        while (!$rs->EOF) {
217                                $tmp = Array();
218                                $tmp['id'] = $rs->campos["idgrupo"];
219                                $tmp['name'] = $rs->campos["nombregrupo"];
220                                $tmp['type'] = $rs->campos["tipo"];
221                                $tmp['comments'] = $rs->campos["comentarios"];
222                                if($rs->campos["grupoid"] != 0){
223                                        $tmp['parent']['id'] = $rs->campos["grupoid"];
224                                }
225                                array_push($response, $tmp);
226                                $rs->Siguiente();
227                        }
228                }
229                jsonResponse(200, $response);
230        }
231        $rs->Cerrar();
232    }
233);
234
235/**
236 * @brief    List all labs defined in an OU
237 * @note     Route: /ous/id/labs, Method: GET
238 * @param    id      OU id.
239 * @return   JSON array of all UO's labs data
240 */
241$app->get('/ous/:ouid/labs(/)', 'validateApiKey',
242    function($ouid) {
243        global $userid;
244        global $cmd;
245
246        $ouid = htmlspecialchars($ouid);
247        // Database query.
248        $cmd->texto = <<<EOD
249SELECT adm.idadministradorcentro, aulas.*, grp.idgrupo AS group_id,
250       grp.nombregrupoordenador, grp.grupoid AS group_group_id, grp.comentarios
251  FROM aulas
252 RIGHT JOIN administradores_centros AS adm USING(idcentro)
253  LEFT JOIN gruposordenadores AS grp USING(idaula)
254 WHERE adm.idadministradorcentro = '$userid'
255   AND adm.idcentro='$ouid'
256 ORDER BY aulas.idaula, grp.idgrupo
257EOD;
258        $rs=new Recordset;
259        $rs->Comando=&$cmd;
260        if (!$rs->Abrir()) return(false);       // Error opening recordset.
261        // Check if user is an UO admin.
262        $rs->Primero();
263        if (checkAdmin($rs->campos["idadministradorcentro"])) {
264                $response = Array();
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++;
277                                }
278                                if(!$found){
279                                        $tmp = Array();
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);
286                                }
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                                        }
300                                }
301                                $rs->Siguiente();
302                        }
303                }
304                jsonResponse(200, $response);
305        }
306        $rs->Cerrar();
307    }
308);
309
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 */
317$app->get('/ous/:ouid/labs/:labid(/)', 'validateApiKey',
318    function($ouid, $labid) {
319        global $userid;
320        global $cmd;
321
322        $ouid = htmlspecialchars($ouid);
323        $labid = htmlspecialchars($labid);
324        // Database query.
325        $cmd->texto = <<<EOD
326SELECT adm.idadministradorcentro, COUNT(idordenador) AS defclients, aulas.*
327  FROM aulas
328 RIGHT JOIN administradores_centros AS adm USING(idcentro)
329  LEFT JOIN ordenadores USING(idaula)
330 WHERE adm.idadministradorcentro = '$userid'
331   AND idcentro='$ouid'
332   AND idaula='$labid';
333EOD;
334        $rs=new Recordset;
335        $rs->Comando=&$cmd;
336        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
337        $rs->Primero();
338        // Check if user is an UO admin and lab exists.
339        if (checkAdmin($rs->campos["idadministradorcentro"]) and checkParameter($rs->campos["idaula"])) {
340                $response['id'] = $rs->campos["idaula"];
341                $response['name'] = $rs->campos["nombreaula"];
342                $response['location'] = $rs->campos["ubicacion"];
343                $response['description'] = $rs->campos["comentarios"];
344                $response['inremotepc'] = $rs->campos["inremotepc"]==0 ? false: true;
345                $response['capacity'] = $rs->campos["puestos"];
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"];
364                $response['picture'] = $rs->campos["urlfoto"];
365                jsonResponse(200, $response);
366        }
367        $rs->Cerrar();
368    }
369);
370
371/**
372 * @brief    List all clients defined in a lab
373 * @note     Route: /ous/id1/labs/id2/clients, Method: GET
374 * @param    id1     OU id.
375 * @param    id2     lab id.
376 * @return   JSON data with lab id. and array of lab parameters
377 */
378$app->get('/ous/:ouid/labs/:labid/clients(/)', 'validateApiKey',
379    function($ouid, $labid) {
380        global $userid;
381        global $cmd;
382
383        $ouid = htmlspecialchars($ouid);
384        $labid = htmlspecialchars($labid);
385        // Database query.
386        $cmd->texto = <<<EOD
387SELECT adm.idadministradorcentro, ordenadores.*, aulas.idaula AS labid
388  FROM ordenadores
389 RIGHT JOIN aulas USING(idaula)
390 RIGHT JOIN administradores_centros AS adm USING(idcentro)
391 WHERE adm.idadministradorcentro = '$userid'
392   AND adm.idcentro='$ouid'
393   AND aulas.idaula='$labid';
394EOD;
395        $rs=new Recordset;
396        $rs->Comando=&$cmd;
397        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
398        $rs->Primero();
399        // Check if user is an UO admin and lab exists.
400        if (checkAdmin($rs->campos["idadministradorcentro"]) and checkParameter($rs->campos["labid"])) {
401                $response = Array();
402                while (!$rs->EOF) {
403                        if (!is_null($rs->campos["idordenador"])) {
404                                $tmp = Array();
405                                $tmp['id'] = $rs->campos["idordenador"];
406                                $tmp['name'] = $rs->campos["nombreordenador"];
407                                $tmp['ip'] = $rs->campos["ip"];
408                                $tmp['mac'] = $rs->campos["mac"];
409                                $tmp['ou']['id'] = $ouid;
410                                $tmp['lab']['id'] = $labid;
411                                array_push($response, $tmp);
412                        }
413                        $rs->Siguiente();
414                }
415                jsonResponse(200, $response);
416        }
417        $rs->Cerrar();
418    }
419);
420
421/**
422 * @brief    Get client data
423 * @note     Route: /ous/id1/labs/id2clients/id3, Method: GET
424 * @param    id1     OU id.
425 * @param    id2     lab id.
426 * @param    id3     client id.
427 * @return   JSON string with hardware parameters
428 */
429$app->get('/ous/:ouid/labs/:labid/clients/:clntid(/)', 'validateApiKey',
430    function($ouid, $labid, $clntid) {
431        global $userid;
432        global $cmd;
433
434        $ouid = htmlspecialchars($ouid);
435        $labid = htmlspecialchars($labid);
436        $clntid = htmlspecialchars($clntid);
437        // Database query.
438        $cmd->texto = <<<EOD
439SELECT adm.idadministradorcentro, ordenadores.*
440  FROM ordenadores
441  JOIN aulas USING(idaula)
442 RIGHT JOIN administradores_centros AS adm USING(idcentro)
443 WHERE adm.idadministradorcentro = '$userid'
444   AND idcentro='$ouid'
445   AND idaula='$labid'
446   AND idordenador='$clntid';
447EOD;
448        $rs=new Recordset;
449        $rs->Comando=&$cmd;
450        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
451        $rs->Primero();
452        // Check if user is an UO admin, lab exists and client exists.
453        if (checkAdmin($rs->campos["idadministradorcentro"]) and checkParameter($rs->campos["idaula"]) and checkParameter($rs->campos["idordenador"])) {
454                // Read data.
455                $response['id'] = $rs->campos["idordenador"];
456                $response['name'] = $rs->campos["nombreordenador"];
457                $response['serialno'] = $rs->campos["numserie"];
458                $response['netiface'] = $rs->campos["netiface"];
459                $response['netdriver'] = $rs->campos["netdriver"];
460                $response['mac'] = $rs->campos["mac"];
461                $response['ip'] = $rs->campos["ip"];
462                $response['netmask'] = $rs->campos["mascara"];
463                $response['routerip'] = $rs->campos["router"];
464                $response['repo']['id'] = $rs->campos["idrepositorio"];
465                //$response['hardprofile']['id'] = $rs->campos["idperfilhard"];
466                //$response['menu']['id'] = $rs->campos["idmenu"];
467                $response['validation'] = $rs->campos["validacion"]==0 ? false: true;
468                $response['boottype'] = $rs->campos["arranque"];
469                $response['picture'] = $rs->campos["fotoord"];
470                jsonResponse(200, $response);
471        }
472        $rs->Cerrar();
473    }
474);
475
476/**
477 * @brief    Get client's harware configuration data
478 * @note     Route: /ous/id1/labs/id2clients/id3/hardware, Method: GET
479 * @param    id1     OU id.
480 * @param    id2     lab id.
481 * @param    id3     client id.
482 * @return   JSON string with cleint parameters
483 */
484$app->get('/ous/:ouid/labs/:labid/clients/:clntid/hardware(/)', 'validateApiKey',
485    function($ouid, $labid, $clntid) {
486        global $userid;
487        global $cmd;
488
489        $ouid = htmlspecialchars($ouid);
490        $labid = htmlspecialchars($labid);
491        $clntid = htmlspecialchars($clntid);
492        // Database query.
493        $cmd->texto = <<<EOD
494SELECT adm.idadministradorcentro, ordenadores.idordenador, ordenadores.nombreordenador,
495       tipohardwares.nemonico, hardwares.descripcion
496  FROM ordenadores
497  JOIN aulas USING(idaula)
498 RIGHT JOIN administradores_centros AS adm USING(idcentro)
499  LEFT JOIN perfileshard_hardwares USING(idperfilhard)
500  LEFT JOIN hardwares ON perfileshard_hardwares.idhardware=hardwares.idhardware
501  LEFT JOIN tipohardwares ON tipohardwares.idtipohardware=hardwares.idtipohardware
502 WHERE adm.idadministradorcentro = '$userid'
503   AND adm.idcentro='$ouid'
504   AND aulas.idaula='$labid'
505   AND ordenadores.idordenador='$clntid';
506EOD;
507        $rs=new Recordset;
508        $rs->Comando=&$cmd;
509        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
510        $rs->Primero();
511        // Check if user is an UO admin and client exists.
512        if (checkAdmin($rs->campos["idadministradorcentro"]) and checkParameter($rs->campos["idordenador"])) {
513                // Read data.
514                $response['id'] = $rs->campos["idordenador"];
515                $response['name'] = $rs->campos["nombreordenador"];
516                $response['hardware'] = Array();
517                while (!$rs->EOF) {
518                        if (!is_null($rs->campos["nemonico"])) {
519                                $tmp = Array();
520                                $tmp['type'] = $rs->campos["nemonico"];
521                                $tmp['description'] = $rs->campos["descripcion"];
522                                array_push($response['hardware'], $tmp);
523                        }
524                        $rs->Siguiente();
525                }
526                jsonResponse(200, $response);
527        }
528        $rs->Cerrar();
529    }
530);
531
532/**
533 * @brief    Get client's disk configuration data
534 * @note     Route: /ous/id1/labs/id2clients/id3/diskcfg, Method: GET
535 * @param    id1     OU id.
536 * @param    id2     lab id.
537 * @param    id3     client id.
538 * @return   JSON string with disk parameters
539 */
540$app->get('/ous/:ouid/labs/:labid/clients/:clntid/diskcfg(/)', 'validateApiKey',
541    function($ouid, $labid, $clntid) {
542        global $userid;
543        global $cmd;
544
545        $ouid = htmlspecialchars($ouid);
546        $labid = htmlspecialchars($labid);
547        $clntid = htmlspecialchars($clntid);
548        // Database query.
549        $cmd->texto = <<<EOD
550SELECT adm.idadministradorcentro, ordenadores.idordenador AS clientid,
551       ordenadores.nombreordenador, ordenadores_particiones.*, tipospar.tipopar,
552       sistemasficheros.nemonico, nombresos.nombreso, imagenes.nombreca,
553       (imagenes.revision - ordenadores_particiones.revision) AS difimagen
554  FROM ordenadores_particiones
555 RIGHT JOIN ordenadores USING(idordenador)
556  JOIN aulas USING(idaula)
557 RIGHT JOIN administradores_centros AS adm USING(idcentro)
558  LEFT JOIN tipospar USING(codpar)
559  LEFT JOIN sistemasficheros USING(idsistemafichero)
560  LEFT JOIN nombresos USING(idnombreso)
561  LEFT JOIN imagenes USING(idimagen)
562 WHERE adm.idadministradorcentro = '$userid'
563   AND adm.idcentro='$ouid'
564   AND aulas.idaula='$labid'
565   AND ordenadores.idordenador='$clntid'
566 ORDER BY numdisk ASC, numpar ASC;
567EOD;
568        $rs=new Recordset;
569        $rs->Comando=&$cmd;
570        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
571        $rs->Primero();
572        // Check if user is an UO admin and client exists.
573        if (checkAdmin($rs->campos["idadministradorcentro"]) and checkParameter($rs->campos["clientid"])) {
574                // Read data.
575                $response['id'] = $rs->campos["clientid"];
576                $response['name'] = $rs->campos["nombreordenador"];
577                $response['diskcfg'] = Array();
578                while (!$rs->EOF) {
579                        if ($rs->campos["numdisk"] == 0) {
580                                $rs->Siguiente();
581                                continue;
582                        }
583                        $tmp = Array();
584                        if ($rs->campos["numpar"] == 0) {
585                                // Disk data.
586                                $tmp['disk'] = $rs->campos["numdisk"];
587                                switch ($rs->campos["codpar"]) {
588                                        case 1:  $tmp['parttable'] = "MSDOS"; break;
589                                        case 2:  $tmp['parttable'] = "GPT"; break;
590                                        case 3:  $tmp['parttable'] = "LVM"; break;
591                                        case 4:  $tmp['parttable'] = "ZPOOL"; break;
592                                        default: $tmp['parttable'] = $rs->campos["codpar"];
593                                }
594                                $tmp['size'] = $rs->campos["tamano"];
595                        } else {
596                                // Partition data.
597                                $tmp['partition'] = $rs->campos["numpar"];
598                                $tmp['parttype'] = $rs->campos["tipopar"];
599                                $tmp['filesystem'] = $rs->campos["nemonico"];
600                                $tmp['size'] = $rs->campos["tamano"];
601                                $tmp['usage'] = $rs->campos["uso"];
602                                if ($rs->campos["nombreso"] != null) {
603                                        $tmp['os'] = $rs->campos["nombreso"];
604                                        if ($rs->campos["idimagen"] > 0) {
605                                                // Restored image data.
606                                                $tmp['image']['id'] = $rs->campos["idimagen"];
607                                                $tmp['image']['deploydate'] = $rs->campos["fechadespliegue"];
608                                                // Check if image is updated.
609                                                $tmp['image']['updated'] = ($rs->campos["difimagen"]>0 ? "false" : "true");
610                                        }
611                                }
612                                //$tmp['cachedata'] = $rs->campos["cache"];
613                        }
614                        array_push($response['diskcfg'], $tmp);
615                        $rs->Siguiente();
616                }
617                jsonResponse(200, $response);
618        }
619        $rs->Cerrar();
620    }
621);
622
623/**
624 * @brief    Get client's execution status
625 * @note     Route: /ous/id1/labs/id2clients/id3/status, Method: GET
626 * @param    id1     OU id.
627 * @param    id2     lab id.
628 * @param    id3     client id.
629 * @return   JSON string with client status
630 */
631$app->get('/ous/:ouid/labs/:labid/clients/:clntid/status(/)', 'validateApiKey',
632    function($ouid, $labid, $clntid) {
633        global $userid;
634        global $cmd;
635        global $LONCABECERA;
636        global $LONHEXPRM;
637
638        // Status mapping.
639        $status = Array('OFF'=>"off",
640                        'INI'=>"initializing",
641                        'OPG'=>"ogclient",
642                        'BSY'=>"busy",
643                        'LNX'=>"linux",
644                        'WIN'=>"windows");
645        // Parameters.
646        $ouid = htmlspecialchars($ouid);
647        $labid = htmlspecialchars($labid);
648        $clntid = htmlspecialchars($clntid);
649
650        // Database query.
651        $cmd->texto = <<<EOD
652SELECT adm.idadministradorcentro, entornos.ipserveradm, entornos.portserveradm,
653       ordenadores.idordenador, ordenadores.ip
654  FROM entornos, ordenadores
655  JOIN aulas USING(idaula)
656 RIGHT JOIN administradores_centros AS adm USING(idcentro)
657 WHERE adm.idadministradorcentro = '$userid'
658   AND adm.idcentro='$ouid'
659   AND aulas.idaula='$labid'
660   AND ordenadores.idordenador='$clntid';
661EOD;
662        $rs=new Recordset;
663        $rs->Comando=&$cmd;
664        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
665        $rs->Primero();
666        // Check if user is an UO admin and client exists.
667        if (checkAdmin($rs->campos["idadministradorcentro"]) and checkParameter($rs->campos["idordenador"])) {
668                // First, try to connect to ogAdmCleint service.
669                $serverip = $rs->campos["ipserveradm"];
670                $serverport = $rs->campos["portserveradm"];
671                $clientid = $rs->campos["idordenador"];
672                $clientip = $rs->campos["ip"];
673
674                // Connect to reset client's status.
675                $reqframe = "nfn=Sondeo\r".
676                            "ido=$clientid\r".
677                            "iph=$clientip\r";
678                $result = sendCommand($serverip, $serverport, $reqframe, $values);
679
680                // Connect to fetch client's status.
681                // Asuming client is off by default.
682                $values["tso"]="OFF";
683                // Iterate to check client's status.
684                // Exit if status!=OFF or end iterations (status=OFF).
685                $maxIter = 30;
686                for ($i=1; $i<$maxIter and preg_match('/OFF/', $values["tso"]); $i++) {
687                        // Connect to check status.
688                        $reqframe = "nfn=respuestaSondeo\r".
689                                    "ido=$clientid\r".
690                                    "iph=$clientip\r";
691                        $result = sendCommand($serverip, $serverport, $reqframe, $values);
692                        // Wait until next checking (0.1 ms).
693                        usleep(100000);
694                }
695
696                // Parse status response.
697                if ($result) {
698                        // Check status type.
699                        if (checkParameter($values["tso"])) {
700                                // Compose JSON response.
701                                $response['id'] = $clientid;
702                                $response['ip'] = $clientip;
703                                $stat = Array();
704                                preg_match('/\/[A-Z]*;/', $values["tso"], $stat);
705                                // Check if data exists.
706                                if (empty($stat[0]) or preg_match('/OFF/', $stat[0])) {
707                                        // If no data, check OGAgent API connection.
708                                        $url = "https://$clientip:8000/opengnsys/status";
709                                        $result = multiRequest(Array($url));
710                                        if (empty($result[0]['data'])) {
711                                                // Client is off.
712                                                $response['status'] = $status['OFF'];
713                                        } else {
714                                                // Get status and session data.
715                                                $data = json_decode($result[0]['data']);
716                                                if (isset($status[$data->status])) {
717                                                        $response['status'] = $status[$data->status];
718                                                        $response['loggedin'] = $data->loggedin;
719                                                }
720                                        }
721                                } else {
722                                        $response['status'] = $status[substr($stat[0], 1, 3)];
723                                }
724                                if (empty($response['status'])) {
725                                        $response['status'] = "unknown";
726                                }
727                                jsonResponse(200, $response);
728                        }
729                } else {
730                        // Access error.
731                        $response['message'] = "Cannot access to OpenGnsys server";
732                        jsonResponse(500, $response);
733                }
734        }
735        $rs->Cerrar();
736    }
737);
738
739
740/**
741 * @brief    List all image repositories defined in an OU
742 * @note     Route: /ous/id/repos, Method: GET
743 * @param    id      OU id.
744 * @return   JSON array of all UO's repo data
745 */
746$app->get('/ous/:ouid/repos(/)', 'validateApiKey',
747    function($ouid) {
748        global $userid;
749        global $cmd;
750
751        $ouid = htmlspecialchars($ouid);
752        // Database query.
753        $cmd->texto = <<<EOD
754SELECT adm.idadministradorcentro, adm.idcentro AS ouid, repositorios.*
755  FROM repositorios
756 RIGHT JOIN administradores_centros AS adm USING(idcentro)
757 WHERE adm.idadministradorcentro = '$userid'
758   AND adm.idcentro='$ouid';
759EOD;
760        $rs=new Recordset;
761        $rs->Comando=&$cmd;
762        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
763        $rs->Primero();
764        // Check if user is an UO admin.
765        if (checkAdmin($rs->campos["idadministradorcentro"]) and checkParameter($rs->campos["ouid"])) {
766                $response = Array();
767                while (!$rs->EOF) {
768                        if (! is_null($rs->campos["idcentro"])) {
769                                $tmp = Array();
770                                $tmp['id'] = $rs->campos["idrepositorio"];
771                                $tmp['name'] = $rs->campos["nombrerepositorio"];
772                                $tmp['ou']['id'] = $ouid;
773                                array_push($response, $tmp);
774                        }
775                        $rs->Siguiente();
776                }
777                jsonResponse(200, $response);
778        }
779        $rs->Cerrar();
780    }
781);
782
783/**
784 * @brief    Get image repository data
785 * @note     Route: /ous/id1/repos/id2, Method: GET
786 * @param    id1     OU id.
787 * @param    id2     repo id.
788 * @return   JSON string with repo parameters
789 */
790$app->get('/ous/:ouid/repos/:repoid(/)', 'validateApiKey',
791    function($ouid, $repoid) {
792        global $userid;
793        global $cmd;
794
795        $ouid = htmlspecialchars($ouid);
796        $repoid = htmlspecialchars($repoid);
797        // Database query.
798        $cmd->texto = <<<EOD
799SELECT adm.idadministradorcentro, repositorios.*
800  FROM repositorios
801 RIGHT JOIN administradores_centros AS adm USING(idcentro)
802 WHERE adm.idadministradorcentro = '$userid'
803   AND adm.idcentro='$ouid'
804   AND idrepositorio='$repoid';
805EOD;
806        $rs=new Recordset;
807        $rs->Comando=&$cmd;
808        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
809        $rs->Primero();
810        // Check if user is an UO admin and repo exists.
811        if (checkAdmin($rs->campos["idadministradorcentro"]) and checkParameter($rs->campos["idrepositorio"])) {
812                // Read data.
813                $response['id'] = $rs->campos["idrepositorio"];
814                $response['name'] = $rs->campos["nombrerepositorio"];
815                $response['description'] = $rs->campos["comentarios"];
816                $response['ip'] = $rs->campos["ip"];
817                //$response['port'] = $rs->campos["puertorepo"];
818                jsonResponse(200, $response);
819        }
820        $rs->Cerrar();
821    }
822);
823
824/**
825 * @brief    List all images defined in an OU
826 * @note     Route: /ous/id/images, Method: GET
827 * @param    id      OU id.
828 * @return   JSON array of all UO's image data
829 */
830$app->get('/ous/:ouid/images(/)', 'validateApiKey',
831    function($ouid) {
832        global $userid;
833        global $cmd;
834
835        $ouid = htmlspecialchars($ouid);
836        // Database query.
837        $cmd->texto = <<<EOD
838SELECT adm.idadministradorcentro, adm.idcentro AS ouid, imagenes.*
839  FROM imagenes
840 RIGHT JOIN administradores_centros AS adm USING(idcentro)
841 WHERE adm.idadministradorcentro = '$userid'
842   AND adm.idcentro='$ouid';
843EOD;
844        $rs=new Recordset;
845        $rs->Comando=&$cmd;
846        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
847        $rs->Primero();
848        // Check if user is an UO admin.
849        if (checkAdmin($rs->campos["idadministradorcentro"]) and checkParameter($rs->campos["ouid"])) {
850                $response = Array();
851                while (!$rs->EOF) {
852                        if (! is_null($rs->campos["idcentro"])) {
853                                $tmp = Array();
854                                $tmp['id'] = $rs->campos["idimagen"];
855                                $tmp['name'] = $rs->campos["nombreca"];
856                                $tmp['inremotepc'] = $rs->campos["inremotepc"]==0 ? false: true;
857                                $tmp['ou']['id'] = $ouid;
858                                array_push($response, $tmp);
859                        }
860                        $rs->Siguiente();
861                }
862                jsonResponse(200, $response);
863        }
864    }
865);
866
867/**
868 * @brief    Get image data
869 * @note     Route: /ous/id1/images/id2, Method: GET
870 * @param    id1     OU id.
871 * @param    id2     image id.
872 * @return   JSON string with image parameters
873 */
874$app->get('/ous/:ouid/images/:imgid(/)', 'validateApiKey',
875    function($ouid, $imgid) {
876        global $userid;
877        global $cmd;
878
879        $ouid = htmlspecialchars($ouid);
880        $imgid = htmlspecialchars($imgid);
881        // Database query.
882        $cmd->texto = <<<EOD
883SELECT adm.idadministradorcentro, imagenes.*
884  FROM imagenes
885 RIGHT JOIN administradores_centros AS adm USING(idcentro)
886 WHERE adm.idadministradorcentro = '$userid'
887   AND adm.idcentro='$ouid'
888   AND idimagen='$imgid';
889EOD;
890        $rs=new Recordset;
891        $rs->Comando=&$cmd;
892        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
893        $rs->Primero();
894        // Check if user is an UO admin and repo exists.
895        if (checkAdmin($rs->campos["idadministradorcentro"]) and checkParameter($rs->campos["idimagen"])) {
896                // Read data.
897                $response['id'] = $rs->campos["idimagen"];
898                $response['name'] = $rs->campos["nombreca"];
899                $response['description'] = $rs->campos["descripcion"];
900                $response['comments'] = $rs->campos["comentarios"];
901                $response['inremotepc'] = $rs->campos["inremotepc"]==0 ? false: true;
902                $response['repo']['id'] = $rs->campos["idrepositorio"];
903                switch ($rs->campos["tipo"]) {
904                        // Image type.
905                        case 1:  $response['type'] = "monolithic"; break;
906                        case 2:  $response['type'] = "base"; break;
907                        case 3:  $response['type'] = "incremental";
908                                 $response['baseimg'] = $rs->campos["imagenid"];
909                                 $response['path'] = $rs->campos["ruta"];
910                                 break;
911                        default: $response['type'] = $rs->campos["tipo"];
912                }
913                if ($rs->campos["idordenador"] != 0) {
914                        // Source client data.
915                        $response['client']['id'] = $rs->campos["idordenador"];
916                        $response['client']['disk'] = $rs->campos["numdisk"];
917                        $response['client']['partition'] = $rs->campos["numpar"];
918                        $response['creationdate'] = $rs->campos["fechacreacion"];
919                        $response['release'] = $rs->campos["revision"];
920                }
921                jsonResponse(200, $response);
922        }
923        $rs->Cerrar();
924    }
925);
926
927// Lista de softeare instalado en una imagen.
928$app->get('/ous/:ouid/images/:imgid/software(/)', 'validateApiKey',
929    function($ouid, $imgid) {
930        global $userid;
931        global $cmd;
932
933        $ouid = htmlspecialchars($ouid);
934        $imgid = htmlspecialchars($imgid);
935        // Database query.
936        $cmd->texto = <<<EOD
937SELECT adm.idadministradorcentro, imagenes.idimagen, imagenes.nombreca,
938       nombresos.nombreso, softwares.descripcion
939  FROM imagenes
940 RIGHT JOIN administradores_centros AS adm USING(idcentro)
941  LEFT JOIN perfilessoft USING(idperfilsoft)
942  LEFT JOIN nombresos USING(idnombreso)
943  LEFT JOIN perfilessoft_softwares USING(idperfilsoft)
944  LEFT JOIN softwares USING(idsoftware)
945 WHERE adm.idadministradorcentro = '$userid'
946   AND imagenes.idimagen='$imgid'
947 ORDER BY softwares.descripcion ASC;
948EOD;
949        $rs=new Recordset;
950        $rs->Comando=&$cmd;
951        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
952        $rs->Primero();
953        // Check if user is an UO admin and repo exists.
954        if (checkAdmin($rs->campos["idadministradorcentro"]) and checkParameter($rs->campos["idimagen"])) {
955                $response['id'] = $rs->campos["idimagen"];
956                $response['name'] = $rs->campos["nombreca"];
957                if (is_null($rs->campos["nombreso"])) {
958                        // Null object.
959                        $response['software'] = Array();
960                        jsonResponse(200, $response, JSON_FORCE_OBJECT);
961                } else {
962                        // Read data.
963                        $response['software']['os'] = $rs->campos["nombreso"];
964                        //$response['software']['type'] = ...;  // OS type
965                        $response['software']['applications'] = Array();
966                        while (!$rs->EOF) {
967                                // Ignoring empty fields.
968                                if (!is_null($rs->campos["descripcion"])) {
969                                        array_push($response['software']['application'], $rs->campos["descripcion"]);
970                                }
971                                $rs->Siguiente();
972                        }
973                        jsonResponse(200, $response);
974                }
975        }
976        $rs->Cerrar();
977    }
978);
979
980?>
Note: See TracBrowser for help on using the repository browser.