source: admin/WebConsole/rest/index.php @ 044d306

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 044d306 was 485ebb15, checked in by ramon <ramongomez@…>, 9 years ago

#708: Continuar comentando el fichero de control de la API REST.

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

  • Property mode set to 100644
File size: 30.2 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 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['macaddress'] = $rs->campos["mac"];
455                $response['ipaddress'] = $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['idimage'] = $rs->campos["idimagen"];
567                                        $tmp['deploydate'] = $rs->campos["fechadespliegue"];
568                                }
569                                //$tmp['cachedata'] = $rs->campos["cache"];
570                        }
571                        array_push($response['diskcfg'], $tmp);
572                        $rs->Siguiente();
573                }
574                jsonResponse(200, $response);
575        }
576        $rs->Cerrar();
577    }
578);
579
580// Obtener estado de ejecución del cliente.
581$app->get('/ous/:ouid/labs/:labid/clients/:clntid/status', 'validateApiKey',
582    function($ouid, $labid, $clntid) {
583        global $cmd;
584        global $LONCABECERA;
585        global $LONHEXPRM;
586
587        // Parameters.
588        $ouid = htmlspecialchars($ouid);
589        $labid = htmlspecialchars($labid);
590        $clntid = htmlspecialchars($clntid);
591
592        // Database query.
593        $cmd->texto = <<<EOD
594SELECT serv.ipserveradm, serv.portserveradm, clnt.idordenador, clnt.ip
595  FROM entornos AS serv, ordenadores AS clnt
596 WHERE clnt.idordenador='$clntid';
597EOD;
598        $rs=new Recordset;
599        $rs->Comando=&$cmd;
600        if (!$rs->Abrir()) return(false); // Error al abrir recordset
601        $rs->Primero();
602        if (checkParameter($rs->campos["idordenador"])) {
603                $serverip = $rs->campos["ipserveradm"];
604                $serverport = $rs->campos["portserveradm"];
605                $clientid = $rs->campos["idordenador"];
606                $clientip = $rs->campos["ip"];
607
608                // Connect to reset client's status.
609                $reqframe = "nfn=Sondeo\r".
610                            "ido=$clientid\r".
611                            "iph=$clientip\r";
612                $result = sendCommand($serverip, $serverport, $reqframe, $values);
613
614                // Connect to fetch client's status.
615                // Asuming client is off by default.
616                $values["tso"]="OFF";
617                // Iterate to check client's status.
618                // Exit if status!=OFF or end iterations (status=OFF).
619                $maxIter = 30;
620                for ($i=1; $i<$maxIter and preg_match('/OFF/', $values["tso"]); $i++) {
621                        // Connect to check status.
622                        $reqframe = "nfn=respuestaSondeo\r".
623                                    "ido=$clientid\r".
624                                    "iph=$clientip\r";
625                        $result = sendCommand($serverip, $serverport, $reqframe, $values);
626                        // Wait until next checking (0.1 ms).
627                        usleep(100000);
628                }
629
630                // Parse status response.
631                if ($result) {
632                        // Check status type.
633                        if (checkParameter($values["tso"])) {
634                                // Compose JSON response.
635                                $response['error'] = false;
636                                $response['clientid'] = $clientid;
637                                $response['ip'] = $clientip;
638                                $stat = array();
639                                preg_match('/\/[A-Z]*;/', $values["tso"], $stat);
640                                // Check if data exists.
641                                if (empty($stat[0])) {
642                                        $response['status'] = "nodata";
643                                } else {
644                                        // Status mapping.
645                                        $status = array('OFF'=>"off",
646                                                        'INI'=>"initializing",
647                                                        'OPG'=>"ogclient",
648                                                        'BSY'=>"busy",
649                                                        'LNX'=>"linux",
650                                                        'WIN'=>"windows");
651                                        $response['status'] = $status[substr($stat[0], 1, 3)];
652                                        if (empty($response['status'])) {
653                                                $response['status'] = "unknown";
654                                        }
655                                }
656                                jsonResponse(200, $response);
657                        }
658                } else {
659                        // Access error.
660                        $response['error'] = true;
661                        $response['message'] = "Cannot access to OpenGnsys server";
662                        jsonResponse(500, $response);
663                }
664        }
665        $rs->Cerrar();
666    }
667);
668
669
670// Listar repositorios.
671$app->get('/ous/:ouid/repos', 'validateApiKey',
672    function($ouid) {
673        global $cmd;
674
675        $ouid = htmlspecialchars($ouid);
676        // Listar las salas de la UO si el usuario de la apikey es su admin.
677        // Consulta temporal,
678        $cmd->texto = "SELECT * FROM repositorios WHERE idcentro='$ouid';";
679        $rs=new Recordset;
680        $rs->Comando=&$cmd;
681        if (!$rs->Abrir()) return(false); // Error al abrir recordset
682        $rs->Primero();
683        // Comprobar que exista la UO.
684        if (checkParameter($rs->campos["idcentro"])) {
685                $response['error'] = false;
686                $response['ouid'] = $ouid;
687                $response['repos'] = array();
688                while (!$rs->EOF) {
689                        $tmp = array();
690                        $tmp['repoid'] = $rs->campos["idrepositorio"];
691                        $tmp['reponame'] = $rs->campos["nombrerepositorio"];
692                        array_push($response['repos'], $tmp);
693                        $rs->Siguiente();
694                }
695                jsonResponse(200, $response);
696        }
697        $rs->Cerrar();
698    }
699);
700
701// Obtener datos de un repositorio.
702$app->get('/ous/:ouid/repos/:repoid', 'validateApiKey',
703    function($ouid, $repoid) {
704        global $cmd;
705
706        $ouid = htmlspecialchars($ouid);
707        $repoid = htmlspecialchars($repoid);
708        $cmd->texto = "SELECT * FROM repositorios WHERE idrepositorio='$repoid';";
709        $rs=new Recordset;
710        $rs->Comando=&$cmd;
711        if (!$rs->Abrir()) return(false); // Error al abrir recordset
712        $rs->Primero();
713        // Comprobar que exista el repositorio.
714        if (checkParameter($rs->campos["idrepositorio"])) {
715                $response['error'] = false;
716                $response['repoid'] = $rs->campos["idrepositorio"];
717                $response['reponame'] = $rs->campos["nombrerepositorio"];
718                $response['description'] = $rs->campos["comentarios"];
719                $response['ipaddress'] = $rs->campos["ip"];
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"])) {
742                $response['error'] = false;
743                $response['ouid'] = $ouid;
744                $response['images'] = array();
745                while (!$rs->EOF) {
746                        $tmp = array();
747                        $tmp['imageid'] = $rs->campos["idimagen"];
748                        $tmp['imagename'] = $rs->campos["nombreca"];
749                        $tmp['inremotepc'] = $rs->campos["inremotepc"]==0 ? false: true;
750                        array_push($response['images'], $tmp);
751                        $rs->Siguiente();
752                }
753                jsonResponse(200, $response);
754        }
755    }
756);
757
758// Obtener datos de una imagen.
759$app->get('/ous/:ouid/images/:imgid', 'validateApiKey',
760    function($ouid, $imgid) {
761        global $cmd;
762
763        $ouid = htmlspecialchars($ouid);
764        $imgid = htmlspecialchars($imgid);
765        $cmd->texto = "SELECT * FROM imagenes WHERE idimagen='$imgid';";
766        $rs=new Recordset;
767        $rs->Comando=&$cmd;
768        if (!$rs->Abrir()) return(false); // Error al abrir recordset
769        $rs->Primero();
770        // Comprobar que exista el repositorio.
771        if (checkParameter($rs->campos["idimagen"])) {
772                $response['error'] = false;
773                $response['imageid'] = $rs->campos["idimagen"];
774                $response['imagename'] = $rs->campos["nombreca"];
775                $response['description'] = $rs->campos["descripcion"];
776                $response['comments'] = $rs->campos["comentarios"];
777                $response['inremotepc'] = $rs->campos["inremotepc"]==0 ? false: true;
778                $response['repoid'] = $rs->campos["idrepositorio"];
779                switch ($rs->campos["tipo"]) {
780                        case 1:  $response['type'] = "monolithic"; break;
781                        case 2:  $response['type'] = "base"; break;
782                        case 3:  $response['type'] = "incremental";
783                                 $response['baseimg'] = $rs->campos["imagenid"];
784                                 $response['path'] = $rs->campos["ruta"];
785                                 break;
786                        default: $response['type'] = $rs->campos["tipo"];
787                }
788                if ($rs->campos["idordenador"] != 0) {
789                        $response['clientid'] = $rs->campos["idordenador"];
790                        $response['disk'] = $rs->campos["numdisk"];
791                        $response['partition'] = $rs->campos["numpar"];
792                        $response['creationdate'] = $rs->campos["fechacreacion"];
793                }
794                jsonResponse(200, $response);
795        }
796        $rs->Cerrar();
797    }
798);
799
800// Lista de softeare instalado en una imagen.
801$app->get('/ous/:ouid/images/:imgid/software', 'validateApiKey',
802    function($ouid, $imgid) {
803        global $cmd;
804
805        $ouid = htmlspecialchars($ouid);
806        $imgid = htmlspecialchars($imgid);
807        $cmd->texto = <<<EOD
808SELECT imagenes.idimagen, imagenes.nombreca, softwares.descripcion
809  FROM perfilessoft
810 RIGHT JOIN imagenes USING(idperfilsoft)
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"])) {
822                $response['error'] = false;
823                $response['imageid'] = $rs->campos["idimagen"];
824                $response['imagename'] = $rs->campos["nombreca"];
825                $response['software'] = array();
826                while (!$rs->EOF) {
827                        if ($rs->campos["descripcion"] == null) {
828                                $rs->Siguiente();
829                                continue;
830                        }
831                        $tmp = array();
832                        $tmp['application'] = $rs->campos["descripcion"];
833                        array_push($response['software'], $tmp);
834                        $rs->Siguiente();
835                }
836                jsonResponse(200, $response);
837        }
838        $rs->Cerrar();
839    }
840);
841
842// Arrancar un ordenador con una imagen instalada, elegido al azar.
843$app->get('/ous/:id1/images/:id2/boot', 'validateApiKey',
844    function($ouid, $imageid) {
845        global $cmd;
846        global $AMBITO_ORDENADORES;
847        global $EJECUCION_COMANDO;
848        global $ACCION_INICIADA;
849        global $ACCION_SINRESULTADO;
850
851        // Pparameters.
852        $ouid = htmlspecialchars($ouid);
853        $imegeid = htmlspecialchars($imageid);
854        // Boot 1 client.
855        $nclients = 1;
856
857        // Query: server data and all clients' boot data availabe for Remote PC with this image installed (random order).
858        $cmd->texto = <<<EOD
859SELECT s.ipserveradm, s.portserveradm,
860       c.idordenador, c.ip, c.mac, p.numdisk, p.numpar
861  FROM entornos AS s, ordenadores AS c
862  JOIN aulas USING(idaula)
863  JOIN centros USING(idcentro)
864  JOIN ordenadores_particiones AS p USING(idordenador)
865  JOIN imagenes USING(idimagen)
866 WHERE centros.idcentro='$ouid'
867   AND aulas.inremotepc=1
868   AND imagenes.idimagen='$imageid'
869   AND imagenes.inremotepc=1
870 ORDER BY RAND();
871EOD;
872        $rs=new Recordset;
873        $rs->Comando=&$cmd;
874        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
875        $rs->Primero();
876        if (checkParameter($rs->campos["ipserveradm"])) {
877
878                $response['error'] = false;
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) {
985                                                $tmp['clientid'] = $clientid[$i];
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
1005// Ejecutar REST con Slim.
1006$app->run();
1007
1008?>
1009
Note: See TracBrowser for help on using the repository browser.