Blame lenses/interfaces.aug

Packit Service a2ae7a
(* Interfaces module for Augeas
Packit Service a2ae7a
 Author: Free Ekanayaka <free@64studio.com>
Packit Service a2ae7a
Packit Service a2ae7a
 Reference: man interfaces
Packit Service a2ae7a
Packit Service a2ae7a
*)
Packit Service a2ae7a
Packit Service a2ae7a
module Interfaces =
Packit Service a2ae7a
   autoload xfm
Packit Service a2ae7a
Packit Service a2ae7a
(************************************************************************
Packit Service a2ae7a
 *                           USEFUL PRIMITIVES
Packit Service a2ae7a
 *************************************************************************)
Packit Service a2ae7a
Packit Service a2ae7a
let eol        = Util.eol
Packit Service a2ae7a
Packit Service a2ae7a
(* Define separators *)
Packit Service a2ae7a
Packit Service a2ae7a
(* a line can be extended across multiple lines by making the last  *)
Packit Service a2ae7a
(*  character a backslash *)
Packit Service a2ae7a
let sep_spc    =  del /([ \t]+|[ \t]*\\\\\n[ \t]*)/ " "
Packit Service a2ae7a
Packit Service a2ae7a
(* Define fields *)
Packit Service a2ae7a
let sto_to_eol = store /([^\\ \t\n].*[^\\ \t\n]|[^\\ \t\n])/ . eol
Packit Service a2ae7a
let sto_to_spc = store /[^\\ \t\n]+/
Packit Service a2ae7a
Packit Service a2ae7a
(* Define comments and empty lines *)
Packit Service a2ae7a
Packit Service a2ae7a
(* note that the comment definition from Util does not support *)
Packit Service a2ae7a
(* splitting lines with a backlash                             *)
Packit Service a2ae7a
let comment    = Util.comment
Packit Service a2ae7a
Packit Service a2ae7a
let empty      = Util.empty
Packit Service a2ae7a
Packit Service a2ae7a
(* Define tree stanza_ids *)
Packit Service a2ae7a
let stanza_id    (t:string) = key t . sep_spc . sto_to_spc
Packit Service a2ae7a
let stanza_param (l:string) = [ sep_spc . label l . sto_to_spc ]
Packit Service a2ae7a
Packit Service a2ae7a
(* Define reserved words and multi-value options *)
Packit Service a2ae7a
let stanza_word =
Packit Service a2ae7a
   /(source(-directory)?|iface|auto|allow-[a-z-]+|mapping|bond-slaves|bridge-ports)/
Packit Service a2ae7a
Packit Service a2ae7a
(* Define stanza option indentation *)
Packit Service a2ae7a
let stanza_indent = del /[ \t]*/ "   "
Packit Service a2ae7a
Packit Service a2ae7a
(* Define additional lines for multi-line stanzas *)
Packit Service a2ae7a
let stanza_option = [  stanza_indent
Packit Service a2ae7a
                     . key  ( /[a-z0-9_-]+/ - stanza_word )
Packit Service a2ae7a
                     . sep_spc
Packit Service a2ae7a
                     . sto_to_eol ]
Packit Service a2ae7a
Packit Service a2ae7a
(* Define space-separated array *)
Packit Service a2ae7a
let array (r:regexp) (t:string) =  del r t . label t . counter t
Packit Service a2ae7a
   . [ sep_spc . seq t . sto_to_spc ]+
Packit Service a2ae7a
Packit Service a2ae7a
(************************************************************************
Packit Service a2ae7a
 *                              AUTO
Packit Service a2ae7a
 *************************************************************************)
Packit Service a2ae7a
Packit Service a2ae7a
let auto = [ array /(allow-)?auto/ "auto" . eol ]
Packit Service a2ae7a
Packit Service a2ae7a
(************************************************************************
Packit Service a2ae7a
 *                              GENERIC ALLOW
Packit Service a2ae7a
 *************************************************************************)
Packit Service a2ae7a
Packit Service a2ae7a
let allow = [ key ( /allow-[a-z-]+/ - "allow-auto" )
Packit Service a2ae7a
             . counter "allow_seq"
Packit Service a2ae7a
             . [ sep_spc . seq "allow_seq" . sto_to_spc ]+
Packit Service a2ae7a
             . eol ]
Packit Service a2ae7a
Packit Service a2ae7a
(************************************************************************
Packit Service a2ae7a
 *                              MAPPING
Packit Service a2ae7a
 *************************************************************************)
Packit Service a2ae7a
Packit Service a2ae7a
let mapping = [ stanza_id "mapping"
Packit Service a2ae7a
               . eol
Packit Service a2ae7a
               . (stanza_option|comment|empty)+ ]
Packit Service a2ae7a
Packit Service a2ae7a
(************************************************************************
Packit Service a2ae7a
 *                              IFACE
Packit Service a2ae7a
 *************************************************************************)
Packit Service a2ae7a
Packit Service a2ae7a
let multi_option (t:string) = [ stanza_indent . array t t . eol ]
Packit Service a2ae7a
Packit Service a2ae7a
let iface   = [ Util.indent
Packit Service a2ae7a
              . stanza_id    "iface"
Packit Service a2ae7a
              . stanza_param "family"
Packit Service a2ae7a
              . stanza_param "method"
Packit Service a2ae7a
              . eol
Packit Service a2ae7a
              . ( stanza_option
Packit Service a2ae7a
                | multi_option "bond-slaves"
Packit Service a2ae7a
                | multi_option "bridge-ports"
Packit Service a2ae7a
                | comment
Packit Service a2ae7a
                | empty )* ]
Packit Service a2ae7a
Packit Service a2ae7a
(************************************************************************
Packit Service a2ae7a
 *                              SOURCE
Packit Service a2ae7a
 *************************************************************************)
Packit Service a2ae7a
Packit Service a2ae7a
let source = [ key "source" . sep_spc . sto_to_eol ]
Packit Service a2ae7a
Packit Service a2ae7a
(************************************************************************
Packit Service a2ae7a
 *                              SOURCE-DIRECTORY
Packit Service a2ae7a
 *************************************************************************)
Packit Service a2ae7a
Packit Service a2ae7a
let source_directory = [ key "source-directory" . sep_spc . sto_to_eol ]
Packit Service a2ae7a
Packit Service a2ae7a
(************************************************************************
Packit Service a2ae7a
 *                              STANZAS
Packit Service a2ae7a
 *************************************************************************)
Packit Service a2ae7a
Packit Service a2ae7a
(* The auto and hotplug stanzas always consist of one line only, while
Packit Service a2ae7a
   iface and mapping can spand along more lines. Comment nodes are
Packit Service a2ae7a
   inserted in the tree as direct children of the root node only when they
Packit Service a2ae7a
   come after an auto or hotplug stanza, otherwise they are considered part
Packit Service a2ae7a
   of an iface or mapping block *)
Packit Service a2ae7a
Packit Service a2ae7a
let stanza_single = (auto|allow|source|source_directory) . (comment|empty)*
Packit Service a2ae7a
let stanza_multi  = iface|mapping
Packit Service a2ae7a
Packit Service a2ae7a
(************************************************************************
Packit Service a2ae7a
 *                              LENS & FILTER
Packit Service a2ae7a
 *************************************************************************)
Packit Service a2ae7a
Packit Service a2ae7a
   let lns = (comment|empty)* . (stanza_multi | stanza_single)*
Packit Service a2ae7a
Packit Service a2ae7a
   let filter = (incl "/etc/network/interfaces")
Packit Service a2ae7a
                . (incl "/etc/network/interfaces.d/*")
Packit Service a2ae7a
                . Util.stdexcl
Packit Service a2ae7a
Packit Service a2ae7a
   let xfm = transform lns filter