source: admin/WebConsole/rest/index.php @ 7747e66

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 7747e66 was c03c7c3, checked in by ramon <ramongomez@…>, 10 years ago

#708: Evitar error PHP al llamar función con valor por referencia.

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

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