summaryrefslogtreecommitdiffhomepage
path: root/libs/uvl/root/usr/bin/uvl
blob: 7dc6a00aafaf2e63a96e05eb46d05e3657a650e6 (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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#!/usr/bin/lua
--[[

UCI Validation Layer - Command Line Utility
(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$

]]--

require("luci.uvl")
require("luci.util")


function getopt( arg, options )
	options = options or ""
	local tab = {}
	local args = {}
	for k, v in ipairs(arg) do
		if v:sub(1, 2) == "--" then
			local x = v:find( "=", 1, true )
			if x then
				tab[ v:sub( 3, x-1 ) ] = v:sub( x+1 )
			else
			    tab[ v:sub( 3 ) ] = true
			end
		elseif v:sub( 1, 1 ) == "-" then
			local y = 2
			local l = #v
			local jopt
			while ( y <= l ) do
				jopt = v:sub( y, y )
				if options:find( jopt, 1, true ) then
					if y < l then
						tab[ jopt ] = v:sub( y+1 )
						y = l
					else
						tab[ jopt ] = arg[ k + 1 ]
						arg[ k + 1 ] = ""
					end
				else
					tab[ jopt ] = true
				end
				y = y + 1
			end
	    elseif #v > 0 then
	    	table.insert(args, v)
	    end
	end
	return tab, args
end

local options, arguments = getopt( arg )

if #arguments == 0 or options.help then
	print([=[

uvl - UCI Validation Layer
$Id$
(c) 2008 Jo-Philipp Wich, Steven Barth

Usage:
	uvl --help
	uvl [--silent] [--schemedir=DIR]
		[--no-strict-sections] [--no-strict-options] [--no-strict-validators]
		[--no-strict-lists] config[.section[.option]]

Options:
	--help
		Display this help message.

	--silent
		Don't produce any output.

	--schemedir=DIR
		Use DIR as scheme directory.

	--no-strict-sections
		Don't treat sections found in config but not in scheme as error.

	--no-strict-options
		Don't treat options found in config but not in scheme as error.

	--no-strict-validators
		Don't invalidate config if an external validator fails.

	--no-strict-lists
		Don't invalidate lists that are stored options.
	]=])
	os.exit(255)
else
	luci.uvl.STRICT_UNKNOWN_SECTIONS =
		( options['no-strict-sections'] and false or true )
	luci.uvl.STRICT_UNKNOWN_OPTIONS =
		( options['no-strict-options'] and false or true )
	luci.uvl.STRICT_EXTERNAL_VALIDATORS =
		( options['no-strict-validators'] and false or true )
	luci.uvl.STRICT_LIST_TYPE =
		( options['no-strict-lists'] and false or true )

	local uvl = luci.uvl.UVL(
		type(options.schemedir) == "string" and options.schemedir or nil
	)

	local cso = luci.util.split( arguments[1], "." )
	local ok, err = uvl:validate( unpack(cso) )

	if ok then
		if not options.silent then
			print( string.format(
				'%s "%s" validates fine!',
					( #cso == 1 and "Config" or
						( #cso == 2 and "Section" or "Option" ) ),
					table.concat(cso, ".")
			) )
		end
		os.exit( 0 )
	else
		if not options.silent then print( err and err:string() or "Unknown error" ) end
		os.exit( 1 )
	end
end