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 }