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