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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
19 #if 0
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
20
0
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 #include <sys/types.h>
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #include <sys/wait.h>
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 #include <assert.h>
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 #include <err.h>
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 #include <errno.h>
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 #include <fcntl.h>
2
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
29 #include <limits.h>
0
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 #include <poll.h>
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 #include <signal.h>
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 #include <stdio.h>
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 #include <stdlib.h>
2
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
34 #include <stdnoreturn.h>
0
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 #include <string.h>
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 #include <unistd.h>
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 #include "config.h"
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 #include "util.h"
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 pid_t child;
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 };
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 struct fds {
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 struct pollfd *list;
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 size_t listsz;
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 };
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
87
18
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
88 /*
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
89 * Show usage and exit with code 1.
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
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
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 }
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
97
18
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
98 /*
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
99 * Find a task by its id.
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
100 */
2
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
101 static inline struct task *
0
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 find_by_fd(int fd)
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 {
2
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
104 struct task *tk;
0
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
109
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 return NULL;
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 }
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
112
18
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
113 /*
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
114 * Find a task by its pid number.
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
115 */
2
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
116 static inline struct task *
0
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 find_by_pid(pid_t pid)
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 {
2
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
119 struct task *t;
0
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
124
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 return NULL;
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 }
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
127
18
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
128 /*
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
129 * Destroy a task entirely.
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
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
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 static void
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
168 complete(int signum, siginfo_t *sinfo, void *ctx)
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
169 {
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
170 (void)ctx;
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
171 (void)signum;
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
172
2
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
173 struct task *tk;
0
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
187 }
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
464 return;
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
507 }
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
508
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
572 run(void)
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
573 {
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
574 struct fds fds;
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
575
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
576 fds = prepare();
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
579 err(1, "poll");
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
585 }
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
609 int
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
610 main(int argc, char **argv)
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
637
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
638 init();
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
639
10
eb76429ce112 sciworkerd: improve process destruction
David Demelier <markand@malikania.fr>
parents: 3
diff changeset
640 while (alive)
0
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
644 }
18
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
645 #endif
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
646
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
647
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
648
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
649
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
650
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
651
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
652
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
653
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
654
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
655
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
656 #include <err.h>
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
657 #include <errno.h>
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
658 #include <poll.h>
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
659 #include <signal.h>
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
660 #include <string.h>
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
661 #include <time.h>
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
662 #include <unistd.h>
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
663
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
664 #include "types.h"
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
665 #include "task.h"
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
666
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
667 #define SCRIPT \
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
668 "#!/bin/sh\n" \
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
669 "echo yes\n" \
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
670 "sleep 10\n" \
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
671 "echo no 1>&2\n" \
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
672 "sleep 1\n" \
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
673 "exit 1"
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
674
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
675 int
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
676 main(void)
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
677 {
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
678 struct job job = {
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
679 .project_id = 10,
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
680 .id = 10,
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
681 .tag = "1234"
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
682 };
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
683 struct sigaction sa = {0};
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
684 struct pollfd fd;
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
685 struct task *t;
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
686 int run = 1;
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
687
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
688 t = task_new(&job);
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
689
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
690 if (task_setup(t, SCRIPT) < 0)
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
691 err(1, "task_set_script");
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
692 if (task_start(t) < 0)
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
693 err(1, "task_start");
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
694
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
695 while (run) {
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
696 if (difftime(time(NULL), task_uptime(t)) >= 3) {
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
697 printf("task timeout !\n");
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
698 task_kill(t);
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
699 task_wait(t);
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
700 break;
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
701 }
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
702
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
703 task_prepare(t, &fd);
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
704
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
705 if (poll(&fd, 1, 250) < 0 && errno != EINTR)
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
706 err(1, "poll");
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
707
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
708 switch (task_sync(t, &fd)) {
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
709 case -1:
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
710 err(1, "task_sync");
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
711 case 0:
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
712 run = 0;
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
713 task_wait(t);
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
714 break;
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
715 default:
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
716 /* Keep going... */
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
717 break;
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
718 }
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
719 }
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
720
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
721 switch (task_status(t)) {
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
722 case TASKSTATUS_EXITED:
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
723 printf("process exited with code: %d\n", task_code(t).exitcode);
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
724 break;
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
725 case TASKSTATUS_KILLED:
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
726 printf("process killed with signal %d\n", task_code(t).sigcode);
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
727 break;
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
728 default:
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
729 break;
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
730 }
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
731
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
732 printf("== console ==\n%s==\n", task_console(t));
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
733 task_free(t);
600204c31bf0 misc: refactor
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
734 }