summaryrefslogtreecommitdiffhomepage
path: root/libs/uvl/luasrc/uvl/validation.lua
blob: 25ac6dcaefd03fe06de61676afc4311ef42bd91f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
--[[

UCI Validation Layer - Validation helper
(c) 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net>
(c) 2008 Steven Barth <steven@midlink.org>

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

        http://www.apache.org/licenses/LICENSE-2.0

$Id$

]]--

local os = require "os"
local fs = require "nixio.fs"
local sys = require "luci.sys"
local ERR = require "luci.uvl.errors".error

local ipairs, unpack, type, tostring = ipairs, unpack, type, tostring

module "luci.uvl.validation"

function _exec( bin, args )
	local cmd, output = "", nil

	for _, v in ipairs({ bin, unpack(args) }) do
		cmd = cmd .. ("%q " % v):gsub("([%$`])","\\%1")
	end

	local tmpfile = "/tmp/uvl" .. sys.uniqueid(8)
	local retval  = os.execute( cmd .. " 1>" .. tmpfile .. " 2>" .. tmpfile )

	if fs.access(tmpfile) then
		output = fs.readfile(tmpfile)
		fs.unlink(tmpfile)
	end

	return retval, output
end

function check( self, object )
	if object:scheme('validators') then
		for _, val in ipairs(object:scheme('validators')) do
			local ok, err = false, nil

			local values = object:value()
			      values = type(values) == "table" and values or { values }

			local args = {
				object:scheme('type'), object:scheme('datatype'),
				object.cref[1], object.cref[2], object.cref[3] or '',
				unpack(values)
			}

			if type(val) == "function" then
				ok, err = val(unpack(args))
			else
				ok, err = _exec( val, args )
				ok = ( ok == 0 )
			end

			if not ok then
				return false, ERR('SME_ERRVAL', object, {tostring(val), err})
			end
		end
	end

	return true, nil
end