[augeas-devel] Migrating config file formats
Doug Warner
doug at warner.fm
Mon May 14 20:08:14 UTC 2012
Here's my current lens for managing the /etc/conf.d/net file for gentoo; it
uses the @syntax to map between baselayout 1 and 2.
The big thing is the difference in handling quoting; the old lens would allow
you to switch between quoting styles within a single variable (since it was a
real array) but now it's forced to one quoting style per-array. I can think
of situations where this might bite you (including literal $'s) but I can't
think of a good way to handle it.
-Doug
On 04/25/2012 06:09 PM, Raphaël Pinson wrote:
> On Wed, Apr 25, 2012 at 10:09 PM, Doug Warner <doug at warner.fm> wrote:
>> Sorry for the long delay here; starting to come back around to this problem :)
>>
>> I really like your idea for supporting multiple syntaxes here and marking them
>> with this type of "version" string (you could label each syntax for each
>> matching version to make it easier to understand what is going on).
>
>
> You need to leave one syntax without a "@syntax" node (probably the
> most recent syntax). The reason for this is that otherwise, this
> parameter would become necessary for the tree to be valid, and users
> would have to specify which syntax they want to use. It's much easier
> if users don't care about it and just get the newest syntax by
> default, without having to even know that "@syntax" nodes exist.
>
>
>> So, related to this; would it be possible to include an external lens to
>> handle the parsing for the "old version" and write the new version inside the
>> current file? I was thinking of just continuing to use the ShellVars lens to
>> parse the line for the "old version" and tag it the appropriate syntax version
>> and then write the new one as the default.
>
>
> Sure, that's possible, but there are conditions. The example I gave
> was quite simple (even simplistic). You have to avoid ambiguity in the
> Augeas bidirectional transformations. That means:
>
> * No ambiguity on keys (same key mapping different syntaxes with
> different lenses);
> * No ambiguity on syntax (overlapping regexes for several syntaxes).
>
>
> In the example I gave, I handled these two cases by:
>
> * Using a single label (in that case "key") declaration to avoid the
> ambiguity on the keys, and handling the syntax cases inside this
> single lens (declaring 3 lenses and using a union of them wouldn't
> work, it would raise an ambiguity since the 3 keys would match the
> same regex);
> * Making sure syntaxes are non-overlapping (in this case, using
> colons, commas or equal sign as separators ensure they cannot be
> overlapping).
>
> The lens declaration could very well use more complex lenses, and even
> lenses from other modules (such as Shellvars.lns), so long as it
> follows these two rules.
>
> If you have a specific case, that could be interesting.
>
> Raphaël
>
>
>
>> On 02/11/2012 05:07 PM, Raphaël Pinson wrote:
>>> After thinking about it some more, I think it could be useful to get
>>> to a standard using subnodes.
>>>
>>> Here is an example, unrelated to the suggested problem:
>>>
>>>
>>> module Migration =
>>>
>>> (* There are 3 possible syntaxes for a line
>>> The last one doesn't have a "@syntax" subnode, it's the default -
>>> newest - syntax *)
>>> let line = [ key Rx.word .
>>> ( (Sep.colon . store Rx.word . [ label "@syntax" . value "1" ])
>>> | (Sep.space . store Rx.word . [ label "@syntax" . value "2" ])
>>> | (Sep.equal . store Rx.word) )
>>> . Util.eol ]
>>>
>>> let lns = line*
>>>
>>> (* Now for some tests *)
>>> let full = "foo:bar\nfoo=baz\nfoo baa\n"
>>>
>>> (* Get all kind of syntaxes *)
>>> test lns get full =
>>> { "foo" = "bar"
>>> { "@syntax" = "1" }
>>> }
>>> { "foo" = "baz" }
>>> { "foo" = "baa"
>>> { "@syntax" = "2" }
>>> }
>>>
>>> (* Migrate all to new syntax *)
>>> test lns put full after
>>> rm "//@syntax" =
>>> "foo=bar\nfoo=baz\nfoo=baa\n"
>>>
>>> (* Force syntax 1 for last entry *)
>>> test lns put full after
>>> set "/foo[3]/@syntax" "1" =
>>> "foo:bar\nfoo=baz\nfoo:baa\n"
>>>
>>>
>>>
>>> Could that be an interesting approach in general?
>>>
>>> Raphaël
>>>
>>>
>>>
>>> 2012/1/26 Raphaël Pinson <raphink at gmail.com>:
>>>> Hi Doug,
>>>>
>>>> On Thu, Jan 26, 2012 at 4:07 PM, Doug Warner <doug at warner.fm> wrote:
>>>>> I'm working on a lens to work with Gentoo's new /etc/conf.d/net format and I
>>>>> realized I need to convert their old format to the new format.
>>>>>
>>>>> What's the best way to migrate from one format to another? I have my lens
>>>>> mostly working for the new format now, but I realized I might need to parse
>>>>> both versions; but then I thought that it might not update when augeas
>>>>> reads/writes the config file.
>>>>>
>>>>> I am using puppet to manage these files; so the values are typically set each
>>>>> run; I'm hoping that would cause augeas to write down the new format rather
>>>>> than leave it the old version.
>>>>>
>>>>> I guess the last option is to wipe out the old file when I upgrade and let
>>>>> puppet/augeas write down the new file, but that seems painful as well.
>>>>>
>>>>> Any recommendations on what to do here?
>>>>>
>>>>
>>>>
>>>> That's a very interesting question. I see two ways of doing this:
>>>> * write a single lens which will map both syntaxes to different nodes
>>>> in the tree, and use the "move" command to migrate;
>>>> * or write two lenses bound to two different files (file.old and
>>>> file.new or something similar) and use the "move" command to migrate.
>>>>
>>>>
>>>> Here is a (minimalistic) proof of concept using the first option:
>>>>
>>>> $ cat myconfig.aug
>>>> module MyConfig =
>>>>
>>>> autoload xfm
>>>>
>>>> let old_record =
>>>> let entry = [ Util.del_str "\""
>>>> . label "entry"
>>>> . store /[0-9.\/]+/
>>>> . Util.del_str "\"" ]
>>>> in [ label "old_record" . store Rx.word
>>>> . Util.del_str "=("
>>>> . Build.opt_list entry Sep.space
>>>> . Util.del_str ")" . Util.eol ]
>>>>
>>>> let new_record =
>>>> let entry = [ label "entry"
>>>> . store /[0-9.\/]+/ ]
>>>> in [ label "new_record" . store Rx.word
>>>> . Util.del_str "=\""
>>>> . Build.opt_list entry Util.eol
>>>> . Util.del_str "\"" . Util.eol ]
>>>>
>>>>
>>>> let lns = old_record | new_record
>>>>
>>>> let filter = incl "/file"
>>>>
>>>> let xfm = transform lns filter
>>>>
>>>> $ cat fakeroot/file
>>>> config_eth0=("192.168.0.1/24" "192.168.0.2/24")
>>>>
>>>> $ augtool -I . -r fakeroot
>>>> /files
>>>> /files/file
>>>> /files/file/old_record = "config_eth0"
>>>> /files/file/old_record/entry[1] = "192.168.0.1/24"
>>>> /files/file/old_record/entry[2] = "192.168.0.2/24"
>>>> rpinson at rpinson:~/bas/augeas_migration$ augtool -I . -r fakeroot/
>>>> augtool> print /files/
>>>> /files
>>>> /files/file
>>>> /files/file/old_record = "config_eth0"
>>>> /files/file/old_record/entry[1] = "192.168.0.1/24"
>>>> /files/file/old_record/entry[2] = "192.168.0.2/24"
>>>> augtool> mv /files/file/old_record /files/file/new_record
>>>> augtool> print /files/
>>>> /files
>>>> /files/file
>>>> /files/file/new_record = "config_eth0"
>>>> /files/file/new_record/entry[1] = "192.168.0.1/24"
>>>> /files/file/new_record/entry[2] = "192.168.0.2/24"
>>>> augtool> save
>>>> Saved 1 file(s)
>>>>
>>>> $ cat fakeroot/file
>>>> config_eth0="192.168.0.1/24
>>>> 192.168.0.2/24"
>>>>
>>>>
>>>> Note that you can combine this with the -b flag to keep the old version at hand.
>>>>
>>>>
>>>> Raphaël
>>
>>
-------------- next part --------------
(* Lens to match the crazy newline-split variables that Gentoo *)
(* uses in it's openrc-based /etc/conf.d/net file *)
module GentooConf_net=
autoload xfm
let nl = Util.del_str "\n"
let eol = Util.eol
let key_re = /[A-Za-z0-9_]+/
let eq = Util.del_str "="
let comment = Util.comment
let empty = Util.empty
let indent = Util.indent
let char = /[^;#() '"\t\n]|\\\\"/
let dquot = /"([^"\\\n]|\\\\.)*"/ (* " Emacs, relax *)
let sqword = /[^('\n]+/
let dqword = /[^("\n]+/
let uqword = /[^("'\n]+/
let semicol_eol = del /[ \t]*[;\n]/ "\n"
let comment_eol = Util.comment_eol
let comment_or_eol = comment_eol | semicol_eol
(* handle old style bash arrays in new syntax *)
let v1_list =
let v1_list_value = store /[^;#()'"\t\n]+/ in
[ label "quote" . store /['"]/ ] . [ label "value" . v1_list_value ] . del /['"]/ "\"" .
[ Util.del_ws_spc . del /['"]/ "\"" . label "value" . v1_list_value . del /['"]/ "\"" ]*
let v1_arr = del /\([ \t]*/ "(" . v1_list . del /[ \t]*\)/ ")"
let v1_simple = del /\(/ "(" . [ label "value" . empty ] . del /\)/ ")"
(* handle lists of arrays *)
let list(word:regexp) =
let list_value = store word in
[ label "value" . list_value ] .
[ nl . label "value" . list_value ]*
(* handle single quoted lists *)
let squote_arr = [ label "quote" . store /'/ ] . (list sqword)? . del /'/ "'"
(* similarly handle double qouted lists *)
let dquote_arr = [ label "quote" . store /"/ ] . (list dqword)? . del /"/ "\""
(* handle unquoted single value *)
let unquot_val = [ label "quote" . store "" ] . [label "value" . store uqword+]?
(* the source/. inclusion method of bash *)
let source =
[ Util.indent
. del /\.|source/ "." . label ".source"
. Util.del_ws_spc . store /[^;=# \t\n]+/ . comment_or_eol ]
(* lens for key value pairs *)
let kv = [ key key_re . eq .
( ( v1_arr . [ label "@syntax" . value "1" ] )
| ( v1_simple . [ label "@syntax" . value "1" ] )
| squote_arr
| dquote_arr
| unquot_val
) . nl ]
| source
let lns = ( comment | empty | kv )*
let filter = incl "/etc/conf.d/net*"
. Util.stdexcl
let xfm = transform lns filter
-------------- next part --------------
(* Local Variables: *)
(* mode: caml *)
(* End: *)
module Test_GentooConf_Net=
let complicated_bridge_vlan_old_arrays = "config_eth0=(\"null\")
config_eth1=(\"null\")
vconfig_eth1=(\"set_name_type VLAN_PLUS_VID_NO_PAD\")
vlans_eth1=\"10 11 15\"
config_vlan10=(\"null\")
bridge_br10=(\"vlan10\")
routes_br10=(\"default via 10.128.0.254\")
config_br10=(\"10.128.1.11/22\")
RC_NEED_br10=\"net.eth1\"
brctl_br10=(\"setfd 0\")
bridge_br11=(\"vlan11\")
config_vlan11=(\"null\")
brctl_br11=(\"setfd 0\")
RC_NEED_br11=\"net.eth1\"
config_br11=(\"null\")
RC_NEED_br15=\"net.eth1\"
brctl_br15=(\"setfd 0\")
config_br15=(\"null\")
bridge_br15=(\"vlan15\")
config_vlan15=(\"null\")
vlan_start_eth1=\"no\"
RC_NEED_vlan11=\"net.eth1\"
RC_NEED_vlan10=\"net.eth1\"
RC_NEED_vlan15=\"net.eth1\"
"
let complicated_bridge_vlan = "config_eth0=\"null\"
config_eth1=\"null\"
vconfig_eth1=\"set_name_type VLAN_PLUS_VID_NO_PAD\"
vlans_eth1=\"10 11 12\"
config_vlan10=\"null\"
bridge_br10=\"vlan10\"
routes_br10=\"default via 192.168.0.254\"
config_br10=\"192.168.0.1/22\"
RC_NEED_br10=\"net.eth1\"
brctl_br10=\"setfd 0\"
bridge_br11=\"vlan11\"
config_vlan11=\"null\"
brctl_br11=\"setfd 0\"
RC_NEED_br11=\"net.eth1\"
config_br11=\"null\"
RC_NEED_br12=\"net.eth1\"
brctl_br12=\"setfd 0\"
config_br12=\"null\"
bridge_br12=\"vlan12\"
config_vlan12=\"null\"
vlan_start_eth1=\"no\"
RC_NEED_vlan11=\"net.eth1\"
RC_NEED_vlan10=\"net.eth1\"
RC_NEED_vlan12=\"net.eth1\"
"
(* FIXME need to parse the old bash arrays *)
test GentooConf_Net.lns get complicated_bridge_vlan_old_arrays =
{ "config_eth0"
{ "quote" = "\"" }
{ "value" = "null" }
{ "@syntax" = "1" }
}
{ "config_eth1"
{ "quote" = "\"" }
{ "value" = "null" }
{ "@syntax" = "1" }
}
{ "vconfig_eth1"
{ "quote" = "\"" }
{ "value" = "set_name_type VLAN_PLUS_VID_NO_PAD" }
{ "@syntax" = "1" }
}
{ "vlans_eth1"
{ "quote" = "\"" }
{ "value" = "10 11 15" }
}
{ "config_vlan10"
{ "quote" = "\"" }
{ "value" = "null" }
{ "@syntax" = "1" }
}
{ "bridge_br10"
{ "quote" = "\"" }
{ "value" = "vlan10" }
{ "@syntax" = "1" }
}
{ "routes_br10"
{ "quote" = "\"" }
{ "value" = "default via 10.128.0.254" }
{ "@syntax" = "1" }
}
{ "config_br10"
{ "quote" = "\"" }
{ "value" = "10.128.1.11/22" }
{ "@syntax" = "1" }
}
{ "RC_NEED_br10"
{ "quote" = "\"" }
{ "value" = "net.eth1" }
}
{ "brctl_br10"
{ "quote" = "\"" }
{ "value" = "setfd 0" }
{ "@syntax" = "1" }
}
{ "bridge_br11"
{ "quote" = "\"" }
{ "value" = "vlan11" }
{ "@syntax" = "1" }
}
{ "config_vlan11"
{ "quote" = "\"" }
{ "value" = "null" }
{ "@syntax" = "1" }
}
{ "brctl_br11"
{ "quote" = "\"" }
{ "value" = "setfd 0" }
{ "@syntax" = "1" }
}
{ "RC_NEED_br11"
{ "quote" = "\"" }
{ "value" = "net.eth1" }
}
{ "config_br11"
{ "quote" = "\"" }
{ "value" = "null" }
{ "@syntax" = "1" }
}
{ "RC_NEED_br15"
{ "quote" = "\"" }
{ "value" = "net.eth1" }
}
{ "brctl_br15"
{ "quote" = "\"" }
{ "value" = "setfd 0" }
{ "@syntax" = "1" }
}
{ "config_br15"
{ "quote" = "\"" }
{ "value" = "null" }
{ "@syntax" = "1" }
}
{ "bridge_br15"
{ "quote" = "\"" }
{ "value" = "vlan15" }
{ "@syntax" = "1" }
}
{ "config_vlan15"
{ "quote" = "\"" }
{ "value" = "null" }
{ "@syntax" = "1" }
}
{ "vlan_start_eth1"
{ "quote" = "\"" }
{ "value" = "no" }
}
{ "RC_NEED_vlan11"
{ "quote" = "\"" }
{ "value" = "net.eth1" }
}
{ "RC_NEED_vlan10"
{ "quote" = "\"" }
{ "value" = "net.eth1" }
}
{ "RC_NEED_vlan15"
{ "quote" = "\"" }
{ "value" = "net.eth1" }
}
test GentooConf_Net.lns get complicated_bridge_vlan =
{ "config_eth0"
{ "quote" = "\"" }
{ "value" = "null" }
}
{ "config_eth1"
{ "quote" = "\"" }
{ "value" = "null" }
}
{ "vconfig_eth1"
{ "quote" = "\"" }
{ "value" = "set_name_type VLAN_PLUS_VID_NO_PAD" }
}
{ "vlans_eth1"
{ "quote" = "\"" }
{ "value" = "10 11 12" }
}
{ "config_vlan10"
{ "quote" = "\"" }
{ "value" = "null" }
}
{ "bridge_br10"
{ "quote" = "\"" }
{ "value" = "vlan10" }
}
{ "routes_br10"
{ "quote" = "\"" }
{ "value" = "default via 192.168.0.254" }
}
{ "config_br10"
{ "quote" = "\"" }
{ "value" = "192.168.0.1/22" }
}
{ "RC_NEED_br10"
{ "quote" = "\"" }
{ "value" = "net.eth1" }
}
{ "brctl_br10"
{ "quote" = "\"" }
{ "value" = "setfd 0" }
}
{ "bridge_br11"
{ "quote" = "\"" }
{ "value" = "vlan11" }
}
{ "config_vlan11"
{ "quote" = "\"" }
{ "value" = "null" }
}
{ "brctl_br11"
{ "quote" = "\"" }
{ "value" = "setfd 0" }
}
{ "RC_NEED_br11"
{ "quote" = "\"" }
{ "value" = "net.eth1" }
}
{ "config_br11"
{ "quote" = "\"" }
{ "value" = "null" }
}
{ "RC_NEED_br12"
{ "quote" = "\"" }
{ "value" = "net.eth1" }
}
{ "brctl_br12"
{ "quote" = "\"" }
{ "value" = "setfd 0" }
}
{ "config_br12"
{ "quote" = "\"" }
{ "value" = "null" }
}
{ "bridge_br12"
{ "quote" = "\"" }
{ "value" = "vlan12" }
}
{ "config_vlan12"
{ "quote" = "\"" }
{ "value" = "null" }
}
{ "vlan_start_eth1"
{ "quote" = "\"" }
{ "value" = "no" }
}
{ "RC_NEED_vlan11"
{ "quote" = "\"" }
{ "value" = "net.eth1" }
}
{ "RC_NEED_vlan10"
{ "quote" = "\"" }
{ "value" = "net.eth1" }
}
{ "RC_NEED_vlan12"
{ "quote" = "\"" }
{ "value" = "net.eth1" }
}
test GentooConf_Net.lns get "config_eth0=\"null\"\n" =
{ "config_eth0"
{ "quote" = "\"" }
{ "value" = "null" }
}
test GentooConf_Net.lns get "config_eth0=(\"null\")\n" =
{ "config_eth0"
{ "quote" = "\"" }
{ "value" = "null" }
{ "@syntax" = "1" }
}
test GentooConf_Net.lns get "config_eth0=(\"192.168.0.1/24\" \"192.168.0.2/24\")\n" =
{ "config_eth0"
{ "quote" = "\"" }
{ "value" = "192.168.0.1/24" }
{ "value" = "192.168.0.2/24" }
{ "@syntax" = "1" }
}
test GentooConf_Net.lns put "" after
set "config_eth0/quote" "\"";
set "config_eth0/value" "192.168.0.1/24";
set "config_eth0/@syntax" "1"
= "config_eth0=(\"192.168.0.1/24\")\n"
test GentooConf_Net.lns put "" after
set "config_eth0/quote" "\"";
set "config_eth0/value[1]" "192.168.0.1/24";
set "config_eth0/value[2]" "192.168.0.2/24";
set "config_eth0/@syntax" "1"
= "config_eth0=(\"192.168.0.1/24\" \"192.168.0.2/24\")\n"
test GentooConf_Net.lns get "config_eth0=( \"null\" )\n" =
{ "config_eth0"
{ "quote" = "\"" }
{ "value" = "null" }
{ "@syntax" = "1" }
}
test GentooConf_Net.lns put "" after
set "config_eth0/quote" "\"";
set "config_eth0/value[1]" "null"
= "config_eth0=\"null\"\n"
(* empty space should get deleted *)
test GentooConf_Net.lns get "config_eth0=\" \"\n" =
{ "config_eth0"
{ "quote" = "\"" }
{ "value" = " " }
}
(* empty space should get deleted *)
test GentooConf_Net.lns get "config_eth0=\" \"\n" =
{ "config_eth0"
{ "quote" = "\"" }
{ "value" = " " }
}
test GentooConf_Net.lns get "vlans_eth1=\"10\"\n" =
{ "vlans_eth1"
{ "quote" = "\"" }
{ "value" = "10" }
}
test GentooConf_Net.lns put "" after
set "vlans_eth1/quote" "\"";
set "vlans_eth1/value[1]" "10"
= "vlans_eth1=\"10\"\n"
(* leading space should get deleted *)
test GentooConf_Net.lns get "vlans_eth1=\" 10\"\n" =
{ "vlans_eth1"
{ "quote" = "\"" }
{ "value" = " 10" }
}
(* trailing space should get deleted *)
test GentooConf_Net.lns get "vlans_eth1=\"10 \"\n" =
{ "vlans_eth1"
{ "quote" = "\"" }
{ "value" = "10 " }
}
test GentooConf_Net.lns get "vlans_eth1=\"10 11\"\n" =
{ "vlans_eth1"
{ "quote" = "\"" }
{ "value" = "10 11" }
}
test GentooConf_Net.lns put "" after
set "vlans_eth1/quote" "\"";
set "vlans_eth1/value[1]" "10 11"
= "vlans_eth1=\"10 11\"\n"
test GentooConf_Net.lns get "config_eth0=\"192.168.0.1/24\"\n" =
{ "config_eth0"
{ "quote" = "\"" }
{ "value" = "192.168.0.1/24" }
}
test GentooConf_Net.lns put "" after
set "config_eth0/quote" "\"";
set "config_eth0/value[1]" "192.168.0.1/24"
= "config_eth0=\"192.168.0.1/24\"\n"
test GentooConf_Net.lns get "config_eth0=\"192.168.0.1/24\n"
. "192.168.0.2/24\"\n" =
{ "config_eth0"
{ "quote" = "\"" }
{ "value" = "192.168.0.1/24" }
{ "value" = "192.168.0.2/24" }
}
(* FIXME doesn't parse at all b/c of trailing newline *)
(* hard to fix; this might just be invalid *)
(*
test GentooConf_Net.lns get "config_eth0=\"192.168.0.1/24\n"
. "192.168.0.2/24\n\"\n" =
{ "config_eth0"
{ "quote" = "\"" }
{ "value" = "192.168.0.1/24" }
{ "value" = "192.168.0.2/24" }
}
*)
test GentooConf_Net.lns put "" after
set "config_eth0/quote" "\"";
set "config_eth0/value[1]" "192.168.0.1/24";
set "config_eth0/value[2]" "192.168.0.2/24"
= "config_eth0=\"192.168.0.1/24\n192.168.0.2/24\"\n"
test GentooConf_Net.lns get "config_eth0=\"192.168.0.2/24 scope host\"\n" =
{ "config_eth0"
{ "quote" = "\"" }
{ "value" = "192.168.0.2/24 scope host" }
}
test GentooConf_Net.lns get "config_eth0=\"192.168.0.2/24 scope host\n"
. "4321:0:1:2:3:4:567:89ab/64 nodad home preferred_lft 0\"\n" =
{ "config_eth0"
{ "quote" = "\"" }
{ "value" = "192.168.0.2/24 scope host" }
{ "value" = "4321:0:1:2:3:4:567:89ab/64 nodad home preferred_lft 0" }
}
test GentooConf_Net.lns put "config_eth0=(\"192.168.0.1/24\")\n" after
rm "config_eth0/@syntax"
= "config_eth0=\"192.168.0.1/24\"\n"
test GentooConf_Net.lns put "config_eth0=(\"192.168.0.1/24\" \"192.168.0.2/24\")\n" after
rm "config_eth0/@syntax"
= "config_eth0=\"192.168.0.1/24\n192.168.0.2/24\"\n"
test GentooConf_Net.lns get "config_eth0=\"192.168.0.1/24\"\n"
. ". /etc/conf.d/net.extra\n" =
{ "config_eth0"
{ "quote" = "\"" }
{ "value" = "192.168.0.1/24" }
}
{ ".source" = "/etc/conf.d/net.extra" }
(*
config_eth0="null"
config_eth1="null"
vlans_eth1="10 11"
vlan10_name="vlan10"
config_vlan10="192.168.0.1/24"
routes_vlan10="10.0.0.0/8 via 192.168.0.2"
vlan11_name="vlan11"
config_vlan11="172.16.0.1/25"
routes_vlan11="default via 172.16.0.2"
#vlan_start_eth1="no"
#rc_need_vlan10="net.eth1"
#rc_need_vlan11="net.eth1"
*)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 190 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/augeas-devel/attachments/20120514/8243a4c3/attachment.sig>
More information about the augeas-devel
mailing list