# This example shows how classes are automatically canonified when they are # defined and that you must explicitly canonify when verifying classes. #+begin_src cfengine3 bundle agent main { classes: "my-illegal-class"; reports: # We search to see what class was defined: "$(with)" with => join( " ", classesmatching( "my.illegal.class" ) ); # We see that the illegal class is explicitly not defined. "my-illegal-class is NOT defined (as expected, its invalid)" unless => "my-illegal-class"; # We see the canonified form of the illegal class is defined. "my_illegal_class is defined" if => canonify("my-illegal-class"); # Note, if takes expressisons, you couldn't do that if it were # automatically canonified. Here I canonify the string using with, and use # it as part of the expression which contains an invalid classcharacter, but # its desireable for constructing expressions. "Slice and dice using `with`" with => canonify( "my-illegal-class" ), if => "linux|$(with)"; } #+end_src #+begin_src policy_description #@ First we promise to define `my-illegal-class`. When the promise is actuated #@ it is automatically canonified and defined. This automatic canonification is #@ logged in verbose logs (`verbose: Class identifier 'my-illegal-class' contains illegal characters - canonifying`). #@ Next several reports prove which form of the class was defined. The last #@ report shows how `if` takes a class expression, and if you are checking a class #@ that contains invalid characters you must canonify it. #+end_src #+begin_src example_output #@ ``` #@ R: my_illegal_class #@ R: my-illegal-class is NOT defined (as expected, its invalid) #@ R: my_illegal_class is defined #@ R: Slice and dice using `with` #@ ``` #+end_src