source: admin/WebConsole/rest/server.php @ 2aa8687

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

#708: Aplicar cambios de r5190 a más rutas REST.

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

  • Property mode set to 100644
File size: 33.8 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
75        // Reading JSON parameters.
76        try {
77                $input = json_decode($app->request()->getBody());
78                $user = htmlspecialchars($input->username);
79                $pass = htmlspecialchars($input->password);
80        } catch (Exception $e) {
81                // Error message.
82                $response["message"] = $e->getMessage();
83                jsonResponse(400, $response);
84                $app->stop();
85        }
86
87        // Checking parameters.
88        if (! empty($user) and ! empty($pass)) {
89                // Database query.
90                $cmd->texto = "SELECT idusuario, apikey
91                                 FROM usuarios
92                                WHERE usuario='$user' AND pasguor='$pass'";
93                $rs=new Recordset;
94                $rs->Comando=&$cmd;
95                if ($rs->Abrir()) {
96                        $rs->Primero();
97                        if (!$rs->EOF){
98                                // JSON response.
99                                $userid=$rs->campos["idusuario"];
100                                $apikey=$rs->campos["apikey"];
101                                $response['userid'] = $userid;
102                                $response['apikey'] = $apikey;
103                                jsonResponse(200, $response);
104                        } else {
105                                // Credentials error.
106                                $response['message'] = 'Login failed. Incorrect credentials';
107                                jsonResponse(401, $response);
108                                $app->stop();
109                        }
110                        $rs->Cerrar();
111                } else {
112                        // Access error.
113                        $response['message'] = "An error occurred. Please try again";
114                        jsonResponse(500, $response);
115                        $app->stop();
116                }
117        } else {
118                # Error: missing some input parameter.
119                $response['message'] = 'Missing username or password';
120                jsonResponse(400, $response);
121                $app->stop();
122        }
123    }
124);
125
126/**
127 * @brief    List all defined Organizational Units
128 * @note     Route: /ous, Method: GET
129 * @param    no
130 * @return   JSON array with id. and name for every defined OU
131 */
132$app->get('/ous(/)', function() {
133        global $cmd;
134
135        $cmd->texto = "SELECT * FROM centros";
136        $rs=new Recordset;
137        $rs->Comando=&$cmd;
138        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
139        $response = array();
140        $rs->Primero();
141        while (!$rs->EOF) {
142                $tmp = array();
143                $tmp['id'] = $rs->campos["idcentro"];
144                $tmp['name'] = $rs->campos["nombrecentro"];
145                array_push($response, $tmp);
146                $rs->Siguiente();
147        }
148        $rs->Cerrar();
149        jsonResponse(200, $response);
150   }
151);
152
153/**
154 * @brief    Get Organizational Unit data
155 * @note     Route: /ous/id, Method: GET
156 * @param    id      OU id.
157 * @return   JSON string with OU's parameters
158 */
159$app->get('/ous/:ouid(/)', 'validateApiKey',
160    function($ouid) {
161        global $cmd;
162        global $userid;
163
164        $ouid = htmlspecialchars($ouid);
165        // Show OU information if user is OU's admin.
166        $cmd->texto = <<<EOD
167SELECT *
168  FROM centros
169 RIGHT JOIN administradores_centros USING(idcentro)
170 WHERE administradores_centros.idadministradorcentro = '$userid'
171   AND centros.idcentro = '$ouid'
172 LIMIT 1;
173EOD;
174        $rs=new Recordset;
175        $rs->Comando=&$cmd;
176        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
177        $rs->Primero();
178        if (checkAdmin($rs->campos["idadministradorcentro"]) and
179            checkParameter($rs->campos["idcentro"])) {
180                $response['id'] = $ouid;
181                $response['name'] = $rs->campos["nombrecentro"];
182                $response['description'] = $rs->campos["comentarios"];
183                jsonResponse(200, $response);
184        }
185        $rs->Cerrar();
186    }
187);
188
189/**
190 * @brief    List group of labs in an Organizational Unit
191 * @note     Route: /ous/id/groups, Method: GET
192 * @param    id      OU id.
193 * @return   JSON array of OU groups
194 */
195$app->get('/ous/:ouid/groups(/)', 'validateApiKey', function($ouid) {
196        global $cmd;
197        global $userid;
198
199        $ouid = htmlspecialchars($ouid);
200        // List group of labs if user is OU's admin.
201        $cmd->texto = <<<EOD
202SELECT adm.idadministradorcentro, grupos.*
203  FROM grupos
204 RIGHT JOIN administradores_centros AS adm USING(idcentro)
205 WHERE adm.idadministradorcentro = '$userid'
206   AND idcentro='$ouid';
207EOD;
208        $rs=new Recordset;
209        $rs->Comando=&$cmd;
210        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
211        $rs->Primero();
212        // Check if user is an UO admin.
213        if (checkAdmin($rs->campos["idadministradorcentro"])) {
214                $response = array();
215                // Read data.
216                if (! is_null($rs->campos["idcentro"])) {
217                        while (!$rs->EOF) {
218                                $tmp = array();
219                                $tmp['id'] = $rs->campos["idgrupo"];
220                                $tmp['name'] = $rs->campos["nombregrupo"];
221                                $tmp['type'] = $rs->campos["tipo"];
222                                $tmp['comments'] = $rs->campos["comentarios"];
223                                if($rs->campos["grupoid"] != 0){
224                                        $tmp['parent']['id'] = $rs->campos["grupoid"];
225                                }
226                                array_push($response, $tmp);
227                                $rs->Siguiente();
228                        }
229                }
230                jsonResponse(200, $response);
231        }
232        $rs->Cerrar();
233    }
234);
235
236/**
237 * @brief    List all labs defined in an OU
238 * @note     Route: /ous/id/labs, Method: GET
239 * @param    id      OU id.
240 * @return   JSON array of all UO's labs data
241 */
242$app->get('/ous/:ouid/labs(/)', 'validateApiKey',
243    function($ouid) {
244        global $userid;
245        global $cmd;
246
247        $ouid = htmlspecialchars($ouid);
248        // Database query.
249        $cmd->texto = <<<EOD
250SELECT adm.idadministradorcentro, aulas.*, grp.idgrupo AS group_id,
251       grp.nombregrupoordenador, grp.grupoid AS group_group_id, grp.comentarios
252  FROM aulas
253 RIGHT JOIN administradores_centros AS adm USING(idcentro)
254  LEFT JOIN gruposordenadores AS grp USING(idaula)
255 WHERE adm.idadministradorcentro = '$userid'
256   AND idcentro='$ouid'
257 ORDER BY aulas.idaula, grp.idgrupo
258EOD;
259        $rs=new Recordset;
260        $rs->Comando=&$cmd;
261        if (!$rs->Abrir()) return(false);       // Error opening recordset.
262        // Check if user is an UO admin.
263        $rs->Primero();
264        if (checkAdmin($rs->campos["idadministradorcentro"])) {
265                $response = array();
266                if (! is_null($rs->campos["idcentro"])) {
267                        while (!$rs->EOF) {
268                                // En los resultados las aulas vienen repetidas tantas veces como grupos tengan, solo dejamos uno
269                                $classroomIndex = -1;
270                                $found=false;
271                                $index = 0;
272                                while(!$found && $index < count($response)){
273                                        if(isset($response[$index]["id"]) && $response[$index]["id"] == $rs->campos["idaula"]){
274                                                $classroomIndex = $index;
275                                                $found = true;
276                                        }
277                                        $index++;
278                                }
279                                if(!$found){
280                                        $tmp = array();
281                                        $tmp['id'] = $rs->campos["idaula"];
282                                        $tmp['name'] = $rs->campos["nombreaula"];
283                                        $tmp['inremotepc'] = $rs->campos["inremotepc"]==0 ? false: true;
284                                        $tmp['group']['id'] = $rs->campos["grupoid"];
285                                        $tmp['ou']['id'] = $ouid;
286                                        array_push($response, $tmp);
287                                }
288                                else{
289                                        // Le añadimos el grupo en cuestion siempre que no sea un subgrupo
290                                        if($rs->campos["group_group_id"] == 0){
291                                                array_push($response[$classroomIndex]['classroomGroups'],
292                                                        array("id" => $rs->campos["group_id"],
293                                                        "name" => $rs->campos["nombregrupoordenador"],
294                                                        "comments" => $rs->campos["comentarios"],
295                                                        "classroomGroups" => array()));
296                                        }
297                                        else {
298                                                // Buscamos el grupo donde añadir el grupo
299                                                addClassroomGroup($response[$classroomIndex]['classroomGroups'], $rs);
300                                        }
301                                }
302                                $rs->Siguiente();
303                        }
304                }
305                jsonResponse(200, $response);
306        }
307        $rs->Cerrar();
308    }
309);
310
311/**
312 * @brief    Get lab data
313 * @note     Route: /ous/id1/labs/id2, Method: GET
314 * @param    id1     OU id.
315 * @param    id2     lab id.
316 * @return   JSON string with lab parameters
317 */
318$app->get('/ous/:ouid/labs/:labid(/)', 'validateApiKey',
319    function($ouid, $labid) {
320        global $userid;
321        global $cmd;
322
323        $ouid = htmlspecialchars($ouid);
324        $labid = htmlspecialchars($labid);
325        // Database query.
326        $cmd->texto = <<<EOD
327SELECT adm.idadministradorcentro, COUNT(idordenador) AS defclients, aulas.*
328  FROM aulas
329 RIGHT JOIN administradores_centros AS adm USING(idcentro)
330  LEFT JOIN ordenadores USING(idaula)
331 WHERE adm.idadministradorcentro = '$userid'
332   AND idcentro='$ouid'
333   AND idaula='$labid';
334EOD;
335        $rs=new Recordset;
336        $rs->Comando=&$cmd;
337        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
338        $rs->Primero();
339        // Check if user is an UO admin and lab exists.
340        if (checkAdmin($rs->campos["idadministradorcentro"]) and checkParameter($rs->campos["idaula"])) {
341                $response['id'] = $rs->campos["idaula"];
342                $response['name'] = $rs->campos["nombreaula"];
343                $response['location'] = $rs->campos["ubicacion"];
344                $response['description'] = $rs->campos["comentarios"];
345                $response['inremotepc'] = $rs->campos["inremotepc"]==0 ? false: true;
346                $response['capacity'] = $rs->campos["puestos"];
347                $response['defclients'] = $rs->campos["defclients"];
348                $response['projector'] = $rs->campos["cagnon"]==0 ? false: true;
349                $response['board'] = $rs->campos["pizarra"]==0 ? false: true;
350                $response['routerip'] = $rs->campos["router"];
351                $response['netmask'] = $rs->campos["netmask"];
352                $response['ntp'] = $rs->campos["ntp"];
353                $response['dns'] = $rs->campos["dns"];
354                $response['proxyurl'] = $rs->campos["proxy"];
355                switch ($rs->campos["modomul"]) {
356                        case 1:  $response['mcastmode'] = "half-duplex"; break;
357                        case 2:  $response['mcastmode'] = "full-duplex"; break;
358                        default: $response['mcastmode'] = $rs->campos["modomul"];
359                }
360                $response['mcastip'] = $rs->campos["ipmul"];
361                $response['mcastport'] = $rs->campos["pormul"];
362                $response['mcastspeed'] = $rs->campos["velmul"];
363                $response['p2pmode'] = $rs->campos["modp2p"];
364                $response['p2ptime'] = $rs->campos["timep2p"];
365                $response['picture'] = $rs->campos["urlfoto"];
366                jsonResponse(200, $response);
367        }
368        $rs->Cerrar();
369    }
370);
371
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',
380    function($ouid, $labid) {
381        global $userid;
382        global $cmd;
383
384        $ouid = htmlspecialchars($ouid);
385        $labid = htmlspecialchars($labid);
386        // Database query.
387        $cmd->texto = <<<EOD
388SELECT adm.idadministradorcentro, ordenadores.*, aulas.idaula AS labid
389  FROM ordenadores
390 RIGHT JOIN aulas USING(idaula)
391 RIGHT JOIN administradores_centros AS adm USING(idcentro)
392 WHERE adm.idadministradorcentro = '$userid'
393   AND adm.idcentro='$ouid'
394   AND aulas.idaula='$labid';
395EOD;
396        $rs=new Recordset;
397        $rs->Comando=&$cmd;
398        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
399        $rs->Primero();
400        // Check if user is an UO admin and lab exists.
401        if (checkAdmin($rs->campos["idadministradorcentro"]) and checkParameter($rs->campos["labid"])) {
402                $response = array();
403                while (!$rs->EOF) {
404                        if (!is_null($rs->campos["idordenador"])) {
405                                $tmp = array();
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                        }
414                        $rs->Siguiente();
415                }
416                jsonResponse(200, $response);
417        }
418        $rs->Cerrar();
419    }
420);
421
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.
428 * @return   JSON string with hardware parameters
429 */
430$app->get('/ous/:ouid/labs/:labid/clients/:clntid(/)', 'validateApiKey',
431    function($ouid, $labid, $clntid) {
432        global $userid;
433        global $cmd;
434
435        $ouid = htmlspecialchars($ouid);
436        $labid = htmlspecialchars($labid);
437        $clntid = htmlspecialchars($clntid);
438        // Database query.
439        $cmd->texto = <<<EOD
440SELECT adm.idadministradorcentro, ordenadores.*
441  FROM ordenadores
442  JOIN aulas USING(idaula)
443 RIGHT JOIN administradores_centros AS adm USING(idcentro)
444 WHERE adm.idadministradorcentro = '$userid'
445   AND idcentro='$ouid'
446   AND idaula='$labid'
447   AND idordenador='$clntid';
448EOD;
449        $rs=new Recordset;
450        $rs->Comando=&$cmd;
451        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
452        $rs->Primero();
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"])) {
455                // Read data.
456                $response['id'] = $rs->campos["idordenador"];
457                $response['name'] = $rs->campos["nombreordenador"];
458                $response['serialno'] = $rs->campos["numserie"];
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"];
465                $response['repo']['id'] = $rs->campos["idrepositorio"];
466                //$response['hardprofile']['id'] = $rs->campos["idperfilhard"];
467                //$response['menu']['id'] = $rs->campos["idmenu"];
468                $response['validation'] = $rs->campos["validacion"]==0 ? false: true;
469                $response['boottype'] = $rs->campos["arranque"];
470                $response['picture'] = $rs->campos["fotoord"];
471                jsonResponse(200, $response);
472        }
473        $rs->Cerrar();
474    }
475);
476
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',
486    function($ouid, $labid, $clntid) {
487        global $userid;
488        global $cmd;
489
490        $ouid = htmlspecialchars($ouid);
491        $labid = htmlspecialchars($labid);
492        $clntid = htmlspecialchars($clntid);
493        // Database query.
494        $cmd->texto = <<<EOD
495SELECT adm.idadministradorcentro, ordenadores.idordenador, ordenadores.nombreordenador,
496       tipohardwares.nemonico, hardwares.descripcion
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';
507EOD;
508        $rs=new Recordset;
509        $rs->Comando=&$cmd;
510        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
511        $rs->Primero();
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.
515                $response['id'] = $rs->campos["idordenador"];
516                $response['name'] = $rs->campos["nombreordenador"];
517                $response['hardware'] = array();
518                while (!$rs->EOF) {
519                        if (!is_null($rs->campos["nemonico"])) {
520                                $tmp = array();
521                                $tmp['type'] = $rs->campos["nemonico"];
522                                $tmp['description'] = $rs->campos["descripcion"];
523                                array_push($response['hardware'], $tmp);
524                        }
525                        $rs->Siguiente();
526                }
527                jsonResponse(200, $response);
528        }
529        $rs->Cerrar();
530    }
531);
532
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',
542    function($ouid, $labid, $clntid) {
543        global $userid;
544        global $cmd;
545
546        $ouid = htmlspecialchars($ouid);
547        $labid = htmlspecialchars($labid);
548        $clntid = htmlspecialchars($clntid);
549        // Database query.
550        $cmd->texto = <<<EOD
551SELECT adm.idadministradorcentro, ordenadores.idordenador AS clientid,
552       ordenadores.nombreordenador, ordenadores_particiones.*, tipospar.tipopar,
553       sistemasficheros.nemonico, nombresos.nombreso, imagenes.nombreca,
554       (imagenes.revision - ordenadores_particiones.revision) AS difimagen
555  FROM ordenadores_particiones
556 RIGHT JOIN ordenadores USING(idordenador)
557  JOIN aulas USING(idaula)
558 RIGHT JOIN administradores_centros AS adm USING(idcentro)
559  LEFT JOIN tipospar USING(codpar)
560  LEFT JOIN sistemasficheros USING(idsistemafichero)
561  LEFT JOIN nombresos USING(idnombreso)
562  LEFT JOIN imagenes USING(idimagen)
563 WHERE adm.idadministradorcentro = '$userid'
564   AND adm.idcentro='$ouid'
565   AND aulas.idaula='$labid'
566   AND ordenadores.idordenador='$clntid'
567 ORDER BY numdisk ASC, numpar ASC;
568EOD;
569        $rs=new Recordset;
570        $rs->Comando=&$cmd;
571        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
572        $rs->Primero();
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.
576                $response['id'] = $rs->campos["clientid"];
577                $response['name'] = $rs->campos["nombreordenador"];
578                $response['diskcfg'] = array();
579                while (!$rs->EOF) {
580                        if ($rs->campos["numdisk"] == 0) {
581                                $rs->Siguiente();
582                                continue;
583                        }
584                        $tmp = array();
585                        if ($rs->campos["numpar"] == 0) {
586                                // Disk data.
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 {
597                                // Partition data.
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"];
605                                        if ($rs->campos["idimagen"] > 0) {
606                                                // Restored image data.
607                                                $tmp['image']['id'] = $rs->campos["idimagen"];
608                                                $tmp['image']['deploydate'] = $rs->campos["fechadespliegue"];
609                                                // Check if image is updated.
610                                                $tmp['image']['updated'] = ($rs->campos["difimagen"]>0 ? "false" : "true");
611                                        }
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
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 */
632$app->get('/ous/:ouid/labs/:labid/clients/:clntid/status(/)', 'validateApiKey',
633    function($ouid, $labid, $clntid) {
634        global $userid;
635        global $cmd;
636        global $LONCABECERA;
637        global $LONHEXPRM;
638
639        // Status mapping.
640        $status = array('OFF'=>"off",
641                        'INI'=>"initializing",
642                        'OPG'=>"ogclient",
643                        'BSY'=>"busy",
644                        'LNX'=>"linux",
645                        'WIN'=>"windows");
646        // Parameters.
647        $ouid = htmlspecialchars($ouid);
648        $labid = htmlspecialchars($labid);
649        $clntid = htmlspecialchars($clntid);
650
651        // Database query.
652        $cmd->texto = <<<EOD
653SELECT adm.idadministradorcentro, entornos.ipserveradm, entornos.portserveradm,
654       ordenadores.idordenador, ordenadores.ip
655  FROM entornos, ordenadores
656  JOIN aulas USING(idaula)
657 RIGHT JOIN administradores_centros AS adm USING(idcentro)
658 WHERE adm.idadministradorcentro = '$userid'
659   AND adm.idcentro='$ouid'
660   AND aulas.idaula='$labid'
661   AND ordenadores.idordenador='$clntid';
662EOD;
663        $rs=new Recordset;
664        $rs->Comando=&$cmd;
665        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
666        $rs->Primero();
667        // Check if user is an UO admin and client exists.
668        if (checkAdmin($rs->campos["idadministradorcentro"]) and checkParameter($rs->campos["idordenador"])) {
669                // First, try to connect to ogAdmCleint service.
670                $serverip = $rs->campos["ipserveradm"];
671                $serverport = $rs->campos["portserveradm"];
672                $clientid = $rs->campos["idordenador"];
673                $clientip = $rs->campos["ip"];
674
675                // Connect to reset client's status.
676                $reqframe = "nfn=Sondeo\r".
677                            "ido=$clientid\r".
678                            "iph=$clientip\r";
679                $result = sendCommand($serverip, $serverport, $reqframe, $values);
680
681                // Connect to fetch client's status.
682                // Asuming client is off by default.
683                $values["tso"]="OFF";
684                // Iterate to check client's status.
685                // Exit if status!=OFF or end iterations (status=OFF).
686                $maxIter = 30;
687                for ($i=1; $i<$maxIter and preg_match('/OFF/', $values["tso"]); $i++) {
688                        // Connect to check status.
689                        $reqframe = "nfn=respuestaSondeo\r".
690                                    "ido=$clientid\r".
691                                    "iph=$clientip\r";
692                        $result = sendCommand($serverip, $serverport, $reqframe, $values);
693                        // Wait until next checking (0.1 ms).
694                        usleep(100000);
695                }
696
697                // Parse status response.
698                if ($result) {
699                        // Check status type.
700                        if (checkParameter($values["tso"])) {
701                                // Compose JSON response.
702                                $response['id'] = $clientid;
703                                $response['ip'] = $clientip;
704                                $stat = array();
705                                preg_match('/\/[A-Z]*;/', $values["tso"], $stat);
706                                // Check if data exists.
707                                if (empty($stat[0]) or preg_match('/OFF/', $stat[0])) {
708                                        // If no data, check OGAgent API connection.
709                                        $url = "https://$clientip:8000/opengnsys/status";
710                                        $result = multiRequest(Array($url));
711                                        if (empty($result[0]['data'])) {
712                                                // Client is off.
713                                                $response['status'] = $status['OFF'];
714                                        } else {
715                                                // Get status and session data.
716                                                $data = json_decode($result[0]['data']);
717                                                if (isset($status[$data->status])) {
718                                                        $response['status'] = $status[$data->status];
719                                                        $response['loggedin'] = $data->loggedin;
720                                                }
721                                        }
722                                } else {
723                                        $response['status'] = $status[substr($stat[0], 1, 3)];
724                                }
725                                if (empty($response['status'])) {
726                                        $response['status'] = "unknown";
727                                }
728                                jsonResponse(200, $response);
729                        }
730                } else {
731                        // Access error.
732                        $response['message'] = "Cannot access to OpenGnsys server";
733                        jsonResponse(500, $response);
734                }
735        }
736        $rs->Cerrar();
737    }
738);
739
740
741/**
742 * @brief    List all image repositories defined in an OU
743 * @note     Route: /ous/id/repos, Method: GET
744 * @param    id      OU id.
745 * @return   JSON array of all UO's repo data
746 */
747$app->get('/ous/:ouid/repos(/)', 'validateApiKey',
748    function($ouid) {
749        global $userid;
750        global $cmd;
751
752        $ouid = htmlspecialchars($ouid);
753        // Database query.
754        $cmd->texto = <<<EOD
755SELECT adm.idadministradorcentro, repositorios.*
756  FROM repositorios
757 RIGHT JOIN administradores_centros AS adm USING(idcentro)
758 WHERE adm.idadministradorcentro = '$userid'
759   AND adm.idcentro='$ouid';
760EOD;
761        $rs=new Recordset;
762        $rs->Comando=&$cmd;
763        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
764        $rs->Primero();
765        // Check if user is an UO admin.
766        if (checkAdmin($rs->campos["idadministradorcentro"]) and checkParameter($rs->campos["idcentro"])) {
767                $response = array();
768                while (!$rs->EOF) {
769                        if (! is_null($rs->campos["idcentro"])) {
770                                $tmp = array();
771                                $tmp['id'] = $rs->campos["idrepositorio"];
772                                $tmp['name'] = $rs->campos["nombrerepositorio"];
773                                $tmp['ou']['id'] = $ouid;
774                                array_push($response, $tmp);
775                        }
776                        $rs->Siguiente();
777                }
778                jsonResponse(200, $response);
779        }
780        $rs->Cerrar();
781    }
782);
783
784/**
785 * @brief    Get image repository data
786 * @note     Route: /ous/id1/repos/id2, Method: GET
787 * @param    id1     OU id.
788 * @param    id2     repo id.
789 * @return   JSON string with repo parameters
790 */
791$app->get('/ous/:ouid/repos/:repoid(/)', 'validateApiKey',
792    function($ouid, $repoid) {
793        global $userid;
794        global $cmd;
795
796        $ouid = htmlspecialchars($ouid);
797        $repoid = htmlspecialchars($repoid);
798        // Database query.
799        $cmd->texto = <<<EOD
800SELECT adm.idadministradorcentro, repositorios.*
801  FROM repositorios
802 RIGHT JOIN administradores_centros AS adm USING(idcentro)
803 WHERE adm.idadministradorcentro = '$userid'
804   AND adm.idcentro='$ouid'
805   AND idrepositorio='$repoid';
806EOD;
807        $rs=new Recordset;
808        $rs->Comando=&$cmd;
809        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
810        $rs->Primero();
811        // Check if user is an UO admin and repo exists.
812        if (checkAdmin($rs->campos["idadministradorcentro"]) and checkParameter($rs->campos["idrepositorio"])) {
813                // Read data.
814                $response['id'] = $rs->campos["idrepositorio"];
815                $response['name'] = $rs->campos["nombrerepositorio"];
816                $response['description'] = $rs->campos["comentarios"];
817                $response['ip'] = $rs->campos["ip"];
818                //$response['port'] = $rs->campos["puertorepo"];
819                jsonResponse(200, $response);
820        }
821        $rs->Cerrar();
822    }
823);
824
825// Listar imágenes.
826$app->get('/ous/:ouid/images', 'validateApiKey',
827    function($ouid) {
828        global $cmd;
829
830        $ouid = htmlspecialchars($ouid);
831        // Listar las salas de la UO si el usuario de la apikey es su admin.
832        // Consulta temporal,
833        $cmd->texto = "SELECT * FROM imagenes WHERE idcentro='$ouid';";
834        $rs=new Recordset;
835        $rs->Comando=&$cmd;
836        if (!$rs->Abrir()) return(false); // Error al abrir recordset
837        // Comprobar que exista la UO.
838        $rs->Primero();
839        if (checkParameter($rs->campos["idcentro"])) {
840                $response = array();
841                while (!$rs->EOF) {
842                        $tmp = array();
843                        $tmp['id'] = $rs->campos["idimagen"];
844                        $tmp['name'] = $rs->campos["nombreca"];
845                        $tmp['inremotepc'] = $rs->campos["inremotepc"]==0 ? false: true;
846                        $tmp['ou']['id'] = $ouid;
847                        array_push($response, $tmp);
848                        $rs->Siguiente();
849                }
850                jsonResponse(200, $response);
851        }
852    }
853);
854
855// Obtener datos de una imagen.
856$app->get('/ous/:ouid/images/:imgid', 'validateApiKey',
857    function($ouid, $imgid) {
858        global $cmd;
859
860        $ouid = htmlspecialchars($ouid);
861        $imgid = htmlspecialchars($imgid);
862        $cmd->texto = "SELECT * FROM imagenes WHERE idimagen='$imgid';";
863        $rs=new Recordset;
864        $rs->Comando=&$cmd;
865        if (!$rs->Abrir()) return(false); // Error al abrir recordset
866        $rs->Primero();
867        // Comprobar que exista el repositorio.
868        if (checkParameter($rs->campos["idimagen"])) {
869                $response['id'] = $rs->campos["idimagen"];
870                $response['name'] = $rs->campos["nombreca"];
871                $response['description'] = $rs->campos["descripcion"];
872                $response['comments'] = $rs->campos["comentarios"];
873                $response['inremotepc'] = $rs->campos["inremotepc"]==0 ? false: true;
874                $response['repo']['id'] = $rs->campos["idrepositorio"];
875                switch ($rs->campos["tipo"]) {
876                        case 1:  $response['type'] = "monolithic"; break;
877                        case 2:  $response['type'] = "base"; break;
878                        case 3:  $response['type'] = "incremental";
879                                 $response['baseimg'] = $rs->campos["imagenid"];
880                                 $response['path'] = $rs->campos["ruta"];
881                                 break;
882                        default: $response['type'] = $rs->campos["tipo"];
883                }
884                if ($rs->campos["idordenador"] != 0) {
885                        $response['client']['id'] = $rs->campos["idordenador"];
886                        $response['client']['disk'] = $rs->campos["numdisk"];
887                        $response['client']['partition'] = $rs->campos["numpar"];
888                        $response['creationdate'] = $rs->campos["fechacreacion"];
889                        $response['release'] = $rs->campos["revision"];
890                }
891                jsonResponse(200, $response);
892        }
893        $rs->Cerrar();
894    }
895);
896
897// Lista de softeare instalado en una imagen.
898$app->get('/ous/:ouid/images/:imgid/software', 'validateApiKey',
899    function($ouid, $imgid) {
900        global $cmd;
901
902        $ouid = htmlspecialchars($ouid);
903        $imgid = htmlspecialchars($imgid);
904        $cmd->texto = <<<EOD
905SELECT imagenes.idimagen, imagenes.nombreca, nombresos.nombreso, softwares.descripcion
906  FROM perfilessoft
907 RIGHT JOIN imagenes USING(idperfilsoft)
908  LEFT JOIN nombresos USING(idnombreso)
909  LEFT JOIN perfilessoft_softwares USING(idperfilsoft)
910  LEFT JOIN softwares USING(idsoftware)
911 WHERE imagenes.idimagen='$imgid'
912 ORDER BY softwares.descripcion ASC;
913EOD;
914        $rs=new Recordset;
915        $rs->Comando=&$cmd;
916        if (!$rs->Abrir()) return(false);       // Error al abrir recordset
917        $rs->Primero();
918        // Comprobar que exista el repositorio.
919        if (checkParameter($rs->campos["idimagen"])) {
920                $response['id'] = $rs->campos["idimagen"];
921                $response['name'] = $rs->campos["nombreca"];
922                $response['os'] = $rs->campos["nombreso"];
923                //$response['ostype'] = Tipo de SO (agrupar en array con nombre SO).
924                $response['software'] = array();
925                while (!$rs->EOF) {
926                        if ($rs->campos["descripcion"] == null) {
927                                $rs->Siguiente();
928                                continue;
929                        }
930                        $tmp = array();
931                        $tmp['application'] = $rs->campos["descripcion"];
932                        array_push($response['software'], $tmp);
933                        $rs->Siguiente();
934                }
935                jsonResponse(200, $response);
936        }
937        $rs->Cerrar();
938    }
939);
940
941// Arrancar un ordenador con una imagen instalada, elegido al azar.
942$app->get('/ous/:id1/images/:id2/boot', 'validateApiKey',
943    function($ouid, $imageid) {
944        global $cmd;
945        global $AMBITO_ORDENADORES;
946        global $EJECUCION_COMANDO;
947        global $ACCION_INICIADA;
948        global $ACCION_SINRESULTADO;
949
950        // Pparameters.
951        $ouid = htmlspecialchars($ouid);
952        $imegeid = htmlspecialchars($imageid);
953        // Boot 1 client.
954        $nclients = 1;
955
956        // Query: server data and all clients' boot data availabe for Remote PC with this image installed (random order).
957        $cmd->texto = <<<EOD
958SELECT s.ipserveradm, s.portserveradm,
959       c.idordenador, c.ip, c.mac, p.numdisk, p.numpar
960  FROM entornos AS s, ordenadores AS c
961  JOIN aulas USING(idaula)
962  JOIN centros USING(idcentro)
963  JOIN ordenadores_particiones AS p USING(idordenador)
964  JOIN imagenes USING(idimagen)
965 WHERE centros.idcentro='$ouid'
966   AND aulas.inremotepc=1
967   AND imagenes.idimagen='$imageid'
968   AND imagenes.inremotepc=1
969 ORDER BY RAND();
970EOD;
971        $rs=new Recordset;
972        $rs->Comando=&$cmd;
973        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
974        $rs->Primero();
975        if (checkParameter($rs->campos["ipserveradm"])) {
976
977                $response['imageid'] = $imageid;
978                $response['sendto'] = array();
979
980                // AVISO: Procesar datos del servidor (solo 1er registro).
981
982                $serverip = $rs->campos["ipserveradm"];
983                $serverport = $rs->campos["portserveradm"];
984
985                // AVISO: Procesar datos de los clientes.
986
987                $clientid = array();
988                $clientip = array();
989                $clientmac = array();
990                $clientdisk = array();
991                $clientpart = array();
992                while (!$rs->EOF) {
993                        array_push($clientid, $rs->campos["idordenador"]);
994                        array_push($clientip, $rs->campos["ip"]);
995                        array_push($clientmac, $rs->campos["mac"]);
996                        array_push($clientdisk, $rs->campos["numdisk"]);
997                        array_push($clientpart, $rs->campos["numpar"]);
998                        $rs->Siguiente();
999                }
1000                $rs->Cerrar();
1001
1002                // AVISO: consultar el estado de todos los clientes y
1003                //        quitar aquellos que no tengan "OFF", "OPG" o ""
1004                //        (estudiar si incluir los "BSY")
1005
1006                // Reset clients' status.
1007                $reqframe = "nfn=Sondeo\r".
1008                            "ido=".implode(',', $clientid)."\r".
1009                            "iph=".implode(';', $clientip)."\r";
1010                sendCommand($serverip, $serverport, $reqframe, $values);
1011                 // Wait to get response.
1012                sleep(3);
1013                // Connect to check status.
1014                $reqframe = "nfn=respuestaSondeo\r".
1015                            "ido=".implode(',', $clientid)."\r".
1016                            "iph=".implode(';', $clientip)."\r";
1017                sendCommand($serverip, $serverport, $reqframe, $values);
1018                // Check status type.
1019                if (isset($values["tso"])) {
1020                        preg_match_all('/[A-Z]{3}/', $values["tso"], $stat);
1021                }
1022                if (isset($stat[0])) {
1023                        for ($i=0; $i<sizeof($stat[0]); $i++) {
1024                                if (! in_array($stat[0][$i], array("OFF", "OPG", ""))) {
1025                                        unset($clientid[$i]);
1026                                        unset($clientip[$i]);
1027                                        unset($clientmac[$i]);
1028                                        unset($clientdisk[$i]);
1029                                        unset($clientpart[$i]);
1030                                }
1031                        }
1032                }
1033
1034                // AVISO: el siguiente código inicia un único cliente.
1035                //        Para iniciar varios:
1036                //        - id. clientes separados por carácter ','.
1037                //        - IP clientes separadas por carácter ';'
1038                //        - MAC clientes separadas por carácter ';'
1039
1040                // Executing boot command.
1041                $reqframe = "nfn=Arrancar\r".
1042                            "ido=".implode(',', $clientid)."\r".
1043                            "iph=".implode(';', $clientip)."\r".
1044                            "mac=".implode(';', $clientmac)."\r".
1045                            "mar=1\r";
1046echo "req=".str_replace("\r"," ",$reqframe).".\n";
1047                sendCommand($serverip, $serverport, $reqframe, $values);
1048                if ($values["res"]) {
1049print_r($values);
1050                        $tmp = array();
1051                        for ($i=0, $boot=0; $i<sizeof($clientid) and $boot!=1; $i++) {
1052                                $reqframe = "nfn=IniciarSesion\r".
1053                                            "ido=".$clientid[$i]."\r".
1054                                            "iph=".$clientip[$i]."\r".
1055                                            "dsk=".$clientdisk[$i]."\r".
1056                                            "par=".$clientpart[$i]."\r";
1057echo "i=$i: req=".str_replace("\r"," ",$reqframe).".\n";
1058                                sendCommand($serverip, $serverport, $reqframe, $values);
1059                                if ($values["res"]) {
1060
1061                                        // AVISO: incluir comando Iniciar sesión en cola de acciones.
1062                                        $timestamp=time();
1063                                        $cmd->texto = <<<EOD
1064INSERT INTO acciones
1065        SET tipoaccion=$EJECUCION_COMANDO,
1066            idtipoaccion=9,
1067            idcomando=9,
1068            parametros='nfn=IniciarSesion\rdsk=$clientdisk[$i]\rpar=$clientpart[$i]',
1069            descriaccion='RemotePC Session',
1070            idordenador=$clientid[$i],
1071            ip='$clientip[$i]',
1072            sesion=$timestamp,
1073            fechahorareg=NOW(),
1074            estado=$ACCION_INICIADA,
1075            resultado=$ACCION_SINRESULTADO,
1076            ambito=$AMBITO_ORDENADORES,
1077            idambito=$clientid[$i],
1078            restrambito='$clientip[$i]',
1079            idcentro=$ouid;
1080EOD;
1081                                        $result = $cmd->Ejecutar();
1082                                        if ($result) {
1083                                                $tmp['id'] = $clientid[$i];
1084                                                $tmp['ip'] = $clientip[$i];
1085                                                $tmp['mac'] = $clientmac[$i];
1086                                                array_push($response['sendto'], $tmp);
1087                                                $boot = 1;
1088                                        }
1089                                }
1090                        }
1091                }
1092                jsonResponse(200, $response);
1093        }
1094    }
1095);
1096// Alternativa como método GET.
1097//$app->get('/ous/:id1/images/:id2/boot/:number', 'validateApiKey',
1098//    function($ouid, $imageid, $number) {
1099//
1100//   }
1101//);
1102
1103?>
Note: See TracBrowser for help on using the repository browser.