source: admin/WebConsole/rest/server.php @ 566e84f

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 566e84f was 3551804, checked in by ramon <ramongomez@…>, 9 years ago

#708: Separar funciones y rutas REST comunes; nueva ruta /info con información de versión y servicios activos.

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

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