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

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-instalacion
Last change on this file since e3b1b1e was 60ea634, checked in by Ramón M. Gómez <ramongomez@…>, 6 years ago

#875: Remove unused field from repositories table and update list of closed tickets.

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