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 },