24 #include "nsm2/belle2nsm.h"
28 #include <readline/readline.h>
30 extern int add_history(
char*);
35 const char* master_logdir =
".";
36 FILE* master_logfp = 0;
44 static int logid = -1;
45 static char logprefix[1024];
46 static int isdirprefix = 0;
49 tm* cur = localtime(&now);
53 strcpy(logprefix, master_logdir);
54 if (! logprefix[0]) strcpy(logprefix,
".");
55 if (logprefix[strlen(logprefix) - 1] ==
'/') {
56 logprefix[strlen(logprefix) - 1] = 0;
58 if (stat(logprefix, &statbuf) >= 0 && S_ISDIR(statbuf.st_mode)) {
59 strcat(logprefix,
"/master");
63 sprintf(logfile,
"%s.%04d%02d%02d.log", logprefix,
64 cur->tm_year + 1900, cur->tm_mon + 1, cur->tm_mday);
65 if (master_logfp != stdout) {
66 if (master_logfp) fclose(master_logfp);
67 if (!(master_logfp = fopen(logfile,
"a"))) {
68 printf(
"cannot open logfile %s\n", logfile);
77 xprintlog(
const char* fmt, ...)
81 void xlogtime(
char* buf);
86 fputs(datebuf, master_logfp);
87 vfprintf(master_logfp, fmt, ap);
88 fputc(
'\n', master_logfp);
102 static int lastday = -1;
104 gettimeofday(&now, 0);
105 cur = localtime((time_t*)&now.tv_sec);
118 sprintf(buf,
"%02d:%02d:%02d.%03d ",
119 cur->tm_hour, cur->tm_min, cur->tm_sec, (
int)now.tv_usec / 1000);
123 xgetargs(
char* buf,
char* argv[])
125 int i, argc = 0, inword = 0, inquote = 0;
130 if (*(p + 1) ==
'n') {
131 memmove(p, p + 1, strlen(p));
134 memmove(p, p + 1, strlen(p));
136 }
else if (*p ==
'"') {
138 memmove(p, p + 1, strlen(p));
145 }
else if (isspace(*p) && !inquote && inword) {
148 }
else if (! isspace(*p) && !inword) {
155 if (inquote)
return -1;
164 xprintlog(
"OK received");
172 xprintlog(
"ERROR received");
181 xprintlog(
"MSG received");
187 main(
int argc,
char** argv)
189 const char* program = argv[0];
190 const char* nodename = argv[1];
191 const char myname[] =
"rfctl";
203 master_logfp = stdout;
211 if (! b2nsm_init(nodename)) {
212 xprintlog(
"%s: INIT %s", program, b2nsm_strerror());
215 xprintlog(
"%s: INIT", program);
216 b2nsm_logging(master_logfp);
219 if (b2nsm_callback(
"OK", ok_handler) < 0) {
220 xprintlog(
"%s: CALLBACK(OK) %s", program, b2nsm_strerror());
223 if (b2nsm_callback(
"ERROR", ok_handler) < 0) {
224 xprintlog(
"%s: CALLBACK(ERROR) %s", program, b2nsm_strerror());
234 prompt = (
char*)malloc(strlen(nodename) + 2);
235 strcpy(prompt, nodename);
246 if (input) free(input);
247 if (!(input = readline(prompt)))
249 buf = (
char*)malloc(strlen(input) + 1);
252 if (!prev || (*input && strcmp(prev, input) != 0)) {
254 if (prev) free(prev);
255 prev = (
char*)malloc(strlen(input) + 1);
259 static char buf[1024];
261 printf(
"%s", prompt);
263 fgets(buf,
sizeof(buf), stdin);
267 if ((ac = xgetargs(buf, av)) <= 0)
269 printf(
"ac=%d av[0]=%s\n", ac, av[0]);
271 if (strcasecmp(av[0],
"q") == 0 || strcasecmp(av[0],
"quit") == 0) {
273 }
else if (strcasecmp(av[0],
"start") == 0) {
274 if (ac < 4 || ! isdigit(av[2][0])) {
275 printf(
"usage: start <node> <exp-number> <run-number>\n");
278 pars[0] = atoi(av[2]);
279 pars[1] = atoi(av[3]);
280 b2nsm_sendreq(av[1],
"RC_START", 2, pars);
282 }
else if (strcasecmp(av[0],
"stop") == 0) {
284 printf(
"usage: start <node> <exp-number> <run-number>\n");
287 pars[0] = atoi(av[2]);
288 pars[1] = atoi(av[3]);
289 b2nsm_sendreq(av[1],
"RC_STOP", 2, pars);
291 }
else if (strcasecmp(av[0],
"config") == 0) {
293 printf(
"usage: config <node>\n");
297 strcpy(scrfile,
"run_processor.py");
298 b2nsm_sendany(av[1],
"RC_LOAD", 0, 0,
sizeof(scrfile) + 1, scrfile,
"sendreq");
300 }
else if (strcasecmp(av[0],
"unconfig") == 0) {
302 printf(
"usage: unconfig <node>\n");
304 b2nsm_sendreq(av[1],
"RC_ABORT", 0, 0);
306 }
else if (strcasecmp(av[0],
"restart") == 0) {
308 printf(
"usage: restart <node>\n");
310 b2nsm_sendreq(av[1],
"RC_RECOVER", 0, 0);
313 printf(
"unknown request %s\n", av[0]);
int main(int argc, char **argv)
Run all tests.