NAME
Config::Model::Loader - Load serialized data into config tree
VERSION
version 2.080
SYNOPSIS
use Config::Model;
use Log::Log4perl qw(:easy);
Log::Log4perl->easy_init($WARN);
# 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 $step = '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( step => $step );
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( step => 'lista~2' );
print $root->describe(element => 'lista'),"\n" ;
# name value type comment
# lista foo,bar list
# append some data
$root->load( step => 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
DESCRIPTION
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.
CONSTRUCTOR
new ( )
No parameter. The constructor should be used only by Config::Model::Node.
load string syntax
The string is made of the following items (also called actions
) separated by spaces. These actions can be divided in 4 groups:
navigation: moving up and down the configuration tree.
list and hash operation: select, add or delete hash or list item (also known as
id
items)leaf operation: select, modify or delecte leaf value
annotation: modify or delete configuration annotation (aka comment)
navigation
- -
-
Go up one node
- !
-
Go to the root node of the configuration tree.
- xxx
-
Go down using
xxx
element. (Fornode
type element) - /xxx
-
Go up until the element
xxx
is found. This search can be combined with one of the command specified below, e.g/a_string="foo bar"
list and hash operation
- xxx:yy
-
Go down using
xxx
element and idyy
(Forhash
orlist
element withnode
cargo_type). Literal\n
will be replaced by real\n
(LF in Unix). - xxx:~/yy/
-
Go down using
xxx
element and loop over the ids that match the regex. (Forhash
)For instance, with
OpenSsh
model, you could doHost:~/.*.debian.org/ user='foo-guest'
to set "foo-user" users for all your debian accounts.
- xxx:-yy
-
Delete item referenced by
xxx
element and idyy
. For a list, this is equivalent tosplice xxx,yy,1
. This command does not go down in the tree (since it has just deleted the element). I.e. a '-
' is generally not needed afterwards. - xxx:-=yy
-
Remove the element whose value is
yy
. For list or hash of leaves. Will not complain if the value to delete is not found. - xxx:-~/yy/
-
Remove the element whose value matches
yy
. For list or hash of leaves. Will not complain if no value were deleted. - xxx:=~s/yy/zz/
-
Substitute a value with another. Perl switches can be used(e.g.
xxx:=~s/yy/zz/gi
) - xxx:<yy or xxx:.push(yy)
-
Push
yy
value onxxx
list - xxx:>yy or xxx:.unshift(yy)
-
Unshift
yy
value onxxx
list - xxx:@ or xxx:.sort
-
Sort the list
- xxx:.insert_at(yy,zz)
-
Insert
zz
value onxxx
list before indexyy
. - xxx:.insert_before(yy,zz)
-
Insert
zz
value onxxx
list before valueyy
. - xxx:.insert_before(/yy/,zz)
-
Insert
zz
value onxxx
list before value matchingyy
. - xxx:.insort(zz)
-
Insert
zz
value onxxx
list so that existing alphanumeric order is preserved. - xxx:=z1,z2,z3
-
Set list element
xxx
to listz1,z2,z3
. Use,,
for undef values, and""
for empty values.I.e, for a list
('a',undef,'','c')
, usea,,"",c
. - xxx:yy=zz
-
For
hash
element containingleaf
cargo_type. Set the leaf identified by keyyy
to valuezz
.Using
xxx:~/yy/=zz
is also possible. - xxx:.copy(yy,zz)
-
copy item
yy
inzz
leaf operation
- xxx=zz
-
Set element
xxx
to valueyy
. load also accepts to set elements with a quoted string. (Forleaf
element) Literal\n
will be replaced by real\n
(LF in Unix). Literal\\
will be replaced by\
.For instance
foo="a quoted string"
orfoo="\"bar\" and \"baz\""
. - xxx=~s/foo/bar/
-
Apply the substitution to the value of xxx.
s/foo/bar/
is the standard Perls
substitution pattern.If your patten needs white spaces, you will need to surround the pattern with quotes:
xxx=~"s/foo bar/bar baz/"
Perl pattern modifiers are accepted
xxx=~s/FOO/bar/i
- xxx~
-
Undef element
xxx
- xxx.=zzz
-
Will append
zzz
value to current values (valid forleaf
elements).
annotation
- xxx#zzz or xxx:yyy#zzz
-
Element annotation. Can be quoted or not quoted. Note that annotations are always placed at the end of an action item.
I.e.
foo#comment
,foo:bar#comment
orfoo:bar=baz#comment
are valid.foo#comment:bar
is not valid.
Quotes
You can surround indexes and values with double quotes. E.g.:
a_string="\"foo\" and \"bar\""
Examples
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*"'
Methods
load ( ... )
Load data into the node tree (from the node passed with node
) and fill values as we go following the instructions passed with step
. (step
can also be an array ref).
Parameters are:
- node
-
node ref of the root of the tree (of sub-root) to start the load from.
- step
-
A string or an array ref containing the steps to load. See above for a description of the string.
- check
-
Whether to check values while loading. Either
yes
(default),no
orskip
. Loading withskip
will discard bad values.
AUTHOR
Dominique Dumont, (ddumont at cpan dot org)
SEE ALSO
Config::Model,Config::Model::Node,Config::Model::Dumper
AUTHOR
Dominique Dumont
COPYRIGHT AND LICENSE
This software is Copyright (c) 2016 by Dominique Dumont.
This is free software, licensed under:
The GNU Lesser General Public License, Version 2.1, February 1999