* luci/libs: uvl: first round of uci schemes
This commit is contained in:
parent
449d8e46e9
commit
d564e036b3
9 changed files with 479 additions and 4 deletions
144
libs/uvl/root/lib/uci/schema/default/ddns
Normal file
144
libs/uvl/root/lib/uci/schema/default/ddns
Normal file
|
@ -0,0 +1,144 @@
|
||||||
|
package ddns
|
||||||
|
|
||||||
|
config section
|
||||||
|
option name 'service'
|
||||||
|
option title 'DynDNS service entry'
|
||||||
|
option package 'ddns'
|
||||||
|
option named true
|
||||||
|
option required true
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'enabled'
|
||||||
|
option title 'Enable this service entry'
|
||||||
|
option section 'ddns.service'
|
||||||
|
option datatype 'boolean'
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'service_name'
|
||||||
|
option title 'Name of the DynDNS provider'
|
||||||
|
option section 'ddns.service'
|
||||||
|
option datatype 'string'
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'domain'
|
||||||
|
option title 'Own DynDNS domain'
|
||||||
|
option section 'ddns.service'
|
||||||
|
option required true
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'username'
|
||||||
|
option title 'Account username'
|
||||||
|
option section 'ddns.service'
|
||||||
|
option required true
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'password'
|
||||||
|
option title 'Account password'
|
||||||
|
option section 'ddns.service'
|
||||||
|
option required true
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'ip_source'
|
||||||
|
option title 'Method to determine current IP address'
|
||||||
|
option section 'ddns.service'
|
||||||
|
option type 'enum'
|
||||||
|
option required true
|
||||||
|
|
||||||
|
config enum
|
||||||
|
option variable 'ddns.service.ip_source'
|
||||||
|
option value 'network'
|
||||||
|
option title 'Read ip address from /etc/config/network'
|
||||||
|
|
||||||
|
config enum
|
||||||
|
option variable 'ddns.service.ip_source'
|
||||||
|
option value 'interface'
|
||||||
|
option title 'Determine ip address from given hardware interface'
|
||||||
|
|
||||||
|
config enum
|
||||||
|
option variable 'ddns.service.ip_source'
|
||||||
|
option value 'web'
|
||||||
|
option title 'Determine own IP using a remote web page'
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'ip_network'
|
||||||
|
option title 'Configured network to use IP from'
|
||||||
|
option section 'ddns.service'
|
||||||
|
option depends 'ip_source=network'
|
||||||
|
option valueof 'network.interface'
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'ip_interface'
|
||||||
|
option title 'Physical network interface to read IP from'
|
||||||
|
option section 'ddns.service'
|
||||||
|
option depends 'ip_source=interface'
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'ip_url'
|
||||||
|
option title 'Web page used to determine IP address'
|
||||||
|
option section 'ddns.service'
|
||||||
|
option depends 'ip_source=web'
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'update_url'
|
||||||
|
option title 'URL format to use for updating DNS information (for yet-unknown providers)'
|
||||||
|
option section 'ddns.service'
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'check_interval'
|
||||||
|
option title 'Update check interval'
|
||||||
|
option section 'ddns.service'
|
||||||
|
option datatype 'integer'
|
||||||
|
option required true
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'check_unit'
|
||||||
|
option title 'Unit for update check interval'
|
||||||
|
option section 'ddns.service'
|
||||||
|
option type 'enum'
|
||||||
|
option required true
|
||||||
|
|
||||||
|
config enum
|
||||||
|
option variable 'ddns.service.check_unit'
|
||||||
|
option value 'seconds'
|
||||||
|
|
||||||
|
config enum
|
||||||
|
option variable 'ddns.service.check_unit'
|
||||||
|
option value 'minutes'
|
||||||
|
|
||||||
|
config enum
|
||||||
|
option variable 'ddns.service.check_unit'
|
||||||
|
option value 'hours'
|
||||||
|
|
||||||
|
config enum
|
||||||
|
option variable 'ddns.service.check_unit'
|
||||||
|
option value 'days'
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'force_interval'
|
||||||
|
option title 'Forced update interval'
|
||||||
|
option section 'ddns.service'
|
||||||
|
option datatype 'integer'
|
||||||
|
option required true
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'force_unit'
|
||||||
|
option title 'Unit of forced update interval'
|
||||||
|
option section 'ddns.service'
|
||||||
|
option type 'enum'
|
||||||
|
option required true
|
||||||
|
|
||||||
|
config enum
|
||||||
|
option variable 'ddns.service.force_unit'
|
||||||
|
option value 'seconds'
|
||||||
|
|
||||||
|
config enum
|
||||||
|
option variable 'ddns.service.force_unit'
|
||||||
|
option value 'minutes'
|
||||||
|
|
||||||
|
config enum
|
||||||
|
option variable 'ddns.service.force_unit'
|
||||||
|
option value 'hours'
|
||||||
|
|
||||||
|
config enum
|
||||||
|
option variable 'ddns.service.force_unit'
|
||||||
|
option value 'days'
|
21
libs/uvl/root/lib/uci/schema/default/dropbear
Normal file
21
libs/uvl/root/lib/uci/schema/default/dropbear
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
package dropbear
|
||||||
|
|
||||||
|
config section
|
||||||
|
option name 'dropbear'
|
||||||
|
option title 'General SSH daemon settings'
|
||||||
|
option package 'dropbear'
|
||||||
|
option required true
|
||||||
|
option unique true
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'PasswordAuth'
|
||||||
|
option title 'Permit password authentication'
|
||||||
|
option section 'dropbear.dropbear'
|
||||||
|
option datatype 'boolean'
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'Port'
|
||||||
|
option title 'Listening port'
|
||||||
|
option section 'dropbear.dropbear'
|
||||||
|
option datatype 'integer'
|
||||||
|
option required true
|
88
libs/uvl/root/lib/uci/schema/default/firewall
Normal file
88
libs/uvl/root/lib/uci/schema/default/firewall
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
package firewall
|
||||||
|
|
||||||
|
config section
|
||||||
|
option name 'defaults'
|
||||||
|
option title 'Global firewall defaults'
|
||||||
|
option package 'firewall'
|
||||||
|
option unique true
|
||||||
|
option required true
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'forward'
|
||||||
|
option title 'Action for forwarded traffic'
|
||||||
|
option section 'firewall.defaults'
|
||||||
|
option required true
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'input'
|
||||||
|
option title 'Action for incoming traffic'
|
||||||
|
option section 'firewall.defaults'
|
||||||
|
option required true
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'output'
|
||||||
|
option title 'Action for outgoing traffic'
|
||||||
|
option section 'firewall.defaults'
|
||||||
|
option required true
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'syn_flood'
|
||||||
|
option title 'Enable syn-flood protection'
|
||||||
|
option section 'firewall.defaults'
|
||||||
|
option datatype 'boolean'
|
||||||
|
|
||||||
|
|
||||||
|
config section
|
||||||
|
option name 'forwarding'
|
||||||
|
option title 'Firewall traffic forwarding rules'
|
||||||
|
option package 'firewall'
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'src'
|
||||||
|
option title 'Source zone'
|
||||||
|
option section 'firewall.forwarding'
|
||||||
|
option valueof 'firewall.zone.name'
|
||||||
|
option required true
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'dest'
|
||||||
|
option title 'Destination zone'
|
||||||
|
option section 'firewall.forwarding'
|
||||||
|
option valueof 'firewall.zone.name'
|
||||||
|
option required true
|
||||||
|
|
||||||
|
|
||||||
|
config section
|
||||||
|
option name 'zone'
|
||||||
|
option title 'Firewall zones'
|
||||||
|
option package 'firewall'
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'name'
|
||||||
|
option title 'Name of this firewall zone'
|
||||||
|
option section 'firewall.zone'
|
||||||
|
option required true
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'forward'
|
||||||
|
option title 'Zone specific action for forwarded traffic'
|
||||||
|
option section 'firewall.zone'
|
||||||
|
option required true
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'input'
|
||||||
|
option title 'Zone specific action for incoming traffic'
|
||||||
|
option section 'firewall.zone'
|
||||||
|
option required true
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'output'
|
||||||
|
option title 'Zone specific action for outgoing traffic'
|
||||||
|
option section 'firewall.zone'
|
||||||
|
option required true
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'masq'
|
||||||
|
option title 'Enable masquerading for outgoing zone traffic'
|
||||||
|
option section 'firewall.zone'
|
||||||
|
option datatype 'boolean'
|
50
libs/uvl/root/lib/uci/schema/default/fstab
Normal file
50
libs/uvl/root/lib/uci/schema/default/fstab
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
package fstab
|
||||||
|
|
||||||
|
config section
|
||||||
|
option name 'mount'
|
||||||
|
option title 'Filesystem entry'
|
||||||
|
option package 'fstab'
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'device'
|
||||||
|
option title 'Device node'
|
||||||
|
option section 'fstab.mount'
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'enabled'
|
||||||
|
option title 'Enable this mount point'
|
||||||
|
option section 'fstab.mount'
|
||||||
|
option datatype 'boolean'
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'fstype'
|
||||||
|
option title 'Filesystem type'
|
||||||
|
option section 'fstab.mount'
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'options'
|
||||||
|
option title 'Mount options'
|
||||||
|
option section 'fstab.mount'
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'target'
|
||||||
|
option title 'Mount point'
|
||||||
|
option section 'fstab.mount'
|
||||||
|
option datatype 'directory'
|
||||||
|
|
||||||
|
|
||||||
|
config section
|
||||||
|
option name 'swap'
|
||||||
|
option title 'Swap entry'
|
||||||
|
option package 'fstab'
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'device'
|
||||||
|
option title 'Swap file or Partition'
|
||||||
|
option section 'fstab.swap'
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'enabled'
|
||||||
|
option title 'Enable this swap'
|
||||||
|
option section 'fstab.swap'
|
||||||
|
option datatype 'boolean'
|
22
libs/uvl/root/lib/uci/schema/default/httpd
Normal file
22
libs/uvl/root/lib/uci/schema/default/httpd
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
package httpd
|
||||||
|
|
||||||
|
config section
|
||||||
|
option name 'httpd'
|
||||||
|
option title 'General httpd settings'
|
||||||
|
option package 'httpd'
|
||||||
|
option unique true
|
||||||
|
option required true
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'home'
|
||||||
|
option title 'Docroot directory'
|
||||||
|
option section 'httpd.httpd'
|
||||||
|
option datatype 'directory'
|
||||||
|
option required true
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'port'
|
||||||
|
option title 'Listening port'
|
||||||
|
option section 'httpd.httpd'
|
||||||
|
option datatype 'integer'
|
||||||
|
option required true
|
14
libs/uvl/root/lib/uci/schema/default/luci_splash
Normal file
14
libs/uvl/root/lib/uci/schema/default/luci_splash
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
package luci_splash
|
||||||
|
|
||||||
|
config section
|
||||||
|
option name 'core'
|
||||||
|
option title 'Common DHCP splash settings'
|
||||||
|
option package 'luci_splash'
|
||||||
|
option unique true
|
||||||
|
option required true
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'leasetime'
|
||||||
|
option title 'Lease time in hours'
|
||||||
|
option section 'luci_splash.core'
|
||||||
|
option datatype 'float'
|
21
libs/uvl/root/lib/uci/schema/default/system
Normal file
21
libs/uvl/root/lib/uci/schema/default/system
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
package system
|
||||||
|
|
||||||
|
config section
|
||||||
|
option name 'system'
|
||||||
|
option title 'General system configuration'
|
||||||
|
option package 'system'
|
||||||
|
option unique true
|
||||||
|
option required true
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'hostname'
|
||||||
|
option title 'Local hostname'
|
||||||
|
option section 'system.system'
|
||||||
|
option datatype 'hostname'
|
||||||
|
option required true
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'timezone'
|
||||||
|
option title 'Option timezone'
|
||||||
|
option section 'system.system'
|
||||||
|
option required true
|
25
libs/uvl/root/lib/uci/schema/default/upnpd
Normal file
25
libs/uvl/root/lib/uci/schema/default/upnpd
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
package upnpd
|
||||||
|
|
||||||
|
config section
|
||||||
|
option name 'upnpd'
|
||||||
|
option title 'Common upnpd settings'
|
||||||
|
option package 'upnpd'
|
||||||
|
option unique true
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'download'
|
||||||
|
option title 'Download bandwidth in kBit/s'
|
||||||
|
option section 'upnpd.upnpd'
|
||||||
|
option datatype 'integer'
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'upload'
|
||||||
|
option title 'Upload bandwidth in kBit/s'
|
||||||
|
option section 'upnpd.upnpd'
|
||||||
|
option datatype 'integer'
|
||||||
|
|
||||||
|
config variable
|
||||||
|
option name 'log_output'
|
||||||
|
option title 'Enable log messages'
|
||||||
|
option section 'upnpd.upnpd'
|
||||||
|
option datatype 'boolean'
|
|
@ -57,9 +57,90 @@ function getopt( arg, options )
|
||||||
return tab, args
|
return tab, args
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function genspec(conf)
|
||||||
|
require("luci.model.uci")
|
||||||
|
require("luci.uvl.datatypes")
|
||||||
|
|
||||||
|
local uci = luci.model.uci.cursor()
|
||||||
|
local ok, err = uci:load(conf)
|
||||||
|
|
||||||
|
if not ok then
|
||||||
|
print("Can not load config:", err)
|
||||||
|
os.exit(1)
|
||||||
|
else
|
||||||
|
local function _guess_datatype(v)
|
||||||
|
if type(v) == "table" then v = v[1] end
|
||||||
|
|
||||||
|
for _, type in ipairs({
|
||||||
|
"boolean", "integer", "float", "ip4addr", "ip6addr",
|
||||||
|
"macaddr", "directory", "file"
|
||||||
|
}) do
|
||||||
|
if luci.uvl.datatypes[type](v) then
|
||||||
|
return type
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return "string"
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
local co = uci:get_all(conf)
|
||||||
|
local ct = { }
|
||||||
|
local ca = { }
|
||||||
|
local so = { }
|
||||||
|
local to = { }
|
||||||
|
|
||||||
|
-- count section types
|
||||||
|
for _, section in pairs(co) do
|
||||||
|
ct[section['.type']] = ( ct[section['.type']] or 0 ) + 1
|
||||||
|
ca[section['.type']] = section['.anonymous']
|
||||||
|
so[section['.type']] = so[section['.type']] or { }
|
||||||
|
to[section['.type']] = to[section['.type']] or { }
|
||||||
|
|
||||||
|
for option, value in pairs(section) do
|
||||||
|
if option:sub(1,1) ~= "." then
|
||||||
|
so[section['.type']][option] = _guess_datatype(value)
|
||||||
|
to[section['.type']][option] = ( type(value) == "table" and "list" or "variable" )
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- package name
|
||||||
|
print( "package %s" % conf )
|
||||||
|
|
||||||
|
-- write section schemes
|
||||||
|
for type, count in luci.util.kspairs(ct) do
|
||||||
|
print( "\nconfig section" )
|
||||||
|
print( "\toption name '%s'" % type )
|
||||||
|
print( "\toption title 'Section %s'" % type )
|
||||||
|
print( "\toption package '%s'"% conf )
|
||||||
|
print( "\toption named %s" % ( ca[type] and 'false' or 'true' ) )
|
||||||
|
print( "\toption unique %s" % ( ct[type] > 1 and 'false' or ( ca[type] and 'false' or 'true' ) ) )
|
||||||
|
print( "\toption dynamic false" )
|
||||||
|
print( "\toption required false" )
|
||||||
|
|
||||||
|
-- write option schemes
|
||||||
|
for opt, val in luci.util.kspairs(so[type]) do
|
||||||
|
print( "\nconfig variable" )
|
||||||
|
print( "\toption name '%s'" % opt )
|
||||||
|
print( "\toption title 'Option %s'" % opt )
|
||||||
|
print( "\toption section '%s.%s'" %{ conf, type } )
|
||||||
|
print( "\toption datatype '%s'" % so[type][opt] )
|
||||||
|
|
||||||
|
if to[type][opt] ~= "variable" then
|
||||||
|
print( "\toption type '%s'" % to[type][opt] )
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
print("")
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
local options, arguments = getopt( arg )
|
local options, arguments = getopt( arg )
|
||||||
|
|
||||||
if #arguments == 0 or options.help then
|
if #arguments ~= 2 or options.help then
|
||||||
print([=[
|
print([=[
|
||||||
|
|
||||||
uvl - UCI Validation Layer
|
uvl - UCI Validation Layer
|
||||||
|
@ -70,7 +151,7 @@ Usage:
|
||||||
uvl --help
|
uvl --help
|
||||||
uvl [--silent] [--schemedir=DIR]
|
uvl [--silent] [--schemedir=DIR]
|
||||||
[--no-strict-sections] [--no-strict-options] [--no-strict-validators]
|
[--no-strict-sections] [--no-strict-options] [--no-strict-validators]
|
||||||
[--no-strict-lists] config[.section[.option]]
|
[--no-strict-lists] {verify|genspec} config[.section[.option]]
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
--help
|
--help
|
||||||
|
@ -93,9 +174,16 @@ Options:
|
||||||
|
|
||||||
--no-strict-lists
|
--no-strict-lists
|
||||||
Don't invalidate lists that are stored options.
|
Don't invalidate lists that are stored options.
|
||||||
|
|
||||||
|
Actions:
|
||||||
|
verify
|
||||||
|
Validate given configuration, section or option.
|
||||||
|
|
||||||
|
genspec
|
||||||
|
Generate a scheme skeleton from given configuration.
|
||||||
]=])
|
]=])
|
||||||
os.exit(255)
|
os.exit(255)
|
||||||
else
|
elseif arguments[1] == "verify" then
|
||||||
luci.uvl.STRICT_UNKNOWN_SECTIONS =
|
luci.uvl.STRICT_UNKNOWN_SECTIONS =
|
||||||
( options['no-strict-sections'] and false or true )
|
( options['no-strict-sections'] and false or true )
|
||||||
luci.uvl.STRICT_UNKNOWN_OPTIONS =
|
luci.uvl.STRICT_UNKNOWN_OPTIONS =
|
||||||
|
@ -109,7 +197,7 @@ else
|
||||||
type(options.schemedir) == "string" and options.schemedir or nil
|
type(options.schemedir) == "string" and options.schemedir or nil
|
||||||
)
|
)
|
||||||
|
|
||||||
local cso = luci.util.split( arguments[1], "." )
|
local cso = luci.util.split( arguments[2], "." )
|
||||||
local ok, err = uvl:validate( unpack(cso) )
|
local ok, err = uvl:validate( unpack(cso) )
|
||||||
|
|
||||||
if ok then
|
if ok then
|
||||||
|
@ -126,4 +214,6 @@ else
|
||||||
if not options.silent then print( err and err:string() or "Unknown error" ) end
|
if not options.silent then print( err and err:string() or "Unknown error" ) end
|
||||||
os.exit( 1 )
|
os.exit( 1 )
|
||||||
end
|
end
|
||||||
|
else
|
||||||
|
genspec( arguments[2] )
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue