Forum: Cfengine Help
Subject: Getting a long list of files into Cfengine
Author: sauer
Link to topic: https://cfengine.com/forum/read.php?3,21000,21000#msg-21000

I'm trying to set up a promise that will ensure the first line of every perl 
file under a directory (there's about 3,000 of them) is the correct path to 
perl / has the right arguments passed.  Obviously, this isn't a really 
lightweight task, but it's not terrible, and it's not like I plan to check it 
every 5 minutes.

However, I'm having a hard time getting all of the files in.  I can't 
recursively edit files, because Cfengine has unfortunately decided not to allow 
edit rules with recursion, and doesn't provide a "yes, I really know what I'm 
doing" option to override that.  I can live with that decision, but that means 
I need to generate a list somehow.

I refuse to hard-code the list of files because that's evil.  And the string is 
way too big for this to work:

      "exec_list"      slist => splitstring(
                                 execresult( "$(find_path) $(find_arg)",
                                              "noshell"
                                 ),
                                 "$(const.n)",
                                 "99999999999" #why does "0" not work here?
                                );

even if I yank the prefix off and just list the relative filenames.

So, my first thought was to use the module protocol to generate an array.  But 
the array-making syntax isn't apparently available in the version I have 
(3.0.5), and due to the complexities of my environment, I won't be able to get 
a new version deployed across the enterprise until roughly December.  But I 
will eventally upgrade, so I wonder whether or not the module protocol suffers 
the same limits as execresult in terms of working with long strings.  If I can 
return a really long @files={ 'one' 'two', ... } string from a module, will 
Cfengine be ok with it?  Or is there a limitation on the maximum line or 
overall output length from a module, too?

In either case, to address my current issue before December-ish, I need to make 
this list.  And it looks like I need to build the list incrementally.  I do 
have a promise:

      "$(server_root)"
        perms         => mog("u+rw,g+r,g-w,o-rwx", "$(user)", "$(group)"),
        file_select   => by_name( @(executables) ),
        depth_search  => recurse("inf");

which is, one by one, hitting each of these files and setting the permissions.  
Is there something I can add to that promise along the lines of

  set_variable => filelist = slist { @(filelist) $(current_filename) }


which will let me build the array of files for doing the edits upon later?  I 
can't just define classes for each file, because the canonicalization of the 
names will make it impossible to go back to the actual filename (ie: was 
bin_file_pl originally /bin_file.pl or /bin/file.pl?)  That would be ideal from 
a performance POV, since I wouldn't have to traverse the directory again (on 
top of doing the edits).  I can't figure out a good way to do this with single 
variables from the module protocol, either, since I don't see anything in the 
docs about variable varables / pointers / whatever which would allow me to 
iterate over an unknown set of similarly-named variables.  If there was a 
structure where I could just say "do this on every $(modulename.file_*) 
variable", that might work.

I really want to do as much of this internal to Cfengine as possible.  
Suggestions are welcome.

_______________________________________________
Help-cfengine mailing list
Help-cfengine@cfengine.org
https://cfengine.org/mailman/listinfo/help-cfengine

Reply via email to