Mercurial > sci
annotate page-api-jobs.c @ 10:eb76429ce112
sciworkerd: improve process destruction
author | David Demelier <markand@malikania.fr> |
---|---|
date | Tue, 29 Jun 2021 20:40:17 +0200 |
parents | 215c0c3b3609 |
children | 3051ef92173a |
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); |
10
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
82 else if (save(r->fields[0].val) < 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 } |