/* * Created by PyramIDE. * User: Alexis & Totoro * Date: 03/09/2012 * Time: 16:05 * * To change this template use Tools | Options | Coding | Edit Standard Headers. */ read system/logger.anubis read system/string.anubis read tools/basis.anubis read tools/streams.anubis delete_entry find_entry replace_entry add_entry public type Network_Parameter: comment(String), conf_nv(String name, String value), conf_nvc(String name, String value, String comment). public type Network_type: iface(String name, Network_Parameter param). public type Network_entry: blank, comment(String comment), section(Network_type net_type, List(Network_Parameter) params). define String to_String ( Network_Parameter i_entry, )= if i_entry is { comment(s) then s, conf_nv(n,v) then n +" "+v, conf_nvc(n,v,c) then n+" "+v+" "+c }. define String to_String ( Network_type n_type )= if n_type is { iface(name, param) then "iface "+name+" "+to_String(param) } . define String _to_String ( List(Network_Parameter) interface_entries, String so_far //this is so far of the section, not the general file )= if interface_entries is { [] then so_far, [h . t] then _to_String(t, so_far + "\t"+to_String(h)+"\n") }. public define String to_String ( List(Network_entry) network_entries, String so_far )= if network_entries is { [] then so_far, [h . t] then if h is { blank then to_String(t, so_far+"\n"), comment(comment) then to_String(t, so_far + comment), section(net_type, params) then to_String(t, so_far+"auto "+net_type.name+"\n"+ to_String(net_type)+"\n"+ _to_String( params, "")) } }. define Maybe(Network_Parameter) extract_value ( String name, String left_line )= //println(" Extract value for name ["+name+"] in ["+left_line+"]"); if find_char(left_line, '#', 0) is { failure then success(conf_nv(name, left_line)), success(idx) then if sub_string(left_line, 0, idx) is { failure then failure, success(value) then if sub_string(left_line, idx+1, (length(left_line) - (idx+1))) is { failure then //println("conf_nv found name="+name+" value="+value); success(conf_nv(name, value)), success(comment) then //println("conf_nvc found name="+name+" value="+value+" comment="+comment); success(conf_nvc(name, value, comment)) } } }. define Maybe(Network_Parameter) get_network_parameter ( List(String) params )= if params is { [] then failure, [ name . t] then //println("Get network parameter for ["+name+"]"); if nth((Int)0, name) is { failure then failure, success(c) then if c = '#' then success(comment(join(" ",params))) else extract_value(name, join(" ",t)) } }. define Maybe(Network_type) get_type ( String line, String name )= if split_by_token(line, ' ') is { [ ] then failure, [type . t] then if type = "iface" then if t is { [] then //println("WARNING unamed iface section ["+name+"]"); failure, [h . t] then //check if auto name is equal to iface name if h = name then if get_network_parameter(t) is { failure then failure, success(net_param) then success(iface(name, net_param)) } else failure } else failure }. define List(Network_Parameter) parse_section_body ( Stream s, List(Network_Parameter) so_far )= if read_line(s) is { failure then reverse(so_far), success(line) then if nth((Int)0, line) is { failure then reverse(so_far), success(c) then if c = ' ' | c='\t' then //it seem to be a a real section body entry we try it //println("parse section line ["+trim(line)+"]"); if get_network_parameter(split_by_token(trim(line), ' ')) is { failure then reverse(so_far), success(param) then parse_section_body(s,[param . so_far]) } else // itsn't part of section body, so we stop here and unput the line read //and return the found Network_Parameter //println("Not body part ["+trim(line)+"]"); unput_line(s, line); reverse(so_far) } }. define Network_entry parse_section ( Stream s, String line ) = if split_by_token(line, ' ') is { [ ] then blank, [h . t] then if h = "auto" then if t is { [] then //println("WARNING unamed section ["+h+"]"); blank, [ name . t ] then //println("auto found with name ["+name+"]"); //read the second line of the section where the type is located i.e. iface if read_line(s) is { failure then blank, success(type_line) then //println("get type line for "+name+"["+trim(type_line)+"]"); if get_type(trim(type_line), name) is { failure then //println("type not found for "+name); blank, success(type_entry) then //println("type found, parse for section"); section(type_entry, parse_section_body(s,[])) } } } else blank }. define Network_entry read_interface_entry ( Stream s, String line )= //check for comment if nth((Int)0,line) is { failure then blank, success(c) then if c = '#' then comment(line) else parse_section(s, trim(line)) }. define List(Network_entry) read_interface_entries ( Stream s, List(Network_entry) so_far )= if read_line(s) is { failure then reverse(so_far), success(line) then //println("["+line+"]"); read_interface_entries(s, [read_interface_entry(s, line) . so_far]) }. public define List(Network_entry) read_interface ( String interface_file ) = if (Maybe(RStream))file(interface_file, read) is { failure then [], //nothing to read success(f) then //parse file for each entry read_interface_entries(make_stream(f), []) }. public define Maybe(One) write_interface ( String file_name, List(Network_entry) entries )= if (Maybe(RWStream))file(file_name, new) is { failure then failure, success(f) then success(forget(reliable_write(f, to_byte_array(to_String(entries, ""))))) }. /** here tool for testing * anbexec parse_interface * will produce a dump of given_file into file named as original with ".dump" as an extension */ global define One parse_interface ( List(String) args )= if args is { [] then print("usage : parse_interface "), [ file_name . t ] then forget(write_interface(file_name+".dump",read_interface(file_name))) } .