#+begin_src prep #@ ``` #@ rm -rf /tmp/CFE-3217 #@ mkdir -p /tmp/CFE-3217/test-delete-nobasedir/one/two/three #@ mkdir -p /tmp/CFE-3217/test-delete/one/two/three #@ mkdir -p /tmp/CFE-3217/test-perms/one/two/three #@ mkdir -p /tmp/CFE-3217/test-perms-nobasedir/one/two/three #@ touch /tmp/CFE-3217/test-delete-nobasedir/one/two/three/file #@ touch /tmp/CFE-3217/test-delete/one/two/three/file #@ touch /tmp/CFE-3217/test-perms/one/two/three/file #@ touch /tmp/CFE-3217/test-perms-nobasedir/one/two/three/file #@ touch /tmp/CFE-3217/test-delete-nobasedir/file #@ touch /tmp/CFE-3217/test-delete/file #@ touch /tmp/CFE-3217/test-perms/file #@ touch /tmp/CFE-3217/test-perms-nobasedir/file #@ ``` #+end_src ############################################################################### #+begin_src cfengine3 bundle agent main # @brief Example showing how to promise permissions recursively and promise a directory tree is empty. It illustrates the behavior of `include_basedir` in `depth_search` bodies and that the delete ignores `include_basedir`. { files: "/tmp/CFE-3217/test-delete/." -> { "CFE-3217", "CFE-3218" } depth_search => aggressive("true"), file_select => all, delete => tidy, comment => "include_basedir => 'true' will not result in thd promised directory being removed."; "/tmp/CFE-3217/test-delete-nobasedir/." depth_search => aggressive("false"), file_select => all, delete => tidy, comment => "include_basedir => 'false' will not result in thd promised directory being removed."; "/tmp/CFE-3217/test-perms/." perms => m(555), depth_search => aggressive("true"), file_select => all, comment => "include_basedir => 'true' results in thd promised directory having permissions managed as well."; "/tmp/CFE-3217/test-perms-nobasedir/." -> { "CFE-3217" } perms => m(555), depth_search => aggressive("false"), file_select => all, comment => "include_basedir => 'false' results in thd promised directory not having permissions managed."; reports: "delete => tidy"; "/tmp/CFE-3217/test-delete present despite include_basedir => 'true'" if => isdir("/tmp/CFE-3217/test-delete"); "/tmp/CFE-3217/test-delete-nobasedir present as expected with include_basedir => 'false'" if => isdir("/tmp/CFE-3217/test-delete-nobasedir"); "/tmp/CFE-3217/test-delete absent, unexpectedly" unless => isdir("/tmp/CFE-3217/test-delete"); "/tmp/CFE-3217/test-delete-nobasedir absent, unexpectedly" unless => isdir("/tmp/CFE-3217/test-delete-nobasedir"); "perms => m(555)"; "/tmp/CFE-3217/test-perms $(with), as expected with include_basedir => 'true'" with => filestat( "/tmp/CFE-3217/test-perms", modeoct ), if => strcmp( filestat( "/tmp/CFE-3217/test-perms", modeoct ), "40555" ); "/tmp/CFE-3217/test-perms-nobasedir $(with), not 555, as expected with include_basedir => 'false'" with => filestat( "/tmp/CFE-3217/test-perms-nobasedir", modeoct ), unless => strcmp( filestat( "/tmp/CFE-3217/test-perms-nobasedir", modeoct ), "40555" ); } body depth_search aggressive(include_basedir) # @brief Search for files recursively from promiser traversing synmlinks and filesystem boundaries. { depth => "inf"; # exclude_dirs => { @(exclude_dirs) }; include_basedir => "$(include_basedir)"; # include_dirs => { @(include_dirs) }; # inherit_from => "$(inherit_from)"; # meta => "$(meta)"; meta attribute inside the depth_search body? It's not documented. TODO!? rmdeadlinks => "false"; # Depth search removes dead links, this seems like something that should be in delete body. TODO!? traverse_links => "true"; xdev => "true"; } #@ Inlined bodies from the stdlib in the Masterfiles Policy Framework body file_select all # @brief Select all file system entries { leaf_name => { ".*" }; file_result => "leaf_name"; } body delete tidy # @brief Delete the file and remove empty directories # and links to directories { dirlinks => "delete"; rmdirs => "true"; } body perms m(mode) # @brief Set the file mode # @param mode The new mode { mode => "$(mode)"; } #+end_src ############################################################################### #+begin_src example_output #@ ``` #@ info: Deleted file '/tmp/CFE-3217/test-delete/./one/two/three/file' #@ info: Deleted directory '/tmp/CFE-3217/test-delete/./one/two/three' #@ info: Deleted directory '/tmp/CFE-3217/test-delete/./one/two' #@ info: Deleted directory '/tmp/CFE-3217/test-delete/./one' #@ info: Deleted file '/tmp/CFE-3217/test-delete/./file' #@ info: Deleted file '/tmp/CFE-3217/test-delete-nobasedir/./one/two/three/file' #@ info: Deleted directory '/tmp/CFE-3217/test-delete-nobasedir/./one/two/three' #@ info: Deleted directory '/tmp/CFE-3217/test-delete-nobasedir/./one/two' #@ info: Deleted directory '/tmp/CFE-3217/test-delete-nobasedir/./one' #@ info: Deleted file '/tmp/CFE-3217/test-delete-nobasedir/./file' #@ info: Object '/tmp/CFE-3217/test-perms-nobasedir/./file' had permission 0664, changed it to 0555 #@ R: delete => tidy #@ R: /tmp/CFE-3217/test-delete present despite include_basedir => 'true' #@ R: /tmp/CFE-3217/test-delete-nobasedir present as expected with include_basedir => 'false' #@ R: perms => m(555) #@ R: /tmp/CFE-3217/test-perms 40555, as expected with include_basedir => 'true' #@ R: /tmp/CFE-3217/test-perms-nobasedir 40775, not 555, as expected with include_basedir => 'false' #@ ``` #+end_example