Mercurial > sci
comparison scictl.c @ 0:f1de39079243
misc: initial import
author | David Demelier <markand@malikania.fr> |
---|---|
date | Mon, 07 Jun 2021 09:41:37 +0200 |
parents | |
children | 5afdb14df924 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:f1de39079243 |
---|---|
1 #define _BSD_SOURCE | |
2 #include <err.h> | |
3 #include <stdio.h> | |
4 #include <stdlib.h> | |
5 #include <string.h> | |
6 #include <stdnoreturn.h> | |
7 #include <unistd.h> | |
8 | |
9 #include "config.h" | |
10 #include "project.h" | |
11 #include "req.h" | |
12 #include "util.h" | |
13 #include "worker.h" | |
14 | |
15 noreturn static void | |
16 usage(void) | |
17 { | |
18 fprintf(stderr, "usage: %s [-s sock] command [args...]\n", getprogname()); | |
19 exit(1); | |
20 } | |
21 | |
22 noreturn static void | |
23 help(void) | |
24 { | |
25 fprintf(stderr, "usage: job-queue project tag\n"); | |
26 fprintf(stderr, " project-add name desc url script\n"); | |
27 fprintf(stderr, " project-list\n"); | |
28 fprintf(stderr, " worker-add name desc\n"); | |
29 fprintf(stderr, " worker-list\n"); | |
30 exit(0); | |
31 } | |
32 | |
33 static struct req | |
34 cmd_job_queue(int argc, char **argv) | |
35 { | |
36 if (argc < 2) | |
37 usage(); | |
38 | |
39 return req_job_queue(argv[0], argv[1]); | |
40 } | |
41 | |
42 static struct req | |
43 cmd_project_add(int argc, char **argv) | |
44 { | |
45 struct project pc; | |
46 | |
47 if (argc < 4) | |
48 usage(); | |
49 | |
50 memset(&pc, 0, sizeof (pc)); | |
51 strlcpy(pc.name, argv[0], sizeof (pc.name)); | |
52 strlcpy(pc.desc, argv[1], sizeof (pc.desc)); | |
53 strlcpy(pc.url, argv[2], sizeof (pc.url)); | |
54 strlcpy(pc.script, argv[3], sizeof (pc.script)); | |
55 | |
56 return req_project_add(&pc); | |
57 } | |
58 | |
59 static struct req | |
60 cmd_project_list(int argc, char **argv) | |
61 { | |
62 (void)argc; | |
63 (void)argv; | |
64 | |
65 struct project pc[SCI_PROJECT_MAX]; | |
66 struct req req; | |
67 size_t pcsz = UTIL_SIZE(pc); | |
68 | |
69 memset(pc, 0, sizeof (pc)); | |
70 | |
71 if ((req = req_project_list(pc, &pcsz)).status) | |
72 return req; | |
73 | |
74 for (size_t i = 0; i < pcsz; ++i) { | |
75 printf("%-16s%s\n", "name:", pc[i].name); | |
76 printf("%-16s%s\n", "description:", pc[i].desc); | |
77 printf("%-16s%s\n", "url:", pc[i].url); | |
78 printf("%-16s%s\n", "script:", pc[i].script); | |
79 | |
80 if (i + 1 < pcsz) | |
81 printf("\n"); | |
82 } | |
83 | |
84 return req; | |
85 } | |
86 | |
87 static struct req | |
88 cmd_worker_add(int argc, char **argv) | |
89 { | |
90 struct worker wk; | |
91 | |
92 if (argc < 2) | |
93 usage(); | |
94 | |
95 memset(&wk, 0, sizeof (wk)); | |
96 strlcpy(wk.name, argv[0], sizeof (wk.name)); | |
97 strlcpy(wk.desc, argv[1], sizeof (wk.desc)); | |
98 | |
99 return req_worker_add(&wk); | |
100 } | |
101 | |
102 static struct req | |
103 cmd_worker_list(int argc, char **argv) | |
104 { | |
105 (void)argc; | |
106 (void)argv; | |
107 | |
108 struct worker wk[SCI_WORKER_MAX]; | |
109 struct req req; | |
110 size_t wksz = UTIL_SIZE(wk); | |
111 | |
112 if ((req = req_worker_list(wk, &wksz)).status) | |
113 return req; | |
114 | |
115 for (size_t i = 0; i < wksz; ++i) { | |
116 printf("%-16s%s\n", "name:", wk[i].name); | |
117 printf("%-16s%s\n", "description:", wk[i].desc); | |
118 | |
119 if (i + 1 < wksz) | |
120 printf("\n"); | |
121 } | |
122 | |
123 return req; | |
124 } | |
125 | |
126 static struct { | |
127 const char *name; | |
128 struct req (*exec)(int, char **); | |
129 } commands[] = { | |
130 { "job-queue", cmd_job_queue }, | |
131 { "project-add", cmd_project_add }, | |
132 { "project-list", cmd_project_list }, | |
133 { "worker-add", cmd_worker_add }, | |
134 { "worker-list", cmd_worker_list }, | |
135 { NULL, NULL } | |
136 }; | |
137 | |
138 int | |
139 main(int argc, char **argv) | |
140 { | |
141 const char *sock = VARDIR "/run/sci.sock"; | |
142 int ch; | |
143 | |
144 setprogname("scictl"); | |
145 | |
146 while ((ch = getopt(argc, argv, "s:")) != -1) { | |
147 switch (ch) { | |
148 case 's': | |
149 sock = optarg; | |
150 break; | |
151 default: | |
152 break; | |
153 } | |
154 } | |
155 | |
156 argc -= optind; | |
157 argv += optind; | |
158 | |
159 if (argc <= 0) | |
160 usage(); | |
161 if (strcmp(argv[0], "help") == 0) | |
162 help(); | |
163 if (req_connect(sock) < 0) | |
164 err(1, "%s", sock); | |
165 | |
166 for (size_t i = 0; commands[i].name; ++i) { | |
167 struct req res; | |
168 | |
169 if (strcmp(commands[i].name, argv[0]) == 0) { | |
170 res = commands[i].exec(--argc, ++argv); | |
171 | |
172 if (res.status) | |
173 warnx("%s", res.msg); | |
174 | |
175 break; | |
176 } | |
177 } | |
178 | |
179 req_finish(); | |
180 } |