[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [augeas-devel] Help with cobbler lens



On 12/20/2009 08:46 AM, Bryan Kearney wrote:
Ok.. got it to parse. I needed to make my own indention lens which made

Thanks to David for sitting through alot of dumb questions by me, here is a Cobbler lens which parses a simple YAML 1.0 file. There are a couple of TODO items in there which I will attempt to clean up and then add some unit tests to before submitting. But, it does run and save now!

Thanks David!

-- bk


(* 
	Parse the /etc/cobbler/settings file  which is in 
	YAML 1.0 format.
	
	The lens can handle the following contructs
	* key: value
	* key: "value"
	* key: 'value'
	* key: [value1, value2]
	* key:
	   - value1
	   - value2
	* key:
	   key2: value1
	   key3: value2 
	   
	Author: Bryan Kearney

	About: License
	  This file is licensed under the LGPLv2+, like the rest of Augeas.	   
*)
module CobblerSettings =
	autoload xfm

	let kw = /[a-zA-Z0-9_]+/
	(* TODO Would be better if this stripped off the " and ' chracters *)
	let kv = /([^]['", \t\n#:@-]+|"[^"\n]*"|'[^'\n]*')/ 

	let lbr = del /\[/ "[" 
	let rbr = del /\]/ "]"      
	let colon = del /:[ \t]*/ ": "
	let dash = del /-[ \t]*/ "- "   
	(* let comma = del /,[ \t]*(\n[ \t]+)?/ ", " *)
	let comma = del /[ \t]*,[ \t]*/ ", "
	
	let eol_only = del /\n/ "\n"
	
	(* TODO Would be better to make items a child of a document *)   
	let docmarker = /-{3}/
	
	let eol   = Util.eol
	let comment = Util.comment
	let empty   = Util.empty
	let indent = del /[ \t]+/ "\t"
	let ws = del /[ \t]*/ " "

	let value_list = Build.opt_list [label "item" . store kv] comma 
	let setting = [key kw . colon . store kv] . eol
	let simple_setting_suffix = store kv . eol
	let setting_list_suffix =  [label "sequence" . lbr . ws . (value_list . ws)? . rbr ] . eol
	let indendented_setting_list_suffix =  eol_only . (indent . setting)+
    let indented_list_suffix =  [label "list" . eol_only . ([ label "value" . indent . dash  . store kv] . eol)+]
    
    (* Break out setting because of a current bug in augeas *)
	let nested_setting = [key kw . colon . (
											(* simple_setting_suffix | *)
											setting_list_suffix |
											indendented_setting_list_suffix | 
											indented_list_suffix
											)
						]
						
	let document = [label "---" . store docmarker] . eol    

	let lns = (document | comment | empty | setting | nested_setting )*  
    (* let lns = (setting)* *)

	let xfm = transform lns (incl "/etc/cobbler/settings") 
	
	(* 
	test lns  get "" = ?
	test lns  get "Simple_Setting: Value \n" = ?		
	test lns  get "Simple_Setting2: 'Value2 acme com' \n" = ?
	test lns  get "Simple_Setting3: ''\n" = ?
	test lns  get "Simple_Setting4: \"\"\n" = ?	
	test lns  get "Setting_List:[Value1, Value2, Value3]\n" = ?	
	test lns  get "Empty_Setting_List: []\n" = ?
	test lns  get "# Commented_Out_Setting: 'some value'\n" = ?    
	test lns  get "---\n" = ? 
	test lns  get "Nested_Setting:\n Test: Value\n" = ?
	test lns  get "Nested_Setting:\n - Test \n" = ?	
	let  cset = Sys.read_file "/etc/cobbler/settings"
	test lns  get cset = ?  
    *)
(* Local Variables: *)
(* mode: caml *)
(* End: *)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]