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"
52 function bind.usection(self, stype)
53 local x = utl.class(bsection)
54 x.__init__ = function(inst)
62 function bind.list(self, list, add, rem)
65 if type(list) == "string" then
67 for item in list:gmatch("%S+") do
71 elseif type(list) == "table" then
73 for _, item in pairs(list) do
78 if add then lookup[add] = true end
79 if rem then lookup[rem] = nil end
81 return utl.keys(lookup)
84 function bind.bool(self, v)
85 return ( v == "1" or v == "true" or v == "yes" or v == "on" )
89 bsection = utl.class()
91 function bsection.uciop(self, op, ...)
92 assert(self.bind and self.bind.uci,
93 "attempt to use unitialized binding: " .. type(self.sid))
95 return op and self.bind.uci[op](self.bind.uci, self.bind.cfg, ...)
99 function bsection.get(self, k, c)
101 self:uciop("foreach", self.stype,
103 if type(c) == "table" then
105 for ck, cv in pairs(c) do
106 if s[ck] ~= cv then return true end
108 elseif type(c) == "string" and s['.name'] ~= c then
121 function bsection.set(self, k, v, c)
123 self:uciop("foreach", self.stype,
125 if type(c) == "table" then
127 for ck, cv in pairs(c) do
128 if s[ck] ~= cv then return true end
130 elseif type(c) == "string" and s['.name'] ~= c then
133 stat = self:uciop("set", c, k, v)
139 function bsection.property(self, k, n)
140 self[n or k] = function(c, val)
142 return c:get(k, c.sid)
144 return c:set(k, val, c.sid)
149 function bsection.property_bool(self, k, n)
150 self[n or k] = function(c, val)
152 return self.bind:bool(c:get(k, c.sid))
154 return c:set(k, self.bind:bool(val) and "1" or "0", c.sid)