1 (* Logrotate module for Augeas *)
2 (* Author: Raphael Pinson <raphink@gmail.com> *)
4 (* Sean Millichamp <sean@bruenor.org> *)
9 (* - (pre|post)rotate entries *)
17 let sep_spc = Sep.space
18 let sep_val = del /[ \t]*=[ \t]*|[ \t]+/ " "
20 let num = Rx.relinteger
21 let word = /[^,#= \n\t{}]+/
22 let filename = Quote.do_quote_opt (store /\/[^"',#= \n\t{}]+/)
23 let size = num . /[kMG]?/
25 let indent = del Rx.opt_space "\t"
27 (* define omments and empty lines *)
28 let comment = Util.comment
29 let empty = Util.empty
32 (* Useful functions *)
34 let list_item = [ sep_spc . key /[^\/+,# \n\t{}]+/ ]
35 let select_to_eol (kw:string) (select:regexp) = [ label kw . store select ]
36 let value_to_eol (kw:string) (value:regexp) = Build.key_value kw sep_val (store value)
37 let flag_to_eol (kw:string) = Build.flag kw
38 let list_to_eol (kw:string) = [ key kw . list_item+ ]
44 let mode = sep_spc . [ label "mode" . store num ] in
45 let owner = sep_spc . [ label "owner" . store word ] in
46 let group = sep_spc . [ label "group" . store word ] in
48 ( mode | mode . owner | mode . owner . group )? ]
51 let owner = sep_spc . [ label "owner" . store word ] in
52 let group = sep_spc . [ label "group" . store word ] in
54 ( owner | owner . group )? ]
56 let tabooext = [ key "tabooext" . ( sep_spc . store /\+/ )? . list_item+ ]
58 let attrs = select_to_eol "schedule" /(hourly|daily|weekly|monthly|yearly)/
59 | value_to_eol "rotate" num
61 | flag_to_eol "nocreate"
63 | value_to_eol "include" word
64 | select_to_eol "missingok" /(no)?missingok/
65 | select_to_eol "compress" /(no)?compress/
66 | select_to_eol "delaycompress" /(no)?delaycompress/
67 | select_to_eol "ifempty" /(not)?ifempty/
68 | select_to_eol "sharedscripts" /(no)?sharedscripts/
69 | value_to_eol "size" size
71 | value_to_eol "olddir" word
72 | flag_to_eol "noolddir"
73 | value_to_eol "mail" word
74 | flag_to_eol "mailfirst"
75 | flag_to_eol "maillast"
76 | flag_to_eol "nomail"
77 | value_to_eol "errors" word
78 | value_to_eol "extension" word
79 | select_to_eol "dateext" /(no)?dateext/
80 | value_to_eol "dateformat" word
81 | flag_to_eol "dateyesterday"
82 | value_to_eol "compresscmd" word
83 | value_to_eol "uncompresscmd" word
84 | value_to_eol "compressext" word
85 | list_to_eol "compressoptions"
86 | select_to_eol "copy" /(no)?copy/
87 | select_to_eol "copytruncate" /(no)?copytruncate/
88 | value_to_eol "maxage" num
89 | value_to_eol "minsize" size
90 | value_to_eol "maxsize" size
91 | select_to_eol "shred" /(no)?shred/
92 | value_to_eol "shredcycles" num
93 | value_to_eol "start" num
99 let line_re = /.*/ - /[ \t]*endscript[ \t]*/ in
100 store ( line_re . ("\n" . line_re)* )? . Util.del_str "\n"
103 let hook_names = /(pre|post)rotate|(first|last)action/ in
104 [ key hook_names . eol .
106 del /[ \t]*endscript/ "\tendscript" ]
110 let body = Build.block_newlines
111 (indent . (attrs | hooks) . eol)
115 let filename_entry = [ label "file" . filename ] in
116 let filename_sep = del /[ \t\n]+/ " " in
117 let filenames = Build.opt_list filename_entry filename_sep in
118 [ label "rule" . Util.indent . filenames . body . eol ]
120 let lns = ( comment | empty | (attrs . eol) | rule )*
122 let filter = incl "/etc/logrotate.d/*"
123 . incl "/etc/logrotate.conf"
126 let xfm = transform lns filter