18
18
let eol = del (/[ \t]+|[ \t]*[;\n]/ . empty_part_re*) "\n"
19
19
let semicol_eol = del (/[ \t]*[;\n]/ . empty_part_re*) "\n"
21
let key_re = /[A-Za-z0-9_]+(\[[0-9]+\])?/ - "unset" - "export"
21
let key_re = /[A-Za-z0-9_]+(\[[0-9]+\])?/ - ("unset" | "export")
22
22
let matching_re = "${!" . key_re . /[\*@]\}/
23
23
let eq = Util.del_str "="
32
32
let semicol = del /;?/ ""
34
34
let char = /[^`;() '"\t\n]|\\\\"/
35
let dquot = /"([^"\\]|\\\\.)*"/ (* " Emacs, relax *)
36
let char = /[^"\\]|\\\\./ | Rx.cl
37
in "\"" . char* . "\"" (* " Emacs, relax *)
36
38
let squot = /'[^']*'/
37
39
let bquot = /`[^`\n]*`/
38
40
(* dbquot don't take spaces or semi-colons *)
39
41
let dbquot = /``[^` \t\n;]+``/
40
let dollar_assign = /\$\([^\)#\n]*\)/
42
let sto_to_semicol = store /[^#; \t\n][^#;\n]+[^#; \t\n]|[^#; \t\n]+/
42
let dollar_assign = /\$\([^\(\)#\n]*\)/
43
let dollar_arithm = /\$\(\([^\)#\n]*\)\)/
45
let anyquot = (dquot|squot)+ | bquot | dbquot | dollar_assign | dollar_arithm
47
let to_semicol_re = /[^#; \t\n][^#;\n]+[^#; \t\n]|[^#; \t\n]+/
48
let sto_to_semicol = store to_semicol_re
50
let sto_to_semicol_quot =
51
let no_semicol_re = /[^"'#;\n]/
52
in let no_semicol_spc_re = /[^"'#; \t\n]/
53
in let multi_chars = no_semicol_spc_re . (no_semicol_re|anyquot)+ . no_semicol_spc_re
54
in store (no_semicol_spc_re | multi_chars)
44
56
(* Array values of the form '(val1 val2 val3)'. We do not handle empty *)
45
57
(* arrays here because of typechecking headaches. Instead, they are *)
46
58
(* treated as a simple value *)
48
let array_value = store (char+ | dquot) in
60
let array_value = store (char+ | anyquot) in
49
61
del /\([ \t]*/ "(" . counter "values" .
50
62
[ seq "values" . array_value ] .
51
63
[ del /[ \t\n]+/ " " . seq "values" . array_value ] *
55
67
(* but fairly close. *)
57
69
let empty_array = /\([ \t]*\)/ in
58
store (char* | (dquot | squot)+
59
| bquot | dbquot | dollar_assign | empty_array)
70
store (char* | anyquot | empty_array)
61
72
let export = [ key "export" . Util.del_ws_spc ]
62
let kv = [ Util.indent . export? . key key_re
63
. eq . (simple_value | array) . comment_or_eol ]
73
let kv = Util.indent . export? . key key_re
74
. eq . (simple_value | array)
65
76
let var_action (name:string) =
66
[ Util.indent . xchgs name ("@" . name) . Util.del_ws_spc
67
. store (key_re | matching_re) . comment_or_eol ]
77
Util.indent . del name name . Util.del_ws_spc
78
. label ("@" . name) . counter "var_action"
79
. Build.opt_list [ seq "var_action" . store (key_re | matching_re) ] Util.del_ws_spc
69
81
let unset = var_action "unset"
70
82
let bare_export = var_action "export"
74
. del /\.|source/ "." . label ".source"
75
. Util.del_ws_spc . store /[^;=# \t\n]+/ . comment_or_eol ]
86
. del /\.|source/ "." . label ".source"
87
. Util.del_ws_spc . store /[^;=# \t\n]+/
77
89
let shell_builtin_cmds = "ulimit" | "shift" | "exit"
80
[ Util.indent . label "@builtin"
81
. store shell_builtin_cmds
83
. [ label "args" . sto_to_semicol ])?
92
Util.indent . label "@builtin"
93
. store shell_builtin_cmds
95
. [ label "args" . sto_to_semicol ])?
86
97
let keyword (kw:string) = Util.indent . Util.del_str kw
87
98
let keyword_label (kw:string) (lbl:string) = keyword kw . label lbl
90
[ Util.indent . label "@return"
91
. Util.del_str "return"
92
. ( Util.del_ws_spc . store Rx.integer )?
101
Util.indent . label "@return"
102
. Util.del_str "return"
103
. ( Util.del_ws_spc . store Rx.integer )?
96
106
(************************************************************************
100
110
let generic_cond_start (start_kw:string) (lbl:string)
101
111
(then_kw:string) (contents:lens) =
102
112
keyword_label start_kw lbl . Sep.space
103
. sto_to_semicol . semicol_eol
113
. sto_to_semicol_quot . semicol_eol
104
114
. keyword then_kw . eol
126
136
let loop_select (entry:lens) =
127
137
generic_cond "select" "@select" "do" entry+ "done"
129
let case (entry:lens) =
139
let case (entry:lens) (entry_noeol:lens) =
130
140
let case_entry = [ label "@case_entry"
131
141
. Util.indent . store /[^ \t\n\)]+/
132
142
. Util.del_str ")" . eol
143
. ( entry+ | entry_noeol )?
134
144
. Util.indent . Util.del_str ";;" . eol ] in
135
145
[ keyword_label "case" "@case" . Sep.space
136
146
. store (char+ | ("\"" . char+ . "\""))
148
158
. Util.indent . Util.del_str "}" . eol ]
161
let entry_eol_item (item:lens) =
162
[ item . comment_or_eol ] in
163
entry_eol_item source
165
| entry_eol_item unset
166
| entry_eol_item bare_export
167
| entry_eol_item builtin
168
| entry_eol_item return
171
let entry_item (item:lens) = [ item ] in
175
| entry_item bare_export
150
179
let rec rec_entry =
151
let entry = comment | source | kv
152
| unset | bare_export | builtin | return | rec_entry in
180
let entry = comment | entry_eol | rec_entry in
155
183
| loop_select entry
156
184
| loop_while entry
157
185
| loop_until entry
186
| case entry entry_noeol
161
let lns_norec = empty* . (comment | source | kv | unset | bare_export | builtin | return) *
189
let lns_norec = empty* . (comment | entry_eol) *
163
let lns = empty* . (comment | source | kv | unset | bare_export | builtin | return | rec_entry) *
191
let lns = empty* . (comment | entry_eol | rec_entry) *
165
193
let sc_incl (n:string) = (incl ("/etc/sysconfig/" . n))
166
194
let sc_excl (n:string) = (excl ("/etc/sysconfig/" . n))
171
199
sc_excl "hw-uuid" .
172
200
sc_excl "hwconf" .
173
201
sc_excl "ip*tables" .
202
sc_excl "ip*tables.save" .
174
203
sc_excl "kernel" .
175
204
sc_excl "*.pub" .
176
205
sc_excl "sysstat.ioconf" .
177
206
sc_excl "system-config-firewall" .
178
207
sc_excl "system-config-securitylevel" .
180
208
sc_incl "network/config" .
181
209
sc_incl "network/dhcp" .
182
210
sc_incl "network/dhcp6r" .
196
224
sc_excl "SuSEfirewall2.d" .
197
225
sc_incl "SuSEfirewall2.d/cobbler" .
198
226
sc_incl "SuSEfirewall2.d/services/*" .
199
sc_excl "SuSEfirewall2.d/services/TEMPLATE"
227
sc_excl "SuSEfirewall2.d/services/TEMPLATE" .
201
230
let filter_default = incl "/etc/default/*"
202
231
. excl "/etc/default/grub_installdevice*"
232
. excl "/etc/default/rmt"
203
233
. excl "/etc/default/whoopsie"
204
234
let filter_misc = incl "/etc/arno-iptables-firewall/debconf.cfg"
205
235
. incl "/etc/cron-apt/config"
206
236
. incl "/etc/environment"
237
. incl "/etc/firewalld/firewalld.conf"
207
238
. incl "/etc/blkid.conf"
208
239
. incl "/etc/adduser.conf"
209
240
. incl "/etc/cowpoke.conf"