Sharp.Augeas/Sharp.Augeas.Test/lens/chrony.aug

409 lines
14 KiB
Plaintext

(*
Module: Chrony
Parses the chrony config file
Author: Pat Riehecky <riehecky@fnal.gov>
About: Reference
This lens tries to keep as close as possible to chrony config syntax
See http://chrony.tuxfamily.org/manual.html#Configuration-file
About: License
This file is licenced under the LGPL v2+, like the rest of Augeas.
About: Lens Usage
To be documented
About: Configuration files
This lens applies to /etc/chrony.conf
See <filter>.
*)
module Chrony =
autoload xfm
(************************************************************************
* Group: Import provided expressions
************************************************************************)
(* View: empty *)
let empty = Util.empty
(* View: eol *)
let eol = Util.eol
(* View: space *)
let space = Sep.space
(* Variable: email_addr *)
let email_addr = Rx.email_addr
(* Variable: word *)
let word = Rx.word
(* Variable: integer *)
let integer = Rx.relinteger
(* Variable: decimal *)
let decimal = Rx.reldecimal
(* Variable: ip *)
let ip = Rx.ip
(* Variable: path *)
let path = Rx.fspath
(************************************************************************
* Group: Create required expressions
************************************************************************)
(* Variable: number *)
let number = integer | decimal | decimal . /[eE]/ . integer
(* Variable: address_re *)
let address_re = Rx.ip | Rx.hostname
(*
View: comment
from 4.2.1 of the upstream doc
Chrony comments start with: ! ; # or % and must be on their own line
*)
let comment = Util.comment_generic /[ \t]*[!;#%][ \t]*/ "# "
(* Variable: no_space
No spaces or comment characters
*)
let no_space = /[^ \t\r\n!;#%]+/
(* Variable: cmd_options
Server/Peer/Pool options with values
*)
let cmd_options = "asymmetry"
| "filter"
| "key"
| /maxdelay((dev)?ratio)?/
| /(min|max)poll/
| /(min|max)samples/
| "maxsources"
| "mindelay"
| "offset"
| "polltarget"
| "port"
| "presend"
| "version"
(* Variable: cmd_flags
Server/Peer/Pool options without values
*)
let cmd_flags = "auto_offline"|"iburst"|"noselect"|"offline"|"prefer"
|"require"|"trust"|"xleave"|"burst"|"nts"
(* Variable: ntp_source
Server/Peer/Pool key names
*)
let ntp_source = "server"|"peer"|"pool"
(* Variable: allowdeny_types
Key names for access configuration
*)
let allowdeny_types = "allow"|"deny"|"cmdallow"|"cmddeny"
(* Variable: hwtimestamp_options
HW timestamping options with values
*)
let hwtimestamp_options = "minpoll"|"precision"|"rxcomp"|"txcomp"
|"minsamples"|"maxsamples"|"rxfilter"
(* Variable: hwtimestamp_flags
HW timestamping options without values
*)
let hwtimestamp_flags = "nocrossts"
(* Variable: local_options
local options with values
*)
let local_options = "stratum"|"distance"
(* Variable: local_flags
local options without values
*)
let local_flags = "orphan"
(* Variable: ratelimit_options
Rate limiting options with values
*)
let ratelimit_options = "interval"|"burst"|"leak"
(* Variable: refclock_options
refclock options with values
*)
let refclock_options = "refid"|"lock"|"poll"|"dpoll"|"filter"|"rate"
|"minsamples"|"maxsamples"|"offset"|"delay"
|"precision"|"maxdispersion"|"stratum"|"width"
(* Variable: refclock_flags
refclock options without values
*)
let refclock_flags = "noselect"|"pps"|"prefer"|"require"|"tai"|"trust"
(* Variable: flags
Options without values
*)
let flags = "dumponexit"
| "generatecommandkey"
| "lock_all"
| "manual"
| "noclientlog"
| "nosystemcert"
| "rtconutc"
| "rtcsync"
(* Variable: log_flags
log has a specific options list
*)
let log_flags = "measurements"|"rawmeasurements"|"refclocks"|"rtc"
|"statistics"|"tempcomp"|"tracking"
(* Variable: simple_keys
Options with single values
*)
let simple_keys = "acquisitionport" | "authselectmode" | "bindacqaddress"
| "bindaddress" | "bindcmdaddress" | "bindacqdevice"
| "bindcmddevice" | "binddevice" | "clientloglimit"
| "clockprecision" | "combinelimit" | "commandkey"
| "cmdport" | "corrtimeratio" | "driftfile"
| "dscp"
| "dumpdir" | "hwclockfile" | "include" | "keyfile"
| "leapsecmode" | "leapsectz" | "linux_freq_scale"
| "linux_hz" | "logbanner" | "logchange" | "logdir"
| "maxclockerror" | "maxdistance" | "maxdrift"
| "maxjitter" | "maxsamples" | "maxslewrate"
| "maxntsconnections"
| "maxupdateskew" | "minsamples" | "minsources"
| "nocerttimecheck" | "ntsdumpdir" | "ntsntpserver"
| "ntsport" | "ntsprocesses" | "ntsrefresh" | "ntsrotate"
| "ntsservercert" | "ntsserverkey" | "ntstrustedcerts"
| "ntpsigndsocket" | "pidfile"
| "port" | "reselectdist" | "rtcautotrim" | "rtcdevice"
| "rtcfile" | "sched_priority" | "stratumweight" | "user"
(************************************************************************
* Group: Make some sub-lenses for use in later lenses
************************************************************************)
(* View: host_flags *)
let host_flags = [ space . key cmd_flags ]
(* View: host_options *)
let host_options = [ space . key cmd_options . space . store number ]
(* View: log_flag_list *)
let log_flag_list = [ space . key log_flags ]
(* View: store_address *)
let store_address = [ label "address" . store address_re ]
(************************************************************************
* Group: Lenses for parsing out sections
************************************************************************)
(* View: all_flags
options without any arguments
*)
let all_flags = [ Util.indent . key flags . eol ]
(* View: kv
options with only one arg can be directly mapped to key = value
*)
let kv = [ Util.indent . key simple_keys . space . (store no_space) . eol ]
(* Property: Options with multiple values
Each of these gets their own parsing block
- server|peer|pool <address> <options>
- allow|deny|cmdallow|cmddeny [all] [<address[/subnet]>]
- log <options>
- broadcast <interval> <address> <optional port>
- fallbackdrift <min> <max>
- hwtimestamp <interface> <options>
- initstepslew <threshold> <addr> <optional extra addrs>
- local <options>
- mailonchange <emailaddress> <threshold>
- makestep <threshold> <limit>
- maxchange <threshold> <delay> <limit>
- ratelimit|cmdratelimit|ntsratelimit <options>
- refclock <driver> <parameter> <options>
- smoothtime <maxfreq> <maxwander> <options>
- tempcomp <sensorfile> <interval> (<t0> <k0> <k1> <k2> | <pointfile> )
- confdir|sourcedir <directories>
*)
(* View: host_list
Find all NTP sources and their flags/options
*)
let host_list = [ Util.indent . key ntp_source
. space . store address_re
. ( host_flags | host_options )*
. eol ]
(* View: allowdeny
allow/deny/cmdallow/cmddeny has a specific syntax
*)
let allowdeny = [ Util.indent . key allowdeny_types
. [ space . key "all" ]?
. ( space . store ( no_space - "all" ) )?
. eol ]
(* View: log_list
log has a specific options list
*)
let log_list = [ Util.indent . key "log" . log_flag_list+ . eol ]
(* View: bcast
broadcast has specific syntax
*)
let bcast = [ Util.indent . key "broadcast"
. space . [ label "interval" . store integer ]
. space . store_address
. ( space . [ label "port" . store integer ] )?
. eol ]
(* View: bcast
confdir and sourcedir have specific syntax
*)
let dir_list = [ Util.indent . key /(conf|source)dir/
. [ label "directory" . space . store no_space ]+
. eol ]
(* View: fdrift
fallbackdrift has specific syntax
*)
let fdrift = [ Util.indent . key "fallbackdrift"
. space . [ label "min" . store integer ]
. space . [ label "max" . store integer ]
. eol ]
(* View: hwtimestamp
hwtimestamp has specific syntax
*)
let hwtimestamp = [ Util.indent . key "hwtimestamp"
. space . [ label "interface" . store no_space ]
. ( space . ( [ key hwtimestamp_flags ]
| [ key hwtimestamp_options . space
. store no_space ] )
)*
. eol ]
(* View: istepslew
initstepslew has specific syntax
*)
let istepslew = [ Util.indent . key "initstepslew"
. space . [ label "threshold" . store number ]
. ( space . store_address )+
. eol ]
(* View: local
local has specific syntax
*)
let local = [ Util.indent . key "local"
. ( space . ( [ key local_flags ]
| [ key local_options . space . store no_space ] )
)*
. eol ]
(* View: email
mailonchange has specific syntax
*)
let email = [ Util.indent . key "mailonchange" . space
. [ label "emailaddress" . store email_addr ]
. space
. [ label "threshold" . store number ]
. eol ]
(* View: makestep
makestep has specific syntax
*)
let makestep = [ Util.indent . key "makestep"
. space
. [ label "threshold" . store number ]
. space
. [ label "limit" . store integer ]
. eol ]
(* View: maxchange
maxchange has specific syntax
*)
let maxchange = [ Util.indent . key "maxchange"
. space
. [ label "threshold" . store number ]
. space
. [ label "delay" . store integer ]
. space
. [ label "limit" . store integer ]
. eol ]
(* View: ratelimit
ratelimit/cmdratelimit has specific syntax
*)
let ratelimit = [ Util.indent . key /(cmd|nts)?ratelimit/
. [ space . key ratelimit_options
. space . store no_space ]*
. eol ]
(* View: refclock
refclock has specific syntax
*)
let refclock = [ Util.indent . key "refclock"
. space
. [ label "driver" . store word ]
. space
. [ label "parameter" . store no_space ]
. ( space . ( [ key refclock_flags ]
| [ key refclock_options . space . store no_space ] )
)*
. eol ]
(* View: smoothtime
smoothtime has specific syntax
*)
let smoothtime = [ Util.indent . key "smoothtime"
. space
. [ label "maxfreq" . store number ]
. space
. [ label "maxwander" . store number ]
. ( space . [ key "leaponly" ] )?
. eol ]
(* View: tempcomp
tempcomp has specific syntax
*)
let tempcomp = [ Util.indent . key "tempcomp"
. space
. [ label "sensorfile" . store path ]
. space
. [ label "interval" . store number ]
. space
. ( [ label "t0" . store number ] . space
. [ label "k0" . store number ] . space
. [ label "k1" . store number ] . space
. [ label "k2" . store number ]
| [ label "pointfile" . store path ] )
. eol ]
(************************************************************************
* Group: Final lense summary
************************************************************************)
(* View: settings
* All supported chrony settings
*)
let settings = host_list | allowdeny | log_list | bcast | fdrift | istepslew
| local | email | makestep | maxchange | refclock | smoothtime
| dir_list | hwtimestamp | ratelimit | tempcomp | kv | all_flags
(*
* View: lns
* The crony lens
*)
let lns = ( empty | comment | settings )*
(* View: filter
* The files parsed by default
*)
let filter = incl "/etc/chrony.conf"
let xfm = transform lns filter