local ip = require "luci.ip"
local math = require "math"
local util = require "luci.util"
+local tonumber, type = tonumber, type
-local tonumber = tonumber
module "luci.cbi.datatypes"
return false
end
-function uint(val)
+function uinteger(val)
local n = tonumber(val)
if n ~= nil and math.floor(n) == n and n >= 0 then
return true
return false
end
-function int(val)
+function integer(val)
local n = tonumber(val)
if n ~= nil and math.floor(n) == n then
return true
return false
end
+function ufloat(val)
+ local n = tonumber(val)
+ return ( n ~= nil and n >= 0 )
+end
+
function float(val)
return ( tonumber(val) ~= nil )
end
return ip4addr(val) or ip6addr(val)
end
+function neg_ipaddr(v)
+ if type(v) == "string" then
+ v = v:gsub("^%s*!", "")
+ end
+ return v and ipaddr(v)
+end
+
function ip4addr(val)
if val then
return ip.IPv4(val) and true or false
return false
end
+function neg_ip4addr(v)
+ if type(v) == "string" then
+ v = v:gsub("^%s*!", "")
+ end
+ return v and ip4addr(v)
+end
+
function ip4prefix(val)
val = tonumber(val)
return ( val and val >= 0 and val <= 32 )
function port(val)
val = tonumber(val)
- return ( val and val >= 1 and val <= 65535 )
+ return ( val and val >= 0 and val <= 65535 )
end
function portrange(val)
end
function hostname(val)
- if val and val:match("[a-zA-Z0-9_][a-zA-Z0-9_%-%.]*") then
- return true -- XXX: ToDo: need better solution
+ if val and (#val < 254) and (
+ val:match("^[a-zA-Z]+$") or
+ (val:match("^[a-zA-Z0-9][a-zA-Z0-9%-%.]*[a-zA-Z0-9]$") and
+ val:match("[^0-9%.]"))
+ ) then
+ return true
end
-
return false
end
return hostname(val) or ipaddr(val)
end
+function network(val)
+ return uciname(val) or host(val)
+end
+
function wpakey(val)
if #val == 64 then
return (val:match("^[a-fA-F0-9]+$") ~= nil)
if (#val == 10) or (#val == 26) then
return (val:match("^[a-fA-F0-9]+$") ~= nil)
else
- return (#v == 5) or (#v == 13)
+ return (#val == 5) or (#val == 13)
end
end
return (val:match("^[a-zA-Z0-9_]+$") ~= nil)
end
+function neg_network_ip4addr(val)
+ if type(v) == "string" then
+ v = v:gsub("^%s*!", "")
+ return (uciname(v) or ip4addr(v))
+ end
+end
+
function range(val, min, max)
val = tonumber(val)
min = tonumber(min)
return false
end
+
+function min(val, min)
+ val = tonumber(val)
+ min = tonumber(min)
+
+ if val ~= nil and min ~= nil then
+ return (val >= min)
+ end
+
+ return false
+end
+
+function max(val, max)
+ val = tonumber(val)
+ max = tonumber(max)
+
+ if val ~= nil and max ~= nil then
+ return (val <= max)
+ end
+
+ return false
+end
+
+function neg(val, what)
+ if what and type(_M[what]) == "function" then
+ return _M[what](val:gsub("^%s*!%s*", ""))
+ end
+
+ return false
+end
+
+function list(val, what, ...)
+ if type(val) == "string" and what and type(_M[what]) == "function" then
+ for val in val:gmatch("%S+") do
+ if not _M[what](val, ...) then
+ return false
+ end
+ end
+
+ return true
+ end
+
+ return false
+end