void TestExpandVariables() { Promise pp = { 0 }, *pcopy; Rlist *args, *listvars = NULL, *scalarvars = NULL; Constraint *cp; FnCall *fp; strcpy(CFWORKDIR, GetWorkDir()); MapName(CFWORKDIR); /* Still have diagnostic scope */ NewScope("control_common"); printf("%d. Testing variable expansion\n", ++NR); pp.promiser = "the originator"; pp.promisee = (Rval) {"the recipient with $(two)", CF_SCALAR}; pp.classes = "proletariat"; pp.offset.line = 12; pp.audit = NULL; pp.conlist = NULL; pp.agentsubtype = "none"; pp.bundletype = "bundle_type"; pp.bundle = "test_bundle"; pp.ref = "commentary"; pp.agentsubtype = xstrdup("files"); pp.done = false; pp.next = NULL; pp.cache = NULL; pp.inode_cache = NULL; pp.this_server = NULL; pp.donep = &(pp.done); pp.conn = NULL; args = SplitStringAsRList("$(administrator)", ','); fp = NewFnCall("getuid", args); AppendConstraint(&(pp.conlist), "lval1", (Rval) {xstrdup("@(one)"), CF_SCALAR}, "lower classes1", false); AppendConstraint(&(pp.conlist), "lval2", (Rval) {xstrdup("$(four)"), CF_SCALAR}, "upper classes1", false); AppendConstraint(&(pp.conlist), "lval3", (Rval) {fp, CF_FNCALL}, "upper classes2", false); /* Now copy promise and delete */ pcopy = DeRefCopyPromise("diagnostic", &pp); MapIteratorsFromRval("diagnostic", &scalarvars, &listvars, (Rval) {pcopy->promiser, CF_SCALAR}, NULL); if (pcopy->promisee.item != NULL) { MapIteratorsFromRval("diagnostic", &scalarvars, &listvars, pp.promisee, NULL); } for (cp = pcopy->conlist; cp != NULL; cp = cp->next) { MapIteratorsFromRval("diagnostic", &scalarvars, &listvars, cp->rval, NULL); } ExpandPromiseAndDo(cf_common, "diagnostic", pcopy, scalarvars, listvars, NULL); /* No cleanup */ }
FnCall *CopyFnCall(FnCall *f) { CfDebug("CopyFnCall()\n"); return NewFnCall(f->name, CopyRlist(f->args)); }
FnCall *ExpandFnCall(char *contextid, FnCall *f, int expandnaked) { CfDebug("ExpandFnCall()\n"); //return NewFnCall(f->name,ExpandList(contextid,f->args,expandnaked)); return NewFnCall(f->name, ExpandList(contextid, f->args, false)); }
static void DoVerifyServices(Attributes a, Promise *pp, const ReportContext *report_context) { FnCall *default_bundle = NULL; Rlist *args = NULL; // Need to set up the default service pack to eliminate syntax if (GetConstraintValue("service_bundle", pp, CF_SCALAR) == NULL) { switch (a.service.service_policy) { case cfsrv_start: AppendRlist(&args, pp->promiser, CF_SCALAR); AppendRlist(&args, "start", CF_SCALAR); break; case cfsrv_restart: AppendRlist(&args, pp->promiser, CF_SCALAR); AppendRlist(&args, "restart", CF_SCALAR); break; case cfsrv_reload: AppendRlist(&args, pp->promiser, CF_SCALAR); AppendRlist(&args, "restart", CF_SCALAR); break; case cfsrv_stop: case cfsrv_disable: default: AppendRlist(&args, pp->promiser, CF_SCALAR); AppendRlist(&args, "stop", CF_SCALAR); break; } default_bundle = NewFnCall("default:standard_services", args); ConstraintAppendToPromise(pp, "service_bundle", (Rval) {default_bundle, CF_FNCALL}, "any", false); a.havebundle = true; } // Set $(this.service_policy) for flexible bundle adaptation switch (a.service.service_policy) { case cfsrv_start: NewScalar("this", "service_policy", "start", cf_str); break; case cfsrv_restart: NewScalar("this", "service_policy", "restart", cf_str); break; case cfsrv_reload: NewScalar("this", "service_policy", "reload", cf_str); break; case cfsrv_stop: case cfsrv_disable: default: NewScalar("this", "service_policy", "stop", cf_str); break; } if (default_bundle && GetBundle(PolicyFromPromise(pp), default_bundle->name, "agent") == NULL) { cfPS(cf_inform, CF_FAIL, "", pp, a, " !! Service %s could not be invoked successfully\n", pp->promiser); } if (!DONTDO) { VerifyMethod("service_bundle", a, pp, report_context); // Send list of classes to set privately? } }