140 lines
5.3 KiB
Plaintext
140 lines
5.3 KiB
Plaintext
(* NTP module for Augeas *)
|
|
(* Author: Raphael Pinson <raphink@gmail.com> *)
|
|
(* *)
|
|
(* Status: basic settings supported *)
|
|
|
|
module Ntp =
|
|
autoload xfm
|
|
|
|
|
|
(* Define useful shortcuts *)
|
|
|
|
let eol = del /[ \t]*/ "" . [ label "#comment" . store /#.*/]?
|
|
. Util.del_str "\n"
|
|
let sep_spc = Util.del_ws_spc
|
|
let word = /[^,# \n\t]+/
|
|
let num = /[0-9]+/
|
|
|
|
|
|
(* define comments and empty lines *)
|
|
let comment = [ label "#comment" . del /#[ \t]*/ "#" .
|
|
store /([^ \t\n][^\n]*)?/ . del "\n" "\n" ]
|
|
let empty = [ del /[ \t]*\n/ "\n" ]
|
|
|
|
|
|
let kv (k:regexp) (v:regexp) =
|
|
[ key k . sep_spc. store v . eol ]
|
|
|
|
(* Define generic record *)
|
|
let record (kw:regexp) (value:lens) =
|
|
[ key kw . sep_spc . store word . value . eol ]
|
|
|
|
(* Define a command record; see confopt.html#cfg in the ntp docs *)
|
|
let command_record =
|
|
let opt = [ sep_spc . key /minpoll|maxpoll|ttl|version|key/ .
|
|
sep_spc . store word ]
|
|
| [ sep_spc . key (/autokey|burst|iburst|noselect|preempt/ |
|
|
/prefer|true|dynamic/) ] in
|
|
let cmd = /pool|server|peer|broadcast|manycastclient/
|
|
| /multicastclient|manycastserver/ in
|
|
record cmd opt*
|
|
|
|
let broadcastclient =
|
|
[ key "broadcastclient" . [ sep_spc . key "novolley" ]? . eol ]
|
|
|
|
(* Define a fudge record *)
|
|
let fudge_opt_re = "refid" | "stratum"
|
|
let fudge_opt = [ sep_spc . key fudge_opt_re . sep_spc . store word ]
|
|
let fudge_record = record "fudge" fudge_opt?
|
|
|
|
(* Define simple settings, see miscopt.html in ntp docs *)
|
|
let flags =
|
|
let flags_re = /auth|bclient|calibrate|kernel|monitor|ntp|pps|stats/ in
|
|
let flag = [ label "flag" . store flags_re ] in
|
|
[ key /enable|disable/ . (sep_spc . flag)* . eol ]
|
|
|
|
let simple_setting (k:regexp) = kv k word
|
|
|
|
(* Still incomplete, misses logconfig, phone, setvar, tos,
|
|
trap, ttl *)
|
|
let simple_settings =
|
|
kv "broadcastdelay" Rx.decimal
|
|
| flags
|
|
| simple_setting /driftfile|leapfile|logfile|includefile/
|
|
| simple_setting "statsdir"
|
|
| simple_setting "ntpsigndsocket"
|
|
|
|
(* Misc commands, see miscopt.html in ntp docs *)
|
|
|
|
(* Define restrict *)
|
|
let restrict_record =
|
|
let ip6_restrict = [ label "ipv6" . sep_spc . Util.del_str "-6" ] in
|
|
let ip4_restrict = [ label "ipv4" . sep_spc . Util.del_str "-4" ] in
|
|
let action = [ label "action" . sep_spc . store /[^,# \n\t-][^,# \n\t]*/ ] in
|
|
[ key "restrict" . (ip6_restrict | ip4_restrict)? . sep_spc . store /[^,# \n\t-][^,# \n\t]*/ . action* . eol ]
|
|
|
|
(* Define statistics *)
|
|
let statistics_flag (kw:string) = [ sep_spc . key kw ]
|
|
|
|
let statistics_opts = statistics_flag "loopstats"
|
|
| statistics_flag "peerstats"
|
|
| statistics_flag "clockstats"
|
|
| statistics_flag "rawstats"
|
|
|
|
let statistics_record = [ key "statistics" . statistics_opts* . eol ]
|
|
|
|
|
|
(* Define filegen *)
|
|
let filegen = del /filegen[ \t]+/ "filegen " . store word
|
|
let filegen_opt (kw:string) = [ sep_spc . key kw . sep_spc . store word ]
|
|
(* let filegen_flag (kw:string) = [ label kw . sep_spc . store word ] *)
|
|
let filegen_select (kw:string) (select:regexp) = [ label kw . sep_spc . store select ]
|
|
|
|
let filegen_opts = filegen_opt "file"
|
|
| filegen_opt "type"
|
|
| filegen_select "enable" /(en|dis)able/
|
|
| filegen_select "link" /(no)?link/
|
|
|
|
let filegen_record = [ label "filegen" . filegen . filegen_opts* . eol ]
|
|
|
|
(* Authentication commands, see authopt.html#cmd; incomplete *)
|
|
let auth_command =
|
|
[ key /controlkey|keys|keysdir|requestkey|authenticate/ .
|
|
sep_spc . store word . eol ]
|
|
| [ key /autokey|revoke/ . [sep_spc . store word]? . eol ]
|
|
| [ key /trustedkey/ . [ sep_spc . label "key" . store word ]+ . eol ]
|
|
|
|
(* tinker [step step | panic panic | dispersion dispersion |
|
|
stepout stepout | minpoll minpoll | allan allan | huffpuff huffpuff] *)
|
|
let tinker =
|
|
let arg_names = /step|panic|dispersion|stepout|minpoll|allan|huffpuff/ in
|
|
let arg = [ key arg_names . sep_spc . store Rx.decimal ] in
|
|
[ key "tinker" . (sep_spc . arg)* . eol ]
|
|
|
|
(* tos [beacon beacon | ceiling ceiling | cohort {0 | 1} |
|
|
floor floor | maxclock maxclock | maxdist maxdist |
|
|
minclock minclock | mindist mindist | minsane minsane |
|
|
orphan stratum | orphanwait delay] *)
|
|
|
|
let tos =
|
|
let arg_names = /beacon|ceiling|cohort|floor|maxclock|maxdist|
|
|
minclock|mindist|minsane|orphan|orphanwait/ in
|
|
let arg = [ key arg_names . sep_spc . store Rx.decimal ] in
|
|
[ key "tos" . (sep_spc . arg)* . eol ]
|
|
|
|
let interface =
|
|
let action = [ label "action" . store /listen|ignore|drop/ ]
|
|
in let addresses = [ label "addresses" . store Rx.word ]
|
|
in [ key "interface" . sep_spc . action . sep_spc . addresses . eol ]
|
|
|
|
(* Define lens *)
|
|
|
|
let lns = ( comment | empty | command_record | fudge_record
|
|
| restrict_record | simple_settings | statistics_record
|
|
| filegen_record | broadcastclient
|
|
| auth_command | tinker | tos | interface)*
|
|
|
|
let filter = (incl "/etc/ntp.conf")
|
|
|
|
let xfm = transform lns filter
|