Upload Tizen:Main source
[external/augeas.git] / lenses / dhclient.aug
1 (* Intefraces module for Augeas
2    Author: Free Ekanayaka <free@64studio.com>
3
4    Reference: man dhclient.conf
5    The only difference with the reference syntax is that this lens assumes
6    that statements end with a new line, while the reference syntax allows
7    new statements to be started right after the trailing ";" of the
8    previous statement. This should not be a problem in real-life
9    configuration files as statements get usually splitted across several
10    lines, rather than merged in a single one.
11
12    TODO: support the "default", "supersede", "append" and "prepend"
13    statements
14 *)
15
16 module Dhclient =
17
18    autoload xfm
19
20 (************************************************************************
21  *                           USEFUL PRIMITIVES
22  *************************************************************************)
23
24 let eol               = Util.eol
25 let comment           = Util.comment
26 let comment_or_eol    = Util.comment_or_eol
27 let empty             = Util.empty
28
29 (* Define separators *)
30 let sep_spc           = del /[ \t\n]+/ " "
31 let sep_scl           = del /[ \t]*;/ ";"
32 let sep_obr           = del /[ \t\n]*\{\n]*/ " {\n"
33 let sep_cbr           = del /[ \t\n]*\}/ " }"
34 let sep_com           = del /[ \t\n]*,[ \t\n]*/ ","
35 let sep_slh           = del "\/" "/"
36 let sep_col           = del ":" ":"
37 let sep_eq            = del /[ \t]*=[ \t]*/ "="
38
39 (* Define basic types *)
40 let word              = /[A-Za-z0-9_.-]+(\[[0-9]+\])?/
41
42 (* Define fields *)
43
44 (* TODO: there could be a " " in the middle of a value ... *)
45 let sto_to_spc        = store /[^\\#,;\{\}" \t\n]+|"[^\\#"\n]+"/
46 let sto_to_scl        = store /[^ \t][^;\n]+[^ \t]|[^ \t;\n]+/
47 let rfc_code          = [ key "code" . sep_spc . store word ]
48                       . sep_eq
49                       . [ label "value" . sto_to_scl ]
50 let sto_number        = store /[0-9][0-9]*/
51
52 (************************************************************************
53  *                         SIMPLE STATEMENTS
54  *************************************************************************)
55
56 let stmt_simple_re    = "timeout"
57                       | "retry"
58                       | "select-timeout"
59                       | "reboot"
60                       | "backoff-cutoff"
61                       | "initial-interval"
62                       | "do-forward-updates"
63                       | "reject"
64
65 let stmt_simple       = [ key stmt_simple_re
66                         . sep_spc
67                         . sto_to_spc
68                         . sep_scl
69                         . comment_or_eol ]
70
71
72 (************************************************************************
73  *                          ARRAY STATEMENTS
74  *************************************************************************)
75
76 (* TODO: the array could also be empty, like in the request statement *)
77 let stmt_array_re     = "media"
78                       | "request"
79                       | "require"
80
81 let stmt_array        = [ key stmt_array_re
82                         . sep_spc
83                         . counter "stmt_array"
84                         . [ seq "stmt_array" . sto_to_spc ]
85                         . [ sep_com . seq "stmt_array" . sto_to_spc ]*
86                         . sep_scl . comment_or_eol ]
87
88 (************************************************************************
89  *                          HASH STATEMENTS
90  *************************************************************************)
91
92 let stmt_hash_re      = "send"
93                       | "option"
94
95 let stmt_hash         = [ key stmt_hash_re
96                         . sep_spc
97                         . [ key word . sep_spc . (sto_to_spc|rfc_code) ]
98                         . sep_scl
99                         . comment_or_eol ]
100
101 (************************************************************************
102  *                         BLOCK STATEMENTS
103  *************************************************************************)
104
105 let stmt_block_re     = "interface"
106                       | "lease"
107                       | "alias"
108
109 let stmt_block_opt_re = "interface"
110                       | "script"
111                       | "bootp"
112                       | "fixed-address"
113                       | "filename"
114                       | "server-name"
115                       | "medium"
116                       | "vendor option space"
117
118 (* TODO: some options could take no argument like bootp *)
119 let stmt_block_opt    = [ key stmt_block_opt_re
120                          . sep_spc
121                          . sto_to_spc
122                          . sep_scl
123                          . comment_or_eol ]
124
125 let stmt_block_date_re
126                       = "renew"
127                       | "rebind"
128                       | "expire"
129
130 let stmt_block_date   = [ key stmt_block_date_re
131                         . [ sep_spc . label "weekday" . sto_number ]
132                         . [ sep_spc . label "year"    . sto_number ]
133                         . [ sep_slh . label "month"   . sto_number ]
134                         . [ sep_slh . label "day"     . sto_number ]
135                         . [ sep_spc . label "hour"    . sto_number ]
136                         . [ sep_col . label "minute"  . sto_number ]
137                         . [ sep_col . label "second"  . sto_number ]
138                         . sep_scl
139                         . comment_or_eol ]
140
141 let stmt_block_arg    = sep_spc . sto_to_spc
142
143 let stmt_block_entry  = sep_spc
144                       . ( stmt_array
145                         | stmt_hash
146                         | stmt_block_opt
147                         | stmt_block_date )
148
149 let stmt_block        = [ key stmt_block_re
150                         . stmt_block_arg?
151                         . sep_obr
152                         . stmt_block_entry+
153                         . sep_cbr
154                         . comment_or_eol ]
155
156 (************************************************************************
157  *                              LENS & FILTER
158  *************************************************************************)
159
160 let statement = (stmt_simple|stmt_array|stmt_hash|stmt_block)
161
162 let lns               = ( empty
163                         | comment
164                         | statement )*
165
166 let filter            = incl "/etc/dhcp3/dhclient.conf"
167                       . Util.stdexcl
168
169 let xfm                = transform lns filter