Re: accessing data from json array of json arrays

Xander Cage <[email protected]> Tue, 13 Jun 2023 08:07:35 -0700 (PDT)
Newsgroups gmane.comp.sysutils.cfengine.general
Message-ID <[email protected]>
Hi Nick,

<< What is it you want to do with the version number?>>

in the end, i need the version number to upgrade aix filesets if downlevel. 
until now, i did this by exuting plain old system commands, but i thought 
it would be cool to use the already existing inventory file.
anyway...your example helped a lot.... as always ;-)
thank you for that

chris


On Tuesday, June 13, 2023 at 4:43:25 PM UTC+2 [email protected] wrote:

> Hi, Chris 
>
> Hi, 
>
> i am reading in a inventory file in csv format with readdcsv() and get 
> what i believe is a array of arrays. 
>
> R: From aix inventory, got data 
> [["xlsmp.rte","5.1.0.0","default","lslpp"],["xlsmp.msg.en_US.rte","5.1.0.0","default","lslpp"],["xlsmp.msg.EN_US.rte","5.1.0.0","default","lslpp"], 
> ["xlsmp.aix61.rte","5.1.0.0","default","lslpp"],["xlmass.lib","6.1.0.4","default","lslpp"],["xlmass.aix53.lib","6.1.0.4","default","lslpp"], 
> ["xlmass.adt.include","6.1.0.4","default","lslpp"],["xlmass.8.1.3","8.1.3.1","default","lslpp"],["xlmass.10.1.0","10.1.0.0","default","lslpp"], 
> ["xlfrte.aix61","15.1.3.5","default","lslpp"],["xlfrte","15.1.3.5","default","lslpp"]] 
>
>
> Yep, that's what it looks like to me. 
>
> By the way, have you seen classfiltercsv()? One of it's nice features is 
> named columns. 
>
> now i need to extract the version number from a package (by name). tried 
> filter() and grep() but both returned nothing. 
>
> example: 
>
> ["xlfrte.aix61","15.1.3.5","default","lslpp"] 
>   
>
> package name version 
>
> so how to do it? 
>
> What is it you want to do with the version number? 
>
> I often like to use associative arrays for to re-construct data 
> structures. 
>
> I might access it like this: 
>
> bundle agent __main__{
>   methods: "eval_numbers";}bundle agent eval_numbers {
>
>   vars:
>
>       #"my_data" data => readcsv("$(sys.workdir)/state/software_packages.csv");
>       "my_data" data => '[["xlsmp.rte","5.1.0.0","default","lslpp"],["xlsmp.msg.en_US.rte","5.1.0.0","default","lslpp"],["xlsmp.msg.EN_US.rte","5.1.0.0","default","lslpp"],
>
>        ["xlsmp.aix61.rte","5.1.0.0","default","lslpp"],["xlmass.lib","6.1.0.4","default","lslpp"],["xlmass.aix53.lib","6.1.0.4","default","lslpp"],       ["xlmass.adt.include","6.1.0.4","default","lslpp"],["xlmass.8.1.3","8.1.3.1","default","lslpp"],["xlmass.10.1.0","10.1.0.0","default","lslpp"],
>
>        ["xlfrte.aix61","15.1.3.5","default","lslpp"],["xlfrte","15.1.3.5","default","lslpp"]]';
>
>       # here we get the positional indices of each array which we use to iterate over the data
>       "l_indices_my_data" slist => getindices( my_data );
>
>       # We might build an associative array which can make the data easier to
>       # work with. You may or may not want to use all the fields. You can even
>       # do filtering here if you only need to use part of the data, e.g. by
>       # adding if => regcmp( "^xlfrte.*$", "$(my_data[$(l_indices_my_data)][0])" )
>
>       "arr_my_data[$(my_data[$(l_indices_my_data)][0])][version]"
>         string =>"$(my_data[$(l_indices_my_data)][1])";
>       "arr_my_data[$(my_data[$(l_indices_my_data)][0])][field3]" # Perhaps useless
>         string =>"$(my_data[$(l_indices_my_data)][2])";
>       "arr_my_data[$(my_data[$(l_indices_my_data)][0])][command]" # Perhaps useless
>         string =>"$(my_data[$(l_indices_my_data)][3])";
>
>
>       # From here you can get a consolidated list of package names, which could be filtered
>       "l_my_data_packages" slist => getindices( arr_my_data );
>       "l_my_data_filtered" slist => filter( "^xlfrte.*$",
>                                             getindices( arr_my_data ), # Could have used l_my_data_packages instead of getindices again
>                                             true,
>                                             false,
>                                             inf);
>   reports:
>
>       # Print out a list of the filtered package names
>       "Filtered result: $(with)" with => join( ", ", l_my_data_filtered );
>
>       # Print out a list of the filtered package names and their versions
>       "Package $(l_my_data_filtered): $(arr_my_data[$(l_my_data_filtered)][version])";}
>
>
> # cf-agent --no-lock --log-level info --show-evaluated-vars=eval_numbers --file /tmp/example.cf
> R: Filtered result: xlfrte, xlfrte.aix61
> R: Package xlfrte: 15.1.3.5
> R: Package xlfrte.aix61: 15.1.3.5
> Variable name                            Variable value                                               Meta tags                                Comment
> default:eval_numbers.arr_my_data[xlfrte.aix61][command] lslpp                                                        source=promise
> default:eval_numbers.arr_my_data[xlfrte.aix61][field3] default                                                      source=promise
> default:eval_numbers.arr_my_data[xlfrte.aix61][version] 15.1.3.5                                                     source=promise
> default:eval_numbers.arr_my_data[xlfrte][command] lslpp                                                        source=promise
> default:eval_numbers.arr_my_data[xlfrte][field3] default                                                      source=promise
> default:eval_numbers.arr_my_data[xlfrte][version] 15.1.3.5                                                     source=promise
> default:eval_numbers.arr_my_data[xlmass.10.1.0][command] lslpp                                                        source=promise
> default:eval_numbers.arr_my_data[xlmass.10.1.0][field3] default                                                      source=promise
> default:eval_numbers.arr_my_data[xlmass.10.1.0][version] 10.1.0.0                                                     source=promise
> default:eval_numbers.arr_my_data[xlmass.8.1.3][command] lslpp                                                        source=promise
> default:eval_numbers.arr_my_data[xlmass.8.1.3][field3] default                                                      source=promise
> default:eval_numbers.arr_my_data[xlmass.8.1.3][version] 8.1.3.1                                                      source=promise
> default:eval_numbers.arr_my_data[xlmass.adt.include][command] lslpp                                                        source=promise
> default:eval_numbers.arr_my_data[xlmass.adt.include][field3] default                                                      source=promise
> default:eval_numbers.arr_my_data[xlmass.adt.include][version] 6.1.0.4                                                      source=promise
> default:eval_numbers.arr_my_data[xlmass.aix53.lib][command] lslpp                                                        source=promise
> default:eval_numbers.arr_my_data[xlmass.aix53.lib][field3] default                                                      source=promise
> default:eval_numbers.arr_my_data[xlmass.aix53.lib][version] 6.1.0.4                                                      source=promise
> default:eval_numbers.arr_my_data[xlmass.lib][command] lslpp                                                        source=promise
> default:eval_numbers.arr_my_data[xlmass.lib][field3] default                                                      source=promise
> default:eval_numbers.arr_my_data[xlmass.lib][version] 6.1.0.4                                                      source=promise
> default:eval_numbers.arr_my_data[xlsmp.aix61.rte][command] lslpp                                                        source=promise
> default:eval_numbers.arr_my_data[xlsmp.aix61.rte][field3] default                                                      source=promise
> default:eval_numbers.arr_my_data[xlsmp.aix61.rte][version] 5.1.0.0                                                      source=promise
> default:eval_numbers.arr_my_data[xlsmp.msg.EN_US.rte][command] lslpp                                                        source=promise
> default:eval_numbers.arr_my_data[xlsmp.msg.EN_US.rte][field3] default                                                      source=promise
> default:eval_numbers.arr_my_data[xlsmp.msg.EN_US.rte][version] 5.1.0.0                                                      source=promise
> default:eval_numbers.arr_my_data[xlsmp.msg.en_US.rte][command] lslpp                                                        source=promise
> default:eval_numbers.arr_my_data[xlsmp.msg.en_US.rte][field3] default                                                      source=promise
> default:eval_numbers.arr_my_data[xlsmp.msg.en_US.rte][version] 5.1.0.0                                                      source=promise
> default:eval_numbers.arr_my_data[xlsmp.rte][command] lslpp                                                        source=promise
> default:eval_numbers.arr_my_data[xlsmp.rte][field3] default                                                      source=promise
> default:eval_numbers.arr_my_data[xlsmp.rte][version] 5.1.0.0                                                      source=promise
> default:eval_numbers.l_indices_my_data    {"0","1","2","3","4","5","6","7","8","9","10"}              source=promise
> default:eval_numbers.l_my_data_filtered   {"xlfrte","xlfrte.aix61"}                                   source=promise
> default:eval_numbers.l_my_data_packages   {"xlfrte","xlmass.adt.include","xlmass.8.1.3","xlfrte.aix61","xlmass.10.1.0","xlsmp.aix61.rte","xlmass.lib","xlmass.aix53.lib","xlsmp.rte","xlsmp.msg.EN_US.rte","xlsmp.msg.en_US.rte"} source=promise
> default:eval_numbers.my_data             [["xlsmp.rte","5.1.0.0","default","lslpp"],["xlsmp.msg.en_US.rte","5.1.0.0","default","lslpp"],["xlsmp.msg.EN_US.rte","5.1.0.0","default","lslpp"],["xlsmp.aix61.rte","5.1.0.0","default","lslpp"],["xlmass.lib","6.1.0.4","default","lslpp"],["xlmass.aix53.lib","6.1.0.4","default","lslpp"],["xlmass.adt.include","6.1.0.4","default","lslpp"],["xlmass.8.1.3","8.1.3.1","default","lslpp"],["xlmass.10.1.0","10.1.0.0","default","lslpp"],["xlfrte.aix61","15.1.3.5","default","lslpp"],["xlfrte","15.1.3.5","default","lslpp"]] source=promise
>
>

-- 
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/fc6f2e43-21a4-41c2-824c-f48c1e24ab61n%40googlegroups.com.