source: admin/WebConsole/rest/server.php @ d8f592d

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

#708: Obtener lista de OUs sin necesidad de validación (para presentarlas en el formulario de login).

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

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