source: admin/WebConsole/rest/index.php @ c3adb45

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

#708: Adaptar algunas respuestas REST a la documentación y comentar cambios futuros.

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

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