blob: 6663cde8f571c28b464fa67612b49f1cc150477d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
(* Logrotate module for Augeas *)
(* Author: Raphael Pinson <raphink@gmail.com> *)
(* Patches from: *)
(* Sean Millichamp <sean@bruenor.org> *)
(* *)
(* Supported : *)
(* - defaults *)
(* - rules *)
(* - (pre|post)rotate entries *)
(* *)
(* Todo : *)
(* *)
module Logrotate =
autoload xfm
let sep_spc = Util.del_ws_spc
let sep_val = del /[ \t]*=[ \t]*|[ \t]+/ " "
let eol = Util.del_str "\n"
let num = /[0-9]+/
let word = /[^,#= \n\t{}]+/
let size = num . /[kMG]?/
(* define comments and empty lines *)
let comment (indent:string) = [ label "#comment" . del /[ \t]*/ indent . del /#[ \t]*/ "# " . store /([^ \t\n][^\n]*)?/ . eol ]
let empty = [ del /[ \t]*\n/ "\n" ]
(* Useful functions *)
let list_item = [ sep_spc . key /[^\/+,# \n\t{}]+/ ]
let select_to_eol (kw:string) (select:regexp) (indent:string) = [ del /[ \t]*/ indent . label kw . store select . eol ]
let value_to_eol (kw:string) (value:regexp) (indent:string ) = [ del /[ \t]*/ indent . key kw . sep_val . store value . eol ]
let flag_to_eol (kw:string) (indent:string) = [ del /[ \t]*/ indent . key kw . eol ]
let list_to_eol (kw:string) (indent:string) = [ del /[ \t]*/ indent . key kw . list_item+ . eol ]
(* Defaults *)
let create (indent:string ) = [ del /[ \t]*/ indent . key "create" .
( sep_spc . [ label "mode" . store num ] . sep_spc .
[ label "owner" . store word ] . sep_spc .
[ label "group" . store word ])?
. eol ]
let tabooext (indent:string) = [ del /[ \t]*/ indent . key "tabooext" . ( sep_spc . store /\+/ )? . list_item+ . eol ]
let attrs (indent:string) = select_to_eol "schedule" /(daily|weekly|monthly|yearly)/ indent
| value_to_eol "rotate" num indent
| create indent
| flag_to_eol "nocreate" indent
| value_to_eol "include" word indent
| select_to_eol "missingok" /(no)?missingok/ indent
| select_to_eol "compress" /(no)?compress/ indent
| select_to_eol "delaycompress" /(no)?delaycompress/ indent
| select_to_eol "ifempty" /(not)?ifempty/ indent
| select_to_eol "sharedscripts" /(no)?sharedscripts/ indent
| value_to_eol "size" size indent
| tabooext indent
| value_to_eol "olddir" word indent
| flag_to_eol "noolddir" indent
| value_to_eol "mail" word indent
| flag_to_eol "mailfirst" indent
| flag_to_eol "maillast" indent
| flag_to_eol "nomail" indent
| value_to_eol "errors" word indent
| value_to_eol "extension" word indent
| select_to_eol "dateext" /(no)?dateext/ indent
| value_to_eol "compresscmd" word indent
| value_to_eol "uncompresscmd" word indent
| value_to_eol "compressext" word indent
| list_to_eol "compressoptions" indent
| select_to_eol "copy" /(no)?copy/ indent
| select_to_eol "copytruncate" /(no)?copytruncate/ indent
| value_to_eol "maxage" num indent
| value_to_eol "minsize" size indent
| select_to_eol "shred" /(no)?shred/ indent
| value_to_eol "shredcycles" num indent
| value_to_eol "start" num indent
(* Define hooks *)
let hook_lines =
let line_re = /.*/ - /[ \t]*endscript[ \t]*/ in
store ( line_re . ("\n" . line_re)* )? . del "\n" "\n"
let hooks =
let hook_names = /(pre|post)rotate|(first|last)action/ in
[ del /[ \t]*/ "\t" . key hook_names . eol .
hook_lines .
del /[ \t]*endscript\n/ "\tendscript\n" ]
(* Define rule *)
let body = del /\{[ \t]*\n/ "{\n"
. ( comment "\t" | attrs "\t" | hooks | empty )*
. del /[ \t]*\}[ \t]*\n/ "}\n"
let rule =
[ label "rule" .
[ label "file" . store word ] .
[ del /[ \t]+/ " " . label "file" . store word ]* .
del /[ \t\n]*/ " " . body ]
let lns = ( comment "" | empty | attrs "" | rule )*
let filter = incl "/etc/logrotate.d/*"
. incl "/etc/logrotate.conf"
. Util.stdexcl
let xfm = transform lns filter
|