Re: Template validation

"'Lars Erik Wik' via help-cfengine" <[email protected]> Fri, 15 Mar 2024 07:25:57 -0700 (PDT)
Newsgroups gmane.comp.sysutils.cfengine.general
Message-ID <[email protected]>
Hi Markus,

We don't have an attribute like `validate` in CFEngine as far as I know. 
However, the same functionality can be achieved by splitting up the 
promise. One promise for rendering a temporary file, another for copying 
that file into the final destination. Here is an example:

```cf3
body copy_from cp(source) {
  source => "$(source)";
}

bundle agent main {
  vars:
    "temp_file"
      string => "/tmp/TEMP.cfengine";

    "dest_file_1"
      string => "/tmp/file-1.txt";

    "dest_file_2"
      string => "/tmp/file-2.txt";

  files:
    "$(temp_file)"
      content => "Hello CFEngine";

    "$(dest_file_1)" # This file will pass validation
      copy_from => cp("$(temp_file)"),
      if => fileexists($(temp_file)),
      unless => not(returnszero("/usr/bin/grep --quiet 'Hello CFEngine' 
$(temp_file)", noshell));

    "$(dest_file_2)" # This file will not pass validation
      copy_from => cp("$(temp_file)"),
      if => fileexists($(temp_file)),
      unless => not(returnszero("/usr/bin/grep --quiet 'Hello World' 
$(temp_file)", noshell));
}
```

I used the `if` attribute to make sure the file is created before I running 
the command in the `unless` attribute. I use them in this order, because 
`if` is executed before `unless`.

By running the example, we can see that only '/tmp/file-1.txt' was created 
(with the exception of '/tmp/TEMP.cfengine' ofc.)

```
# cf-agent -KIf ~/example.cf 
    info: Created file '/tmp/TEMP.cfengine', mode 0600
    info: Updated file '/tmp/TEMP.cfengine' with content 'Hello CFEngine'
    info: Copied file '/tmp/TEMP.cfengine' to '/tmp/file-1.txt.cfnew' (mode 
'600')
    info: Moved '/tmp/file-1.txt.cfnew' to '/tmp/file-1.txt'
    info: Updated file '/tmp/file-1.txt' from 'localhost:/tmp/TEMP.cfengine'
```

However, this is quite a bit of code which compared to Ansibles one liner. 
The validate attribute sounds like a very nice feature, thus I created a 
ticket (see https://northerntech.atlassian.net/browse/CFE-4356) to add it 
to CFEngine as well. If you plan on using this multiple places, you can 
consider putting it into a bundle for reusability. 

On Friday, March 15, 2024 at 9:37:29 AM UTC+1 Markus Rexhepi-Lindberg wrote:

> Hi,
>
> Is there something equivalent to the validate function that is used for 
> the template module in Ansible [1] for CFEngine's template engine? I have 
> built some logic to validate the `/etc/ssh/sshd_config` config file for the 
> sshd application before writing to it in one of my CFEngine policies but it 
> has some drawbacks and it is not really an elegant solution.
>
> [1] 
> https://docs.ansible.com/ansible/latest/collections/ansible/builtin/template_module.html#parameter-validate
>

-- 
You received this message because you are subscribed to the Google Groups "help-cfengine" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [email protected].
To view this discussion on the web visit https://groups.google.com/d/msgid/help-cfengine/54c274ee-8efd-4c49-aba5-478eb5508891n%40googlegroups.com.