diff --git a/libenv/sysinfo.c b/libenv/sysinfo.c index ee429ef716..c6fe9808e4 100644 --- a/libenv/sysinfo.c +++ b/libenv/sysinfo.c @@ -4059,9 +4059,18 @@ static void SysPolicyVersion(EvalContext *ctx) } } +static void SysCFEngineRole(EvalContext *ctx) +{ + const bool is_policy_server = EvalContextClassGet(ctx, "default", "policy_server"); + const bool am_policy_hub = EvalContextClassGet(ctx, "default", "am_policy_hub"); + + const char *role = (is_policy_server || am_policy_hub) ? "hub" : "client"; + EvalContextVariablePutSpecial(ctx, SPECIAL_SCOPE_SYS, "cfengine_role", role, CF_DATA_TYPE_STRING, "source=agent,derived-from=policy_server,derived-from=am_policy_hub"); +} void DetectEnvironmentFromPolicy(EvalContext *ctx, Policy *policy) { SysPolicyReleaseId(ctx, policy); SysPolicyVersion(ctx); + SysCFEngineRole(ctx); } diff --git a/tests/acceptance/01_vars/01_basic/cfengine_role.cf b/tests/acceptance/01_vars/01_basic/cfengine_role.cf new file mode 100644 index 0000000000..9568860db9 --- /dev/null +++ b/tests/acceptance/01_vars/01_basic/cfengine_role.cf @@ -0,0 +1,23 @@ +body common control +{ + bundlesequence => { "check" }; +} + +bundle agent check +{ + vars: + "role" string => ifelse("policy_server|am_policy_hub", "hub", "client"); + + classes: + "ok" expression => strcmp("$(sys.cfengine_role)", "$(role)"); + + reports: + DEBUG:: + "sys.cfengine_role resolved to '$(sys.cfengine_role)', role resolved to '$(role)'"; + + ok:: + "$(this.promise_filename) Pass"; + + !ok:: + "$(this.promise_filename) FAIL"; +}