Config::Model::Loader(3pm) | User Contributed Perl Documentation | Config::Model::Loader(3pm) |
Config::Model::Loader - Load serialized data into config tree
version 2.152
use Config::Model; # define configuration tree object my $model = Config::Model->new; $model->create_config_class( name => "Foo", element => [ [qw/foo bar/] => { type => 'leaf', value_type => 'string' }, ] ); $model ->create_config_class ( name => "MyClass", element => [ [qw/foo bar/] => { type => 'leaf', value_type => 'string' }, hash_of_nodes => { type => 'hash', # hash id index_type => 'string', cargo => { type => 'node', config_class_name => 'Foo' }, }, [qw/lista listb/] => { type => 'list', cargo => {type => 'leaf', value_type => 'string' } }, ], ) ; my $inst = $model->instance(root_class_name => 'MyClass' ); my $root = $inst->config_root ; # put data my $steps = 'foo=FOO hash_of_nodes:fr foo=bonjour - hash_of_nodes:en foo=hello ! lista=foo,bar lista:2=baz listb:0=foo listb:1=baz'; $root->load( steps => $steps ); print $root->describe,"\n" ; # name value type comment # foo FOO string # bar [undef] string # hash_of_nodes <Foo> node hash keys: "en" "fr" # lista foo,bar,baz list # listb foo,baz list # delete some data $root->load( steps => 'lista~2' ); print $root->describe(element => 'lista'),"\n" ; # name value type comment # lista foo,bar list # append some data $root->load( steps => q!hash_of_nodes:en foo.=" world"! ); print $root->grab('hash_of_nodes:en')->describe(element => 'foo'),"\n" ; # name value type comment # foo "hello world" string
This module is used directly by Config::Model::Node to load serialized configuration data into the configuration tree.
Serialized data can be written by the user or produced by Config::Model::Dumper while dumping data from a configuration tree.
The constructor should be used only by Config::Model::Node.
Parameters:
The string is made of the following items (also called "actions") separated by spaces. These actions can be divided in 4 groups:
For instance, with "OpenSsh" model, you could do
Host:~"/.*.debian.org/" user='foo-guest'
to set "foo-user" users for all your debian accounts.
The leading and trailing '/' may be omitted. Be sure to surround the regexp with double quote if space are embedded in the regex.
Note that the loop ends when the load command goes above the element where the loop is executed. For instance, the instruction below tries to execute "DX=BV" and "int_v=9" for all elements of "std_id" hash:
std_id:~/^\w+$/ DX=Bv int_v=9
In the examples below only "DX=BV" is executed by the loop:
std_id:~/^\w+$/ DX=Bv - int_v=9 std_id:~/^\w+$/ DX=Bv ! int_v=9
The loop is done on all elements of the hash when no value is passed after "":~"" (mnemonic: an empty regexp matches any value).
I.e, for a list "('a',undef,'','c')", use "a,,"",c".
Using "xxx:~/yy/=zz" is also possible.
You may store deep data structure. In this case, make sure that the structure of the loaded data matches the structure of the model. This won't happen by chance.
For instance "foo="a quoted string"" or "foo="\"bar\" and \"baz\""".
Patterns with white spaces must be surrounded by quotes:
xxx=~"s/foo bar/bar baz/"
Perl pattern modifiers are accepted
xxx=~s/FOO/bar/i
Store STDIn in value xxx when "yyy" is '-'.
For instance, if "data.json" contains:
{ "foo": { "bar": 42 } }
The instruction "baz=.json(data.json/foo/bar)" stores 42 in "baz" element.
Since a YAML file can contain several documents (separated by "---" lines, the subpath must begin with a number to select the document containing the required value.
For instance, if "data.yaml" contains:
--- foo: bar: 42
The instruction "baz=.yaml(data.yaml/0/foo/bar)" stores 42 in "baz" element.
I.e. "foo#comment", "foo:bar#comment" or "foo:bar=baz#comment" are valid. "foo#comment:bar" is not valid.
You can surround indexes and values with double quotes. E.g.:
a_string="\"foo\" and \"bar\""
You can use cme to modify configuration with "cme modify" command.
For instance, if Config::Model::Ssh is installed, you can run:
cme modify ssh 'ControlMaster=auto ControlPath="~/.ssh/master-%r@%n:%p"'
To delete "Host *" entry:
cme modify ssh 'Host:-"*"'
To specify 2 "Host" with a single command:
cme modify ssh 'Host:"foo* bar*" ForwardX11=yes HostName="foo.com" - Host:baz HostName="baz.com"'
Note the '"-"' used to go up one node before ""Host:baz"". In this case, "up one node" leads to the "root node", so ""!"" could also be used instead of ""-"":
cme modify ssh 'Host:"foo* bar*" ForwardX11=yes HostName="foo.com" ! Host:baz HostName="baz.com"'
Let's modify now the host name of using a ".org" domain instead of ".com". The ":~" operator uses a regexp to loop over several Host entries:
cme modify ssh 'Host:~/ba[rz]/ HostName=~s/.com$/.org/'
Now that ssh config is mucked up with dummy entries, let's clean up:
cme modify ssh 'Host:-"baz" Host:-"foo* bar*"'
Load data into the node tree (from the node passed with "node") and fill values as we go following the instructions passed with "steps". ("steps" can also be an array ref).
Parameters are:
Dominique Dumont, (ddumont at cpan dot org)
Config::Model,Config::Model::Node,Config::Model::Dumper
Dominique Dumont
This software is Copyright (c) 2005-2022 by Dominique Dumont.
This is free software, licensed under:
The GNU Lesser General Public License, Version 2.1, February 1999
2022-07-28 | perl v5.34.0 |