source: admin/WebConsole/rest/server.php @ 6acd145

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 6acd145 was 606a0c7, checked in by ramon <ramongomez@…>, 8 years ago

#708: Ampliar respuestas REST:

  • /ous/:ouid/labs incluye datos de grupos de ordenadores.
  • /info incluye datos de cliente "ogclient" instalado.

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

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