29 #include <sys/types.h> 40 #define LAR_STATE_STOPPED 0 41 #define LAR_STATE_PAUSED 1 42 #define LAR_STATE_STARTING 2 43 #define LAR_STATE_RUNNING 3 44 #define LAR_STATE_LOAD 4 45 #define LAR_STATE_LOADING 5 46 #define LAR_STATE_NEXT 6 48 extern INT EXPRT
ss_system(
const char *command);
64 printf(
"\nSYNTAX: lemAutoRunFE [-h host] [-e experiment] [-D] |");
65 printf(
"\n [--help] |");
66 printf(
"\n frontend autorun handler for the LEM experiment.");
67 printf(
"\n host: host on which the experiment is running.");
68 printf(
"\n experiment: name of the MIDAS experiment.");
69 printf(
"\n -D: becoming a daemon.");
70 printf(
"\n --help: prints this help.");
89 int lar_strip(
char *str,
char *result,
size_t result_size)
92 unsigned int ws_start, ws_end;
96 for (
unsigned int i=0; i<strlen(str); i++) {
97 if (isspace(str[i])) {
105 ws_end = strlen(str)-1;
106 for (
unsigned int i=strlen(str)-1; i>=0; i--) {
107 if (isspace(str[i])) {
115 for (
unsigned int i=ws_start; i<ws_end; i++) {
121 if (ws_end-ws_start+1 > result_size) {
127 for (
unsigned int i=ws_start; i<=ws_end; i++) {
128 result[j++] = str[i];
143 char seqName[64], seqNameStripped[64];
145 status = db_find_key(hDB, 0,
"/AutoRun/Auto Run Sequence", &hKey);
146 if (status != DB_SUCCESS) {
150 size =
sizeof(seqName);
151 status = db_get_data(hDB, hKey, seqName, &size, TID_STRING);
152 if (status != DB_SUCCESS) {
156 status =
lar_strip(seqName, seqNameStripped,
sizeof(seqNameStripped));
160 if (!strcmp(seqNameStripped,
"none"))
178 if (strlen(a) > strlen(b))
183 for (i=0; i<len; i++) {
206 char str[NAME_LENGTH];
207 int found_autorun = 0;
210 status = db_find_key(hDB, 0,
"/System/Clients", &hKey);
211 if (status != DB_SUCCESS) {
218 if (db_enum_key(hDB, hKey, i, &subKey) == DB_NO_MORE_SUBKEYS)
223 status = db_get_value(hDB, subKey,
"Name", str, &size, TID_STRING, FALSE);
225 if (status != DB_SUCCESS) {
230 if (!strcmp(str,
"lemAutoRun1")) {
236 return found_autorun;
258 status =
lar_strip((
char *)autoRunSeq, larseq,
sizeof(larseq));
260 snprintf(cmd,
sizeof(cmd),
"Sequence name: '%s' contains 'illegal' characters.", (
char*)autoRunSeq);
261 al_trigger_alarm(
"lemAutoRunFE", cmd,
"Warning", cmd, AT_INTERNAL);
263 db_set_data(hDB, hKey, str,
sizeof(str), 1, TID_STRING);
267 if (strlen(larseq) == 0) {
269 db_set_data(hDB, hKey, str,
sizeof(str), 1, TID_STRING);
280 char nextAutoRun[1024];
292 status =
lar_strip((
char*)next, nextAutoRun,
sizeof(nextAutoRun));
294 snprintf(cmd,
sizeof(cmd),
"Next autorun name: '%s' contains 'illegal' characters.", (
char*)next);
295 al_trigger_alarm(
"lemAutoRunFE", cmd,
"Warning", cmd, AT_INTERNAL);
297 db_set_data(hDB, hKey, str,
sizeof(str), 1, TID_STRING);
302 if (!strcmp(nextAutoRun,
"none")) {
307 memset(cmd,
'\0',
sizeof(cmd));
308 sprintf(cmd,
"/home/nemu/autoRun/%s", nextAutoRun);
309 strcpy(nextAutoRun, cmd);
312 if (strlen(nextAutoRun) == 0) {
314 db_set_data(hDB, hKey, str,
sizeof(str), 1, TID_STRING);
320 snprintf(cmd,
sizeof(cmd),
"Next autorun name can only by set if a Sequence is set.");
321 al_trigger_alarm(
"lemAutoRunFE", cmd,
"Warning", cmd, AT_INTERNAL);
323 db_set_data(hDB, hKey, str,
sizeof(str), 1, TID_STRING);
328 memset(cmd,
'\0',
sizeof(cmd));
329 char *path = getenv(
"MIDAS_PREFIX");
330 snprintf(cmd,
sizeof(cmd),
"%s/bin/lemAutoRun_validate", path);
334 execl(cmd, cmd, nextAutoRun, NULL);
337 if ( WIFEXITED(status) ) {
338 int ret = WEXITSTATUS(status);
340 snprintf(cmd,
sizeof(cmd),
"Next autorun '%s' is invalid (status=%d)! Fix it first! Will set it to 'none' for now.", nextAutoRun, ret);
341 al_trigger_alarm(
"lemAutoRunFE", cmd,
"Warning", cmd, AT_INTERNAL);
343 db_set_data(hDB, hKey, str,
sizeof(str), 1, TID_STRING);
346 snprintf(cmd,
sizeof(cmd),
"Couldn't get exit status of next autorun validation for '%s'! Please try again! Will set it to 'none' for now.", nextAutoRun);
347 al_trigger_alarm(
"lemAutoRunFE", cmd,
"Warning", cmd, AT_INTERNAL);
349 db_set_data(hDB, hKey, str,
sizeof(str), 1, TID_STRING);
358 int main(
int argc,
char *argv[])
363 char host[256], exp[256];
368 char nextAutoRun[64];
373 int autorun_present = 0;
376 memset(host, 0,
sizeof(host));
377 memset(exp, 0,
sizeof(exp));
378 cm_get_environment(host,
sizeof(host), exp,
sizeof(exp));
386 if (!strcmp(argv[1],
"-D"))
392 if (!strcmp(argv[1],
"-h"))
393 strcpy(host, argv[2]);
394 else if (!strcmp(argv[1],
"-e"))
395 strcpy(exp, argv[2]);
396 else if (!strcmp(argv[1],
"-D"))
402 if ((!strcmp(argv[1],
"-h") || !strcmp(argv[1],
"-e")) &&
403 (!strcmp(argv[3],
"-D"))) {
404 if (!strcmp(argv[3],
"-D"))
406 if (!strcmp(argv[1],
"-h"))
407 strcpy(host, argv[2]);
409 strcpy(exp, argv[2]);
415 if (!strcmp(argv[1],
"-h") && !strcmp(argv[3],
"-e")) {
416 strcpy(host, argv[2]);
417 strcpy(exp, argv[4]);
418 }
else if (!strcmp(argv[3],
"-h") && !strcmp(argv[1],
"-e")) {
419 strcpy(host, argv[4]);
420 strcpy(exp, argv[2]);
426 if (!strcmp(argv[5],
"-D")) {
428 if (!strcmp(argv[1],
"-h") || !strcmp(argv[3],
"-e")) {
429 strcpy(host, argv[2]);
430 strcpy(exp, argv[4]);
431 }
else if (!strcmp(argv[3],
"-h") || !strcmp(argv[1],
"-e")) {
432 strcpy(host, argv[4]);
433 strcpy(exp, argv[2]);
452 printf(
"Becoming a daemon...\n");
455 printf(
"\nlemAutoRunFE running ...\n");
456 printf(
"\n>> terminate from web-page, ODB, or CTRL-C\n\n");
460 status = cm_connect_experiment(host, exp,
"lemAutoRunFE", NULL);
461 if (status != CM_SUCCESS) {
462 cm_msg(MERROR,
"lemAutoRunFE",
"Couldn't register with MIDAS, will quit. status = %d", status);
470 cm_get_experiment_database(&hDB, NULL);
473 cm_start_watchdog_thread();
477 cm_get_watchdog_params(&call_watchdog, NULL);
478 cm_set_watchdog_params(call_watchdog, 60000);
480 rpc_set_timeout(RPC_HNDLE_MSERVER, 120000, &val);
483 status = db_find_key(hDB, 0,
"/AutoRun/Auto Run Sequence", &hKey);
484 if (status != DB_SUCCESS) {
485 cm_msg(MERROR,
"lemAutoRunFE",
"Coulnd't get the ODB key for /AutoRun/Auto Run Sequence, will quit.");
486 cm_disconnect_experiment();
493 status = db_find_key(hDB, 0,
"/AutoRun/Run State", &hKey);
494 if (status != DB_SUCCESS) {
495 cm_msg(MERROR,
"lemAutoRunFE",
"Coulnd't get the ODB key for /AutoRun/Run State, will quit.");
496 cm_disconnect_experiment();
501 status = db_find_key(hDB, 0,
"/AutoRun/Next", &hKey);
502 if (status != DB_SUCCESS) {
503 cm_msg(MERROR,
"lemAutoRunFE",
"Coulnd't get the ODB key for /AutoRun/Next, will quit.");
504 cm_disconnect_experiment();
508 db_open_record(hDB, hKey, (
void*)&nextAutoRun,
sizeof(nextAutoRun), MODE_READ, &
lar_check_next_autorun, (
void*)&nextAutoRun);
512 size =
sizeof(run_state);
513 status = db_get_value(hDB, 0,
"/AutoRun/Run State", (
void*)&run_state, &size, TID_INT, 0);
514 if (status != DB_SUCCESS) {
515 cm_msg(MERROR,
"lemAutoRunFE",
"Couldn't get the LEM autorun state, will quit.");
516 cm_disconnect_experiment();
525 if (autorun_present < 0) {
526 cm_msg(MERROR,
"lemAutoRunFE",
"Couldn't get check clients, will quit.");
527 cm_disconnect_experiment();
531 if (autorun_present == 0) {
532 if (strlen(host) == 0)
533 sprintf(cmd,
"lemAutoRun -e %s -D", exp);
535 sprintf(cmd,
"lemAutoRun -h %s -e %s -D", host, exp);
536 cm_msg(MINFO,
"lemAutoRunFE",
"lemAutoRunFE: Will start autorun via '%s'", cmd);
540 status = db_find_key(hDB, 0,
"/AutoRun/Run State", &hKey);
541 if (status != DB_SUCCESS) {
542 cm_msg(MERROR,
"lemAutoRunFE",
"Coulnd't get the ODB key for /AutoRun/Run State, will quit.");
543 cm_disconnect_experiment();
551 db_set_data(hDB, hKey, &val,
sizeof(val), 1, TID_INT);
558 status = db_find_key(hDB, 0,
"System/Clients", &hKey);
559 if (status != DB_SUCCESS) {
560 cm_msg(MERROR,
"lemAutoRunFE",
"cannot find System/Clients entry in ODB.");
563 if (autorun_present) {
564 strncpy(str,
"lemAutoRun",
sizeof(str));
565 cm_msg(MINFO,
"lemAutoRunFE",
"lemAutoRunFE: will shutdown '%s'", str);
566 cm_shutdown(str, FALSE);
573 status = db_find_key(hDB, 0,
"/AutoRun/Next", &hKey);
574 if (status != DB_SUCCESS) {
575 cm_msg(MERROR,
"lemAutoRunFE",
"cannot find '/AutoRun/Next' entry in ODB.");
578 size =
sizeof(nextFln);
579 status = db_get_data(hDB, hKey, nextFln, &size, TID_STRING);
580 if (status == DB_SUCCESS) {
581 if (strcmp(nextFln,
"none")) {
583 status = db_find_key(hDB, 0,
"/AutoRun/Auto Run Sequence", &hKey2);
584 if (status != DB_SUCCESS) {
585 cm_msg(MERROR,
"lemAutoRunFE",
"cannot find '/AutoRun/Auto Run Sequence' entry in ODB.");
587 cm_msg(MINFO,
"lemAutoRunFE",
"will start NEXT autorun %s soon.", nextFln);
588 db_set_data(hDB, hKey2, nextFln,
sizeof(nextFln), 1, TID_STRING);
589 strcpy(nextFln,
"none");
590 db_set_data(hDB, hKey, nextFln,
sizeof(nextFln), 1, TID_STRING);
593 status = db_find_key(hDB, 0,
"/AutoRun/Run State", &hKey);
594 if (status != DB_SUCCESS)
595 cm_msg(MERROR,
"lemAutoRunFE",
"cannot get '/AutoRun/Run State' entry in ODB. Unlikely that NEXT autorun will start.");
597 db_set_data(hDB, hKey, &val,
sizeof(val), 1, TID_INT);
601 cm_msg(MERROR,
"lemAutoRunFE",
"couldn't read /AutoRun/Next.");
607 status = cm_yield(1000);
608 if ((status == RPC_SHUTDOWN) || (status == SS_ABORT)) {
615 size =
sizeof(run_state);
616 status = db_get_value(hDB, 0,
"/AutoRun/Run State", (
void*)&run_state, &size, TID_INT, 0);
617 if (status != DB_SUCCESS) {
618 cm_msg(MERROR,
"lemAutoRunFE",
"Couldn't get the LEM autorun state, will quit.");
619 cm_disconnect_experiment();
624 for (i=0; i<5; i++) {
625 status = cm_yield(100);
632 status = db_find_key(hDB, 0,
"/AutoRun/Run State", &hKey);
633 if (status != DB_SUCCESS) {
634 cm_msg(MERROR,
"lemAutoRunFE",
"Couldn't get the ODB key for /AutoRun/Run State, will quit.");
635 cm_disconnect_experiment();
639 db_set_data(hDB, hKey, &val,
sizeof(val), 1, TID_INT);
642 for (i=0; i<5; i++) {
643 status = cm_yield(100);
646 cm_msg(MINFO,
"lemAutoRunFE",
"lemAutoRunFE: Will stop lemAutoRun as well...");
647 cm_shutdown(
"lemAutoRun", TRUE);
650 cm_disconnect_experiment();
int lar_client_running(HNDLE hDB)
#define LAR_STATE_STARTING
void lar_check_auto_run_sequence(INT hDB, INT hKey, void *autoRunSeq)
#define LAR_STATE_LOADING
int lar_strip(char *str, char *result, size_t result_size)
INT ss_daemon_init(BOOL keep_stdout)
#define LAR_STATE_RUNNING
#define LAR_STATE_STOPPED
int lar_seq_name_check(HNDLE hDB)
int _done
termination flag for the main loop
int main(int argc, char *argv[])
void lar_check_next_autorun(INT hDB, INT hKey, void *next)
int lar_substr_eq(char *a, char *b)
void lar_fe_ctrlc_handler(int sig)
INT EXPRT ss_system(const char *command)