source: admin/WebConsole/rest/server.php @ 4dea2be

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 4dea2be was 23a72c0, checked in by ramon <ramongomez@…>, 9 years ago

#761: Integrar rutas /status y /ous/:ouid/groups en version 1.1 y documentar ruta /status.

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

  • Property mode set to 100644
File size: 32.1 KB
Line 
1<?php
2/**
3 * @file    index.php
4 * @brief   OpenGnsys REST API manager.
5 * @warning All input and output messages are formatted in JSON.
6 * @note    Some ideas are based on article "How to create REST API for Android app using PHP, Slim and MySQL" by Ravi Tamada, thanx.
7 * @license GNU GPLv3+
8 * @author  Ramón M. Gómez, ETSII Univ. Sevilla
9 * @version 1.1.0 - Primera versión para OpenGnsys
10 * @date    2016-09-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    Get the server status
219 * @note     Route: /status, Method: GET
220 * @param    no
221 * @return   JSON array with all data collected from server status. (RAM, %CPU,etc..)
222 */
223$app->get('/status', function() {
224      exec("awk '$1~/Mem/ {print $2}' /proc/meminfo",$memInfo);
225      $memInfo = array("total" => $memInfo[0], "used" => $memInfo[1]);
226      $cpuInfo = exec("awk '$1==\"cpu\" {printf \"%.2f\",($2+$4)*100/($2+$4+$5)}' /proc/stat");
227      $cpuModel = exec("awk -F: '$1~/model name/ {print $2}' /proc/cpuinfo");
228      $response["memInfo"] = $memInfo;
229      $response["cpu"] = array("model" => trim($cpuModel), "usage" => $cpuInfo);
230      jsonResponse(200, $response);
231}
232);
233
234/**
235 * @brief    List all defined Organizational Units
236 * @note     Route: /ous, Method: GET
237 * @param    no
238 * @return   JSON array with id. and name for every defined OU
239 */
240$app->get('/ous', function() {
241        global $cmd;
242
243        $cmd->texto = "SELECT * FROM centros";
244        $rs=new Recordset;
245        $rs->Comando=&$cmd;
246        if (!$rs->Abrir()) return(false); // Error al abrir recordset
247        $response = array();
248        $rs->Primero();
249        while (!$rs->EOF) {
250                $tmp = array();
251                $tmp['id'] = $rs->campos["idcentro"];
252                $tmp['name'] = $rs->campos["nombrecentro"];
253                array_push($response, $tmp);
254                $rs->Siguiente();
255        }
256        $rs->Cerrar();
257        jsonResponse(200, $response);
258}
259);
260
261/**
262 * @brief    Get Organizational Unit data
263 * @note     Route: /ous/id, Method: GET
264 * @param    id      OU id.
265 * @return   JSON string with OU's parameters
266 */
267$app->get('/ous/:ouid', 'validateApiKey',
268    function($ouid) {
269        global $cmd;
270
271        $ouid = htmlspecialchars($ouid);
272        $cmd->texto = "SELECT * FROM centros WHERE idcentro='$ouid';";
273        $rs=new Recordset;
274        $rs->Comando=&$cmd;
275        if (!$rs->Abrir()) return(false); // Error al abrir recordset
276        $rs->Primero();
277        if (checkParameter($rs->campos["nombrecentro"])) {
278                $response['id'] = $ouid;
279                $response['name'] = $rs->campos["nombrecentro"];
280                $response['description'] = $rs->campos["comentarios"];
281                jsonResponse(200, $response);
282        }
283        $rs->Cerrar();
284    }
285);
286
287// Listar grupos.
288$app->get('/ous/:ouid/groups', 'validateApiKey', function($ouid) {
289        global $cmd;
290        global $userid;
291
292        $ouid = htmlspecialchars($ouid);
293        if(checkAdmin($userid, $ouid) == true){
294                // Listar las salas de la UO si el usuario de la apikey es su admin.
295                // Consulta temporal,
296                $cmd->texto = "SELECT * FROM grupos 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                        // Comprobar que exista la UO.
302                        if (checkParameter($rs->campos["idcentro"])) {
303                                $response = array();
304                                while (!$rs->EOF) {
305                                        $tmp = array();
306                                        $tmp['id'] = $rs->campos["idgrupo"];
307                                        $tmp['name'] = $rs->campos["nombregrupo"];
308                                        $tmp['type'] = $rs->campos["tipo"];
309                                        $tmp['comments'] = $rs->campos["comentarios"];
310                                if($rs->campos["grupoid"] != 0){
311                                        $tmp['parent']['id'] = $rs->campos["grupoid"];
312                                }
313                                array_push($response, $tmp);
314                                $rs->Siguiente();
315                        }
316                        jsonResponse(200, $response);
317                }
318                $rs->Cerrar();
319        }
320    }
321);
322
323/**
324 * @brief    List all labs defined in an OU
325 * @note     Route: /ous/id/labs, Method: GET
326 * @param    id      OU id.
327 * @return   JSON string with all UO's labs parameters
328 */
329$app->get('/ous/:ouid/labs', 'validateApiKey',
330    function($ouid) {
331        global $cmd;
332
333        $ouid = htmlspecialchars($ouid);
334        // Listar las salas de la UO si el usuario de la apikey es su admin.
335        $cmd->texto = <<<EOD
336SELECT aulas.*, adm.idadministradorcentro
337  FROM aulas
338 RIGHT JOIN administradores_centros AS adm USING(idcentro)
339 RIGHT JOIN usuarios USING(idusuario)
340 WHERE idcentro='$ouid';
341EOD;
342        $rs=new Recordset;
343        $rs->Comando=&$cmd;
344        if (!$rs->Abrir()) return(false);       // Error al abrir recordset
345        // Comprobar que exista la UO y que el usuario sea su administrador.
346        $rs->Primero();
347        if (checkParameter($rs->campos["idcentro"]) and checkAdmin($rs->campos["idadministradorcentro"])) {
348                $response = array();
349                while (!$rs->EOF) {
350                        $tmp = array();
351                        $tmp['id'] = $rs->campos["idaula"];
352                        $tmp['name'] = $rs->campos["nombreaula"];
353                        $tmp['inremotepc'] = $rs->campos["inremotepc"]==0 ? false: true;
354                        $tmp['ou']['id'] = $ouid;
355                        array_push($response, $tmp);
356                        $rs->Siguiente();
357                }
358                jsonResponse(200, $response);
359        }
360        $rs->Cerrar();
361    }
362);
363
364/**
365 * @brief    Get lab data
366 * @note     Route: /ous/id1/labs/id2, Method: GET
367 * @param    id1     OU id.
368 * @param    id2     lab id.
369 * @return   JSON string with lab parameters
370 */
371$app->get('/ous/:ouid/labs/:labid', 'validateApiKey',
372    function($ouid, $labid) {
373        global $cmd;
374
375        $ouid = htmlspecialchars($ouid);
376        $labid = htmlspecialchars($labid);
377        $cmd->texto = <<<EOD
378SELECT COUNT(idordenador) AS defclients, aulas.*, adm.idadministradorcentro
379  FROM aulas
380 RIGHT JOIN administradores_centros AS adm USING(idcentro)
381 RIGHT JOIN usuarios USING(idusuario)
382  LEFT JOIN ordenadores USING(idaula)
383 WHERE idcentro='$ouid'
384   AND idaula='$labid';
385EOD;
386        $rs=new Recordset;
387        $rs->Comando=&$cmd;
388        if (!$rs->Abrir()) return(false); // Error al abrir recordset
389        $rs->Primero();
390        if (checkParameter($rs->campos["idaula"]) and checkAdmin($rs->campos["idadministradorcentro"])) {
391                $response['id'] = $rs->campos["idaula"];
392                $response['name'] = $rs->campos["nombreaula"];
393                $response['location'] = $rs->campos["ubicacion"];
394                $response['description'] = $rs->campos["comentarios"];
395                $response['inremotepc'] = $rs->campos["inremotepc"]==0 ? false: true;
396                $response['capacity'] = $rs->campos["puestos"];
397                $response['defclients'] = $rs->campos["defclients"];
398                $response['projector'] = $rs->campos["cagnon"]==0 ? false: true;
399                $response['board'] = $rs->campos["pizarra"]==0 ? false: true;
400                $response['routerip'] = $rs->campos["router"];
401                $response['netmask'] = $rs->campos["netmask"];
402                $response['ntp'] = $rs->campos["ntp"];
403                $response['dns'] = $rs->campos["dns"];
404                $response['proxyurl'] = $rs->campos["proxy"];
405                switch ($rs->campos["modomul"]) {
406                        case 1:  $response['mcastmode'] = "half-duplex"; break;
407                        case 2:  $response['mcastmode'] = "full-duplex"; break;
408                        default: $response['mcastmode'] = $rs->campos["modomul"];
409                }
410                $response['mcastip'] = $rs->campos["ipmul"];
411                $response['mcastport'] = $rs->campos["pormul"];
412                $response['mcastspeed'] = $rs->campos["velmul"];
413                $response['p2pmode'] = $rs->campos["modp2p"];
414                $response['p2ptime'] = $rs->campos["timep2p"];
415                $response['image'] = $rs->campos["urlfoto"];
416                jsonResponse(200, $response);
417        }
418        $rs->Cerrar();
419    }
420);
421
422// Listar clientes de un aula.
423$app->get('/ous/:ouid/labs/:labid/clients', 'validateApiKey',
424    function($ouid, $labid) {
425        global $cmd;
426
427        $ouid = htmlspecialchars($ouid);
428        $labid = htmlspecialchars($labid);
429        // Listar los clientes del aula si el usuario de la apikey es admin de su UO.
430        $cmd->texto = <<<EOD
431SELECT ordenadores.*, adm.idadministradorcentro
432  FROM ordenadores
433  JOIN aulas USING(idaula)
434 RIGHT JOIN administradores_centros AS adm USING(idcentro)
435 RIGHT JOIN usuarios USING(idusuario)
436 WHERE idcentro='$ouid'
437   AND idaula='$labid';
438EOD;
439        $rs=new Recordset;
440        $rs->Comando=&$cmd;
441        if (!$rs->Abrir()) return(false);       // Recordset open error.
442        $rs->Primero();
443        if (checkParameter($rs->campos["idaula"]) and checkAdmin($rs->campos["idadministradorcentro"])) {
444                $response['ouid'] = $ouid;
445                $response['labid'] = $labid;
446                $response = array();
447                while (!$rs->EOF) {
448                        $tmp = array();
449                        $tmp['id'] = $rs->campos["idordenador"];
450                        $tmp['name'] = $rs->campos["nombreordenador"];
451                        $tmp['ou']['id'] = $ouid;
452                        $tmp['lab']['id'] = $labid;
453                        array_push($response, $tmp);
454                        $rs->Siguiente();
455                }
456                jsonResponse(200, $response);
457        }
458        $rs->Cerrar();
459    }
460);
461
462// Obtener datos de un cliente.
463$app->get('/ous/:ouid/labs/:labid/clients/:clntid', 'validateApiKey',
464    function($ouid, $labid, $clntid) {
465        global $cmd;
466
467        $ouid = htmlspecialchars($ouid);
468        $labid = htmlspecialchars($labid);
469        $clntid = htmlspecialchars($clntid);
470        // Obtener datos del cliente del aula si el usuario de la apikey es admin de su UO.
471        $cmd->texto = <<<EOD
472SELECT ordenadores.*, adm.idadministradorcentro
473  FROM ordenadores
474  JOIN aulas USING(idaula)
475 RIGHT JOIN administradores_centros AS adm USING(idcentro)
476 RIGHT JOIN usuarios USING(idusuario)
477 WHERE idcentro='$ouid'
478   AND idaula='$labid'
479   AND idordenador='$clntid';
480EOD;
481        $rs=new Recordset;
482        $rs->Comando=&$cmd;
483        if (!$rs->Abrir()) return(false); // Error al abrir recordset
484        $rs->Primero();
485        if (checkParameter($rs->campos["idordenador"]) and checkParameter($rs->campos["idaula"]) and checkAdmin($rs->campos["idadministradorcentro"])) {
486                $response['id'] = $rs->campos["idordenador"];
487                $response['name'] = $rs->campos["nombreordenador"];
488                $response['serialno'] = $rs->campos["numserie"];
489                $response['netiface'] = $rs->campos["netiface"];
490                $response['netdriver'] = $rs->campos["netdriver"];
491                $response['mac'] = $rs->campos["mac"];
492                $response['ip'] = $rs->campos["ip"];
493                $response['netmask'] = $rs->campos["mascara"];
494                $response['routerip'] = $rs->campos["router"];
495                $response['repo']['id'] = $rs->campos["idrepositorio"];
496                //$response['hardprofile']['id'] = $rs->campos["idperfilhard"];
497                //$response['menu']['id'] = $rs->campos["idmenu"];
498                $response['validation'] = $rs->campos["validacion"]==0 ? false: true;
499                $response['boottype'] = $rs->campos["arranque"];
500                $response['image'] = $rs->campos["fotoord"];
501                jsonResponse(200, $response);
502        }
503        $rs->Cerrar();
504    }
505);
506
507// Obtener la configuración de hardware de un cliente.
508$app->get('/ous/:ouid/labs/:labid/clients/:clntid/hardware', 'validateApiKey',
509    function($ouid, $labid, $clntid) {
510        global $cmd;
511
512        $ouid = htmlspecialchars($ouid);
513        $labid = htmlspecialchars($labid);
514        $clntid = htmlspecialchars($clntid);
515        $cmd->texto = <<<EOD
516SELECT ordenadores.idordenador, ordenadores.nombreordenador,
517       tipohardwares.nemonico, hardwares.descripcion
518  FROM perfileshard
519 RIGHT JOIN ordenadores USING(idperfilhard)
520  JOIN perfileshard_hardwares USING(idperfilhard)
521  JOIN hardwares ON perfileshard_hardwares.idhardware=hardwares.idhardware
522  JOIN tipohardwares ON tipohardwares.idtipohardware=hardwares.idtipohardware
523 WHERE ordenadores.idordenador='$clntid'
524EOD;
525        $rs=new Recordset;
526        $rs->Comando=&$cmd;
527        if (!$rs->Abrir()) return(false); // Error al abrir recordset
528        $rs->Primero();
529//      if ($ouid != $rs->campos["idcentro"]) ...
530//      if ($labid != $rs->campos["idaula"]) ...
531        if (checkParameter($rs->campos["idordenador"])) {
532                $response['id'] = $rs->campos["idordenador"];
533                $response['name'] = $rs->campos["nombreordenador"];
534                $response['hardware'] = array();
535                while (!$rs->EOF) {
536                        $tmp = array();
537                        $tmp['type'] = $rs->campos["nemonico"];
538                        $tmp['description'] = $rs->campos["descripcion"];
539                        array_push($response['hardware'], $tmp);
540                        $rs->Siguiente();
541                }
542                jsonResponse(200, $response);
543        }
544        $rs->Cerrar();
545    }
546);
547
548// Obtener datos de configuración de discos del cliente.
549$app->get('/ous/:ouid/labs/:labid/clients/:clntid/diskcfg', 'validateApiKey',
550    function($ouid, $labid, $clntid) {
551        global $cmd;
552
553        $ouid = htmlspecialchars($ouid);
554        $labid = htmlspecialchars($labid);
555        $clntid = htmlspecialchars($clntid);
556        $cmd->texto = <<<EOD
557SELECT ordenadores.idordenador AS clientid, ordenadores.nombreordenador,
558       ordenadores_particiones.*, tipospar.tipopar,
559       sistemasficheros.nemonico, nombresos.nombreso, imagenes.nombreca,
560       (imagenes.revision - ordenadores_particiones.revision) AS difimagen
561  FROM ordenadores_particiones
562 RIGHT JOIN ordenadores USING(idordenador)
563  LEFT JOIN tipospar USING(codpar)
564  LEFT JOIN sistemasficheros USING(idsistemafichero)
565  LEFT JOIN nombresos USING(idnombreso)
566  LEFT JOIN imagenes USING(idimagen)
567 WHERE ordenadores.idordenador='$clntid'
568 ORDER BY numdisk ASC, numpar ASC;
569EOD;
570        $rs=new Recordset;
571        $rs->Comando=&$cmd;
572        if (!$rs->Abrir()) return(false); // Error al abrir recordset
573        $rs->Primero();
574//      if ($labid != $rs->campos["idaula"]) ...
575        if (checkParameter($rs->campos["clientid"])) {
576                $response['id'] = $rs->campos["clientid"];
577                $response['name'] = $rs->campos["nombreordenador"];
578                $response['diskcfg'] = array();
579                while (!$rs->EOF) {
580                        if ($rs->campos["numdisk"] == 0) {
581                                $rs->Siguiente();
582                                continue;
583                        }
584                        $tmp = array();
585                        if ($rs->campos["numpar"] == 0) {
586                                $tmp['disk'] = $rs->campos["numdisk"];
587                                switch ($rs->campos["codpar"]) {
588                                        case 1:  $tmp['parttable'] = "MSDOS"; break;
589                                        case 2:  $tmp['parttable'] = "GPT"; break;
590                                        case 3:  $tmp['parttable'] = "LVM"; break;
591                                        case 4:  $tmp['parttable'] = "ZPOOL"; break;
592                                        default: $tmp['parttable'] = $rs->campos["codpar"];
593                                }
594                                $tmp['size'] = $rs->campos["tamano"];
595                        } else {
596                                $tmp['partition'] = $rs->campos["numpar"];
597                                $tmp['parttype'] = $rs->campos["tipopar"];
598                                $tmp['filesystem'] = $rs->campos["nemonico"];
599                                $tmp['size'] = $rs->campos["tamano"];
600                                $tmp['usage'] = $rs->campos["uso"];
601                                if ($rs->campos["nombreso"] != null) {
602                                        $tmp['os'] = $rs->campos["nombreso"];
603                                        if ($rs->campos["idimagen"] > 0) {
604                                                $tmp['image']['id'] = $rs->campos["idimagen"];
605                                                $tmp['image']['deploydate'] = $rs->campos["fechadespliegue"];
606                                                // Comprobar si la imagen está actualizada.
607                                                $tmp['image']['updated'] = ($rs->campos["difimagen"]>0 ? "false" : "true");
608                                        }
609                                }
610                                //$tmp['cachedata'] = $rs->campos["cache"];
611                        }
612                        array_push($response['diskcfg'], $tmp);
613                        $rs->Siguiente();
614                }
615                jsonResponse(200, $response);
616        }
617        $rs->Cerrar();
618    }
619);
620
621// Obtener estado de ejecución del cliente.
622$app->get('/ous/:ouid/labs/:labid/clients/:clntid/status', 'validateApiKey',
623    function($ouid, $labid, $clntid) {
624        global $cmd;
625        global $LONCABECERA;
626        global $LONHEXPRM;
627
628        // Status mapping.
629        $status = array('OFF'=>"off",
630                        'INI'=>"initializing",
631                        'OPG'=>"ogclient",
632                        'BSY'=>"busy",
633                        'LNX'=>"linux",
634                        'WIN'=>"windows");
635        // Parameters.
636        $ouid = htmlspecialchars($ouid);
637        $labid = htmlspecialchars($labid);
638        $clntid = htmlspecialchars($clntid);
639
640        // Database query.
641        $cmd->texto = <<<EOD
642SELECT serv.ipserveradm, serv.portserveradm, clnt.idordenador, clnt.ip
643  FROM entornos AS serv, ordenadores AS clnt
644 WHERE clnt.idordenador='$clntid';
645EOD;
646        $rs=new Recordset;
647        $rs->Comando=&$cmd;
648        if (!$rs->Abrir()) return(false); // Error al abrir recordset
649        $rs->Primero();
650        if (checkParameter($rs->campos["idordenador"])) {
651                // First, try to connect to ogAdmCleint service.
652                $serverip = $rs->campos["ipserveradm"];
653                $serverport = $rs->campos["portserveradm"];
654                $clientid = $rs->campos["idordenador"];
655                $clientip = $rs->campos["ip"];
656
657                // Connect to reset client's status.
658                $reqframe = "nfn=Sondeo\r".
659                            "ido=$clientid\r".
660                            "iph=$clientip\r";
661                $result = sendCommand($serverip, $serverport, $reqframe, $values);
662
663                // Connect to fetch client's status.
664                // Asuming client is off by default.
665                $values["tso"]="OFF";
666                // Iterate to check client's status.
667                // Exit if status!=OFF or end iterations (status=OFF).
668                $maxIter = 30;
669                for ($i=1; $i<$maxIter and preg_match('/OFF/', $values["tso"]); $i++) {
670                        // Connect to check status.
671                        $reqframe = "nfn=respuestaSondeo\r".
672                                    "ido=$clientid\r".
673                                    "iph=$clientip\r";
674                        $result = sendCommand($serverip, $serverport, $reqframe, $values);
675                        // Wait until next checking (0.1 ms).
676                        usleep(100000);
677                }
678
679                // Parse status response.
680                if ($result) {
681                        // Check status type.
682                        if (checkParameter($values["tso"])) {
683                                // Compose JSON response.
684                                $response['id'] = $clientid;
685                                $response['ip'] = $clientip;
686                                $stat = array();
687                                preg_match('/\/[A-Z]*;/', $values["tso"], $stat);
688                                // Check if data exists.
689                                if (empty($stat[0]) or preg_match('/OFF/', $stat[0])) {
690                                        // If no data, check OGAgent API connection.
691                                        $url = "https://$clientip:8000/opengnsys/status";
692                                        $result = multiRequest(Array($url));
693                                        if (empty($result[0])) {
694                                                // Client is off.
695                                                $response['status'] = $status['OFF'];
696                                        } else {
697                                                // Get status and session data.
698                                                $data = json_decode($result[0]);
699                                                if (isset($status[$data->status])) {
700                                                        $response['status'] = $status[$data->status];
701                                                        $response['loggedin'] = $data->loggedin;
702                                                }
703                                        }
704                                } else {
705                                        $response['status'] = $status[substr($stat[0], 1, 3)];
706                                }
707                                if (empty($response['status'])) {
708                                        $response['status'] = "unknown";
709                                }
710                                jsonResponse(200, $response);
711                        }
712                } else {
713                        // Access error.
714                        $response['message'] = "Cannot access to OpenGnsys server";
715                        jsonResponse(500, $response);
716                }
717        }
718        $rs->Cerrar();
719    }
720);
721
722
723// Listar repositorios.
724$app->get('/ous/:ouid/repos', 'validateApiKey',
725    function($ouid) {
726        global $cmd;
727
728        $ouid = htmlspecialchars($ouid);
729        // Listar las salas de la UO si el usuario de la apikey es su admin.
730        // Consulta temporal,
731        $cmd->texto = "SELECT * FROM repositorios WHERE idcentro='$ouid';";
732        $rs=new Recordset;
733        $rs->Comando=&$cmd;
734        if (!$rs->Abrir()) return(false); // Error al abrir recordset
735        $rs->Primero();
736        // Comprobar que exista la UO.
737        if (checkParameter($rs->campos["idcentro"])) {
738                $response = array();
739                while (!$rs->EOF) {
740                        $tmp = array();
741                        $tmp['id'] = $rs->campos["idrepositorio"];
742                        $tmp['name'] = $rs->campos["nombrerepositorio"];
743                        $tmp['ou']['id'] = $ouid;
744                        array_push($response, $tmp);
745                        $rs->Siguiente();
746                }
747                jsonResponse(200, $response);
748        }
749        $rs->Cerrar();
750    }
751);
752
753// Obtener datos de un repositorio.
754$app->get('/ous/:ouid/repos/:repoid', 'validateApiKey',
755    function($ouid, $repoid) {
756        global $cmd;
757
758        $ouid = htmlspecialchars($ouid);
759        $repoid = htmlspecialchars($repoid);
760        $cmd->texto = "SELECT * FROM repositorios WHERE idrepositorio='$repoid';";
761        $rs=new Recordset;
762        $rs->Comando=&$cmd;
763        if (!$rs->Abrir()) return(false); // Error al abrir recordset
764        $rs->Primero();
765        // Comprobar que exista el repositorio.
766        if (checkParameter($rs->campos["idrepositorio"])) {
767                $response['id'] = $rs->campos["idrepositorio"];
768                $response['name'] = $rs->campos["nombrerepositorio"];
769                $response['description'] = $rs->campos["comentarios"];
770                $response['ip'] = $rs->campos["ip"];
771                //$response['port'] = $rs->campos["puertorepo"];
772                jsonResponse(200, $response);
773        }
774        $rs->Cerrar();
775    }
776);
777
778// Listar imágenes.
779$app->get('/ous/:ouid/images', 'validateApiKey',
780    function($ouid) {
781        global $cmd;
782
783        $ouid = htmlspecialchars($ouid);
784        // Listar las salas de la UO si el usuario de la apikey es su admin.
785        // Consulta temporal,
786        $cmd->texto = "SELECT * FROM imagenes WHERE idcentro='$ouid';";
787        $rs=new Recordset;
788        $rs->Comando=&$cmd;
789        if (!$rs->Abrir()) return(false); // Error al abrir recordset
790        // Comprobar que exista la UO.
791        $rs->Primero();
792        if (checkParameter($rs->campos["idcentro"])) {
793                $response = array();
794                while (!$rs->EOF) {
795                        $tmp = array();
796                        $tmp['id'] = $rs->campos["idimagen"];
797                        $tmp['name'] = $rs->campos["nombreca"];
798                        $tmp['inremotepc'] = $rs->campos["inremotepc"]==0 ? false: true;
799                        $tmp['ou']['id'] = $ouid;
800                        array_push($response, $tmp);
801                        $rs->Siguiente();
802                }
803                jsonResponse(200, $response);
804        }
805    }
806);
807
808// Obtener datos de una imagen.
809$app->get('/ous/:ouid/images/:imgid', 'validateApiKey',
810    function($ouid, $imgid) {
811        global $cmd;
812
813        $ouid = htmlspecialchars($ouid);
814        $imgid = htmlspecialchars($imgid);
815        $cmd->texto = "SELECT * FROM imagenes WHERE idimagen='$imgid';";
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['id'] = $rs->campos["idimagen"];
823                $response['name'] = $rs->campos["nombreca"];
824                $response['description'] = $rs->campos["descripcion"];
825                $response['comments'] = $rs->campos["comentarios"];
826                $response['inremotepc'] = $rs->campos["inremotepc"]==0 ? false: true;
827                $response['repo']['id'] = $rs->campos["idrepositorio"];
828                switch ($rs->campos["tipo"]) {
829                        case 1:  $response['type'] = "monolithic"; break;
830                        case 2:  $response['type'] = "base"; break;
831                        case 3:  $response['type'] = "incremental";
832                                 $response['baseimg'] = $rs->campos["imagenid"];
833                                 $response['path'] = $rs->campos["ruta"];
834                                 break;
835                        default: $response['type'] = $rs->campos["tipo"];
836                }
837                if ($rs->campos["idordenador"] != 0) {
838                        $response['client']['id'] = $rs->campos["idordenador"];
839                        $response['client']['disk'] = $rs->campos["numdisk"];
840                        $response['client']['partition'] = $rs->campos["numpar"];
841                        $response['creationdate'] = $rs->campos["fechacreacion"];
842                        $response['release'] = $rs->campos["revision"];
843                }
844                jsonResponse(200, $response);
845        }
846        $rs->Cerrar();
847    }
848);
849
850// Lista de softeare instalado en una imagen.
851$app->get('/ous/:ouid/images/:imgid/software', 'validateApiKey',
852    function($ouid, $imgid) {
853        global $cmd;
854
855        $ouid = htmlspecialchars($ouid);
856        $imgid = htmlspecialchars($imgid);
857        $cmd->texto = <<<EOD
858SELECT imagenes.idimagen, imagenes.nombreca, nombresos.nombreso, softwares.descripcion
859  FROM perfilessoft
860 RIGHT JOIN imagenes USING(idperfilsoft)
861  LEFT JOIN nombresos USING(idnombreso)
862  LEFT JOIN perfilessoft_softwares USING(idperfilsoft)
863  LEFT JOIN softwares USING(idsoftware)
864 WHERE imagenes.idimagen='$imgid'
865 ORDER BY softwares.descripcion ASC;
866EOD;
867        $rs=new Recordset;
868        $rs->Comando=&$cmd;
869        if (!$rs->Abrir()) return(false);       // Error al abrir recordset
870        $rs->Primero();
871        // Comprobar que exista el repositorio.
872        if (checkParameter($rs->campos["idimagen"])) {
873                $response['id'] = $rs->campos["idimagen"];
874                $response['name'] = $rs->campos["nombreca"];
875                $response['os'] = $rs->campos["nombreso"];
876                //$response['ostype'] = Tipo de SO (agrupar en array con nombre SO).
877                $response['software'] = array();
878                while (!$rs->EOF) {
879                        if ($rs->campos["descripcion"] == null) {
880                                $rs->Siguiente();
881                                continue;
882                        }
883                        $tmp = array();
884                        $tmp['application'] = $rs->campos["descripcion"];
885                        array_push($response['software'], $tmp);
886                        $rs->Siguiente();
887                }
888                jsonResponse(200, $response);
889        }
890        $rs->Cerrar();
891    }
892);
893
894// Arrancar un ordenador con una imagen instalada, elegido al azar.
895$app->get('/ous/:id1/images/:id2/boot', 'validateApiKey',
896    function($ouid, $imageid) {
897        global $cmd;
898        global $AMBITO_ORDENADORES;
899        global $EJECUCION_COMANDO;
900        global $ACCION_INICIADA;
901        global $ACCION_SINRESULTADO;
902
903        // Pparameters.
904        $ouid = htmlspecialchars($ouid);
905        $imegeid = htmlspecialchars($imageid);
906        // Boot 1 client.
907        $nclients = 1;
908
909        // Query: server data and all clients' boot data availabe for Remote PC with this image installed (random order).
910        $cmd->texto = <<<EOD
911SELECT s.ipserveradm, s.portserveradm,
912       c.idordenador, c.ip, c.mac, p.numdisk, p.numpar
913  FROM entornos AS s, ordenadores AS c
914  JOIN aulas USING(idaula)
915  JOIN centros USING(idcentro)
916  JOIN ordenadores_particiones AS p USING(idordenador)
917  JOIN imagenes USING(idimagen)
918 WHERE centros.idcentro='$ouid'
919   AND aulas.inremotepc=1
920   AND imagenes.idimagen='$imageid'
921   AND imagenes.inremotepc=1
922 ORDER BY RAND();
923EOD;
924        $rs=new Recordset;
925        $rs->Comando=&$cmd;
926        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
927        $rs->Primero();
928        if (checkParameter($rs->campos["ipserveradm"])) {
929
930                $response['imageid'] = $imageid;
931                $response['sendto'] = array();
932
933                // AVISO: Procesar datos del servidor (solo 1er registro).
934
935                $serverip = $rs->campos["ipserveradm"];
936                $serverport = $rs->campos["portserveradm"];
937
938                // AVISO: Procesar datos de los clientes.
939
940                $clientid = array();
941                $clientip = array();
942                $clientmac = array();
943                $clientdisk = array();
944                $clientpart = array();
945                while (!$rs->EOF) {
946                        array_push($clientid, $rs->campos["idordenador"]);
947                        array_push($clientip, $rs->campos["ip"]);
948                        array_push($clientmac, $rs->campos["mac"]);
949                        array_push($clientdisk, $rs->campos["numdisk"]);
950                        array_push($clientpart, $rs->campos["numpar"]);
951                        $rs->Siguiente();
952                }
953                $rs->Cerrar();
954
955                // AVISO: consultar el estado de todos los clientes y
956                //        quitar aquellos que no tengan "OFF", "OPG" o ""
957                //        (estudiar si incluir los "BSY")
958
959                // Reset clients' status.
960                $reqframe = "nfn=Sondeo\r".
961                            "ido=".implode(',', $clientid)."\r".
962                            "iph=".implode(';', $clientip)."\r";
963                sendCommand($serverip, $serverport, $reqframe, $values);
964                 // Wait to get response.
965                sleep(3);
966                // Connect to check status.
967                $reqframe = "nfn=respuestaSondeo\r".
968                            "ido=".implode(',', $clientid)."\r".
969                            "iph=".implode(';', $clientip)."\r";
970                sendCommand($serverip, $serverport, $reqframe, $values);
971                // Check status type.
972                if (isset($values["tso"])) {
973                        preg_match_all('/[A-Z]{3}/', $values["tso"], $stat);
974                }
975                if (isset($stat[0])) {
976                        for ($i=0; $i<sizeof($stat[0]); $i++) {
977                                if (! in_array($stat[0][$i], array("OFF", "OPG", ""))) {
978                                        unset($clientid[$i]);
979                                        unset($clientip[$i]);
980                                        unset($clientmac[$i]);
981                                        unset($clientdisk[$i]);
982                                        unset($clientpart[$i]);
983                                }
984                        }
985                }
986
987                // AVISO: el siguiente código inicia un único cliente.
988                //        Para iniciar varios:
989                //        - id. clientes separados por carácter ','.
990                //        - IP clientes separadas por carácter ';'
991                //        - MAC clientes separadas por carácter ';'
992
993                // Executing boot command.
994                $reqframe = "nfn=Arrancar\r".
995                            "ido=".implode(',', $clientid)."\r".
996                            "iph=".implode(';', $clientip)."\r".
997                            "mac=".implode(';', $clientmac)."\r".
998                            "mar=1\r";
999echo "req=".str_replace("\r"," ",$reqframe).".\n";
1000                sendCommand($serverip, $serverport, $reqframe, $values);
1001                if ($values["res"]) {
1002print_r($values);
1003                        $tmp = array();
1004                        for ($i=0, $boot=0; $i<sizeof($clientid) and $boot!=1; $i++) {
1005                                $reqframe = "nfn=IniciarSesion\r".
1006                                            "ido=".$clientid[$i]."\r".
1007                                            "iph=".$clientip[$i]."\r".
1008                                            "dsk=".$clientdisk[$i]."\r".
1009                                            "par=".$clientpart[$i]."\r";
1010echo "i=$i: req=".str_replace("\r"," ",$reqframe).".\n";
1011                                sendCommand($serverip, $serverport, $reqframe, $values);
1012                                if ($values["res"]) {
1013
1014                                        // AVISO: incluir comando Iniciar sesión en cola de acciones.
1015                                        $timestamp=time();
1016                                        $cmd->texto = <<<EOD
1017INSERT INTO acciones
1018        SET tipoaccion=$EJECUCION_COMANDO,
1019            idtipoaccion=9,
1020            idcomando=9,
1021            parametros='nfn=IniciarSesion\rdsk=$clientdisk[$i]\rpar=$clientpart[$i]',
1022            descriaccion='RemotePC Session',
1023            idordenador=$clientid[$i],
1024            ip='$clientip[$i]',
1025            sesion=$timestamp,
1026            fechahorareg=NOW(),
1027            estado=$ACCION_INICIADA,
1028            resultado=$ACCION_SINRESULTADO,
1029            ambito=$AMBITO_ORDENADORES,
1030            idambito=$clientid[$i],
1031            restrambito='$clientip[$i]',
1032            idcentro=$ouid;
1033EOD;
1034                                        $result = $cmd->Ejecutar();
1035                                        if ($result) {
1036                                                $tmp['id'] = $clientid[$i];
1037                                                $tmp['ip'] = $clientip[$i];
1038                                                $tmp['mac'] = $clientmac[$i];
1039                                                array_push($response['sendto'], $tmp);
1040                                                $boot = 1;
1041                                        }
1042                                }
1043                        }
1044                }
1045                jsonResponse(200, $response);
1046        }
1047    }
1048);
1049// Alternativa como método GET.
1050//$app->get('/ous/:id1/images/:id2/boot/:number', 'validateApiKey',
1051//    function($ouid, $imageid, $number) {
1052//
1053//   }
1054//);
1055
1056?>
Note: See TracBrowser for help on using the repository browser.