static void cl_coredump_signal_handler(int nsig) { return_to_orig_privs(); if (geteuid() == 0) { /* Put ALL privileges back to root... */ if (setuid(0) < 0) { cl_perror("cl_coredump_signal_handler: unable to setuid(0)"); } } cl_untaint_coredumps(); /* Do the best we know how to do... */ CL_SIGNAL(nsig, SIG_DFL); kill(getpid(), nsig); }
/* Cluster logging function */ void cl_direct_log(int priority, const char* buf, gboolean use_priority_str, const char* entity, int entity_pid, TIME_T ts) { const char * pristr; int needprivs = !cl_have_full_privs(); if (entity == NULL){ entity =cl_log_entity; } pristr = use_priority_str ? prio2str(priority) : NULL; if (needprivs) { return_to_orig_privs(); } if (syslog_enabled) { if (entity) { strncpy(common_log_entity, entity, MAXENTITY); } else { strncpy(common_log_entity, DFLT_ENTITY,MAXENTITY); } common_log_entity[MAXENTITY-1] = '\0'; if (pristr) { syslog(priority, "[%d]: %s: %s%c", entity_pid, pristr, buf, 0); }else { syslog(priority, "[%d]: %s%c", entity_pid, buf, 0); } } if (debugfile_name != NULL) { append_log(debugfile_name,entity,entity_pid,ts,pristr,buf); } if (priority != LOG_DEBUG && logfile_name != NULL) { append_log(logfile_name,entity,entity_pid,ts,pristr,buf); } if (needprivs) { return_to_dropped_privs(); } return; }
int crmd_init(void) { int exit_code = 0; enum crmd_fsa_state state; fsa_state = S_STARTING; fsa_input_register = 0; /* zero out the regester */ init_dotfile(); crm_info("Starting %s", crm_system_name); register_fsa_input(C_STARTUP, I_STARTUP, NULL); state = s_crmd_fsa(C_STARTUP); if (state == S_PENDING || state == S_STARTING) { /* Create the mainloop and run it... */ crmd_mainloop = g_main_new(FALSE); crm_info("Starting %s's mainloop", crm_system_name); #ifdef REALTIME_SUPPORT static int crm_realtime = 1; if (crm_realtime == 1){ cl_enable_realtime(); }else if (crm_realtime == 0){ cl_disable_realtime(); } cl_make_realtime(SCHED_RR, 5, 64, 64); #endif g_main_run(crmd_mainloop); return_to_orig_privs(); if(is_set(fsa_input_register, R_STAYDOWN)) { crm_info("Inhibiting respawn by Heartbeat"); exit_code = 100; } } else { crm_err("Startup of %s failed. Current state: %s", crm_system_name, fsa_state2string(state)); exit_code = 1; } crm_info("[%s] stopped (%d)", crm_system_name, exit_code); return exit_code; }
/* Cluster logging function */ void cl_log(int priority, const char * fmt, ...) { va_list ap; char buf[MAXLINE]; ssize_t nbytes; int needprivs = !cl_have_full_privs(); cl_process_pid = (int)getpid(); cl_log_depth++; buf[MAXLINE-1] = EOS; va_start(ap, fmt); nbytes=vsnprintf(buf, sizeof(buf), fmt, ap); va_end(ap); if (nbytes >= (ssize_t)sizeof(buf)){ nbytes = sizeof(buf) -1 ; } if (needprivs) { return_to_orig_privs(); } if (stderr_enabled) { print_logline(stderr, cl_log_entity,cl_process_pid, NULLTIME, prio2str(priority), buf); } if (use_logging_daemon && cl_log_depth <= 1) { LogToLoggingDaemon(priority, buf, nbytes, TRUE); }else{ /* this may cause blocking... maybe should make it optional? */ cl_direct_log(priority, buf, TRUE, NULL, cl_process_pid, NULLTIME); } cl_log_depth--; return; }
int main(int argc, char **argv) { int argerr = 0; int flag; #ifdef HAVE_GETOPT_H int option_index = 0; static struct option long_options[] = { /* Top-level Options */ {"verbose", 0, 0, 'V'}, {"help", 0, 0, '?'}, {"interval", 1, 0, 'i'}, {"group-by-node", 0, 0, 'n'}, {"inactive", 0, 0, 'r'}, {"as-html", 1, 0, 'h'}, {"web-cgi", 0, 0, 'w'}, {"simple-status", 0, 0, 's'}, {"as-console", 0, 0, 'c'}, {"one-shot", 0, 0, '1'}, {"daemonize", 0, 0, 'd'}, {"pid-file", 0, 0, 'p'}, {"xml-file", 1, 0, 'X'}, {0, 0, 0, 0} }; #endif pid_file = crm_strdup("/tmp/ClusterMon.pid"); crm_system_name = basename(argv[0]); crm_log_init(crm_system_name, LOG_ERR-1, FALSE, FALSE, 0, NULL); if (strcmp(crm_system_name, "crm_mon.cgi")==0) { web_cgi = TRUE; one_shot = TRUE; } while (1) { #ifdef HAVE_GETOPT_H flag = getopt_long(argc, argv, OPTARGS, long_options, &option_index); #else flag = getopt(argc, argv, OPTARGS); #endif if (flag == -1) break; switch(flag) { case 'V': cl_log_enable_stderr(TRUE); alter_debug(DEBUG_INC); break; case 'i': interval = crm_get_msec(optarg); break; case 'n': group_by_node = TRUE; break; case 'r': inactive_resources = TRUE; break; case 'd': daemonize = TRUE; break; case 'p': pid_file = crm_strdup(optarg); break; case 'X': xml_file = crm_strdup(optarg); one_shot = TRUE; break; case 'h': as_html_file = crm_strdup(optarg); break; case 'w': web_cgi = TRUE; one_shot = TRUE; break; case 'c': #if CURSES_ENABLED as_console = TRUE; #else printf("You need to have curses available at compile time to enable console mode\n"); argerr++; #endif break; case 's': simple_status = TRUE; one_shot = TRUE; break; case '1': one_shot = TRUE; break; default: printf("Argument code 0%o (%c) is not (?yet?) supported\n", flag, flag); ++argerr; break; } } if (optind < argc) { printf("non-option ARGV-elements: "); while (optind < argc) printf("%s ", argv[optind++]); printf("\n"); } if (argerr) { usage(crm_system_name, LSB_EXIT_GENERIC); } if(as_html_file == NULL && !web_cgi && !simple_status) { #if CURSES_ENABLED as_console = TRUE; #else printf("Defaulting to one-shot mode\n"); printf("You need to have curses available at compile time to enable console mode\n"); one_shot = TRUE; #endif } if(daemonize) { as_console = FALSE; } if(one_shot) { daemonize = FALSE; as_console = FALSE; } if(daemonize && as_html_file == NULL) { usage(crm_system_name, LSB_EXIT_GENERIC); } make_daemon(daemonize, pid_file); #if CURSES_ENABLED if(as_console) { initscr(); cbreak(); noecho(); } #endif crm_info("Starting %s", crm_system_name); mainloop = g_main_new(FALSE); if(one_shot == FALSE) { timer_id = Gmain_timeout_add( interval, mon_timer_popped, NULL); } else if(xml_file != NULL) { FILE *xml_strm = fopen(xml_file, "r"); crm_data_t *cib_object = NULL; if(strstr(xml_file, ".bz2") != NULL) { cib_object = file2xml(xml_strm, TRUE); } else { cib_object = file2xml(xml_strm, FALSE); } if(xml_strm != NULL) { fclose(xml_strm); } one_shot = TRUE; mon_update(NULL, 0, cib_ok, cib_object, NULL); } mon_timer_popped(NULL); g_main_run(mainloop); return_to_orig_privs(); crm_info("Exiting %s", crm_system_name); #if CURSES_ENABLED if(as_console) { echo(); nocbreak(); endwin(); } #endif return 0; }