source: admin/WebConsole/rest/server.php @ 353c112

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

#708: Soportar obtener estado de un cliente iniciado en sistema operativo llamando a la API REST de su OGAgent.

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

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