annotate page-api-jobs.c @ 8:ec800a5fb7e3

scid: advertise -s option
author David Demelier <markand@malikania.fr>
date Wed, 23 Jun 2021 11:45:07 +0200
parents 215c0c3b3609
children eb76429ce112
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 #include <sys/types.h>
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 #include <assert.h>
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 #include <stdarg.h>
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 #include <stdint.h>
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 #include <string.h>
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
6
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 #include <kcgi.h>
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 #include <jansson.h>
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
9
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 #include "config.h"
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 #include "log.h"
3
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
12 #include "page-api-jobs.h"
2
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 #include "page.h"
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 #include "req.h"
3
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
15 #include "types.h"
2
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 #include "util.h"
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
17
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
18 static void
3
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
19 list(struct kreq *r, const struct job *jobs, size_t jobsz)
2
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 {
3
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
21 json_t *doc;
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
22 char *dump;
2
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
23
3
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
24 doc = job_to(jobs, jobsz);
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
25 dump = json_dumps(doc, JSON_COMPACT);
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
26
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
27 khttp_puts(r, dump);
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
28 free(dump);
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
29 json_decref(doc);
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
30 }
2
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
31
3
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
32 static int
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
33 save(const char *json)
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
34 {
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
35 struct req req = {0};
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
36 struct jobresult res = {0};
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
37 int ret = -1;
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
38
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
39 json_t *doc;
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
40 json_error_t err;
2
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
41
3
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
42 if (!(doc = json_loads(json, 0, &err)))
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
43 log_warn("api/post: invalid JSON input: %s", err.text);
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
44 else if (jobresult_from(&res, 1, doc) < 0)
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
45 log_warn("api/post: failed to decode parameters");
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
46 else if ((req = req_jobresult_add(&res)).status)
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
47 log_warn("api/post: save error: %s", strerror(req.status));
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
48 else
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
49 ret = 0;
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
50
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
51 json_decref(doc);
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
52 req_finish(&req);
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
53
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
54 return ret;
2
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 }
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
56
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 static void
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 get(struct kreq *r)
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 {
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 struct req req;
3
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
61 struct job jobs[SCI_JOB_LIST_MAX];
2
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 size_t jobsz = UTIL_SIZE(jobs);
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 const char *worker = util_basename(r->path);
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
64
3
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
65 if ((req = req_job_todo(jobs, &jobsz, worker)).status)
2
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 page(r, NULL, KHTTP_500, KMIME_APP_JSON, NULL);
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 else {
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 khttp_head(r, kresps[KRESP_CONTENT_TYPE], "%s", kmimetypes[KMIME_APP_JSON]);
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 khttp_head(r, kresps[KRESP_STATUS], "%s", khttps[KHTTP_200]);
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 khttp_body(r);
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 list(r, jobs, jobsz);
3
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
72 req_finish(&req);
2
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 khttp_free(r);
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 }
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 }
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
76
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 static void
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 post(struct kreq *r)
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 {
3
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
80 if (r->fieldsz < 1)
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
81 page(r, NULL, KHTTP_400, KMIME_APP_JSON, NULL);
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
82 else if (save(r->fields[0].key) < 0)
2
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 page(r, NULL, KHTTP_500, KMIME_APP_JSON, NULL);
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 else {
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 khttp_head(r, kresps[KRESP_CONTENT_TYPE], "%s", kmimetypes[KMIME_APP_JSON]);
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 khttp_head(r, kresps[KRESP_STATUS], "%s", khttps[KHTTP_200]);
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 khttp_body(r);
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 khttp_free(r);
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 }
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 }
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
91
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 void
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 page_api_v1_jobs(struct kreq *r)
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 {
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 assert(r);
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
96
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 switch (r->method) {
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 case KMETHOD_GET:
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 get(r);
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 break;
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 case KMETHOD_POST:
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 post(r);
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 break;
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 default:
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 page(r, NULL, KHTTP_400, KMIME_APP_JSON, NULL);
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 break;
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 }
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 }