Mercurial > sci
annotate scictl/scictl.c @ 24:34cbbd215ef7
misc: add basic support for jobresults
author | David Demelier <markand@malikania.fr> |
---|---|
date | Mon, 25 Jul 2022 21:11:23 +0200 |
parents | 2cb228f23f53 |
children | dae2de19ca5d |
rev | line source |
---|---|
16
3051ef92173a
misc: add license headers
David Demelier <markand@malikania.fr>
parents:
13
diff
changeset
|
1 /* |
3051ef92173a
misc: add license headers
David Demelier <markand@malikania.fr>
parents:
13
diff
changeset
|
2 * scictl.c -- main scictl(8) utility file |
3051ef92173a
misc: add license headers
David Demelier <markand@malikania.fr>
parents:
13
diff
changeset
|
3 * |
3051ef92173a
misc: add license headers
David Demelier <markand@malikania.fr>
parents:
13
diff
changeset
|
4 * Copyright (c) 2021 David Demelier <markand@malikania.fr> |
3051ef92173a
misc: add license headers
David Demelier <markand@malikania.fr>
parents:
13
diff
changeset
|
5 * |
3051ef92173a
misc: add license headers
David Demelier <markand@malikania.fr>
parents:
13
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:
13
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:
13
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
3051ef92173a
misc: add license headers
David Demelier <markand@malikania.fr>
parents:
13
diff
changeset
|
9 * |
3051ef92173a
misc: add license headers
David Demelier <markand@malikania.fr>
parents:
13
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:
13
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
3051ef92173a
misc: add license headers
David Demelier <markand@malikania.fr>
parents:
13
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:
13
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
3051ef92173a
misc: add license headers
David Demelier <markand@malikania.fr>
parents:
13
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:
13
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:
13
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:
13
diff
changeset
|
17 */ |
3051ef92173a
misc: add license headers
David Demelier <markand@malikania.fr>
parents:
13
diff
changeset
|
18 |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
19 #include <limits.h> |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
20 #include <errno.h> |
0 | 21 #include <stdio.h> |
22 #include <stdlib.h> | |
23 #include <string.h> | |
24 #include <unistd.h> | |
25 | |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
26 #include "apic.h" |
0 | 27 #include "config.h" |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
28 #include "types.h" |
0 | 29 #include "util.h" |
30 | |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
31 static void |
0 | 32 usage(void) |
33 { | |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
34 fprintf(stderr, "usage: %s [-u baseurl] command [args...]\n", getprogname()); |
0 | 35 exit(1); |
36 } | |
37 | |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
38 static void |
0 | 39 help(void) |
40 { | |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
41 fprintf(stderr, "usage: scictl job-add project tag\n"); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
42 fprintf(stderr, " scictl job-todo worker\n"); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
43 fprintf(stderr, " scictl jobresult-add id worker exitcode console\n"); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
44 fprintf(stderr, " scictl project-add name desc url script\n"); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
45 fprintf(stderr, " scictl project-info name\n"); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
46 fprintf(stderr, " scictl project-list\n"); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
47 fprintf(stderr, " scictl project-update name key value\n"); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
48 fprintf(stderr, " scictl worker-add name desc\n"); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
49 fprintf(stderr, " scictl worker-list\n"); |
0 | 50 exit(0); |
51 } | |
52 | |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
53 static inline void |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
54 replace(char **str, const char *new) |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
55 { |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
56 free(*str); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
57 *str = util_strdup(new); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
58 } |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
59 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
60 long long |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
61 toint(const char *s) |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
62 { |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
63 long long v; |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
64 const char *err; |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
65 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
66 v = util_strtonum(s, 0, LLONG_MAX, &err); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
67 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
68 if (err) |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
69 util_die("abort: %s\n", err); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
70 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
71 return v; |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
72 } |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
73 |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
74 static char * |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
75 readfile(const char *path) |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
76 { |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
77 FILE *fp, *str; |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
78 char buf[BUFSIZ], *console = NULL; |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
79 size_t nr, consolesz = 0; |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
80 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
81 if (strcmp(path, "-") == 0) |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
82 fp = stdin; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
83 else if (!(fp = fopen(path, "r"))) |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
84 util_die("abort: %s: %s\n", path, strerror(errno)); |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
85 |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
86 if (!(str = open_memstream(&console, &consolesz))) |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
87 util_die("abort: open_memstream: %s\n", strerror(errno)); |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
88 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
89 while ((nr = fread(buf, 1, sizeof (buf), fp)) > 0) |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
90 fwrite(buf, 1, nr, str); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
91 |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
92 if ((ferror(fp) && !feof(fp)) || (ferror(str) && !feof(str))) |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
93 util_die("abort: %s\n", strerror(errno)); |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
94 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
95 fclose(str); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
96 fclose(fp); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
97 |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
98 return console; |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
99 } |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
100 |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
101 static void |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
102 cmd_job_add(int argc, char **argv) |
0 | 103 { |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
104 struct job job = {0}; |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
105 struct apic req; |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
106 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
107 if (argc < 3) |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
108 usage(); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
109 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
110 job.project_name = util_strdup(argv[1]); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
111 job.tag = util_strdup(argv[2]); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
112 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
113 if (apic_job_add(&req, &job) < 0) |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
114 util_die("abort: %s\n", req.error); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
115 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
116 apic_finish(&req); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
117 job_finish(&job); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
118 } |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
119 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
120 static void |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
121 cmd_job_todo(int argc, char **argv) |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
122 { |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
123 struct job jobs[SCI_JOB_LIST_MAX] = {0}; |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
124 size_t jobsz; |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
125 struct apic req; |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
126 |
0 | 127 if (argc < 2) |
128 usage(); | |
129 | |
23
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
22
diff
changeset
|
130 if ((jobsz = apic_job_todo(&req, jobs, UTIL_SIZE(jobs), argv[1]))) |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
131 util_die("abort: %s\n", req.error); |
1
5afdb14df924
sci: add support for storing results
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
132 |
5afdb14df924
sci: add support for storing results
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
133 for (size_t i = 0; i < jobsz; ++i) { |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
134 printf("%-16s%jd\n", "id:", jobs[i].id); |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
135 printf("%-16s%s\n", "tag:", jobs[i].tag); |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
136 printf("%-16s%s\n", "project:", jobs[i].project_name); |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
137 |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
138 if (i + 1 < jobsz) |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
139 printf("\n"); |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
140 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
141 job_finish(&jobs[i]); |
1
5afdb14df924
sci: add support for storing results
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
142 } |
5afdb14df924
sci: add support for storing results
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
143 |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
144 apic_finish(&req); |
1
5afdb14df924
sci: add support for storing results
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
145 } |
5afdb14df924
sci: add support for storing results
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
146 |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
147 static void |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
148 cmd_jobresult_add(int argc, char **argv) |
1
5afdb14df924
sci: add support for storing results
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
149 { |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
150 struct jobresult res = {0}; |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
151 struct apic req; |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
152 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
153 if (argc < 5) |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
154 usage(); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
155 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
156 res.job_id = toint(argv[1]); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
157 res.worker_name = util_strdup(argv[2]); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
158 res.exitcode = toint(argv[3]); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
159 res.log = readfile(argv[4]); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
160 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
161 if (apic_jobresult_add(&req, &res) < 0) |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
162 util_die("abort: unable to add job result: %s\n", req.error); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
163 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
164 apic_finish(&req); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
165 jobresult_finish(&res); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
166 } |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
167 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
168 static void |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
169 cmd_project_add(int argc, char **argv) |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
170 { |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
171 struct project pc = {0}; |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
172 struct apic req; |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
173 |
1
5afdb14df924
sci: add support for storing results
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
174 if (argc < 5) |
5afdb14df924
sci: add support for storing results
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
175 usage(); |
5afdb14df924
sci: add support for storing results
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
176 |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
177 pc.name = util_strdup(argv[1]); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
178 pc.desc = util_strdup(argv[2]); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
179 pc.url = util_strdup(argv[3]); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
180 pc.script = readfile(argv[4]); |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
181 |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
182 if (apic_project_save(&req, &pc) < 0) |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
183 util_die("abort: unable to create project: %s\n", req.error); |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
184 |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
185 apic_finish(&req); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
186 project_finish(&pc); |
1
5afdb14df924
sci: add support for storing results
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
187 } |
5afdb14df924
sci: add support for storing results
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
188 |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
189 static void |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
190 cmd_project_update(int argc, char **argv) |
0 | 191 { |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
192 struct project pc; |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
193 struct apic req; |
0 | 194 |
195 if (argc < 4) | |
196 usage(); | |
197 | |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
198 if (apic_project_find(&req, &pc, argv[1]) < 0) |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
199 util_die("abort: unable to find project: %s\n", req.error); |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
200 |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
201 if (strcmp(argv[2], "name") == 0) |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
202 replace(&pc.name, argv[3]); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
203 else if (strcmp(argv[2], "desc") == 0) |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
204 replace(&pc.desc, argv[3]); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
205 else if (strcmp(argv[2], "url") == 0) |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
206 replace(&pc.url, argv[3]); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
207 else if (strcmp(argv[2], "script") == 0) |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
208 replace(&pc.script, readfile(argv[3])); |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
209 |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
210 if (apic_project_save(&req, &pc) < 0) |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
211 util_die("abort: unable to save project: %s\n", req.error); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
212 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
213 apic_finish(&req); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
214 project_finish(&pc); |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
215 } |
0 | 216 |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
217 static void |
13 | 218 cmd_project_info(int argc, char **argv) |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
219 { |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
220 struct project project = {0}; |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
221 struct apic req; |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
222 |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
223 if (argc < 2) |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
224 usage(); |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
225 if (apic_project_find(&req, &project, argv[1]) < 0) |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
226 util_die("abort: unable to find project: %s\n", req.error); |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
227 |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
228 printf("%-16s%s\n", "name:", project.name); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
229 printf("%-16s%s\n", "desc:", project.desc); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
230 printf("%-16s%s\n", "url:", project.url); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
231 printf("\n"); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
232 printf("%s", project.script); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
233 |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
234 apic_finish(&req); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
235 project_finish(&project); |
0 | 236 } |
237 | |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
238 static void |
0 | 239 cmd_project_list(int argc, char **argv) |
240 { | |
241 (void)argc; | |
242 (void)argv; | |
243 | |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
244 struct project projects[SCI_PROJECT_MAX] = {0}; |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
245 struct apic req; |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
246 ssize_t projectsz; |
0 | 247 |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
248 if ((projectsz = apic_project_list(&req, projects, UTIL_SIZE(projects))) < 0) |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
249 util_die("abort: unable to list projects: %s\n", req.error); |
0 | 250 |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
251 for (ssize_t i = 0; i < projectsz; ++i) { |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
252 printf("%-16s%s\n", "name:", projects[i].name); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
253 printf("%-16s%s\n", "desc:", projects[i].desc); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
254 printf("%-16s%s\n", "url:", projects[i].url); |
0 | 255 |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
256 if (i + 1 < projectsz) |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
257 printf("\n"); |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
258 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
259 project_finish(&projects[i]); |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
260 } |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
261 |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
262 apic_finish(&req); |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
263 } |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
264 |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
265 static void |
0 | 266 cmd_worker_add(int argc, char **argv) |
267 { | |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
268 struct worker wk = {0}; |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
269 struct apic req; |
0 | 270 |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
271 if (argc < 3) |
0 | 272 usage(); |
273 | |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
274 wk.name = util_strdup(argv[1]); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
275 wk.desc = util_strdup(argv[2]); |
0 | 276 |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
277 if (apic_worker_save(&req, &wk) < 0) |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
278 util_die("abort: unable to save worker: %s\n", req.error); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
279 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
280 worker_finish(&wk); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
281 apic_finish(&req); |
0 | 282 } |
283 | |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
284 static void |
0 | 285 cmd_worker_list(int argc, char **argv) |
286 { | |
287 (void)argc; | |
288 (void)argv; | |
289 | |
290 struct worker wk[SCI_WORKER_MAX]; | |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
291 struct apic req; |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
292 ssize_t wksz; |
0 | 293 |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
294 if ((wksz = apic_worker_list(&req, wk, UTIL_SIZE(wk))) < 0) |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
295 util_die("abort: unable to list worker: %s\n", req.error); |
0 | 296 |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
297 for (ssize_t i = 0; i < wksz; ++i) { |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
298 printf("%-16s%s\n", "name:", wk[i].name); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
299 printf("%-16s%s\n", "desc:", wk[i].desc); |
0 | 300 |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
301 if (i + 1 < wksz) |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
302 printf("\n"); |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
303 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
304 worker_finish(&wk[i]); |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
305 } |
0 | 306 |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
307 apic_finish(&req); |
0 | 308 } |
309 | |
310 static struct { | |
311 const char *name; | |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
312 void (*exec)(int, char **); |
0 | 313 } commands[] = { |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
314 { "job-add", cmd_job_add }, |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
315 { "job-todo", cmd_job_todo }, |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
316 { "jobresult-add", cmd_jobresult_add }, |
0 | 317 { "project-add", cmd_project_add }, |
13 | 318 { "project-info", cmd_project_info }, |
0 | 319 { "project-list", cmd_project_list }, |
9
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
4
diff
changeset
|
320 { "project-update", cmd_project_update }, |
0 | 321 { "worker-add", cmd_worker_add }, |
322 { "worker-list", cmd_worker_list }, | |
323 { NULL, NULL } | |
324 }; | |
325 | |
326 int | |
327 main(int argc, char **argv) | |
328 { | |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
329 int ch; |
0 | 330 |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
331 opterr = 0; |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
332 setenv("POSIXLY_CORRECT", "1", 1); |
0 | 333 |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
334 while ((ch = getopt(argc, argv, "u:")) != -1) { |
0 | 335 switch (ch) { |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
336 case 'u': |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
337 util_strlcpy(apiconf.baseurl, optarg, sizeof (apiconf.baseurl)); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
338 break; |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
339 case '?': |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
340 util_die("abort: invalid option: %c\n", ch); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
341 break; |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
342 case ':': |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
343 util_die("abort: missing value for option %c\n", ch); |
0 | 344 break; |
345 default: | |
346 break; | |
347 } | |
348 } | |
349 | |
350 argc -= optind; | |
351 argv += optind; | |
352 | |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
353 optind = 1; |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
354 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
355 if (argc < 1) |
0 | 356 usage(); |
357 if (strcmp(argv[0], "help") == 0) | |
358 help(); | |
359 | |
360 for (size_t i = 0; commands[i].name; ++i) { | |
361 if (strcmp(commands[i].name, argv[0]) == 0) { | |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
362 commands[i].exec(argc, argv); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
363 return 0; |
0 | 364 } |
365 } | |
366 | |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
19
diff
changeset
|
367 util_die("abort: invalid command: %s\n", argv[0]); |
0 | 368 } |