Mercurial > sci
annotate sciworkerd/main.c @ 18:600204c31bf0
misc: refactor
author | David Demelier <markand@malikania.fr> |
---|---|
date | Tue, 12 Jul 2022 20:20:51 +0200 |
parents | sciworkerd.c@40fe70256fb0 |
children | de4bf839b565 |
rev | line source |
---|---|
16
3051ef92173a
misc: add license headers
David Demelier <markand@malikania.fr>
parents:
10
diff
changeset
|
1 /* |
3051ef92173a
misc: add license headers
David Demelier <markand@malikania.fr>
parents:
10
diff
changeset
|
2 * sciworkerd.c -- main sciworkerd(8) program file |
3051ef92173a
misc: add license headers
David Demelier <markand@malikania.fr>
parents:
10
diff
changeset
|
3 * |
3051ef92173a
misc: add license headers
David Demelier <markand@malikania.fr>
parents:
10
diff
changeset
|
4 * Copyright (c) 2021 David Demelier <markand@malikania.fr> |
3051ef92173a
misc: add license headers
David Demelier <markand@malikania.fr>
parents:
10
diff
changeset
|
5 * |
3051ef92173a
misc: add license headers
David Demelier <markand@malikania.fr>
parents:
10
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
3051ef92173a
misc: add license headers
David Demelier <markand@malikania.fr>
parents:
10
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
3051ef92173a
misc: add license headers
David Demelier <markand@malikania.fr>
parents:
10
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
3051ef92173a
misc: add license headers
David Demelier <markand@malikania.fr>
parents:
10
diff
changeset
|
9 * |
3051ef92173a
misc: add license headers
David Demelier <markand@malikania.fr>
parents:
10
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
3051ef92173a
misc: add license headers
David Demelier <markand@malikania.fr>
parents:
10
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
3051ef92173a
misc: add license headers
David Demelier <markand@malikania.fr>
parents:
10
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
3051ef92173a
misc: add license headers
David Demelier <markand@malikania.fr>
parents:
10
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
3051ef92173a
misc: add license headers
David Demelier <markand@malikania.fr>
parents:
10
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
3051ef92173a
misc: add license headers
David Demelier <markand@malikania.fr>
parents:
10
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
3051ef92173a
misc: add license headers
David Demelier <markand@malikania.fr>
parents:
10
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
3051ef92173a
misc: add license headers
David Demelier <markand@malikania.fr>
parents:
10
diff
changeset
|
17 */ |
3051ef92173a
misc: add license headers
David Demelier <markand@malikania.fr>
parents:
10
diff
changeset
|
18 |
18 | 19 #if 0 |
20 | |
0 | 21 #include <sys/queue.h> |
17
40fe70256fb0
sciworkerd: fix fchmod declaration
David Demelier <markand@malikania.fr>
parents:
16
diff
changeset
|
22 #include <sys/stat.h> |
0 | 23 #include <sys/types.h> |
24 #include <sys/wait.h> | |
25 #include <assert.h> | |
26 #include <err.h> | |
27 #include <errno.h> | |
28 #include <fcntl.h> | |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
29 #include <limits.h> |
0 | 30 #include <poll.h> |
31 #include <signal.h> | |
32 #include <stdio.h> | |
33 #include <stdlib.h> | |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
34 #include <stdnoreturn.h> |
0 | 35 #include <string.h> |
36 #include <unistd.h> | |
37 | |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
38 #include <curl/curl.h> |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
39 #include <jansson.h> |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
40 |
0 | 41 #include "config.h" |
42 #include "log.h" | |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
43 #include "types.h" |
0 | 44 #include "util.h" |
45 | |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
46 #define TAG_MAX 256 |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
47 |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
48 struct task { |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
49 enum taskst status; |
0 | 50 pid_t child; |
51 int pipe[2]; | |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
52 int exitcode; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
53 int job_id; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
54 int project_id; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
55 char job_tag[TAG_MAX]; |
1
5afdb14df924
sci: add support for storing results
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
56 char out[SCI_CONSOLE_MAX]; |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
57 char script[PATH_MAX]; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
58 int scriptfd; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
59 TAILQ_ENTRY(task) link; |
0 | 60 }; |
61 | |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
62 TAILQ_HEAD(tasks, task); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
63 |
0 | 64 struct fds { |
65 struct pollfd *list; | |
66 size_t listsz; | |
67 }; | |
68 | |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
69 struct fetch { |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
70 char buf[SCI_MSG_MAX]; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
71 FILE *bufp; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
72 }; |
0 | 73 |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
74 static struct { |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
75 char *url; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
76 char *worker; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
77 int maxbuilds; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
78 } config = { |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
79 .url = "http://localhost", |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
80 .worker = "default", |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
81 .maxbuilds = 4 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
82 }; |
0 | 83 |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
84 static struct tasks tasks = TAILQ_HEAD_INITIALIZER(tasks); |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
85 static struct worker worker; |
10
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
86 static int alive = 1; |
0 | 87 |
18 | 88 /* |
89 * Show usage and exit with code 1. | |
90 */ | |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
91 noreturn static void |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
92 usage(void) |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
93 { |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
94 fprintf(stderr, "usage: %s [-m maxbuild] [-u url] [-w worker]\n", getprogname()); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
95 exit(1); |
0 | 96 } |
97 | |
18 | 98 /* |
99 * Find a task by its id. | |
100 */ | |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
101 static inline struct task * |
0 | 102 find_by_fd(int fd) |
103 { | |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
104 struct task *tk; |
0 | 105 |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
106 TAILQ_FOREACH(tk, &tasks, link) |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
107 if (tk->pipe[0] == fd) |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
108 return tk; |
0 | 109 |
110 return NULL; | |
111 } | |
112 | |
18 | 113 /* |
114 * Find a task by its pid number. | |
115 */ | |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
116 static inline struct task * |
0 | 117 find_by_pid(pid_t pid) |
118 { | |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
119 struct task *t; |
0 | 120 |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
121 TAILQ_FOREACH(t, &tasks, link) |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
122 if (t->child == pid) |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
123 return t; |
0 | 124 |
125 return NULL; | |
126 } | |
127 | |
18 | 128 /* |
129 * Destroy a task entirely. | |
130 */ | |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
131 static void |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
132 destroy(struct task *tk) |
0 | 133 { |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
134 log_debug("destroying task %d", tk->job_id); |
10
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
135 unlink(tk->script); |
0 | 136 |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
137 if (tk->pipe[0]) |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
138 close(tk->pipe[0]); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
139 if (tk->pipe[1]) |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
140 close(tk->pipe[1]); |
10
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
141 if (tk->scriptfd) |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
142 close(tk->scriptfd); |
0 | 143 |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
144 TAILQ_REMOVE(&tasks, tk, link); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
145 memset(tk, 0, sizeof (*tk)); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
146 free(tk); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
147 } |
0 | 148 |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
149 static const char * |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
150 makeurl(const char *fmt, ...) |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
151 { |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
152 assert(fmt); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
153 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
154 static char url[256]; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
155 char page[128] = {0}; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
156 va_list ap; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
157 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
158 va_start(ap, fmt); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
159 vsnprintf(page, sizeof (page), fmt, ap); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
160 va_end(ap); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
161 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
162 snprintf(url, sizeof (url), "%s/%s", config.url, page); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
163 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
164 return url; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
165 } |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
166 |
0 | 167 static void |
168 complete(int signum, siginfo_t *sinfo, void *ctx) | |
169 { | |
170 (void)ctx; | |
171 (void)signum; | |
172 | |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
173 struct task *tk; |
0 | 174 |
10
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
175 if (waitpid(sinfo->si_pid, NULL, 0) < 0) |
0 | 176 log_warn("waitpid: %s", strerror(errno)); |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
177 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
178 if ((tk = find_by_pid(sinfo->si_pid))) { |
10
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
179 log_debug("process %d terminated (exitcode=%d)", |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
180 (int)sinfo->si_pid, sinfo->si_status); |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
181 |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
182 close(tk->pipe[1]); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
183 tk->status = TASKST_COMPLETED; |
10
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
184 tk->exitcode = sinfo->si_status; |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
185 tk->pipe[1] = 0; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
186 } |
0 | 187 } |
188 | |
10
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
189 static void |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
190 stop(int signum) |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
191 { |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
192 log_warn("exiting on signal %d", signum); |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
193 alive = 0; |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
194 } |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
195 |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
196 static char * |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
197 uploadenc(const struct task *tk) |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
198 { |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
199 json_t *doc; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
200 |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
201 struct jobresult res = {0}; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
202 char *dump; |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
203 |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
204 res.job_id = tk->job_id; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
205 res.exitcode = tk->exitcode; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
206 res.log = tk->out; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
207 res.worker_id = worker.id; |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
208 |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
209 doc = jobresult_to(&res, 1); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
210 dump = json_dumps(doc, JSON_COMPACT); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
211 |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
212 json_decref(doc); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
213 |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
214 return dump; |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
215 } |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
216 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
217 static size_t |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
218 getcb(char *in, size_t n, size_t w, FILE *fp) |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
219 { |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
220 if (fwrite(in, n, w, fp) != w) |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
221 return log_warn("get: %s", strerror(errno)), 0; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
222 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
223 return w; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
224 } |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
225 |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
226 static json_t * |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
227 get(const char *topic, const char *url) |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
228 { |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
229 CURL *curl; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
230 CURLcode code; |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
231 |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
232 json_t *doc; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
233 json_error_t error; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
234 |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
235 char buf[SCI_MSG_MAX]; |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
236 long status; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
237 FILE *fp; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
238 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
239 curl = curl_easy_init(); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
240 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
241 if (!(fp = fmemopen(buf, sizeof (buf), "w"))) |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
242 err(1, "fmemopen"); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
243 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
244 curl_easy_setopt(curl, CURLOPT_URL, url); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
245 curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
246 curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3L); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
247 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, getcb); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
248 curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
249 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
250 if ((code = curl_easy_perform(curl)) != CURLE_OK) |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
251 log_warn("%s: %s", topic, curl_easy_strerror(code)); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
252 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
253 curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
254 curl_easy_cleanup(curl); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
255 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
256 fclose(fp); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
257 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
258 if (code != CURLE_OK) |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
259 return log_warn("%s: %s", topic, curl_easy_strerror(code)), NULL; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
260 if (status != 200) |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
261 return log_warn("%s: unexpected status code %ld", topic, status), NULL; |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
262 if (!(doc = json_loads(buf, 0, &error))) |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
263 return log_warn("%s: %s", topic, error.text), NULL; |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
264 |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
265 return doc; |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
266 } |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
267 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
268 static size_t |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
269 silent(char *in, size_t n, size_t w, void *data) |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
270 { |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
271 (void)in; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
272 (void)n; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
273 (void)data; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
274 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
275 return w; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
276 } |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
277 |
0 | 278 static void |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
279 upload(struct task *tk) |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
280 { |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
281 CURL *curl; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
282 CURLcode code; |
10
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
283 struct curl_slist *headers = NULL; |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
284 long status; |
10
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
285 char *dump; |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
286 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
287 curl = curl_easy_init(); |
10
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
288 headers = curl_slist_append(headers, "Content-Type: application/json"); |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
289 curl_easy_setopt(curl, CURLOPT_URL, makeurl("api/v1/jobs")); |
10
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
290 //curl_easy_setopt(curl, CURLOPT_URL, "http://localhost:4000"); |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
291 curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3L); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
292 curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
293 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, silent); |
10
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
294 curl_easy_setopt(curl, CURLOPT_POSTFIELDS, (dump = uploadenc(tk))); |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
295 curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, strlen(dump)); |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
296 curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
297 code = curl_easy_perform(curl); |
10
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
298 curl_slist_free_all(headers); |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
299 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
300 /* |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
301 * If we fail to upload data, we put the result into syncing mode so |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
302 * that we retry later without redoing the job over and over |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
303 */ |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
304 tk->status = TASKST_SYNCING; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
305 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
306 if (code != CURLE_OK) |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
307 log_warn("upload: %s", curl_easy_strerror(code)); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
308 else { |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
309 curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
310 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
311 if (status != 200) |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
312 log_warn("upload: unexpected return code: %ld", status); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
313 else |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
314 destroy(tk); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
315 } |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
316 |
10
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
317 free(dump); |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
318 curl_easy_cleanup(curl); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
319 } |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
320 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
321 static inline int |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
322 pending(int id) |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
323 { |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
324 struct task *t; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
325 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
326 TAILQ_FOREACH(t, &tasks, link) |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
327 if (t->job_id == id) |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
328 return 1; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
329 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
330 return 0; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
331 } |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
332 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
333 static void |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
334 queue(int id, int project_id, const char *tag) |
0 | 335 { |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
336 struct task *tk; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
337 |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
338 log_info("queued job build (%d) for tag %s\n", id, tag); |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
339 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
340 tk = util_calloc(1, sizeof (*tk)); |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
341 tk->job_id = id; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
342 tk->project_id = project_id; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
343 strlcpy(tk->job_tag, tag, sizeof (tk->job_tag)); |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
344 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
345 TAILQ_INSERT_TAIL(&tasks, tk, link); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
346 } |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
347 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
348 static void |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
349 merge(json_t *doc) |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
350 { |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
351 struct job jobs[SCI_JOB_LIST_MAX]; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
352 ssize_t jobsz; |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
353 |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
354 if ((jobsz = job_from(jobs, UTIL_SIZE(jobs), doc)) < 0) |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
355 log_warn("fetchjobs: %s", strerror(errno)); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
356 else { |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
357 for (ssize_t i = 0; i < jobsz; ++i) { |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
358 if (!pending(jobs[i].id)) |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
359 queue(jobs[i].id, jobs[i].project_id, jobs[i].tag); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
360 } |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
361 } |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
362 |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
363 json_decref(doc); |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
364 } |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
365 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
366 static void |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
367 fetchjobs(void) |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
368 { |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
369 json_t *doc; |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
370 |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
371 if (!(doc = get("fetch", makeurl("api/v1/jobs/%s", config.worker)))) |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
372 log_warn("unable to retrieve jobs"); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
373 else |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
374 merge(doc); |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
375 } |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
376 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
377 /* |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
378 * This function reads stdout/stderr pipe from child and optionally remove them |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
379 * if they have completed. |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
380 */ |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
381 static void |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
382 readall(struct fds *fds) |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
383 { |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
384 struct task *tk; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
385 char buf[BUFSIZ]; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
386 ssize_t nr; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
387 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
388 for (size_t i = 0; i < fds->listsz; ++i) { |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
389 if (fds->list[i].revents == 0) |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
390 continue; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
391 if (!(tk = find_by_fd(fds->list[i].fd))) |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
392 continue; |
0 | 393 |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
394 /* Read stdout/stderr from children pipe. */ |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
395 if ((nr = read(fds->list[i].fd, buf, sizeof (buf) - 1)) <= 0) |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
396 tk->status = TASKST_SYNCING; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
397 else { |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
398 buf[nr] = 0; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
399 strlcat(tk->out, buf, sizeof (tk->out)); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
400 } |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
401 } |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
402 } |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
403 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
404 /* |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
405 * Retrieve status code from spawned process complete or upload again if they |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
406 * failed to sync. |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
407 */ |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
408 static void |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
409 flushall(void) |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
410 { |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
411 struct task *tk, *tmp; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
412 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
413 TAILQ_FOREACH_SAFE(tk, &tasks, link, tmp) |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
414 if (tk->status == TASKST_SYNCING) |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
415 upload(tk); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
416 } |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
417 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
418 static int |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
419 extract(struct task *tk, json_t *doc) |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
420 { |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
421 struct project proj; |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
422 size_t len; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
423 |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
424 if (project_from(&proj, 1, doc) < 0) { |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
425 json_decref(doc); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
426 log_warn("fetchproject: %s", strerror(errno)); |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
427 return -1; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
428 } |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
429 |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
430 len = strlen(proj.script); |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
431 |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
432 if ((size_t)write(tk->scriptfd, proj.script, len) != len) { |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
433 json_decref(doc); |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
434 log_warn("fetchproject: %s", strerror(errno)); |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
435 return -1; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
436 } |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
437 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
438 /* Close so we can finally spawn it. */ |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
439 close(tk->scriptfd); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
440 tk->scriptfd = 0; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
441 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
442 return 0; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
443 } |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
444 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
445 static int |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
446 fetchproject(struct task *tk) |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
447 { |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
448 json_t *doc; |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
449 |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
450 if (!(doc = get("fetchproject", makeurl("api/v1/projects/%d", tk->project_id)))) |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
451 return -1; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
452 |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
453 return extract(tk, doc); |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
454 } |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
455 |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
456 /* |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
457 * Create a task to run the script. This will retrieve the project script code |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
458 * at this moment and put it in a temporary file. |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
459 */ |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
460 static void |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
461 createtask(struct task *tk) |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
462 { |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
463 if (tk->status != TASKST_PENDING) |
0 | 464 return; |
465 | |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
466 log_debug("creating task (id=%d, tag=%s)", tk->job_id, tk->job_tag); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
467 snprintf(tk->script, sizeof (tk->script), "/tmp/sciworkerd-%d-XXXXXX", tk->job_id); |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
468 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
469 if ((tk->scriptfd = mkstemp(tk->script)) < 0 || |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
470 fchmod(tk->scriptfd, S_IRUSR | S_IWUSR | S_IXUSR) < 0) { |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
471 unlink(tk->script); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
472 log_warn("%s", strerror(errno)); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
473 return; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
474 } |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
475 |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
476 if (fetchproject(tk) < 0) { |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
477 unlink(tk->script); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
478 close(tk->scriptfd); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
479 tk->scriptfd = 0; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
480 } else |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
481 spawn(tk); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
482 } |
0 | 483 |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
484 /* |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
485 * Start all pending tasks if the limit of running tasks is not reached. |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
486 */ |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
487 static void |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
488 startall(void) |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
489 { |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
490 size_t nrunning = 0; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
491 struct task *tk; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
492 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
493 TAILQ_FOREACH(tk, &tasks, link) |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
494 if (tk->status == TASKST_RUNNING) |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
495 ++nrunning; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
496 |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
497 if (nrunning >= (size_t)config.maxbuilds) |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
498 log_debug("not spawning new process because limit is reached"); |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
499 else { |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
500 tk = TAILQ_FIRST(&tasks); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
501 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
502 while (tk && nrunning++ < (size_t)config.maxbuilds) { |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
503 createtask(tk); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
504 tk = TAILQ_NEXT(tk, link); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
505 } |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
506 } |
0 | 507 } |
508 | |
509 static void | |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
510 fetchworker(void) |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
511 { |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
512 json_t *doc; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
513 |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
514 if (!(doc = get("fetchworker", makeurl("api/v1/workers/%s", config.worker))) || |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
515 worker_from(&worker, 1, doc) < 0) |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
516 errx(1, "unable to retrieve worker id"); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
517 |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
518 log_info("worker id: %d", worker.id); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
519 log_info("worker name: %s", worker.name); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
520 log_info("worker description: %s", worker.desc); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
521 |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
522 json_decref(doc); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
523 } |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
524 |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
525 static void |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
526 init(void) |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
527 { |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
528 struct sigaction sa; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
529 |
10
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
530 sa.sa_flags = SA_SIGINFO | SA_RESTART; |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
531 sa.sa_sigaction = complete; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
532 sigemptyset(&sa.sa_mask); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
533 |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
534 if (sigaction(SIGCHLD, &sa, NULL) < 0) |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
535 err(1, "sigaction"); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
536 |
10
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
537 sa.sa_flags = SA_RESTART; |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
538 sa.sa_handler = stop; |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
539 sigemptyset(&sa.sa_mask); |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
540 |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
541 if (sigaction(SIGTERM, &sa, NULL) < 0 || sigaction(SIGINT, &sa, NULL) < 0) |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
542 err(1, "sigaction"); |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
543 |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
544 log_open("sciworkerd"); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
545 fetchworker(); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
546 } |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
547 |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
548 static struct fds |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
549 prepare(void) |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
550 { |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
551 struct fds fds = {0}; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
552 struct task *tk; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
553 size_t i = 0; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
554 |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
555 TAILQ_FOREACH(tk, &tasks, link) |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
556 if (tk->status == TASKST_RUNNING || tk->status == TASKST_COMPLETED) |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
557 fds.listsz++; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
558 |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
559 fds.list = util_calloc(fds.listsz, sizeof (*fds.list)); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
560 |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
561 TAILQ_FOREACH(tk, &tasks, link) { |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
562 if (tk->status == TASKST_RUNNING || tk->status == TASKST_COMPLETED) { |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
563 fds.list[i].fd = tk->pipe[0]; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
564 fds.list[i++].events = POLLIN | POLLPRI; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
565 } |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
566 } |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
567 |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
568 return fds; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
569 } |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
570 |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
571 static void |
0 | 572 run(void) |
573 { | |
574 struct fds fds; | |
575 | |
576 fds = prepare(); | |
577 | |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
578 if (poll(fds.list, fds.listsz, 5000) < 0 && errno != EINTR) |
0 | 579 err(1, "poll"); |
580 | |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
581 fetchjobs(); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
582 readall(&fds); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
583 startall(); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
584 flushall(); |
0 | 585 } |
586 | |
10
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
587 static void |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
588 finish(void) |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
589 { |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
590 size_t tot = 0; |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
591 struct task *tk, *tmp; |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
592 |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
593 TAILQ_FOREACH(tk, &tasks, link) |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
594 tot++; |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
595 |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
596 signal(SIGCHLD, SIG_IGN); |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
597 log_debug("killing remaining %zu tasks", tot); |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
598 |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
599 TAILQ_FOREACH_SAFE(tk, &tasks, link, tmp) { |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
600 if (tk->status == TASKST_RUNNING) { |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
601 kill(tk->child, SIGTERM); |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
602 waitpid(tk->child, NULL, 0); |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
603 } |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
604 |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
605 destroy(tk); |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
606 } |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
607 } |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
608 |
0 | 609 int |
610 main(int argc, char **argv) | |
611 { | |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
612 int ch; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
613 const char *errstr; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
614 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
615 setprogname("sciworkerd"); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
616 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
617 while ((ch = getopt(argc, argv, "m:u:w:")) != -1) { |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
618 switch (ch) { |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
619 case 'm': |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
620 config.maxbuilds = strtonum(optarg, 0, INT_MAX, &errstr); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
621 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
622 if (errstr) |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
623 errx(1, "%s: %s", optarg, errstr); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
624 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
625 break; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
626 case 'u': |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
627 config.url = optarg; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
628 break; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
629 case 'w': |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
630 config.worker = optarg; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
631 break; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
632 default: |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
633 usage(); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
634 break; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
635 } |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
636 } |
0 | 637 |
638 init(); | |
639 | |
10
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
640 while (alive) |
0 | 641 run(); |
10
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
642 |
eb76429ce112
sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
643 finish(); |
0 | 644 } |
18 | 645 #endif |
646 | |
647 | |
648 | |
649 | |
650 | |
651 | |
652 | |
653 | |
654 | |
655 | |
656 #include <err.h> | |
657 #include <errno.h> | |
658 #include <poll.h> | |
659 #include <signal.h> | |
660 #include <string.h> | |
661 #include <time.h> | |
662 #include <unistd.h> | |
663 | |
664 #include "types.h" | |
665 #include "task.h" | |
666 | |
667 #define SCRIPT \ | |
668 "#!/bin/sh\n" \ | |
669 "echo yes\n" \ | |
670 "sleep 10\n" \ | |
671 "echo no 1>&2\n" \ | |
672 "sleep 1\n" \ | |
673 "exit 1" | |
674 | |
675 int | |
676 main(void) | |
677 { | |
678 struct job job = { | |
679 .project_id = 10, | |
680 .id = 10, | |
681 .tag = "1234" | |
682 }; | |
683 struct sigaction sa = {0}; | |
684 struct pollfd fd; | |
685 struct task *t; | |
686 int run = 1; | |
687 | |
688 t = task_new(&job); | |
689 | |
690 if (task_setup(t, SCRIPT) < 0) | |
691 err(1, "task_set_script"); | |
692 if (task_start(t) < 0) | |
693 err(1, "task_start"); | |
694 | |
695 while (run) { | |
696 if (difftime(time(NULL), task_uptime(t)) >= 3) { | |
697 printf("task timeout !\n"); | |
698 task_kill(t); | |
699 task_wait(t); | |
700 break; | |
701 } | |
702 | |
703 task_prepare(t, &fd); | |
704 | |
705 if (poll(&fd, 1, 250) < 0 && errno != EINTR) | |
706 err(1, "poll"); | |
707 | |
708 switch (task_sync(t, &fd)) { | |
709 case -1: | |
710 err(1, "task_sync"); | |
711 case 0: | |
712 run = 0; | |
713 task_wait(t); | |
714 break; | |
715 default: | |
716 /* Keep going... */ | |
717 break; | |
718 } | |
719 } | |
720 | |
721 switch (task_status(t)) { | |
722 case TASKSTATUS_EXITED: | |
723 printf("process exited with code: %d\n", task_code(t).exitcode); | |
724 break; | |
725 case TASKSTATUS_KILLED: | |
726 printf("process killed with signal %d\n", task_code(t).sigcode); | |
727 break; | |
728 default: | |
729 break; | |
730 } | |
731 | |
732 printf("== console ==\n%s==\n", task_console(t)); | |
733 task_free(t); | |
734 } |