/* * Stop removable media archiving. */ static void * rmState( void *arg, struct UdsMsgHeader *hdr) { struct AsrRmState *a = (struct AsrRmState *)arg; static struct AsrGeneralRsp rsp; rsp.GrStatus = 0; traceRequest(hdr, &rsp, "rmState(%d)", a->state); if (a->state != 0) { ScheduleSetRmState(EC_amld_start); ScheduleRun("rmState(On)"); } else { ScheduleSetRmState(EC_amld_stop); ScheduleRun("rmState(Off)"); } return (&rsp); }
/* * Catalog change. */ static void * catalogChange( /* LINTED argument unused in function */ void *arg, struct UdsMsgHeader *hdr) { static struct AsrGeneralRsp rsp; rsp.GrStatus = 0; traceRequest(hdr, &rsp, "catalogChange"); ScheduleRun("catalogChange"); return (&rsp); }
/* Might be called back from NovaWin_StartExecService */ void StartServer(EvalContext *ctx, Policy *policy, GenericAgentConfig *config, ExecConfig *exec_config) { #if !defined(__MINGW32__) time_t now = time(NULL); #endif pthread_attr_init(&threads_attrs); pthread_attr_setdetachstate(&threads_attrs, PTHREAD_CREATE_DETACHED); pthread_attr_setstacksize(&threads_attrs, (size_t)2048*1024); Banner("Starting executor"); #ifndef __MINGW32__ if (!ONCE) { /* Kill previous instances of cf-execd if those are still running */ Apoptosis(); } #endif #ifdef __MINGW32__ if (!NO_FORK) { CfOut(OUTPUT_LEVEL_VERBOSE, "", "Windows does not support starting processes in the background - starting in foreground"); } #else /* !__MINGW32__ */ if ((!NO_FORK) && (fork() != 0)) { CfOut(OUTPUT_LEVEL_INFORM, "", "cf-execd starting %.24s\n", cf_ctime(&now)); _exit(0); } if (!NO_FORK) { ActAsDaemon(0); } #endif /* !__MINGW32__ */ WritePID("cf-execd.pid"); signal(SIGINT, HandleSignalsForDaemon); signal(SIGTERM, HandleSignalsForDaemon); signal(SIGHUP, SIG_IGN); signal(SIGPIPE, SIG_IGN); signal(SIGUSR1, HandleSignalsForDaemon); signal(SIGUSR2, HandleSignalsForDaemon); umask(077); if (ONCE) { LocalExec(exec_config); CloseLog(); } else { while (!IsPendingTermination()) { if (ScheduleRun(ctx, &policy, config, exec_config)) { CfOut(OUTPUT_LEVEL_VERBOSE, "", "Sleeping for splaytime %d seconds\n\n", exec_config->splay_time); sleep(exec_config->splay_time); if (!LocalExecInThread(exec_config)) { CfOut(OUTPUT_LEVEL_INFORM, "", "Unable to run agent in thread, falling back to blocking execution"); LocalExec(exec_config); } } } } }
/* Might be called back from NovaWin_StartExecService */ void StartServer(Policy *policy, GenericAgentConfig *config, ExecConfig *exec_config, const ReportContext *report_context) { #if !defined(__MINGW32__) time_t now = time(NULL); #endif Promise *pp = NewPromise("exec_cfengine", "the executor agent"); Attributes dummyattr; CfLock thislock; pthread_attr_init(&threads_attrs); pthread_attr_setdetachstate(&threads_attrs, PTHREAD_CREATE_DETACHED); pthread_attr_setstacksize(&threads_attrs, (size_t)2048*1024); Banner("Starting executor"); memset(&dummyattr, 0, sizeof(dummyattr)); dummyattr.restart_class = "nonce"; dummyattr.transaction.ifelapsed = CF_EXEC_IFELAPSED; dummyattr.transaction.expireafter = CF_EXEC_EXPIREAFTER; if (!ONCE) { thislock = AcquireLock(pp->promiser, VUQNAME, CFSTARTTIME, dummyattr, pp, false); if (thislock.lock == NULL) { PromiseDestroy(pp); return; } /* Kill previous instances of cf-execd if those are still running */ Apoptosis(); /* FIXME: kludge. This code re-sets "last" lock to the one we have acquired a few lines before. If the cf-execd is terminated, this lock will be removed, and subsequent restart of cf-execd won't fail. The culprit is Apoptosis(), which creates a promise and executes it, taking locks during it, so CFLOCK/CFLAST/CFLOG get reset. Proper fix is to keep all the taken locks in the memory, and release all of them during process termination. */ strcpy(CFLOCK, thislock.lock); strcpy(CFLAST, thislock.last ? thislock.last : ""); strcpy(CFLOG, thislock.log ? thislock.log : ""); } #ifdef __MINGW32__ if (!NO_FORK) { CfOut(OUTPUT_LEVEL_VERBOSE, "", "Windows does not support starting processes in the background - starting in foreground"); } #else /* !__MINGW32__ */ if ((!NO_FORK) && (fork() != 0)) { CfOut(OUTPUT_LEVEL_INFORM, "", "cf-execd starting %.24s\n", cf_ctime(&now)); _exit(0); } if (!NO_FORK) { ActAsDaemon(0); } #endif /* !__MINGW32__ */ WritePID("cf-execd.pid"); signal(SIGINT, HandleSignalsForDaemon); signal(SIGTERM, HandleSignalsForDaemon); signal(SIGHUP, SIG_IGN); signal(SIGPIPE, SIG_IGN); signal(SIGUSR1, HandleSignalsForDaemon); signal(SIGUSR2, HandleSignalsForDaemon); umask(077); if (ONCE) { CfOut(OUTPUT_LEVEL_VERBOSE, "", "Sleeping for splaytime %d seconds\n\n", SPLAYTIME); sleep(SPLAYTIME); LocalExec(exec_config); CloseLog(); } else { while (!IsPendingTermination()) { if (ScheduleRun(&policy, config, exec_config, report_context)) { CfOut(OUTPUT_LEVEL_VERBOSE, "", "Sleeping for splaytime %d seconds\n\n", SPLAYTIME); sleep(SPLAYTIME); if (!LocalExecInThread(exec_config)) { CfOut(OUTPUT_LEVEL_INFORM, "", "Unable to run agent in thread, falling back to blocking execution"); LocalExec(exec_config); } } } YieldCurrentLock(thislock); } }
/* Might be called back from NovaWin_StartExecService */ void StartServer(EvalContext *ctx, Policy *policy, GenericAgentConfig *config, ExecdConfig **execd_config, ExecConfig **exec_config) { pthread_attr_init(&threads_attrs); pthread_attr_setdetachstate(&threads_attrs, PTHREAD_CREATE_DETACHED); pthread_attr_setstacksize(&threads_attrs, (size_t)2048*1024); Banner("Starting executor"); #ifndef __MINGW32__ if (!ONCE) { /* Kill previous instances of cf-execd if those are still running */ Apoptosis(); } time_t now = time(NULL); if ((!NO_FORK) && (fork() != 0)) { Log(LOG_LEVEL_INFO, "cf-execd starting %.24s", ctime(&now)); _exit(EXIT_SUCCESS); } if (!NO_FORK) { ActAsDaemon(); } #else /* __MINGW32__ */ if (!NO_FORK) { Log(LOG_LEVEL_VERBOSE, "Windows does not support starting processes in the background - starting in foreground"); } #endif WritePID("cf-execd.pid"); signal(SIGINT, HandleSignalsForDaemon); signal(SIGTERM, HandleSignalsForDaemon); signal(SIGHUP, HandleSignalsForDaemon); signal(SIGPIPE, SIG_IGN); signal(SIGUSR1, HandleSignalsForDaemon); signal(SIGUSR2, HandleSignalsForDaemon); umask(077); if (ONCE) { LocalExec(*exec_config); CloseLog(); } else { while (!IsPendingTermination()) { if (ScheduleRun(ctx, &policy, config, execd_config, exec_config)) { MaybeSleepLog(LOG_LEVEL_VERBOSE, "Sleeping for splaytime %u seconds", (*execd_config)->splay_time); // We are sleeping both above and inside ScheduleRun(), so make // sure a terminating signal did not arrive during that time. if (IsPendingTermination()) { break; } if (!LocalExecInThread(*exec_config)) { Log(LOG_LEVEL_INFO, "Unable to run agent in thread, falling back to blocking execution"); LocalExec(*exec_config); } } } } PolicyDestroy(policy); }
void StartServer(int argc,char **argv) { int pid,time_to_run = false; time_t now = time(NULL); #ifdef HAVE_PTHREAD_H pthread_t tid = 1; #else int tid = -1 #endif Banner("Starting server"); if ((!NO_FORK) && (fork() != 0)) { snprintf(OUTPUT,CF_BUFSIZE*2,"cfexecd starting %.24s\n",ctime(&now)); CfLog(cfinform,OUTPUT,""); exit(0); } if (!ONCE) { if (!GetLock("cfexecd","execd",0,0,VUQNAME,now)) { snprintf(OUTPUT,CF_BUFSIZE*2,"cfexecd: Couldn't get a lock -- exists or too soon: IfElapsed %d, ExpireAfter %d\n",0,0); CfLog(cfverbose,OUTPUT,""); return; } SaveExecLock(); } if (!NO_FORK) { ActAsDaemon(0); } WritePID("cfexecd.pid"); signal(SIGINT,(void *)ExitCleanly); signal(SIGTERM,(void *)ExitCleanly); signal(SIGHUP,SIG_IGN); signal(SIGPIPE,SIG_IGN); signal(SIGUSR1,HandleSignal); signal(SIGUSR2,HandleSignal); umask(077); if (ONCE) { GetCfStuff(); LocalExec((void *)0); } else { char **nargv; int i; /* * Append --once option to our arguments for spawned monitor process. */ nargv = malloc(sizeof(char *) * (argc+2)); for (i = 0; i < argc; i++) { nargv[i] = argv[i]; } nargv[i++] = strdup("--once"); nargv[i++] = NULL; GetCfStuff(); while (true) { time_to_run = ScheduleRun(); if (time_to_run) { if (!GetLock("cfd","exec",CF_EXEC_IFELAPSED,CF_EXEC_EXPIREAFTER,VUQNAME,time(NULL))) { snprintf(OUTPUT,CF_BUFSIZE*2,"cfexecd: Couldn't get exec lock -- exists or too soon: IfElapsed %d, ExpireAfter %d\n",CF_EXEC_IFELAPSED,CF_EXEC_EXPIREAFTER); CfLog(cfverbose,OUTPUT,""); continue; } GetCfStuff(); #ifdef NT /* * Spawn a separate process - spawn will work if the cfexecd binary * has changed (where cygwin's fork() would fail). */ Debug("Spawning %s\n", nargv[0]); pid = _spawnvp((int)_P_NOWAIT,nargv[0],nargv); if (pid < 1) { CfLog(cfinform,"Can't spawn run","spawnvp"); } #endif #ifndef NT #if (defined HAVE_LIBPTHREAD || defined BUILDTIN_GCC_THREAD) pthread_attr_init(&PTHREADDEFAULTS); pthread_attr_setdetachstate(&PTHREADDEFAULTS,PTHREAD_CREATE_DETACHED); #ifdef HAVE_PTHREAD_ATTR_SETSTACKSIZE pthread_attr_setstacksize(&PTHREADDEFAULTS,(size_t)2048*1024); #endif if (pthread_create(&tid,&PTHREADDEFAULTS,LocalExec,(void *)1) != 0) { CfLog(cfinform,"Can't create thread!","pthread_create"); LocalExec((void *)1); } pthread_attr_destroy(&PTHREADDEFAULTS); #else LocalExec((void *)1); #endif #endif ReleaseCurrentLock(); } } } }