Functions

Table of Contents

Functions take zero or more values as arguments and return a value. Argument values need to be of the type and range as documented for each function. Some functions are documented with a ..., in which case they take an arbitrary amount of arguments.

They can return scalar and list values:

    vars:
      "random" int => randomint("0", "100");
      "list" slist => readstringlist("/tmp/listofstring", "#.*", "\s", 10, 400);

In addition, functions with return type boolean evaluate to true or false. The class on the left-hand side is set if the function evaluates to true. If the function evaluates to false, then the class remains unchanged.

    bundle agent test
    {
    vars:
      "five" int => "5";
      "seven" " int => "7";
    classes:
      "ok" expression => islessthan("$(five)","$(seven)");

    reports:

      ok::
        "$(five) is smaller than $(seven)";

     !ok::
        "$(seven) is smaller than $(five)";

    }

Underneath, CFEngine functions that return boolean will actually return a context expression like any or !any which will then be deemed true or false by the CFEngine evaluator. Note the truth of a context expression or the result of a function call may change during evaluation, but a class, once defined, will stay defined.

Functions that return a boolean can thus sometimes be used in places where a string is accepted as well, but this behavior is not clearly defined or supported. Use at your own discretion.

Function caching

During convergence, CFEngine's evaluation model will evaluate functions multiple times, which can be a performance concern.

Some system functions are particularly expensive:

As of 3.6.0, the new cache_system_functions body common argument is set to true by default and CFEngine's evaluator will use it. Although you can override it to false, in practice you should almost never need to do so. The effect of having it true (the default) is that the expensive system functions will be run just once and then their result will be cached.

Note that caching is per-process so results will not be cached between runs of e.g. cf-agent and cf-promises.

Function Skipping

If a variable passed to a function is unable to be resolved the function will be skipped. The function will be evaluated during a later pass when all variables passed as arguments are able to be resolved. The function will never be evaluated if any argument contains a variable that never resolves.

Collecting Functions

Some function arguments are marked as collecting which means they can "collect" an argument from various sources. The data is normalized into the JSON format internally, so all of the following data types have consistent behavior.

  • If a key inside a data container is specified (mycontainer[key]), the value under that key is collected. The key can be a string for JSON objects or a number for JSON arrays.

  • If a single data container, CFEngine array, or slist is specified (mycontainer or myarray or myslist), the contents of it are collected.

  • If a single data container, CFEngine array, or slist is specified with @() around it (@(mycontainer) or @(myarray) or @(myslist)), the contents of it are collected.

  • If a function call that returns a data container or slist is specified, that function call is evaluated and the results are inserted, so you can say for instance sort(data_expand(...), "lex") to expand a data container then sort it.

  • If a list (slist, ilist, or rlist) is named, its entries are collected.

  • If any CFEngine "classic" array (array[key]) is named, it's first converted to a JSON key-value map, then collected.

  • If a literal JSON string like [ 1,2,3 ] or { "x": 500 } is provided, it will be parsed and used.

  • If any of the above-mentioned ways to reference variables are used inside a literal JSON string they will be expanded (or the function call will fail). This is similar to the behavior of Javascript, for instance. For example, mergedata('[ thing, { "mykey": otherthing[123] } ]') will wrap the thing in a JSON array; then the contents of otherthing[123] will be wrapped in a JSON map which will also go in the array.

List of all functions

There are a large number of functions built into CFEngine. The following tables might make it easier for you to find the function you need.

Functions by Category

files communication utils system internal io data
accessedbefore() host2ip() bundlestate() findprocesses() callstack_callers() countlinesmatching() accumulated()
changedbefore() hostrange() classesmatching() getenv() callstack_promisers() data_readstringarray() ago()
dirname() hostsseen() classmatch() getuid() data_readstringarrayidx() and()
diskfree() hostswithclass() countclassesmatching() getusers() parseintarray() bundlesmatching()
file_hash() hubknowledge() datastate() groupexists() parsejson() canonify()
fileexists() ip2host() execresult() hostinnetgroup() parserealarray() canonifyuniquely()
filesexist() iprange() getclassmetatags() now() parsestringarray() classify()
filesize() ldaparray() getvariablemetatags() packagesmatching() parsestringarrayidx() concat()
filestat() ldaplist() isvariable() packageupdatesmatching() parseyaml() data_expand()
findfiles() ldapvalue() returnszero() processexists() readcsv() data_regextract()
isdir() network_connections() splayclass() registryvalue() readdata() difference()
isexecutable() peerleader() usemodule() userexists() readfile() escape()
islink() peerleaders() variablesmatching() readintarray() eval()
isnewerthan() peers() readintlist() every()
isplain() readtcp() readjson() expandrange()
laterthan() regldap() readrealarray() filter()
lsdir() remoteclassesmatching() readreallist() format()
translatepath() remotescalar() readstringarray() getfields()
selectservers() readstringarrayidx() getgid()
url_get() readstringlist() getindices()
readyaml() getvalues()
regline() grep()
hash()
hashmatch()
ifelse()
intersection()
irange()
isgreaterthan()
islessthan()
join()
lastnode()
length()
makerule()
maparray()
mapdata()
maplist()
max()
mean()
mergedata()
min()
none()
not()
nth()
on()
or()
product()
randomint()
regarray()
regcmp()
regex_replace()
regextract()
reglist()
reverse()
rrange()
shuffle()
some()
sort()
splitstring()
storejson()
strcmp()
strftime()
string_downcase()
string_head()
string_length()
string_mustache()
string_reverse()
string_split()
string_tail()
string_upcase()
sublist()
sum()
unique()
variance()

Functions by Return Type

real (i,r)range string int (i,r,s)list data class
mean() irange() and() accumulated() bundlesmatching() bundlestate() accessedbefore()
product() rrange() canonify() ago() callstack_promisers() callstack_callers() changedbefore()
sum() canonifyuniquely() countclassesmatching() classesmatching() data_expand() classify()
variance() concat() countlinesmatching() difference() data_readstringarray() classmatch()
dirname() diskfree() expandrange() data_readstringarrayidx() every()
escape() filesize() filter() data_regextract() fileexists()
eval() getfields() findfiles() datastate() filesexist()
execresult() getgid() getclassmetatags() findprocesses() groupexists()
file_hash() getuid() getindices() mapdata() hashmatch()
filestat() length() getusers() mergedata() hostinnetgroup()
format() now() getvalues() network_connections() hostrange()
getenv() on() getvariablemetatags() packagesmatching() iprange()
hash() parseintarray() grep() packageupdatesmatching() isdir()
host2ip() parserealarray() hostsseen() parsejson() isexecutable()
hubknowledge() parsestringarray() hostswithclass() parseyaml() isgreaterthan()
ifelse() parsestringarrayidx() intersection() readcsv() islessthan()
ip2host() randomint() ldaplist() readdata() islink()
join() readintarray() lsdir() readjson() isnewerthan()
lastnode() readrealarray() maparray() readyaml() isplain()
ldapvalue() readstringarray() maplist() url_get() isvariable()
makerule() readstringarrayidx() peerleaders() laterthan()
max() selectservers() peers() ldaparray()
min() string_length() readintlist() none()
not() readreallist() processexists()
nth() readstringlist() regarray()
or() reverse() regcmp()
peerleader() shuffle() regextract()
readfile() sort() regldap()
readtcp() splitstring() regline()
regex_replace() string_split() reglist()
registryvalue() sublist() remoteclassesmatching()
remotescalar() unique() returnszero()
storejson() variablesmatching() some()
strftime() splayclass()
string_downcase() strcmp()
string_head() usemodule()
string_mustache() userexists()
string_reverse()
string_tail()
string_upcase()
translatepath()