source: ogServer-Git/src/client.c @ 5a3fd51

Last change on this file since 5a3fd51 was 5a3fd51, checked in by Jose M. Guisado <jguisado@…>, 3 years ago

#1065 client: add support for ogclient linux state

ogClient can be run in linux mode, intended for exposing some
ogServer commands when running in a linux distribution.

When connecting with a client in linux mode, do not expect a full
partition setup response. Just expect a 'status', and then accept
the connection without updating any partition information in
the database.

  • Property mode set to 100644
File size: 18.4 KB
RevLine 
[04ca20e]1/*
[a7cce8d]2 * Copyright (C) 2020-2021 Soleta Networks <info@soleta.eu>
[04ca20e]3 *
4 * This program is free software: you can redistribute it and/or modify it under
5 * the terms of the GNU Affero General Public License as published by the
[a7cce8d]6 * Free Software Foundation; either version 3 of the License, or
7 * (at your option) any later version.
[04ca20e]8 */
9
10#include "ogAdmServer.h"
[fe1ce97]11#include "cfg.h"
[04ca20e]12#include "dbi.h"
13#include "utils.h"
14#include "list.h"
15#include "rest.h"
16#include "json.h"
17#include "schedule.h"
18#include <syslog.h>
19#include <sys/ioctl.h>
20#include <ifaddrs.h>
21#include <sys/types.h>
22#include <sys/stat.h>
23#include <fcntl.h>
24#include <jansson.h>
25#include <time.h>
26
27static int og_resp_probe(struct og_client *cli, json_t *data)
28{
29        const char *status = NULL;
30        const char *key;
[40d4279]31        uint32_t speed;
[04ca20e]32        json_t *value;
33        int err = 0;
34
35        if (json_typeof(data) != JSON_OBJECT)
36                return -1;
37
38        json_object_foreach(data, key, value) {
39                if (!strcmp(key, "status")) {
40                        err = og_json_parse_string(value, &status);
41                        if (err < 0)
42                                return err;
[40d4279]43                } else if (!strcmp(key, "speed")) {
44                        err = og_json_parse_uint(value, &speed);
45                        if (err < 0)
46                                return err;
47                        cli->speed = speed;
[04ca20e]48                }
49        }
50
51        if (!strcmp(status, "BSY"))
52                cli->status = OG_CLIENT_STATUS_BUSY;
53        else if (!strcmp(status, "OPG"))
54                cli->status = OG_CLIENT_STATUS_OGLIVE;
[c0f5d2c]55        else if (!strcmp(status, "VDI"))
56                cli->status = OG_CLIENT_STATUS_VIRTUAL;
[04ca20e]57
58        return status ? 0 : -1;
59}
60
61static int og_resp_shell_run(struct og_client *cli, json_t *data)
62{
63        const char *output = NULL;
64        char filename[4096];
65        const char *key;
66        json_t *value;
67        int err = -1;
68        FILE *file;
69
70        if (json_typeof(data) != JSON_OBJECT)
71                return -1;
72
73        json_object_foreach(data, key, value) {
74                if (!strcmp(key, "out")) {
75                        err = og_json_parse_string(value, &output);
76                        if (err < 0)
77                                return err;
78                }
79        }
80
81        if (!output) {
82                syslog(LOG_ERR, "%s:%d: malformed json response\n",
83                       __FILE__, __LINE__);
84                return -1;
85        }
86
87        sprintf(filename, "/tmp/_Seconsola_%s", inet_ntoa(cli->addr.sin_addr));
88        file = fopen(filename, "wt");
89        if (!file) {
90                syslog(LOG_ERR, "cannot open file %s: %s\n",
91                       filename, strerror(errno));
92                return -1;
93        }
94
95        fprintf(file, "%s", output);
96        fclose(file);
97
98        return 0;
99}
100
101struct og_computer_legacy  {
102        char center[OG_DB_INT_MAXLEN + 1];
103        char id[OG_DB_INT_MAXLEN + 1];
104        char hardware[8192];
105};
106
107static int og_resp_hardware(json_t *data, struct og_client *cli)
108{
109        struct og_computer_legacy legacy = {};
[cbd9421]110        struct og_computer computer = {};
[04ca20e]111        const char *hardware = NULL;
112        struct og_dbi *dbi;
113        const char *key;
114        json_t *value;
115        int err = 0;
116        bool res;
117
118        if (json_typeof(data) != JSON_OBJECT)
119                return -1;
120
121        json_object_foreach(data, key, value) {
122                if (!strcmp(key, "hardware")) {
123                        err = og_json_parse_string(value, &hardware);
124                        if (err < 0)
125                                return -1;
126                }
127        }
128
129        if (!hardware) {
130                syslog(LOG_ERR, "malformed response json\n");
131                return -1;
132        }
133
[fe1ce97]134        dbi = og_dbi_open(&ogconfig.db);
[04ca20e]135        if (!dbi) {
136                syslog(LOG_ERR, "cannot open connection database (%s:%d)\n",
137                       __func__, __LINE__);
138                return -1;
139        }
140
[d7e2022]141        err = og_dbi_get_computer_info(dbi, &computer, cli->addr.sin_addr);
142        if (err < 0) {
143                og_dbi_close(dbi);
144                return -1;
145        }
146
147        snprintf(legacy.center, sizeof(legacy.center), "%d", computer.center);
148        snprintf(legacy.id, sizeof(legacy.id), "%d", computer.id);
149        snprintf(legacy.hardware, sizeof(legacy.hardware), "%s", hardware);
150
[04ca20e]151        res = actualizaHardware(dbi, legacy.hardware, legacy.id, computer.name,
152                                legacy.center);
153        og_dbi_close(dbi);
154
155        if (!res) {
156                syslog(LOG_ERR, "Problem updating client configuration\n");
157                return -1;
158        }
159
160        return 0;
161}
162
163struct og_software_legacy {
164        char software[8192];
165        char center[OG_DB_INT_MAXLEN + 1];
166        char part[OG_DB_SMALLINT_MAXLEN + 1];
167        char id[OG_DB_INT_MAXLEN + 1];
168};
169
170static int og_resp_software(json_t *data, struct og_client *cli)
171{
172        struct og_software_legacy legacy = {};
[cbd9421]173        struct og_computer computer = {};
[04ca20e]174        const char *partition = NULL;
175        const char *software = NULL;
176        struct og_dbi *dbi;
177        const char *key;
178        json_t *value;
179        int err = 0;
180        bool res;
181
182        if (json_typeof(data) != JSON_OBJECT)
183                return -1;
184
185        json_object_foreach(data, key, value) {
186                if (!strcmp(key, "software"))
187                        err = og_json_parse_string(value, &software);
188                else if (!strcmp(key, "partition"))
189                        err = og_json_parse_string(value, &partition);
190
191                if (err < 0)
192                        return -1;
193        }
194
195        if (!software || !partition) {
196                syslog(LOG_ERR, "malformed response json\n");
197                return -1;
198        }
199
[fe1ce97]200        dbi = og_dbi_open(&ogconfig.db);
[04ca20e]201        if (!dbi) {
202                syslog(LOG_ERR, "cannot open connection database (%s:%d)\n",
203                       __func__, __LINE__);
204                return -1;
205        }
206
[d7e2022]207        err = og_dbi_get_computer_info(dbi, &computer, cli->addr.sin_addr);
208        if (err < 0) {
209                og_dbi_close(dbi);
210                return -1;
211        }
212
213        snprintf(legacy.software, sizeof(legacy.software), "%s", software);
214        snprintf(legacy.part, sizeof(legacy.part), "%s", partition);
215        snprintf(legacy.id, sizeof(legacy.id), "%d", computer.id);
216        snprintf(legacy.center, sizeof(legacy.center), "%d", computer.center);
217
[04ca20e]218        res = actualizaSoftware(dbi, legacy.software, legacy.part, legacy.id,
219                                computer.name, legacy.center);
220        og_dbi_close(dbi);
221
222        if (!res) {
223                syslog(LOG_ERR, "Problem updating client configuration\n");
224                return -1;
225        }
226
227        return 0;
228}
229
230#define OG_PARAMS_RESP_REFRESH  (OG_PARAM_PART_DISK |           \
231                                 OG_PARAM_PART_NUMBER |         \
232                                 OG_PARAM_PART_CODE |           \
233                                 OG_PARAM_PART_FILESYSTEM |     \
234                                 OG_PARAM_PART_OS |             \
235                                 OG_PARAM_PART_SIZE |           \
236                                 OG_PARAM_PART_USED_SIZE)
237
238static int og_json_parse_partition_array(json_t *value,
239                                         struct og_partition *partitions)
240{
241        json_t *element;
242        int i, err;
243
244        if (json_typeof(value) != JSON_ARRAY)
245                return -1;
246
247        for (i = 0; i < json_array_size(value) && i < OG_PARTITION_MAX; i++) {
248                element = json_array_get(value, i);
249
250                err = og_json_parse_partition(element, &partitions[i],
251                                              OG_PARAMS_RESP_REFRESH);
252                if (err < 0)
253                        return err;
254        }
255
256        return 0;
257}
258
259static int og_dbi_queue_autorun(uint32_t computer_id, uint32_t proc_id)
260{
261        struct og_task dummy_task = {
262                .scope          = computer_id,
263                .type_scope     = AMBITO_ORDENADORES,
264                .procedure_id   = proc_id,
265        };
266        struct og_dbi *dbi;
267
[fe1ce97]268        dbi = og_dbi_open(&ogconfig.db);
[04ca20e]269        if (!dbi) {
270                syslog(LOG_ERR, "cannot open connection database "
271                                "(%s:%d)\n", __func__, __LINE__);
272                return -1;
273        }
274        if (og_dbi_queue_procedure(dbi, &dummy_task)) {
275                og_dbi_close(dbi);
276                return -1;
277        }
278        og_dbi_close(dbi);
279
280        return 0;
281}
282
283static int og_resp_refresh(json_t *data, struct og_client *cli)
284{
285        struct og_partition partitions[OG_PARTITION_MAX] = {};
[24e6fbf]286        struct og_partition disks[OG_DISK_MAX] = {};
[04ca20e]287        const char *serial_number = NULL;
288        struct og_computer computer = {};
[5a3fd51]289        const char *status = NULL;
[24e6fbf]290        char cfg[4096] = {};
[04ca20e]291        struct og_dbi *dbi;
292        const char *key;
293        unsigned int i;
294        json_t *value;
295        int err = 0;
296        bool res;
297
298        if (json_typeof(data) != JSON_OBJECT)
299                return -1;
300
301        json_object_foreach(data, key, value) {
302                if (!strcmp(key, "disk_setup")) {
[24e6fbf]303                        err = og_json_parse_partition_array(value, disks);
[04ca20e]304                } else if (!strcmp(key, "partition_setup")) {
305                        err = og_json_parse_partition_array(value, partitions);
306                } else if (!strcmp(key, "serial_number")) {
307                        err = og_json_parse_string(value, &serial_number);
[5a3fd51]308                } else if (!strcmp(key, "status")) {
309                        err = og_json_parse_string(value, &status);
[04ca20e]310                }
311
312                if (err < 0)
313                        return err;
314        }
315
[5a3fd51]316        if (status && !strncmp(status, "LINUX", strlen("LINUX"))) {
317                cli->status = OG_CLIENT_STATUS_LINUX;
318                return 0;
319        }
320
[04ca20e]321        if (strlen(serial_number) > 0)
322                snprintf(cfg, sizeof(cfg), "ser=%s\n", serial_number);
323
[24e6fbf]324        for (i = 0; i < OG_DISK_MAX; i++) {
325                if (!disks[i].disk || !disks[i].number ||
326                    !disks[i].code || !disks[i].filesystem ||
327                    !disks[i].os || !disks[i].size ||
328                    !disks[i].used_size)
329                        continue;
330
331                snprintf(cfg + strlen(cfg), sizeof(cfg) - strlen(cfg),
[12d8fff]332                         "disk=%s\tpar=%s\tcpt=%s\tfsi=%s\tsoi=%s\ttam=%s\tuso=%s\tdtype=%s\n",
[24e6fbf]333                         disks[i].disk, disks[i].number,
334                         disks[i].code, disks[i].filesystem,
335                         disks[i].os, disks[i].size,
[12d8fff]336                         disks[i].used_size, disks[i].disk_type);
[24e6fbf]337        }
[04ca20e]338
339        for (i = 0; i < OG_PARTITION_MAX; i++) {
340                if (!partitions[i].disk || !partitions[i].number ||
341                    !partitions[i].code || !partitions[i].filesystem ||
342                    !partitions[i].os || !partitions[i].size ||
343                    !partitions[i].used_size)
344                        continue;
345
346                snprintf(cfg + strlen(cfg), sizeof(cfg) - strlen(cfg),
347                         "disk=%s\tpar=%s\tcpt=%s\tfsi=%s\tsoi=%s\ttam=%s\tuso=%s\n",
348                         partitions[i].disk, partitions[i].number,
349                         partitions[i].code, partitions[i].filesystem,
350                         partitions[i].os, partitions[i].size,
351                         partitions[i].used_size);
352        }
353
[fe1ce97]354        dbi = og_dbi_open(&ogconfig.db);
[04ca20e]355        if (!dbi) {
356                syslog(LOG_ERR, "cannot open connection database (%s:%d)\n",
357                                  __func__, __LINE__);
358                return -1;
359        }
[d7e2022]360
361        err = og_dbi_get_computer_info(dbi, &computer, cli->addr.sin_addr);
362        if (err < 0) {
363                og_dbi_close(dbi);
364                return -1;
365        }
366
[04ca20e]367        res = actualizaConfiguracion(dbi, cfg, computer.id);
368        og_dbi_close(dbi);
369
370        if (!res) {
371                syslog(LOG_ERR, "Problem updating client configuration\n");
372                return -1;
373        }
374
375        if (!cli->autorun && computer.procedure_id) {
376                cli->autorun = true;
377
[f537daf]378                if (og_dbi_queue_autorun(computer.id, computer.procedure_id))
[04ca20e]379                        return -1;
380        }
381
382        return 0;
383}
384
[0efc182]385static int update_image_info(struct og_dbi *dbi, const char *image_id,
386                             const char *clonator, const char *compressor,
387                             const char *filesystem, const uint64_t datasize)
388{
389        const char *msglog;
390        dbi_result result;
391
392        result = dbi_conn_queryf(dbi->conn,
393                "UPDATE imagenes"
394                "   SET clonator='%s', compressor='%s',"
[a67f27a]395                "       filesystem='%s', datasize=%lld"
[0efc182]396                " WHERE idimagen=%s", clonator, compressor, filesystem,
397                datasize, image_id);
398
399        if (!result) {
400                dbi_conn_error(dbi->conn, &msglog);
401                syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
402                       __func__, __LINE__, msglog);
403                return -1;
404        }
405        dbi_result_free(result);
406
407        return 0;
408}
409
[04ca20e]410static int og_resp_image_create(json_t *data, struct og_client *cli)
411{
412        struct og_software_legacy soft_legacy;
413        struct og_image_legacy img_legacy;
[cbd9421]414        struct og_computer computer = {};
[0efc182]415        const char *compressor = NULL;
416        const char *filesystem = NULL;
[04ca20e]417        const char *partition = NULL;
418        const char *software = NULL;
419        const char *image_id = NULL;
[0efc182]420        const char *clonator = NULL;
[04ca20e]421        const char *disk = NULL;
422        const char *code = NULL;
423        const char *name = NULL;
424        const char *repo = NULL;
[0efc182]425        uint64_t datasize = 0;
[04ca20e]426        struct og_dbi *dbi;
427        const char *key;
428        json_t *value;
429        int err = 0;
430        bool res;
431
432        if (json_typeof(data) != JSON_OBJECT)
433                return -1;
434
435        json_object_foreach(data, key, value) {
436                if (!strcmp(key, "software"))
437                        err = og_json_parse_string(value, &software);
438                else if (!strcmp(key, "partition"))
439                        err = og_json_parse_string(value, &partition);
440                else if (!strcmp(key, "disk"))
441                        err = og_json_parse_string(value, &disk);
442                else if (!strcmp(key, "code"))
443                        err = og_json_parse_string(value, &code);
444                else if (!strcmp(key, "id"))
445                        err = og_json_parse_string(value, &image_id);
446                else if (!strcmp(key, "name"))
447                        err = og_json_parse_string(value, &name);
448                else if (!strcmp(key, "repository"))
449                        err = og_json_parse_string(value, &repo);
[0efc182]450                else if (!strcmp(key, "clonator"))
451                        err = og_json_parse_string(value, &clonator);
452                else if (!strcmp(key, "compressor"))
453                        err = og_json_parse_string(value, &compressor);
454                else if (!strcmp(key, "filesystem"))
455                        err = og_json_parse_string(value, &filesystem);
456                else if (!strcmp(key, "datasize"))
457                        err = og_json_parse_uint64(value, &datasize);
[04ca20e]458
459                if (err < 0)
460                        return err;
461        }
462
463        if (!software || !partition || !disk || !code || !image_id || !name ||
[0efc182]464            !repo || !clonator || !compressor || !filesystem || !datasize) {
[04ca20e]465                syslog(LOG_ERR, "malformed response json\n");
466                return -1;
467        }
468
[fe1ce97]469        dbi = og_dbi_open(&ogconfig.db);
[d7e2022]470        if (!dbi) {
471                syslog(LOG_ERR, "cannot open connection database (%s:%d)\n",
472                       __func__, __LINE__);
473                return -1;
474        }
475
476        err = og_dbi_get_computer_info(dbi, &computer, cli->addr.sin_addr);
477        if (err < 0) {
478                og_dbi_close(dbi);
[04ca20e]479                return -1;
[d7e2022]480        }
[04ca20e]481
482        snprintf(soft_legacy.center, sizeof(soft_legacy.center), "%d",
483                 computer.center);
484        snprintf(soft_legacy.software, sizeof(soft_legacy.software), "%s",
485                 software);
486        snprintf(img_legacy.image_id, sizeof(img_legacy.image_id), "%s",
487                 image_id);
488        snprintf(soft_legacy.id, sizeof(soft_legacy.id), "%d", computer.id);
489        snprintf(img_legacy.part, sizeof(img_legacy.part), "%s", partition);
490        snprintf(img_legacy.disk, sizeof(img_legacy.disk), "%s", disk);
491        snprintf(img_legacy.code, sizeof(img_legacy.code), "%s", code);
492        snprintf(img_legacy.name, sizeof(img_legacy.name), "%s", name);
493        snprintf(img_legacy.repo, sizeof(img_legacy.repo), "%s", repo);
494
495        res = actualizaSoftware(dbi,
496                                soft_legacy.software,
497                                img_legacy.part,
498                                soft_legacy.id,
499                                computer.name,
500                                soft_legacy.center);
501        if (!res) {
502                og_dbi_close(dbi);
503                syslog(LOG_ERR, "Problem updating client configuration\n");
504                return -1;
505        }
506
507        res = actualizaCreacionImagen(dbi,
508                                      img_legacy.image_id,
509                                      img_legacy.disk,
510                                      img_legacy.part,
511                                      img_legacy.code,
512                                      img_legacy.repo,
513                                      soft_legacy.id);
514        if (!res) {
[0efc182]515                og_dbi_close(dbi);
[04ca20e]516                syslog(LOG_ERR, "Problem updating client configuration\n");
517                return -1;
518        }
519
[0efc182]520        res = update_image_info(dbi, image_id, clonator, compressor,
521                                filesystem, datasize);
522        og_dbi_close(dbi);
523
524        if (res) {
525                syslog(LOG_ERR, "Problem updating image info\n");
526                return -1;
527        }
528
[04ca20e]529        return 0;
530}
531
532static int og_resp_image_restore(json_t *data, struct og_client *cli)
533{
534        struct og_software_legacy soft_legacy;
535        struct og_image_legacy img_legacy;
[cbd9421]536        struct og_computer computer = {};
[04ca20e]537        const char *partition = NULL;
538        const char *image_id = NULL;
539        const char *disk = NULL;
540        dbi_result query_result;
541        struct og_dbi *dbi;
542        const char *key;
543        json_t *value;
544        int err = 0;
545        bool res;
546
547        if (json_typeof(data) != JSON_OBJECT)
548                return -1;
549
550        json_object_foreach(data, key, value) {
551                if (!strcmp(key, "partition"))
552                        err = og_json_parse_string(value, &partition);
553                else if (!strcmp(key, "disk"))
554                        err = og_json_parse_string(value, &disk);
555                else if (!strcmp(key, "image_id"))
556                        err = og_json_parse_string(value, &image_id);
557
558                if (err < 0)
559                        return err;
560        }
561
562        if (!partition || !disk || !image_id) {
563                syslog(LOG_ERR, "malformed response json\n");
564                return -1;
565        }
566
[fe1ce97]567        dbi = og_dbi_open(&ogconfig.db);
[04ca20e]568        if (!dbi) {
569                syslog(LOG_ERR, "cannot open connection database (%s:%d)\n",
570                       __func__, __LINE__);
571                return -1;
572        }
573
574        query_result = dbi_conn_queryf(dbi->conn,
575                                       "SELECT idperfilsoft FROM imagenes "
576                                       " WHERE idimagen='%s'",
577                                       image_id);
578        if (!query_result) {
579                og_dbi_close(dbi);
580                syslog(LOG_ERR, "failed to query database\n");
581                return -1;
582        }
583        if (!dbi_result_next_row(query_result)) {
584                dbi_result_free(query_result);
585                og_dbi_close(dbi);
586                syslog(LOG_ERR, "software profile does not exist in database\n");
587                return -1;
588        }
589        snprintf(img_legacy.software_id, sizeof(img_legacy.software_id),
590                 "%d", dbi_result_get_uint(query_result, "idperfilsoft"));
591        dbi_result_free(query_result);
592
[d7e2022]593        err = og_dbi_get_computer_info(dbi, &computer, cli->addr.sin_addr);
594        if (err < 0) {
595                og_dbi_close(dbi);
596                return -1;
597        }
598
599        snprintf(img_legacy.image_id, sizeof(img_legacy.image_id), "%s",
600                 image_id);
601        snprintf(img_legacy.part, sizeof(img_legacy.part), "%s", partition);
602        snprintf(img_legacy.disk, sizeof(img_legacy.disk), "%s", disk);
603        snprintf(soft_legacy.id, sizeof(soft_legacy.id), "%d", computer.id);
604
[04ca20e]605        res = actualizaRestauracionImagen(dbi,
606                                          img_legacy.image_id,
607                                          img_legacy.disk,
608                                          img_legacy.part,
609                                          soft_legacy.id,
610                                          img_legacy.software_id);
611        og_dbi_close(dbi);
612
613        if (!res) {
614                syslog(LOG_ERR, "Problem updating client configuration\n");
615                return -1;
616        }
617
618        return 0;
619}
620
[ac3ce22]621static int og_agent_http_response_code(const char *buf)
622{
623        if (!strncmp(buf, "HTTP/1.0 200 OK", strlen("HTTP/1.0 200 OK"))) {
624                return 200;
625        } else if (!strncmp(buf, "HTTP/1.0 202 Accepted",
626                            strlen("HTTP/1.0 202 Accepted"))) {
627                return 202;
628        } else if (!strncmp(buf, "HTTP/1.0 400 Bad Request",
629                            strlen("HTTP/1.0 400 Bad Request"))) {
630                return 400;
631        } else if (!strncmp(buf, "HTTP/1.0 500 Internal Server Error",
632                            strlen("HTTP/1.0 500 Internal Server Error"))) {
633                return 500;
634        } else if (!strncmp(buf, "HTTP/1.0 503 Service Unavailable",
635                            strlen("HTTP/1.0 503 Service Unavailable"))) {
636                return 503;
637        }
638
639        return -1;
640}
641
[04ca20e]642int og_agent_state_process_response(struct og_client *cli)
643{
[ac3ce22]644        int ret, err = -1, code;
[04ca20e]645        json_error_t json_err;
[ac3ce22]646        bool success;
[04ca20e]647        json_t *root;
648        char *body;
649
[ac3ce22]650        code = og_agent_http_response_code(cli->buf);
651        switch (code) {
652        case 200:
653                ret = 0;
654                success = true;
655                break;
656        case 202:
657                ret = 1;
658                success = true;
659                break;
660        case 400:
661                ret = -1;
662                success = false;
663                syslog(LOG_ERR, "Client %s:%hu reports malformed HTTP request from server\n",
664                       inet_ntoa(cli->addr.sin_addr), ntohs(cli->addr.sin_port));
665                break;
666        case 500:
667                ret = 0;
668                success = false;
669                cli->last_cmd = OG_CMD_UNSPEC;
670                syslog(LOG_ERR, "Client %s:%hu reports failure to process command\n",
671                       inet_ntoa(cli->addr.sin_addr), ntohs(cli->addr.sin_port));
672                /* ... cancel pending actions related to this task for this client here */
673                break;
674        case 503:
675                ret = 1;
676                success = false;
677                syslog(LOG_ERR, "Client %s:%hu is busy to process command\n",
678                       inet_ntoa(cli->addr.sin_addr), ntohs(cli->addr.sin_port));
679                break;
680        default:
681                ret = -1;
682                success = false;
683                syslog(LOG_ERR, "Client %s:%hu reports unknown HTTP response code\n",
684                       inet_ntoa(cli->addr.sin_addr), ntohs(cli->addr.sin_port));
685                break;
[04ca20e]686        }
687
[ac3ce22]688        if (code != 200) {
689                og_dbi_update_action(cli->last_cmd_id, success);
[04ca20e]690                cli->last_cmd_id = 0;
[ac3ce22]691                return ret;
[04ca20e]692        }
693
694        if (!cli->content_length) {
[ac3ce22]695                og_dbi_update_action(cli->last_cmd_id, true);
696                cli->last_cmd_id = 0;
[04ca20e]697                cli->last_cmd = OG_CMD_UNSPEC;
698                return 0;
699        }
700
701        body = strstr(cli->buf, "\r\n\r\n") + 4;
702
703        root = json_loads(body, 0, &json_err);
704        if (!root) {
705                syslog(LOG_ERR, "%s:%d: malformed json line %d: %s\n",
706                       __FILE__, __LINE__, json_err.line, json_err.text);
707                return -1;
708        }
709
710        switch (cli->last_cmd) {
711        case OG_CMD_PROBE:
712                err = og_resp_probe(cli, root);
713                break;
714        case OG_CMD_SHELL_RUN:
715                err = og_resp_shell_run(cli, root);
716                break;
717        case OG_CMD_HARDWARE:
718                err = og_resp_hardware(root, cli);
719                break;
720        case OG_CMD_SOFTWARE:
721                err = og_resp_software(root, cli);
722                break;
723        case OG_CMD_REFRESH:
724                err = og_resp_refresh(root, cli);
725                break;
726        case OG_CMD_SETUP:
727                err = og_resp_refresh(root, cli);
728                break;
729        case OG_CMD_IMAGE_CREATE:
730                err = og_resp_image_create(root, cli);
731                break;
732        case OG_CMD_IMAGE_RESTORE:
733                err = og_resp_image_restore(root, cli);
734                break;
735        default:
736                err = -1;
737                break;
738        }
739
[0d9d72e]740        json_decref(root);
[ac3ce22]741
742        if (err < 0) {
743                err = 0;
744                success = false;
745                /* ... cancel pending actions related to this task for this client here */
746        }
747
748        og_dbi_update_action(cli->last_cmd_id, success);
749        cli->last_cmd_id = 0;
[04ca20e]750        cli->last_cmd = OG_CMD_UNSPEC;
751
752        return err;
753}
Note: See TracBrowser for help on using the repository browser.