static void Cf3ParseFiles() { struct Rlist *rp,*sl; PARSING = true; PROMISETIME = time(NULL); Cf3ParseFile(VINPUTFILE); // Expand any lists in this list now HashVariables(NULL); HashControls(); if (VINPUTLIST != NULL) { for (rp = VINPUTLIST; rp != NULL; rp=rp->next) { if (rp->type != CF_SCALAR) { CfOut(cf_error,"","Non-file object in inputs list\n"); } else { struct Rval returnval; if (strcmp(rp->item,CF_NULL_VALUE) == 0) { continue; } returnval = EvaluateFinalRval("sys",rp->item,rp->type,true,NULL); switch (returnval.rtype) { case CF_SCALAR: Cf3ParseFile((char *)returnval.item); break; case CF_LIST: for (sl = (struct Rlist *)returnval.item; sl != NULL; sl=sl->next) { Cf3ParseFile((char *)sl->item); } break; } DeleteRvalItem(returnval.item,returnval.rtype); } HashVariables(NULL); HashControls(); } } HashVariables(NULL); PARSING = false; }
static void DeleteTypeContext(Policy *policy, enum typesequence type, const ReportContext *report_context) { switch (type) { case kp_classes: HashVariables(policy, THIS_BUNDLE, report_context); break; case kp_environments: DeleteEnvironmentsContext(); break; case kp_files: ConnectionsCleanup(); break; case kp_processes: break; case kp_storage: #ifndef __MINGW32__ { Attributes a = { {0} }; CfOut(cf_verbose, "", " -> Number of changes observed in %s is %d\n", VFSTAB[VSYSTEMHARDCLASS], FSTAB_EDITS); if (FSTAB_EDITS && FSTABLIST && !DONTDO) { if (FSTABLIST) { SaveItemListAsFile(FSTABLIST, VFSTAB[VSYSTEMHARDCLASS], a, NULL, report_context); DeleteItemList(FSTABLIST); FSTABLIST = NULL; } FSTAB_EDITS = 0; } if (!DONTDO && CF_MOUNTALL) { CfOut(cf_verbose, "", " -> Mounting all filesystems\n"); MountAll(); } } #endif /* !__MINGW32__ */ break; case kp_packages: ExecuteScheduledPackages(); CleanScheduledPackages(); break; default: /* Deinitialization is not required */ ; } }
static void DeleteTypeContext(Policy *policy, TypeSequence type, const ReportContext *report_context) { switch (type) { case TYPE_SEQUENCE_CONTEXTS: HashVariables(policy, THIS_BUNDLE, report_context); break; case TYPE_SEQUENCE_ENVIRONMENTS: DeleteEnvironmentsContext(); break; case TYPE_SEQUENCE_FILES: ConnectionsCleanup(); break; case TYPE_SEQUENCE_PROCESSES: break; case TYPE_SEQUENCE_STORAGE: #ifndef __MINGW32__ { Attributes a = { {0} }; CfOut(OUTPUT_LEVEL_VERBOSE, "", " -> Number of changes observed in %s is %d\n", VFSTAB[VSYSTEMHARDCLASS], FSTAB_EDITS); if (FSTAB_EDITS && FSTABLIST && !DONTDO) { if (FSTABLIST) { SaveItemListAsFile(FSTABLIST, VFSTAB[VSYSTEMHARDCLASS], a, NULL, report_context); DeleteItemList(FSTABLIST); FSTABLIST = NULL; } FSTAB_EDITS = 0; } if (!DONTDO && CF_MOUNTALL) { CfOut(OUTPUT_LEVEL_VERBOSE, "", " -> Mounting all filesystems\n"); MountAll(); } } #endif /* !__MINGW32__ */ break; case TYPE_SEQUENCE_PACKAGES: ExecuteScheduledPackages(); CleanScheduledPackages(); break; default: /* Deinitialization is not required */ ; } }
static void VerifyPromises(enum cfagenttype agent) { struct Bundle *bp; struct SubType *sp; struct Promise *pp; struct Body *bdp; struct Rlist *rp; struct FnCall *fp; char *scope; if (REQUIRE_COMMENTS == CF_UNDEFINED) { for (bdp = BODIES; bdp != NULL; bdp = bdp->next) /* get schedule */ { if ((strcmp(bdp->name,"control") == 0) && (strcmp(bdp->type,"common") == 0)) { REQUIRE_COMMENTS = GetRawBooleanConstraint("require_comments",bdp->conlist); break; } } } for (rp = BODYPARTS; rp != NULL; rp=rp->next) { switch (rp->type) { case CF_SCALAR: if (!IsBody(BODIES,(char *)rp->item)) { CfOut(cf_error,"","Undeclared promise body \"%s()\" was referenced in a promise\n",(char *)rp->item); ERRORCOUNT++; } break; case CF_FNCALL: fp = (struct FnCall *)rp->item; if (!IsBody(BODIES,fp->name)) { CfOut(cf_error,"","Undeclared promise body \"%s()\" was referenced in a promise\n",fp->name); ERRORCOUNT++; } break; } } /* Check for undefined subbundles */ for (rp = SUBBUNDLES; rp != NULL; rp=rp->next) { switch (rp->type) { case CF_SCALAR: if (!IGNORE_MISSING_BUNDLES && !IsCf3VarString(rp->item) && !IsBundle(BUNDLES,(char *)rp->item)) { CfOut(cf_error,"","Undeclared promise bundle \"%s()\" was referenced in a promise\n",(char *)rp->item); ERRORCOUNT++; } break; case CF_FNCALL: fp = (struct FnCall *)rp->item; if (!IGNORE_MISSING_BUNDLES && !IsCf3VarString(fp->name) && !IsBundle(BUNDLES,fp->name)) { CfOut(cf_error,"","Undeclared promise bundle \"%s()\" was referenced in a promise\n",fp->name); ERRORCOUNT++; } break; } } /* Now look once through ALL the bundles themselves */ for (bp = BUNDLES; bp != NULL; bp = bp->next) /* get schedule */ { scope = bp->name; THIS_BUNDLE = bp->name; for (sp = bp->subtypes; sp != NULL; sp = sp->next) /* get schedule */ { if (strcmp(sp->name,"classes") == 0) { /* these should not be evaluated here */ if (agent != cf_common) { continue; } } for (pp = sp->promiselist; pp != NULL; pp=pp->next) { ExpandPromise(agent,scope,pp,NULL); } } } HashVariables(NULL); HashControls(); /* Now look once through the sequences bundles themselves */ if (VerifyBundleSequence(agent) == false) { FatalError("Errors in promise bundles"); } }
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; }