Fixed a design flaw in luci.model.uci
[project/luci.git] / libs / uci / luasrc / model / uci.lua
1 --[[
2 LuCI - UCI mpdel
3
4 Description:
5 Generalized UCI model
6
7 FileId:
8 $Id$
9
10 License:
11 Copyright 2008 Steven Barth <steven@midlink.org>
12
13 Licensed under the Apache License, Version 2.0 (the "License");
14 you may not use this file except in compliance with the License.
15 You may obtain a copy of the License at
16
17 http://www.apache.org/licenses/LICENSE-2.0
18
19 Unless required by applicable law or agreed to in writing, software
20 distributed under the License is distributed on an "AS IS" BASIS,
21 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
22 See the License for the specific language governing permissions and
23 limitations under the License.
24
25 ]]--
26 local uci = require("uci")
27 local util = require("luci.util")
28 local setmetatable, rawget, rawset = setmetatable, rawget, rawset
29 local error, pairs, ipairs, tostring = error, pairs, ipairs, tostring
30 local table = table
31
32 --- LuCI UCI model library.
33 module("luci.model.uci", function(m) setmetatable(m, {__index = uci}) end)
34
35 savedir_default = "/tmp/.uci"
36 confdir_default = "/etc/config"
37
38 savedir_state = "/var/state"
39
40 --- Delete all sections of a given type that match certain criteria.
41 -- @param config UCI config
42 -- @param type UCI section type
43 -- @param comparator Function that will be called for each section and
44 -- returns a boolean whether to delete the current section (optional)
45 function delete_all(config, type, comparator)
46 local del = {}
47 local function helper (section)
48 if not comparator or comparator(section) then
49 table.insert(del, section[".name"])
50 end
51 end
52
53 foreach(config, type, helper)
54
55 for i, j in ipairs(del) do
56 delete(config, j)
57 end
58 end
59
60 --- Create a new section and initialize it with data.
61 -- @param config UCI config
62 -- @param type UCI section type
63 -- @param name UCI section name (optional)
64 -- @param values Table of key - value pairs to initialize the section with
65 -- @return Name of created section
66 function section(config, type, name, values)
67 local stat = true
68 if name then
69 stat = set(config, name, type)
70 else
71 name = add(config, type)
72 stat = name and true
73 end
74
75 if stat and values then
76 stat = tset(config, name, values)
77 end
78
79 return stat and name
80 end
81
82 --- Savely load the configuration.
83 -- @param config Configuration to load
84 -- @return Sucess status
85 -- @see load_state
86 -- @see load
87 function load_config(...)
88 set_confdir(confdir_default)
89 set_savedir(savedir_default)
90 return load(...)
91 end
92
93 --- Savely load state values.
94 -- @param config Configuration to load
95 -- @return Sucess status
96 -- @see load_config
97 -- @see load
98 function load_state(config)
99 set_confdir(confdir_default)
100 set_savedir(savedir_state)
101 return load(config)
102 end
103
104 --- Save changes to config values.
105 -- @param config Configuration to save
106 -- @return Sucess status
107 -- @see save_state
108 -- @see save
109 function save_config(config)
110 set_savedir(savedir_default)
111 return save(config)
112 end
113
114 --- Save changes to state values.
115 -- @param config Configuration to save
116 -- @return Sucess status
117 -- @see save_config
118 -- @see save
119 function save_state(config)
120 set_savedir(savedir_state)
121 return save(config)
122 end
123
124 --- Updated the data of a section using data from a table.
125 -- @param config UCI config
126 -- @param section UCI section name (optional)
127 -- @param values Table of key - value pairs to update the section with
128 function tset(config, section, values)
129 local stat = true
130 for k, v in pairs(values) do
131 if k:sub(1, 1) ~= "." then
132 stat = stat and set(config, section, k, v)
133 end
134 end
135 return stat
136 end
137
138
139 --- Add an anonymous section.
140 -- @class function
141 -- @name add
142 -- @param config UCI config
143 -- @param type UCI section type
144 -- @return Name of created section
145
146 --- Get a table of unsaved changes.
147 -- @class function
148 -- @name changes
149 -- @param config UCI config
150 -- @return Table of changes
151
152 --- Commit unsaved changes.
153 -- @class function
154 -- @name commit
155 -- @param config UCI config
156 -- @return Boolean whether operation succeeded
157 -- @see revert
158
159 --- Deletes a section or an option.
160 -- @class function
161 -- @name delete
162 -- @param config UCI config
163 -- @param section UCI section name
164 -- @param option UCI option (optional)
165 -- @return Boolean whether operation succeeded
166
167 --- Call a function for every section of a certain type.
168 -- @class function
169 -- @name foreach
170 -- @param config UCI config
171 -- @param type UCI section type
172 -- @param callback Function to be called
173 -- @return Boolean whether operation succeeded
174
175 --- Get a section type or an option
176 -- @class function
177 -- @name get
178 -- @param config UCI config
179 -- @param section UCI section name
180 -- @param option UCI option (optional)
181 -- @return UCI value
182
183 --- Get all sections of a config or all values of a section.
184 -- @class function
185 -- @name get_all
186 -- @param config UCI config
187 -- @param section UCI section name (optional)
188 -- @return Table of UCI sections or table of UCI values
189
190 --- Manually load a config.
191 -- Warning: This function is unsave! You should use load_config or load_state if possible.
192 -- @class function
193 -- @name load
194 -- @param config UCI config
195 -- @return Boolean whether operation succeeded
196 -- @see load_config
197 -- @see load_state
198 -- @see save
199 -- @see unload
200
201 --- Revert unsaved changes.
202 -- @class function
203 -- @name revert
204 -- @param config UCI config
205 -- @return Boolean whether operation succeeded
206 -- @see commit
207
208 --- Saves changes made to a config to make them committable.
209 -- @class function
210 -- @name save
211 -- @param config UCI config
212 -- @return Boolean whether operation succeeded
213 -- @see load
214 -- @see unload
215
216 --- Set a value or create a named section.
217 -- Warning: This function is unsave! You should use save_config or save_state if possible.
218 -- @class function
219 -- @name set
220 -- @param config UCI config
221 -- @param section UCI section name
222 -- @param option UCI option or UCI section type
223 -- @param value UCI value or nil if you want to create a section
224 -- @return Boolean whether operation succeeded
225
226 --- Set the configuration directory.
227 -- @class function
228 -- @name set_confdir
229 -- @param directory UCI configuration directory
230 -- @return Boolean whether operation succeeded
231
232 --- Set the directory for uncommited changes.
233 -- @class function
234 -- @name set_savedir
235 -- @param directory UCI changes directory
236 -- @return Boolean whether operation succeeded
237
238 --- Discard changes made to a config.
239 -- @class function
240 -- @name unload
241 -- @param config UCI config
242 -- @return Boolean whether operation succeeded
243 -- @see load
244 -- @see save