2 LuCI - UCI utilities for model classes
4 Copyright 2009 Jo-Philipp Wich <xm@subsignal.org>
6 Licensed under the Apache License, Version 2.0 (the "License");
7 you may not use this file except in compliance with the License.
8 You may obtain a copy of the License at
10 http://www.apache.org/licenses/LICENSE-2.0
12 Unless required by applicable law or agreed to in writing, software
13 distributed under the License is distributed on an "AS IS" BASIS,
14 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 See the License for the specific language governing permissions and
16 limitations under the License.
20 local assert, pairs, type = assert, pairs, type
21 local utl = require "luci.util"
23 module "luci.model.uci.bind"
27 function bind.__init__(self, config, cursor)
28 assert(config, "call to bind() without config file")
33 function bind.init(self, cursor)
34 assert(cursor, "call to init() without uci cursor")
38 function bind.section(self, stype)
39 local x = utl.class(bsection)
40 x.__init__ = function(inst, sid)
41 assert(self.uci:get(self.cfg, sid) == stype,
42 "attempt to instantiate bsection(%q) of wrong type, expected %q"
56 function bind.usection(self, stype)
57 local x = utl.class(bsection)
58 x.__init__ = function(inst)
66 function bind.list(self, list, add, rem)
69 if type(list) == "string" then
71 for item in list:gmatch("%S+") do
75 elseif type(list) == "table" then
77 for _, item in pairs(list) do
82 if add then lookup[add] = true end
83 if rem then lookup[rem] = nil end
85 return utl.keys(lookup)
88 function bind.bool(self, v)
89 return ( v == "1" or v == "true" or v == "yes" or v == "on" )
93 bsection = utl.class()
95 function bsection.uciop(self, op, ...)
96 assert(self.bind and self.bind.uci,
97 "attempt to use unitialized binding")
100 return self.bind.uci[op](self.bind.uci, self.bind.cfg, ...)
106 function bsection.get(self, k, c)
108 if type(c) == "string" then
109 v = self:uciop("get", c, k)
111 self:uciop("foreach", self.stype,
113 if type(c) == "table" then
115 for ck, cv in pairs(c) do
116 if s[ck] ~= cv then return true end
130 function bsection.set(self, k, v, c)
132 if type(c) == "string" then
133 if type(v) == "table" and #v == 0 then
134 stat = self:uciop("delete", c, k)
136 stat = self:uciop("set", c, k, v)
139 self:uciop("foreach", self.stype,
141 if type(c) == "table" then
143 for ck, cv in pairs(c) do
144 if s[ck] ~= cv then return true end
147 stat = self:uciop("set", c, k, v)
154 function bsection.property(self, k, n)
155 self[n or k] = function(c, val)
157 return c:get(k, c.sid)
159 return c:set(k, val, c.sid)
164 function bsection.property_bool(self, k, n)
165 self[n or k] = function(c, val)
167 return self.bind:bool(c:get(k, c.sid))
169 return c:set(k, self.bind:bool(val) and "1" or "0", c.sid)