comparison scictl.c @ 2:5fa3d2f479b2

sci: initial upload support
author David Demelier <markand@malikania.fr>
date Thu, 10 Jun 2021 10:39:21 +0200
parents 5afdb14df924
children 215c0c3b3609
comparison
equal deleted inserted replaced
1:5afdb14df924 2:5fa3d2f479b2
22 22
23 noreturn static void 23 noreturn static void
24 help(void) 24 help(void)
25 { 25 {
26 fprintf(stderr, "usage: %s job-queue project tag\n", getprogname()); 26 fprintf(stderr, "usage: %s job-queue project tag\n", getprogname());
27 fprintf(stderr, " %s job-list project\n", getprogname()); 27 fprintf(stderr, " %s job-list worker\n", getprogname());
28 fprintf(stderr, " %s job-save id worker status retcode console\n", getprogname()); 28 fprintf(stderr, " %s job-save id worker status retcode console\n", getprogname());
29 fprintf(stderr, " %s project-add name desc url script\n", getprogname()); 29 fprintf(stderr, " %s project-add name desc url script\n", getprogname());
30 fprintf(stderr, " %s project-list\n", getprogname()); 30 fprintf(stderr, " %s project-list\n", getprogname());
31 fprintf(stderr, " %s script-get project\n", getprogname());
31 fprintf(stderr, " %s worker-add name desc\n", getprogname()); 32 fprintf(stderr, " %s worker-add name desc\n", getprogname());
32 fprintf(stderr, " %s worker-list\n", getprogname()); 33 fprintf(stderr, " %s worker-list\n", getprogname());
33 exit(0); 34 exit(0);
34 } 35 }
35 36
37 static char *
38 readfile(const char *path)
39 {
40 FILE *fp, *str;
41 static char console[SCI_MSG_MAX];
42 char buf[BUFSIZ], *ret = console;
43 size_t nr;
44
45 if (strcmp(path, "-") == 0)
46 fp = stdin;
47 else if (!(fp = fopen(path, "r")))
48 err(1, "%s", path);
49
50 if (!(str = fmemopen(console, sizeof (console), "w")))
51 err(1, "fmemopen");
52
53 while ((nr = fread(buf, 1, sizeof (buf), fp)) > 0)
54 fwrite(buf, 1, nr, str);
55
56 if ((ferror(fp) && !feof(fp)) || (ferror(str) && !feof(str)))
57 ret = NULL;
58
59 fclose(str);
60 fclose(fp);
61
62 return ret;
63 }
64
36 static struct req 65 static struct req
37 cmd_job_queue(int argc, char **argv) 66 cmd_job_queue(int argc, char **argv)
38 { 67 {
68 struct job job = {0};
69
39 if (argc < 2) 70 if (argc < 2)
40 usage(); 71 usage();
41 72
42 return req_job_queue(argv[0], argv[1]); 73 strlcpy(job.project.name, argv[0], sizeof (job.project.name));
74 strlcpy(job.tag, argv[1], sizeof (job.tag));
75
76 return req_job_queue(&job);
43 } 77 }
44 78
45 static struct req 79 static struct req
46 cmd_job_list(int argc, char **argv) 80 cmd_job_list(int argc, char **argv)
47 { 81 {
53 usage(); 87 usage();
54 88
55 if ((req = req_job_list(jobs, &jobsz, argv[0])).status) 89 if ((req = req_job_list(jobs, &jobsz, argv[0])).status)
56 return req; 90 return req;
57 91
58 printf("%-16s%-16s%-16s%s\n", "ID", "TAG", "PROJECT", "WORKER"); 92 printf("%-16s%-16s%s\n", "ID", "TAG", "PROJECT");
59 93
60 for (size_t i = 0; i < jobsz; ++i) { 94 for (size_t i = 0; i < jobsz; ++i) {
61 printf("%-16lld%-16s%-16s%s\n", (long long int)jobs[i].job.id, 95 printf("%-16lld%-16s%s\n", (long long int)jobs[i].job.id,
62 jobs[i].job.tag, jobs[i].job.project.name, jobs[i].worker.name); 96 jobs[i].job.tag, jobs[i].job.project.name);
63 } 97 }
64 98
65 return req; 99 return req;
66 } 100 }
67 101
68 static struct req 102 static struct req
69 cmd_job_save(int argc, char **argv) 103 cmd_job_save(int argc, char **argv)
70 { 104 {
105 struct job_result res = {0};
106
71 if (argc < 5) 107 if (argc < 5)
72 usage(); 108 usage();
73 109
74 return req_job_save(argv[0], argv[1], argv[2], argv[3], argv[4]); 110 res.job.id = strtoll(argv[0], NULL, 10);
111 res.status = strtoll(argv[2], NULL, 10);
112 res.retcode = strtoll(argv[3], NULL, 10);
113 res.console = readfile(argv[4]);
114 strlcpy(res.worker.name, argv[1], sizeof (res.worker.name));
115
116 return req_job_save(&res);
75 } 117 }
76 118
77 static struct req 119 static struct req
78 cmd_project_add(int argc, char **argv) 120 cmd_project_add(int argc, char **argv)
79 { 121 {
109 printf("%-16s%-24s%-20s%s\n", "NAME", "DESCRIPTION", "URL", "SCRIPT"); 151 printf("%-16s%-24s%-20s%s\n", "NAME", "DESCRIPTION", "URL", "SCRIPT");
110 152
111 for (size_t i = 0; i < pcsz; ++i) 153 for (size_t i = 0; i < pcsz; ++i)
112 printf("%-16s%-24s%-20s%s\n", pc[i].name, pc[i].desc, 154 printf("%-16s%-24s%-20s%s\n", pc[i].name, pc[i].desc,
113 pc[i].url, pc[i].script); 155 pc[i].url, pc[i].script);
156
157 return req;
158 }
159
160 static struct req
161 cmd_script_get(int argc, char **argv)
162 {
163 char script[SCI_MSG_MAX];
164 struct req req;
165
166 if (argc < 1)
167 usage();
168 if ((req = req_script_get(argv[0], script, sizeof (script))).status)
169 return req;
170
171 printf("%s", script);
172
173 /*
174 * Don't break up the terminal output if the script does not contain a
175 * final new line.
176 */
177 if (script[strlen(script) - 1] != '\n')
178 printf("\n");
114 179
115 return req; 180 return req;
116 } 181 }
117 182
118 static struct req 183 static struct req
158 { "job-queue", cmd_job_queue }, 223 { "job-queue", cmd_job_queue },
159 { "job-list", cmd_job_list }, 224 { "job-list", cmd_job_list },
160 { "job-save", cmd_job_save }, 225 { "job-save", cmd_job_save },
161 { "project-add", cmd_project_add }, 226 { "project-add", cmd_project_add },
162 { "project-list", cmd_project_list }, 227 { "project-list", cmd_project_list },
228 { "script-get", cmd_script_get },
163 { "worker-add", cmd_worker_add }, 229 { "worker-add", cmd_worker_add },
164 { "worker-list", cmd_worker_list }, 230 { "worker-list", cmd_worker_list },
165 { NULL, NULL } 231 { NULL, NULL }
166 }; 232 };
167 233