17 #include "nsm2/belle2nsm.h"
21 #include <readline/readline.h>
23 extern int add_history(
char*);
28 const char* master_logdir =
".";
29 FILE* master_logfp = 0;
37 static int logid = -1;
38 static char logprefix[1024];
39 static int isdirprefix = 0;
42 tm* cur = localtime(&now);
46 strcpy(logprefix, master_logdir);
47 if (! logprefix[0]) strcpy(logprefix,
".");
48 if (logprefix[strlen(logprefix) - 1] ==
'/') {
49 logprefix[strlen(logprefix) - 1] = 0;
51 if (stat(logprefix, &statbuf) >= 0 && S_ISDIR(statbuf.st_mode)) {
52 strcat(logprefix,
"/master");
56 sprintf(logfile,
"%s.%04d%02d%02d.log", logprefix,
57 cur->tm_year + 1900, cur->tm_mon + 1, cur->tm_mday);
58 if (master_logfp != stdout) {
59 if (master_logfp) fclose(master_logfp);
60 if (!(master_logfp = fopen(logfile,
"a"))) {
61 printf(
"cannot open logfile %s\n", logfile);
70 xprintlog(
const char* fmt, ...)
74 void xlogtime(
char* buf);
79 fputs(datebuf, master_logfp);
80 vfprintf(master_logfp, fmt, ap);
81 fputc(
'\n', master_logfp);
95 static int lastday = -1;
97 gettimeofday(&now, 0);
98 cur = localtime((time_t*)&now.tv_sec);
111 sprintf(buf,
"%02d:%02d:%02d.%03d ",
112 cur->tm_hour, cur->tm_min, cur->tm_sec, (
int)now.tv_usec / 1000);
116 xgetargs(
char* buf,
char* argv[])
118 int i, argc = 0, inword = 0, inquote = 0;
123 if (*(p + 1) ==
'n') {
124 memmove(p, p + 1, strlen(p));
127 memmove(p, p + 1, strlen(p));
129 }
else if (*p ==
'"') {
131 memmove(p, p + 1, strlen(p));
138 }
else if (isspace(*p) && !inquote && inword) {
141 }
else if (! isspace(*p) && !inword) {
148 if (inquote)
return -1;
157 xprintlog(
"OK received");
165 xprintlog(
"ERROR received");
174 xprintlog(
"MSG received");
180 main(
int argc,
char** argv)
182 const char* program = argv[0];
183 const char* nodename = argv[1];
184 const char myname[] =
"rfctl";
196 master_logfp = stdout;
204 if (! b2nsm_init(nodename)) {
205 xprintlog(
"%s: INIT %s", program, b2nsm_strerror());
208 xprintlog(
"%s: INIT", program);
209 b2nsm_logging(master_logfp);
212 if (b2nsm_callback(
"OK", ok_handler) < 0) {
213 xprintlog(
"%s: CALLBACK(OK) %s", program, b2nsm_strerror());
216 if (b2nsm_callback(
"ERROR", ok_handler) < 0) {
217 xprintlog(
"%s: CALLBACK(ERROR) %s", program, b2nsm_strerror());
227 prompt = (
char*)malloc(strlen(nodename) + 2);
228 strcpy(prompt, nodename);
239 if (input) free(input);
240 if (!(input = readline(prompt)))
242 buf = (
char*)malloc(strlen(input) + 1);
245 if (!prev || (*input && strcmp(prev, input) != 0)) {
247 if (prev) free(prev);
248 prev = (
char*)malloc(strlen(input) + 1);
252 static char buf[1024];
254 printf(
"%s", prompt);
256 fgets(buf,
sizeof(buf), stdin);
260 if ((ac = xgetargs(buf, av)) <= 0)
262 printf(
"ac=%d av[0]=%s\n", ac, av[0]);
264 if (strcasecmp(av[0],
"q") == 0 || strcasecmp(av[0],
"quit") == 0) {
266 }
else if (strcasecmp(av[0],
"start") == 0) {
267 if (ac < 4 || ! isdigit(av[2][0])) {
268 printf(
"usage: start <node> <exp-number> <run-number>\n");
271 pars[0] = atoi(av[2]);
272 pars[1] = atoi(av[3]);
273 b2nsm_sendreq(av[1],
"RC_START", 2, pars);
275 }
else if (strcasecmp(av[0],
"stop") == 0) {
277 printf(
"usage: start <node> <exp-number> <run-number>\n");
280 pars[0] = atoi(av[2]);
281 pars[1] = atoi(av[3]);
282 b2nsm_sendreq(av[1],
"RC_STOP", 2, pars);
284 }
else if (strcasecmp(av[0],
"config") == 0) {
286 printf(
"usage: config <node>\n");
290 strcpy(scrfile,
"run_processor.py");
291 b2nsm_sendany(av[1],
"RC_LOAD", 0, 0,
sizeof(scrfile) + 1, scrfile,
"sendreq");
293 }
else if (strcasecmp(av[0],
"unconfig") == 0) {
295 printf(
"usage: unconfig <node>\n");
297 b2nsm_sendreq(av[1],
"RC_ABORT", 0, 0);
299 }
else if (strcasecmp(av[0],
"restart") == 0) {
301 printf(
"usage: restart <node>\n");
303 b2nsm_sendreq(av[1],
"RC_RECOVER", 0, 0);
306 printf(
"unknown request %s\n", av[0]);