source: admin/WebConsole/rest/index.php @ 9052b52

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

#708: Usar formato JSON en los parámetros POST de la ruta REST /login.

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

  • Property mode set to 100644
File size: 30.1 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 * @brief    Send a command to OpenGnsys ogAdmServer and get request.
148 * @param    string serverip    Server IP address.
149 * @param    string serverport  Server port.
150 * @param    string reqframe    Request frame (field's separator is "\r").
151 * @param    array values       Response values (out parameter).
152 * @return   boolean            "true" if success, otherwise "false".
153 */
154function sendCommand($serverip, $serverport, $reqframe, &$values) {
155        global $LONCABECERA;
156        global $LONHEXPRM;
157
158        // Connect to server.
159        $respvalues = "";
160        $connect = new SockHidra($serverip, $serverport);
161        if ($connect->conectar()) {
162                // Send request frame to server.
163                $result = $connect->envia_peticion($reqframe);
164                if ($result) {
165                        // Parse request frame.
166                        $respframe = $connect->recibe_respuesta();
167                        $connect->desconectar();
168                        $paramlen = hexdec(substr($respframe, $LONCABECERA, $LONHEXPRM));
169                        $params = substr($respframe, $LONCABECERA+$LONHEXPRM, $paramlen);
170                        // Fetch values and return result.
171                        $values = extrae_parametros($params, "\r", '=');
172                        return ($values);
173                } else {
174                        // Return with error.
175                        return (false);
176                }
177        } else {
178                // Return with error.
179                return (false);
180        }
181}
182
183// Define REST routes.
184
185/**
186 * @brief    user login.
187 * URL: /login
188 * Método: 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 * Listar todas las Unidades Organizativas definidas.
259 * URL: /ous
260 * Método: GET
261 * Parámetros: no
262 * Devuelve: array JSON con ouid y ouname de las Unidades Organizativas definidas.
263 */
264$app->get('/ous', 'validateApiKey', function() {
265        global $cmd;
266
267        $cmd->texto = "SELECT * FROM centros";
268        $rs=new Recordset;
269        $rs->Comando=&$cmd;
270        if (!$rs->Abrir()) return(false); // Error al abrir recordset
271        $response['error'] = false;
272        $response['ous'] = array();
273        $rs->Primero();
274        while (!$rs->EOF) {
275                $tmp = array();
276                $tmp['ouid'] = $rs->campos["idcentro"];
277                $tmp['ouname'] = $rs->campos["nombrecentro"];
278                array_push($response['ous'], $tmp);
279                $rs->Siguiente();
280        }
281        $rs->Cerrar();
282        jsonResponse(200, $response);
283}
284);
285
286/**
287 * Obtener datos de una Unidad Organizativa.
288 * URL: /ous/id (id. de la UO)
289 * Método: GET
290 * Devuelve: ouid, ouname y description
291 */
292$app->get('/ous/:ouid', 'validateApiKey',
293    function($ouid) {
294        global $cmd;
295
296        $ouid = htmlspecialchars($ouid);
297        $cmd->texto = "SELECT * FROM centros WHERE idcentro='$ouid';";
298        $rs=new Recordset;
299        $rs->Comando=&$cmd;
300        if (!$rs->Abrir()) return(false); // Error al abrir recordset
301        $rs->Primero();
302        if (checkParameter($rs->campos["nombrecentro"])) {
303                $response['error'] = false;
304                $response['ouid'] = $ouid;
305                $response['ouname'] = $rs->campos["nombrecentro"];
306                $response['description'] = $rs->campos["comentarios"];
307                jsonResponse(200, $response);
308        }
309        $rs->Cerrar();
310    }
311);
312
313// Listar aulas de una OU.
314$app->get('/ous/:ouid/labs', 'validateApiKey',
315    function($ouid) {
316        global $cmd;
317
318        $ouid = htmlspecialchars($ouid);
319        // Listar las salas de la UO si el usuario de la apikey es su admin.
320        $cmd->texto = <<<EOD
321SELECT aulas.*, adm.idadministradorcentro
322  FROM aulas
323 RIGHT JOIN administradores_centros AS adm USING(idcentro)
324 RIGHT JOIN usuarios USING(idusuario)
325 WHERE idcentro='$ouid';
326EOD;
327        $rs=new Recordset;
328        $rs->Comando=&$cmd;
329        if (!$rs->Abrir()) return(false);       // Error al abrir recordset
330        // Comprobar que exista la UO y que el usuario sea su administrador.
331        $rs->Primero();
332        if (checkParameter($rs->campos["idcentro"]) and checkAdmin($rs->campos["idadministradorcentro"])) {
333                $response['error'] = false;
334                $response['ouid'] = $ouid;
335                $response['labs'] = array();
336                while (!$rs->EOF) {
337                        $tmp = array();
338                        $tmp['labid'] = $rs->campos["idaula"];
339                        $tmp['labname'] = $rs->campos["nombreaula"];
340                        $tmp['inremotepc'] = $rs->campos["inremotepc"]==0 ? false: true;
341                        array_push($response['labs'], $tmp);
342                        $rs->Siguiente();
343                }
344                jsonResponse(200, $response);
345        }
346        $rs->Cerrar();
347    }
348);
349
350// Obtener datos de un aula.
351// Alternativa: $app->get('/lab/:labid', 'validateApiKey',
352//                  function($labid) {
353$app->get('/ous/:ouid/labs/:labid', 'validateApiKey',
354    function($ouid, $labid) {
355        global $cmd;
356
357        $ouid = htmlspecialchars($ouid);
358        $labid = htmlspecialchars($labid);
359        $cmd->texto = <<<EOD
360SELECT COUNT(idordenador) AS defclients, aulas.*, adm.idadministradorcentro
361  FROM aulas
362 RIGHT JOIN administradores_centros AS adm USING(idcentro)
363 RIGHT JOIN usuarios USING(idusuario)
364  LEFT JOIN ordenadores USING(idaula)
365 WHERE idcentro='$ouid'
366   AND idaula='$labid';
367EOD;
368        $rs=new Recordset;
369        $rs->Comando=&$cmd;
370        if (!$rs->Abrir()) return(false); // Error al abrir recordset
371        $rs->Primero();
372        if (checkParameter($rs->campos["idaula"]) and checkAdmin($rs->campos["idadministradorcentro"])) {
373                $response['error'] = false;
374                $response['labid'] = $rs->campos["idaula"];
375                $response['labname'] = $rs->campos["nombreaula"];
376                $response['description'] = $rs->campos["comentarios"];
377                $response['inremotepc'] = $rs->campos["inremotepc"]==0 ? false: true;
378                $response['maxclients'] = $rs->campos["puestos"];
379                $response['defclients'] = $rs->campos["defclients"];
380                $response['projector'] = $rs->campos["cagnon"]==0 ? false: true;
381                $response['board'] = $rs->campos["pizarra"]==0 ? false: true;
382                $response['routerip'] = $rs->campos["router"];
383                $response['netmask'] = $rs->campos["netmask"];
384                $response['ntp'] = $rs->campos["ntp"];
385                $response['dns'] = $rs->campos["dns"];
386                $response['proxyurl'] = $rs->campos["proxy"];
387                switch ($rs->campos["modomul"]) {
388                        case 1:  $response['mcastmode'] = "half-duplex"; break;
389                        case 2:  $response['mcastmode'] = "full-duplex"; break;
390                        default: $response['mcastmode'] = $rs->campos["modomul"];
391                }
392                $response['mcastip'] = $rs->campos["ipmul"];
393                $response['mcastport'] = $rs->campos["pormul"];
394                $response['mcastspeed'] = $rs->campos["velmul"];
395                $response['p2pmode'] = $rs->campos["modp2p"];
396                $response['p2ptime'] = $rs->campos["timep2p"];
397                jsonResponse(200, $response);
398        }
399        $rs->Cerrar();
400    }
401);
402
403// Listar clientes de un aula.
404$app->get('/ous/:ouid/labs/:labid/clients', 'validateApiKey',
405    function($ouid, $labid) {
406        global $cmd;
407
408        $ouid = htmlspecialchars($ouid);
409        $labid = htmlspecialchars($labid);
410        // Listar los clientes del aula si el usuario de la apikey es admin de su UO.
411        // Consulta temporal,
412        $cmd->texto = "SELECT * FROM ordenadores WHERE idaula=$labid;";
413        $rs=new Recordset;
414        $rs->Comando=&$cmd;
415        if (!$rs->Abrir()) return(false);       // Recordset open error.
416        $rs->Primero();
417        if (checkParameter($rs->campos["idaula"])) {
418                $response['error'] = false;
419                $response['ouid'] = $ouid;
420                $response['labid'] = $labid;
421                $response['clients'] = array();
422                while (!$rs->EOF) {
423                        $tmp = array();
424                        $tmp['clientid'] = $rs->campos["idordenador"];
425                        $tmp['clientname'] = $rs->campos["nombreordenador"];
426                        array_push($response['clients'], $tmp);
427                        $rs->Siguiente();
428                }
429                jsonResponse(200, $response);
430        }
431        $rs->Cerrar();
432    }
433);
434
435// Obtener datos de un cliente.
436$app->get('/ous/:ouid/labs/:labid/clients/:clntid', 'validateApiKey',
437    function($ouid, $labid, $clntid) {
438        global $cmd;
439
440        $ouid = htmlspecialchars($ouid);
441        $labid = htmlspecialchars($labid);
442        $clntid = htmlspecialchars($clntid);
443        $cmd->texto = "SELECT * FROM ordenadores WHERE idordenador='$clntid';";
444        $rs=new Recordset;
445        $rs->Comando=&$cmd;
446        if (!$rs->Abrir()) return(false); // Error al abrir recordset
447        $rs->Primero();
448//      if ($labid != $rs->campos["idaula"]) ...
449        if (checkParameter($rs->campos["idordenador"])) {
450                $response['error'] = false;
451                $response['clientid'] = $rs->campos["idordenador"];
452                $response['clientname'] = $rs->campos["nombreordenador"];
453                $response['netiface'] = $rs->campos["netiface"];
454                $response['netdriver'] = $rs->campos["netdriver"];
455                $response['macaddress'] = $rs->campos["mac"];
456                $response['ipaddress'] = $rs->campos["ip"];
457                $response['netmask'] = $rs->campos["mascara"];
458                $response['routerip'] = $rs->campos["router"];
459                $response['repoid'] = $rs->campos["idrepositorio"];
460                //$response['hardprofid'] = $rs->campos["idperfilhard"];
461                //$response['menuid'] = $rs->campos["idmenu"];
462                //$response['validation'] = $rs->campos["arranque"]==0 ? false: true;
463                $response['boottype'] = $rs->campos["arranque"];
464                jsonResponse(200, $response);
465        }
466        $rs->Cerrar();
467    }
468);
469
470// Obtener la configuración de hardware de un cliente.
471$app->get('/ous/:ouid/labs/:labid/clients/:clntid/hardware', 'validateApiKey',
472    function($ouid, $labid, $clntid) {
473        global $cmd;
474
475        $ouid = htmlspecialchars($ouid);
476        $labid = htmlspecialchars($labid);
477        $clntid = htmlspecialchars($clntid);
478        $cmd->texto = <<<EOD
479SELECT ordenadores.idordenador, ordenadores.nombreordenador,
480       tipohardwares.nemonico, hardwares.descripcion
481  FROM perfileshard
482 RIGHT JOIN ordenadores USING(idperfilhard)
483  JOIN perfileshard_hardwares USING(idperfilhard)
484  JOIN hardwares ON perfileshard_hardwares.idhardware=hardwares.idhardware
485  JOIN tipohardwares ON tipohardwares.idtipohardware=hardwares.idtipohardware
486 WHERE ordenadores.idordenador='$clntid'
487EOD;
488        $rs=new Recordset;
489        $rs->Comando=&$cmd;
490        if (!$rs->Abrir()) return(false); // Error al abrir recordset
491        $rs->Primero();
492//      if ($ouid != $rs->campos["idcentro"]) ...
493//      if ($labid != $rs->campos["idaula"]) ...
494        if (checkParameter($rs->campos["idordenador"])) {
495                $response['error'] = false;
496                $response['clientid'] = $rs->campos["idordenador"];
497                $response['clientname'] = $rs->campos["nombreordenador"];
498                $response['hardware'] = array();
499                while (!$rs->EOF) {
500                        $tmp = array();
501                        $tmp['type'] = $rs->campos["nemonico"];
502                        $tmp['description'] = $rs->campos["descripcion"];
503                        array_push($response['hardware'], $tmp);
504                        $rs->Siguiente();
505                }
506                jsonResponse(200, $response);
507        }
508        $rs->Cerrar();
509    }
510);
511
512// Obtener datos de configuración de discos del cliente.
513$app->get('/ous/:ouid/labs/:labid/clients/:clntid/diskcfg', 'validateApiKey',
514    function($ouid, $labid, $clntid) {
515        global $cmd;
516
517        $ouid = htmlspecialchars($ouid);
518        $labid = htmlspecialchars($labid);
519        $clntid = htmlspecialchars($clntid);
520        $cmd->texto = <<<EOD
521SELECT ordenadores.idordenador AS clientid, ordenadores.nombreordenador,
522       ordenadores_particiones.*, tipospar.tipopar,
523       sistemasficheros.nemonico, nombresos.nombreso, imagenes.nombreca
524  FROM ordenadores_particiones
525 RIGHT JOIN ordenadores USING(idordenador)
526  LEFT JOIN tipospar USING(codpar)
527  LEFT JOIN sistemasficheros USING(idsistemafichero)
528  LEFT JOIN nombresos USING(idnombreso)
529  LEFT JOIN imagenes USING(idimagen)
530 WHERE ordenadores.idordenador='$clntid'
531 ORDER BY numdisk ASC, numpar ASC;
532EOD;
533        $rs=new Recordset;
534        $rs->Comando=&$cmd;
535        if (!$rs->Abrir()) return(false); // Error al abrir recordset
536        $rs->Primero();
537//      if ($labid != $rs->campos["idaula"]) ...
538        if (checkParameter($rs->campos["clientid"])) {
539                $response['error'] = false;
540                $response['clientid'] = $rs->campos["clientid"];
541                $response['clientname'] = $rs->campos["nombreordenador"];
542                $response['diskcfg'] = array();
543                while (!$rs->EOF) {
544                        if ($rs->campos["numdisk"] == 0) {
545                                $rs->Siguiente();
546                                continue;
547                        }
548                        $tmp = array();
549                        if ($rs->campos["numpar"] == 0) {
550                                $tmp['disk'] = $rs->campos["numdisk"];
551                                switch ($rs->campos["codpar"]) {
552                                        case 1:  $tmp['parttable'] = "MSDOS"; break;
553                                        case 2:  $tmp['parttable'] = "GPT"; break;
554                                        case 3:  $tmp['parttable'] = "LVM"; break;
555                                        case 4:  $tmp['parttable'] = "ZPOOL"; break;
556                                        default: $tmp['parttable'] = $rs->campos["codpar"];
557                                }
558                                $tmp['size'] = $rs->campos["tamano"];
559                        } else {
560                                $tmp['partition'] = $rs->campos["numpar"];
561                                $tmp['parttype'] = $rs->campos["tipopar"];
562                                $tmp['filesystem'] = $rs->campos["nemonico"];
563                                $tmp['size'] = $rs->campos["tamano"];
564                                $tmp['usage'] = $rs->campos["uso"];
565                                if ($rs->campos["nombreso"] != null) {
566                                        $tmp['os'] = $rs->campos["nombreso"];
567                                        $tmp['idimage'] = $rs->campos["idimagen"];
568                                        $tmp['deploydate'] = $rs->campos["fechadespliegue"];
569                                }
570                                //$tmp['cachedata'] = $rs->campos["cache"];
571                        }
572                        array_push($response['diskcfg'], $tmp);
573                        $rs->Siguiente();
574                }
575                jsonResponse(200, $response);
576        }
577        $rs->Cerrar();
578    }
579);
580
581// Obtener estado de ejecución del cliente.
582$app->get('/ous/:ouid/labs/:labid/clients/:clntid/status', 'validateApiKey',
583    function($ouid, $labid, $clntid) {
584        global $cmd;
585        global $LONCABECERA;
586        global $LONHEXPRM;
587
588        // Pparameters.
589        $ouid = htmlspecialchars($ouid);
590        $labid = htmlspecialchars($labid);
591        $clntid = htmlspecialchars($clntid);
592
593        // Database query.
594        $cmd->texto = <<<EOD
595SELECT serv.ipserveradm, serv.portserveradm, clnt.idordenador, clnt.ip
596  FROM entornos AS serv, ordenadores AS clnt
597 WHERE clnt.idordenador='$clntid';
598EOD;
599        $rs=new Recordset;
600        $rs->Comando=&$cmd;
601        if (!$rs->Abrir()) return(false); // Error al abrir recordset
602        $rs->Primero();
603        if (checkParameter($rs->campos["idordenador"])) {
604                $serverip = $rs->campos["ipserveradm"];
605                $serverport = $rs->campos["portserveradm"];
606                $clientid = $rs->campos["idordenador"];
607                $clientip = $rs->campos["ip"];
608
609                // Connect to reset client's status.
610                $reqframe = "nfn=Sondeo\r".
611                            "ido=$clientid\r".
612                            "iph=$clientip\r";
613                $result = sendCommand($serverip, $serverport, $reqframe, $values);
614
615                // Connect to fetch client's status.
616                // Asuming client is off by default.
617                $values["tso"]="OFF";
618                // Iterate to check client's status.
619                // Exit if status!=OFF or end iterations (status=OFF).
620                $maxIter = 30;
621                for ($i=1; $i<$maxIter and preg_match('/OFF/', $values["tso"]); $i++) {
622                        // Connect to check status.
623                        $reqframe = "nfn=respuestaSondeo\r".
624                                    "ido=$clientid\r".
625                                    "iph=$clientip\r";
626                        $result = sendCommand($serverip, $serverport, $reqframe, $values);
627                        // Wait until next checking (0.1 ms).
628                        usleep(100000);
629                }
630
631                // Parse status response.
632                if ($result) {
633                        // Check status type.
634                        if (checkParameter($values["tso"])) {
635                                // Compose JSON response.
636                                $response['error'] = false;
637                                $response['clientid'] = $clientid;
638                                $response['ip'] = $clientip;
639                                $stat = array();
640                                preg_match('/\/[A-Z]*;/', $values["tso"], $stat);
641                                // Check if data exists.
642                                if (empty($stat[0])) {
643                                        $response['status'] = "nodata";
644                                } else {
645                                        // Status mapping.
646                                        $status = array('OFF'=>"off",
647                                                        'INI'=>"initializing",
648                                                        'OPG'=>"ogclient",
649                                                        'BSY'=>"busy",
650                                                        'LNX'=>"linux",
651                                                        'WIN'=>"windows");
652                                        $response['status'] = $status[substr($stat[0], 1, 3)];
653                                        if (empty($response['status'])) {
654                                                $response['status'] = "unknown";
655                                        }
656                                }
657                                jsonResponse(200, $response);
658                        }
659                } else {
660                        // Access error.
661                        $response['error'] = true;
662                        $response['message'] = "Cannot access to OpenGnsys server";
663                        jsonResponse(500, $response);
664                }
665        }
666        $rs->Cerrar();
667    }
668);
669
670
671// Listar repositorios.
672$app->get('/ous/:ouid/repos', 'validateApiKey',
673    function($ouid) {
674        global $cmd;
675
676        $ouid = htmlspecialchars($ouid);
677        // Listar las salas de la UO si el usuario de la apikey es su admin.
678        // Consulta temporal,
679        $cmd->texto = "SELECT * FROM repositorios WHERE idcentro='$ouid';";
680        $rs=new Recordset;
681        $rs->Comando=&$cmd;
682        if (!$rs->Abrir()) return(false); // Error al abrir recordset
683        $rs->Primero();
684        // Comprobar que exista la UO.
685        if (checkParameter($rs->campos["idcentro"])) {
686                $response['error'] = false;
687                $response['ouid'] = $ouid;
688                $response['repos'] = array();
689                while (!$rs->EOF) {
690                        $tmp = array();
691                        $tmp['repoid'] = $rs->campos["idrepositorio"];
692                        $tmp['reponame'] = $rs->campos["nombrerepositorio"];
693                        array_push($response['repos'], $tmp);
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"])) {
716                $response['error'] = false;
717                $response['repoid'] = $rs->campos["idrepositorio"];
718                $response['reponame'] = $rs->campos["nombrerepositorio"];
719                $response['description'] = $rs->campos["comentarios"];
720                $response['ipaddress'] = $rs->campos["ip"];
721                $response['port'] = $rs->campos["puertorepo"];
722                jsonResponse(200, $response);
723        }
724        $rs->Cerrar();
725    }
726);
727
728// Listar imágenes.
729$app->get('/ous/:ouid/images', 'validateApiKey',
730    function($ouid) {
731        global $cmd;
732
733        $ouid = htmlspecialchars($ouid);
734        // Listar las salas de la UO si el usuario de la apikey es su admin.
735        // Consulta temporal,
736        $cmd->texto = "SELECT * FROM imagenes WHERE idcentro='$ouid';";
737        $rs=new Recordset;
738        $rs->Comando=&$cmd;
739        if (!$rs->Abrir()) return(false); // Error al abrir recordset
740        // Comprobar que exista la UO.
741        $rs->Primero();
742        if (checkParameter($rs->campos["idcentro"])) {
743                $response['error'] = false;
744                $response['ouid'] = $ouid;
745                $response['images'] = array();
746                while (!$rs->EOF) {
747                        $tmp = array();
748                        $tmp['imageid'] = $rs->campos["idimagen"];
749                        $tmp['imagename'] = $rs->campos["nombreca"];
750                        $tmp['inremotepc'] = $rs->campos["inremotepc"]==0 ? false: true;
751                        array_push($response['images'], $tmp);
752                        $rs->Siguiente();
753                }
754                jsonResponse(200, $response);
755        }
756    }
757);
758
759// Obtener datos de una imagen.
760$app->get('/ous/:ouid/images/:imgid', 'validateApiKey',
761    function($ouid, $imgid) {
762        global $cmd;
763
764        $ouid = htmlspecialchars($ouid);
765        $imgid = htmlspecialchars($imgid);
766        $cmd->texto = "SELECT * FROM imagenes WHERE idimagen='$imgid';";
767        $rs=new Recordset;
768        $rs->Comando=&$cmd;
769        if (!$rs->Abrir()) return(false); // Error al abrir recordset
770        $rs->Primero();
771        // Comprobar que exista el repositorio.
772        if (checkParameter($rs->campos["idimagen"])) {
773                $response['error'] = false;
774                $response['imageid'] = $rs->campos["idimagen"];
775                $response['imagename'] = $rs->campos["nombreca"];
776                $response['description'] = $rs->campos["descripcion"];
777                $response['comments'] = $rs->campos["comentarios"];
778                $response['inremotepc'] = $rs->campos["inremotepc"]==0 ? false: true;
779                $response['repoid'] = $rs->campos["idrepositorio"];
780                switch ($rs->campos["tipo"]) {
781                        case 1:  $response['type'] = "monolithic"; break;
782                        case 2:  $response['type'] = "base"; break;
783                        case 3:  $response['type'] = "incremental";
784                                 $response['baseimg'] = $rs->campos["imagenid"];
785                                 $response['path'] = $rs->campos["ruta"];
786                                 break;
787                        default: $response['type'] = $rs->campos["tipo"];
788                }
789                if ($rs->campos["idordenador"] != 0) {
790                        $response['clientid'] = $rs->campos["idordenador"];
791                        $response['disk'] = $rs->campos["numdisk"];
792                        $response['partition'] = $rs->campos["numpar"];
793                        $response['creationdate'] = $rs->campos["fechacreacion"];
794                }
795                jsonResponse(200, $response);
796        }
797        $rs->Cerrar();
798    }
799);
800
801// Lista de softeare instalado en una imagen.
802$app->get('/ous/:ouid/images/:imgid/software', 'validateApiKey',
803    function($ouid, $imgid) {
804        global $cmd;
805
806        $ouid = htmlspecialchars($ouid);
807        $imgid = htmlspecialchars($imgid);
808        $cmd->texto = <<<EOD
809SELECT imagenes.idimagen, imagenes.nombreca, softwares.descripcion
810  FROM perfilessoft
811 RIGHT JOIN imagenes USING(idperfilsoft)
812  LEFT JOIN perfilessoft_softwares USING(idperfilsoft)
813  LEFT JOIN softwares USING(idsoftware)
814 WHERE imagenes.idimagen='$imgid'
815 ORDER BY softwares.descripcion ASC;
816EOD;
817        $rs=new Recordset;
818        $rs->Comando=&$cmd;
819        if (!$rs->Abrir()) return(false);       // Error al abrir recordset
820        $rs->Primero();
821        // Comprobar que exista el repositorio.
822        if (checkParameter($rs->campos["idimagen"])) {
823                $response['error'] = false;
824                $response['imageid'] = $rs->campos["idimagen"];
825                $response['imagename'] = $rs->campos["nombreca"];
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 N ordenadores con una imagen instalada.
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['error'] = false;
880                $response['imageid'] = $imageid;
881                $response['sendto'] = array();
882
883                // AVISO: Procesar datos del servidor (solo 1er registro).
884
885                $serverip = $rs->campos["ipserveradm"];
886                $serverport = $rs->campos["portserveradm"];
887
888                // AVISO: Procesar datos de los clientes.
889
890                $clientid = array();
891                $clientip = array();
892                $clientmac = array();
893                $clientdisk = array();
894                $clientpart = array();
895                while (!$rs->EOF) {
896                        array_push($clientid, $rs->campos["idordenador"]);
897                        array_push($clientip, $rs->campos["ip"]);
898                        array_push($clientmac, $rs->campos["mac"]);
899                        array_push($clientdisk, $rs->campos["numdisk"]);
900                        array_push($clientpart, $rs->campos["numpar"]);
901                        $rs->Siguiente();
902                }
903                $rs->Cerrar();
904
905                // AVISO: consultar el estado de todos los clientes y
906                //        quitar aquellos que no tengan "OFF", "OPG" o ""
907                //        (estudiar si incluir los "BSY")
908
909                // Reset clients' status.
910                $reqframe = "nfn=Sondeo\r".
911                            "ido=".implode(',', $clientid)."\r".
912                            "iph=".implode(';', $clientip)."\r";
913                sendCommand($serverip, $serverport, $reqframe, $values);
914                 // Wait to get response.
915                sleep(3);
916                // Connect to check status.
917                $reqframe = "nfn=respuestaSondeo\r".
918                            "ido=".implode(',', $clientid)."\r".
919                            "iph=".implode(';', $clientip)."\r";
920                sendCommand($serverip, $serverport, $reqframe, $values);
921                // Check status type.
922                if (isset($values["tso"])) {
923                        preg_match_all('/[A-Z]{3}/', $values["tso"], $stat);
924                }
925                if (isset($stat[0])) {
926                        for ($i=0; $i<sizeof($stat[0]); $i++) {
927                                if (! in_array($stat[0][$i], array("OFF", "OPG", ""))) {
928                                        unset($clientid[$i]);
929                                        unset($clientip[$i]);
930                                        unset($clientmac[$i]);
931                                        unset($clientdisk[$i]);
932                                        unset($clientpart[$i]);
933                                }
934                        }
935                }
936
937                // AVISO: el siguiente código inicia un único cliente.
938                //        Para iniciar varios:
939                //        - id. clientes separados por carácter ','.
940                //        - IP clientes separadas por carácter ';'
941                //        - MAC clientes separadas por carácter ';'
942
943                // Executing boot command.
944                $reqframe = "nfn=Arrancar\r".
945                            "ido=".implode(',', $clientid)."\r".
946                            "iph=".implode(';', $clientip)."\r".
947                            "mac=".implode(';', $clientmac)."\r".
948                            "mar=1\r";
949echo "req=".str_replace("\r"," ",$reqframe).".\n";
950                sendCommand($serverip, $serverport, $reqframe, $values);
951                if ($values["res"]) {
952print_r($values);
953                        $tmp = array();
954                        for ($i=0, $boot=0; $i<sizeof($clientid) and $boot!=1; $i++) {
955                                $reqframe = "nfn=IniciarSesion\r".
956                                            "ido=".$clientid[$i]."\r".
957                                            "iph=".$clientip[$i]."\r".
958                                            "dsk=".$clientdisk[$i]."\r".
959                                            "par=".$clientpart[$i]."\r";
960echo "i=$i: req=".str_replace("\r"," ",$reqframe).".\n";
961                                sendCommand($serverip, $serverport, $reqframe, $values);
962                                if ($values["res"]) {
963
964                                        // AVISO: incluir comando Iniciar sesión en cola de acciones.
965                                        $timestamp=time();
966                                        $cmd->texto = <<<EOD
967INSERT INTO acciones
968        SET tipoaccion=$EJECUCION_COMANDO,
969            idtipoaccion=9,
970            idcomando=9,
971            parametros='nfn=IniciarSesion\rdsk=$clientdisk[$i]\rpar=$clientpart[$i]',
972            descriaccion='RemotePC Session',
973            idordenador=$clientid[$i],
974            ip='$clientip[$i]',
975            sesion=$timestamp,
976            fechahorareg=NOW(),
977            estado=$ACCION_INICIADA,
978            resultado=$ACCION_SINRESULTADO,
979            ambito=$AMBITO_ORDENADORES,
980            idambito=$clientid[$i],
981            restrambito='$clientip[$i]',
982            idcentro=$ouid;
983EOD;
984                                        $result = $cmd->Ejecutar();
985                                        if ($result) {
986                                                $tmp['clientid'] = $clientid[$i];
987                                                $tmp['ip'] = $clientip[$i];
988                                                $tmp['mac'] = $clientmac[$i];
989                                                array_push($response['sendto'], $tmp);
990                                                $boot = 1;
991                                        }
992                                }
993                        }
994                }
995                jsonResponse(200, $response);
996        }
997    }
998);
999// Alternativa como método GET.
1000//$app->get('/ous/:id1/images/:id2/boot/:number', 'validateApiKey',
1001//    function($ouid, $imageid, $number) {
1002//
1003//   }
1004//);
1005
1006// Ejecutar REST con Slim.
1007$app->run();
1008
1009?>
1010
Note: See TracBrowser for help on using the repository browser.