1 (* NTP module for Augeas *)
2 (* Author: Raphael Pinson <raphink@gmail.com> *)
4 (* Status: basic settings supported *)
10 (* Define useful shortcuts *)
12 let eol = del /[ \t]*/ "" . [ label "#comment" . store /#.*/]?
14 let sep_spc = Util.del_ws_spc
15 let word = /[^,# \n\t]+/
19 (* define comments and empty lines *)
20 let comment = [ label "#comment" . del /#[ \t]*/ "#" .
21 store /([^ \t\n][^\n]*)?/ . del "\n" "\n" ]
22 let empty = [ del /[ \t]*\n/ "\n" ]
25 let kv (k:regexp) (v:regexp) =
26 [ key k . sep_spc. store v . eol ]
28 (* Define generic record *)
29 let record (kw:regexp) (value:lens) =
30 [ key kw . sep_spc . store word . value . eol ]
32 (* Define a command record; see confopt.html#cfg in the ntp docs *)
34 let opt = [ sep_spc . key /minpoll|maxpoll|ttl|version|key/ .
35 sep_spc . store word ]
36 | [ sep_spc . key (/autokey|burst|iburst|noselect|preempt/ |
37 /prefer|true|dynamic/) ] in
38 let cmd = /pool|server|peer|broadcast|manycastclient/
39 | /multicastclient|manycastserver/ in
43 [ key "broadcastclient" . [ sep_spc . key "novolley" ]? . eol ]
45 (* Define a fudge record *)
46 let fudge_opt_re = "refid" | "stratum"
47 let fudge_opt = [ sep_spc . key fudge_opt_re . sep_spc . store word ]
48 let fudge_record = record "fudge" fudge_opt?
50 (* Define simple settings, see miscopt.html in ntp docs *)
52 let flags_re = /auth|bclient|calibrate|kernel|monitor|ntp|pps|stats/ in
53 let flag = [ label "flag" . store flags_re ] in
54 [ key /enable|disable/ . (sep_spc . flag)* . eol ]
56 let simple_setting (k:regexp) = kv k word
58 (* Still incomplete, misses logconfig, phone, setvar, tos,
61 kv "broadcastdelay" Rx.decimal
63 | simple_setting /driftfile|leapfile|logfile|includefile/
64 | simple_setting "statsdir"
66 (* Misc commands, see miscopt.html in ntp docs *)
70 let ip6_restrict = [ label "ipv6" . sep_spc . Util.del_str "-6" ] in
71 let ip4_restrict = [ label "ipv4" . sep_spc . Util.del_str "-4" ] in
72 let action = [ label "action" . sep_spc . store /[^,# \n\t-][^,# \n\t]*/ ] in
73 [ key "restrict" . (ip6_restrict | ip4_restrict)? . sep_spc . store /[^,# \n\t-][^,# \n\t]*/ . action* . eol ]
75 (* Define statistics *)
76 let statistics_flag (kw:string) = [ sep_spc . key kw ]
78 let statistics_opts = statistics_flag "loopstats"
79 | statistics_flag "peerstats"
80 | statistics_flag "clockstats"
81 | statistics_flag "rawstats"
83 let statistics_record = [ key "statistics" . statistics_opts* . eol ]
87 let filegen = del /filegen[ \t]+/ "filegen " . store word
88 let filegen_opt (kw:string) = [ sep_spc . key kw . sep_spc . store word ]
89 (* let filegen_flag (kw:string) = [ label kw . sep_spc . store word ] *)
90 let filegen_select (kw:string) (select:regexp) = [ label kw . sep_spc . store select ]
92 let filegen_opts = filegen_opt "file"
94 | filegen_select "enable" /(en|dis)able/
95 | filegen_select "link" /(no)?link/
97 let filegen_record = [ label "filegen" . filegen . filegen_opts* . eol ]
99 (* Authentication commands, see authopt.html#cmd; incomplete *)
101 [ key /controlkey|keys|keysdir|requestkey|authenticate/ .
102 sep_spc . store word . eol ]
103 | [ key /autokey|revoke/ . [sep_spc . store word]? . eol ]
104 | [ key /trustedkey/ . [ sep_spc . label "key" . store word ]+ . eol ]
106 (* tinker [step step | panic panic | dispersion dispersion |
107 stepout stepout | minpoll minpoll | allan allan | huffpuff huffpuff] *)
109 let arg_names = /step|panic|dispersion|stepout|minpoll|allan|huffpuff/ in
110 let arg = [ key arg_names . sep_spc . store Rx.decimal ] in
111 [ key "tinker" . (sep_spc . arg)* . eol ]
113 (* tos [beacon beacon | ceiling ceiling | cohort {0 | 1} |
114 floor floor | maxclock maxclock | maxdist maxdist |
115 minclock minclock | mindist mindist | minsane minsane |
116 orphan stratum | orphanwait delay] *)
119 let arg_names = /beacon|ceiling|cohort|floor|maxclock|maxdist|
120 minclock|mindist|minsane|orphan|orphanwait/ in
121 let arg = [ key arg_names . sep_spc . store Rx.decimal ] in
122 [ key "tos" . (sep_spc . arg)* . eol ]
125 let action = [ label "action" . store /listen|ignore|drop/ ]
126 in let addresses = [ label "addresses" . store Rx.word ]
127 in [ key "interface" . sep_spc . action . sep_spc . addresses . eol ]
131 let lns = ( comment | empty | command_record | fudge_record
132 | restrict_record | simple_settings | statistics_record
133 | filegen_record | broadcastclient
134 | auth_command | tinker | tos | interface)*
136 let filter = (incl "/etc/ntp.conf")
138 let xfm = transform lns filter