Mercurial > sci
comparison scictl/scictl.c @ 27:dae2de19ca5d
misc: switch to JSON everywhere
author | David Demelier <markand@malikania.fr> |
---|---|
date | Wed, 03 Aug 2022 15:18:09 +0200 |
parents | 34cbbd215ef7 |
children | 8c2087e7d381 |
comparison
equal
deleted
inserted
replaced
26:7e10cace67a3 | 27:dae2de19ca5d |
---|---|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
17 */ | 17 */ |
18 | 18 |
19 #include <errno.h> | |
19 #include <limits.h> | 20 #include <limits.h> |
20 #include <errno.h> | 21 #include <stdint.h> |
21 #include <stdio.h> | 22 #include <stdio.h> |
22 #include <stdlib.h> | 23 #include <stdlib.h> |
23 #include <string.h> | 24 #include <string.h> |
24 #include <unistd.h> | 25 #include <unistd.h> |
25 | 26 |
27 #include <utlist.h> | |
28 | |
26 #include "apic.h" | 29 #include "apic.h" |
27 #include "config.h" | 30 #include "config.h" |
28 #include "types.h" | |
29 #include "util.h" | 31 #include "util.h" |
30 | 32 |
31 static void | 33 static void |
32 usage(void) | 34 usage(void) |
33 { | 35 { |
34 fprintf(stderr, "usage: %s [-u baseurl] command [args...]\n", getprogname()); | 36 fprintf(stderr, "usage: scictl [-u baseurl] command [args...]\n"); |
35 exit(1); | 37 exit(1); |
36 } | 38 } |
37 | 39 |
38 static void | 40 static void |
39 help(void) | 41 help(void) |
40 { | 42 { |
41 fprintf(stderr, "usage: scictl job-add project tag\n"); | 43 fprintf(stderr, "usage: scictl job-add project tag\n"); |
42 fprintf(stderr, " scictl job-todo worker\n"); | 44 fprintf(stderr, " scictl job-todo worker\n"); |
43 fprintf(stderr, " scictl jobresult-add id worker exitcode console\n"); | |
44 fprintf(stderr, " scictl project-add name desc url script\n"); | 45 fprintf(stderr, " scictl project-add name desc url script\n"); |
45 fprintf(stderr, " scictl project-info name\n"); | 46 fprintf(stderr, " scictl project-info name\n"); |
46 fprintf(stderr, " scictl project-list\n"); | 47 fprintf(stderr, " scictl project-list\n"); |
47 fprintf(stderr, " scictl project-update name key value\n"); | 48 fprintf(stderr, " scictl project-update name key value\n"); |
48 fprintf(stderr, " scictl worker-add name desc\n"); | 49 fprintf(stderr, " scictl worker-add name desc\n"); |
49 fprintf(stderr, " scictl worker-list\n"); | 50 fprintf(stderr, " scictl worker-list\n"); |
50 exit(0); | 51 exit(0); |
51 } | 52 } |
52 | 53 |
53 static inline void | |
54 replace(char **str, const char *new) | |
55 { | |
56 free(*str); | |
57 *str = util_strdup(new); | |
58 } | |
59 | |
60 long long | 54 long long |
61 toint(const char *s) | 55 toint(const char *s) |
62 { | 56 { |
63 long long v; | 57 long long v; |
64 const char *err; | 58 const char *err; |
96 fclose(fp); | 90 fclose(fp); |
97 | 91 |
98 return console; | 92 return console; |
99 } | 93 } |
100 | 94 |
95 static inline intmax_t | |
96 get_int(json_t *obj, const char *key) | |
97 { | |
98 json_t *val; | |
99 | |
100 if ((val = json_object_get(obj, key)) && json_is_integer(val)) | |
101 return json_integer_value(val); | |
102 | |
103 return 0; | |
104 } | |
105 | |
106 static inline const char * | |
107 get_string(json_t *obj, const char *key) | |
108 { | |
109 json_t *val; | |
110 | |
111 if ((val = json_object_get(obj, key)) && json_is_string(val)) | |
112 return json_string_value(val); | |
113 | |
114 return ""; | |
115 } | |
116 | |
101 static void | 117 static void |
102 cmd_job_add(int argc, char **argv) | 118 cmd_job_add(int argc, char **argv) |
103 { | 119 { |
104 struct job job = {0}; | 120 struct apic req; |
105 struct apic req; | 121 json_t *obj; |
106 | 122 |
107 if (argc < 3) | 123 if (argc < 3) |
108 usage(); | 124 usage(); |
109 | 125 |
110 job.project_name = util_strdup(argv[1]); | 126 obj = json_pack("{ss ss}", |
111 job.tag = util_strdup(argv[2]); | 127 "project_name", argv[1], |
112 | 128 "tag", argv[2] |
113 if (apic_job_add(&req, &job) < 0) | 129 ); |
130 | |
131 if (apic_job_add(&req, obj) < 0) | |
114 util_die("abort: %s\n", req.error); | 132 util_die("abort: %s\n", req.error); |
115 | 133 |
116 apic_finish(&req); | 134 json_decref(obj); |
117 job_finish(&job); | |
118 } | 135 } |
119 | 136 |
120 static void | 137 static void |
121 cmd_job_todo(int argc, char **argv) | 138 cmd_job_todo(int argc, char **argv) |
122 { | 139 { |
123 struct job jobs[SCI_JOB_LIST_MAX] = {0}; | 140 struct apic req; |
124 size_t jobsz; | 141 json_t *array, *obj; |
125 struct apic req; | 142 size_t i; |
126 | 143 |
127 if (argc < 2) | 144 if (argc < 2) |
128 usage(); | 145 usage(); |
129 | 146 |
130 if ((jobsz = apic_job_todo(&req, jobs, UTIL_SIZE(jobs), argv[1]))) | 147 if ((array = apic_job_todo(&req, argv[1]))) |
131 util_die("abort: %s\n", req.error); | 148 util_die("abort: %s\n", req.error); |
132 | 149 |
133 for (size_t i = 0; i < jobsz; ++i) { | 150 json_array_foreach(array, i, obj) { |
134 printf("%-16s%jd\n", "id:", jobs[i].id); | 151 printf("%-16s%jd\n", "id:", get_int(obj, "id")); |
135 printf("%-16s%s\n", "tag:", jobs[i].tag); | 152 printf("%-16s%s\n", "tag:", get_string(obj, "tag")); |
136 printf("%-16s%s\n", "project:", jobs[i].project_name); | 153 printf("%-16s%s\n", "project:", get_string(obj, "project_name")); |
137 | 154 |
138 if (i + 1 < jobsz) | 155 if (i + 1 < json_array_size(array)) |
139 printf("\n"); | 156 printf("\n"); |
140 | 157 } |
141 job_finish(&jobs[i]); | 158 |
142 } | 159 json_decref(array); |
143 | 160 } |
144 apic_finish(&req); | 161 |
145 } | 162 static void |
146 | 163 cmd_project_add(int argc, char **argv) |
147 static void | 164 { |
148 cmd_jobresult_add(int argc, char **argv) | 165 struct apic req; |
149 { | 166 char *script; |
150 struct jobresult res = {0}; | 167 json_t *obj; |
151 struct apic req; | |
152 | 168 |
153 if (argc < 5) | 169 if (argc < 5) |
154 usage(); | 170 usage(); |
155 | 171 |
156 res.job_id = toint(argv[1]); | 172 script = readfile(argv[4]); |
157 res.worker_name = util_strdup(argv[2]); | 173 obj = json_pack("{ss ss ss ss}", |
158 res.exitcode = toint(argv[3]); | 174 "name", argv[1], |
159 res.log = readfile(argv[4]); | 175 "desc", argv[2], |
160 | 176 "url", argv[3], |
161 if (apic_jobresult_add(&req, &res) < 0) | 177 "script", script |
162 util_die("abort: unable to add job result: %s\n", req.error); | 178 ); |
163 | 179 |
164 apic_finish(&req); | 180 if (apic_project_save(&req, obj) < 0) |
165 jobresult_finish(&res); | |
166 } | |
167 | |
168 static void | |
169 cmd_project_add(int argc, char **argv) | |
170 { | |
171 struct project pc = {0}; | |
172 struct apic req; | |
173 | |
174 if (argc < 5) | |
175 usage(); | |
176 | |
177 pc.name = util_strdup(argv[1]); | |
178 pc.desc = util_strdup(argv[2]); | |
179 pc.url = util_strdup(argv[3]); | |
180 pc.script = readfile(argv[4]); | |
181 | |
182 if (apic_project_save(&req, &pc) < 0) | |
183 util_die("abort: unable to create project: %s\n", req.error); | 181 util_die("abort: unable to create project: %s\n", req.error); |
184 | 182 |
185 apic_finish(&req); | 183 json_decref(obj); |
186 project_finish(&pc); | |
187 } | 184 } |
188 | 185 |
189 static void | 186 static void |
190 cmd_project_update(int argc, char **argv) | 187 cmd_project_update(int argc, char **argv) |
191 { | 188 { |
189 (void)argc; | |
190 (void)argv; | |
191 #if 0 | |
192 struct project pc; | 192 struct project pc; |
193 struct apic req; | 193 struct apic req; |
194 | 194 |
195 if (argc < 4) | 195 if (argc < 4) |
196 usage(); | 196 usage(); |
210 if (apic_project_save(&req, &pc) < 0) | 210 if (apic_project_save(&req, &pc) < 0) |
211 util_die("abort: unable to save project: %s\n", req.error); | 211 util_die("abort: unable to save project: %s\n", req.error); |
212 | 212 |
213 apic_finish(&req); | 213 apic_finish(&req); |
214 project_finish(&pc); | 214 project_finish(&pc); |
215 #endif | |
215 } | 216 } |
216 | 217 |
217 static void | 218 static void |
218 cmd_project_info(int argc, char **argv) | 219 cmd_project_info(int argc, char **argv) |
219 { | 220 { |
220 struct project project = {0}; | 221 struct apic req; |
221 struct apic req; | 222 json_t *obj; |
222 | 223 |
223 if (argc < 2) | 224 if (argc < 2) |
224 usage(); | 225 usage(); |
225 if (apic_project_find(&req, &project, argv[1]) < 0) | 226 if (!(obj = apic_project_find(&req, argv[1]))) |
226 util_die("abort: unable to find project: %s\n", req.error); | 227 util_die("abort: unable to find project: %s\n", req.error); |
227 | 228 |
228 printf("%-16s%s\n", "name:", project.name); | 229 printf("%-16s%s\n", "name:", get_string(obj, "name")); |
229 printf("%-16s%s\n", "desc:", project.desc); | 230 printf("%-16s%s\n", "desc:", get_string(obj, "desc")); |
230 printf("%-16s%s\n", "url:", project.url); | 231 printf("%-16s%s\n", "url:", get_string(obj, "url")); |
231 printf("\n"); | 232 printf("\n"); |
232 printf("%s", project.script); | 233 printf("%s", get_string(obj, "script")); |
233 | 234 |
234 apic_finish(&req); | 235 json_decref(obj); |
235 project_finish(&project); | |
236 } | 236 } |
237 | 237 |
238 static void | 238 static void |
239 cmd_project_list(int argc, char **argv) | 239 cmd_project_list(int argc, char **argv) |
240 { | 240 { |
241 (void)argc; | 241 (void)argc; |
242 (void)argv; | 242 (void)argv; |
243 | 243 |
244 struct project projects[SCI_PROJECT_MAX] = {0}; | 244 struct apic req; |
245 struct apic req; | 245 json_t *array, *obj; |
246 ssize_t projectsz; | 246 size_t i; |
247 | 247 |
248 if ((projectsz = apic_project_list(&req, projects, UTIL_SIZE(projects))) < 0) | 248 if (!(array = apic_project_list(&req))) |
249 util_die("abort: unable to list projects: %s\n", req.error); | 249 util_die("abort: unable to list projects: %s\n", req.error); |
250 | 250 |
251 for (ssize_t i = 0; i < projectsz; ++i) { | 251 json_array_foreach(array, i, obj) { |
252 printf("%-16s%s\n", "name:", projects[i].name); | 252 printf("%-16s%s\n", "name:", get_string(obj, "name")); |
253 printf("%-16s%s\n", "desc:", projects[i].desc); | 253 printf("%-16s%s\n", "desc:", get_string(obj, "desc")); |
254 printf("%-16s%s\n", "url:", projects[i].url); | 254 printf("%-16s%s\n", "url:", get_string(obj, "url")); |
255 | 255 |
256 if (i + 1 < projectsz) | 256 if (i + 1 < json_array_size(array)) |
257 printf("\n"); | 257 printf("\n"); |
258 | 258 } |
259 project_finish(&projects[i]); | 259 |
260 } | 260 json_decref(array); |
261 | |
262 apic_finish(&req); | |
263 } | 261 } |
264 | 262 |
265 static void | 263 static void |
266 cmd_worker_add(int argc, char **argv) | 264 cmd_worker_add(int argc, char **argv) |
267 { | 265 { |
268 struct worker wk = {0}; | 266 struct apic req; |
269 struct apic req; | 267 json_t *obj; |
270 | 268 |
271 if (argc < 3) | 269 if (argc < 3) |
272 usage(); | 270 usage(); |
273 | 271 |
274 wk.name = util_strdup(argv[1]); | 272 obj = json_pack("{ss ss}", |
275 wk.desc = util_strdup(argv[2]); | 273 "name", argv[1], |
276 | 274 "desc", argv[2] |
277 if (apic_worker_save(&req, &wk) < 0) | 275 ); |
276 | |
277 if (apic_worker_save(&req, obj) < 0) | |
278 util_die("abort: unable to save worker: %s\n", req.error); | 278 util_die("abort: unable to save worker: %s\n", req.error); |
279 | 279 |
280 worker_finish(&wk); | 280 json_decref(obj); |
281 apic_finish(&req); | |
282 } | 281 } |
283 | 282 |
284 static void | 283 static void |
285 cmd_worker_list(int argc, char **argv) | 284 cmd_worker_list(int argc, char **argv) |
286 { | 285 { |
287 (void)argc; | 286 (void)argc; |
288 (void)argv; | 287 (void)argv; |
289 | 288 |
290 struct worker wk[SCI_WORKER_MAX]; | 289 struct apic req; |
291 struct apic req; | 290 json_t *array, *obj; |
292 ssize_t wksz; | 291 size_t i; |
293 | 292 |
294 if ((wksz = apic_worker_list(&req, wk, UTIL_SIZE(wk))) < 0) | 293 if (!(array = apic_worker_list(&req))) |
295 util_die("abort: unable to list worker: %s\n", req.error); | 294 util_die("abort: unable to list worker: %s\n", req.error); |
296 | 295 |
297 for (ssize_t i = 0; i < wksz; ++i) { | 296 json_array_foreach(array, i, obj) { |
298 printf("%-16s%s\n", "name:", wk[i].name); | 297 printf("%-16s%s\n", "name:", get_string(obj, "name")); |
299 printf("%-16s%s\n", "desc:", wk[i].desc); | 298 printf("%-16s%s\n", "desc:", get_string(obj, "desc")); |
300 | 299 |
301 if (i + 1 < wksz) | 300 if (i + 1 < json_array_size(array)) |
302 printf("\n"); | 301 printf("\n"); |
303 | 302 } |
304 worker_finish(&wk[i]); | 303 |
305 } | 304 json_decref(array); |
306 | |
307 apic_finish(&req); | |
308 } | 305 } |
309 | 306 |
310 static struct { | 307 static struct { |
311 const char *name; | 308 const char *name; |
312 void (*exec)(int, char **); | 309 void (*exec)(int, char **); |
313 } commands[] = { | 310 } commands[] = { |
314 { "job-add", cmd_job_add }, | 311 { "job-add", cmd_job_add }, |
315 { "job-todo", cmd_job_todo }, | 312 { "job-todo", cmd_job_todo }, |
316 { "jobresult-add", cmd_jobresult_add }, | |
317 { "project-add", cmd_project_add }, | 313 { "project-add", cmd_project_add }, |
318 { "project-info", cmd_project_info }, | 314 { "project-info", cmd_project_info }, |
319 { "project-list", cmd_project_list }, | 315 { "project-list", cmd_project_list }, |
320 { "project-update", cmd_project_update }, | 316 { "project-update", cmd_project_update }, |
321 { "worker-add", cmd_worker_add }, | 317 { "worker-add", cmd_worker_add }, |