Sharp.Augeas/Sharp.Augeas.Test/lens/bootconf.aug

131 lines
3.6 KiB
Plaintext

(*
Module: BootConf
Parses (Open)BSD-stype /etc/boot.conf
Author: Jasper Lievisse Adriaanse <jasper@jasper.la>
About: Reference
This lens is used to parse the second-stage bootstrap configuration
file, /etc/boot.conf as found on OpenBSD. The format is largely MI,
with MD parts included:
http://www.openbsd.org/cgi-bin/man.cgi?query=boot.conf&arch=i386
About: Usage Example
To be documented
About: License
This file is licensed under the LGPL v2+, like the rest of Augeas.
About: Configuration files
This lens applies to /etc/boot.conf.
See <filter>.
*)
module BootConf =
autoload xfm
(************************************************************************
* Utility variables/functions
************************************************************************)
(* View: comment *)
let comment = Util.comment
(* View: empty *)
let empty = Util.empty
(* View: eol *)
let eol = Util.eol
(* View: fspath *)
let fspath = Rx.fspath
(* View: space *)
let space = Sep.space
(* View: word *)
let word = Rx.word
(************************************************************************
* View: key_opt_value_line
* A subnode with a keyword, an optional part consisting of a separator
* and a storing lens, and an end of line
*
* Parameters:
* kw:regexp - the pattern to match as key
* sto:lens - the storing lens
************************************************************************)
let key_opt_value_line (kw:regexp) (sto:lens) =
[ key kw . (space . sto)? . eol ]
(************************************************************************
* Commands
************************************************************************)
(* View: single_command
single command such as 'help' or 'time' *)
let single_command =
let line_re = /help|time|reboot/
in [ Util.indent . key line_re . eol ]
(* View: ls
ls [directory] *)
let ls = Build.key_value_line
"ls" space (store fspath)
let set_cmd = "addr"
| "debug"
| "device"
| "howto"
| "image"
| "timeout"
| "tty"
(* View: set
set [varname [value]] *)
let set = Build.key_value
"set" space
(key_opt_value_line set_cmd (store Rx.space_in))
(* View: stty
stty [device [speed]] *)
let stty =
let device = [ label "device" . store fspath ]
in let speed = [ label "speed" . store Rx.integer ]
in key_opt_value_line "stty" (device . (space . speed)?)
(* View: echo
echo [args] *)
let echo = Build.key_value_line
"echo" space (store word)
(* View: boot
boot [image [-acds]]
XXX: the last arguments are not always needed, so make them optional *)
let boot =
let image = [ label "image" . store fspath ]
in let arg = [ label "arg" . store word ]
in Build.key_value_line "boot" space (image . space . arg)
(* View: machine
machine [command] *)
let machine =
let machine_entry = Build.key_value ("comaddr"|"memory")
space (store word)
| Build.flag ("diskinfo"|"regs")
in Build.key_value_line
"machine" space
(Build.opt_list
machine_entry
space)
(************************************************************************
* Lens
************************************************************************)
(* View: command *)
let command = boot | echo | ls | machine | set | stty
(* View: lns *)
let lns = ( empty | comment | command | single_command )*
(* Variable: filter *)
let filter = (incl "/etc/boot.conf")
let xfm = transform lns filter