source: admin/WebConsole/rest/server.php @ 744ecd6

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 744ecd6 was ffaf580, checked in by ramon <ramongomez@…>, 7 years ago

#708: Componer correctamente los valores enteros en mensajes JSON de las respuestas REST (sin comillas).

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

  • Property mode set to 100644
File size: 32.3 KB
Line 
1<?php
2/**
3 * @file    index.php
4 * @brief   OpenGnsys Server 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 - First version
10 * @date    2016-09-19
11 */
12
13
14// Auxiliar functions.
15
16/**
17 * @brief    Check if user is administrator and print error messages if not.
18 * @param    int adminid   Administrator id.
19 * @return   boolean       "true" if admin id. is equals to global user id., otherwise "false".
20 */
21function checkAdmin($adminid) {
22        global $userid;
23
24        if ($adminid == $userid) {
25                return true;
26        } else {
27                // Print error message.
28                $response['message'] = 'Cannot access this resource';
29                jsonResponse(401, $response);
30                return false;
31        }
32}
33
34/**
35 * @fn    addClassroomGroup(&$classroomGroups, $rs)
36 * @brief Funcion privada usada para añadir grupos de aulas recursivamente
37 * @param classroomGroups Grupos de aulas que pueden contener más grupos
38 * @param rs resultset de la consulta a la base de datos.
39 */
40function addClassroomGroup(&$classroomGroups, $rs){
41
42        array_walk($classroomGroups, function(&$group,$key){
43                global $rs;
44                if (isset($group['id']) && $group['id'] === $rs->campos["group_group_id"]) {
45                        array_push($group["classroomGroups"],array("id" => $rs->campos["group_id"],
46                                "name" => $rs->campos["nombregrupoordenador"],
47                                "comments" => $rs->campos["comentarios"],
48                                "classroomGroups" => array()));
49                }
50                else if(count($group["classroomGroups"]) > 0){
51                        addClassroomGroup($group["classroomGroups"], $rs);
52                }
53                /**/
54        });
55}
56
57/**
58 * @fn    getStatus(ouid, labid, [clntid])
59 * @brief    Returns client execution status or status of all lab's clients.
60 * @param    ouid    OU id.
61 * @param    labid   Lab. id.
62 * @param    clntid  Client id. (optional)
63 * @return   string  JSON object or array of objects including status data.
64 */
65function getStatus($ouid, $labid, $clntid=0) {
66        global $userid;
67        global $cmd;
68        global $LONCABECERA;
69        global $LONHEXPRM;
70        $app = \Slim\Slim::getInstance();
71        $clientid = $clientip = "";
72        $urls = Array();
73        // Status mapping.
74        $status = Array('OFF'=>"off",
75                        'INI'=>"initializing",
76                        'OPG'=>"oglive",
77                        'BSY'=>"busy",
78                        'LNX'=>"linux",
79                        'OSX'=>"macos",
80                        'WIN'=>"windows",
81                        'UNK'=>"unknown");
82        // Parameters.
83        $ouid = htmlspecialchars($ouid);
84        $labid = htmlspecialchars($labid);
85        $single = is_numeric(explode("/", $app->request->getResourceUri())[6]);
86
87        // Database query.
88        $cmd->texto = <<<EOD
89SELECT adm.idadministradorcentro, entornos.ipserveradm, entornos.portserveradm,
90       aulas.idaula, ordenadores.idordenador, ordenadores.ip
91  FROM entornos, ordenadores
92  JOIN aulas USING(idaula)
93 RIGHT JOIN administradores_centros AS adm USING(idcentro)
94 WHERE adm.idadministradorcentro = '$userid'
95   AND adm.idcentro='$ouid'
96   AND aulas.idaula='$labid'
97EOD;
98        // Request for a single client.
99        if ($single) {
100                $clntid = htmlspecialchars($clntid);
101                $cmd->texto .= <<<EOD
102   AND ordenadores.idordenador='$clntid';
103EOD;
104        } else {
105                $response = Array();
106        }
107        $rs=new Recordset;
108        $rs->Comando=&$cmd;
109        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
110        $rs->Primero();
111        // Check if user is an UO admin and asset exists.
112        if (checkAdmin($rs->campos["idadministradorcentro"]) and (($single and checkParameter($rs->campos["idordenador"])) or (! $single and checkParameter($rs->campos["idaula"])))) {
113                // First, try to connect to ogAdmCleint service.
114                $serverip = $rs->campos["ipserveradm"];
115                $serverport = $rs->campos["portserveradm"];
116                while (!$rs->EOF) {
117                        $id[$rs->campos["ip"]] = $rs->campos["idordenador"];
118                        $stat[$rs->campos["ip"]] = $status['OFF'];
119                        $rs->Siguiente();
120                }
121                // Connect to reset client's status.
122                $clientid = implode(",", $id);
123                $clientip = implode(";", array_keys($id));
124                $reqframe = "nfn=Sondeo\r".
125                            "ido=$clientid\r".
126                            "iph=$clientip\r";
127                $result = sendCommand($serverip, $serverport, $reqframe, $values);
128                // Connect to fetch client's status.
129                // Asuming client is off by default.
130                $values["tso"]="OFF";
131                // Iterate to check client's status.
132                // Exit if status!=OFF or end iterations (status=OFF).
133                $maxIter = 30;
134                for ($i=1; $i<$maxIter and preg_match('/OFF/', $values["tso"]); $i++) {
135                        // Connect to check status.
136                        $reqframe = "nfn=respuestaSondeo\r".
137                                    "ido=$clientid\r".
138                                    "iph=$clientip\r";
139                        $result = sendCommand($serverip, $serverport, $reqframe, $values);
140                        // Wait until next checking (0.1 ms).
141                        usleep(100000);
142                }
143                // Parse status response.
144                if ($result) {
145                        // Check status type.
146                        if (checkParameter($values["tso"])) {
147                                foreach (explode(";", $values["tso"]) as $data) {
148                                        if (!empty($data)) {
149                                                list($clip, $clst) = explode("/", $data);
150                                                if ($clst != "OFF") {
151                                                        // Update current status.
152                                                        $stat[$clip] = $status[$clst];
153                                                }
154                                        }
155                                }
156                        }
157                        // Prepare request to new OGAgent for OSes.
158                        foreach ($stat as $ip => $st) {
159                                if ($st == "off") {
160                                        $urls[$ip] = "https://$ip:8000/opengnsys/status";
161                                }
162                        }
163                        // Send request to OGAgents.
164                        if (isset($urls)) {
165                                $result = multiRequest($urls);
166                        }
167                        // Parse responses.
168                        reset($urls);
169                        foreach ($result as $res) {
170                                if (!empty($res['data'])) {
171                                        // Get status and session data.
172                                        $ip = key($urls);
173                                        $data = json_decode($res['data']);
174                                        if (@isset($status[$data->status])) {
175                                                $stat[$ip] = $status[$data->status];
176                                                $logged[$ip] = $data->loggedin;
177                                        } else {
178                                                $stat[$ip] = $status['UNK'];
179                                        }
180                                }
181                                unset($urls[$ip]);
182                        }
183                        // Compose JSON response.
184                        if ($single) {
185                                // Single response.
186                                $response['id'] = (int)reset($id);
187                                $response['ip'] = key($id);
188                                $response['status'] = $stat[$ip];
189                                empty($logged[$ip]) || $response['loggedin'] = $logged[$ip];
190                        } else {
191                                // Multiple responses.
192                                foreach ($stat as $ip => $st) {
193                                        $tmp = Array();
194                                        $tmp['id'] = (int)$id[$ip];
195                                        $tmp['ip'] = $ip;
196                                        $tmp['status'] = $stat[$ip];
197                                        empty($logged[$ip]) || $tmp['loggedin'] = $logged[$ip];
198                                        array_push($response, $tmp);
199                                }
200                        }
201                        jsonResponse(200, $response);
202                } else {
203                        // Access error.
204                        $response['message'] = "Cannot access to OpenGnsys server";
205                        jsonResponse(500, $response);
206                }
207        }
208        $rs->Cerrar();
209}
210
211
212// REST routes.
213
214/**
215 * @brief    user login.
216 * @note     Route: /login, Method: POST
217 * @param    string username   User name.
218 * @param    string password   User password.
219 * @return   string            JSON response with user id. and API key.
220 * @note     User's API key is stored in a new field of "usuarios" table.
221 */
222$app->post('/login',
223    function() use ($app) {
224        global $cmd;
225        global $userid;
226
227        $response = Array();
228        // Reading JSON parameters.
229        try {
230                $input = json_decode($app->request()->getBody());
231                $user = htmlspecialchars($input->username);
232                $pass = htmlspecialchars($input->password);
233        } catch (Exception $e) {
234                // Error message.
235                $response["message"] = $e->getMessage();
236                jsonResponse(400, $response);
237                $app->stop();
238        }
239
240        // Checking parameters.
241        if (! empty($user) and ! empty($pass)) {
242                // Database query.
243                $cmd->texto = "SELECT idusuario, apikey
244                                 FROM usuarios
245                                WHERE usuario='$user' AND pasguor=SHA2('$pass',224)";
246                $rs=new Recordset;
247                $rs->Comando=&$cmd;
248                if ($rs->Abrir()) {
249                        $rs->Primero();
250                        if (!$rs->EOF){
251                                // JSON response.
252                                $userid=$rs->campos["idusuario"];
253                                $apikey=$rs->campos["apikey"];
254                                $response['userid'] = $userid;
255                                $response['apikey'] = $apikey;
256                                jsonResponse(200, $response);
257                        } else {
258                                // Credentials error.
259                                $response['message'] = 'Login failed. Incorrect credentials';
260                                jsonResponse(401, $response);
261                                $app->stop();
262                        }
263                        $rs->Cerrar();
264                } else {
265                        // Access error.
266                        $response['message'] = "An error occurred. Please try again";
267                        jsonResponse(500, $response);
268                        $app->stop();
269                }
270        } else {
271                # Error: missing some input parameter.
272                $response['message'] = 'Missing username or password';
273                jsonResponse(400, $response);
274                $app->stop();
275        }
276    }
277);
278
279/**
280 * @brief    List all defined Organizational Units
281 * @note     Route: /ous, Method: GET
282 * @param    no
283 * @return   JSON array with id. and name for every defined OU
284 */
285$app->get('/ous(/)', function() {
286        global $cmd;
287
288        $cmd->texto = "SELECT * FROM centros";
289        $rs=new Recordset;
290        $rs->Comando=&$cmd;
291        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
292        $response = Array();
293        $rs->Primero();
294        while (!$rs->EOF) {
295                $tmp = Array();
296                $tmp['id'] = (int)$rs->campos["idcentro"];
297                $tmp['name'] = $rs->campos["nombrecentro"];
298                array_push($response, $tmp);
299                $rs->Siguiente();
300        }
301        $rs->Cerrar();
302        jsonResponse(200, $response);
303   }
304);
305
306/**
307 * @brief    Get Organizational Unit data
308 * @note     Route: /ous/id, Method: GET
309 * @param    id      OU id.
310 * @return   JSON string with OU's parameters
311 */
312$app->get('/ous/:ouid(/)', 'validateApiKey',
313    function($ouid) {
314        global $cmd;
315        global $userid;
316
317        $ouid = htmlspecialchars($ouid);
318        // Show OU information if user is OU's admin.
319        $cmd->texto = <<<EOD
320SELECT *
321  FROM centros
322 RIGHT JOIN administradores_centros USING(idcentro)
323 WHERE administradores_centros.idadministradorcentro = '$userid'
324   AND centros.idcentro = '$ouid'
325 LIMIT 1;
326EOD;
327        $rs=new Recordset;
328        $rs->Comando=&$cmd;
329        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
330        $rs->Primero();
331        if (checkAdmin($rs->campos["idadministradorcentro"]) and
332            checkParameter($rs->campos["idcentro"])) {
333                $response['id'] = (int)$ouid;
334                $response['name'] = $rs->campos["nombrecentro"];
335                $response['description'] = $rs->campos["comentarios"];
336                jsonResponse(200, $response);
337        }
338        $rs->Cerrar();
339    }
340);
341
342/**
343 * @brief    List group of labs in an Organizational Unit
344 * @note     Route: /ous/id/groups, Method: GET
345 * @param    id      OU id.
346 * @return   JSON array of OU groups
347 */
348$app->get('/ous/:ouid/groups(/)', 'validateApiKey', function($ouid) {
349        global $cmd;
350        global $userid;
351
352        $ouid = htmlspecialchars($ouid);
353        // List group of labs if user is OU's admin.
354        $cmd->texto = <<<EOD
355SELECT adm.idadministradorcentro, grupos.*
356  FROM grupos
357 RIGHT JOIN administradores_centros AS adm USING(idcentro)
358 WHERE adm.idadministradorcentro = '$userid'
359   AND idcentro='$ouid';
360EOD;
361        $rs=new Recordset;
362        $rs->Comando=&$cmd;
363        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
364        $rs->Primero();
365        // Check if user is an UO admin.
366        if (checkAdmin($rs->campos["idadministradorcentro"])) {
367                $response = Array();
368                // Read data.
369                if (! is_null($rs->campos["idcentro"])) {
370                        while (!$rs->EOF) {
371                                $tmp = Array();
372                                $tmp['id'] = (int)$rs->campos["idgrupo"];
373                                $tmp['name'] = $rs->campos["nombregrupo"];
374                                $tmp['type'] = $rs->campos["tipo"];
375                                $tmp['comments'] = $rs->campos["comentarios"];
376                                if($rs->campos["grupoid"] != 0){
377                                        $tmp['parent']['id'] = (int)$rs->campos["grupoid"];
378                                }
379                                array_push($response, $tmp);
380                                $rs->Siguiente();
381                        }
382                }
383                jsonResponse(200, $response);
384        }
385        $rs->Cerrar();
386    }
387);
388
389/**
390 * @brief    List all labs defined in an OU
391 * @note     Route: /ous/id/labs, Method: GET
392 * @param    id      OU id.
393 * @return   JSON array of all UO's labs data
394 */
395$app->get('/ous/:ouid/labs(/)', 'validateApiKey',
396    function($ouid) {
397        global $userid;
398        global $cmd;
399
400        $ouid = htmlspecialchars($ouid);
401        // Database query.
402        $cmd->texto = <<<EOD
403SELECT adm.idadministradorcentro, aulas.*, grp.idgrupo AS group_id,
404       grp.nombregrupoordenador, grp.grupoid AS group_group_id, grp.comentarios
405  FROM aulas
406 RIGHT JOIN administradores_centros AS adm USING(idcentro)
407  LEFT JOIN gruposordenadores AS grp USING(idaula)
408 WHERE adm.idadministradorcentro = '$userid'
409   AND adm.idcentro='$ouid'
410 ORDER BY aulas.idaula, grp.idgrupo
411EOD;
412        $rs=new Recordset;
413        $rs->Comando=&$cmd;
414        if (!$rs->Abrir()) return(false);       // Error opening recordset.
415        // Check if user is an UO admin.
416        $rs->Primero();
417        if (checkAdmin($rs->campos["idadministradorcentro"])) {
418                $response = Array();
419                if (! is_null($rs->campos["idcentro"])) {
420                        while (!$rs->EOF) {
421                                // En los resultados las aulas vienen repetidas tantas veces como grupos tengan, solo dejamos uno
422                                $classroomIndex = -1;
423                                $found=false;
424                                $index = 0;
425                                while(!$found && $index < count($response)){
426                                        if(isset($response[$index]["id"]) && $response[$index]["id"] == $rs->campos["idaula"]){
427                                                $classroomIndex = $index;
428                                                $found = true;
429                                        }
430                                        $index++;
431                                }
432                                if(!$found){
433                                        $tmp = Array();
434                                        $tmp['id'] = (int)$rs->campos["idaula"];
435                                        $tmp['name'] = $rs->campos["nombreaula"];
436                                        $tmp['inremotepc'] = $rs->campos["inremotepc"]==0 ? false: true;
437                                        $tmp['group']['id'] = (int)$rs->campos["grupoid"];
438                                        $tmp['ou']['id'] = (int)$ouid;
439                                        array_push($response, $tmp);
440                                }
441                                else{
442                                        // Le añadimos el grupo en cuestion siempre que no sea un subgrupo
443                                        if($rs->campos["group_group_id"] == 0){
444                                                array_push($response[$classroomIndex]['classroomGroups'],
445                                                        array("id" => (int)$rs->campos["group_id"],
446                                                        "name" => $rs->campos["nombregrupoordenador"],
447                                                        "comments" => $rs->campos["comentarios"],
448                                                        "classroomGroups" => array()));
449                                        }
450                                        else {
451                                                // Buscamos el grupo donde añadir el grupo
452                                                addClassroomGroup($response[$classroomIndex]['classroomGroups'], $rs);
453                                        }
454                                }
455                                $rs->Siguiente();
456                        }
457                }
458                jsonResponse(200, $response);
459        }
460        $rs->Cerrar();
461    }
462);
463
464/**
465 * @brief    Get lab data
466 * @note     Route: /ous/id1/labs/id2, Method: GET
467 * @param    id1     OU id.
468 * @param    id2     lab id.
469 * @return   JSON string with lab parameters
470 */
471$app->get('/ous/:ouid/labs/:labid(/)', 'validateApiKey',
472    function($ouid, $labid) {
473        global $userid;
474        global $cmd;
475
476        $ouid = htmlspecialchars($ouid);
477        $labid = htmlspecialchars($labid);
478        // Database query.
479        $cmd->texto = <<<EOD
480SELECT adm.idadministradorcentro, COUNT(idordenador) AS defclients, aulas.*
481  FROM aulas
482 RIGHT JOIN administradores_centros AS adm USING(idcentro)
483  LEFT JOIN ordenadores USING(idaula)
484 WHERE adm.idadministradorcentro = '$userid'
485   AND idcentro='$ouid'
486   AND idaula='$labid';
487EOD;
488        $rs=new Recordset;
489        $rs->Comando=&$cmd;
490        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
491        $rs->Primero();
492        // Check if user is an UO admin and lab exists.
493        if (checkAdmin($rs->campos["idadministradorcentro"]) and checkParameter($rs->campos["idaula"])) {
494                $response['id'] = (int)$rs->campos["idaula"];
495                $response['name'] = $rs->campos["nombreaula"];
496                $response['location'] = $rs->campos["ubicacion"];
497                $response['description'] = $rs->campos["comentarios"];
498                $response['inremotepc'] = $rs->campos["inremotepc"]==0 ? false: true;
499                $response['capacity'] = (int)$rs->campos["puestos"];
500                $response['defclients'] = (int)$rs->campos["defclients"];
501                $response['projector'] = $rs->campos["cagnon"]==0 ? false: true;
502                $response['board'] = $rs->campos["pizarra"]==0 ? false: true;
503                $response['routerip'] = $rs->campos["router"];
504                $response['netmask'] = $rs->campos["netmask"];
505                $response['ntp'] = $rs->campos["ntp"];
506                $response['dns'] = $rs->campos["dns"];
507                $response['proxyurl'] = $rs->campos["proxy"];
508                switch ($rs->campos["modomul"]) {
509                        case 1:  $response['mcastmode'] = "half-duplex"; break;
510                        case 2:  $response['mcastmode'] = "full-duplex"; break;
511                        default: $response['mcastmode'] = $rs->campos["modomul"];
512                }
513                $response['mcastip'] = $rs->campos["ipmul"];
514                $response['mcastport'] = $rs->campos["pormul"];
515                $response['mcastspeed'] = $rs->campos["velmul"];
516                $response['p2pmode'] = $rs->campos["modp2p"];
517                $response['p2ptime'] = $rs->campos["timep2p"];
518                $response['picture'] = $rs->campos["urlfoto"];
519                jsonResponse(200, $response);
520        }
521        $rs->Cerrar();
522    }
523);
524
525
526/**
527 * @brief    List all clients defined in a lab
528 * @note     Route: /ous/id1/labs/id2/clients, Method: GET
529 * @param    id1     OU id.
530 * @param    id2     lab id.
531 * @return   JSON data with lab id. and array of lab parameters
532 */
533$app->get('/ous/:ouid/labs/:labid/clients(/)', 'validateApiKey',
534    function($ouid, $labid) {
535        global $userid;
536        global $cmd;
537
538        $ouid = htmlspecialchars($ouid);
539        $labid = htmlspecialchars($labid);
540        // Database query.
541        $cmd->texto = <<<EOD
542SELECT adm.idadministradorcentro, ordenadores.*, aulas.idaula AS labid
543  FROM ordenadores
544 RIGHT JOIN aulas USING(idaula)
545 RIGHT JOIN administradores_centros AS adm USING(idcentro)
546 WHERE adm.idadministradorcentro = '$userid'
547   AND adm.idcentro='$ouid'
548   AND aulas.idaula='$labid';
549EOD;
550        $rs=new Recordset;
551        $rs->Comando=&$cmd;
552        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
553        $rs->Primero();
554        // Check if user is an UO admin and lab exists.
555        if (checkAdmin($rs->campos["idadministradorcentro"]) and checkParameter($rs->campos["labid"])) {
556                $response = Array();
557                while (!$rs->EOF) {
558                        if (!is_null($rs->campos["idordenador"])) {
559                                $tmp = Array();
560                                $tmp['id'] = (int)$rs->campos["idordenador"];
561                                $tmp['name'] = $rs->campos["nombreordenador"];
562                                $tmp['ip'] = $rs->campos["ip"];
563                                $tmp['mac'] = $rs->campos["mac"];
564                                $tmp['ou']['id'] = (int)$ouid;
565                                $tmp['lab']['id'] = (int)$labid;
566                                array_push($response, $tmp);
567                        }
568                        $rs->Siguiente();
569                }
570                jsonResponse(200, $response);
571        }
572        $rs->Cerrar();
573    }
574);
575
576/**
577 * @brief    Get execution status of all clients defined in a lab
578 * @note     Route: /ous/id1/labs/id2clients/id3/status, Method: GET
579 * @param    id1     OU id.
580 * @param    id2     lab id.
581 * @return   JSON string with array of all client status defined in a lab
582 */
583$app->get('/ous/:ouid/labs/:labid/clients/status(/)', 'validateApiKey', 'getStatus');
584
585/**
586 * @brief    Get client data
587 * @note     Route: /ous/id1/labs/id2clients/id3, Method: GET
588 * @param    id1     OU id.
589 * @param    id2     lab id.
590 * @param    id3     client id.
591 * @return   JSON string with hardware parameters
592 */
593$app->get('/ous/:ouid/labs/:labid/clients/:clntid(/)', 'validateApiKey',
594    function($ouid, $labid, $clntid) {
595        global $userid;
596        global $cmd;
597
598        $ouid = htmlspecialchars($ouid);
599        $labid = htmlspecialchars($labid);
600        $clntid = htmlspecialchars($clntid);
601        // Database query.
602        $cmd->texto = <<<EOD
603SELECT adm.idadministradorcentro, ordenadores.*
604  FROM ordenadores
605  JOIN aulas USING(idaula)
606 RIGHT JOIN administradores_centros AS adm USING(idcentro)
607 WHERE adm.idadministradorcentro = '$userid'
608   AND idcentro='$ouid'
609   AND idaula='$labid'
610   AND idordenador='$clntid';
611EOD;
612        $rs=new Recordset;
613        $rs->Comando=&$cmd;
614        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
615        $rs->Primero();
616        // Check if user is an UO admin, lab exists and client exists.
617        if (checkAdmin($rs->campos["idadministradorcentro"]) and checkParameter($rs->campos["idaula"]) and checkParameter($rs->campos["idordenador"])) {
618                // Read data.
619                $response['id'] = (int)$rs->campos["idordenador"];
620                $response['name'] = $rs->campos["nombreordenador"];
621                $response['serialno'] = $rs->campos["numserie"];
622                $response['netiface'] = $rs->campos["netiface"];
623                $response['netdriver'] = $rs->campos["netdriver"];
624                $response['mac'] = $rs->campos["mac"];
625                $response['ip'] = $rs->campos["ip"];
626                $response['netmask'] = $rs->campos["mascara"];
627                $response['routerip'] = $rs->campos["router"];
628                $response['repo']['id'] = (int)$rs->campos["idrepositorio"];
629                //$response['hardprofile']['id'] = $rs->campos["idperfilhard"];
630                //$response['menu']['id'] = $rs->campos["idmenu"];
631                $response['validation'] = $rs->campos["validacion"]==0 ? false: true;
632                $response['boottype'] = $rs->campos["arranque"];
633                $response['picture'] = $rs->campos["fotoord"];
634                jsonResponse(200, $response);
635        }
636        $rs->Cerrar();
637    }
638);
639
640/**
641 * @brief    Get client's harware configuration data
642 * @note     Route: /ous/id1/labs/id2clients/id3/hardware, Method: GET
643 * @param    id1     OU id.
644 * @param    id2     lab id.
645 * @param    id3     client id.
646 * @return   JSON string with cleint parameters
647 */
648$app->get('/ous/:ouid/labs/:labid/clients/:clntid/hardware(/)', 'validateApiKey',
649    function($ouid, $labid, $clntid) {
650        global $userid;
651        global $cmd;
652
653        $ouid = htmlspecialchars($ouid);
654        $labid = htmlspecialchars($labid);
655        $clntid = htmlspecialchars($clntid);
656        // Database query.
657        $cmd->texto = <<<EOD
658SELECT adm.idadministradorcentro, ordenadores.idordenador, ordenadores.nombreordenador,
659       tipohardwares.nemonico, hardwares.descripcion
660  FROM ordenadores
661  JOIN aulas USING(idaula)
662 RIGHT JOIN administradores_centros AS adm USING(idcentro)
663  LEFT JOIN perfileshard_hardwares USING(idperfilhard)
664  LEFT JOIN hardwares ON perfileshard_hardwares.idhardware=hardwares.idhardware
665  LEFT JOIN tipohardwares ON tipohardwares.idtipohardware=hardwares.idtipohardware
666 WHERE adm.idadministradorcentro = '$userid'
667   AND adm.idcentro='$ouid'
668   AND aulas.idaula='$labid'
669   AND ordenadores.idordenador='$clntid';
670EOD;
671        $rs=new Recordset;
672        $rs->Comando=&$cmd;
673        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
674        $rs->Primero();
675        // Check if user is an UO admin and client exists.
676        if (checkAdmin($rs->campos["idadministradorcentro"]) and checkParameter($rs->campos["idordenador"])) {
677                // Read data.
678                $response['id'] = (int)$rs->campos["idordenador"];
679                $response['name'] = $rs->campos["nombreordenador"];
680                $response['hardware'] = Array();
681                while (!$rs->EOF) {
682                        if (!is_null($rs->campos["nemonico"])) {
683                                $tmp = Array();
684                                $tmp['type'] = $rs->campos["nemonico"];
685                                $tmp['description'] = $rs->campos["descripcion"];
686                                array_push($response['hardware'], $tmp);
687                        }
688                        $rs->Siguiente();
689                }
690                jsonResponse(200, $response);
691        }
692        $rs->Cerrar();
693    }
694);
695
696/**
697 * @brief    Get client's disk configuration data
698 * @note     Route: /ous/id1/labs/id2clients/id3/diskcfg, Method: GET
699 * @param    id1     OU id.
700 * @param    id2     lab id.
701 * @param    id3     client id.
702 * @return   JSON string with disk parameters
703 */
704$app->get('/ous/:ouid/labs/:labid/clients/:clntid/diskcfg(/)', 'validateApiKey',
705    function($ouid, $labid, $clntid) {
706        global $userid;
707        global $cmd;
708
709        $ouid = htmlspecialchars($ouid);
710        $labid = htmlspecialchars($labid);
711        $clntid = htmlspecialchars($clntid);
712        // Database query.
713        $cmd->texto = <<<EOD
714SELECT adm.idadministradorcentro, ordenadores.idordenador AS clientid,
715       ordenadores.nombreordenador, ordenadores_particiones.*, tipospar.tipopar,
716       sistemasficheros.nemonico, nombresos.nombreso, imagenes.nombreca,
717       (imagenes.revision - ordenadores_particiones.revision) AS difimagen
718  FROM ordenadores_particiones
719 RIGHT JOIN ordenadores USING(idordenador)
720  JOIN aulas USING(idaula)
721 RIGHT JOIN administradores_centros AS adm USING(idcentro)
722  LEFT JOIN tipospar USING(codpar)
723  LEFT JOIN sistemasficheros USING(idsistemafichero)
724  LEFT JOIN nombresos USING(idnombreso)
725  LEFT JOIN imagenes USING(idimagen)
726 WHERE adm.idadministradorcentro = '$userid'
727   AND adm.idcentro='$ouid'
728   AND aulas.idaula='$labid'
729   AND ordenadores.idordenador='$clntid'
730 ORDER BY numdisk ASC, numpar ASC;
731EOD;
732        $rs=new Recordset;
733        $rs->Comando=&$cmd;
734        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
735        $rs->Primero();
736        // Check if user is an UO admin and client exists.
737        if (checkAdmin($rs->campos["idadministradorcentro"]) and checkParameter($rs->campos["clientid"])) {
738                // Read data.
739                $response['id'] = (int)$rs->campos["clientid"];
740                $response['name'] = $rs->campos["nombreordenador"];
741                $response['diskcfg'] = Array();
742                while (!$rs->EOF) {
743                        // Skip header.
744                        if ($rs->campos["numdisk"] == 0) {
745                                $rs->Siguiente();
746                                continue;
747                        }
748                        $tmp = Array();
749                        // Common data.
750                        $tmp['disk'] = (int)$rs->campos["numdisk"];
751                        $tmp['size'] = (int)$rs->campos["tamano"];
752                        if ($rs->campos["numpar"] == 0) {
753                                // Disk data.
754                                switch ($rs->campos["codpar"]) {
755                                        case 1:  $tmp['parttable'] = "MSDOS"; break;
756                                        case 2:  $tmp['parttable'] = "GPT"; break;
757                                        case 3:  $tmp['parttable'] = "LVM"; break;
758                                        case 4:  $tmp['parttable'] = "ZPOOL"; break;
759                                        default: $tmp['parttable'] = $rs->campos["codpar"];
760                                }
761                        } else {
762                                // Partition data.
763                                $tmp['partition'] = (int)$rs->campos["numpar"];
764                                $tmp['parttype'] = $rs->campos["tipopar"];
765                                $tmp['filesystem'] = $rs->campos["nemonico"];
766                                $tmp['usage'] = (int)$rs->campos["uso"];
767                                if ($rs->campos["nombreso"] != null) {
768                                        $tmp['os'] = $rs->campos["nombreso"];
769                                        if ($rs->campos["idimagen"] > 0) {
770                                                // Restored image data.
771                                                $tmp['image']['id'] = (int)$rs->campos["idimagen"];
772                                                $tmp['image']['deploydate'] = $rs->campos["fechadespliegue"];
773                                                // Check if image is updated.
774                                                $tmp['image']['updated'] = ($rs->campos["difimagen"]>0 ? "false" : "true");
775                                        }
776                                }
777                                //$tmp['cachedata'] = $rs->campos["cache"];
778                        }
779                        array_push($response['diskcfg'], $tmp);
780                        $rs->Siguiente();
781                }
782                jsonResponse(200, $response);
783        }
784        $rs->Cerrar();
785    }
786);
787
788/**
789 * @brief    Get client's execution status
790 * @note     Route: /ous/id1/labs/id2clients/id3/status, Method: GET
791 * @param    id1     OU id.
792 * @param    id2     lab id.
793 * @param    id3     client id.
794 * @return   JSON string with client status
795 */
796$app->get('/ous/:ouid/labs/:labid/clients/:clntid/status(/)', 'validateApiKey', 'getStatus');
797
798/**
799 * @brief    List all image repositories defined in an OU
800 * @note     Route: /ous/id/repos, Method: GET
801 * @param    id      OU id.
802 * @return   JSON array of all UO's repo data
803 */
804$app->get('/ous/:ouid/repos(/)', 'validateApiKey',
805    function($ouid) {
806        global $userid;
807        global $cmd;
808
809        $ouid = htmlspecialchars($ouid);
810        // Database query.
811        $cmd->texto = <<<EOD
812SELECT adm.idadministradorcentro, adm.idcentro AS ouid, repositorios.*
813  FROM repositorios
814 RIGHT JOIN administradores_centros AS adm USING(idcentro)
815 WHERE adm.idadministradorcentro = '$userid'
816   AND adm.idcentro='$ouid';
817EOD;
818        $rs=new Recordset;
819        $rs->Comando=&$cmd;
820        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
821        $rs->Primero();
822        // Check if user is an UO admin.
823        if (checkAdmin($rs->campos["idadministradorcentro"]) and checkParameter($rs->campos["ouid"])) {
824                $response = Array();
825                while (!$rs->EOF) {
826                        if (! is_null($rs->campos["idcentro"])) {
827                                $tmp = Array();
828                                $tmp['id'] = (int)$rs->campos["idrepositorio"];
829                                $tmp['name'] = $rs->campos["nombrerepositorio"];
830                                $tmp['ou']['id'] = (int)$ouid;
831                                array_push($response, $tmp);
832                        }
833                        $rs->Siguiente();
834                }
835                jsonResponse(200, $response);
836        }
837        $rs->Cerrar();
838    }
839);
840
841/**
842 * @brief    Get image repository data
843 * @note     Route: /ous/id1/repos/id2, Method: GET
844 * @param    id1     OU id.
845 * @param    id2     repo id.
846 * @return   JSON string with repo parameters
847 */
848$app->get('/ous/:ouid/repos/:repoid(/)', 'validateApiKey',
849    function($ouid, $repoid) {
850        global $userid;
851        global $cmd;
852
853        $ouid = htmlspecialchars($ouid);
854        $repoid = htmlspecialchars($repoid);
855        // Database query.
856        $cmd->texto = <<<EOD
857SELECT adm.idadministradorcentro, repositorios.*
858  FROM repositorios
859 RIGHT JOIN administradores_centros AS adm USING(idcentro)
860 WHERE adm.idadministradorcentro = '$userid'
861   AND adm.idcentro='$ouid'
862   AND idrepositorio='$repoid';
863EOD;
864        $rs=new Recordset;
865        $rs->Comando=&$cmd;
866        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
867        $rs->Primero();
868        // Check if user is an UO admin and repo exists.
869        if (checkAdmin($rs->campos["idadministradorcentro"]) and checkParameter($rs->campos["idrepositorio"])) {
870                // Read data.
871                $response['id'] = (int)$rs->campos["idrepositorio"];
872                $response['name'] = $rs->campos["nombrerepositorio"];
873                $response['description'] = $rs->campos["comentarios"];
874                $response['ip'] = $rs->campos["ip"];
875                //$response['port'] = $rs->campos["puertorepo"];
876                jsonResponse(200, $response);
877        }
878        $rs->Cerrar();
879    }
880);
881
882/**
883 * @brief    List all images defined in an OU
884 * @note     Route: /ous/id/images, Method: GET
885 * @param    id      OU id.
886 * @return   JSON array of all UO's image data
887 */
888$app->get('/ous/:ouid/images(/)', 'validateApiKey',
889    function($ouid) {
890        global $userid;
891        global $cmd;
892
893        $ouid = htmlspecialchars($ouid);
894        // Database query.
895        $cmd->texto = <<<EOD
896SELECT adm.idadministradorcentro, adm.idcentro AS ouid, imagenes.*
897  FROM imagenes
898 RIGHT JOIN administradores_centros AS adm USING(idcentro)
899 WHERE adm.idadministradorcentro = '$userid'
900   AND adm.idcentro='$ouid';
901EOD;
902        $rs=new Recordset;
903        $rs->Comando=&$cmd;
904        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
905        $rs->Primero();
906        // Check if user is an UO admin.
907        if (checkAdmin($rs->campos["idadministradorcentro"]) and checkParameter($rs->campos["ouid"])) {
908                $response = Array();
909                while (!$rs->EOF) {
910                        if (! is_null($rs->campos["idcentro"])) {
911                                $tmp = Array();
912                                $tmp['id'] = (int)$rs->campos["idimagen"];
913                                $tmp['name'] = $rs->campos["nombreca"];
914                                $tmp['inremotepc'] = $rs->campos["inremotepc"]==0 ? false: true;
915                                $tmp['ou']['id'] = (int)$ouid;
916                                array_push($response, $tmp);
917                        }
918                        $rs->Siguiente();
919                }
920                jsonResponse(200, $response);
921        }
922    }
923);
924
925/**
926 * @brief    Get image data
927 * @note     Route: /ous/id1/images/id2, Method: GET
928 * @param    id1     OU id.
929 * @param    id2     image id.
930 * @return   JSON string with image parameters
931 */
932$app->get('/ous/:ouid/images/:imgid(/)', 'validateApiKey',
933    function($ouid, $imgid) {
934        global $userid;
935        global $cmd;
936
937        $ouid = htmlspecialchars($ouid);
938        $imgid = htmlspecialchars($imgid);
939        // Database query.
940        $cmd->texto = <<<EOD
941SELECT adm.idadministradorcentro, imagenes.*, nombreso AS os
942  FROM imagenes
943 RIGHT JOIN administradores_centros AS adm USING(idcentro)
944  LEFT JOIN perfilessoft USING(idperfilsoft)
945  LEFT JOIN nombresos USING(idnombreso)
946 WHERE adm.idadministradorcentro = '$userid'
947   AND adm.idcentro='$ouid'
948   AND idimagen='$imgid';
949EOD;
950        $rs=new Recordset;
951        $rs->Comando=&$cmd;
952        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
953        $rs->Primero();
954        // Check if user is an UO admin and repo exists.
955        if (checkAdmin($rs->campos["idadministradorcentro"]) and checkParameter($rs->campos["idimagen"])) {
956                // Read data.
957                $response['id'] = (int)$rs->campos["idimagen"];
958                $response['name'] = $rs->campos["nombreca"];
959                $response['description'] = $rs->campos["descripcion"];
960                $response['comments'] = $rs->campos["comentarios"];
961                $response['inremotepc'] = $rs->campos["inremotepc"]==0 ? false: true;
962                $response['repo']['id'] = (int)$rs->campos["idrepositorio"];
963                switch ($rs->campos["tipo"]) {
964                        // Image type.
965                        case 1:  $response['type'] = "monolithic"; break;
966                        case 2:  $response['type'] = "base"; break;
967                        case 3:  $response['type'] = "incremental";
968                                 $response['baseimg'] = $rs->campos["imagenid"];
969                                 $response['path'] = $rs->campos["ruta"];
970                                 break;
971                        default: $response['type'] = $rs->campos["tipo"];
972                }
973                if ($rs->campos["idordenador"] != 0) {
974                        // Source client data.
975                        $response['client']['id'] = (int)$rs->campos["idordenador"];
976                        $response['client']['disk'] = (int)$rs->campos["numdisk"];
977                        $response['client']['partition'] = (int)$rs->campos["numpar"];
978                        $response['creationdate'] = $rs->campos["fechacreacion"];
979                        $response['release'] = (int)$rs->campos["revision"];
980                        $response['os'] = $rs->campos["os"];
981                }
982                jsonResponse(200, $response);
983        }
984        $rs->Cerrar();
985    }
986);
987
988// Lista de softeare instalado en una imagen.
989$app->get('/ous/:ouid/images/:imgid/software(/)', 'validateApiKey',
990    function($ouid, $imgid) {
991        global $userid;
992        global $cmd;
993
994        $ouid = htmlspecialchars($ouid);
995        $imgid = htmlspecialchars($imgid);
996        // Database query.
997        $cmd->texto = <<<EOD
998SELECT adm.idadministradorcentro, imagenes.idimagen, imagenes.nombreca,
999       nombresos.nombreso, softwares.descripcion
1000  FROM imagenes
1001 RIGHT JOIN administradores_centros AS adm USING(idcentro)
1002  LEFT JOIN perfilessoft USING(idperfilsoft)
1003  LEFT JOIN nombresos USING(idnombreso)
1004  LEFT JOIN perfilessoft_softwares USING(idperfilsoft)
1005  LEFT JOIN softwares USING(idsoftware)
1006 WHERE adm.idadministradorcentro = '$userid'
1007   AND imagenes.idimagen='$imgid'
1008 ORDER BY softwares.descripcion ASC;
1009EOD;
1010        $rs=new Recordset;
1011        $rs->Comando=&$cmd;
1012        if (!$rs->Abrir()) return(false);       // Error oppening recordset.
1013        $rs->Primero();
1014        // Check if user is an UO admin and repo exists.
1015        if (checkAdmin($rs->campos["idadministradorcentro"]) and checkParameter($rs->campos["idimagen"])) {
1016                $response['id'] = (int)$rs->campos["idimagen"];
1017                $response['name'] = $rs->campos["nombreca"];
1018                if (is_null($rs->campos["nombreso"])) {
1019                        // Null object.
1020                        $response['software'] = Array();
1021                        jsonResponse(200, $response, JSON_FORCE_OBJECT);
1022                } else {
1023                        // Read data.
1024                        $response['software']['os'] = $rs->campos["nombreso"];
1025                        //$response['software']['type'] = ...;  // OS type
1026                        $response['software']['applications'] = Array();
1027                        while (!$rs->EOF) {
1028                                // Ignoring empty fields.
1029                                if (!is_null($rs->campos["descripcion"])) {
1030                                        array_push($response['software']['application'], $rs->campos["descripcion"]);
1031                                }
1032                                $rs->Siguiente();
1033                        }
1034                        jsonResponse(200, $response);
1035                }
1036        }
1037        $rs->Cerrar();
1038    }
1039);
1040
1041?>
Note: See TracBrowser for help on using the repository browser.