CFEngine: little insert_lines annoyance fixed
  2013-04-28

Sometimes, crontab entries are preferable over CFEngine internal scheduling when jobs have special scheduling requirements. I have one example where a job must absolutely be started every 2 minutes. (03:20, 03:22, 03:24 and so on)

By default cf-execd is started every 5 minutes, it is ok for 03:20 with Min00, but Min22 and Min24 hard classes will never be defined while cf-execd is running, and some job occurrences never started. Cf-execd can be launched every minute, but by reducing this interval you may have to deal with lock issues. (long splaytime ?)

In such cases, an insert_lines promise to system crontab does the job, however insert_lines tries to give to regular expression metacharacters their special meaning, what is not desired:

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

bundle agent insert {

  files:
    "/tmp/crontab"
      comment   =>  "Insertion of lines containing special meaning characters",
      edit_line =>  my_insert;
}

bundle edit_line my_insert {

  insert_lines:
    "*/2 * * * * root /path/to/my/job.sh";
}

Running the bundle:

$ cf-agent -KIf insert_lines.cf
Running full policy integrity checks
Regular expression error "nothing to repeat" in expression "*/2 * * * * root /path/to/my/job.sh" at 0
-> Edit file /tmp/crontab

It works, but the “Regular expression error…” message is a bit annoying, especially with many files editing promises.

A solution is to avoid special meaning characters in the crontab entry:

0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,...(you get the idea) * * * * root /path/to/my/job.sh

Not only the line is unreadable but also error-prone. Warning message is gone but the gain is not obvious.

Fortunately, this has been fixed 14 days ago in core/master branch \o/

$ cf-agent -KIf insert_lines.cf
Running full policy integrity checks
-> Edit file /tmp/crontab

This will certainly be part of the CFEngine 3.5 release.