network_interface_file.anubis 7.94 KB
/*
 * 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 <given_file>
  *  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>"),
    [ file_name . t ] then
      forget(write_interface(file_name+".dump",read_interface(file_name)))
  }
 .