static VersionCmpResult RunCmpCommand(const char *command, const char *v1, const char *v2, Attributes a, Promise *pp) { char expanded_command[CF_EXPANDSIZE]; SetNewScope("cf_pack_context"); NewScalar("cf_pack_context", "v1", v1, cf_str); NewScalar("cf_pack_context", "v2", v2, cf_str); ExpandScalar(command, expanded_command); DeleteScope("cf_pack_context"); FILE *pfp = a.packages.package_commands_useshell ? cf_popen_sh(expanded_command, "w") : cf_popen(expanded_command, "w"); if (pfp == NULL) { cfPS(cf_error, CF_FAIL, "cf_popen", pp, a, "Can not start package version comparison command: %s", expanded_command); return VERCMP_ERROR; } CfOut(cf_verbose, "", "Executing %s", expanded_command); int retcode = cf_pclose(pfp); if (retcode == -1) { cfPS(cf_error, CF_FAIL, "cf_pclose", pp, a, "Error during package version comparison command execution: %s", expanded_command); return VERCMP_ERROR; } return retcode == 0; }
static void UnHashVariables() { struct Bundle *bp; for (bp = BUNDLES; bp != NULL; bp = bp->next) /* get schedule */ { DeleteScope(bp->name); } }
static void VerifyOccurrenceGroup(char *file, Promise *pp) { Attributes a = { {0} }; struct stat sb; char *sp, url[CF_BUFSIZE]; Rval retval; a = GetOccurrenceAttributes(pp); if (cfstat(file, &sb) == -1) { CfOut(cf_verbose, "", " !! File %s matched but could not be read", file); return; } if (a.path_root == NULL || a.web_root == NULL) { CfOut(cf_error, "", " !! No pathroot/webroot defined in representation"); PromiseRef(cf_error, pp); return; } Chop(a.path_root); DeleteSlash(a.path_root); sp = file + strlen(a.path_root) + 1; FullTextMatch(pp->promiser, sp); retval = ExpandPrivateRval("this", (Rval) {a.represents, CF_LIST}); DeleteScope("match"); if (strlen(a.web_root) > 0) { snprintf(url, CF_BUFSIZE - 1, "%s/%s", a.web_root, sp); } else { snprintf(url, CF_BUFSIZE - 1, "%s", sp); } AddOccurrence(&OCCURRENCES, url, retval.item, cfk_url, pp->classes); CfOut(cf_verbose, "", " -> File %s matched and being logged at %s", file, url); DeleteRlist((Rlist *) retval.item); }
void HashControls() { struct Body *bdp; char buf[CF_BUFSIZE]; /* Only control bodies need to be hashed like variables */ for (bdp = BODIES; bdp != NULL; bdp = bdp->next) /* get schedule */ { if (strcmp(bdp->name,"control") == 0) { snprintf(buf,CF_BUFSIZE,"%s_%s",bdp->name,bdp->type); Debug("Initiate control variable convergence...%s\n",buf); DeleteScope(buf); SetNewScope(buf); CheckControlPromises(buf,bdp->type,bdp->conlist); } } }
void CallInstr(int num_args){ VyObj func_obj = StackPop(); VyFunction* func = (VyFunction*) Obj(func_obj); VyObj arguments[num_args]; int i; for(i = 0; i < num_args; i++){ arguments[i] = StackPop(); } /* if(ObjEq(func_obj, VariableValue(CreateSymbol_NoObj("="))))printf("\nRead args:\n"); for(i = 0; i < num_args; i++){ if(ObjEq(func_obj, VariableValue(CreateSymbol_NoObj("=")))){ printf("Obj %d: ", i); PrintObj(stdout, arguments[i]); printf("\n"); } } */ if(!func->native){ Scope* caller_scope = CurrentScope(); Scope* new_scope = CreateScope(func->creation_scope); EnterScope(new_scope); BindArguments(func->arguments, arguments, num_args); VyObj return_val = EvalBytecode(func->code.bytecode); DeleteScope(new_scope); EnterScope(caller_scope); StackPush(return_val); } else { VyObj return_val = func->code.native(&arguments[0], num_args); StackPush(return_val); } }
static bool ScheduleRun(Policy **policy, GenericAgentConfig *config, ExecConfig *exec_config, const ReportContext *report_context) { Item *ip; CfOut(OUTPUT_LEVEL_VERBOSE, "", "Sleeping...\n"); sleep(CFPULSETIME); /* 1 Minute resolution is enough */ // recheck license (in case of license updates or expiry) if (EnterpriseExpiry()) { CfOut(OUTPUT_LEVEL_ERROR, "", "Cfengine - autonomous configuration engine. This enterprise license is invalid.\n"); exit(1); } /* * FIXME: this logic duplicates the one from cf-serverd.c. Unify ASAP. */ if (CheckNewPromises(config->input_file, InputFiles(*policy), report_context) == RELOAD_FULL) { /* Full reload */ CfOut(OUTPUT_LEVEL_INFORM, "", "Re-reading promise file %s..\n", config->input_file); DeleteAlphaList(&VHEAP); InitAlphaList(&VHEAP); DeleteAlphaList(&VHARDHEAP); InitAlphaList(&VHARDHEAP); DeleteAlphaList(&VADDCLASSES); InitAlphaList(&VADDCLASSES); DeleteItemList(IPADDRESSES); IPADDRESSES = NULL; DeleteItemList(VNEGHEAP); DeleteAllScope(); strcpy(VDOMAIN, "undefinded.domain"); POLICY_SERVER[0] = '\0'; VNEGHEAP = NULL; PolicyDestroy(*policy); *policy = NULL; ERRORCOUNT = 0; NewScope("sys"); SetPolicyServer(POLICY_SERVER); NewScalar("sys", "policy_hub", POLICY_SERVER, DATA_TYPE_STRING); NewScope("const"); NewScope("this"); NewScope("mon"); NewScope("control_server"); NewScope("control_common"); NewScope("remote_access"); GetNameInfo3(); GetInterfacesInfo(AGENT_TYPE_EXECUTOR); Get3Environment(); BuiltinClasses(); OSClasses(); HardClass(CF_AGENTTYPES[THIS_AGENT_TYPE]); SetReferenceTime(true); GenericAgentConfigSetBundleSequence(config, NULL); *policy = GenericAgentLoadPolicy(AGENT_TYPE_EXECUTOR, config, report_context); KeepPromises(*policy, exec_config); } else { /* Environment reload */ DeleteAlphaList(&VHEAP); InitAlphaList(&VHEAP); DeleteAlphaList(&VADDCLASSES); InitAlphaList(&VADDCLASSES); DeleteAlphaList(&VHARDHEAP); InitAlphaList(&VHARDHEAP); DeleteItemList(IPADDRESSES); IPADDRESSES = NULL; DeleteScope("this"); DeleteScope("mon"); DeleteScope("sys"); NewScope("this"); NewScope("mon"); NewScope("sys"); GetInterfacesInfo(AGENT_TYPE_EXECUTOR); Get3Environment(); BuiltinClasses(); OSClasses(); SetReferenceTime(true); } for (ip = SCHEDULE; ip != NULL; ip = ip->next) { CfOut(OUTPUT_LEVEL_VERBOSE, "", "Checking schedule %s...\n", ip->name); if (IsDefinedClass(ip->name, NULL)) { CfOut(OUTPUT_LEVEL_VERBOSE, "", "Waking up the agent at %s ~ %s \n", cf_ctime(&CFSTARTTIME), ip->name); return true; } } CfOut(OUTPUT_LEVEL_VERBOSE, "", "Nothing to do at %s\n", cf_ctime(&CFSTARTTIME)); return false; }
int VerifyMethod(char *attrname, Attributes a, Promise *pp) { Bundle *bp; void *vp; FnCall *fp; char method_name[CF_EXPANDSIZE]; Rlist *params = NULL; int retval = false; CfLock thislock; char lockname[CF_BUFSIZE]; if (a.havebundle) { if ((vp = GetConstraintValue(attrname, pp, CF_FNCALL))) { fp = (FnCall *) vp; ExpandScalar(fp->name, method_name); params = fp->args; } else if ((vp = GetConstraintValue(attrname, pp, CF_SCALAR))) { ExpandScalar((char *) vp, method_name); params = NULL; } else { return false; } } GetLockName(lockname, "method", pp->promiser, params); thislock = AcquireLock(lockname, VUQNAME, CFSTARTTIME, a, pp, false); if (thislock.lock == NULL) { return false; } PromiseBanner(pp); if ((bp = GetBundle(method_name, "agent"))) { char *bp_stack = THIS_BUNDLE; BannerSubBundle(bp, params); DeleteScope(bp->name); NewScope(bp->name); HashVariables(bp->name); AugmentScope(bp->name, bp->args, params); THIS_BUNDLE = bp->name; PushPrivateClassContext(); retval = ScheduleAgentOperations(bp); PopPrivateClassContext(); THIS_BUNDLE = bp_stack; if (retval) { cfPS(cf_verbose, CF_NOP, "", pp, a, " -> Method invoked successfully\n"); } else { cfPS(cf_inform, CF_FAIL, "", pp, a, " !! Method could not be invoked successfully\n"); } DeleteFromScope(bp->name, bp->args); } else { if (IsCf3VarString(method_name)) { CfOut(cf_error, "", " !! A variable seems to have been used for the name of the method. In this case, the promiser also needs to contain the uique name of the method"); } if (bp && bp->name) { cfPS(cf_error, CF_FAIL, "", pp, a, " !! Method \"%s\" was used but was not defined!\n", bp->name); } else { cfPS(cf_error, CF_FAIL, "", pp, a, " !! A method attempted to use a bundle \"%s\" that was apparently not defined!\n", method_name); } } YieldCurrentLock(thislock); return retval; }