29 #include <sys/types.h>
39 #define LAR_STATE_STOPPED 0
40 #define LAR_STATE_PAUSED 1
41 #define LAR_STATE_STARTING 2
42 #define LAR_STATE_RUNNING 3
43 #define LAR_STATE_LOAD 4
44 #define LAR_STATE_LOADING 5
45 #define LAR_STATE_NEXT 6
47 extern INT EXPRT
ss_system(
const char *command);
63 printf(
"\nSYNTAX: lemAutoRunFE [-h host] [-e experiment] [-D] |");
64 printf(
"\n [--help] |");
65 printf(
"\n frontend autorun handler for the LEM experiment.");
66 printf(
"\n host: host on which the experiment is running.");
67 printf(
"\n experiment: name of the MIDAS experiment.");
68 printf(
"\n -D: becoming a daemon.");
69 printf(
"\n --help: prints this help.");
88 int lar_strip(
char *str,
char *result,
size_t result_size)
91 unsigned int ws_start, ws_end;
95 for (
unsigned int i=0; i<strlen(str); i++) {
96 if (isspace(str[i])) {
104 ws_end = strlen(str)-1;
105 for (
unsigned int i=strlen(str)-1; i>=0; i--) {
106 if (isspace(str[i])) {
114 for (
unsigned int i=ws_start; i<ws_end; i++) {
120 if (ws_end-ws_start+1 > result_size) {
126 for (
unsigned int i=ws_start; i<=ws_end; i++) {
127 result[j++] = str[i];
142 char seqName[64], seqNameStripped[64];
144 status = db_find_key(hDB, 0,
"/AutoRun/Auto Run Sequence", &hKey);
145 if (status != DB_SUCCESS) {
149 size =
sizeof(seqName);
150 status = db_get_data(hDB, hKey, seqName, &size, TID_STRING);
151 if (status != DB_SUCCESS) {
155 status =
lar_strip(seqName, seqNameStripped,
sizeof(seqNameStripped));
159 if (!strcmp(seqNameStripped,
"none"))
177 if (strlen(a) > strlen(b))
182 for (i=0; i<len; i++) {
205 char str[NAME_LENGTH];
206 int found_autorun = 0;
209 status = db_find_key(hDB, 0,
"/System/Clients", &hKey);
210 if (status != DB_SUCCESS) {
217 if (db_enum_key(hDB, hKey, i, &subKey) == DB_NO_MORE_SUBKEYS)
222 status = db_get_value(hDB, subKey,
"Name", str, &size, TID_STRING, FALSE);
224 if (status != DB_SUCCESS) {
229 if (!strcmp(str,
"lemAutoRun1")) {
235 return found_autorun;
257 status =
lar_strip((
char *)autoRunSeq, larseq,
sizeof(larseq));
259 snprintf(cmd,
sizeof(cmd),
"Sequence name: '%s' contains 'illegal' characters.", (
char*)autoRunSeq);
260 al_trigger_alarm(
"lemAutoRunFE", cmd,
"Warning", cmd, AT_INTERNAL);
262 db_set_data(hDB, hKey, str,
sizeof(str), 1, TID_STRING);
266 if (strlen(larseq) == 0) {
268 db_set_data(hDB, hKey, str,
sizeof(str), 1, TID_STRING);
279 char nextAutoRun[1024];
291 status =
lar_strip((
char*)next, nextAutoRun,
sizeof(nextAutoRun));
293 snprintf(cmd,
sizeof(cmd),
"Next autorun name: '%s' contains 'illegal' characters.", (
char*)next);
294 al_trigger_alarm(
"lemAutoRunFE", cmd,
"Warning", cmd, AT_INTERNAL);
296 db_set_data(hDB, hKey, str,
sizeof(str), 1, TID_STRING);
301 if (!strcmp(nextAutoRun,
"none")) {
306 memset(cmd,
'\0',
sizeof(cmd));
307 sprintf(cmd,
"/home/nemu/autoRun/%s", nextAutoRun);
308 strcpy(nextAutoRun, cmd);
311 if (strlen(nextAutoRun) == 0) {
313 db_set_data(hDB, hKey, str,
sizeof(str), 1, TID_STRING);
319 snprintf(cmd,
sizeof(cmd),
"Next autorun name can only by set if a Sequence is set.");
320 al_trigger_alarm(
"lemAutoRunFE", cmd,
"Warning", cmd, AT_INTERNAL);
322 db_set_data(hDB, hKey, str,
sizeof(str), 1, TID_STRING);
327 memset(cmd,
'\0',
sizeof(cmd));
328 char *path = getenv(
"MIDAS_PREFIX");
329 snprintf(cmd,
sizeof(cmd),
"%s/bin/lemAutoRun_validate %s", path, nextAutoRun);
330 status = system(cmd);
334 cm_msg(MERROR,
"lemAutoRunFE",
"lemAutoRunFE Next error (errno=%d): err_msg: '%s'", errno, strerror(errno));
336 snprintf(cmd,
sizeof(cmd),
"Next autorun '%s' is invalid (status=%d)! Fix it first! Will set it to 'none' for now.", nextAutoRun, status);
337 al_trigger_alarm(
"lemAutoRunFE", cmd,
"Warning", cmd, AT_INTERNAL);
339 db_set_data(hDB, hKey, str,
sizeof(str), 1, TID_STRING);
347 int main(
int argc,
char *argv[])
352 char host[256], exp[256];
357 char nextAutoRun[64];
362 int autorun_present = 0;
365 memset(host, 0,
sizeof(host));
366 memset(exp, 0,
sizeof(exp));
367 cm_get_environment(host,
sizeof(host), exp,
sizeof(exp));
375 if (!strcmp(argv[1],
"-D"))
381 if (!strcmp(argv[1],
"-h"))
382 strcpy(host, argv[2]);
383 else if (!strcmp(argv[1],
"-e"))
384 strcpy(exp, argv[2]);
385 else if (!strcmp(argv[1],
"-D"))
391 if ((!strcmp(argv[1],
"-h") || !strcmp(argv[1],
"-e")) &&
392 (!strcmp(argv[3],
"-D"))) {
393 if (!strcmp(argv[3],
"-D"))
395 if (!strcmp(argv[1],
"-h"))
396 strcpy(host, argv[2]);
398 strcpy(exp, argv[2]);
404 if (!strcmp(argv[1],
"-h") && !strcmp(argv[3],
"-e")) {
405 strcpy(host, argv[2]);
406 strcpy(exp, argv[4]);
407 }
else if (!strcmp(argv[3],
"-h") && !strcmp(argv[1],
"-e")) {
408 strcpy(host, argv[4]);
409 strcpy(exp, argv[2]);
415 if (!strcmp(argv[5],
"-D")) {
417 if (!strcmp(argv[1],
"-h") || !strcmp(argv[3],
"-e")) {
418 strcpy(host, argv[2]);
419 strcpy(exp, argv[4]);
420 }
else if (!strcmp(argv[3],
"-h") || !strcmp(argv[1],
"-e")) {
421 strcpy(host, argv[4]);
422 strcpy(exp, argv[2]);
441 printf(
"Becoming a daemon...\n");
444 printf(
"\nlemAutoRunFE running ...\n");
445 printf(
"\n>> terminate from web-page, ODB, or CTRL-C\n\n");
449 status = cm_connect_experiment(host, exp,
"lemAutoRunFE", NULL);
450 if (status != CM_SUCCESS) {
451 cm_msg(MERROR,
"lemAutoRunFE",
"Couldn't register with MIDAS, will quit. status = %d", status);
459 cm_get_experiment_database(&hDB, NULL);
462 cm_start_watchdog_thread();
466 cm_get_watchdog_params(&call_watchdog, NULL);
467 cm_set_watchdog_params(call_watchdog, 60000);
469 rpc_set_option(-1, RPC_OTIMEOUT, 120000);
472 status = db_find_key(hDB, 0,
"/AutoRun/Auto Run Sequence", &hKey);
473 if (status != DB_SUCCESS) {
474 cm_msg(MERROR,
"lemAutoRunFE",
"Coulnd't get the ODB key for /AutoRun/Auto Run Sequence, will quit.");
475 cm_disconnect_experiment();
482 status = db_find_key(hDB, 0,
"/AutoRun/Run State", &hKey);
483 if (status != DB_SUCCESS) {
484 cm_msg(MERROR,
"lemAutoRunFE",
"Coulnd't get the ODB key for /AutoRun/Run State, will quit.");
485 cm_disconnect_experiment();
490 status = db_find_key(hDB, 0,
"/AutoRun/Next", &hKey);
491 if (status != DB_SUCCESS) {
492 cm_msg(MERROR,
"lemAutoRunFE",
"Coulnd't get the ODB key for /AutoRun/Next, will quit.");
493 cm_disconnect_experiment();
497 db_open_record(hDB, hKey, (
void*)&nextAutoRun,
sizeof(nextAutoRun), MODE_READ, &
lar_check_next_autorun, (
void*)&nextAutoRun);
501 size =
sizeof(run_state);
502 status = db_get_value(hDB, 0,
"/AutoRun/Run State", (
void*)&run_state, &size, TID_INT, 0);
503 if (status != DB_SUCCESS) {
504 cm_msg(MERROR,
"lemAutoRunFE",
"Couldn't get the LEM autorun state, will quit.");
505 cm_disconnect_experiment();
514 if (autorun_present < 0) {
515 cm_msg(MERROR,
"lemAutoRunFE",
"Couldn't get check clients, will quit.");
516 cm_disconnect_experiment();
520 if (autorun_present == 0) {
521 if (strlen(host) == 0)
522 sprintf(cmd,
"lemAutoRun -e %s -D", exp);
524 sprintf(cmd,
"lemAutoRun -h %s -e %s -D", host, exp);
525 cm_msg(MINFO,
"lemAutoRunFE",
"lemAutoRunFE: Will start autorun via '%s'", cmd);
529 status = db_find_key(hDB, 0,
"/AutoRun/Run State", &hKey);
530 if (status != DB_SUCCESS) {
531 cm_msg(MERROR,
"lemAutoRunFE",
"Coulnd't get the ODB key for /AutoRun/Run State, will quit.");
532 cm_disconnect_experiment();
540 db_set_data(hDB, hKey, &val,
sizeof(val), 1, TID_INT);
547 status = db_find_key(hDB, 0,
"System/Clients", &hKey);
548 if (status != DB_SUCCESS) {
549 cm_msg(MERROR,
"lemAutoRunFE",
"cannot find System/Clients entry in ODB.");
552 if (autorun_present) {
553 strncpy(str,
"lemAutoRun",
sizeof(str));
554 cm_msg(MINFO,
"lemAutoRunFE",
"lemAutoRunFE: will shutdown '%s'", str);
555 cm_shutdown(str, FALSE);
562 status = db_find_key(hDB, 0,
"/AutoRun/Next", &hKey);
563 if (status != DB_SUCCESS) {
564 cm_msg(MERROR,
"lemAutoRunFE",
"cannot find '/AutoRun/Next' entry in ODB.");
567 size =
sizeof(nextFln);
568 status = db_get_data(hDB, hKey, nextFln, &size, TID_STRING);
569 if (status == DB_SUCCESS) {
570 if (strcmp(nextFln,
"none")) {
572 status = db_find_key(hDB, 0,
"/AutoRun/Auto Run Sequence", &hKey2);
573 if (status != DB_SUCCESS) {
574 cm_msg(MERROR,
"lemAutoRunFE",
"cannot find '/AutoRun/Auto Run Sequence' entry in ODB.");
576 cm_msg(MINFO,
"lemAutoRunFE",
"will start NEXT autorun %s soon.", nextFln);
577 db_set_data(hDB, hKey2, nextFln,
sizeof(nextFln), 1, TID_STRING);
578 strcpy(nextFln,
"none");
579 db_set_data(hDB, hKey, nextFln,
sizeof(nextFln), 1, TID_STRING);
582 status = db_find_key(hDB, 0,
"/AutoRun/Run State", &hKey);
583 if (status != DB_SUCCESS)
584 cm_msg(MERROR,
"lemAutoRunFE",
"cannot get '/AutoRun/Run State' entry in ODB. Unlikely that NEXT autorun will start.");
586 db_set_data(hDB, hKey, &val,
sizeof(val), 1, TID_INT);
590 cm_msg(MERROR,
"lemAutoRunFE",
"couldn't read /AutoRun/Next.");
596 status = cm_yield(1000);
597 if ((status == RPC_SHUTDOWN) || (status == SS_ABORT)) {
604 size =
sizeof(run_state);
605 status = db_get_value(hDB, 0,
"/AutoRun/Run State", (
void*)&run_state, &size, TID_INT, 0);
606 if (status != DB_SUCCESS) {
607 cm_msg(MERROR,
"lemAutoRunFE",
"Couldn't get the LEM autorun state, will quit.");
608 cm_disconnect_experiment();
613 for (i=0; i<5; i++) {
614 status = cm_yield(100);
621 status = db_find_key(hDB, 0,
"/AutoRun/Run State", &hKey);
622 if (status != DB_SUCCESS) {
623 cm_msg(MERROR,
"lemAutoRunFE",
"Couldn't get the ODB key for /AutoRun/Run State, will quit.");
624 cm_disconnect_experiment();
628 db_set_data(hDB, hKey, &val,
sizeof(val), 1, TID_INT);
631 for (i=0; i<5; i++) {
632 status = cm_yield(100);
635 cm_msg(MINFO,
"lemAutoRunFE",
"lemAutoRunFE: Will stop lemAutoRun as well...");
636 cm_shutdown(
"lemAutoRun", TRUE);
639 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)