CFEngine: new strftime() function
  2013-04-04

2013-06-11: Links to documentation updated

An implementation of strftime() has just been merged into the master branch

Full documentation is provided, as well as an example reproduced below:

body common control

{
bundlesequence => { "example" };
}

###########################################################

bundle agent example

{
  vars:
      "time" int => now();
      "now" string => strftime("localtime", "%F %T", now());
      "then" string => strftime("localtime", "%F %T", 0);

      "gmt_now" string => strftime("gmtime", "%F %T", now());
      "gmt_then" string => strftime("gmtime", "%F %T", 0);

  reports:
    cfengine::
      "time $(time); now $(now); then $(then)";
      "time $(time); GMT now $(now); GMT then $(then)";
}

Output:

R: time 1365106904; now 2013-04-04 22:21:44; then 1970-01-01 01:00:00
R: time 1365106904; GMT now 2013-04-04 22:21:44; GMT then 1970-01-01 01:00:00

I found this function very handy to replace ugly uses of “date” through execresult(), when a special formatted date is needed and hard date/time classes are not enough, so:

body common control {
  bundlesequence => { "foo" };
}

bundle agent foo {

  vars:
    "year"           string  =>  execresult("/bin/date +%Y", "noshell");
    "month"          string  =>  execresult("/bin/date +%m", "noshell");
    "year_month"     string  =>  "$(year)-$(month)";
    "month_year"     string  =>  "$(month)-$(year)";

  reports:
    cfengine::
      "Date as YYYY-MM: $(year_month)";
      "Date as MM-YYYY: $(month_year)";

}

Output:

R: Date as YYYY-MM: 2013-04
R: Date as MM-YYYY: 04-2013

May be shortened (with extra portability, flexibility and greater clarity) to:

body common control {
  bundlesequence => { "foo" };
}

bundle agent foo {

  vars:
    "year_month"     string  =>  strftime("localtime", "%Y-%m", now());
    "month_year"     string  =>  strftime("localtime", "%m-%Y", now());

  reports:
    cfengine::
      "Date as YYYY-MM: $(year_month)";
      "Date as MM-YYYY: $(month_year)";

}

Output:

R: Date as YYYY-MM: 2013-04
R: Date as MM-YYYY: 04-2013

Availability: master branch, upcoming 3.5