Re: Re: classfiltercsv: filtering only works on bundle level

Xander Cage <[email protected]>
Newsgroups gmane.comp.sysutils.cfengine.general
Message-ID <[email protected]>
nick, thank you for the clarification, at least i know which route to go 
now.

On Friday, November 5, 2021 at 4:52:03 PM UTC+1 Nick Anderson wrote:

> Xander Cage <[email protected]> writes: 
>
> i forgot to mention that the above shows hat the "filter classes" in the 
> classesfiltercsv function not "filtering" when used in various child 
> bundles if the definition of the datacontainer or the call to the 
> classfiltercsv function is not present in the bundle. 
>
> Reading the policy …, you are using classfiltercsv() inside of bundle 
> agent parent_bundle. Running with your data set I get no data container 
> defined, for example: 
>
>
> # cf-agent --no-lock --log-level info --show-evaluated-vars=parent_bundle --file /tmp/example.cf
> R: check_user reached: $(user)
> R: create_users reached: $(user)
> R: parent bundle: $(user)
> Variable name                            Variable value                                               Meta tags                                Comment                                 
> default:parent_bundle.data_file          /tmp/my.csv                                                  source=promise                                                                   
> default:parent_bundle.keys                                                                            source=promise                                                                   
> default:parent_bundle.keys_unsorted                                                                   source=promise                                                                   
> default:parent_bundle.my_data            []                                                           source=promise                                                                   
>
> This is because none of the class expressions in your first (zeroth) 
> column evaluate to true on my system in that bundle. So, I added a row that 
> would (any,nickanderson,Nick Anderson,neither-us-nor-them,ssh-bs) and I 
> modified the policy to point to the path I am using for the CSV (
> /tmp/my.csv) 
> Listing 1: CSV Data (/tmp/my.csv)
>
> ClassExpression,uid,name,group,ssh_key
> weirdos,mscott,Michael Scott,pathetic,ssh-someSupERsecretKey287483438dsdjhdsdsdjahhsgdsg
> weirdos,jkras,John Krasinski,pathetic,ssh-someSupERsecretKey287483438dsdjhdsdsdjahhsgdsg
> twats,tflen,Toby Flenderson,tedious,ssh-someSupERsecretKey287483438dsdjhdsdsdjahhsgdsg
> zombie,wimm,,dbaldap,
>
> ssh-someSupERsecretKey287483438dsdjhdsdsdjahhsgdsg
> any,nickanderson,Nick Anderson,neither-us-nor-them,ssh-bs
>
> Listing 2: Example Policy
>
> bundle agent parent_bundle{
>
>   vars:
>
>       "data_file" string => "/tmp/my.csv";
>       "my_data" data => classfiltercsv( $(data_file), "true", 0);
>
>       
>
> "keys_unsorted" slist => getindices(my_data);
>
>       "keys" slist => sort(keys_unsorted, "lex");
>       "user" string => "$(my_data[$(keys)][uid])";
>
>
>
>   methods:
>
>       "call_check_user"     usebundle => check_user( @(my_data) ),
>         handle => "remove_it";
>
>       "call_create_user"   usebundle => create_users_new( @(my_data) ),
>         depends_on => { "remove_it" };
>
>   reports:
>
>       "parent bundle: $(user)";
> }
>
> bundle agent check_user (info) {
>
>   vars:
>
>       "keys_unsorted" slist => getindices(info);
>       "keys" slist => sort(keys_unsorted, "lex");
>       "user" string => "$(info[$(keys)][uid])";
>
>   classes:
>
>       "zombie";
>
>
>   reports:
>
>       "check_user reached: $(user)";
>
> }
>
> bundle agent create_users_new(info) {
>
>
>   vars:
>       "keys_unsorted" slist => getindices(info);
>
>       "keys" slist => sort(keys_unsorted, "lex");
>
>       "user" string => "$(info[$(keys)][uid])";
>       "group" string => "$(info[$(keys)][group])";
>       "ssh_key" string => "$(info[$(keys)][ssh_key])";
>       "name" string => "$(info[$(keys)][name])";
>
>   classes:
>
>       "weirdos";
>       "twats";
>
>   reports:
>
>       "create_users reached: $(user)";
> }
> bundle agent __main__{
>   methods:
>       "parent_bundle";}
>
> With that change, the rows with class expressions that evaluate to true 
> become part of the data container that result from parsing. 
>
>
> # cf-agent --no-lock --log-level info --show-evaluated-vars=parent_bundle --file /tmp/example.cf
> R: check_user reached: nickanderson
> R: create_users reached: nickanderson
> R: parent bundle: nickanderson
> Variable name                            Variable value                                               Meta tags                                Comment                                 
> default:parent_bundle.data_file          /tmp/my.csv                                                  source=promise                                                                   
> default:parent_bundle.keys                {"0"}                                                       source=promise                                                                   
> default:parent_bundle.keys_unsorted       {"0"}                                                       source=promise                                                                   
> default:parent_bundle.my_data            [{"group":"neither-us-nor-them","name":"Nick Anderson","ssh_key":"ssh-bs","uid":"nickanderson"}] source=promise                                                                   
> default:parent_bundle.user               nickanderson                                                 source=promise                                                                   
>
> Reading the policy further …., some bundles (bundle agent check_user, and bundle 
> agent create_user_new) are promised as methods. Inside these bundles 
> there are some bundle scope classes defined and some variables are created 
> by pulling the data off of the previously defined data container that is 
> passed in to the bundle as an argument. 
>
> whats the deal if i have to define all filtering classes in the parent 
> bundle? seems useless to me. this function is at least somewhat 
> inconvenient , or i am doing something completely wrong. any insights? 
>
> Yes, sorry to say, I think you have a completely different expectation of 
> what the behavior should be than what it provides. 
>
> To me, it looks like you expect classfiltercsv() to filter your data set 
> when you access the data set. That might be a nifty function in it's own 
> right, but that is not how classfiltercsv() behaves. classfiltercsv() 
> filters the data as it is read in based on the context at that point in 
> time. 
>
> So, if you want one data set of the rows that match *weirdos* and *twats* 
> and another data set consisting of the rows that match *zombie* as I 
> believe your example policy illustrates you would need to make 2 calls to 
> classfiltercsv(). 
>

-- 
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/1c70b6ab-8fd6-4a6a-9461-937ea70980aan%40googlegroups.com.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.