Rlist *RlistAppendScalarIdemp(Rlist **start, const char *scalar) { if (RlistKeyIn(*start, scalar)) { return NULL; } return RlistAppendScalar(start, scalar); }
Rlist *RlistPrependScalarIdemp(Rlist **start, const char *scalar) { if (RlistKeyIn(*start, scalar)) { return NULL; } return RlistPrepend(start, scalar, RVAL_TYPE_SCALAR); }
Rlist *RlistPrependScalarIdemp(Rlist **start, const char *scalar) { if (!RlistKeyIn(*start, scalar)) { return RlistPrependScalar(start, scalar); } else { return NULL; } }
static bool ProcessSanityChecks(Attributes a, const Promise *pp) { int promised_zero, ret = true; promised_zero = ((a.process_count.min_range == 0) && (a.process_count.max_range == 0)); if (a.restart_class) { if ((RlistKeyIn(a.signals, "term")) || (RlistKeyIn(a.signals, "kill"))) { Log(LOG_LEVEL_WARNING, "Promise '%s' kills then restarts - never strictly converges", pp->promiser); PromiseRef(LOG_LEVEL_INFO, pp); } if (a.haveprocess_count) { Log(LOG_LEVEL_ERR, "process_count and restart_class should not be used in the same promise as this makes no sense"); PromiseRef(LOG_LEVEL_INFO, pp); ret = false; } } if (promised_zero && (a.restart_class)) { Log(LOG_LEVEL_ERR, "Promise constraint conflicts - '%s' processes cannot have zero count if restarted", pp->promiser); PromiseRef(LOG_LEVEL_ERR, pp); ret = false; } if ((a.haveselect) && (!a.process_select.process_result)) { Log(LOG_LEVEL_ERR, "Process select constraint body promised no result (check body definition)"); PromiseRef(LOG_LEVEL_ERR, pp); return false; } return ret; }
Rlist *RlistAppendIdemp(Rlist **start, void *item, RvalType type) { Rlist *rp, *ins = NULL; if (type == RVAL_TYPE_LIST) { for (rp = (Rlist *) item; rp != NULL; rp = rp->next) { ins = RlistAppendIdemp(start, rp->item, rp->type); } return ins; } if (!RlistKeyIn(*start, (char *) item)) { return RlistAppend(start, (char *) item, type); } else { return NULL; } }
static int FindPidMatches(Item *procdata, Item **killlist, Attributes a, const char *promiser) { int matches = 0; pid_t cfengine_pid = getpid(); Item *matched = SelectProcesses(procdata, promiser, a.process_select, a.haveselect); for (Item *ip = matched; ip != NULL; ip = ip->next) { pid_t pid = ip->counter; if (pid == 1) { if ((RlistLen(a.signals) == 1) && (RlistKeyIn(a.signals, "hup"))) { Log(LOG_LEVEL_VERBOSE, "Okay to send only HUP to init"); } else { continue; } } if ((pid < 4) && (a.signals)) { Log(LOG_LEVEL_VERBOSE, "Will not signal or restart processes 0,1,2,3 (occurred while looking for %s)", promiser); continue; } bool promised_zero = (a.process_count.min_range == 0) && (a.process_count.max_range == 0); if ((a.transaction.action == cfa_warn) && promised_zero) { Log(LOG_LEVEL_ERR, "Process alert '%s'", procdata->name); /* legend */ Log(LOG_LEVEL_ERR, "Process alert '%s'", ip->name); continue; } if ((pid == cfengine_pid) && (a.signals)) { Log(LOG_LEVEL_VERBOSE, "cf-agent will not signal itself!"); continue; } if (a.transaction.action == cfa_warn) { Log(LOG_LEVEL_ERR, "Matched '%s'", ip->name); } else { Log(LOG_LEVEL_VERBOSE, "Matched '%s'", ip->name); } PrependItem(killlist, ip->name, ""); (*killlist)->counter = pid; matches++; } DeleteItemList(matched); return matches; }
int VerifyCommandRetcode(EvalContext *ctx, int retcode, int fallback, Attributes a, Promise *pp) { char retcodeStr[128] = { 0 }; int result = true; int matched = false; if ((a.classes.retcode_kept) || (a.classes.retcode_repaired) || (a.classes.retcode_failed)) { snprintf(retcodeStr, sizeof(retcodeStr), "%d", retcode); if (RlistKeyIn(a.classes.retcode_kept, retcodeStr)) { cfPS(ctx, LOG_LEVEL_INFO, PROMISE_RESULT_NOOP, pp, a, "Command related to promiser '%s' returned code defined as promise kept %d", pp->promiser, retcode); result = true; matched = true; } if (RlistKeyIn(a.classes.retcode_repaired, retcodeStr)) { cfPS(ctx, LOG_LEVEL_INFO, PROMISE_RESULT_CHANGE, pp, a, "Command related to promiser '%s' returned code defined as promise repaired %d", pp->promiser, retcode); result = true; matched = true; } if (RlistKeyIn(a.classes.retcode_failed, retcodeStr)) { cfPS(ctx, LOG_LEVEL_INFO, PROMISE_RESULT_FAIL, pp, a, "Command related to promiser '%s' returned code defined as promise failed %d", pp->promiser, retcode); result = false; matched = true; } if (!matched) { Log(LOG_LEVEL_VERBOSE, "Command related to promiser '%s' returned code %d -- did not match any failed, repaired or kept lists", pp->promiser, retcode); } } else if (fallback) // default: 0 is success, != 0 is failure { if (retcode == 0) { cfPS(ctx, LOG_LEVEL_VERBOSE, PROMISE_RESULT_CHANGE, pp, a, "Finished command related to promiser '%s' -- succeeded", pp->promiser); result = true; } else { cfPS(ctx, LOG_LEVEL_INFO, PROMISE_RESULT_FAIL, pp, a, "Finished command related to promiser '%s' -- an error occurred, returned %d", pp->promiser, retcode); result = false; } } return result; }